从协议上来讲使用了TCP、UDP、ICMP、HTTP/HTTPS、FTP和DNS等协议。
正向通信和反向通信
-
正向模式是木马被控端在宿主机器上开放一个端口,等待控制端来主动连接,对一些有公网地址的目标非常有效。
-
反向通信是被控端在启动后,主动和控制端连接通信的过程,这种方式不要求被控制机器有公网地址,但控制端需要有公网地址。
木马通信常用的协议
- 应用层:HTTP/HTTPS、FTP、SMTP、UDP、DNS
- 传输层:TCP、UDP
- 网络层:ICMP
- 数据链路层:自定义实现
基于TCP的木马控制通信
TCP协议是字节流式的传输协议,木马通信还需要自定义应用层的协议、对传输的数据和命令进行规范化、格式化。
粘包和分包
- 粘包:接收方接收数据时,可能一次接收到多个数据包的数据组成数据段,也可能收到一个或者几个完整的包与一个后续包的部分数据组成的数据段。
- 分包:接收方接收数据时,每次只能接收到某个数据包的一部分,经过多次接收,才能完整地接收到该协议数据包。
链接保活
TCP中有检测死链接的机制,Keeplive。
Keeplive机制是指,当链接双方没有数据交互的时间间隔超过预定限值时,TCP会发送一个数据为空的报文给对方。
如果主机可达,对方就会返回ACK应答,如果对方没有返回,就继续发送空报文直到超时,超时之后就会判定连接中断。
TCP连接的建立需要三次握手,而终止一个连接则需要四次握手。
基于UDP的木马控制通信
UDP是一个不可靠协议,但UDP的头部只有8字节,相比较TCP的20字节,开销要小。
UDP不建立连接,通过网络工具(如TcpView)查看的时候,只能看到UDP的本地端口,无法看到远程的接收地址和端口,能有效地隐藏目标地址,
基于HTTP/HTTPS的木马通信
HTTP响应包含三部分:第一行响应行,中间部分是首部行,最后是内容行。
HTTPS(HTTPoverSSL):HTTPS由HTTP和它下层的安全套结层组成,由HTTP协议进行通信,但利用SSL/TLS对数据包进行加密。
基于已有应用层协议,如HTTP/HTTPS等,将木马的控制命令和数据包包含在这些协议的内容部分,使得木马的通信与正常软件相比,不再具有明显的特征
边界防火墙穿透
在对网络限制严格的环境中,一般都通过防火墙限制用户的网络访问,用户只能通过代理服务器的代理功能,使用有限的网络服务。
代理功能有两类:
- 透明的网络代理功能,不需要用户进行任何设置
- 传统代理功能,需要客户端认证和进行配置,如HTTP代理等。
HTTP代理服务从认证方式上可以分为两大类:
-
匿名代理:匿名代理在用户连接、使用时,不需要提供身份信息进行认证。
-
认证代理:用户提供身份信息,采用规定的认证方式,如Basic、NTLM、Kerberos和RADIUS等。
在实际网络环境中,尤其是一些部署了ISA、TMG之类的防火墙后,Basic和NTLM经常作为HTTP代理的认证机制使用。
Forefront TMG穿透解析
木马通过获取代理的类型,根据代理的类型获取必要的认证信息,在此基础上实现代理所使用的协议,与代理服务器进行交互,进行认证后再进行木马自身的通信过程。
- 代理信息侦测
利用浏览器进程注入的方式获取代理信息。浏览器进程启动,注入木马的DLL。该DLL的功能是HOOK浏览器的发包函数,过滤其中的HTTP/HTTPS协议,查看HTTP请求中的头部信息。
- 域用户认证信息获取
参考mimikatz:
1、通过读取当前系统中的Explorer.exe进程中的TokenUser,得到当前系统的登录用户名。
2、通过Windows API的LsaEnumerateLogonSession获取当前系统的所有登录session。
3、LsaEnumerateLogonSession执行完成,LogonSessionCount是一个指向当前系统登录Session编号数组的指针。
4、通过当前登录用户名,从步骤2的结果中找到当前用户的SECURITY_LOGON_SESSION_DATA和session的编号。
5、在lsass.exe进程中查找Wdigest.dll模块,该模块中有一个LIST_ENTRY组织的双向链表,链表中每个节点以Unicode字符集存储了用户名、加密后的密码、域名等信息。
6、通过LsaUnprotectMemory函数对加密的密码进行解密,便可获取明文的密码,从而获取完整的用户信息。
参考
《木马核心技术剖析》