0×00 前言
在讲文章主题之前,我们还是习惯性地聊(che)一(che)聊(dan)。
远程控制木马大家都不陌生,尤其是早期接触黑客技术的人,应该可以发现早在2007-2009年,这段时间内,国内的“黑客技术”正是蓬勃发展的时期,那个时候,可谓是“战乱纷争,万马奔腾”的年代,当时流行各种黑客技术,其中就包括远程控制技术。
各种远程控制木马满天飞,无论是最早葛军编写的“灰鸽子”,还是各种后起之秀的RAT,简直不胜枚举,各种被阉割的xxx专用版,各种新出的xxxRAT。如各类国产远控木马、上兴、PCShare、黑防的ByShell、黑洞、冰河、SRAT、暗组的DRAT、XRAT、维度等等,包括国外的一些C/S,B/S型的远控木马也传入了国内,各家似乎都在比拼谁的功能多,谁的免杀好,谁的反杀软技术强。于是,各种HOOK SSDT,Rootkit级别的木马比比皆是。可是,后来因为国家的管控,各种黑客论坛,黑客网站,黑客杂志相继关闭或消失。远控木马编写技术和木马免杀技术也不再那么流行,当初写木马做免杀的“高手”,如今早已从网络中销声匿迹。
引用王家卫导演的《一代宗师》里边的一句话——
“有的成了里子,有的成了面子,都是时势使然。”
当然,客观的讲,造成这种形势的原因也是国内安全行业的进一步发展所致。不过,我相信依旧有一帮人还在这个领域埋头探索,在努力,木马依旧可以绕过各种杀软。毕竟,“攻永远超前于防”。
0×01 传统木马上线方式概述
好了,聊(che)完了。该进入文章主题了。今天,不谈别的,只“浅谈”木马上线技术的发展。
最早的远控木马都是“主动连接”,通俗的讲是这样的:假如你要控制某人的主机A,你得在主机A上执行木马, 木马执行后会开启一个你提前配置好的端口,之后,你要与该主机A建立连接,在主控端上输入该主机A的IP和端口,才能进行控制。
不过,后来因为互联网的进一步发展,公网控制内网就出现了一定的问题。于是,“被动连接”型的木马上线技术就出现了,和“主动连接”的形式刚好相反,是木马即被控端主动来连接主控端。主控端开启一个端口,被控端去连接你配置好的IP地址。
“被动连接”也叫“反弹连接”。谈到这个不得不提两种经典的木马上线方式。一种就是FTP上线方式,另外一种就是DNS域名解析上线方式。
灰鸽子FTP上线方式如下图:
在你的FTP服务器上写入一个ip.txt,内容就是你的主控端监听的IP地址和端口。当你的IP地址改变之后,你只需要再次更新这个ip.txt的内容即可。
在配置木马的时候,只需要按照FTP上线方式的格式配置上线地址。
如下图:
对于DNS域名解析上线,一直是木马上线的最主要的方式,曾经最流行的就是3322和花生壳。木马执行后会解析你配置好的域名,然后去连接对应的IP地址的端口,进行通信。
0×02 新型木马上线方式
从大量的APT攻击案例中可以发现,当今的木马在运行的隐蔽性,通信的穿透性,功能的多样性,跨平台性等方面有了很大的突破。
在研究分析过程中,有部分木马的上线方式,开始采用第三方域名进行通信。这无疑增强了木马的隐蔽性和反追踪能力。
上线方式的说明,请看下图:
这种木马使用的第三方域名实际上是利用第三方网站能够写入并及时修改自己的通信数据。木马编写者往往会寻找知名的网站,至少不会出现宕机的情况,以保持肉鸡的持久性控制。这样的网站很多,比如说博客类网站等等。可以提前发表一篇博文,并在博文里插入控制命令,之后特制的木马,就会去获取控制命令,同时木马也可以模拟编辑博文,写入执行结果的数据。
由于TCP通信涉及到socket对象的问题,部分木马会专门使用支持php的第三方网站。并拿到webshell后,上传一个进行数据转发的php文件。这种情况下,控制被控端的流畅度可以得到保证。
而一般情况下,采用这种方式的木马都是使用了HTTP协议进行通信,由于HTTP协议是无连接的。所以不会涉及到socket对象的问题。只要被控端为自己生成一个独一无二的ID,即可与其他被控端区别开来。只要在编写代码的时候,对接受数据,发送数据,执行控制命令这三个功能模块做好处理,控制的流畅度还是可以得到一定的提升。
采用第三方域名上线的木马,在隐蔽性方面有了很大突破,而且这种做法,也可以提高木马的穿透性,对于一些防火墙来说,至少知名的网站总归是允许进行数据通信的。#p#
0×03 第三方域名上线方式的实现思路
先把思路搞清楚。木马上线采用的第三方网站为"博客园",注册两个帐号,一个为主控端用于发出控制命令所使用的账号A,另一个是被控端发送本机信息以及控制命令执行结果所使用的账号B。用账号A创建两篇文章,一篇为木马上线测试(下文简称文章A),一篇为木马功能测试(下文简称文章B)。
被控端处理上线事务的线程设计思路如下:
上线信息的格式:
[主机名称]&[当前时间]&[主机唯一ID]
对于[主机唯一ID],如果是第一次上线会生成此ID,如果不是则会读取已经生成好的ID。
主控端处理主机上线事务的线程设计思路如下:
由于这种上线方式采用的实际上是HTTP协议通信的,所以无法像TCP通信一样,存在相关的SOCKET事件。所以,主控端还需要有一个处理主机是否在线的线程,设计思路如下:
另外,为了防止文章A的评论区有很多评论,主控端在获取完评论信息(主机上线信息),之后,添加一个删除文章A的评论的线程即可。
0×04 第三方域名上线方式的简单代码实现
接下来,我们用简单的代码实现这个demo。为了快速实现这种木马上线方式,主控端采用C# WinForm实现,客户端采用Python实现。搞清楚了设计思路,用什么编程语言去实现就是次要的事情了。
下面是被控端启动后,向文章A提交评论(上线信息)的截图:
发送上线信息后,文章A的评论截图如下:
主控端的截图如下:
功能测试的通信流程和上线测试的流程思路是相似的。在这里就不在赘述,这种上线方式虽然采用了HTTP协议通信但是和直接使用封装的HTTP协议或者是浏览器访问,是有一定的区别的。它无法进行大批量的数据传输,像文件传输这样的功能虽然也可以实现,但是"用户体验"很差,所以这种上线方式的木马,大多被用来当作一个隐蔽的后门木马,只需要有一个文件下载和CMD Shell的功能。
0×05 总结
采用第三方域名上线方式的木马设计思路,已经很明确了,但是在实际实现的过程中还存在一些不足。包括上文中用code去实现,也有很多处理事务线程和上线性能等方面需要进一步改进。所以代码在此就不提供了。大家了解了这种思路就好。另外,对于将账号B的登录信息写入客户端,是否存在一定风险?对于这个问题,大可不必细究。
“博客园”的登录信息会被登录页面的js使用key进行加密然后提交,即使你分析出了登录信息也是加密过的,并非原始明文密码。另外,登录成功后,会有一个session或者cookie,可以直接拿来当作发表评论(主机上线信息)的令牌使用。也可以将cookie的生命周期加长,延长控制时间。
文章中还有很多"易喷点",欢迎来"喷"。
0×06一点题外话
对于木马上线域名的分析和追踪,在这篇文章《浅谈从反木马角度分析怎样提高木马反跟踪能力》中作者提出了在木马上线方式的时候使用UDP+TCP协议的方法来迷惑安全研究人员。实际上,这种办法起不到任何作用。因为,要分析木马的上线域名,最直接最有效的办法就是用wireshark抓包,过滤出dns协议的数据包,很快就能分析出来。
即使你在编写木马的时候,并未对上线地址采用“硬编码”,或者使用动态数组动态生成,又或者你进行了各种加密,又或者直接写入内存等“软编码”手段,这些只能对木马上线地址的静态分析起到一定的保护作用,如果去动态调试跟踪,也是可以得到上线地址的。
对于使用域名生成算法(DGA)生成的域名,目前已经有相应的机器学习的手段去检测是否为木马的C&C域名。不过目前看起来,目前对于木马上线地址的隐藏,最好的办法就是使用第三方域名,这样可以极好的保护木马操纵者。