拿到一台被入侵的Ubuntu服务器的root权限时,第一反应往往是想直接重装系统。但在生产环境里,盲目重装会销毁所有入侵痕迹,让攻击者如何进来、做了什么、是否已经横向移动都变成无头悬案。正确的做法是先做内存和磁盘取证,再清理持久化后门,最后加固系统。以下流程假设你已经通过物理访问、带外管理或合法渠道获得了服务器的最高控制权。
内存取证:抓住正在运行的恶意进程攻击者可能还在服务器上跑着挖矿程序、反弹shell或者流量代理。直接执行ps aux或top查看进程并不安全,因为很多rootkit会替换系统命令。最可靠的做法是使用内存镜像工具。安装lime或者avml,这两个工具都能在内核层面提取内存快照。
# 安装avml(无需编译内核模块,适用性更广) wget https://github.com/microsoft/avml/releases/download/v0.11.0/avml chmod +x avml sudo ./avml /tmp/memory.dump
拿到memory.dump后,用volatility3在另一台安全的主机上分析。重点查隐藏进程、网络连接和注入的恶意代码。如果发现可疑进程名像[ kworker/0:0 ]但PID异常大,或者进程路径指向/tmp、/dev/shm,基本可以确定是恶意程序。不要急着kill,先记录下PID、执行路径、外联IP和端口,这些信息后续要用来排查横向移动的痕迹。
磁盘取证:从文件系统里挖出攻击链攻击者落地后通常会做三件事:留下webshell、写入计划任务、替换系统文件。先从文件时间线入手,用find命令列出最近三天被修改过的所有文件。
find / -type f -mtime -3 -ls 2>/dev/null | sort -k10
重点关注/etc/crontab、/var/spool/cron/crontabs/、/etc/cron.*目录,以及systemd的timer单元。很多挖矿木马会在/etc/cron.d下面写一个伪装成系统任务的cron文件,名字可能叫sync、apache或者nginx。另外检查/lib/systemd/system下面是否有可疑的service文件,攻击者喜欢用systemd来实现持久化,因为比cron更难被发现。
webshell的排查要结合web日志。先找到nginx或apache的access.log,统计最近访问最频繁的URI路径,尤其是那些直接访问.php、.jsp、.aspx的请求,即使你的业务根本不跑这类脚本。攻击者经常把webshell藏在图片目录、上传目录或者缓存目录里,文件名伪装成favicon.ico或者config.inc。用grep配合正则搜索eval、base64_decode、system、exec这类高危函数调用。
grep -rl "eval\|base64_decode\|shell_exec\|system" /var/www --include="*.php" 2>/dev/null
如果发现webshell,不要删除,先备份到外部存储,然后分析它的功能、加密方式和回连地址。这能帮你判断攻击者的技能水平和攻击目的。
SSH后门与账户异常排查攻击者拿到权限后最想保住的入口就是SSH。检查/etc/passwd和/etc/shadow是否有新增的UID为0的账户,特别注意那些shell为/bin/bash但用户名看起来很正常的账号,比如mysql、nobody被改成可登录。同时检查/root/.ssh/authorized_keys和每个用户家目录下的.ssh/authorized_keys,看是否有你不认识的公钥。很多攻击者会写入自己的公钥来实现免密登录。
更隐蔽的后门是替换了ssh的PAM模块或者sshd二进制文件本身。用debsums校验openssh-server包的完整性。
debsums -c openssh-server
如果输出显示文件被修改过,说明sshd已经被植入后门。这种情况下从系统源重新安装openssh-server也不一定安全,因为攻击者可能同时替换了包管理器的校验逻辑。最稳妥的做法是从同版本的干净系统上拷贝sshd文件过来,或者从官方ISO里提取。
内核级rootkit检测用户态的工具全部不可信之后,需要借助内核模块层面的检测。chkrootkit和rkhunter是传统选择,但它们的特征库更新慢,对新型rootkit检出率不高。更有效的做法是用rkhunter配合自己维护的基线数据库,先在一台干净的同版本Ubuntu上跑一遍rkhunter生成baseline,再在可疑服务器上跑并对比差异。
如果怀疑内核被直接篡改,可以用unhide来检测隐藏进程和隐藏端口。unhide通过遍历/proc文件系统并和系统调用结果做对比来发现被rootkit隐藏的资源。
unhide proc unhide sys unhide-tcp
一旦确认存在内核级rootkit,这台服务器的内核完整性已经无法保证。取证完成后必须从零重装,不能尝试修复。
网络层面的残留连接清理恶意程序可能还在维持与C2服务器的连接。用ss命令查看所有非监听状态的TCP连接,过滤掉已知的业务端口。
ss -antp | grep ESTAB
注意那些进程名为空或者显示为奇怪的短字符串的连接,这往往是内核模块隐藏了进程信息。同时检查iptables或nftables规则是否被添加了奇怪的转发或放行规则,攻击者有时会开放一个高位端口作为备用通道。
iptables -L -n -v nft list ruleset
如果发现不明规则,记录后先不要删除,分析规则中的端口和IP是否与之前发现的恶意进程外联地址一致,这能帮助建立完整的攻击行为画像。
权限清理:系统级持久化清除取证完成后,开始清理。原则是宁可多删不可遗漏。第一步,杀掉所有已确认的恶意进程。如果进程被保护无法kill,说明有内核模块保护,需要先卸载恶意内核模块。用lsmod查看所有加载的模块,对比干净系统的模块列表,找出多出来的.ko文件。
lsmod | awk '{print $1}' | sort > /tmp/modules_now
# 在干净系统上执行同样命令,然后diff
diff /tmp/modules_clean /tmp/modules_now
第二步,清理所有计划任务和systemd服务。直接清空/var/spool/cron/crontabs下面除root外的异常文件,检查/etc/crontab和/etc/cron.d里的每一行。对于systemd,用systemctl list-units --type=service --all列出所有服务,禁用并删除可疑的service文件。
第三步,重置所有SSH密钥和用户凭证。删除所有authorized_keys文件,修改root及所有可登录用户的密码。如果业务允许,直接禁用密码登录,只使用密钥认证,并且重新生成主机密钥。
rm -f /etc/ssh/ssh_host_* dpkg-reconfigure openssh-server
第四步,清理webshell和上传的恶意文件。根据之前取证阶段找到的webshell列表,全部删除。同时检查web目录下是否有最近新建的压缩包、sql文件或者可执行文件,攻击者经常打包数据库或源码准备窃取。
用户态后门与库文件劫持清理攻击者可能替换了系统的动态链接库,比如libc.so.6或者libpam.so。用ldconfig -p查看库文件路径,然后用debsums校验所有已安装包的完整性。
debsums -s 2>&1 | grep -v "OK"
输出中所有显示FAILED或REPLACED的文件都需要从官方源重新下载安装。对于dpkg本身被篡改的情况,需要从Ubuntu官方镜像站下载对应版本的dpkg deb包,用ar命令解压后手动替换二进制文件。
还有一个容易被忽略的地方是LD_PRELOAD后门。检查/etc/ld.so.preload文件是否存在,以及所有用户家目录下的.bashrc、.profile、.bash_profile里是否设置了LD_PRELOAD环境变量。攻击者通过预加载恶意so文件可以劫持系统调用,隐藏文件和网络连接。
日志分析与时间线重建清理完成后,需要对攻击过程做时间线重建,这样才能评估损失范围。重点分析/var/log/auth.log中的登录记录,找出攻击者首次登录的时间、IP和方式。如果日志已被清除或篡改,可以尝试从journald中恢复。
journalctl --list-boots journalctl -b -1 # 查看上一次启动的日志
同时检查/var/log/apt/history.log,看攻击者是否安装了额外的软件包,比如nmap、masscan、socat这类内网扫描和隧道工具。如果发现安装了这类工具,说明攻击者可能已经进行了内网横向移动,需要立即通知安全团队扩大排查范围。
bash_history也是重要线索,但攻击者通常会清除或伪造。检查每个用户家目录下的.bash_history,注意文件大小和最后修改时间。如果发现文件被清空或链接到/dev/null,说明攻击者具备一定反取证意识。
重建系统与加固策略取证和清理完成后,如果确认没有内核级rootkit,可以继续使用这台服务器,但必须做全面加固。如果发现了内核级恶意软件,必须从零重装系统,数据迁移前要在隔离环境中做病毒扫描。
加固措施包括:配置fail2ban防止暴力破解,设置SSH仅允许密钥登录并限制可登录用户组,启用auditd监控关键文件和系统调用,配置apparmor对web服务和数据库做强制访问控制。同时部署文件完整性监控工具如aide或tripwire,定期对比文件哈希值,一旦发现异常变动立即告警。
最后,把这次入侵的IOC(失陷指标)整理成文档,包括恶意文件哈希、C2域名和IP、攻击手法等,同步给团队并在内部防护系统中做黑名单规则。每一次成功的入侵取证都是一次安全能力的提升,前提是你真正从攻击者的行为中学会了如何加固防线。
