目录

  1. 1. 前言
  2. 2. flask?jwt?
  3. 3. flask?jwt?(hard)
  4. 4. ez_factors
  5. 5. 信息收集

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

NSSCTF ROUND#13 复现

2023/6/4 CTF线上赛 NSS
  |     |   总文章阅读量:

前言

唉,又爆零了,最简单的一道还因为自己少考虑到某些信息没做出来呜呜呜

贴个ph0ebus大佬的wp


flask?jwt?

session伪造

进入题目,发现是一个登录界面

image-20230615234324229

那我们就注册个账号登录试试

image-20230615234402614

登录之后出现一个拿flag的按钮

image-20230615234643908

点击后来到/getFlag路由,回显”不不不,你不是 admin“

image-20230615234830585

这个时候基本可以知道是session伪造了

拿一下cookie中的session解密看看

image-20230615235339072

猜测admin的_user_id为1

接下来就是去找密钥了

回到登录页面,发现这里还有一个忘记密码的按钮,右下角有个邮箱adm1n@flag.com(其实这个没什么用)

点击忘记密码来到/changePassword路由

f12发现secretkeyth3f1askisfunny(当时做的时候就是没f12看看才没做出来的555)

image-20230615235720924

于是丢进加密脚本,构造"_user_id":"1"的session值

注:因为python语法的原因,上面解出来的true要改成True

image-20230616002046193

带着session值来到/getFlag路由获取flag

image-20230616002403551


flask?jwt?(hard)

session伪造

和第一题一样是session伪造,但是密钥不在/changePassword路由下了

我们先注册个号登录看看,f12发现hint

image-20230712163122437

访问/wor

返回哼,我不会告诉你我藏哪里了,但是不能什么都不跟你说吧?哎,告诉你上次的登录时间吧: 2023-07-12 08:29:55+00:00

拿到现在的session并丢进脚本解密

python flask_session_cookie_manager3.py decode -c .eJwlzrFqQzEMheFXMZozSLKta_kFCoFuhY5BtmUSSJeb3Cnk3evS8Ry-4X_BZe7-uEJ97oef4HIbUGFE0cFGs5WufaYiqWNmyd3IKJtv2PJmU6UspFNyi32SjkIjZXaTEqdtjUxLYvMk2ZaS1grJwKgofVFBHYQeXWNB7dF9ynC1DivkePj-X8NrPm8_DvUF4e_49nEKxOF83AMjx4Clstacw8fnF7zfv5XkO1Y.ZK5kgw.BFaeOd4JTpB3UNKs3dkZp_Ia-G4

得到结果

b'{"_fresh":true,"_id":"d369d2a1fb8c9cf4864c05265ca1a15ae70b57af968a1f9f65b3cf19d81d452ea683fa7b1a9842ae465a9f66bb816d03906c81d609d10e3e93809c3eef6de9ac","_user_id":"2","time":{" d":"Wed, 12 Jul 2023 08:29:55 GMT"}}'

接下来就是要找密钥了,但是上哪找呢?这个时候就要考虑看看还有没有什么遗漏的点,除去已知的几个页面,此时我们还有debug页面的信息没看

因为session含有time属性,所以猜测这个时间是从session中读取,于是瞎改session弄出debug报错页面

image-20230712164510455

点开下面的注释,发现secret_key在这里,为hardgam3_C0u1d_u_f1ndM3????

带上secret_key把_user_id改为1,注意:这里外层要改为双引号包括里面改成单引号,true改为True不然会报错

python flask_session_cookie_manager3.py encode -s "hardgam3_C0u1d_u_f1ndM3????" -t "{'fresh':True,'_id':'d369d2a1fb8c9cf4864c05265ca1a15ae70b57af968a1f9f65b3cf19d81d452ea683fa7b1a9842ae465a9f66bb816d03906c81d609d10e3e93809c3eef6de9ac','_user_id':'1','time':{' d':'Wed, 12 Jul 2023 08:29:55 GMT'}}"

带着session值访问/getFlag即可获得flag

image-20230712171223964


ez_factors

换行漏洞+编码读取文件

题目描述:原生 Linux 因数爆破工具。flag在根目录

进入题目,点击Tool,来到/factors/114514

image-20230616211027121

可以发现这里把114514分解出因数了,猜测是命令执行

尝试利用换行符%0a进行命令执行,发现可行

直接tac /flag试试,记得/需要url编码不然会出歧义

image-20230616211643663

看得出来命令执行了,但是只返回了一串数字,猜测只会返回数字

那就尝试用编码读flag

这里使用od命令,用od -b以八进制形式输出文件内容,payload建议url编码一下以免出问题(

/factors/114514%0aod%20-b%20%2fflag

image-20230616212056732

扔进赛博厨子解码得到flag

image-20230616212217390


信息收集

CVE-2023-25690

进入题目

只回显了It works!,f12翻了一下没有什么有价值的信息

标题叫信息收集,所以我们直接用dirsearch开扫看看有什么

image-20230711211159721

访问index.php,显示了php源码

<?php
if(isset($_GET['file'])){
    echo file_get_contents($_GET['file']);
}
else{
    highlight_file(__FILE__);
}
?> 

get传参file来读取文件,这里读了几个可能的flag文件名都没有回显

应该没有这么简单,结合题目信息收集,我们再次f12看看有没有什么值得切入的点

image-20230711211538344

在网络中发现Apache的版本是2.4.55,尝试搜索看看有没有什么相关的漏洞

最后发现是CVE-2023-25690 Apache请求走私漏洞

要利用这个漏洞,我们得先读取conf/httpd.conf的内容

本题中该文件的路径在/usr/local/apache2/conf/httpd.conf

crtl+u格式化一下返回的内容,找到RewriteRuleimage-20230711212125475

这里的意思是

RewriteRule将所有以/nssctf/开头的请求路径重写为http://backend-server:8080/index.php?id=后接原始请求路径,并将请求代理到后端服务器

ProxyPassReverse用于修改响应中的Location头信息以确保重定向到正确的URL

于是修改一下参考文章中的利用姿势得到我们的payload

/nssctf/abc%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0a%0d%0aGET%20/flag

回显flag in here!!!Can you see it???,那就是要我们加个后缀

测试了一下,最终发现是flag.txt

image-20230711212859838

得到flag