CTFshow - JWT
web345
访问网站, 给了一个cookie, 发现是jwt,按f12发现叫我们访问/admin 访问/admin,重定向到/admin/ 抓包,使用burp上的jwt editor插件查看jwt内容


web346
同样给了jwt,这里alg字段为HS256,应该考爆破 使用 hashcat -a 0 -m 16500 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MTkxMSwiZXhwIjoxNzQzNzg5MTExLCJuYmYiOjE3NDM3ODE5MTEsInN1YiI6InVzZXIiLCJqdGkiOiI4NGZkOTI3NjczYmYwZTllYTg2ODQ4Y2UzMDBlMDEwZSJ9.y58GzeU6y3nwiZFg4r6Sf3WTxkRiG0EwKycE3Qvg5Jc" rockyou.txt或者jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MTkxMSwiZXhwIjoxNzQzNzg5MTExLCJuYmYiOjE3NDM3ODE5MTEsInN1YiI6InVzZXIiLCJqdGkiOiI4NGZkOTI3NjczYmYwZTllYTg2ODQ4Y2UzMDBlMDEwZSJ9.y58GzeU6y3nwiZFg4r6Sf3WTxkRiG0EwKycE3Qvg5Jc -d rockyou.txt 注:jwt-cracker通过npm install --global jwt-cracker指令下载 爆破出了密钥为123456
使用burp的jwt Editor伪造jwt:New Symmetric Key -》点击生成 -》将Key栏中的k改为base64url编码后的123456(即MTIzNDU2)点击确认,之后我们在请求时的jwt中点击下方的sign,选择我们刚刚创建的密钥,就可以进行签名
这里把sub字段改为admin,进行签名,访问/admin/即可获得flag
第二种做法是空加密:即把alg的内容改为"none",签名部分删掉,再把payload种的sub字段改为admin,访问/admin/即可获得flag
web347
获得jwteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzMzNiwiZXhwIjoxNzQzNzkwNTM2LCJuYmYiOjE3NDM3ODMzMzYsInN1YiI6InVzZXIiLCJqdGkiOiI5MjRiYmIyMDRkNmI4ZGZjOGQ0ZmM4MDRlMjJkYTQwMSJ9.sBdlLF3IbawILlyxVmFMqsW1vABtO80As4AQxeic4rM其实也是爆破,跟上题一样,甚至jwt都是一样的(密钥都是123456),只不过空加密不行了,用上题的爆破方法即可

web348
获得jwt,题目也直接说了爆破,直接爆破 jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzYyMCwiZXhwIjoxNzQzNzkwODIwLCJuYmYiOjE3NDM3ODM2MjAsInN1YiI6InVzZXIiLCJqdGkiOiI0ZjIyNDBhODMyYjdiMTViMDE1ODYzZWI1NTZmZmIyMSJ9.aeLiosexXXbs9tSmkUJp3FNCGlTUzRk2bY8dIP_hbdc -d rockyou.txt 得到密钥aaab 也可以用jwt-cracker的字符表爆破,因为密钥没规律,所以这种方法快点 jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzYyMCwiZXhwIjoxNzQzNzkwODIwLCJuYmYiOjE3NDM3ODM2MjAsInN1YiI6InVzZXIiLCJqdGkiOiI0ZjIyNDBhODMyYjdiMTViMDE1ODYzZWI1NTZmZmIyMSJ9.aeLiosexXXbs9tSmkUJp3FNCGlTUzRk2bY8dIP_hbdc -a 'qwertyuiopasdfghjklzxcvbnm'
用得到的密钥伪造签名访问/admin/得到flag
web349
这题给了源码
/* GET home page. */
router.get('/', function(req, res, next) {
res.type('html');
var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
res.cookie('auth',token);
res.end('where is flag?');
});
router.post('/',function(req,res,next){
var flag="flag_here";
res.type('html');
var auth = req.cookies.auth;
var cert = fs.readFileSync(process.cwd()+'//public/public.key'); // get public key
jwt.verify(auth, cert, function(err, decoded) {
if(decoded.user==='admin'){
res.end(flag);
}else{
res.end('you are not admin');
}
});
});
通过源码可知访问/private.key可获得私钥,访问/public.key可获得公钥 所以有两种做法 第一种:直接用私钥伪造RS256 使用burp的jwt Editor伪造jwt:New RSA Key -》Format选PEM -》点击生成 -》将Key栏中的内容改为我们获取的私钥内容,点击确认,之后我们在请求时的jwt中点击下方的sign,选择我们刚刚创建的密钥,就可以进行签名
改jwt中user改为admin,然后伪造签名即可
第二种:将alg改为HS256,用公钥伪造HS256 因为其在验证jwt时没有指定 方法为HS256,所以猜测jwt.verify这个方法应该是通过读取alg来确定验证方法,我们改为HS256,即对称加密,所以服务端指定验证的密钥为public.key, 我们也用pyblic.key中的内容进行签名伪造
web350
这题相对于上题的区别就只是访问不到私钥了,所以用上题的第二种方法 我们还是使用burpsuite的JWT Editor 先将密钥进行base64url编码


将jwt的user字段改为admin 然后点下面的sign,选择我们刚刚创建的密钥,进行签名

