- ```html
命令扫描 凌晨三点,命令扫描屏幕上的命令扫描进度条卡在87%不动了。我盯着那个扫描器,命令扫描它正一行一行地吐着系统里的命令扫描可执行文件路径。`/usr/bin/`下面密密麻麻,命令扫描像蚂蚁搬家。命令扫描这不是命令扫描我第一次跑这种工具,但每次看到那些名字——`netcat`、命令扫描`nmap`、命令扫描`tcpdump`——心里都会咯噔一下。命令扫描它们太安静了,命令扫描安静得像一把把没上膛的命令扫描枪。
命令扫描这件事,命令扫描说白了就是命令扫描翻箱底。你系统里装了什么,命令扫描别人能拿它干什么,全在这份列表里。去年有个客户找我,说服务器被人种了挖矿程序,CPU跑满。我登上去先没看进程,直接扫了一遍`/tmp`和`/dev/shm`下的可执行文件。结果出来一个叫`kdevtmpfsi`的东西,名字伪装得像内核线程。这玩意儿在正常系统里根本不该有。你看,扫描不是目的,扫描是让你看见那些不该看见的东西。
很多人以为命令扫描就是敲个`ls`。差得远。你得考虑PATH环境变量、别名、shell函数,还有那些藏在`/usr/local/bin`里的自定义脚本。我见过一个案例,攻击者把恶意命令写成`.bashrc`里的一个函数,名字叫`ls`。你敲`ls`,它先执行后门,再调用真正的`ls`。你根本察觉不到。所以扫描的时候,我习惯用`type -a`而不是`which`,前者能把别名和函数都揪出来。`which`只认PATH,太天真了。
还有一个坑:动态链接库。命令本身干净,但它加载的`.so`文件可能被替换了。`ldd /bin/ls`看看它依赖什么。有一次我发现`libc.so.6`的修改时间不对,比系统安装时间还晚。查下去,果然被劫持了。`sshd`的密码记录全发到境外一个IP。这种事,你不扫根本不知道。扫了,还得会看时间戳和哈希值。`md5sum`或者`sha256sum`,跟官方仓库对一下。对不上,就有鬼。
但扫描不是万能的。我见过太多人扫完就完事,报告一扔,说“没发现异常”。异常这东西,有时候不是文件本身,而是行为。比如`curl`和`wget`,系统自带,合法。可如果你的Web服务器用户突然用`curl`去下载一个`.sh`文件然后`chmod +x`,这就不是正常操作。所以我现在更看重命令的调用链。`auditd`或者`eBPF`能帮你抓这些。光扫静态文件,等于只看了照片,没看录像。
说个具体的。`find / -perm -4000 -type f 2>/dev/null`。这行命令扫的是SUID文件。SUID是什么?就是让普通用户以文件所有者权限执行。如果`/bin/bash`被设了SUID,那任何用户都能拿到root shell。我每次扫完都会手动过一遍结果。`/usr/bin/passwd`有SUID,正常。`/usr/bin/sudo`有,正常。但要是`/home/user/backup`有,那就得问问了。谁放的?干什么用的?
工具方面,`Lynis`和`chkrootkit`我都用。但别迷信它们。`Lynis`会给你一堆建议,什么“考虑禁用USB存储”,跟你被入侵没直接关系。`chkrootkit`有时候会误报,把`/usr/bin/egrep`当成被感染。我的做法是:工具跑一遍,拿到线索,然后手动验证。比如它说某个文件被替换了,我就去`/var/lib/dpkg/info/`下面找对应的`.md5sums`文件,自己算一遍。信工具,不如信自己的眼睛。
最后说个习惯。我每台机器装好之后,第一件事就是跑一次全量命令扫描,把结果存成基线。`find / -type f -executable -exec sha256sum { } \; > baseline.txt`。以后每隔一周跑一次,`diff`一下。新出现的可执行文件,或者哈希变了的,重点看。这招帮我抓到过好几次 webshell。攻击者上传了一个`img.jpg`,其实是PHP脚本,但权限设成了可执行。基线里没有它,diff出来,一眼就看到了。
扫描不是一劳永逸的事。系统在变,攻击者在变,你的基线也得跟着更新。别指望一个脚本解决所有问题。你得知道每个命令是干什么的,为什么在那儿,谁改过它。这活儿细,但值得。毕竟,你扫的不是文件,是你系统的底牌。
``` 顶: 368踩: 43






评论专区