
1. 应急响应日志排查从入门到精通的命令手册做安全运维或者系统管理最怕的就是半夜被电话叫醒说服务器有异常。这时候考验的不仅是技术更是心态和效率。应急响应说白了就是和时间赛跑你得在最短的时间内搞清楚“谁进来了”、“干了什么”、“留下了什么”以及“怎么把它请出去”。而这一切的起点往往就是日志。日志是系统活动的“黑匣子”记录了从用户登录到进程启动从网络连接到文件访问的几乎所有痕迹。无论是Windows服务器还是Linux主机系统都内置了强大的日志记录功能但海量的日志条目常常让人望而生畏。新手面对/var/log目录下几十个日志文件或者Windows事件查看器里成千上万条事件很容易陷入无从下手的困境。老手则可能依赖几个固定的命令但面对新型攻击或复杂渗透这些命令可能不够用。这篇文章我就结合自己十多年在一线处理安全事件的经验为你梳理一套在Windows和Linux系统上进行应急响应日志排查时最常用、最核心的命令和思路。这不是一份简单的命令列表而是一套结合了场景、原理和实战技巧的排查方法论目标是让你拿到一台可疑机器后能像侦探一样有条不紊地找到线索。2. 核心排查思路与流程设计在敲下任何命令之前清晰的思路比任何高级工具都重要。盲目的翻查日志就像在没开灯的房间里找钥匙效率极低。一个高效的应急响应日志排查应该遵循“由外而内由近及远”的原则。2.1 建立排查的“黄金四问”框架面对一台需要排查的主机我通常会先问自己四个问题这构成了整个排查流程的骨架时间锚点异常是什么时候被发现的有没有一个大概的时间范围这是所有排查的起点。没有时间线日志就是一团乱麻。影响范围是单个用户异常还是整个系统性能下降是某个服务不可用还是发现了可疑文件这决定了排查的广度。入口推测最可能的入侵途径是什么是薄弱的远程管理口令SSH/RDP还是存在漏洞的Web应用或者是通过鱼叉邮件进来的这决定了排查的重点方向。行为特征攻击者可能想干什么是窃取数据、植入后门、还是作为跳板这帮助你理解日志中异常行为背后的意图。基于这四个问题我会形成一个初步的排查计划。比如如果怀疑是SSH爆破那么重点就是/var/log/auth.log或/var/log/secure以及Windows的安全日志事件ID 4625如果怀疑是Webshell那么重点就是Web服务器日志如/var/log/apache2/access.log和文件系统变化。2.2 取证意识与操作规范在开始排查前有一个必须牢记于心的原则保护现场。你的排查操作本身可能会覆盖或修改攻击者留下的痕迹如文件访问时间、内存数据。注意在条件允许的情况下优先对可疑系统进行内存镜像和磁盘镜像然后再在镜像或隔离环境中进行分析。如果必须在线分析所有操作都应考虑最小化影响。只读挂载如果可能将可疑磁盘以只读方式挂载到分析机上。命令审计在Linux下可以使用script命令记录你所有的终端操作作为证据链的一部分script -a investigation_log.txt。避免直接修改尽量使用grep,awk,find等查询命令而非rm,mv等会改变系统的命令直到完全确认。时间同步检查系统时间是否准确。攻击者可能会篡改系统时间来干扰调查。使用date(Linux) 或Get-Date(Windows PowerShell) 查看并与可靠时间源对比。有了清晰的思路和规范的意识我们就可以进入具体的操作系统层面了。下面我将分别针对Linux和Windows拆解那些救过我无数次的命令。3. Linux系统日志排查核心命令详解Linux的日志分散但结构清晰大部分文本格式的日志都集中在/var/log目录下。排查的关键在于快速定位和关联分析。3.1 用户与认证日志排查攻击者要立足首先得有个身份。这里是排查的重中之重。查看当前登录用户who # 显示当前已登录用户简单 w # 显示当前已登录用户及他们的进程更详细 last # 显示所有用户的登录历史从/var/log/wtmp读取 lastb # 显示失败的登录尝试从/var/log/btmp读取需要sudolast命令的输出特别有用关注异常的登录时间、来源IP特别是来自不常见国家或内网陌生IP、以及用户名如root直接登录在生产环境中应警惕。排查认证日志sudo tail -f /var/log/auth.log # Debian/Ubuntu 系列实时查看 sudo tail -f /var/log/secure # RHEL/CentOS/Fedora 系列在这里你需要重点关注几种类型的消息Failed password for: 密码失败可能是爆破。Accepted password for: 密码认证成功。Accepted publickey for: 密钥认证成功。检查是否是你部署的密钥。session opened for user: 用户会话开启。pam_unix(sshd:session): session closed for user: 用户会话结束。一个快速筛选爆破尝试的命令sudo grep Failed password /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr这个命令链会统计所有失败登录的源IP地址及其尝试次数按次数降序排列一眼就能看出哪个IP在疯狂尝试。历史命令审计 这是发现攻击者执行了哪些操作的关键。每个用户的命令历史通常保存在其家目录的.bash_history(或.zsh_history) 文件中。# 查看当前用户的历史命令 history # 查看指定用户的历史命令文件需要权限 sudo cat /home/username/.bash_history sudo cat /root/.bash_history # 特别注意root的历史实操心得高明的攻击者会清空或篡改.bash_history文件。所以history命令显示为空或不连续本身就是一个强烈的异常信号。此外可以检查HISTFILE和HISTSIZE环境变量是否被修改或者直接使用ps auxf查看是否有异常的、长期存在的终端进程。3.2 进程与网络连接排查攻击者进入系统后会运行恶意进程或建立网络连接。进程排查ps auxfww # 列出所有进程显示用户、PID、CPU/内存占用、完整命令行f-树状ww-防止截断 top -c # 动态查看进程按CPU排序显示完整命令 htop # 更强大的交互式进程查看器通常需安装查看进程时要像侦探一样审视异常的用户普通服务由www-data,nginx,mysql等用户运行如果看到apache进程是root在跑或者redis由陌生用户运行就要警惕。可疑的命令行长长的、编码过的命令连接到奇怪域名的curl或wget命令使用/dev/tcp或/dev/udp的脚本。异常的父子关系ps auxf可以显示进程树。一个bash进程下面挂着一个perl或python脚本而这个脚本又不是你部署的就值得深究。网络连接排查netstat -tunap # 传统命令显示所有TCP/UDP连接及关联进程需要sudo看所有 ss -tunap # netstat 的现代替代速度更快输出类似 lsof -i # 列出所有打开网络连接的文件进程重点关注外部入站连接LISTEN状态的端口除了你已知的服务如22, 80, 443, 3306是否多了陌生的端口内部外发连接ESTABLISHED状态的连接本地端口是高端口10000却连接到一个外部IP的某个端口如6667, 4444, 1337等常见后门端口。隐藏连接使用lsof -i有时能发现netstat看不到的、通过原始套接字建立的连接。3.3 文件系统与系统信息排查攻击者会上传工具、创建后门、修改配置。查找近期被修改的文件# 查找 /etc 目录下最近24小时内被修改的文件 sudo find /etc -type f -mtime -1 # 查找 /var/www 目录下最近10分钟内被修改的文件 sudo find /var/www -type f -mmin -10 # 结合时间排序查看 sudo find / -type f -mtime -1 2/dev/null | xargs ls -la | sort -k6,7-mtime按天-mmin按分钟。2/dev/null是为了忽略权限错误产生的噪音。查找SUID/SGID特殊权限文件sudo find / -type f \( -perm -4000 -o -perm -2000 \) 2/dev/nullSUID/SGID文件执行时会以文件所有者或所属组的身份运行。这是正常功能如/bin/passwd但也是攻击者提权的常用手段。如果发现/tmp或/var/tmp下有SUID的bash那几乎可以肯定是后门。查找可疑的隐藏文件与目录# 查找以 . 开头的隐藏文件非当前目录 sudo find / -name .* -type f 2/dev/null | grep -v /\. # 查找常见后门目录或文件名 sudo find / \( -name *backdoor* -o -name *shell* -o -name *.php \) -type f 2/dev/null | grep -E (/tmp|/var/tmp|/dev/shm)系统信息快照uname -a # 内核版本信息 cat /etc/*-release # 发行版信息 crontab -l # 查看当前用户的计划任务 sudo crontab -l -u www-data # 查看特定用户的计划任务 sudo systemctl list-units --typeservice --staterunning # 查看运行中的服务 sudo cat /etc/passwd | grep -v nologin\|false # 查看可以登录系统的用户 sudo cat /etc/sudoers # 查看sudo权限配置使用visudo编辑的攻击者常通过计划任务 (crontab)、系统服务 (systemd)、或者.bashrc/.profile等启动脚本实现持久化。4. Windows系统日志排查核心命令详解Windows的日志主要存储在事件查看器中虽然图形界面直观但命令行工具在批量处理和远程排查时效率更高。PowerShell是我们在Windows上应急响应的瑞士军刀。4.1 使用PowerShell查询事件日志Windows事件日志庞大精准查询是关键。基础查询命令# 获取所有事件日志列表 Get-WinEvent -ListLog * # 查询安全日志中最近100条事件 Get-WinEvent -LogName Security -MaxEvents 100 # 查询指定事件ID例如4624登录成功和4625登录失败 Get-WinEvent -FilterHashtable {LogNameSecurity; ID4624,4625} -MaxEvents 50对于应急响应最核心的是三个日志Security安全、System系统和Application应用。深度过滤与解析 原始事件对象信息很丰富我们需要提取关键字段。# 查询过去24小时内所有失败的登录尝试并提取关键信息 $StartTime (Get-Date).AddHours(-24) Get-WinEvent -FilterHashtable {LogNameSecurity; ID4625; StartTime$StartTime} | ForEach-Object { $xml [xml]$_.ToXml() # 从XML中提取目标用户名和源IP $TargetUserName ($xml.Event.EventData.Data | Where-Object {$_.Name -eq TargetUserName}).#text $IpAddress ($xml.Event.EventData.Data | Where-Object {$_.Name -eq IpAddress}).#text # 输出时间、事件ID、用户名、IP [PSCustomObject]{ Time $_.TimeCreated EventID $_.Id User $TargetUserName SourceIP $IpAddress } } | Format-Table -AutoSize这个脚本能帮你快速梳理出爆破来源。事件ID 4625的IpAddress字段在“网络登录”时是攻击者IP在“交互式登录”时可能是-或127.0.0.1需结合Logon Type字段判断。关键安全事件ID速查事件ID说明应急响应关注点4624账户登录成功异常时间、异常账号如默认/禁用账号、异常登录类型如3-网络10-远程交互4625账户登录失败爆破攻击、账号枚举关注频率和源IP4688创建了新进程可疑的父进程如explorer.exe生成了cmd.exe、可疑的命令行参数4697创建了服务攻击者安装后门服务实现持久化4698创建了计划任务攻击者通过计划任务实现持久化4663文件被访问需审计策略敏感文件如SAM、配置文件被异常进程访问7045服务被安装与4697类似系统日志中的记录4.2 进程、网络与自启动项排查进程排查Get-Process | Select-Object Id, ProcessName, CPU, WorkingSet, Path | Format-Table -AutoSize # 更详细包括命令行 Get-WmiObject Win32_Process | Select-Object ProcessId, Name, CommandLine, ParentProcessId | Format-List在PowerShell中关注CommandLine字段是否有可疑参数ParentProcessId是否异常例如一个svchost.exe的子进程是powershell.exe且执行了编码命令。网络连接排查netstat -ano | findstr ESTABLISHED # 传统cmd命令在PS中也可用 # PowerShell方式 (需要管理员权限) Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess将OwningProcess与进程列表对比找出可疑进程。特别关注连接到外部IP或非常见端口的连接。自启动项排查 攻击者藏身之处非常多。# 检查注册表常见自启动项 Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Get-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run # 检查计划任务 Get-ScheduledTask | Where-Object {$_.State -eq Ready} | Select-Object TaskName, TaskPath # 检查服务 Get-Service | Where-Object {$_.StartType -eq Automatic -and $_.Status -eq Running} | Select-Object Name, DisplayName对于计划任务和服务要仔细查看其执行命令或程序路径 (Get-ScheduledTaskInfo和Get-WmiObject Win32_Service可以获取更多细节)。4.3 文件系统与WMI查询查找近期文件# 查找C盘下最近1天内修改的所有文件 Get-ChildItem -Path C:\ -Recurse -File -ErrorAction SilentlyContinue | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-1)} | Select-Object FullName, LastWriteTime这个命令在大型驱动器上运行极慢通常需要限定到特定目录如Web根目录、临时目录等。# 查找临时目录中的可执行文件或脚本 Get-ChildItem -Path C:\Users\*\AppData\Local\Temp\*, C:\Windows\Temp\* -Include *.exe, *.dll, *.vbs, *.ps1, *.js -Recurse -ErrorAction SilentlyContinue使用WMI进行高级查询 WMI是Windows管理的信息宝库。# 查询最近创建进程的历史并非所有系统都开启此日志 Get-WmiObject -Query SELECT * FROM Win32_ProcessStartTrace WHERE TimeCreated IS NOT NULL | Select-Object ProcessName, CommandLine, ParentProcessID, TimeCreated # 查询网络共享连接 Get-WmiObject -Class Win32_NetworkConnection # 查询用户账户 Get-WmiObject -Class Win32_UserAccount | Where-Object {$_.LocalAccount -eq $true} | Select-Object Name, Disabled, SID5. 跨平台通用技巧与高阶关联分析掌握了基础命令后如何将它们串联起来形成完整的攻击链条画像才是体现水平的地方。5.1 时间线分析与日志聚合单一日志条目是孤证将不同来源的日志按时间排序就能看到故事。Linux下简单时间线# 将认证日志、命令历史、文件修改时间按时间排序合并查看示例 (sudo grep -h session opened\|Accepted\|Failed /var/log/auth.log* | head -20; sudo tail -20 /root/.bash_history 2/dev/null | awk {print \t[CMD_HIST] $0}; sudo find /etc -type f -newermt 2024-01-01 -exec ls -la {} \; 2/dev/null | head -10) | sort这只是一个思路你可以根据需要调整来源和命令。使用journalctlSystemd系统 现代Linux发行版使用systemd-journald它集中管理日志功能强大。sudo journalctl -xe # 查看最新日志详细 sudo journalctl -u ssh.service --since 2 hours ago # 查看ssh服务过去2小时日志 sudo journalctl --since 2024-05-01 09:00:00 --until 2024-05-01 10:00:00 # 查看时间范围 sudo journalctl -f # 实时跟踪日志类似 tail -fjournalctl的优势在于所有日志统一格式、自带时间戳、支持丰富的过滤字段如_UID,_COMM。5.2 内存与网络流量快照分析日志可能被篡改但内存和即时网络状态相对更真实。Linux内存快照# 快速查看内存中的敏感信息需安装strings sudo strings /dev/mem | grep -i passw\|token\|key\|http://\|https:// | head -50 # 使用工具如LiME或AVML获取完整内存镜像进行离线分析专业操作网络流量实时抓取# 快速抓取指定端口的流量如怀疑的恶意端口4444 sudo tcpdump -i any port 4444 -w suspect_port.pcap # 抓取与特定IP的所有通信 sudo tcpdump -i any host 192.168.1.100 -w suspect_ip.pcap抓取的.pcap文件可以用 Wireshark 进行深入分析还原攻击流量。5.3 自动化脚本与工具链思路面对重复性工作编写简单的脚本能极大提升效率。Linux一键信息收集脚本雏形#!/bin/bash # 应急响应快速信息收集脚本 HOSTNAME$(hostname) OUTPUT_DIRforensic_${HOSTNAME}_$(date %Y%m%d_%H%M%S) mkdir -p $OUTPUT_DIR echo [*] 收集系统信息... | tee -a $OUTPUT_DIR/report.txt uname -a $OUTPUT_DIR/system_info.txt cat /etc/*-release $OUTPUT_DIR/system_info.txt echo [*] 收集登录信息... | tee -a $OUTPUT_DIR/report.txt last $OUTPUT_DIR/last_logins.txt sudo lastb 2/dev/null $OUTPUT_DIR/failed_logins.txt echo [*] 收集进程和网络信息... | tee -a $OUTPUT_DIR/report.txt ps auxfww $OUTPUT_DIR/processes.txt ss -tunap $OUTPUT_DIR/network_connections.txt echo [*] 收集SUID/SGID文件... | tee -a $OUTPUT_DIR/report.txt find / -type f \( -perm -4000 -o -perm -2000 \) 2/dev/null $OUTPUT_DIR/suid_sgid_files.txt echo [!] 信息收集完成结果保存在: $OUTPUT_DIR/ | tee -a $OUTPUT_DIR/report.txt这个脚本只是一个起点你可以根据需要添加更多检查项如计划任务、服务、近期文件等。Windows PowerShell信息收集模块 在Windows上可以编写一个PowerShell脚本模块封装常用的检查函数实现类似功能。6. 常见陷阱、排查误区与实战心得最后这部分是我用不少“加班之夜”换来的经验希望能帮你少走弯路。6.1 新手常犯的五个错误不看时间戳拿到日志就从头开始看而不是围绕事件发生时间点前后展开。先通过date、uptime或查看最新日志条目确定系统时间并以此为准。忽略日志轮转Linux日志会轮转如auth.log,auth.log.1,auth.log.2.gz。只查看当前日志文件会丢失历史记录。记得用*.log*或zcat/zgrep查看压缩的旧日志。被海量日志淹没不要试图用cat查看整个大日志文件。一定要用grep,awk,sed进行过滤或者用tail -f实时跟踪用less交互式查看。轻信“正常”的输出攻击者会替换系统命令如ps,netstat,ls的二进制文件以隐藏自身。在高度可疑的环境下可以考虑使用静态编译的、来自可信介质的工具包如BusyBox进行检查。单点判断看到一个来自陌生IP的失败登录就断定被入侵不这可能是扫描。需要结合成功登录、异常进程、外发连接、文件改动等多个维度的证据形成证据链。6.2 高级攻击者的隐藏手段与应对日志清理攻击者会用shred、dd或直接清空日志文件 /var/log/auth.log。应对检查日志文件大小是否异常小或最近是否被截断。查看auditd日志如果开启或尝试从内存 (dmesg) 或其他服务器如集中日志服务器获取日志。进程隐藏通过挂载/proc目录、修改内核模块LKM rootkit或使用用户态rootkit隐藏进程。应对使用ps的不同选项如ps auxvsps -ef使用top或者使用unhide等专门工具检测。检查/proc目录下的数字目录进程ID是否与ps输出匹配。网络连接隐藏使用端口复用、ICMP隧道、DNS隧道等技术。应对使用netstat/ss查看所有状态包括LISTEN和TIME_WAIT使用tcpdump抓包分析异常协议流量监控出站DNS查询。文件隐藏使用文件系统层rootkit或特殊文件名如..带空格的文件名。应对使用find命令的-inum选项通过inode查找使用ls -la仔细查看目录列表使用stat命令检查文件属性。6.3 我的个人工具箱与习惯常备脚本我会在安全U盘或内网安全服务器上存放一套自己整理的、跨平台的应急响应脚本合集包含上述的信息收集、快速排查命令。命令别名在个人工作环境非被入侵主机的shell配置中设置一些别名比如alias historygrephistory | grep,alias pslps auxf | less提升输入效率。笔记系统每处理完一个事件无论大小我都会简单记录时间、主机、现象、排查步骤、根本原因、解决措施。这份私人笔记是成长最快的资料。保持怀疑对任何“看起来正常”的东西都多问一句为什么。这个服务为什么在这个时间启动这个用户为什么从这个IP登录这个文件为什么有这个权限多数的安全事件就藏在那些细微的“不合理”之中。应急响应没有银弹核心是思路清晰、操作规范、胆大心细。命令是工具思路是灵魂。希望这份融合了命令手册和实战心得的指南能成为你下次应对安全事件时手边一份可靠的参考资料。记住最快的速度来自于最充分的准备。