靶机:
https://www.vulnhub.com/entry/tre-1,483/
下载(镜像):https://download.vulnhub.com/tre/Tre.zip
难度:
- 中
目标:
- 获得 Root 权限 + Flag
攻击方法:
- 主机发现
- 端口扫描
- 信息收集
- 进阶路径枚举
- EXP 代码改造
- 突破边界方法1
- 突破边界方法2
- 突破边界方法3
- 权限提升
主机发现
这次用 Vmware 来打开虚拟机,如果用 Virtual box 很可能出现获取不到 IP 的情况,那只能用进入单用户模式的方法来设置 IP 了
我就用 Vmware 来打开了,我的 kali 和 靶机都设置的桥接模式
sudo arp-scan -l
端口扫描和服务发现
sudo nmap -p- 192.168.31.24
发现开放了 22,80,8082 这三个端口
sudo nmap -p22,80,8082 -A 192.168.31.24
进行一下应用版本的扫描
发现 80 端口和 8082 端口都是 Web 服务,浏览器访问之后发现页面都一样,怀疑他们是同一个 Web 应用,那只能使用工具了
信息收集
sudo dirsearch -u http://192.168.31.24
访问 /adminer.php 这个路径发现是一个 Web 应用,可以登录数据库的,但是我们不知道数据库的账号密码
searchsploit adminer
搜索发现没有已知的可攻击的漏洞
http://192.168.31.24/cms/
这个 CMS 路径上也没有有价值的信息,都是静态的页面
http://192.168.31.24/info.php
这个路径就是正常的 phpinfo 显示
访问 /system
路径发现需要认证,使用弱口令 admin/admin
通过验证
发现 HTTP 头多了验证的东西:"Authorization":"Basic YWRtaW46YWRtaW4="
突破边界方法 1
searchsploit mantis
搜索看看有没有可以利用的代码,发现最新的版本有个 RCE
需要修改一下,在代码里加上验证的 HTTP 头,修改靶机和 kali 的 IP,然后路径要修改成 /system
运行代码成功获得 shell
python3 -c "import pty;pty.spawn('/bin/bash')"
升级一下 shell
在 Unix、Linux 等类 Unix 系统中,tty
是一个用于显示当前终端设备文件名的命令。“tty” 原本是 “Teletypewriter”(电传打字机)的缩写,在现代计算机系统中,它代表着用户与操作系统进行交互的终端设备。
当你在终端中输入 tty
命令并按下回车键后,系统会返回当前终端所对应的设备文件路径。例如,在本地物理终端上执行 tty
命令,可能会返回类似 /dev/tty1
、/dev/pts/0
这样的结果,其中 /dev/tty
系列表示物理终端,/dev/pts
系列表示伪终端(如通过 SSH 连接创建的终端会话)。
突破边界方法 2
对发现的新路径再进行路径的爬取
sudo dirsearch -u http://192.168.31.24/system/ --header="Authorization: Basic YWRtaW46YWRtaW4="
找到一个 config 路径
在 a.txt 里面发现了数据库的相关信息
# --- Database Configuration ---
$g_hostname = 'localhost';
$g_db_username = 'mantissuser';
$g_db_password = 'password@123AS';
$g_database_name = 'mantis';
$g_db_type = 'mysqli';
回到 http://192.168.31.24/adminer.php 下尝试登录成功
在这个表里发现有用户名和密码的字段
执行 SQL 语句来查询一下该表
select * from mantis_user_table;
发现一个很像密码的 Tr3@123456A!
记得之前扫描端口的时候是发现靶机的 22 端口是开放着的
ssh tre@192.168.31.24
使用该密码成功登录到目标靶机
突破边界方法 3
searchsploit Mantis
发现还有一个密码重置的漏洞,跨越了很多版本,从 1.3.0 到 2.3.0
查看这个 txt 发现漏洞出现在 verify.php 上
修改一下这个 URL 就能去到重置 administrator 管理员密码的页面
http://192.168.31.24/system/verify.php?id=1&confirm_hash=
将密码改成 123 之后去到 manage 界面也能发现这个疑似密码的 Tr3@123456A!
,然后通过 SSH 登录即可突破边界
提权
find / -type f -perm -o=w -user root -ls 2>/dev/null | grep -v "/proc" | grep -v "cgroup"
find
这是一个强大的文件查找命令,可根据用户指定的各种条件在指定目录下搜索文件和目录。
/
指定查找的起始目录,这里的 /
代表根目录,意味着命令会从整个文件系统的根开始查找。
-type f
-type
是 find
命令用于指定查找对象类型的选项,f
表示普通文件。此选项限定了查找范围仅为普通文件,会排除目录、符号链接等其他类型的文件系统对象。
-perm -o=w
-perm
用于根据文件的权限来筛选文件。-o=w
是一种权限筛选条件,其中:
o
代表其他用户(other),即除了文件所有者和所属组之外的用户。w
表示写权限。-
表示只要文件满足指定权限的任意组合即可。所以-o=w
表示查找那些其他用户具有写权限的文件。
-user root
-user
选项用于根据文件的所有者来筛选文件,root
是系统中的超级用户。此选项表示只查找那些所有者为 root
的文件。
-ls
-ls
是 find
命令的一个动作选项,它会以类似于 ls -l
命令的格式列出查找到的文件的详细信息,包括文件的权限、所有者、所属组、大小、修改时间以及文件名等。
2>/dev/null
这是一个重定向操作,其中:
2
代表标准错误输出(stderr),在 Unix 系统中,标准输入、标准输出和标准错误输出分别用数字 0、1、2 表示。>
是重定向符号,用于将输出内容重定向到指定的位置。/dev/null
是一个特殊的设备文件,也被称为 “黑洞”,所有写入其中的数据都会被丢弃。所以2>/dev/null
的作用是将命令执行过程中产生的错误信息重定向到/dev/null
,从而避免这些错误信息在终端中显示。
grep -v "/proc"
grep
命令:grep
是一个强大的文本搜索工具,用于在输入的文本中查找包含指定模式的行。-v
选项:表示反向匹配,即只输出不包含指定模式的行。"/proc"
:是要匹配的模式。在 Unix 和类 Unix 系统中,/proc
是一个虚拟文件系统,它提供了内核和进程信息的接口。这里使用grep -v "/proc"
是为了过滤掉查找结果中路径包含/proc
的文件信息,因为/proc
中的文件大多是动态生成的,可能不是我们真正想要查找的常规文件。
grep -v "cgroup"
同样,这也是一个 grep
命令的反向匹配操作。
"cgroup"
:是要匹配的模式。cgroup
(Control Groups)是 Linux 内核提供的一种机制,用于对进程进行资源限制和控制,在/sys/fs/cgroup
等目录下会有相关的文件和目录。使用grep -v "cgroup"
是为了过滤掉查找结果中路径包含cgroup
的文件信息,这些文件通常是与系统资源管理相关的特殊文件,可能不符合我们查找常规文件的需求。
发现 /usr/bin/check-system
DATE=
date '+% Y-% m-% d % H:% M:% S'``:使用date
命令获取当前的日期和时间,按照年-月-日 时:分:秒
的格式进行格式化,并将结果赋值给变量DATE
。echo "Service started at ${DATE}" | systemd-cat -p info
:将包含启动时间的信息"Service started at ${DATE}"
输出,并通过管道(|
)将其传递给systemd-cat
命令。systemd-cat
是一个用于将标准输入重定向到systemd
日志系统(journald
)的工具,-p info
选项指定日志的优先级为info
级别,表示这是一般性的信息记录。
grep -Ri "check-system" . 2>/dev/null
是一个在类 Unix 系统(如 Linux)中常用的文本搜索命令,用于在当前目录(.
表示当前目录)及其所有子目录下递归地查找包含字符串 "check-system"
的文件,并将匹配的行输出。同时,该命令会将执行过程中可能产生的错误信息进行重定向,避免在终端显示。
2>/dev/null
这是一个重定向操作。在 Unix 系统中,标准输入、标准输出和标准错误输出分别用数字 0
、1
、2
表示。这里的 2
表示标准错误输出,>
是重定向符号,/dev/null
是一个特殊的设备文件,也被称为 “黑洞”,所有写入其中的数据都会被丢弃。因此,2>/dev/null
的作用是将命令执行过程中产生的错误信息重定向到 /dev/null
,从而避免这些错误信息在终端中显示,使输出更加简洁。
./systemd/system/check-system.service:ExecStart=/bin/bash /usr/bin/check-system
是 systemd
服务单元文件(.service
文件)中的关键配置行,以下为你详细解读:
./systemd/system/check-system.service
这部分代表的是 systemd
服务单元文件的路径。通常,systemd
服务单元文件存放在 /etc/systemd/system
或者 /usr/lib/systemd/system
目录下,这里的 ./
可能表示相对于当前工作目录而言,文件名为 check-system.service
。systemd
是 Linux 系统中广泛使用的系统和服务管理器,服务单元文件用于定义和配置系统服务的启动、停止、重启等行为。
ExecStart=/bin/bash /usr/bin/check-system
这是服务单元文件里至关重要的配置项,其作用是指定服务启动时要执行的命令。具体解释如下:
ExecStart
:这是systemd
服务单元文件中的一个指令,专门用于定义服务启动时所执行的命令。在服务启动过程中,systemd
会依据ExecStart
所指定的命令来启动相应的服务。/bin/bash
:这是 Bash shell 的可执行文件路径。Bash 是 Linux 系统里最常用的 shell 程序,它能够解释和执行 shell 脚本。在这里使用/bin/bash
意味着要通过 Bash 来执行后续的脚本文件。/usr/bin/check-system
:这是一个 shell 脚本文件的路径,结合之前的/bin/bash
,systemd
会调用 Bash 来执行/usr/bin/check-system
脚本,从而启动相应的服务。你之前查看的/usr/bin/check-system
脚本,会在服务启动时被执行,它会记录服务启动时间并进入一个每秒输出 "Checking..." 的无限循环。
就是靶机重启的时候就会执行 /usr/bin/check-system 这个文件,我们在文件中插入恶意的反弹 shell 代码,然后重启靶机
sudo -l
发现可以不用密码以 root 的身份来执行 shutdown 命令
shutdown -r now
是在类 Unix 系统(如 Linux、BSD 等)中用于立即重启计算机的命令。shutdown
命令是系统管理工具,可用来安排系统关机、重启等操作。