木马通信的隐蔽技术

时间:2022-10-01 02:21:13

木马通信的隐蔽技术

摘要:服务器和客户机如何通信是木马研究的一个核心技术,该文讲述了如何利用网络协议躲避了防火墙和系统工具的检查,成功实现了木马的隐蔽通信,给出的源代码均调试通过。

关键词:木马通信;隐藏通信

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)35-2481-03

Covert Technologies on Communications of Trojan Horse

ZHANG Chun-cheng, LU Gang, FENG Yuan

(PLA Artillery Academy Computer Center,Hefei 230031,China)

Abstracr:The communications between server and client is a kernel technology to research Trojan.This paper describes how to hide out inspect of firewall and system tools through network protocol, and successful implement on covert communications of Trojan. These sound codes are all debugged and passed.

Key words:communications of trojan horse;covert communications

1 引言

木马通常需要利用一定的通信方式进行信息交流(如接收控制者的指令、向控制端传递信息等)。系统和应用程序一般采用 TCP/UDP 通信端口的形式与控制端进行通信。木马一般也是利用 TCP/UDP 端口与控制端进行通信。通常情况下,木马进行通信时直接打开一个或几个属于自己的 TCP/UDP 端口。早期的木马在系统中运行后都是打开固定的端口,后来的木马在植入时可随机设定通信时打开的端口,具有了一定的随机性。可是通过端口扫描很容易发现这些可疑的通信端口。事实上,目前的许多木马检测软件正是通过扫描本地和远程主机系统中打开的已知木马端口进行木马检测的。木马通信端口成为暴露木马形踪一个很不安全的因素。为此采用新技术的木马对其通信形式进行了隐蔽和变通,使其很难被端口扫描发现。

2 木马通信形式的隐蔽技术

木马为隐蔽通信形式所采用的手段有:端口寄生、反弹端口、潜伏技术,嗅探技术。

2.1 端口寄生

端口寄生指木马寄生在系统中一个已经打开的通信端口,如 TCP 80 端口,木马平时只是监听此端口,遇到特殊的指令才进行解释执行。此时木马实际上是寄生在系统中已有的系统服务和应用程序之上的,因此,在扫描或查看系统中通信端口时是不会发现异常的。在 Windows 9X 系统中进行此类操作相对比较简单,但是在 Windows NT/2K 系统中实现端口寄生相对比较麻烦。在控制端与木马进行通信时,如木马所在目标系统有防火墙的保护,控制端向木马发起主动连接就有可能被过滤掉。

2.2 反弹端口

反弹端口就是木马针对防火墙所采用的技术[1]。防火墙对于向内的链接进行非常严格的过滤,对于向外的连接比较信任。与一般的木马相反,反弹端口木马使用主动端口,控制端使用被动端口。木马定时监测控制端的存在,发现控制端上线,立即主动连接控制端打开的被动端口。为了隐蔽起见,控制端的被动端口一般开在 TCP80。这样,即使用户使用端口扫描软件检查自己的端口,发现的也是类似 TCP USERIP:1026 CONTROLLERIP:80 ESTABLISHED 这种情况,用户可能误认为是自己在浏览网页。这种反弹端口的木马常常会采用固定 IP 的第三方存储空间来进行控制端 IP 地址的传递。

下面的代码演示了被控制端的客户套接字连接控制端的服务套接字。

CServerSocket *pMy; //CServerSocket是CAsyncSocket的派生类

……

//初始化是开始连接,同时建立定时器

BOOL CServiceDlg::OnInitDialog()

{

CDialog::OnInitDialog();

pMy=NULL;

SetTimer(199,30000,NULL);

pMy=new MySock;

pMy->Create();

pMy->Connect(m_ip,80); //连接目标的80端口,让人感觉在上网

}

//在定时器中检查是否有连接,否则试图重新连接

Void CServiceDlg::OnTimer(UINT nIDEvent)

{

If(nIDEvent=199){

If(pMy->Send(“test”,4)=SOCKET_ERROR){

pMy->Detach();

delete pMy;

pMy=NULL;

pMy=new MySock;

pMy->Create();

pMy->Connect(m_ip,80);

}

}

CDialog::OnTimer(nIDEvent);

}

2.3 潜伏技术

ICMP(互联网控制报文协议)是 IP 协议的附属协议,用来传递差错报文以及其他需要注意的消息报文。它是由内核或进程直接处理而不会打开通信端口。采用潜伏技术进行通信的木马一般都是使用 ICMP协议。由于不利用 TCP/UDP 协议,不会打开通信端口,所以不会被一些端口扫描软件和利用端口进行木马防范的软件检测到[2]。通常情况下,木马利用 ICMP 报文与控制端进行通信时将自己伪装成一个 Ping 的进程,这样系统就会将 ICMP_ECHOREPLY(Ping 的回包)的监听、处理权交给木马进程,一旦事先约定好的 ICMP_ECHOREPLY 包出现(可以判断包大小、ICMP_SEQ 等特征,这此包实为控制端发给木马的命令和数据),木马就会接受、分析并从报文中解码出命令和数据尽而采取相应的操作。

