shellcode简介
shellcode是一段用于利用软件漏洞而执行的代码,也可以认为是一段填充数据,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
下面这张图就是shellcode工作流程,从功能上看,shellcode在整个漏洞利用过程中发挥主要作用就是对计算机端的控制。
shellcode可以按照攻击者执行的位置分为本地shellcode和远程shellcode.
本地shellcode:本地运行的shellcode经常用于利用软件漏洞提升权限。比如在Linux下由普通权限提升至root权限。
远程shellcode:利用软件漏洞获得特定的shellcode,再经由C或Python编写远程攻击程序,进而取得对方电脑的root权限。
Shellcode是漏洞利用的必备要素,也是漏洞分析的重要环节,我们可以通过对shellcode进行定位来辅助回溯原理并确定漏洞特征,通过对shellcode功能的分析,我们还可以确定漏洞样本的危害程度的及其目的,并优肯追踪攻击来源,这对apt供给分析中的溯源工作非常有利。
Shellcode在漏洞样本中的存在形式一般为一段可以自主运行的汇编倒霉,他不依赖任何编译环境,也不能像在IDE中直接编写代码哪有调用API函数名称来实现更能,他通过主动查到dll基址并动态获取api地址的方式来实现api调用,然后根据实功能调用想用的api函数来完成其自身的功能,shellcode分为两个模块,分别是基本模块和功能模块
基本模块
基本模块:用于实现shellcode初始运行、获取kernel32基址和获取api地址的过程。
获取kernel32基址
获取Kernel32 基址的常见方法有暴力搜索、异常处理链表搜索和TEB ( Thread EnvironmentBlock)搜索。这里只介绍目前最常用的动态获取Kernel32.dll 基址的方法一-TEB 查找法。其原理是:在NT内核系统中, fs 寄存器指向TEB结构, TEB+0x30偏移处指向PEB ( Process EnvironmentBlock )结构,PEB+0x0c偏移处指向PEB LDR DATA结构, PEB LDR_ DATA+0xlc 偏移处存放着程序加载的动态链接库地址,第1个指向Ndl.dII, 第2个就是Kerel32.dl的基地址。
从Windows Vista 开始,程序中DLL基址的加载顺序发生了变化,在固定的位置已经不能得到正确的Kernel32 基址了,因此,需要在列表中对各DLL模块的名称加以判断,才能得到正确的Kernel32基址。
获取api地址
从DLL文件中获取API地址的方法如图14.12 所示,步骤如下。
- 在DLL基址+ 3ch偏移处获取e_ lfanew 的地址,即可得到PE文件头。
- 在PE文件头的78h偏移处得到函数导出表的地址。
- 在导出表的lch 偏移处获取AddressOfFunctions 的地址,在导出表的20h偏移处获取AddressOfNames的地址,在导出表的24h偏移处获取AddressOfNameOrdinalse的地址。
- AddressOfFunctions 函数地址数组和AddressOfNames 函数名数组通过函数AddressOfNameOrdinalse一一对应。
在实际应用中,如果API函数名直接以明文出现,就会降低shellcode的分析难度,而且api函数名称占用空间一般比较大,这会使shellcode的体积跟着增大。
利用hash算法将要获取的函数名称转换为4字节的hash值,在搜索过程中按此算法计算dll中的文件名称的hash值,对比两个hash是否相同,这样就有效减小了shellocde的体积,同时提高了shellcode的隐蔽性。
功能模块
功能模块:实现漏洞利用目的那部分的shellcode,签名介绍的基础模块所做的工作,其目的就是在这里实现相应的功能。
常见功能:下载执行、捆绑、反弹shell
下载执行
具有这个功能的shellcode最常被浏览器类漏洞样本使用,其功能就是从指定的url下载一个exe文件并运行。
URLDownloadToFile:指从指定URL地址读取内容并将读取到的内容保存到特定的文件里的实现方法。
winexec:运行指定的程序。
捆绑
捆绑技术是将两个或两个以上的文件捆绑在一起成为一个可执行文件,在执行这个文件的时候,捆绑在里面的文件都被执行。需要捆绑在一起的文件,可以是相同的文件格式,也可以是不同的文件格式。
- 多文件捆绑:捆绑技术中最简单的捆绑方式,也是最流行的捆绑技术实现方式之一。文件捆绑也就是将A.exe文件(正常文件)和B.exe文件(恶意代码)捆绑成C.exe文件。当用户点击C.exe文件时,用户看到的是A.exe文件的执行结果,而B.exe文件则在后台悄悄执行。
- 漏洞利用捆绑 :目前比较流行的捆绑技术之一,利用word、excel、flash等一些应用产品中的安全漏洞,通过对漏洞的利用,然后调用恶意代码进行执行。例如当一些研究人员发现word产品的安全漏洞后,黑客编写漏洞利用程序,并把恶意代码植入word的宿主文件中。当用户打开恶意的word文件时,word漏洞中的程序通过Shellcode调用恶意代码,并执行之。
具有这个功能的shellcode最常见于office等漏洞样本中,其功能是将捆绑在样本自身上的exe数据释放到指定目录中并运行。
反弹shell
反弹shell:就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
具有这个功能的shellcode多见于主动远程溢出漏洞样本中,攻击者可以借助nc等工具,在实施攻击后获取一个远程shell执行任意命令。