1引言
随着互联网络的快速发展,网络安全问题日益突出。计算机病毒、以及网络蠕虫等恶意程序对网络安全构成了巨大的威胁。其中“木马”的破坏最大,它能在高隐蔽性的状态下窃取信息。完整的木马程序一般由两部份组成一个是服务端程序,一个是客户端控制程序。木马的通信方式按照被控方与施控方建立通信信道的方式可分为直接监听、反弹连接、代理连接、综合连接等方式。不论采用何种通信方式,其基本工作原理都是:施控端向中植木马服务端的主机发送指令,服务端对不同指令进行不同响应的过程。本文以反弹型木马为例,对木马的各功能模块运行原理和设计过程进行详细分析。
2木马功能结构
木马程序虽然其外在功能表现各不相同,但其基本的功能结构是一致的。植入木马程序的目的是为了实现对目标主机长期有效的控守,这就要求木马驻留于目标主机中,系统关机重启之后仍然可以运行。因此木马需要包含一个驻留模块,实现木马在目标机的长期存储。
木马和远程控制软件的最大区别在于木马需要在用户不知情的条件下运行,需要对木马自身信息和木马通信信息进行隐藏以躲避杀毒软件的查杀,因此木马中需要包括隐藏对抗模。可控性是木马的另一个特点,要实现可控性,首先要和远程建立稳定的通信连接,以接受远程命令和回送结果。此外,需要对收到的命令进行分析执行,因此通信模块和执行远程命令的任务模块也必不可少.根据上面的分析,从功能上可以将木马划分为如下模块:
●初始化模块:负责对木马运行过程中使用的信息进行初始化;
●远程控制模块:负责和木马控制端通信,接收控制端的控制命令并把功能模块命令执行的结果发送给控制端;
●驻留模块:负责以一定的方式实现木马程序的自启动,保证目标系统重启之后能自动加载木马执行;
●隐藏模块:负责隐藏木马自身的相关信息,这些信息可能包括文件、注册表、进程,以及通信连接等信息;
●任务模块:负责具体执行控制端下达的任务。任务模块可能包括:键盘记录、文件操作、注册表操作、屏幕获取等。
3远程控制模块
反弹式木马工作模式是:客户端开启一个本地端口来监听远方连接请求,服务端通过一些方法获得客户端IP、端口信息后主动连接它,实现远程控制。反弹式木马的远程控制流程如图1所示:
(1)客户端运行后,在指定的端口监听,等待远程服务端与之建立连接。当木马成功地在目标主机运行后,会主动连客户端主机的IP和端口,建立命令SOCKET连接。连接建立完成后,服务端把主机特征信息如:主机ip、主机名称、MAC地址等信息回转给客户端,用以标识与客户端反连的不同主机。
(2)客户端向服务端发送不同的指令使服务端执行相应操作。服务端执行操作有两种类型:一是执行指令较少,必须快速响应客户端的操作,如:浏览文件目录、浏览注册表目录、获取主机信息、文件打包等操作;二是执行的指令较多,数据传输量较大的操作,如远程文件下载、远程屏幕查看、远程摄像头查看等操作。
(3)对需快速响应操作,服务端收到来自客户端的指令后,直接利用命令socket将执行结果发送给客户端,如:服务端接收到显示文件目录命令后,将文件目录列表压缩打包,并通过命令socket回传至客户端进行显示。
(4)对数据传送量大的操作,服务端收到指令后需重新利用connect函数反连客户的ip和端口,目的是获得一条新的TCPsocket连接专门用于数据传输。因为传输的数据量较大,执行时间较长,如直接用命令socket回传操作数据,会导致命令socket长时间处于阻塞状态,客户端不能异步发送其它命令,严重影响操作效率。比如:服务端接收到文件下载命令后,会重新反连客户端获取一条新的socket的数据连接,同时开启一个线程用数据连接进行下载数据的传输,这样客户端在实现文件数下载的同时,可以再次通过命令socket发送其它指令进行其它操作。
4驻留模块
木马的驻留方式有很多,按启动方式分为两种,一种是开机自运行的程序,如:启动项写入注册表,服务方式启动,写入WMI脚本数据库等;另一种是触发式启动的程序,如利用DLLhijack技术实现某一系统事件或应用程序操作时,木马被激活启动。
1.服务方式驻留
以Windows系统为例,注册为系统的服务方式进行开机启动是木马常用的启动方式之一。
利用方法主要有两种,一是木马程序注册为系统的服务进行启动;二是木马程序不直接注册为系统服务,而是以DLL形式并借助于svchost服务宿主进行启动。Service程序一般又由以下四部分组成:main()、ServiceMain()、Handler()、及木马工作线程。
Service入口从main()开始,main函数功能十分简单,将待注册服务的有关参数写入ServiceTable结构中,并将ServiceTable作为参数传递给StartServiceCtrlDispatcher,实现服务的启动。当ServiceMain执行完毕或发生错误时,StartServiceCtrlDispatcher函数返回,然后主服务进程终止。ServiceMain()是Service程序的真正入口点,它主要完成以下功能,首先注册一个ServiceHandler去处理控制程序或控制面板的交互式的控制要求。
木马程序的线程是在ServiceHandler的启动函数下由开发者创建。需要注意的是,大部分开发者并不会在木马线程中实现木马的功能,仅仅是利用Service框架实现木马启动。如:在木马工作线程中会开启IE、Explorer等新的系统进程,接着把木马功能代码注入到这些系统进程中去执行。这样即能保证木马稳定的启动,又可以使木马难以发现和查杀。
2.DLLhijack驻留
DLL劫持是指利用操作系统在DLL加载机制上的缺陷,使系统或应用程序加载包含恶意代码DLL的攻击方法,也常用于木马的启动。Windows上DLL的劫持技术分为三类:旧DLL劫持、新DLL劫持和利用COM组件劫持。DLL劫持的原理是Windows进程在初始化阶段,会根据PE导出表加载其所引入的DLL。但是PE导出表中只包括DLL的名称,没有指定DLL的路径,故加载程序必须在磁盘上搜索DLL文件执行。Windows默认的DLL搜索目录及顺序,XPSP2之前版本如下所示:
(1)应用程序所在目录
(2)当前目录
(3)WindowsSYSTEM目录
(4)16位系统目录
(5)Windows目录
(6)PATH环境变量指定的路径
由于搜索目录存在一定的顺序,木马制作者可以伪造一个与系统DLL同名的DLL,提供同样的输出表,在伪造导出函数中会首先执行木马的有关功能接着会跳到系统DLL同名函数里执行真正的函数功能。旧DLL劫持是利用系统DLL目录搜索方式,使程序加载应用程序所在目录下伪造的系统已知的DLL;而新DLL劫持技术使程序加载应用程序所在进程当前目录下伪造的应用软件DLL。近年来,各类知名应用软件Winrar、GoogleEarth、PhotoShop等均存在新DLL劫持漏洞,使得木马程序可利用这些漏洞进行启动执行。如果劫持一些不常见的系统DLL:如打印过滤驱动的DLL,COM组件启动,使木马隐蔽性增加。
5、任务模块
常见的木马执行任务有:文件目录浏览、注册表查看、文件上传/下载、远程屏幕查看、远程摄像头启动、远程键盘监视等。其中文件下载、屏幕查看是木马最基本的功能。
1.文件下载
远程文件下载多采用分块算法,比如:以4096字节为一块进行传送。分块结构体如下:
typedefstructTAG_FILE_BLOCKS { DWORD BOOL BYTE dwFinger; isEnd; //断点位置 //文件结束标志 //分块数据内容 wParam[4096]; }TAG_FILE_BLOCKS,*PTAG_FILE_BLOCKS
图2文件下载流程
(1)服务端接收到文件下载指令后,利用指令中的文件路径参数得到本地文件的大小。
(2)将文件大小回传给客户端,客户端根据文件大小建立存放下载文件的缓冲区。
(3)如果文件已经下载过,客户端获取已下载部分的大小,将已下载部分大小作为下载断点传递给服务端程序用来实现文件续传功能。
(4)服务端打开下载文件,并将指针定位到断点位置准备进行数据读取。数据读取按4096字节为一块进行读取传输。循环条件是只要剩余文件字节数大于4096,s则一次读取整一块发送至客户端,客户端按顺序接收分块数据逐块写入到硬盘中。如果文件剩余字节数小于4096意味着文件指针已定位到末尾,将剩余所有字节数据发送至客户端,最后再向客户端发送分块结束标志,客户端收到结束表志后断开socket连接,释放内存,下载过程结束。
2屏幕传输
木马一般采用的抓屏方法是首先使用BitBlt函数得到屏幕位图的控制信息,BitBlt函数的源设备描述符可利用CreateDC("DISPLAY",NULL,NULL,NULL)函数获取(第一个参数设置为“DISPLAY”表示获取整个屏幕设备描述符),接着再利用GetDIBits函数得到位图数据。如果采用cmSrcCopy模式一次性对整屏抓取,直接压缩传输,由于数据量大,往往无法取得较好的实时效果,特别是在网络状态不理想的情况下这一点特别突出。常用的算法是采用将屏幕划分为一定数量的大小相等的矩形块,传输数据时,比较所抓取的矩形区域图像是否发生了变化,若未发生变化则不处理,否则进行后续处理。屏幕分块数据可用如下结构体structTAG_SCREENGDI_NODE表示,主要成员变量如下图3所示:
图3分块屏幕传输结构
假设屏幕大小为1024*768,分为四块进行传输。其中iGrid,iGridY表示分块序号;
iWidth1,iwidth2分别表示分块图片的left,right方向坐标;iHeight1,iHeight2分别表示分块图片的top,down方向坐标;hDIBitmap表示该区域位图句柄;pDIB表示该区域位置数据;pDIBChange表示变化部分区域的数据;PDIBCompress表示压缩后位图数据;pDIBitmap表示上一次传输该区域的位图数据;fDIBitmap表示该区域位图是否首次传输。
将分块数据存放在链表结构SCREENLIST中,那么服务端遍历发送分块屏幕数据的程序逻辑有:
…… //m_GdiStart表示SCREENLIST中的第一个节点 m_pGdiNode=m_GdiStart.pNext; while(m_pGdiNode) {//如果桌面发生了变化,则发送DIB if(m_pGdiNode->Gdi.fChange) {//压缩数据 compress(原始图片数据,压缩数据输出缓冲); //发送压缩的DIB Transmit(socket,压缩数据指针); } m_pGdiNode=m_pGdiNode->pNext; } ……
某一块屏幕数据发送流程如图4所示:
图4远程屏幕分块传输流程
为了提高画面传输效率,在画面分块传输的基础之上,采用cmSrclnvert模式进行画面传输。原理是:在服务端先将待发送的屏幕数据与最近发送的源位图位数据进行XOR异或运算后,再将运算所得的位图进行压缩。相应地,在客户端显示时,将解压后的位图数据与当前的位图数据进行XOR异或运算,则运算所得的位图便是服务端当前所传送的屏幕图像。
cmSrclnvert屏幕图像抓取方法与直接发送屏幕画面相比较,虽然客户端与服务端多了一步位图位值XOR异或运算,但是经压缩后,数据量要小得多。这主要是因为一般情况下屏幕图像总是在一个局部而非整个屏幕发生变化,将当前屏幕图像与上一屏幕图像进行XOR异或运算后,所得屏幕位图未变化部分的位值将为0,而变化部分的位值为1,当屏幕图像变化范围较小时,则所抓取的屏幕图像位图的大量位值将为0,同时压缩率除与压缩算法有关外,还与待压缩的数据本身有关,因此这样对其进行压缩将取得更加理想的压缩效果。同样的网络状态下,待传输的数据压缩越高,传输实时性越可靠。
6、隐藏对抗功能
隐藏模块:该模块负责隐藏木马启动和运行的相关信息,如:木马文件、注册表、进程、DLL模块、通信连接等信息。木马隐藏功能模块多采用Rootkit技术实现,Rootkit可以在操作系统的Ring3和Ring0层实现,Ring3层的优点是程序兼容性好、稳定,但易被杀软查杀;Ring0下的程序直接运行在系统的内核层,因可直接操作系统的内核变量和使用内核函数,所以具有对抗性强,隐蔽性好的特点,但Ring0下的程序兼容性差,不够稳定。Rootkit技术是一种采用隐藏方法使程序或软件逃过检测,从而保持“root”访问权限的技术。目前的内核Rootkit技术主要采用以下3种思路进行各种信息的隐藏:
(1)执行路径截持(EPH):指通过对内核调用的挂钩或者对函数特殊指令的补丁,达到篡改或改变系统预期执行效果的一种方法。如:中断请求的截持、系统服务调度表(SSDT表)的截持、内联函数截持。
(2)直接内核对象修改(DKOM):与EPH相比较,DKOM通过直接修改内核对象来达到隐藏的目的,这种方法往往更加有效,因为很多函数的执行就是通过访问内核对象获取原始信息。
(3)传输驱动接口(TDI)和网络驱动程序接口(NDIS):TDI和NDIS是网络驱动程序开发的主要接口,绝大部分的桌面防火墙都使用TDI和NDIS驱动内核实现网络数据包的过滤分析。
基于Rootkit的驱动木马也采取这种技术,使之和防火墙的内核处于同一驱动层次上,对网络数据包进行各种分析和过滤的处理,以实现隐藏对坑功能。
使用Rootkit技术的隐藏对抗模块,结构如图5所示;
图5隐藏模块功能结构
该结构图主要包括两个部分:用户态部分和内核态部分。运行在用户态部分的代码和运行在内核态部分的驱动程序交互最终实现木马隐藏对抗功能。
用户态部分主要包括:初始化模块、释放模块、驱动管理模块(包括驱动安装和与驱动通信模块)、驻留模块和任务模块。
●初始化模块:与一般木马功能类似,完成木马必要的初始化工作。
●释放模块:负责把捆绑在木马尾部的驱动程序释放到硬盘上写成文件。
●集中驱动管理模块:包括驱动安装模块,本地隐藏模块和隐蔽通信模块。该部分负责集中统一的管理木马中使用到的所有驱动程序。集中的驱动管理、统一的隐藏信息和驱动信息的存放。
●内核态模块主要是与进程隐藏、文件隐藏、注册表隐藏、服务隐藏、端口隐藏以及通信隐藏相关的一组内核驱动程序,驱动程序的数目可以根据不同的隐藏需求、不同的隐藏实现技术进行扩充而不会影响木马的正常工作。
7、结语
随着计算机网络和程序设计技术的发展,木马制作技术也在飞速发展,使其攻击性破坏性更加强大。特别地,由于内核Rootkit技术在隐藏对抗方面的优势,木马技术与Rootkit技术相结合以提高木马的隐藏能力和抗查杀能力已经成为了木马发展的新潮流,这对木马检测和分析工作也带了巨大的挑战。本文以开者角度深入剖析了木马功模块运行原理,并进行了详细设计。只有完整了解木马的运行原理和设计过程,才能准确地通过痕迹检测到木马,才能完整、正确地分析木马的功能和运行过程。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。作者不鼓励或支持任何形式的非法行为。