任何时候都不要放弃,就算时钟停了,也还有两个时刻是准确的. 收藏本站
登陆 / 注册 搜索

阅读:1399   回复: 1

木马如何隐藏通讯方式的?

[复制链接]
左手天才 「龙战于野」 2022-9-16 12:00 |显示全部楼层

你以为大家都知道的事情,很可能有 99% 的人都不知道。

文/清风笑

木马的客户端与服务端的通讯必须可靠且不易为宿主发现,这个过程实现的好坏与否,直接关系着木马的隐蔽性和可靠性。为此,木马开发者们绞尽脑汁,想出种种办法来迷惑我们,而作为普通用户的我们更有必要了解木马的这些隐蔽通讯方式,以便在查杀木马时做到有的放矢,找准切入点。下面是我所知道的木马客户端与服务端隐蔽通讯的种种方法,与大家交流。

木马如何隐藏通讯方式的? Trojan horse.jpg

👌🚘🥛🅱🦜‎


首先应该明确的是,受害者的机器上运行的木马程序我们称之为服务端,控制者机器上运行的我们称之为客户端(其实对于现代的木马,已经很难说谁是客户,谁是服务了,不过我们还是继续用这种叫法)。

一、基本概念

🙏🎠🍧♻🦌‍

木马程序的服务器端,为了避免被发现,多数都要进行隐藏处理,下面让我们来看看木马是如何实现隐藏的。首先我们先来了解3个相关的概念:进程线程服务

关于这3个概念简单解释如下:

进程:所谓进程就是应用程序的执行实例(或称是一个执行程序)。一个正常的Windows应用程序运行之后,都会在系统之中产生一个进程。同时,每个进程分别对应一个不同的PID(Progress ID,进程标识符),这个进程会被系统分配一个虚拟的内存空间地址段,一切相关的程序操作,都会在这个虚拟的空间中进行。进程与我们经常说到的程序是有着本质的区别。进程是程序动态的描述,而程序是静态的描述。
👈💈🍏🈚🐖‎
举个例子,从网上下载一个.exe文件到硬盘上,那个.exe文件就叫做程序,这是一个二进制码的文件。一旦双击了exe文件图标运行程序,那个正在运行着的exe文件则称为进程,它在双击的那一刻被系统创建,当你关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终在你的硬盘上,不管你的机器是否启动。

线程:线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一堆栈。一个进程,可以存在一个或多个线程,线程之间同步执行多种操作;一般说来,线程之间是相互独立的,当一个线程发生错误的时候,并不一定会导致整个进程的崩溃。
👨‍🎨‌🧥🛏😈🤟
服务:一个进程当以服务的方式工作的时候,它将会在后台工作,不会出现在任务列表中。但是,在Windows里面,你仍然可以通过服务管理器检查任何的服务程序是否被启动运行。想要隐藏木马的服务器端,可以伪隐藏,也可以是真隐藏。伪隐藏,就是指程序的进程仍然存在,只不过是让它消失在进程列表里。真隐藏则是让程序彻底消失,不以一个进程或者服务的方式工作。伪隐藏的方法是比较容易实现的,只要把木马服务器端的程序注册为一个服务就可以了。

这样,程序就会从任务列表中消失了,因为系统不认为它是一个进程,当按下Ctrl+Alt+Delete的时候,也就看不到这个程序。但是通过任务管理器,一样会发现你在系统中注册过的服务。

那还有其他方法吗?当然还有办法,那就是API的拦截技术,通过建立一个后台的系统钩子,拦截PSAPI的EnumProcessModules等相关的函数来实现对进程和服务的遍历调用的控制,当检测到进程ID(PID)为木马程序的服务器端进程的时候直接跳过,这样就实现了进程的隐藏。金山词霸等软件,就是使用了类似的方法,拦截了TextOutA,TextOutW函数,来截获屏幕输出,实现即时翻译的。同样,这种方法也可以用在进程隐藏上。
👏🚠🥭♑🐮‍
当进程为真隐藏的时候,那么,这个木马的服务器部分程序运行之后,就不应该具备一般进程,也不应该具备服务,也就是说,完全融进了系统的内核。也许你会觉得奇怪,刚刚不是说一个应用程序运行之后,一定会产生一个进程吗?的确,所以我们可以不把它做成一个应用程序,而把它做为一个线程,一个其他应用程序的线程,把自身注入其他应用程序的地址空间。而这个应用程序对于系统来说,是一个绝对安全的程序,这样,就达到了彻底隐藏的效果,导致了查杀黑客程序难度的增加。

二、具体方法

👍⛴🆒🦦‎下面是木马客户端与服务端经常采用的隐藏通讯方法:

