基于 CVE-2018-10933
CVE-2018-10933 是某些版本的 libSSH 中发现的一个漏洞,可能允许潜在的无限制机器访问。该漏洞源于在身份验证过程中对数据包头的处理不当,发送一个带有 MSG_USERAUTH_SUCCESS 字节的精心构造的数据包可以让任何人绕过身份验证,从而获得对机器的完全访问权限。
因此,本挑战的基础是要求参赛者探查所提供的 Docker 镜像,发现该漏洞,利用它获得访问权限,然后在机器上找到隐藏在符号链接中的密钥。
有人通过端口 22 进入我的机器……
看起来他们甚至不知道我的凭据。
无论如何,他们创建了一个名字奇怪的文件,但现在不见了,
我想知道是否还有文件名的一些痕迹——
它可能象征着攻击者的某些东西……
你能找出他们是如何进入的,并帮助我找到文件名吗?
下面是预期解决方案的详细逐步说明:
注意,从挑战描述中可以看出,攻击者是通过端口 22 进入的,而端口 22 通常是 SSH 保留端口。还要注意,攻击者并未使用凭据进入。
由此,如果你查找过去关于无需凭据通过 SSH 访问机器的漏洞,MSG_USERAUTH_SUCCESS 字节的问题很可能是原因。或者,通过启动到端口 22 的连接,可以确定正在运行的 libSSH 版本,然后查找该版本的常见漏洞。
从描述中还可以看出,他们要找的文件名(标志)仅作为符号链接的目标存在。
现在知道可以利用此漏洞获得访问权限,可以自己编写或复制一个能运行该漏洞的示例脚本,并在目标机器上执行命令。我为该解决方案改编了一个漏洞利用脚本,并命名为 libsshauthbypass.py。
要运行此脚本并从机器获取标志(以演示镜像为例),可以运行类似以下的命令:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
该命令会产生类似以下的输出:
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
要为你的 CTF 使用本挑战的一个版本,强烈建议修改 Dockerfile,使用与默认提供路径不同的路径,更新 flag.txt 中的标志(但必须仍为一行),然后重建镜像。注意,可能需要为每次连接尝试托管一个新的容器,以防止有人运行破坏性命令影响所有参赛者。
要使用新标志重建 Docker 镜像(并测试它):
flag.txt./build_run <image name>[:<version number] <port number>./libsshauthbypass.py 或你自己的脚本,以正确的 payload 和你希望运行的命令与容器联系build_run 脚本提供的 shell 后,容器将被关闭并删除,但镜像会保留并标记为 <image name>概念验证: https://youtu.be/ELrOBm02ANg
挑战的逐步说明: https://youtu.be/Ii121piSZR0