
1. 项目概述与核心价值最近在整理自己的渗透测试实战笔记翻到了DC-9这个靶机。它不像某些靶机那样上来就给你一个明显的漏洞入口而是需要你像侦探一样从零散的信息中拼凑出攻击路径。整个过程涉及了Web应用安全中非常经典的SQL注入漏洞以及一个相对少见的提权技巧——端口敲门。很多朋友在打这个靶机时要么卡在信息收集不全要么在提权环节找不到头绪。今天我就把整个通关流程结合我踩过的坑和总结的技巧从头到尾拆解一遍。无论你是刚接触渗透测试的新手还是想巩固Web渗透知识体系的朋友这篇指南都能让你对“漏洞串联”和“权限提升”有更深刻的理解。DC-9靶机模拟了一个存在多处安全缺陷的网站最终目标是获取系统的最高权限。它的核心价值在于它不是一个孤立的漏洞点而是一个完整的攻击链演练。你需要先通过前端的SQL注入拿到后台访问权限然后在后台发现新的攻击面最后利用系统层面的配置缺陷完成提权。这个过程完美复现了现实中攻击者“由外到内、层层递进”的渗透思路。接下来我们就从最基础的环境搭建和信息收集开始。2. 环境准备与初步信息收集2.1 靶机环境搭建与网络配置首先你需要一个虚拟化环境来运行DC-9。我通常使用VMware WorkstationVirtualBox也是完全可行的。将下载好的DC-9靶机OVA文件导入后最关键的一步是设置网络。务必将靶机的网络适配器设置为“NAT模式”或“仅主机模式”。我强烈推荐使用“仅主机模式”并在你的攻击机通常是Kali Linux上也配置一个同网段的仅主机网络适配器。这样做的好处是你和靶机构成了一个封闭的、不受外界干扰的测试环境避免了外部网络扫描的干扰也符合安全测试的伦理要求。启动靶机后它通常不会显示IP地址。我们需要找到它。在Kali Linux中打开终端使用netdiscover或nmap进行二层或三层发现。一个更稳妥的方法是先进行ARP扫描sudo netdiscover -r 192.168.56.0/24假设你的仅主机网段是192.168.56.0/24这条命令会列出该网段内所有活跃的IP和MAC地址。找到那个不属于你已知设备的IP很可能就是DC-9。记下这个IP地址我们后续所有操作都将针对它。注意有些虚拟化环境特别是VirtualBox的仅主机网络可能需要你手动配置一个静态IP给Kali并确保它能ping通靶机网段。如果发现网络不通检查一下虚拟网络的DHCP服务器是否已启用或者手动设置IP地址。2.2 全面的端口与服务扫描拿到靶机IP假设为192.168.56.105后下一步就是摸清它的“家底”——开放了哪些端口运行着什么服务。这里我习惯分两步走先快速扫描确认开放端口再针对性地进行深度探测。第一步快速全端口扫描使用Nmap的-p-参数进行全端口扫描但为了加快速度可以结合--min-rate。nmap -p- --min-rate 1000 192.168.56.105这个命令会相对快速地扫描所有65535个端口。等待片刻你会发现DC-9只开放了80端口。这很有意思一个只开Web服务的靶机往往意味着所有突破口都集中在网站应用本身。第二步深度服务与版本探测针对开放的80端口我们需要进行更细致的扫描获取Web服务器类型、版本甚至可能的目录信息。nmap -sV -sC -p 80 192.168.56.105 -oA dc9_web_scan-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更全面的检查。-oA: 将结果以所有格式普通、XML、可读输出到文件方便后续查阅。扫描结果会显示运行的是Apache httpd以及一些基本的HTTP头信息。至此我们确定了唯一的攻击入口运行在80端口的Web应用。3. Web应用渗透与SQL注入突破3.1 网站枚举与功能点分析在浏览器中访问http://192.168.56.105我们会看到一个名为“Jetstream”的酒店搜索页面。它的功能很简单通过城市名搜索酒店。作为渗透测试者我们看待每个输入框的眼光都应该是“怀疑的”。这个搜索框就是最典型的用户输入点也是SQL注入漏洞的高发区。首先进行常规的目录枚举看看有没有隐藏的管理后台、配置文件或备份文件。可以使用gobuster或dirb工具。gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak这个扫描可能会发现一些如/admin、/config.php之类的目录或文件但在DC-9中关键信息往往就在明面上。我们回到搜索功能尝试输入一个单引号‘进行最基本的注入测试。在搜索框输入‘并提交观察页面反应。如果页面返回了数据库错误如MySQL、SQLite的错误信息或者页面布局出现异常没有结果、空白页那么存在SQL注入的可能性就极大。在DC-9中你会看到页面返回了错误这证实了我们的猜想。3.2 SQL注入漏洞的手动利用与信息提取确认存在注入点后我们需要判断注入类型字符型还是数字型以及可用的查询方式。通过输入1‘ and ‘1’’1和1‘ and ‘1’’2并观察结果差异可以判断这是字符型注入。接下来使用union select语句来提取数据。但首先要确定当前查询的列数。使用order by语句进行猜测输入‘ order by 1 -- -页面正常输入‘ order by 2 -- -页面正常输入‘ order by 3 -- -页面正常输入‘ order by 4 -- -页面报错这说明原始查询返回了3列。-- -是SQL注释符用于注释掉后续的SQL代码确保我们的注入语句语法正确。现在我们可以构造union查询来获取数据库信息。首先查看当前数据库和用户‘ union select 1, database(), user() -- -提交后在页面的某个位置可能是城市名、酒店名或地址栏你应该能看到数据库名和当前用户。假设数据库名为Staff。然后我们需要获取数据库中的表名。在MySQL中信息存储在information_schema.tables里‘ union select 1, table_name, 3 from information_schema.tables where table_schema‘Staff’ -- -这条语句会列出Staff数据库中的所有表。仔细查看结果你可能会发现两个关键表StaffDetails和Users。Users表显然更吸引人。接着获取Users表的列名‘ union select 1, column_name, 3 from information_schema.columns where table_name‘Users’ -- -你会看到诸如id,Username,Password这样的列名。胜利在望最后提取用户名和密码哈希‘ union select 1, Username, Password from Users -- -页面上会显示所有用户的用户名和密码很可能是MD5哈希。将这些信息复制保存下来。实操心得在实际手动注入时页面可能不会把所有数据都美观地显示出来。有时数据会挤在一列或者只显示第一条。你可以使用group_concat()函数将多行数据合并到一个字段中显示例如‘ union select 1, group_concat(Username), group_concat(Password) from Users -- -。另外注意观察页面源代码CtrlU有时数据会藏在HTML注释或者某个隐藏的标签属性里前端没有渲染出来而已。3.3 密码破解与后台登录拿到MD5哈希密码后我们需要破解它们。可以使用在线破解网站如cmd5.com但如果哈希值加了盐或者比较复杂在线网站可能无法破解。更通用的方法是使用john或hashcat在本地进行破解。首先将用户名和哈希保存到一个文件中格式为用户名:哈希值例如admin:856f5de590ef37314e7c3bdf6f8a66dc user1:5f4dcc3b5aa765d61d8327deb882cf99 ...然后使用john进行破解john hashes.txt --wordlist/usr/share/wordlists/rockyou.txt --formatraw-md5rockyou.txt是一个常用的密码字典。运气好的话john会很快破解出部分弱密码。在DC-9中你很可能成功破解出admin账户的密码。现在回想之前目录扫描的结果或者尝试常见的后台路径如http://192.168.56.105/admin.php或http://192.168.56.105/login.php。找到后台登录页面使用破解得到的admin凭证登录。成功进入后台意味着我们突破了Web应用的第一道防线获得了更高级别的权限。4. 权限提升与端口敲门技术4.1 后台功能审计与新的攻击面发现进入后台管理界面后不要急于到处点击。首先系统地浏览每一个功能菜单用户管理、文件管理、系统设置、日志查看等等。在DC-9的后台你可能会发现一个“文件管理”或“查看日志”的功能它允许你读取服务器上的文件。这就是一个本地文件包含LFI或路径遍历的漏洞点。尝试读取系统关键文件例如/etc/passwd。在文件查看的输入框里尝试输入../../../../etc/passwd。如果成功你将看到系统用户列表。仔细查看/etc/passwd文件除了常规的root,bin等用户留意那些有登录shell如/bin/bash或/bin/sh的用户。你可能会发现一个不常见的用户名例如fredf。同时在读取其他文件如Web应用配置文件、日志文件时可能会发现一些有趣的字符串或密码提示。4.2 利用端口敲门技术开启隐藏服务在审计后台功能或读取文件时你可能会发现一个关键的线索一段关于“端口敲门”的注释或配置文件。端口敲门是一种通过向一系列特定端口发送连接请求“敲门”来触发服务器打开另一个隐藏端口的技术。它本身是一种安全机制但配置不当或秘密泄露就会成为漏洞。假设你在某个文件里发现了这样的序列7469, 8475, 9842。这意味着你需要按顺序向靶机的这三个端口发送数据包如TCP SYN包之后一个原本关闭的端口比如SSH的22端口才会临时打开。我们可以使用nmap或netcat来完成敲门。使用nmap的-p参数指定端口并用-Pn跳过主机发现因为端口是关闭的默认扫描会认为主机离线。nmap -p 7469,8475,9842 192.168.56.105 -Pn --max-retries 1 -T4这条命令会快速地向这三个端口发送探测包。或者使用netcatfor port in 7469 8475 9842; do nc -z 192.168.56.105 $port; sleep 1; done-z参数表示只进行扫描不发送数据。sleep 1是为了在两次敲门之间稍有间隔符合一些敲门守护程序的预期。完成敲门序列后立即使用nmap扫描SSH端口22是否开放nmap -p 22 192.168.56.105如果发现22端口突然从filtered或closed状态变为open那么恭喜你敲门成功现在你获得了通过SSH连接靶机的机会。4.3 SSH登录与系统内信息收集使用之前在/etc/passwd中发现的可能有shell的用户名如fredf以及你在Web渗透阶段通过文件包含找到的密码可能藏在日志或配置里尝试SSH登录。ssh fredf192.168.56.105输入密码如果成功你就获得了一个低权限的交互式shell。登录后的第一件事是信息收集。查看当前用户权限id sudo -lsudo -l命令至关重要它列出了当前用户可以用sudo权限执行的命令。在DC-9中你可能会发现用户fredf可以以root身份无密码运行一个文本编辑器命令例如/usr/bin/vi或者/usr/bin/nano。4.4 利用sudo权限完成最终提权如果能以root身份运行某些编辑器提权就变得非常简单。这是因为像vi、nano、vim、less这类编辑器通常可以在内部执行系统命令。以vi为例执行sudo /usr/bin/vi /tmp/test.txt。这会以root权限打开vi编辑器。在vi的命令模式下输入:!bash或:sh然后按回车。这时vi会启动一个新的shell。由于vi是以root权限运行的这个新启动的shell也就拥有了root权限。输入id命令确认你会看到uid0(root)。恭喜你已经拿到了DC-9靶机的最高权限你可以查看/root目录下的flag文件通常命名为root.txt或proof.txt作为通关的最终证明。注意事项利用编辑器提权是Linux系统提权中非常经典的方法。除了vinano可以通过按下CtrlR然后输入reset再按CtrlX来尝试获取shellless或more在查看文件时可以输入!bash来执行命令。关键在于sudo -l的列表任何允许以root身份运行且能交互或执行外部命令的程序都可能成为提权的跳板。5. 完整攻击链复盘与防御思考回顾整个DC-9的渗透过程它清晰地展示了一条从外部到内部、从Web到系统的完整攻击链信息收集通过网络扫描确定唯一入口80端口Web服务。漏洞发现与利用对Web搜索功能进行SQL注入测试手动利用注入漏洞提取后台管理员凭证。横向移动利用破解的密码登录后台发现文件读取功能。信息深度挖掘通过文件包含漏洞读取系统文件/etc/passwd发现系统用户名和端口敲门序列。权限提升准备利用端口敲门技术开启隐藏的SSH服务。系统权限获取使用发现的用户名和密码通过SSH登录利用配置不当的sudo规则如可root运行的vi完成最终提权。这个链条上的每一个环节都对应着现实世界中一种常见的安全配置错误或漏洞SQL注入根本原因在于未对用户输入进行过滤和参数化查询。弱密码使用了强度不足或常见的密码。不安全的文件操作后台功能未对文件路径进行严格校验导致路径遍历。敏感信息泄露将端口敲门序列等敏感信息明文存储在Web可访问的位置。不当的sudo授权给普通用户分配了不必要的、危险的sudo权限。对于防御者而言针对每个环节都有明确的加固措施使用预编译语句Prepared Statements防御SQL注入强制实施强密码策略并定期更换对所有用户输入进行严格的校验和过滤避免在代码或配置中硬编码敏感信息遵循最小权限原则谨慎分配sudo权限并定期审计。6. 常见问题与排查技巧实录在实战和教学过程中我总结了一些大家容易遇到的问题和解决方法Q1: Nmap扫描不到靶机IP怎么办A1: 首先确认靶机已启动完成。检查虚拟机的网络设置确保攻击机和靶机在同一网络模式如仅主机模式且网段相同。可以尝试在靶机控制台手动输入ip addr或ifconfig查看其IP。在Kali上也可以使用arp-scan -l进行更底层的发现。Q2: SQL注入时union查询的数据不显示在页面上怎么办A2: 这是非常常见的情况。首先检查你的注入语句语法是否正确注释符-- -后面是否有空格。其次尝试改变union select后各个字段的位置因为页面可能只渲染其中某一列。最重要的是一定要查看网页源代码。数据很可能被成功查询出来但前端脚本没有将其显示在可视区域而是放在了HTML注释、隐藏的input标签value属性或者某个div的>