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

posted @   zpchcbd  阅读(376)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2019-11-08 动态随机抽奖程序的实现
点击右上角即可分享
微信分享提示