htb Shoppy复盘
FLow

信息搜集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
└─# nmap -A -p- --min-rate=1000 -T4 10.10.11.180
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-12 22:56 PDT
Nmap scan report for shoppy.htb (10.10.11.180)
Host is up (0.38s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 9e:5e:83:51:d9:9f:89:ea:47:1a:12:eb:81:f9:22:c0 (RSA)
| 256 58:57:ee:eb:06:50:03:7c:84:63:d7:a3:41:5b:1a:d5 (ECDSA)
|_ 256 3e:9d:0a:42:90:44:38:60:b3:b6:2c:e9:bd:9a:67:54 (ED25519)
80/tcp open http nginx 1.23.1
|_http-title: Shoppy Wait Page
|_http-server-header: nginx/1.23.1
9093/tcp open copycat?
| fingerprint-strings:
| GenericLines:
。。。。
OS:=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R
OS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%
OS:RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 53/tcp)
HOP RTT ADDRESS
1 407.75 ms 10.10.16.1
2 407.83 ms shoppy.htb (10.10.11.180)

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

开了三个端口,9093端口访问后看起来像是配置文件,没找到什么有用的东西(后来看别的wp说这能看出这台机器有mattermost服务)

有个域名 shoppy.htb,扫子域名扫到mattermost,都添加到hosts里,mattermost这个域名需要账号密码登陆

shoppy.htb这个扫目录扫到登陆口/login,然后看官方对这个机器的介绍是存在Nosql注入

web

Nosql注入介绍以及payload

https://nullsweep.com/a-nosql-injection-primer-with-mongo/

https://xz.aliyun.com/t/9908?time__1311=n4%2BxnD0DuDRDci730%3DD%2FiaRmxjhhIWDRxD5t4%2BQx

https://book.hacktricks.xyz/v/cn/pentesting-web/nosql-injection#sql-mongo

是通过什么判断为Nosql注入的呢?(参考思路:https://arz101.medium.com/hackthebox-shoppy-64cbe52964ed

login发包是post发送username和password两个参数,按往常那样测试单引号,每次都需等待很久的时间然后返回504,直接sqlmap跑也无效,当我们随便访问一个不存在的目录时返回的是,这表明这个web在使用路由

所以可能是在使用Node.js,他存在使用Nosql注入漏洞绕过登陆限制,经过尝试,可以使用admin' || 'a'=='a绕过

登陆后跳转到/admin,主要是有个search功能点,没找到别的点了,搜索admin,给了一个json文件,里面有admin密码的哈希(爆破不出来)

但是不知道有没有别的用户,继续使用Nosql的payloadadmin' || 'a'=='a,这次多看到一个用户的密码

爆破后拿到账号密码josh:remembermethisway,成功登陆mattermost那个域名的登陆口,在聊天窗口中找到jaeger的账号密码,ssh登陆成功,拿到user

提权

sudo -l看到 (deploy) /home/deploy/password-manager,password-manager是个二进制文件,strings查看,貌似是输入正确的密码后能拿到deploy目录下的creds.txt

传到本地,ida看了一下,密码就在源代码里,Sample

输入正确密码后拿到deploy的密码

登陆deploy输入id,发现deploy在docker组里,有相关的提权方法

1
2
deploy@shoppy:/home/jaeger$ id
uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),998(docker)

docker提权参考链接

https://www.cnblogs.com/kqdssheng/p/18275541

有个docker提权的漏洞,大概思路就是创建一个新的容器,该容器中挂载了整个文件系统。在这个容器中,我将是根用户,因此可以完全访问容器中的所有文件(包括完整的主机文件系统)。

​ • docker run: 运行一个新的 Docker 容器。

​ • -v /:/mnt: 将宿主机的根目录 / 挂载到容器内部的 /mnt 目录。这样,容器可以通过 /mnt 访问到宿主机的文件系统。

​ • –rm: 容器在退出后会自动删除,不会保留临时文件或容器。

​ • -it: 以交互模式运行容器,并分配一个伪终端。这样你可以在容器中运行命令并看到输出。

​ • alpine: 指定使用 Alpine Linux 这个小型的 Linux 发行版镜像作为容器的基础镜像。

​ • chroot /mnt: 使用 chroot 命令将 /mnt 作为新的根目录,将容器的根文件系统切换到宿主机的根目录。

​ • bash: 运行 bash,给你一个新的 shell 环境。

于是我们可以成功读到root.txt,后续也可以通过读取shadow或是ssh私钥等方法来获得真正的宿主机root

总结

这个靶机还挺有意思的,主要涉及到Nosql注入和docker提权,都是第一次遇见,过后要好好消化一下这两个知识了。。

推荐阅读wp

https://0xdf.gitlab.io/2023/01/14/htb-shoppy.htm

由 Hexo 驱动 & 主题 Keep