FFRI Security x NFLabs. Cybersecurity Challenge For Students 2024 Writeup

文字を書くのが苦手なのであまりwriteupを作ったことがありません。めっちゃ丁寧に書いたつもりです。
# Pentest
## \[Easy\] WebAdmin
とりあえずやることといえばnmap！
ということでスキャン
```bash
nmap -sC -sV {targetIP}
```
このあたりのオプションをつけるとバージョンやら色々出てきます。
![Pasted image 20240919132333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/92640034-beab-6930-a80a-a285a97e4c5c.png)
空いているポートは22,80,10000
80番はhttpなのでブラウザからアクセス
![Pasted image 20240919132448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/32f27784-04b9-876a-9cb1-d93d82d628fe.png)
これはnginxというウェブサーバのデフォルトページです。
これ以上は何もわからなそうなので他を調査します。
10000番もhttpと書いてあるのでブラウザから{targetIP}:10000でアクセス
![Pasted image 20240919132741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/93a66800-f250-bf51-5bb0-f8b16c571c5d.png)
こんなログインページが出てきました。
ユーザとパスワードをツールで総当たりすることはペネトレではないイメージなのでadminやrootなど簡単なやつをいくつか試した後に別の方法を模索。
nmapの結果を見るとrobots.txtがあるようです。
robots.txtはページのアクセスに関する情報が記述されています。クローラーはこれを参照して特定のページにアクセスしないようにコントロールします。
とはいうもののアクセスできないわけではありません。
ここにユーザ名とパスワードなどに関する情報があることも考えてアクセス。
{targetIP}:10000/robots.txt
![Pasted image 20240919133444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/32d03322-a8ef-801b-811e-c106ef913bc9.png)
なし！
あと考えられるのはバージョン関係による脆弱性。
とりあえずwappalyzerを使って使っているものを確認
![Pasted image 20240919133622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/92216a66-11d6-8c21-1cf2-eca0e2a4c549.png)

特に気になるものがなかったので
nmapの結果に出てきたMiniServ 1.920をチェック。
CVEが見つかった。
CVE-2019-15107
Webminに関する脆弱性でRCEができるようです。
PoC(概念検証)をgithubから探す。
https://github.com/MuirlandOracle/CVE-2019-15107
```bash
$ python3 CVE-2019-15107.py -p 10000 {targetIP}
```
シェルをゲットした！
flagは/root/root.txtにあるらしい
```bash
$ python3 CVE-2019-15107.py -p 10000 {targetIP}

	__        __   _               _         ____   ____ _____ 
	\ \      / /__| |__  _ __ ___ (_)_ __   |  _ \ / ___| ____|
	 \ \ /\ / / _ \ '_ \| '_ ` _ \| | '_ \  | |_) | |   |  _|
	  \ V  V /  __/ |_) | | | | | | | | | | |  _ <| |___| |___
	   \_/\_/ \___|_.__/|_| |_| |_|_|_| |_| |_| \_\____|_____|

						@MuirlandOracle

		
[+] Connected to http://10.0.102.169:10000/ successfully.
[+] Server version (1.920) should be vulnerable!
[*] Server version relies on expired password changing feature being enabled
[+] Benign Payload executed!

[+] The target is vulnerable and a pseudoshell has been obtained.
Type commands to have them executed on the target.
[*] Type 'exit' to exit.
[*] Type 'shell' to obtain a full reverse shell (UNIX only).

# whoami
root
# cat /root/root.txt
flag{Expl01t_CVE-2019-15107}

```
# Malware Analysis
Flare-VMの環境構築はこちら
https://qiita.com/blend-tea/items/b99148e29ca5d7eeeb25
## \[Easy\] Pack
> 世の中には実行ファイルの動作を変えることなく難読化ができるツールがあるようです。 表層解析で得られる文字列を見てみると......?

問題名からpacker解除する問題かな～と推測
### 表層解析
Detect it easyでパッカーチェック
![Pasted image 20240919134623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/bde52565-0ee4-5bf7-d295-fe5c5e973c92.png)
UPXですね。
もしここでパッカーの情報が得られなかった場合検体がパックされているかどうかをエントロピーで判断できることがあります。
![Pasted image 20240919134807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/3681e491-ecc8-3095-1d7e-57726da0c778.png)

```bash
upx -d pack.exe
```
でパッカーを解除
続いて問題文から「表層解析で得られる文字列を見てみると...?」とあったので文字列を調査
Flare-VMでは右クリックのメニューにStringsがあります。
![Pasted image 20240919135059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/e79d31ab-2c6e-9fc1-02aa-c8736b94df8f.png)
Unicode Stringsが少し気になりますね。flagはなかった。
![Pasted image 20240919135138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/2506d2fa-61fd-3b2c-a834-42a5d5a56669.png)
そういえば実行していなかったので実行しましょう
![Pasted image 20240919135306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/26523287-3f3a-724a-82c2-5acf9c74387f.png)
フラグチェッカーですね。入力に対して正誤判定をしているあたりシンボリック実行をして解くのかな？
とりあえず静的解析
### 静的解析
Ghidraで解析
Flagをチェックしている関数をDefinedStringsから探します。
![Pasted image 20240919140226(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/5a970ebd-8a38-4350-3efe-6ad403f6c71f.png)
XREFをダブルクリックすることでこの文字列を使用している箇所にジャンプできます。
ジャンプ先の関数はFUN_00401300
フラグチェックの挙動を見る限りこの関数に指定した引数が分からないと厳しそう。
この関数はFUN_00401170で使用されていることがXREFでわかるのでジャンプ。
![Pasted image 20240919140648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/2e804280-fee0-4a01-2209-cb649c57937c.png)
面倒になったのとシンボリック実行じゃなさそうなのでデバッガで動的解析に移ります。

### 動的解析
分かりづらいと思うので動画もどうぞです。
https://youtu.be/_5LTJqE801Q
表層解析で出てきたCheat Engine?知らんな。
Binary ninjaを使います。有償ソフトですがFree版でもデバッグできます。
Flare-VMには入っていません。
ファイルを開いたらPlugin→Debugger→RunでEntry pointにとびます。
基本的な使い方は
F2：ブレイクポイント
F7：ステップ実行（call命令実行時関数にジャンプする）
F8：ステップ実行（call命令実行時1つの命令として実行する）
F9：ブレイクポイントまで実行

F7とF8の違いはカッコ内の通りです。
とりあえずステップ実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/84ac64f7-30d6-dac8-0ad3-93e826711fe0.png)
デバッガを検知されたようです。
ということでパッチを当てましょう。
gを押すと指定したアドレスへジャンプできます。0x401490にジャンプしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/24a5fd5b-4bce-f002-a047-c34810c81612.png)
ここにデバッガ検知をしている箇所があります。if文にカーソルを合わせ右クリックするとパッチを当てることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/b66aa5eb-b81d-6512-5eaa-49b08a663d1c.png)
パッチ適応し実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/75851dd4-7ed7-4281-8005-90571493427a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807852/021e5ad2-e99f-ad09-5701-4e3aa76b8212.png)
コングラ～

# 感想
開催期間が長いとはいえ平日はきびいっす。土日も入れてほしかったなぁ。Flare-VMの導入など「これ使うといいよ～」という導入があり優しかった。問題の難易度は優しくないと思うけど。
ジャンルにpentestやmalware analysisがあるのは新鮮で楽しかったです。
人生はじめてFirst Bloodできました。