概要#
難易度:困難
靶場地址:https://hackmyvm.eu/machines/machine.php?vm=Universe
初期アクセス#
簡単にスキャン
21 ポートは匿名ログインできない
1212 ポートは http で、nmap スキャン結果から user パラメータがあることがわかる
適当にアクセスすると user がランダムに変動することがわかる
直接 fuzz 大法で、ウェブページをすべてダウンロードしてみる
最後に 9 が成功した
さらに wfuzz も試したが、成功しなかった。しかし理論的には fuzz ツールでうまくいくはずなので、皆さんに試してもらいましょう~
Cookie Exec#
ウェブページの表示によると、cookie を渡す必要があるようだが、exec に直接値を渡すとエラーが出る
そこで base64 にエンコードして、コマンドを正常に実行できるようにする(この部分は考えにくいが、靶機には何のヒントもない)
ここでは wget rev.sh を使い、その後 bash rev.sh の方法を用いた
最後に問題のソースコードを添付します:
権限昇格#
ポート転送#
ss -plntu
を使うと、ローカルからしかアクセスできない 8080 ポートが見える
そこでポートを転送することにし、socat を使うこともできるが、ssh のリモートポート転送を使う方が適用性が広いので好む
これで直接アクセスできるようになる
LFI#
ページには明らかに LFI が存在するが、制限があり、いくつかのバイパスを試した後、二重書き込みバイパスができることがわかり、…//…//…// を使って上位ディレクトリに戻ることができる
忘れずにシェルを持っているので、まず tmp ディレクトリに php のリバースシェルを作成し、その後含める
http://127.0.0.1:18080/?file=..././..././....//tmp/shell.php
にアクセスすれば void ユーザーのシェルを取得できる
同様にソースコードも添付します:
Quasar 逆向#
sudo -l で開始
Quasar の他にも、このディレクトリには print.sh スクリプトがある
まず Quasar を外して具体的に見てみる
プログラムは password が正しいかどうかを確認し、その後 print.sh を実行する
今昔異なり、直接 ida+mcp 自動化逆向で完了です~
演算ロジックの再現#
逆コンパイルされたコードから、キー生成の数学演算は決定的であることがわかる。Python スクリプトを使って再現できる:
パスワードは 9740252204 です
書き込み競争#
print.sh スクリプトの内容は以下の通り:
このスクリプトは以下の操作を実行します:
mktemp
コマンドを使用して、/tmp
ディレクトリに一時ファイルを作成し、その名前はread-
で始まり、後に 5 つのランダムな文字が続きます。- 子シェル(
(
と)
で囲まれた)内で、まずumask
コマンドを使用してファイル作成マスクを110
に設定し、これにより新しく作成されたファイルは 556 の権限を持ちます。 - 主シェルに戻り、文字列 test を一時ファイルに書き込みます。
cat
コマンドを使用して一時ファイルの内容を読み取り、その内容をdata
変数に格納します。- 最後に、
eval
コマンドを使用してdata
変数内の内容を実行し、一時ファイルを削除します。
スクリプト内では、コマンドは逐次実行されるため、eval が実行される前に時間的な間隔が存在します。この間隔内に一時ファイルの内容を上書きできれば、任意のコマンドを注入して実行することができます。
別の端末を開き、次のコマンドを実行します
原理は非常に簡単で、死ループを使って tmp ディレクトリ内の一時ファイルを監視し、存在する場合はその中に権限昇格コマンドを書き込むというものです。
最後に競争に成功し、root 権限を取得しました!
後記#
Universe 靶機は非常によく設計されており、非常に包括的な靶機です。「困難」とマークされていますが、全体的な難易度は特に高くはなく、攻撃プロセスは比較的スムーズで、一歩ずつ進めば問題ありません。exec の部分で base エンコードが必要な点を除けば、他に特に考えにくい点はありません。特に最後の権限昇格段階では、print.sh
スクリプトの競争条件脆弱性が非常に巧妙に設計されており、全体の挑戦にさらなる魅力を加えています。総じて、これは非常に試す価値のある包括的な靶機です!