安全矩阵

 找回密码
 立即注册
搜索
查看: 2738|回复: 0

魔改CobaltStrike:命由己造(上)

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-5-28 20:22:01 | 显示全部楼层 |阅读模式
原文链接:魔改CobaltStrike:命由己造(上)
魔改CobaltStrike:命由己造(上)

1
概述
这次我们来探究beacon里每个功能点是如何实现的,以便日后更好地实现自定义beacon。因为有近百个相关功能点,所以文章就分了上下两部分。
项目地址如下:
https://github.com/mai1zhi2/CobaltstrikeSource

2
前情提要
我们从上篇协议剖析得文章中知道当beacon发送心跳包后,teamserver会返回相应的任务号,并返回相应得任务信息,beacon接收到任务信息后,会进入循环处理:

在AllCase_10007F19()里面就是beacon得全部命令功能,我们按反编译循环中的case号从低向高写,case号与发送数据包的任务号是大同小异的。

3
功能剖析
spawnx86
case1,派生会话,原理是挂起方式启动rundll32并注入dll
接收到的数据:

Createprocess()以挂起方式启动rundll32.exe:

注意输入的标志0x00000004 CREATE_SUSPENDED:


使用VirtualAllocEx()在目标rundll32进程申请内存空间:


WriteProcessMemory()在申请的内存空间写入dll:



使用VirtualProtectEx()设置内存属性,PAGE_EXECUTE_READWRITE


设置context上下文,并恢复线程:





exit退出
case3,Exit退出功能,修改dwMilliseconds时间为0:

如果为0就调用sub_10009BB0()退出程序:


Sleep
case4,Sleep设置beacon睡眠时间
接收数据包,取得修改的时间并进行修改dwMilliseconds



Cd切换目录
case 5,切换目录使用SetCurrentDirectory切换当前进程的当前工作目录。



Inject(x86)
case9,指定已打开进程来注入会话,原理就是远程线程注入,dllinject、shinject之类也会走这个case。
先用openprocess()打开目标进程:

目标申请空间后写入dll文件:

最后调用CreateRemoteThread()进行远程线程注入:



Upload上传文件
case10 ,upload上传文件,

首先分割teamserver回传的数据,得到上传的文件名,然后wb模式打开文件:

然后获得数据长度和内容,调用fwrite写入:


download下载文件
case11,download下载文件,先分割数据包获得需要下载的文件名,然后打开文件,不断读取文件内容,然后加密返回给teamserver:



execute执行程序
case12 ,execute执行程序,但不回显

直接使用createprocess()启动相应进程:

Spawnto(x86)

case13,spawnto,设置Beacon派生会话时使用的程序

当再执行spawn时,会判断启用哪个程序进行注入,而不是再注入默认的rundll32.exe:





端口转发数据回传(没有命令参数)
case15case16这两个是与rportfwd端口转发相关的case,首先接收到访问目标机器的请求信息:

然后发送给目标机器,然后中转机通过select模型等待信息返回:

最后把rportfwd端口转发的信息返回:



desktopVNC远程桌面
case18,x86 desktopVNC远程桌面(不注入其他进程),不建议用vnc


download_cancel取消相关下载文件
case19,命令beacon取消相关的文件下载:


中转子beacon所发送的数据(没有相关命令参数)
case22,没有相关命令行,负责中转子beacon的数据传输(注意,不是端口转发的数据):






Unlink
case23,调用shutdow()断开与子Beacon的连接



Getuid
case27,获取当前令牌关联的用户ID
使用GetTokenInformation检索令牌信息和LookuoAccountSid获取令牌SID:

最后拼接输出:


rev2self
case28,恢复Beacon原始令牌
调用RevertToSelf()终止当前用户标识的模拟并返回原始线程标记:



steal_token
case31,从目标进程中窃取访问令牌
先打开进程,获取指定进程的句柄令牌,再用ImpersonateLoggedOnUser模拟一个登陆用户的访问令牌的安全上下文,最后用DuplicateTokenEx拷贝一个当前令牌相同权限的令牌


ps
case32,显示进程列表
使用CreateToolhelp32Snapshot()、Process32Next()相关函数遍历系统进程信息,然后进行发送给服务器:



Kill
case33,结束指定进程
调用TerminateProcess()结束指定进程:


powershell-import
case37,导入Powershell脚本
导入相关的ps脚本(如nishang)以便后续调用



Runas
case38,以其他用户权限执行程序
调用CreateProcessWithLogonW()函数,以某用户身份执行指定程序



Pwd
case39,显示当前所在目录
直接用GetCurrentDirectoryA()得到当前目录并返回:


Job执行后数据的回传(没有相关命令)
case40,当job(PortScan之类的)执行后产生数据会用管道回传给beacon:


Createfile()创建管道:

SetNamedPipeHandleState()设置管道PIPE_READMODE_BYTE模式:

调用PeekNamedPipe()读取管道内的数据:



Jobs
case41,查看Beacon中的所有任务,在list读取后台进行中的任务


jobkill
case42,结束一个在后台运行
调用DisconnectNamedPipe()与后台进程终止链接:


Inject(x64)
case43,指定已打开进程来注入会话,原理就是远程线程注入,dllinject、shinject之类也会走这个case,流程与case9一样。

Spawn(x64)
case44,派生会话(x64),原理也是挂起线程rundll32线程注入dll,流程都是一样的,只是在不同文件夹在rundll32.exe


X64注入进程的desktop
case45,x64 desktopVNC远程桌面(注入进程),不建议用vnc


X86注入进程的desktop
case46,x86 desktopVNC远程桌面(注入进程),不建议用vnc


Pause
case47,暂停,当执行到某些任务(如注入扫描dll)时beacon会主动暂停一秒左右:


Make_token
case49,创建令牌,使用GetTokenInformation检索令牌信息和LookuoAccountSid获取令牌SID:





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 02:40 , Processed in 0.014377 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表