有的采用潜伏技术的木马不会完全采用 ICMP 协议进行通信,它们只是监听 ICMP 报文,当出现特殊的报文时,例如特殊大小的包,特殊的报文结构等,它会打开 TCP 端口等待控制端的连接。在本地可以看到状态为 ESTABLISHED 的木马连接(如果端口的最大连接数设为 1,在远程用 CONNECT 方法进行端口扫描时没有办法发现)。一个严格采用潜伏技术的木马会严格地使用 ICMP 协议来进行数据和控制命令的传递(数据放在 ICMP 的报文中)。

木马利用 ICMP 协议与控制端进行通信的基本过程如下:

为了实现发送/监听 ICMP 报文,都要首先建立 SOCK_RAW(原始套接口)。建立 SOCK_RAW 之前需要定义一个 IP 首部,然后定义一个 ICMP 首部:

typedef struct _ihdr {

BYTE i_type; //8 位类型

BYTE i_code; //8 位代码

USHORT i_cksum; //16 位校验和

USHORT i_id; //识别号(一般用进程号作为识别号)

USHORT i_seq; //报文序列号

ULONG timestamp; //时间戳

}IcmpHeader;

这时可以通过 WSASocket 建立一个原始套接口

SockRaw=WSASocket(

AF_INET, //协议族

SOCK_RAW, //协议类型,SOCK_R

IPPROTO_ICMP, //协议,IPPROT

NULL, //WSAPROTOCOL_INFO 置空

0, //保留字,永远置为 0

WSA_FLAG_OVERLAPPED //标志位

);

随后使用 fill_icmp_data 子程序填充 ICMP 报文段,调用 CheckSum 子程序计算 ICMP 校验和。然后通过 sendto 函数发送 ICMP_ECHOREPLY 报文:

sendto(sockRaw,icmp_data,datasize,0,(structsockaddr*)&dest,sizeof(dest));

木马控制端监听程序的基本操作与木马端相同,只是需要使用 recvfrm 函数接收ICMP_ECHOREPLY 报文并用 decoder 函数将接收来的报文解码为数据和命令:

recv_icmp=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);

decode_resp(recvbuf,recv_icmp,&from);

对于严格采用 ICMP 协议通信的木马,除非过滤分析网络链路层的信息或者监视 Windows 系统的 Socket API 调用,否则是很难发现其行踪的。

2.4 嗅探技术

2.4.1 共享环境下嗅探技术原理

嗅探技术即 sniffer 技术,指在网络上监听数据报文的方法[3]。一般来说,sniffer 技术应用环境为共享式以太网(Hub-based Ethernet)。在以太网中,所有的通讯都是广播的,通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据。在实际系统中,数据的收发是由网卡来完成。当收到网络上传输来的数据时,首先由网卡对数据帧的目的 MAC 地址进行检查,如果目的 MAC 地址与本地的 MAC 地址相匹配,则认为应接收该数据并产生相应的中断信号通知 CPU,如果不匹配,则直接丢弃该数据帧,本地计算机将根本不知道有数据帧的到来。网卡一般有如下 4 种接收模式:

1) 广播方式,网卡能够接收网络中的广播信息。

2) 组播方式,网卡能够接收组播数据。

3) 直接方式,只有目的网卡才能接收该数据。

4) 混杂模式,网卡能够接收一切通过的数据。

由于所有的物理信号都能被连接在该网络上的计算机所接收,因此可以通过混杂模式(promiscuous mode)方式使网卡能够接收到一切通过它的数据,而不管实际上数据的目的地址是不是计算机。

2.4.2 Sniffer 技术的实现

假定攻击者事先知道被攻击主机所在网段的 IP 地址范围,因此黑客可以构造IP 报文,其目的地址为局域网内某台主机的地址(可以随便设定),源地址也可以随意设定,然后向此局域网内发送报文。被攻击主机中的木马程序使用 sniffer 技术监听网络数据报文,并且依据攻击者事先设定的通信协议来辨别和提取黑客的数据报文。

实现时利用了 WinSock 2 的特性,可以不使用驱动程序,因此程序核心部分代码如下。首先打开一个 socket,参数必须是 AF_INET、SOCK_RAW 和 IPP不能设置 SIO_RCVALL 属性:

m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;

然后设置该 socket 的超时参数等选项:

int rcvtimeo = 4000 ;

if( setsockopt( m_s,SOL_SOCKET,SO_RCVTIMEO, (const cha

sizeof(rcvtimeo))==SOCKET_ERROR)

{

//错误处理代码

};

再将该 socket 与本机的某个网络接口绑定。

接下来就可以设置 SIO_RCVALL 属性。

if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCVALL , &dwBuffer

sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen), &dwBytesRe

NULL ) )

{

// 错误处理代码

};

……

此后就可以利用这个 socket(m_s)来读取网络上的数据包了。

3 结束语

该文重点研究了木马系统中涉及到的隐蔽通信技术及实现。由于防火墙技术的不断改进和系统对网络协议漏洞的定期修补,木马的通信技术将会变得更为复杂和接近底层。

参考文献:

[1] 朱明,徐蓦,刘春明.木马病毒分析及其检测方法研究[J]计算机工程与应用,2003(28):176-179.

[2] 赵树升.计算机病毒分析与防治简明教程[M].北京:清华大学,2007.

[3] 胡勇.网络嗅探器及安全对策[J].现代电子技术,1999(4):5-6.

上一篇:无线Mesh模式下时延碰撞问题的研究 下一篇:嵌入式车载远程监控系统