1.使用TCP协议,服务端侦听,客户端连接 这是最简单、最早、最广泛使用的一种通讯方案。使用过冰河或者被冰河客户端扫过的用户对此一定不会陌生。这种通讯方案是服务端在宿主机器上开一个TCP端口,然后等待客户端的连接,在通过对客户端的认证后,客户端就可以控制服务端了。采用这种方法通常是利用Winsock与目标机的指定端口建立起连接,使用send和recv等API进行数据的传递。

由于是建立在TCP协议基础上,所以通讯的可靠性是得到保证的,但是通讯的安全性却很成问题。由于这种方法的隐蔽性比较差,往往容易被一些工具软件查看到,最简单的,比如在命令行状态下使用netstat命令,就可以查看到当前的活动TCP,UDP连接。另外,使用像Fport,Tcpview Pro这样的工具可以很容易的发现在某一端口上侦听的进程以及进程对应的可执行文件。最后一个问题:在安装了防火墙的机器上,当客户端连接到服务端时,很容易引起防火墙报警。
👆🚈🔪🈳🐴‏
尽管存在这么多的问题,黑客们还是对此方法趋之若鹫。因为采用该方法编制木马程序实在是太简单了,而且还可以采用种种手段躲避这种侦察。就我所知的方法大概有两种。一种是合并端口法。也就是说,使用特殊的手段,在一个端口上同时绑定两个TCP或者UDP连接。这听起来不可思议,但事实上确实如此,而且已经出现了使用类似方法的程序,通过把自己的木马端口绑定于特定的服务端口之上(比如80端口的HTTP,谁怀疑他会是木马程序呢?),从而达到隐藏端口的目地。还有一种方法是使用ICMP(Internet Con-
trol Message Protocol)协议进行数据的发送,原理是修改ICMP头的构造,加入木马的控制字段。

这样的木马,具备很多新的特点,不占用端口的特点,使用户难以发觉。同时,使用ICMP可以穿透一些防火墙,从而增加了防范的难度。之所以具有这种特点,是因为ICMP不同于TCP,UDP,ICMP工作于网络的应用层不使用TCP协议。
👆🌧🍽🔞🐙‏
2.使用TCP协议,客户端侦听,服务端连接 这就是所谓的反向连接技术了。为了克服服务端在某一端口上侦听易被发现这一缺点,现在服务端不再侦听端口,而是去连接客户端在侦听的某一端口。这样用一般的Port Scanner或者Fport就很发现不了服务端了。而为了更好地麻痹宿主机,客户端侦听的端口一般是21,80,23这种任何人都要访问的端口。虽然在安装了防火墙的机器上,服务端去连接客户端还是要引起防火墙报警,但是一个粗心的用户很可能会忽略“应用程序xxxxx试图访问xxx.xxx.xxx.xxx通过端口80”这样的警告。

这种反向连接技术要解决的一个问题是,服务端如何找到客户端。由于一般客户端都是拨号上网的,没有一个固定的IP,所以客户端IP不可能硬编码在服务端程序中。当然,由于拨号上网用户的IP一般都是处于一个固定的IP地址范围内,服务端也可以扫描这个范围,然后根据被扫描主机的反馈来确定是否是自己的客户端,但是服务端扫描一个IP地址范围也太……另一个方法是客户端通过一个有固定IP或者固定域名的第三方发布自己的IP,实现的方法就很多了,比如通过一个公共的邮箱,通过一个个人主页,就看你有多大的想像力。
🧑‍💻‏🕶💊😄👄
3.使用UDP协议,服务端侦听,客户端连接;客户端侦听,服务端连接
方法和安全性与使用TCP协议差不多。需要注意的是UDP不是一个可靠的协议(QQ用的就是UDP协议,所以针对QQ的攻击方法和黑客软件才会那么多),所以,要想不被发现,黑客必须在UDP协议的基础上设计一个自己的可靠的报文传递协议,这就看其编程的功力如何了。

4.解决防火墙问题 无论是服务端被动侦听,还是服务端主动连接,在服务端和客户端试图建立连接时都会引起防火墙的报警。毕竟粗心的用户不会很多,所以,解决防火墙报警是服务端必须要解决的一个问题。一种方法是代码注入,服务端将自己注入到一个可以合法的与外界进行网络通讯的进程(比如IE,QQ,TELNTED,FTPD,IIS等)的地址空间中,然后可以一个新线程的形式运行,或者只是修改宿主进程,截获宿主进程的网络系统调用(WinSock)。后者的实现可能要麻烦一些。如果是以新线程的形式运行,那么,或者可以被动侦听,或者可以主动连接。

👴‎👠🪝😋👏


