
Golang の go get コマンドにおけるリモートコマンド実行のエクスプロイト。
Golangの go get コマンドにおけるリモートコマンド実行のエクスプロイト。
go get でパッケージを取得するとき、Goはそのパッケージからコードを実行せずにビルドおよびインストールするように設計されています。その意図は、パッケージをまったく信頼せずに、Goパッケージを安全に取得・ビルド・インストールできるようにすることです。理論上は、これはGoツールチェーンにとって単純な成果のように思えますが、実際には難しい課題です。go get は内部で多くの処理を行い、パッケージ構成に大きく影響される方法で git や clang などのサードパーティ製ツールを呼び出します。これらの呼び出しの安全性を確保することは、Goがまだ完全には勝ち取っていない困難な戦いです。
cgoが有効な場合、「go get」中のビルドステップはホストのCコンパイラ(gccまたはclang)を呼び出し、Goソースファイルで指定されたコンパイラフラグを追加します。gccとclangはどちらも、コンパイラフラグによって指示された共有ライブラリプラグインをコンパイラにロードするプラグインメカニズムをサポートしています。つまり、Goパッケージリポジトリには、exploit.soファイルとともに、例えば // #cgo CFLAGS: -fplugin=exploit.so と記述されたGoソースファイルを含めることができ、ビルド中に攻撃用プラグインがホストのCコンパイラにロードされる可能性があります。gccおよびclangプラグインは、ホストシステムへのアクセスが完全に無制限です。
Go 1.8.7 より前、Go 1.9.x の 1.9.4 より前、および Go 1.10 のプレリリース版(1.10rc2 より前)では、-fplugin= および -plugin= 引数がブロックされていなかったため、gccまたはclangのプラグイン機能を利用して、ソースコードのビルド中に go get のリモートコマンド実行が可能です。Go 1.8.7 より前、Go 1.9.x の 1.9.4 より前、および Go 1.10 のプレリリース版より前。
エクスプロイトには、悪意のあるパッケージをホストする必要があります。TLSと有効な証明書チェーンを持つウェブサイトが必要です。これを行う簡単な方法は github を使用することです。
次に、悪意のあるプラグイン/.soファイルが必要です。exploit.c のコードが役立ちます。
注: exploit.c 内の次のコードを自分のコマンドに変更してください
void exploit() {
system("<Your CMD>");
}
注: このファイルを被害者のマシン/PCアーキテクチャに合わせてコンパイルしてください
次のコマンドを使用して exploit.sp をビルドできます:
gcc -shared -o exploit.so -fPIC exploit.c
完全なペイロードをGithubでホストしたら、パッケージリンクを被害者に渡せるはずです。