很多时候CTF比赛会给你一台linux服务器,要求是服务器被入侵了,让你根据线索,找到flag,这种本质上通常是 Linux 主机应急响应 / 入侵取证(Incident Response):比赛方给你一台已经被“入侵”的 Linux 服务器,你需要判断攻击者做了什么、找到持久化/后门/恶意文件,最后从线索里拿到 flag。拿到环境后,我建议你不要一上来就乱删文件,而是按照下面这套排查流程做,一点一点拿到flag。
一、先建立你的“应急响应思维”
拿到机器后,你首先回答 5 个问题:
谁进来了? → 怎么进来的? → 进来之后做了什么? → 有没有留下后门? → flag 在哪里?
Linux CTF 中最常见的考点大概是:
- SSH 爆破 / 弱密码
- WebShell
- 恶意 PHP/Python/Perl/Shell
- 反弹 Shell
- SSH 公钥后门
- Cron 持久化
- systemd 服务
/etc/rc.local/etc/profile / .bashrc- SUID 提权
- rootkit
- LD_PRELOAD
- 修改
/etc/passwd / /etc/shadow /tmp、/dev/shm 中的恶意文件- 被替换的系统命令
- SSH 登录日志
- Web 访问日志
- history
- 进程/网络连接
- Docker / 容器逃逸相关痕迹
刚登录服务器:
●●●CODE
idwhoamihostnameuname -acat /etc/os-releasedatepwd
然后看当前用户:
●●●CODE
whowlast -n 20lastlog
尤其注意:
例如出现:
●●●CODE
root pts/0 10.10.10.23hacker pts/1 10.10.10.50
这可能直接告诉你攻击者 IP。
进程
更推荐:
或者:
重点找:
●●●CODE
ncncatsocatcurlwgetpythonpython3perlbashshphp
以及奇怪的进程:
●●●CODE
./a/tmp/.xxx/dev/shm/.xxx
例如:
●●●CODE
ps aux | grep -E 'nc|ncat|socat|curl|wget|python|perl|php'
或者:
看监听端口:
看当前连接:
如果看到:
●●●CODE
ESTAB 0 0 10.0.0.5:22 10.0.0.99:54321
说明当前有人通过 SSH 连着。
如果看到某个奇怪程序:
或者:
就值得重点调查。
也可以:
1.SSH
Debian/Ubuntu:
●●●CODE
grep -i "Accepted" /var/log/auth.loggrep -i "Failed password" /var/log/auth.log
CentOS/RHEL:
●●●CODE
grep -i "Accepted" /var/log/securegrep -i "Failed password" /var/log/secure
直接:
●●●CODE
grep -RiE "Accepted|Failed password|Invalid user" /var/log 2>/dev/null
你可能看到:
●●●CODE
Accepted password for user from 10.10.10.20
或者大量:
●●●CODE
Failed password for root from ...
这个在 CTF 里非常常见。
重点:
●●●CODE
awk -F: '$3 >= 1000 {print}' /etc/passwd
看 UID=0:
●●●CODE
awk -F: '$3 == 0 {print}' /etc/passwd
正常情况下通常只有:
●●●CODE
root:x:0:0:root:/root:/bin/bash
如果出现:
●●●CODE
hacker:x:0:0::/home/hacker:/bin/bash
这就非常可疑。
因为:
意味着这个用户拥有 root 权限。
这是 Linux CTF 高频考点。
首先:
●●●CODE
find /home /root -name authorized_keys -type f -exec ls -la {} \;
然后:
●●●CODE
cat /root/.ssh/authorized_keys
以及:
●●●CODE
find /home -path "*/.ssh/authorized_keys" -type f -exec sh -c 'echo ==== $1; cat "$1"' _ {} \;
你需要特别关注陌生的:
●●●CODE
ssh-rsa AAAA...ssh-ed25519 AAAA...
以及文件修改时间:
●●●CODE
stat /root/.ssh/authorized_keys
先:
root:
●●●CODE
crontab -u root -l
再:
●●●CODE
cat /etc/crontabls -la /etc/cron.d/ls -la /etc/cron.daily/ls -la /etc/cron.hourly/ls -la /etc/cron.weekly/
然后:
●●●CODE
grep -RniE "curl|wget|nc|bash|python|perl|php|/tmp|/dev/shm" /etc/cron* 2>/dev/null
例如发现:
●●●CODE
* * * * * root /tmp/.update.sh
那么:
●●●CODE
cat /tmp/.update.shstat /tmp/.update.sh
基本就是重点嫌疑。
现代 Linux CTF 也经常考。
●●●CODE
systemctl list-units --type=service
查看开机启动:
●●●CODE
systemctl list-unit-files --state=enabled
重点:
●●●CODE
systemctl status xxx.service
然后:
●●●CODE
find /etc/systemd/system /usr/lib/systemd/system \ -type f -mtime -30 -ls 2>/dev/null
寻找最近修改的 service。
攻击者特别喜欢把东西放这里。
●●●CODE
ls -lah /tmpls -lah /var/tmpls -lah /dev/shm
递归:
●●●CODE
find /tmp /var/tmp /dev/shm -type f -ls 2>/dev/null
最近修改:
●●●CODE
find /tmp /var/tmp /dev/shm -type f -mmin -1440 -ls 2>/dev/null
例如:
●●●CODE
/tmp/.x/tmp/.update/dev/shm/.cache
都值得看。
比如:
Apache:
●●●CODE
/var/log/apache2/access.log/var/log/apache2/error.log
Nginx:
●●●CODE
/var/log/nginx/access.log/var/log/nginx/error.log
例如:
●●●CODE
grep -Ei "cmd=|exec|system|shell|upload|eval|base64|passwd|/etc/" /var/log/nginx/access.log
你可能发现:
●●●CODE
POST /upload.phpPOST /shell.php?cmd=idGET /index.php?cmd=whoami
这时候就可以顺着时间线找。
假设网站在:
可以:
●●●CODE
find /var/www/html -type f -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\n' | sort
找最近修改的文件。
PHP 环境可以重点搜索:
●●●CODE
grep -RniE \'eval\(|assert\(|system\(|shell_exec\(|passthru\(|exec\(|base64_decode\(|popen\(|proc_open\(' \/var/www/html 2>/dev/null
还可以:
●●●CODE
find /var/www/html -type f -name "*.php" -mtime -7 -ls
CTF 中经常就是:
某个正常网站 → 某个异常 PHP → WebShell → 攻击者执行命令 → flag
●●●CODE
cat ~/.bash_history
root:
●●●CODE
cat /root/.bash_history
其他用户:
●●●CODE
find /home -name ".bash_history" -exec sh -c 'echo ==== $1; cat "$1"' _ {} \;
重点搜索:
●●●CODE
grep -RniE \"wget|curl|nc|ncat|socat|chmod|chown|passwd|useradd|ssh|scp|base64|/tmp|/dev/shm" \/root /home 2>/dev/null
不过要注意:
history 很容易被攻击者删除/清理,所以没有 history ≠ 没有攻击。
这是 CTF 应急响应非常实用的技巧。
例如最近 24 小时:
●●●CODE
find /etc /var /home /root /tmp \-type f -mtime -1 -ls 2>/dev/null
最近 1 小时:
●●●CODE
find / -type f -mmin -60 -ls 2>/dev/null
当然 /proc、/sys 等虚拟文件系统会产生很多噪音,所以实际比赛中最好限制目录。
尤其关注:
●●●CODE
/etc/var/home/root/tmp/var/www
攻击者可能留下 SUID 后门。
●●●CODE
find / -perm -4000 -type f 2>/dev/null
然后和正常系统命令对比。
常见:
●●●CODE
/usr/bin/passwd/usr/bin/sudo/usr/bin/su
如果突然出现:
●●●CODE
/tmp/x/opt/.hidden/usr/local/bin/xxx
就值得调查。
看看:
以及:
●●●CODE
which lswhich pswhich sswhich netstatwhich curl
如果:
结果是:
而不是:
就非常可疑。
还可以:
●●●CODE
type -a lstype -a ps
这是稍微进阶一点的 Linux 持久化考点。
●●●CODE
cat /etc/ld.so.preload 2>/dev/null
如果里面存在一个奇怪的 .so:
需要重点调查。
同时:
看看有没有奇怪环境变量。
CTF 里 flag 的位置可能非常刁钻。
首先:
●●●CODE
find / -iname "*flag*" 2>/dev/null
也可以:
●●●CODE
find / -type f \( -name "flag*" -o -name "*flag*" \) 2>/dev/null
但不要只依赖文件名。
有些题目会把 flag 放在:
或者:
也可能:
甚至藏在:
日志、数据库、环境变量或者恶意脚本中。
可以直接记成:
●●●CODE
Linux IR CTF │ ┌──────────┴──────────┐ ↓ ↓ 当前状态 历史痕迹 │ │ ps / ss / w last / logs │ │ ├──────────┬──────────┤ ↓ ↓ ↓ 用户 SSH Web │ │ │ passwd auth.log access.log │ │ │ └──────────┼──────────┘ ↓ 持久化 │ ┌─────────────┼─────────────┐ ↓ ↓ ↓ cron systemd SSH key │ │ │ └─────────────┼─────────────┘ ↓ 恶意文件 │ /tmp /dev/shm /var/www ↓ 时间线 ↓ FLAG
二十如果是比赛,我建议你准备一套“一键排查脚本”
比如进入机器以后:
●●●CODE
echo "===== HOST ====="hostnameuname -adateid echo "===== USERS ====="awk -F: '$3==0 {print}' /etc/passwd echo "===== LOGIN ====="last -n 20 echo "===== PROCESS ====="ps auxf echo "===== NETWORK ====="ss -antp echo "===== CRON ====="crontab -l 2>/dev/nullcat /etc/crontabls -la /etc/cron.d/ echo "===== SSH KEYS ====="find /root /home -name authorized_keys -type f \ -exec sh -c 'echo ==== $1; cat "$1"' _ {} \; echo "===== TEMP ====="find /tmp /var/tmp /dev/shm -type f -mmin -1440 -ls 2>/dev/null echo "===== SUID ====="find / -perm -4000 -type f 2>/dev/null echo "===== FLAG ====="find / -iname "*flag*" 2>/dev/null
不过真正比赛的时候不要只靠脚本。脚本的作用是快速建立全局视野,真正得分往往需要你根据日志、时间戳、进程和文件之间的关系,把攻击链串起来。
如果你刚开始学这类 CTF
我建议你的学习顺序是:
Linux 基础 → Linux 日志 → Web 日志 → 进程/网络 → 持久化 → WebShell → 提权 → 入侵时间线 → 自动化取证。
尤其要熟练这几个命令:
●●●CODE
pssslsoffindgrepawksedstatjournalctlsystemctlcrontablastwhow
以上就是我的一些排查方法,还有检查rooktit的工具rkhunter、chkrootkit、unhide,还有常用在常用命令被替换的时候的应急工具busybox等等,好多东西都是在玩中学,经常用,功到自然成。#CTF比赛#自从有了AI,好像失去了原来的意思,让一些手工党很无聊,但是我还是要拥抱变化,让AI真正成为我们的工具而非替代我们。
- https://github.com/Just-Hack-For-Fun/Linux-INCIDENT-RESPONSE-COOKBOOK