荣幸参加了第二届的“网鼎杯”,虽然没有进入到线下半决赛中,但是这次已经算是突破了自我,拿到了自己还算满意的成绩了,也拓宽了自己的眼界,提升了不少,发布一下做出来的题的writeup吧,互相交流互相进步,为我国的网络安全事业更进一步!
0x00 签到
操作内容:
打开网页,发现是一个打怪兽的游戏,打到第五关,输了。。。那就看看源代码吧,一开始想着把关卡数量改了,这样就能直接通关了。但是发现没找到修改的地方,然后接着找js代码,发现在app.js中,有如下截图的代码,当游戏过关以后,会发送一个ajax请求,把链接放到postman中,POST参数传递我们队伍的token,直接就可以获取到flag了。
FLAG值:
flag{162c093223299304f310436579c5661f}
0x01 nmap
操作内容:
(注:部分截图为复盘写wp时候重新下发题目以后的截图,因此bp上显示的时间可能会不一样。)
查看网页源代码,发现flag位于/flag中
直接访问提示404,找不到/flag文件,换思路。
干脆先执行一下网页上的按钮吧:返回的链接地址是:result.php?f=fb864,提交的参数是f=fb864,考虑文件包含漏洞,尝试了php://input发现不行,换data://text/plain发现也不行,难道不是文件包含,换一种思路。
仔细看题目,名字是nmap,然后考虑到是否可以用nmap的-oN保存文件方法,把需要执行的恶意代码保存到文件中,然后去执行。
利用burpsuit抓包,得到scan按钮提交的请求,尝试修改host参数的内容:第一次尝试了<?php cat /flag ?> -oN shell.phtml,发现不行,似乎是被过滤了,那就再换一些方法
尝试了上面几种以后发现返回都是Hacker,那就是被过滤了啊,emmmm,难道所有php都被过滤了?那把最后的php改成phtml呢?
不返回Hacker了?!但是为什么访问不到shell.phtml呢?试试看再换一种,两边加上单引号试试:
这样直接就访问不了了,那也就是说,应该是php语法错了,重新整理一下语法,为了减少不必要的重复尝试,节约做题时间,在linux系统中,是支持正则的,某些忘记某个字符情况下,可以使用?* %等字符来替代,也就是可以用这个来代替:???/??? => /bin/cat
直接访问shell.phtml文件,搜索flag,前几个都不对,搜到最后一个,样子看着像,提交一下,成功。
FLAG值:
flag{65a89976-9a12-44de-8d06-5498a7c4ab7c}
0x02 simple
操作内容:
下载压缩包,名叫“放射”,解压打开文件,看到K1和K2,从谐音的角度来考虑,也就只有仿射变换了。
仿射变换方程为y=(ax+b)%26,因此尝试a=K1, b=K2进行计算。写个python执行以下,得到一张对照表。
将结果放到excel表中,方便对照查询,但是发现好多都对应了两个值(比如K对应了A列的F和S),emmmm,怎么办?首先能确定的,kgws对应的是flag,接下来就只能一个个试一试了,尝试到第3组终于对了。
FLAG值:
flag{c8d8ec65-db9f-44f5-8361-ab225c76bbaa}
0x03 key
操作内容:
Key_123,那就尝试一下密码123,打开了,解压到桌面,两张图,匙和锁,分别拖入010Editor,发现“锁.png”实际上是jpeg,然后跑一下jpg的脚本,发现最后有一段未知的二进制,一看文件头,PK,明显就是zip包.
将十六进制复制出来新建一个文件,保存成“锁.zip”。
打开发现需要密码,那密码肯定就在“匙.png”中了,
按照多年的比赛经验,png一般不会有太复杂的隐写,直接考虑图片的会不会高度被改了,将图片高度改成2000,保存。
打开图片,果然,有一串字符串
看到只有2956a这几种字符,考虑曼彻斯特编码,利用之前我自己写的曼彻斯特编码解密程序,将曼彻斯特编码转换成2进制,然后转成16进制,再将16进制转成字符串。(其中的曼彻斯特有3种标准,一个一个试过来的)
最后发现差分曼彻斯特编码接出来的字符最有可能是密码,直接输入提示不正确,说明其中两个字符是错误的,那么猜一下,Lov后面肯定就是e了,组成Love,最前面那个单词,akura,能想到的就是Sakura,结合百变小樱的库洛牌,Sakura就可以翻译为小樱,那就全都解释的通了,组成解压密码Sakura_Love_Strawberry,密码正确,解压得到flag.txt,里面就是flag,提交,成功。
FLAG值:
flag{061056cc-980c-4214-b163-230e5cd5c78e}
0x04 RUA
操作内容:
下载下来打开txt,发现有3串密文以及3串n,直接考虑低加密指数广播攻击。
将3个n和密文填入以前就用过的低加密指数广播攻击python脚本中,代码如下:
#coding:utf-8
from struct import pack,unpack
import zlib
import gmpy
def my_parse_number(number):
string = "%x" % number
#if len(string) != 64:
# return ""
erg = []
while string != '':
erg = erg + [chr(int(string[:2], 16))]
string = string[2:]
return ''.join(erg)
def extended_gcd(a, b):
x,y = 0, 1
lastx, lasty = 1, 0
while b:
a, (q, b) = b, divmod(a,b)
x, lastx = lastx-q*x, x
y, lasty = lasty-q*y, y
return (lastx, lasty, a)
def chinese_remainder_theorem(items):
N = 1
for a, n in items:
N *= n
result = 0
for a, n in items:
m = N/n
r, s, d = extended_gcd(n, m)
if d != 1:
N=N/n
continue
#raise "Input not pairwise co-prime"
result += a*s*m
return result % N, N
sessions=[{"c": 8024667293310019199660855174436055144348010556139300886990767145319919733369837206849070207955417356957254331839203914525519504562595117422955140319552013305532068903324132309109484106720045613714716627620318471048195232209672212970269569790677144450501305289670783572919282909796765124242287108717189750662740283813981242918671472893126494796140877412502365037187659905034193901633516360208987731322599974612602945866477752340080783296268396044532883548423045471565356810753599618810964317690395898263698123505876052304469769153374038403491084285836952034950978098249299597775306141671935146933958644456499200221696, "e": 17, "n": 18856599160001833299560082802925753595735945621023660831294740454109973698430284916320395522883536507135735383517926050963512440162483065097256884040938259092582892259657340825971260278387406398529168309426241530551396056450450728728601248269612166083300938497235910244979946020059799495231539400114422748104072550004260736766137354572252872437140063474603268146956570787143010441293268321641092743010805639953103578977668248726500636191043930770036787317928372179939360510179438436665591755940224156131460271763912868322774604558314812111335691108887319827579162188169744014973478052491398688611046800951698773893393},
{"c": 17388575106047489057419896548519877785989670179021521580945768965101106268068805843720622749203590810185213416901978773748832854888898576822477243682874784689127705334243899967896321836688567602323551986980634884700045627950473546069670440078998428940082620044462222475031805594211784370238038168894827559017562364252406425134530719911057780692073760058203345936344269833206906999625580911856011564697811258009937314511410514416706482571471852503756675411177080916350899445106002226392895645443215522671155311715637759618276305217468892076287376401516124640727839779731609203202530346427613422430202271506248285086956, "e": 17, "n": 21996468204721630460566169654781925102402634427772676287751800587544894952838038401189546149401344752771866376882226876072201426041697882026653772987648569053238451992877808811034545463363146057879646485465730317977739706776287970278094261290398668538232727000322458605289913900919015380904209692398479885177984131014170652915222062267448446642158394150657058846328033404309210836219241651882903083719822769947131283541299760283547938795574020478852839044803553093825730447126796668238131579735916546235889726257184058908852902241422169929720898025622336508382492878690496154797198800699611812166851455110635853297883},
{"c": 5170826942130658374627267470548549396328896108666717036999395626588154882531377393671593939192779292151584678688653835775920356845071292462816417186595460417761844407911946323815187102170021222644920874070699813549492713967666736815947822200867353461264579419205756500926218294604616696969184793377381622818381733352202456524002876336304465082656612634304327627259494264840838687207529676882041997761204004549052900816658341867989593333356630311753611684503882509990853456022056473296726728969894815574884063807804354952314391764618179147583447848871220103094864884798102542377747761263052887894135796051521881179607, "e": 17, "n": 22182114562385985868993176463839749402849876738564142471647983947408274900941377521795379832791801082248237432130658027011388009638587979450937703029168222842849801985646044116463703409531938580410511097238939431284352109949200312466658018635489121157805030775386698514705824737070792739967925773549468095396944503293347398507980924747059180705269064441084577177316227162712249300900490014519213102070911105044792363935553422311683947941027846793608299170467483012199132849683112640658915359398437290872795783350944147546342693285520002760411554647284259473777888584007026980376463757296179071968120796742375210877789},]
data = []
for session in sessions:
e=session['e']
n=session['n']
msg=session['c']
data = data + [(msg, n)]
print "Please wait, performing CRT"
x, n = chinese_remainder_theorem(data)
e=session['e']
realnum = gmpy.mpz(x).root(e)[0].digits()
print my_parse_number(int(realnum))
然后猜e的大小,从1开始一次次尝试,
e=1
这一看就不对,接着测试
e=2
也不对,继续,最终在e=17的时候,得到了flag,提交答案,成功(其实这里可以写循环来找e,但是一开始没有想到,觉得e应该不会太大,应该还挺快的,就在测试e的过程中浪费了一些时间)
FLAG值:
flag{83f4dc02-22ee-44dd-abf2-2fe64f87512f}
0x05 phpweb
操作内容:
访问一下网页,查看html源码,发现每5s会自动刷新一下,看不出其他的内容了,那就用web最简单粗暴的方法,直接抓包。看到抓包以后的http请求,从
func=date&p=Y-m-d+h%3Ai%3As+a的传参大概可以看出这是个php的date方法,func传的是一个php的函数,而p是这个函数需要执行的参数,因此可以利用file_get_contents得到源码:
查看php的源码发现过滤了很多方法,由于题目没有告诉我们flag的位置,那我们首要目的是查找到flag的位置,最好的办法就是利用php的system函数,因为system函数可以直接调用linux的终端命令。但是看到system被过滤了,我们首先需要考虑的是如何绕过这个过滤,从func这个参数传递system已经是不可行的了,看了一下反序列化的方法没有被过滤,那么我们就可以开始构建序列化的参数了。
根据源码中的这个Test函数,以及p和func参数,我们就可以大概尝试序列化以后的结构了:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:20:"find / -name *flag* ";s:4:"func";s:6:"system";}
Func调用unserialize方法,p的参数为序列化以后的结构,结构中的Test为源码中的Class名,p为参数,func为需要执行的方法。我们实际上执行的是system(find/ -n *flag*),其中*为通配符,为了能将系统中所有的flag都找出来。
执行完以后在一堆的文件中找到真正的flag:
最后执行最初的file_get_contents方法,将这个文件读取出来就可以拿到flag了
FLAG值:
flag{3cb7a47c-c147-4af1-92a9-6b36a23cf87e}
0x06 九宫格
操作内容:
将附件下载后发现有576张图片,都是二维码,使用脚本进行自动识别
获取字符串结果为
010101010011001001000110011100110110010001000111010101100110101101011000001100010011100101101010010101000110100001111000010101110111000101001011011011010101100101010100010110100101000000110001010110000011010001000001011001100111010101000110010010100010111100110111010001100110110001110001010010010100011000110001010010110100100001010001010101000101001000110101010100110011011000110011011110100100111101101011011110010110111101011000001100110011011001101110010110100110110001100001010011110111000100110100010110000011010001101011011011000111011101010010011101110111000101100001
转成字符串进制,对应的字符串为
U2FsdGVkX19jThxWqKmYTZP1X4AfuFJ/7FlqIF1KHQTR5S63zOkyoX36nZlaOq4X4klwRwqa
根据提示九宫格横竖斜角都是15,可以知道中间为5,四个角分别是2,4,6,8,对角线的数字从小到大排列组合就是245568,尝试各种解密方式,最后在rabbit解密中,得到对应的flag为flag{2c4fdc156fe74836954a05058c5d0382}
FLAG值:
flag{2c4fdc156fe74836954a05058c5d0382}
(本文为作者原创。转载请注明:转自carlzhang.xyz)