服务器被攻击后,第一件事就是查系统登录日志和访问日志,找出攻击者进来的时间和路径,再决定是断网还是封IP。很多人一发现被黑就急着重装系统,结果证据全没了,正确做法是先把日志拿到手,再看服务器现状。
攻击发生后先做这三件事,别急着动服务器
突然收到CPU跑满、网站被篡改或者数据库被删的通知,手忙脚乱是正常的,但这时候最忌讳的就是立刻重启、改密码、删文件。
第一:给磁盘做快照
登录你的云服务商控制台,找到云服务器实例,点击“创建快照”,如果用的是简米云、酷番云或华为云,这个操作都在实例详情页的“磁盘”选项卡里,快照就是完整的硬盘副本,相当于把现场拍照保存了,后续查日志、分析病毒,都以这个快照作为凭证,好消息是大多数云厂商允许在不停机的情况下打快照,不用等到业务停了再做。
第二:在控制台隔离服务器
别在服务器上直接操作那些日志分析命令,除非你很清楚自己在做什么,先记住源IP,然后到安全组里把端口规则改成禁止所有入站连接,这样攻击者还挂在你的服务器上,但新的数据包进不去,你可以在相对安全的环境里继续查,如果你的业务不能中断,那就开一台新服务器顶上,把受影响的实例保留成快照模式,这涉及到一个常见问题网站被攻击了怎么查日志,答案很简单:在隔离之前先把所有日志目录拷贝一份,防止攻击者执行了清理操作。
第三:检查是否有定时任务和后门文件
攻击者通常会留后门,运行cat /etc/crontab和crontab -l,看看有没有陌生任务,尤其是包含curl、wget或者Base64编码字符的任务,同时打开/root/.bash_history和/home/工具用户/.bash_history,观察是否存在你不认识的命令记录。
Linux查看服务器登录日志命令,给攻击者的入侵路径画线
登录日志是判断攻击者通过什么途径进来、进来了多久的第一手资料,Linux系统里登录记录分散在几个文件里,分工各不相同,把Linux查看服务器登录日志命令这个环节吃透,你就是半个取证专家。
/var/log/auth.log和/var/log/secure是必查文件
Debian系和Ubuntu系统日志在/var/log/auth.log里,CentOS和RHEL系系统日志在/var/log/secure里,这两个文件记录的是SSH登录、sudo提权、新建用户等认证行为,逐行阅读太费时间了,直接用grep来过滤关键词:
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
这个命令的意思是:在日志里查找所有密码登录失败的记录,提取攻击者的IP地址,统计次数并降序排列,运行结果会直接告诉你哪个IP尝试了最多的密码爆破,如果是你自己输错了几次密码,IP是你自己的内网地址或者办公网出口IP,问题不大,但如果是陌生IP榜上有名,那就锁定了一个攻击源。
还有一个要点:检查是否有Accepted记录里出现你不认识的IP。grep "Accepted" /var/log/secure这行命令会列出所有成功登录的记录,每一行包括时间、用户、IP和端口,对照一下,凡是你不认识的IP成功登录过,就意味着这台机器已经被攻破了,業界共识认为,成功登录是最高的警报级别,比失败尝试重要得多,因为失败只能说明有人在撞库,而成功说明门已经被打开了。
wtmp和btmp文件记录登录历史和注销历史
last命令读取的是/var/log/wtmp,记录的是成功登录和注销的时间线,运行last之后你会看到类似这样的输出:
admin pts/0 203.0.113.10 Tue Mar 11 03:22 - 03:45 (00:23)
root pts/1 198.51.100.7 Tue Mar 11 02:10 - 03:02 (00:52)
检查username列是否出现陌生用户名,检查IP列是否出现异常地址,检查时间列是否在深夜或者业务低峰期,这三个维度只要同时出现两个可疑点,基本可以确认这就是攻击者的登录记录。
badlogins你需要单独查看lastb命令,读取的是/var/log/btmp,记录失败的登录尝试,爆破行为往往数量极大,通常都在几百次以上。
用who和w命令查看当前在线的用户
who显示用户名、登录终端、时间、IP地址,w在who的基础上多显示CPU占用和当前执行的命令,执行w,如果看到某个用户运行着一个Shell脚本或者Python程序,而你又没跑过任何定时任务,那大概率是攻击者留下的东西,马上用pkill把对应进程杀掉,或者直接断开他的SSH连接。
服务器被黑怎么查找攻击来源,访问日志会给你指路
登录日志解决的是“谁进来了”的问题,访问日志解决的是“进来之后干了什么”的问题,如果你用的是Nginx或者Apache,访问日志会记录每一个HTTP请求的客户端IP、请求URL、状态码和处理时间。服务器被黑怎么查找攻击来源,看这类日志是最直接的一条路径。
定位状态码异常在200和302之外的请求
正常的网站PV分布中,200(成功)、304(缓存)、404(不存在)的占比通常比较固定,攻击行为往往制造大量500、403、404、301异常状态码,用这条命令查看Nginx访问日志中状态码的分布:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
如果404的数量异常高,说明存在目录扫描行为,如果500的数量很高,可能是攻击者在利用脚本探测漏洞,如果某一行出现了POST /wp-admin/admin-ajax.php、/index.php?s=/index/think、/bin/bash这类路径,再配合状态码200返回,这就是典型的Webshell上传或者命令执行行为。
建立时间与IP的关联分析
攻击者登录服务器之后,他会直接在终端里输入命令,访问日志里看不到这种操作,但访问日志能解释他是从哪个漏洞入口进来的,查看攻击IP在Nginx日志中的所有请求记录:
grep "203.0.113.10" /var/log/nginx/access.log
把输出结果按时间排序,你会看到攻击者的整个攻击链:先是一个脚本扫描全站目录,然后访问某个特殊的.php、.jsp、.aspx文件,接着上传了一个文件,最后那个文件被访问了多次,中间那一步“上传文件”的请求就是漏洞利用点,据此可以反向修复代码漏洞,多数情况下,攻击者不会只攻击一个点就停手,日志里留下的URL序列往往覆盖了全部尝试。
分析access.log时注意绕过技巧
攻击者会伪造User-Agent字段,会通过CDN转发IP,会把日志中自己的路径改成分散式扫描,所以日志文件不能只看一两行,要整体看流量突增的时间点,如果你发现某个时刻访问量突然到平时的几十倍,而PV来源全部集中在某一个IP段,那就可以断定这是一次针对性的攻击,此时在服务商安全组里一键封禁该IP段,比在服务器上iptables更有效率。
Windows服务器查看远程登录记录,事件查看器里有答案
Windows服务器被攻击不比Linux少,只是很多管理员不熟悉查看方法,Windows的位置在“事件查看器”里,直接按Win+R运行eventvwr.msc即可。Windows服务器查看远程登录记录,核心是三个日志编号:
- 4625:账户登录失败
- 4624:账户登录成功
- 4634:账户注销
点击“Windows日志”→“安全”,然后在右侧点“筛选当前日志”,在事件ID框里输入4625,就能看到所有失败的登录尝试,双击任意一条记录,里面有登录进程、源网络地址和登录时间,攻击者爆破时大量使用Administrator账号,所以看到大量“源网络地址”不一样的4625事件,就说明有人在尝试远程桌面爆破。
如果你确认服务器被攻破,需要追踪该攻击者的行为,不要切到“应用程序”服务园里找线索,而是回到安全日志中筛选4624事件,查看成功登录的记录,重点关注登录类型是3(网络登录)还是10(远程交互式登录),10代表有人真的坐在这台机器前面或者远程桌面进来了。
还有一个额外留意点:审计策略如果默认没开,部分事件可能查不到,按Win+R运行secpol.msc,进入“本地策略”→“审核策略”,确认“审核登录事件”是“成功,失败”都选中的状态。
超量日志条目怎么快速排查异常登录条目
日志文件很大,几百万行都是常有的事,一条一条看不可能也不现实,以下是按优先级排列的操作顺序:
- 先去
/var/log/secure或auth.log里统计Failed password次数最多的前10个IP,优先封锁 - 再去
/var/log/wtmp里看last的输出结果,找到“仍在登录”状态的记录,也就是那个还没退出的进程,这往往是攻击者当前的活跃会话 - 接着查看
/var/log/btmp的lastb输出,定位爆破行为的攻击源 - 最后把Nginx或Apache的access.log与登录日志拿到同一时间轴上比对,找到攻击行为从Web入口到系统登录之间的事件顺序
那个异常登录条目出现的精确时间点,就是锁定的关键,从那个时间往后推5分钟,查客户端IP在Web日志里都访问过哪些URL,看到上传路径、管理后台路径、接口路径,基本就定位了漏洞成因。
服务器被攻击后第一步永远是把日志拿到手,登录日志与实际网络访问日志放在一起交叉看,这个动作的优点是你不需要任何高级工具,系统的原始日志就能帮你还原入侵路径,处理攻击的时间窗口很宝贵,日志这一关走完,剩下的就是修补漏洞、清理后门、更换系统口令。
服务器被攻击后日志常见问题
攻击者会把系统日志清理掉吗
攻击者如果已经拿下了root权限,完全可以用一条> /var/log/secure清空日志文件,或者用shred命令彻底销毁日志,这也就是为什么必须第一时间做磁盘快照或者把服务器隔离,日志文件一旦物理删除,恢复难度极高,少数云厂商提供的云盾或云安全中心会有数据额外备份,在有快照的情况下,即使原日志被清理,快照中仍保留完整记录。
服务器被攻击后日志文件很大,可以先删除旧日志吗
不建议这么做,日志文件再大,用grep和awk配合过滤命令都能在几分钟内提取有效信息,直接删除日志会让所有历史记录消失,不仅影响本次排查,还可能影响后续向网警报案时的证据提交,正确的做法是复制有问题的日志到隔离目录,比如/var/log/backup_20260101,保留权限属主和文件时间戳。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/654384.html




