ctfshow web21(tomcat 认证爆破之custom iterator)
考点tomcat 认证爆破之custom iterator
题目基本把步骤都写给你了,这里讲下考点原理
在Tomcat认证爆破攻击中,"Custom Iterator"指的是攻击者使用自定义的迭代器来生成或尝试可能的认证凭证组合。这是一种针对Tomcat管理界面或其他受保护资源的暴力破解技术。
Custom Iterator的含义
- 自定义凭证生成:不同于简单的字典攻击,Custom Iterator允许攻击者定义特定的规则来生成尝试的凭证组合
- 灵活组合:可以针对目标系统定制用户名和密码的生成模式
- 针对性攻击:基于对目标组织的了解,创建更有可能成功的凭证组合
:::info
简单来说,就是传统的爆破通常是抓包对传参的参数进行爆破,但是Custom Iterator的话就是会给出一个自定义的认证组合
例如本题(使用账号密码登录):Authorization: Basic MTIzOjEyMw==
将该组合base64解码后即可得到
这样我们就能知道登录认证组合形式为:账号:密码
:::
猜测账号为admin,那么我们就只要对密码进行爆破
这里分两个部分进行爆破,前半部分admin:已知就直接写上去,对后半的密码进行爆破
有效负载处理那里特意加上base64编码是因为认证组合是base64编码
因为
所以不可以再进行url编码
爆破后找200状态码即可
ctfshow web22(子域名爆破)
这里题目其实是打不开的,但是我在网上找了相关wp进行学习,
知识点:域名收集是信息收集环节重要的一环,当前域名暂时没有漏洞时,我们可以通过子域名进行测试。
这里我们可以使用在线平台进行查询也可以通过工具layer爆破
仔细查找即可获得flag
ctfshow web23(代码审计编写脚本爆破)
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/
error_reporting(0);include('flag.php');
if(isset($_GET['token'])){$token = md5($_GET['token']);if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){echo $flag;}}
}else{highlight_file(__FILE__);}
?>
代码的意思就是取传递的token值,如果token的第二位强等于第十五位并且第十五位强等于第十八位,如果第二位取整与第十五位取整再与第十八位再除以第二位强等于第三十二位则会输出flag,根据以上代码编写脚本即可
import hashlib
import random
import stringdef find_token():while True:# 生成随机字符串token = ''.join(random.choices(string.ascii_letters + string.digits, k=8))md5 = hashlib.md5(token.encode()).hexdigest()# 检查第2、15、18位是否相同c2 = md5[1]c15 = md5[14]c18 = md5[17]if c2 == c15 == c18:# 检查第32位是否是 '3'if md5[31] == '3':print(f"Found valid token: {token}")print(f"MD5: {md5}")print(f"Positions: 2={c2}, 15={c15}, 18={c18}, 32={md5[31]}")return tokenfind_token()
由于随机生成字符串(md5值不可逆向只能暴力尝试),所以可能需要多生成几次才会生成符合条件的token值
ctfshow web24
```plain
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023
题目源码如上,<font style="color:rgb(77, 77, 77);">GET一个参数r,设置一个</font>[<font style="color:rgb(252, 85, 49);">随机数种子</font>](https://so.csdn.net/so/search?q=%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%A7%8D%E5%AD%90&spm=1001.2101.3001.7020)<font style="color:rgb(77, 77, 77);">为372619038,如果intval($r)===intval(mt_rand()),则输出flag</font>那么我们只要编写脚本```plain
<?php
mt_srand(372619038); // 设置随机种子
echo mt_rand(); // 生成并输出随机数
?>
特此说明:PHP 的 <font style="color:rgb(64, 64, 64);">mt_rand()</font>
用于生成随机数,但必须先调用 <font style="color:rgb(64, 64, 64);">mt_srand()</font>
播种。由于 <font style="color:rgb(64, 64, 64);">mt_rand()</font>
依赖种子 (<font style="color:rgb(64, 64, 64);">mt_srand</font>
),相同的种子会生成相同的随机数序列。所以结果都固定是<font style="color:rgb(64, 64, 64);">1155388967</font>
ctfshow web25
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){$r = $_GET['r'];mt_srand(hexdec(substr(md5($flag), 0,8)));$rand = intval($r)-intval(mt_rand());if((!$rand)){if($_COOKIE['token']==(mt_rand()+mt_rand())){echo $flag;}}else{echo $rand;}
}else{highlight_file(__FILE__);echo system('cat /proc/version');
}
Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023
hexdec()函数用于将十六进制字符串转化为十进制数;
<font style="color:rgb(77, 77, 77);">mt_srand(hexdec(substr(md5($flag), 0,8)));</font>
这里的意思是将flag先用md5加工一下,再截取前八个字符,再转化为十进制数,作为随机数的种子。从后面的 if((!$rand)){ ,需要为真才会执行后面输出 flag 的语句,
因此 $rand 需要为 0 ,而 $rand = intval($r)-intval(mt_rand()); 换句话说就是 intval($r) 需要等于 intval(mt_rand())。
我们令 r=0,就可以得到 $rand = -intval(mt_rand()),只要设置了 r,就会 echo $rand
既然知道了生成随机数的种子那么是不是就可以直接获取任意随机数去作为token获得flag了?显然是不能的
if($_COOKIE['token']==(mt_rand()+mt_rand()))
,这里有一个问题:<font style="color:rgb(77, 77, 77);">token==mt_rand()+mt_rand()</font>
看似 token 就是 mt_rand() 的两倍,但是并不能单纯的将 token = 2*mt_rand()
看一个简单的测试:
<?phpmt_srand(123456);$rand1 = mt_rand();$rand2 = mt_rand();echo $rand1,"\n",$rand2;
?>
可以看到同一个种子生成的两个随机数其实并不相同,所以编写脚本时需要特别注意
找到推出的种子了,在此需要特别注意,脚本里的 mt_rand()+mt_rand() 是第二次和第三次生成的随机数之和,因为前面已经使用过一次 mt_rand() 了。
<?php
mt_srand(1746467203);
$rand=mt_rand();
$rand1=mt_rand();
$rand2=mt_rand();
echo $rand,"\n",$rand1,"\n",$rand2,"\n",$rand1+$rand2,"\n\n";
mt_srand(3832921340 );
$rand=mt_rand();
$rand1=mt_rand();
$rand2=mt_rand();
echo $rand,"\n",$rand1,"\n",$rand2,"\n",$rand1+$rand2;
1593824915
ctfshow web26
这道题还怪有意思的,没有什么特别的知识点,就是利用burpsuite爆破身份证号
下面有两个超链接可以点,点进去看看
我们直接复制姓名身份证号进去是不行的,身份证中有一部分(7-14位)被星号了,说明出生年月被过滤了,那么就可以尝试进行爆破
这里偷偷说一声,其实也可以使用数值爆破,日期爆破的有效载荷版本问题不是八位数字,我这边直接找ai写了个脚本生成字典爆破,爆破很久但是还是爆出来了
unicode解码一下
ctfshow web28
题目给了提示
:::info
https://e3f9fb74-ede7-41a7-9339-8046fe8c6af2.challenge.ctf.show/0/1/2.txt
:::
开始还真没看到这个提示,写半天猜到爆破url但是不知道爆破哪,原来只要爆破目录
使用集束炸弹模式,因为两个目录需要利用笛卡尔积进行组合,而不是单纯两个参数使用两个字典进行爆破
这里有点问题不知道为什么没爆破出来,可能题目卡住了