如果发现Linux后门,基本上可以认为是服务器资产受损且失陷了。因为Linux服务器的份额确实比较大,而被针对且入侵的风险也会加大。
后门BC00C10454FEB0D5C832C53648EACB0C
由于后门文件不大,没有混淆与控制流平坦化或者加虚拟壳等反分析手段,因此比较简单。且是基于prism后门修改的,后门被工具反汇编后结构与逻辑比较清晰。笔者想尽可能详细地记录下,这样子也能增加一些Linux安全威胁方面的经验。
首先二进制模式打开"/var/run/sshd.lock"文件,并且查询是否被锁定,类似互斥量功能,修改SIGCHLD信号量设置为子进程结束,改变当前目录随后解码进程名。
由于后门没有去掉符号,因此可以发现使用了decode函数来解码进程名,于是学习下后门使用的编码算法ROT13,这块查询了一些资料发现应该属于密码学中常见算法。
ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码,ROT编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密。
ROT5:只对数字进行编码,用当前数字往后数的第5个数字替换当前数字。例:1——>6。ROT13:只对字母进行编码,用当前字母往后数的第13个字母替换当前字母,例:A——>N。ROT18:这是一个异类,它是将ROT5和ROT13组合在一起,例:1a——>6n。ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前或后数的第47位对应字符替换当前字符,例:0——>_ ,z——K。
后门decode函数反汇编结果具有一些明显的特征,对26取模且存在64与96的整数计算。
一对比Python实现的算法源码发现其实是相似的
rot13 算法 | 一颗多汁的柠檬
https://seamiloak.github.io/2021/01/16/rot13%E7%AE%97%E6%B3%95/
接着修改进程名,如果对Linux相关的威胁比较了解会发现很多Linux下的后门都有这种行为,之后利用fork创建子进程来完成以下操作。
sed -i '/z0gg.me/d' /etc/hosts
删除hosts文件内容里包含z0gg.me的行
if grep -q '^[n]ameserver 8.8.8.8' /etc/resolv.conf; then echo yes > /dev/null; else echo 'nameserver 8.8.8.8' >> /etc/resolv.conf; fi > /dev/null
将dns服务器地址8.8.8.8写入resolv.conf文件里
最后父进程进入创建反弹shell的函数,再次利用ROT13算法解密出回连的C2(z0gg.me),不过有三个地址,其中后两个作为备选地址。
备选地址:x63.in,如下。
备选地址:x47.in,如下。
DNS查询到C2真实的IP资产后,直接采用http请求方式只读取服务端返回的32个字节内容并对其计算md5哈希值,之后将计算得到的md5哈希值与本地内嵌的md5哈希值ef4a85e8fcba5b1dc95adaa256c5b482进行比较,相同就通过了校验才可以执行反弹shell,如果不同就不会执行回连C2。
prism后门源码如下,存在一定的相似。地址:https://github.com/andreafabrizi/prism/blob/master/prism.c。
当受害机器与服务端通过交互校验后,便会执行下面命令:echo -e \"[\x1B[32m+\x1B[0m]`/bin/hostname`\n[\x1B[32m+\x1B[0m]`/usr/bin/id`\n[\x1B[32m+\x1B[0m]`uname -r`\"。
解释echo -e \"[\x1B[32m+\x1B[0m]`/bin/hostname`\n[\x1B[32m+\x1B[0m]`/usr/bin/id`\n[\x1B[32m+\x1B[0m]`uname -r`\"命令如下:
上述奇怪的字符串属于标准输入的转义码,例如:
export const reset = "\x1b[0m"
export const green = "\x1b[32m"
参考来源地址:https://gist.github.com/abritinthebay/d80eb99b2726c83feb0d97eab95206c4
命令中反引号的使用是执行具体的命令,因此演示如下:
Ubuntu20.04直接执行效果如下:
CentOS7直接执行效果如下: