19

[原创]魔改CobaltStrike:命由己造(上)

 3 years ago
source link: https://bbs.pediy.com/thread-267848.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
[原创]魔改CobaltStrike:命由己造(上)-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
[病毒木马] [原创]魔改CobaltStrike:命由己造(上)
5天前 1206

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

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

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

三、主要功能
spawn(x86)
case 1,派生会话,原理是挂起线程rundll32线程注入dll
接收到的数据:

以挂起方式启动rundll32.exe:

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


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


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


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

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

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

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

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

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

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

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

Upload 上传文件
case 10 ,upload上传文件,

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

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

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

execute 执行程序
case 12 ,execute 执行程序,但不回显

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

Spawnto (x86)
case 13,spawnto,设置Beacon派生会话时使用的程序

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

case 15,,case 16,是没有命令参数,是与rportfwd端口转发相关的case ,首先接收到访问目标机器的请求信息:

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

desktop VNC远程桌面
case 18,x86 desktop VNC远程桌面(不注入进程),需要由vnc的dll,不建议用有点卡

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

case 22,没有相关命令行,负责中转子beacon的传输数据:

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

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

最后拼接输出:

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

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

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

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

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

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

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

Job执行后数据的回传
case 40,当job执行后产生数据会用管道回传给beacon:


Createfile()创建管道:

SetNamedPipeHandleState()设置管道PIPE_READMODE_BYTE模式:

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

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

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

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

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

X64注入进程的desktop
case 45,x64 desktop VNC远程桌面(注入进程),需要由vnc的dll,不建议用有点卡

X86 注入进程的desktop
case 46,x86 desktop VNC远程桌面(注入进程),需要由vnc的dll,不建议用有点卡

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

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

四、小结
在这里我们分析beacon的约前50项功能,一探其相关功能的实现,为日后重写beacon有所帮助,下次我们继续分析后50项功能。最后谢谢大家观看。

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班火热招生!!

最后于 5天前 被快乐鸡哥编辑 ,原因:

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK