本文是基于Bvp47技术报告(PDF)和
Linux
内核写的。这篇主要是讲述如何捕获
Bvp47
本来还想继续写它的隐身技术,因为它还hook
了一堆内核函数,集中在内存,分区,句柄操作,设备和SELinux
。不过由于本人对Linux
内核所知甚少,没有参透它的场景,怕献丑。
题外话:在调研过程中,发现
SELinux
的核心贡献者就是美国NSA
。
按照前面的分析,Bvp47
非常强大,完全在文件,进程,网络(主机侧和网络侧)都隐身了。那么,有没有办法检测到它呢?
其实,个人对
Bvp47
的隐身功能并不满意。 它完全可以采用“借尸还魂”或“夺舍”的方式来隐藏自身,就是一个正常的进程名称出现,端口也是。 相关的技术,可以参考一下这位字节大佬的gayhub
地址:https://github.com/Hackerl 或https://github.com/milabs/awesome-linux-rootkits
Bvp47
是一个通过网络传播的后门,而且有文件存在,又在内核函数里挂钩。那么,说明它有可能以驱动形式加载进内核。而系统调用init_module
就是把驱动加载到内核的。
从目前开源的HIDS
来看,字节跳动的ElkEid
是用kprobe
方式挂钩了系统调用init_module
在内核对应的函数中。所以,它应该能够检测到Bvp47
加载驱动的事件。有兴趣的可以看我写的最后防线:字节跳动HIDS分析
而eBPF
也可以通过kprobe
的方式挂钩同样的函数,所以,像美团,阿里的HIDS
也能够检测Bvp47
加载驱动的事件。
由于audit
框架也可以配置对init_module
监控的策略,所以,像青藤云之类采用audit
框架的HIDS
也应该能够检测到这个事件。
上面这些HIDS
应该能够根据这些事件捕获到Bvp47
有哪些文件。但在已经注入的机器上,运行状态是不可能拿到样本的。
即使Bvp47
需要在网络侧很难检测到它的端口,但它的节点之间交流信息,是会产生流量的,通过嗅探网络是可以获取到它的流量。而根据它的分析报告,可以看到它是从DMZ
的防火墙捕获到的异常流量捕获它的踪迹,从而定位到它所在的主机。在大多数企业,生产网络是严格外连,所以,它的远端地址应该不在白名单内,从而被发现。
那么,好,已经定位了主机,怎么捕获它的样本?再把问题困难一点,如果主机没有装上述的HIDS
呢?
以下内容全凭本人经验来推断,如有不当,请指正。
作为一名背锅侠来说,如果这些主机已经在运行业务,那么应该和运维人员把业务迁移到其它主机上,再把机器从网络中断开。
然后,扫描整个文件系统,把文件系统的文件和目录做一个列表,作为基线。
这是在没有安装上述 HIDS
的情况下很多公司运维人员都有系统镜像,这一步甚至可以省掉。
对机器关机断电,取出硬盘,挂载到一台机器,机器最好用LiveCD
启动。
如果想进一步安全起见,最好是参照
Linux From Scatch
项目,自己做一个Linux
系统,再做成LiveCD
。
机器启动后,把硬盘分区以noexec
的标志挂载上去。
对该分区扫描,把文件和目录做一个列表。
拿新列表和基线对比,多出的文件,就可能是Bvp47
了。
因为在这种情况下,磁盘里的
Bvp47
是没办法隐形的。
对于VMware
, VirtualBox
之类的情况,也可以通过这种方式来捕获它的样本。
至于云方面,本人没怎么操作过镜像这一块,不敢妄言。
原文始发于微信公众号(debugeeker):美国NSA超级后门Bvp47的隐身技能:如何捕捉它
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论