
CVE-2018-10933 に基づく
CVE-2018-10933 は libSSH の特定のバージョンで発見された脆弱性であり、潜在的に無制限のマシンアクセスを許可する可能性があります。この脆弱性は、認証プロセス中のパケットヘッダの不適切な処理に起因し、MSG_USERAUTH_SUCCESS バイトを含む細工されたパケットを送信することで、誰でも認証を回避できるようになります。その後、マシンへの完全なアクセス権を得ます。
このチャレンジの基礎は、競技者に提供された Docker イメージを調査させ、この脆弱性を発見し、それを悪用してアクセスを獲得し、その後、マシン上のシンボリックリンクに隠されたキーを見つけることを要求することです。
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
以下は、意図された解法の詳細な手順です。
チャレンジの説明から、攻撃者が SSH 用に通常予約されているポート 22 を介してアクセスしたことに注目してください。また、攻撃者が認証情報を使用せずにアクセスしたことにも注目してください。
これから、SSH 経由で認証情報なしでマシンにアクセスする過去のバグを探すと、MSG_USERAUTH_SUCCESS バイトの問題がかなり可能性が高いです。あるいは、ポート 22 への接続を開始することで、実行されている libSSH のバージョンを特定し、そのバージョンに対する一般的なエクスプロイトを探すことができます。
説明から、探しているファイル名(フラグ)は シンボリック リンクのターゲットとしてのみ存在することもわかります。
この脆弱性を悪用することでアクセスが得られることがわかったので、独自のスクリプトを作成するか、このエクスプロイトを実行できるサンプルスクリプトをコピーして、ターゲットマシン上でコマンドを実行することができます。この解法のためにエクスプロイトスクリプトを改造し、libsshauthbypass.py と名付けました。
デモイメージの場合、このスクリプトを実行してマシンからフラグを取得するには、次のようなコマンドを実行するとよいでしょう。
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
これにより、次のような出力が得られます。
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
このチャレンジを自分の CTF で使用するには、Dockerfile を変更してデフォルトとは異なるパスを使用し、flag.txt のフラグを変更した上で(ただし、1行である必要があります)、イメージを再構築することを強くお勧めします。破壊的なコマンドを実行してすべての参加者に影響を与えることを防ぐために、接続試行ごとに新しいコンテナをホストする必要がある場合があることに注意してください。
新しいフラグで Docker イメージを再構築するには(およびテストするには)
flag.txt を新しいフラグで更新する./build_run <イメージ名>[:<バージョン番号] <ポート番号> を実行する./libsshauthbypass.py または独自のスクリプトを使用して、正しいペイロードと実行したいコマンドでコンテナに接続するbuild_run スクリプトが提供するシェルを exit すると、コンテナはシャットダウンされて削除されますが、イメージは残り、<イメージ名> としてタグ付けされます概念実証: https://youtu.be/ELrOBm02ANg
チャレンジのウォークスルー: https://youtu.be/Ii121piSZR0