cobalt strike reverse https shellcode x86 stage分析
前言:很早就想学习了下,只是一直没时间,这次有时间学习下cobalt strike reverse https shellcode x86 stage分析笔记
参考文章:https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/beacon-jia-zai-zhi-hang-guo-cheng
参考文章:https://mp.weixin.qq.com/s/VHpcHzLc829hmQjrx1139A
初始化过程
自己测试的cs版本为4.3,生成stage分阶段的https payload,如下图所示
然后这里通过x86dbg来进行调试,加载如下图所示,这里可以看到在ndtll.dll的领空,这里直接F9一次回到程序的入口点即可
这里定位比较麻烦,可以直接IDA进行观察然后定位关键点即可,下面有两个函数,主要重点还是看sub_401840
跟进sub_401840,可以看到存在创建线程的操作
所以这边的话直接来到sub_401840来进行调试
可以看到先进行格式化管道\\\\.\\pipe\\MSSE-7380-server
,其中的四个数字是随机的,其他的比如"MSSE"和"server"都是固定的
穿插点:我发现这个管道名其中的四个字符"MSSE"是被写死的,所以这个比较容易作为特征点来发现,如果要修改的话也比较容易,直接上resource文件夹中对应的机器码直接修改即可
上面定义了管道名,这里的话就对应的通过CreateThread一个线程函数,但是下面还有一个jmp 0x4017E2,0x4017E2的执行比线程函数0x401713先执行
该线程函数0x401713创建了相关的\\\\.\\pipe\\MSSE-7380-server
命令管道,然后进行连接
接着就是走到了jmp 0x4017E2函数中,先是进行malloc函数进行申请空间
接着进入到0x401732函数中进行执行
跟进去会发现对上面创建的管道进行CreateFile获取句柄,然后进行写入相关被加密的shellcode
然后执行call artifact.40158E
跟到0x40158E函数中,可以看到执行的就是进行VirutalAlloc函数申请空间,申请空间的地址是0x20000
接着进行xor异或解密操作,然后将解密完的数据往0x20000里面进行填充
填充完数据之后就是通过VirtualProtect函数进行修改VirutalAlloc物理页的属性,然后通过创建线程函数0x40155进行执行
这里直接跟到0x20000的位置,从这里开始执行的就是shellcode的部分了
执行shellcode
接下来就是执行shellcode的过程了,首先执行了cld,作用是清空标志位DF
接着就是shellcode的核心 CALL 0x2008F,跟进去会发现这个函数的作用实际上就是压入相关的字符串wininet作为参数,然后最终压入一个哈希值,这个哈希值就是对应要调用函数的哈希值,比如这里的话就是0x726774C,该哈希值对应的就是LoadLibraryA函数
知识点:如何获取哈希对应的函数可以参考文章: https://www.cnblogs.com/zpchcbd/p/15886229.html
0002008F | 5D | pop ebp | 弹出栈顶,过来的+5的地址 00020090 | 68 6E657400 | push 74656E | 00020095 | 68 77696E69 | push 696E6977 | 0002009A | 54 | push esp | 0002009B | 68 4C772607 | push 726774C | 1.LoadLibraryA函数的哈希值 000200A0 | FFD5 | call ebp | 000200A2 | E8 00000000 | call 200A7 | call $0
上面的数据压入之后通过ebp又进行返回到原来的地方,下面这些地方就是通过遍历对应的dll,找到LoadLibraryA函数然后将加载wininet.dll,通过jmp eax跳到LoadLibraryA来进行执行
下面的流程也是一样的调用过程,直接大概讲下即可,接着就是调用InternetOpenA函数
000200A7 | 31FF | xor edi,edi | 000200A9 | 57 | push edi | 000200AA | 57 | push edi | 000200AB | 57 | push edi | 000200AC | 57 | push edi | 000200AD | 57 | push edi | 000200AE | 68 3A5679A7 | push A779563A | InternetOpenA函数的哈希值 000200B3 | FFD5 | call ebp |
InternetConnectA,同时可以看到请求的地址为192.x.x.x
HttpOpenRequestA,可以看到请求的地址为/1bxQ
InternetSetOptionA,同时可以看到对应的header头
HttpSendRequestA
GetDesktopWindow
InternetErrorDlg
VirtualAllocA,申请的地址为0x400000,这个地址没有太看懂
InternetReadFile,0x3c60000循环多次读取数据
0x3c60000是一段shellcode,跟过去可以看到如下图所示,这里的话直接下个断点,可以看到当InternetReadFile多次运行完成了之后就来到了这里
这下面的话就是开始执行一系列操作,然后最终调用beacon.dll中导出的反射函数最终实现上线
分析beacon.dll可以参考文章:https://yzsam.com/html/aXSjvn.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-11-08 动态随机抽奖程序的实现