一种基于嗅探的UDP后门[附源码]

设计思路:
监听34249端口传入的流量并寻找带有特征的数据包。当数据包的特征被匹配的时候,程序会执行这个其中包含的加密的指令。所有的UDP通信数据。如果某 一个数据包中的源端口和port_from_data()返回的端口一致,那么这个数据包的内容将被解密,将其中的指令传入system()调用执行。
后门程序需要在root权限下运行,这样才拥有足够的权限利用libcap来监听网络通讯。

进程名称:
为了隐藏进程不被好事的管理员发现,要做的第一件事就是伪装进程名称。这里用到了一个linux守护进程,不过是放在和通常目录不同的目录下。我用的目录 是/usr/libexec/udevd,而这个守护进程通常是放在/sbin/udevd下的。这样做的是为了用一个看起来不显眼的名称或者说相似的名 称,达到不引起管理员怀疑的目的。

抓包大小:
当创建了一个包抓取会话,设置了个选项可以限制每次抓的包中的数据量。Tcpdump显示系统内核会在通讯流量过大或者系统运行缓慢的时候丢弃数据包,这 样会导致部分数据丢失。限制抓包的大小可以减少丢包数量,所以通常把抓包的大小设置为在包头可以读取的最小数量和最大的命令消息大小之间。

加密:
加密方式用的是叫做XTEA的分组密码。这是一个轻量级的解决方案但是是相当可靠的。XTEA用的是对称加密密钥,这很关键因为我要避免密钥交换。
密钥被保存在后门程序的代码中。为了使密钥不容易在代码中被查出来,用的mangled格式(添加多余字符并使用乱序保存)保存密钥。每次用到密钥的时 候,用一定的算法从密钥常量中提取出正确的密钥。当密钥使用完毕后,会调用memset函数把存储密钥的数组清空,保证在内存里不留下密钥痕迹。

 

状态转换图

伪代码

主函数

  • 改变进程名称
  • 创建pcap包抓取会话,使用过滤器“udp dst port 34249”
  • pacp抓取循环

捕获的数据包

  • 检查传输端口的协议同时调用相关的处理函数(TCP和ICMP协议在这里会被忽略掉)

处理TCP/ICMP数据包

  •      忽略不处理

处理UDP数据包

  •      如果数据包中的源地址端口和port_from_date函数返回的端口不一致就丢弃
  •      从IP包中的ID字段获取包中消息的长度
  •      解密消息获得命令
  •      在命令末尾追加”&> /dev/null”防止命令执行的结果在屏幕上显示
  •      调用system()函数执行解密过的命令

说明&测试

编译:

有两个源程序需要被编译下:

  1. udevd:这是嗅探器程序
  2. client_until:用来给后门程序发测试数据包的

为了做示例证明,这个后门程序用了make debug模式编译,通常的程序在普通编译模式下是不会有输出的。完成编译后,运行还需要执行两条命令,chown root和chmod +s。

编译

(提醒下:上面的截图中的后门程序被编译为backdoor而不是udevd。)

client_until程序被编译为make client_until。

 

运行程序

首先运行backdoor这个程序,然后用root权限运行测试脚本。脚本需要加两个参数才能运行,一个是目的IP另一个是要执行的命令。

测试脚本

当测试脚本把数据包发出去后,你就可以看到命令被后门程序准确的执行了。

命令执行

最后,用ps或者htop命令确认进程名称是不是被更改了。

附加测试

为了证明后门程序是否根据特征来识别数据包,我发送了一些来自不同源端口或者目的端口的数据包来做了测试。同时用许多包含不同的长度的指令的数据包来确认加密解密模块都正常工作。还有,那些超过设定范围的命令都准确的被后门程序丢弃了。

 

不足之处

在目前实现的后门程序中有一些弱点:

  • 只要简单的重启机器这个程序就失效了
  • 即使在后台的情况下运行这个程序,它仍然在进程列表中出现一个关联的TTY进程
  • 机敏的管理员会发现这个进程名称不属于任何程序

当然,这些问题的有个简单的解决办法,那就是把程序写成一个守护进程。要成为一个有效的后门,最好的办法就是修改已存在的守护进程,在其中添加我们的功能代码。时间关系就不继续写了,已经满足了我的要求。如果有兴趣的同学可以带着源码继续写。

源码下载:backdoor

日币奖励:

本文为原创译文、首发,根据本站积分规则给予日币奖励共4枚。

AD:本站开放投稿及积分(日币),日币可兑换实物奖励,每月top3可获得礼品一份。