Linux下针对rootkit木马的检测工具,可检测隐藏文件、隐藏端口以及隐藏进程。
需要root权限执行脚本,脚本会自动找到同目录下的atrk_aarch64、atrk_x86-64或atrk_x86-i686,并判断哪个适用当前系统。
sh-atrk.sh
简言之,在/proc/下,用多种方法盲猜pid,例如,在/proc/下,你ls看不到某个PID,但是通过以下几种方法测试发现似乎存在PID,那么就提示该PID是隐藏进程:
- kill -0 PID //表示不发送任何信号,仅检查进程是否存在。通过判断返回值可以知道存活状态,如果rootkit没有过滤这种访问方式,它就会暴露。
- 访问/proc/PID/fd //fd是文件描述符,每个进程都有的目录,或者用cmdline也可以,直接访问判断是否存在。如果rootkit只过滤/proc/目录下它的PID,没考虑你直接访问它的子路径,它就会暴露。
- 在/proc/下建立一个目录,如果ls时看不到,被创建时却被系统提示错误File exists,那它就暴露了。
- 在/proc/通过cd进去的方式,如果ls时看不到,却能cd进去,那它就暴露了。
- 等等
rootkit在底层通过过滤各种接口实现隐蔽,但我们在应用层通过暴力枚举pid并各种探测,乱拳打死老师傅。对于rootkit来说,它可能会感觉防不胜防,如果有个地方疏忽了,它就会暴露。
思路就是自己解析磁盘数据,常见的文件系统类型是ext和xfs。但是我们要尽可能是从底层设备去读取磁盘目录信息,在linux下,以典型的分区情况为例,例如磁盘/dev/sda下有几个分区分别是/dev/sda1 /dev/sda2等,如果要检查的目录是挂载在/dev/sda1分区上的,我们应该从/dev/sda去读取数据来解析目录信息,这样可靠性相对更高。
目前工具不是全盘目录检查,只是检测根目录下的一些关键目录,以及一些bin目录。
rootkit隐藏的手法如果还是基于hook的话,不管是在哪里hook过滤,都挡不住暴力探索端口的方法吧。
这里还是采用爆破的思路,毕竟端口号也就1-65535个,使用暴力bind端口从1-65535,可以非常快速的发现一批绑定失败的端口。然后再用常用的API获取系统本地端口信息,如果绑定失败的端口却不在正常获取的端口列表里面,则是可疑的。
针对TCP端口的,在linux下,可以使用非阻塞方法的socket编程,建议用epoll,比如每次异步并发100个socket去connect 127.0.0.1,然后epoll一并等待和处理结果,这样就可以把检测完6万多个端口的时间缩短到几秒。