在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