前言
本文通过拆解靶场中 80 与 2222 端口的渗透过程,详解 Nmap 端口扫描、dirsearch 目录遍历、Burpsuit 爆破枚举等工具的使用,以及文件读取漏洞构造、sshd_config 配置文件审计、系统文件时间对比分析等核心思路,旨在为 CTF 攻防实践提供可落地的渗透测试方法与问题排查思路,帮助理解靶场环境中各类漏洞的发现、利用与提权逻辑。
正文
1、端口扫描
使用Nmap扫码靶机端口:
bash
nmap -sV -v -T4 -A 192.168.31.77
发现靶机开放80和2222端口:

进入80端口里,发现一个网页。

2、HTML代码审计
Ctrl+U查看网页源代码,看到注释处有用户名和密码:

3、目录遍历
对靶场开放的网页目录遍历:
bash
dirsearch -u 192.168.31.77
发现login.php:

拿着上一步获取的用户名密码成功登录:

扫描完发现,还有一个上传目录upload:

说明可能存在文件上传漏洞:

4、文件读取漏洞利用
审计这个网页,发现一行逻辑:

这段代码的本意是「只允许读取以 file:// 开头的文件」,但实际逻辑等同于:
只要用户在 URL 里传 ?file=file://[文件路径],服务器就会读取并输出这个文件的内容。
编写文件读取命令:
html
?file=file:///etc/passwd

发现一个高权限用户lingmj,现在得想办法读取到lingmj用户的密码。
继续构造文件读写命令:
html
?file=file:///home/lingmj/.bash_history
发现存在编辑了.git目录下的config文件记录:

查看下这个config文件,拿到flag:
html
http://192.168.31.77/dashboard.php?file=file:///home/lingmj/.git/config

成功远程拿到lingmj用户:

5、代码审计
检查系统中已安装软件包的文件完整性:
html
dpkg -V

这么多改动的,靶机里有一些历史遗留的文件,其实也看不出来改动了什么。
方法(1):开动脑经,查阅sshd_config文件。
仔细想想,作者把靶机端口改成了2222,那说明/etc/ssh/sshd_config里面应该有猫腻,
进入查看:
html
cat /etc/ssh/sshd_config
代码审计发现藏了一组用户密码。

方法(2):Brupsuit爆破枚举修改的目录
靶机作者出题,肯定会修改一些目录,
利用SecLists 这个渗透测试字典库的LFI-gracefulsecurity-linux.txt字典
bash
cp /usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt /root/Desktop

用Brupsuit爆破一下:

6、用户提权
尝试切过去:
html
su - root
发现flag。

7、后话
比赛的时候,通过具体的修改的时间,来比较passwd和passwd-文件,确定哪个藏着猫腻:
html
ls -l --full-time /etc/passwd
ls -l --full-time /etc/passwd-

也可以在整个系统(/)中查找所有比 /etc/passwd 文件更新(修改时间更晚)的文件目录,同时过滤掉包含 sys|proc|var|run|share|dev|ltmp|git 这些路径的结果:
html
find / -newer /etc/passwd 2>&1 | grep -Pv 'sys|proc|var|run|share|dev|ltmp|git'
2>&1是 Shell 重定向语法,作用是:
- 2 代表标准错误输出(stderr)(比如 find 遍历无权访问的目录时会报错);
- 1 代表标准输出(stdout)(正常的查找结果);
2>&1:把错误输出重定向到标准输出,让错误信息也能被后续的 grep 过滤(否则错误信息会直接打印到终端,无法过滤)。
grep -Pv 'sys|proc|var|run|share|dev|ltmp|git'
|:管道符,把前一个命令的输出作为后一个命令的输入; grep:文本过滤工具;-P:启用 Perl 兼容的正则表达式(让 | 能在正则里表示「或」);-v:反向匹配 ------ 只保留不匹配后面正则的内容(即过滤掉包含指定字符串的行);'sys|proc|var|run|share|dev|ltmp|git':正则表达式,匹配包含sys、proc、var等任意一个字符串的行,-v会把这些行过滤掉(因为这些目录多是系统临时 / 动态目录,无需关注)。
为什么要过滤这些目录?
sys/proc/dev 是系统伪文件系统(内存中动态生成,不是真实磁盘文件),var/run/share 是系统运行时目录,遍历这些目录会产生大量无意义结果和权限错误,过滤后结果更精准。
更美化的写法:
bash
# 更优雅的写法:屏蔽错误输出,只保留正常结果过滤
find / -newer /etc/passwd 2>/dev/null | grep -Pv 'sys|proc|var|run|share|dev|ltmp|git'
