一、概述这次我们来探究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的传输数据:
Unlinkcase 23,调用shutdow()断开与子Beacon的连接
Getuidcase 27,获取当前令牌关联的用户ID使用GetTokenInformation检索令牌信息和LookuoAccountSid获取令牌SID:最后拼接输出:
rev2selfcase 28,恢复Beacon原始令牌调用RevertToSelf()终止当前用户标识的模拟并返回原始线程标记:
steal_tokencase 31,从目标进程中窃取访问令牌先打开进程,获取指定进程的句柄令牌,再用ImpersonateLoggedOnUser模拟一个登陆用户的访问令牌的安全上下文,最后用DuplicateTokenEx拷贝一个当前令牌相同权限的令牌
pscase 32,显示进程列表使用CreateToolhelp32Snapshot()、Process32Next()相关函数遍历系统进程信息,然后进行发送给服务器:
Killcase 33,结束指定进程调用TerminateProcess()结束指定进程:
powershell-importcase 37,导入Powershell脚本导入相关的ps脚本(如nishang)以便后续调用
Runascase 38,以其他用户权限执行程序调用CreateProcessWithLogonW()函数,以某用户身份执行指定程序
Pwdcase 39,显示当前所在目录直接用GetCurrentDirectoryA()得到当前目录并返回:
Job执行后数据的回传case 40,当job执行后产生数据会用管道回传给beacon:Createfile()创建管道:SetNamedPipeHandleState()设置管道PIPE_READMODE_BYTE模式:调用PeekNamedPipe()读取管道内的数据:
Jobscase 41,查看Beacon中的所有任务,在list读取后台进行中的任务
jobkillcase 42,结束一个在后台运行调用DisconnectNamedPipe()与后台进程终止链接:
Inject(x64)case 43,指定已打开进程来注入会话,原理就是远程线程注入,dllinject、shinject之类也会走这个case ,流程与case 9一样。
Spawn (x64)case 44,派生会话 (x64),原理也是挂起线程rundll32线程注入dll,流程都是一样的,只是在不同文件夹在rundll32.exe
X64注入进程的desktopcase 45,x64 desktop VNC远程桌面(注入进程),需要由vnc的dll,不建议用有点卡
X86 注入进程的desktopcase 46,x86 desktop VNC远程桌面(注入进程),需要由vnc的dll,不建议用有点卡
Pausecase 47,暂停,当执行到某些任务(如注入扫描dll)时beacon会主动暂停一秒左右:
Make_tokencase 49, 创建令牌使用GetTokenInformation检索令牌信息和LookuoAccountSid获取令牌SID:
四、小结在这里我们分析beacon的约前50项功能,一探其相关功能的实现,为日后重写beacon有所帮助,下次我们继续分析后50项功能。最后谢谢大家观看。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课