无论哪种情况都不会引起防火墙的报警(当然不是100%不会引起防火墙报警,否则就成为“金刚不坏之身”了,那怎么可能呢)。但要注意的是如果是被动侦听的话,比如寄生在IE内,用Fport会发现E在某一个端口侦听,这有可能会引起细心的用户的警觉。所以比较好的方法是在新线程内去主动连接客户端,而且连的是客户端的80端口;如果是寄生在OICQ内,可以连接客户端的8000端口。使用代码注入需要服务端具有若干特权,考虑到一般用户都是以Admin身份启动系统的,这应该不是一个问题(如果服务端是作为一个Service启动的话,就更没问题了)。

5.服务端主动连接时客户端IP的问题 使用第三方公布客户端IP不是一种可靠的方法。比如如果是通过一个个人主页发布客户端IP的话,一旦由于种种原因,这个个人主页被主页提供商取消的话,服务端就找不到客户端了。而这种个人主页被主页提供商取消的可能性是很大的。同时客户端也要冒暴露自己IP的风险。所以更好的方法是客户端通过某种方法主动告诉服务端自己的IP和端口,然后服务端来连接。这样可以保证最大的可靠性,安全性和灵活性。

服务端怎么收到客户端的通知呢?一种方法是我们截获其他进程收到的TCP数据或者UDP包,然后分析截获的数据,从中确定是否客户端发来了一个报告其IP的数据片断。另一种方法是使用RAW Socket来收听ECHO REPLY类型的ICMP包,在ICMP数据包的数据里就包含了客户端IP。而对于普通用户来说,由于要上网浏览,这样的ICMP包是很少过滤掉的。
🙌🌦🦀♂🪰‏
6.用ICMP来通讯 既然客户端可以通过发一个ICMP(ECHO REPLY)来告诉服务端它的IP,那为什么不把所有服务端和客户端的通讯都建立在ICMP(Internet Control Message Protocol)的基础上呢?服务端向客户端发ICMP(ECHOREQUEST),客户端向服务端发ICMP(ECHOREPLY),然后可以在ICMP基础上建立一个自己的可靠数据包通讯协议。如果不怕烦的话,还可以建立一个TCP over ICMP。由于一般的用户这两类ICMP包都是设为无警告放行的,因而隐秘性很强。

7.用自定义的协议来通讯
我们知道IP头的协议字段指定了这个IP包承载的数据的协议,比如TCP,UDP,ICMP等等。我们完全可以把这个字段设为我们自己定义的值(>80),定义自己的通讯协议。不过,估计这种IP包将会被所有的防火墙过滤掉。原理是如此,具体怎样做我就真的不知道了。🧓‎👜🎺😃👏

最后要说明一点,前面所说都是针对个人用户(大部分都是拨号用户,包括Modem,ADSL)的。对这类机器来说,一般都没有开什么服务,而且一般都使用了个人防火墙;同时,ICMP ECHO REPLY/REQUEST都是放行的,所有才有我们上述的各种方案。通讯隐藏技术只是木马隐藏诸多技术中的一部分,但也是最重要的一部分。因为它不但要保护木马,还要保护木马的控制者,所以不管是木马编写者,还是防火墙编写者,都应该对这一部分给于足够的重视。

上一篇
下一篇
帖子热度 1409 ℃
左手天才踩到狗屎,走了狗屎运,奖励2 个 金币.

东良小哥哥 「初入古黑」 2022-9-16 12:04 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~


好帖
🖕🏦🍏‼🐂‏很好帖
确实好帖
少见的好帖
真TM好帖
难得一见的好帖 👴‍🩴🧹🥱✊
千年等一回的好帖
好得不能再好的好帖
惊天地且泣鬼神的好帖
让人阅毕击掌三叹的好帖
让人佩服得五体投地的好帖
👂🌞🔪🚷‍让人奔走相告曰须阅读的好帖
让斑竹看后决定加精固顶的好帖
让人看后在各论坛纷纷转贴的好帖
让人看后连成人网站都没兴趣的好帖
让人看完后就要往上顶往死里顶的好帖
🤛🌞🍚❗🐅‎让人看后不断在各种场合重复引用的好帖
让人一见面就问你看过某某好帖没有的好帖
让人半夜上厕所都要打开电脑再看一遍的好帖
让个读过后都下载在硬盘里详细研究欣赏的好帖
让人走路吃饭睡觉干什么事连做梦都梦到它的好帖 🧑‍🌾‍🥾💰🥲👈
让人翻译成36种不同外语流传国内外世界各地的好帖
让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖
让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖
让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖
让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖
💪🏫🫑🪰‎让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖
让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表