IoM v0.0.4 Bootstrapping
Intro¶
IoM通过几个月的快速迭代, 已经具备了一个现代化C2的绝大部分功能.
v0.0.4将是v0.1.0之前的最后一个版本, 可以在这里看到我们v0.1.0的路线图: https://chainreactors.github.io/wiki/IoM/roadmap/#v010-professional-release
广告时间:
在这几个月的开发历程中,我们积累了足够多的独一无二的功能。 从v0.1.0 开始, 我们将尝试发布professional。
profressinal额外支持的功能:
- 基于独特的ollvm 能对malefic的所有编译产物进行高度混淆
- 可自定义可组装的loader
- 独特的pe loader与sRDI, 能实现无新进程执行cmd/wmic等任意命令, 或loader远程二进制文件
- linux kit
- 基于rem实现的任意信道的流量, 代理功能
- OPSEC
- 独立的堆加密
- 独立的堆栈混淆
- 独立的indirect-syscall
- 可自定义的进程注入
- ......
professional 将提供从静态、行为、内存、流量场景的解决方案
v0.0.4 更新日志¶
v0.0.4 是一个过度版本,大部分更新都在修复bug, 提高兼容性稳定性, 降低使用难度与简化操作上。
implant更新¶
兼容win7/windows 2008¶
新版的rust放弃了对windows7/windows server 2008的支持。 为了兼容win7,我们调整了编译环境的版本, 使用1.74 rust + lto 链接, 使得v0.0.4的implant能运行在低版本的windows中。
重载了链接过程,解决rust lto无法正确加载符号表的bug: https://github.com/rust-lang/rust/issues/44322
修复sRDI 静态 TLS 无法加载的问题¶
解决了PE loader 无法加载存在静态 TLS
的PE文件, 导致以 Rust
编写的程序加载panic问题。
目前还没有解决了这个问题的sRDI, 为此我们实现了自己的sRDI并替换了原有的link sRDI
.\malefic-mutant.exe build srdi -i .\malefic.exe
(在v0.0.4发布之时,我们同步开启了硬核的系列技术文章分享, 将分享一些尚未有人解决过的问题)
dllspawn¶
由于还有很多资源停留在 CS
的各类库中, 因此, 我们提供了 dllspanw
来适配 CS
的对应功能
CS中各种提权的dll以及各种功能, 绝大部分都基于此实现, 现在我们能完美的兼容CS的dll相关命令了
http pulse¶
在v0.0.3 中, 支持了基于tcp协议的stager,但是因为静态TLS锁的问题, 现有的所有sRDI或PE loader (donut, pe2shellcode, No-Consolation等等)都无法加载rust MSVC编译的程序。又因为GNU的win7兼容性问题, pulse事实上只是一个摆设。
现在我们同时解决了win7兼容性与静态TLS锁的问题。并新增了pulse的http实现,现在pulse可以真正发挥stager的作用了。
自动化编译¶
在刚发布的v0.0.3中, 我们使用docker作为自动化编译的解决方案。 但是rust复杂的编译方案不得不准备每个target对应的编译环境。这导致了对CPU, 内存,硬盘都有巨大的占用, 并且我们目前只实现了基于linux的自动化安装。
比起sliver或者CobaltStrike过于笨重, 这导致上手门槛极大提高。为此, 我们准备了更加轻量的解决方案。
在v0.0.2中, 提供了使用两行gh命令实现的自动化编译, 在v0.0.4中,我们将github action的云编译接入到client/server中, 只需要申请一个github token, 即可实现对client/server无任何环境要求的自动化编译。
v0.0.4支持无任何本地环境的自动化编译了, 极大减轻了malefic编译的心智负担
基于github action的快速编译¶
github相关配置
使用github action前,需要先在server所处服务器上对server二进制文件同一目录下的config.yaml进行配置。将malefic源码所在的github仓库名、github用户名github token以及workflow配置文件名填入。
...
github:
repo: # malefic的仓库名
owner: # github用户名
token: # github的token
workflow: # workflow的配置文件名(默认为generate.yaml)
若有多个用户使用服务器,也可以在client所处主机的~/.config/malice/malice.yaml下进行配置。当client端的github 配置填入之后,server会优先使用client提供的github配置,来启动工作流。
...
github_repo: # malefic的仓库名
github_owner: # github用户名
github_token: # github的token
github_workflow_file: # workflow的配置文件名(默认为generate.yaml)
action build
使用action和子命令来进行编译,必须指定build target以及对应的profile。当workflow运行成功时,client会提示当前workflow的html_url,方便在网页端进行查看。当编译完成时,也会在client进行通知。
命令示例:
action beacon --profile test --target x86_64-pc-windows-msvc
为了统一使用,action run的参数命令与docker build的参数基本一致。
docker优化¶
添加了服务器端的docker编译队列,因为rust端对性能占用较大, 编译时会占用所有的CPU。现在添加了编译队列, 同时只会运行一个编译任务。
极大减少了install.sh安装时的配置, 现在只会下载一个allinone的镜像. 这个镜像允许除了arm架构以及win MSVC之外的所有架构编译。
原本的install.sh 会下载约13g的镜像, 然后生成几个g的编译中间文件。现在我们大大简化了对服务器的负担, 提供了新的allinone的编译镜像以及简化安装脚本。
allinone 镜像: ghcr.io/chainreactors/malefic-builder:v0.0.4
这个镜像解决了大量的rust的环境安装,交叉编译等问题。如果有其他rust项目在编译上遇到各种错误, 不妨使用这个试试。
client更新¶
artifact功能组¶
为了在提权脚本中更方便使用IoM, 就像CS能直接通过listener生成对应的shellcode一样. patch2将一系列shellcode与artifact操作的函数暴露出来了。
我们添加大量shellcode生成,sRDI等操作相关的api。
- artifact_payload ,对应CobaltStrike中的同名函数, 用于生成stageless的shellcode, 在IoM是SRDI后的beacon
- artifact_stager, 对应CobaltStrike中的同名函数, 用于生成stager的shellcode, 在IoM中式SRDI后的pulse
- donut_dll2shellcode, 基于donut实现的dll转shellcode
- donut_exe2shellcode, 基于donut实现的exe转shellcode
- sgn_encode, shellcode sgn混淆
- srdi, 能调用malefic-mutant中支持的srdi将二进制程序转为shellcode
- .....
详细文档可以查阅: https://chainreactors.github.io/wiki/IoM/manual/mal/builtin/#artifact
donut¶
将内置的donut从 https://github.com/Binject/go-donut 迁移到 https://github.com/wabzsy/gonut .
并对其进行了大量改动:
- 将内置的donut 从v1.0 更新到v1.1 , 现在更加稳定
- 将execute-assembly替换为donut生成的shellcode (临时, 后续会使用malefic-srdi代替)
- 新增donut命令
非交互式client¶
特定场景下使用, 更轻量的交互模式
.\client.exe implant whoami --use 08d6c05a21512a79a1dfeb9d2a8f262f --auth admin_127.0.0.1.auth --wait
Other of others¶
- lua api文档格式重构, 现在更加清晰
- 将sgn与malefic-mutant在编译时内嵌, 减少安装时的步骤
- 优化
!
命令, 能更好得执行本地的命令, 而不需要退出程序 - 编译pulse时 联动beacon
- 重构website
- 优化tui渲染的颜色
- 修复了各种细节处的bug数十处
End¶
在我们最初的计划中, 我们的ASM框架mapping可以与C2框架IoM同步进行。 但是C2需要耗费的精力远超想象, 所以ASM再次被搁置。 好在代理工具rem的进展顺利,不出意外近期就可以见面。
rem¶
rem的简介:
在 rem 中, 基于传输层之上重新抽象了整个网络交互的流程。
- 传输层, 对应 tunnel, 分为 listener 和 dialer, 可以实现自定义的任意传输层信道, 只需要实现对应的 golang 的接口即可。目前实现了,tcp, udp, icmp, websocket.
- 会话层, 实现了链接复用(mux),会话管理.
- 加密混淆层(对应表示层),对应 core/wrapper,对应的接口是 ReadWriteCloser, 只需要实现对应的 Read 和 Writer 接口, 即可实现对传输层流程的加密,混淆, 伪装。甚至可以实现上下行流量分别配置不同的 wrapper. 目前实现了 aes, xor, padding.
- 中转/代理层(对应表示层) (可选), 可以通过第三方代理/服务中转流量, 例如通过 ssh, socks5, neoreg, suo5 等任意具有流量功能的实现数据转发, 目前实现了 http/https, socks5/4, ssh, shadowsocks
- 应用层, 基于上面三层实现的信道, 可以被封装为不同的应用, 目前实现了 socks5, port forward, http 代理, shadowsocks, trojan
基于这样的抽象层级, 我们可以任意拓展 rem 的能力边界。 我们可以快速添加一个传输层协议, 或是加密混淆算法, 或是代理中转工具, 又或是最终面向用户的协议。
这是前所未有的潜力, 理论上不存在任何在流量上被特征/统计学检测的可能。
可以在 https://chainreactors.github.io/wiki/rem/design/ 找到rem的设计文档(update 2024.12), 更新了重构后的rem架构设计。
IoM-gui¶
并且IoM的GUI也已经完成了大部分工作, 马上可以发布v0.0.1的IoM-gui .
我们终于可以通过可视化的方式呈现各种复杂的功能。