第三届上海市大学生网络安全大赛彼岸花战队Writeup

黑客与极客 / 2017年11月12日 14:26

互联网+

我在等风也等你,一个半文艺少年 wing

WEB web1

id=1这里这个参数下意识是有注入的,我折腾一会儿后发现过滤了很多东西,',=.group_concat(),uadatexml(),union我就只测试了这几个,没得办法,炸裂。QAQ。主要是你把=号过滤掉这就恶心了。又折腾一会儿,用到了上次在cos的圈子里分享的报错注入,这很ok。

ExtractValue这个函数原理我就不说了,懒。那下面就好办了,写个py爆表名。

有f14g表,那么肯定有f14g这个列但是返回来的长度有限制,无法看到全部的flag

是不是少了个},Bingo,这里做了限制。其实我一开始是这么干的。

是我想太多,然后我用mid函数ko掉了。

web2

这题没啥意思,坑了我半天,原意应该是考git泄露,但是直接在action那里传参flag就行了。

web3

Emmm,打开连接,悄悄咪咪地掏出的扫描器,我不会说是7kb表哥的,哈哈。有一个robots.txt,还有admin.php,file.php,index.php访问robots.txt,有一个code.zip下载打开后发现是用phpjm加密的。这里我要自黑下,我还是太年轻,在网上找了半小时解密网站后,都TM要钱。我只好花九块钱去解密了,其实virink给我一个脚本的,但是我编译失败,时间紧急,只能花钱了。九块钱,一个手抓饼和一瓶真果粒啊,呜呜呜呜呜~后面才知道p牛博客有解密的方法,次奥。

先看index.php

"; $private = auth_code(10, false); if(isset($_POST['private'])){ if($_POST['private'] === $_SESSION["pri"]){ header("Location:admin.php"); }else{ $_SESSION["pri"] = $private; die("No private!"); } } ?>

思路就是爆破随机数种子先进入后台,再php伪协议读flag,爆破脚本:

将得到的private传进去,进后台

出现 No Auth,看下源码

利用弱类型

绕过后源代码有这个,看看file.php源码:

Emmm,继续绕正则,post提交源码里给的auth

得到flag

MISC 流量分析

打开流量包,发现FTP获取了ssl解密文件key.log和flag.zip,flag.zip需要密码。这里是有两个flag.zip,一个假一个真,假的让你关注加密的数据包,找到解真的数据包的密码。。然后导入wireshark,将ssl解密。可能有很多人不知道怎么解密ssl,看链接:

https://www.trustwave.com/Resources/SpiderLabs-Blog/How-To-Decrypt-Ruby-SSL-Communications-with-Wireshark/

解密后得到一个好听MP3

这个MP3后面有杂音,那就这里面有东西了。观察频谱

Key:AaaAaaaAAaaaAAaaaaaaAAAAAaaaaaaa!

这个就是密码了。

Clemency

Emmm,这题辛苦队友了,为你俩打call。查询得知这个词是DEF CON CTF2017上拿出来的新的架构程序,特点有一字节9位、中端序存储等在官方链接 https://blog.legitbs.net/2017/07/the-clemency-architecture.html 下到官方给出的调试器,通过它可以运行题目文件clemency.bin,github上有很多IDA的反汇编脚本,我用的这个 https://github.com/cseagle/ida_clemency将脚本放入文件夹下,重新打开进行反汇编即可。注意处理器要选择提供的Clemency,而不是默认的MetaPC。

然后就可以得到反汇编的程序了:刚才的下载链接里有官方文档,讲解各个命令、和通讯等等模拟器在linux下使用,-d可以调试,调试状态下输入?可以得到各个操作的指令,与gdb基本类似:

直接运行提示需要flag文件,于是在同目录下创建flag文件,向其中写入内容模拟器自动将其作为输入接收,送入clemency程序

t单步运行,逐步跟踪可以发现,程序中对输入没有进行任何操作,而是直接在5b06处将输入转存入DataSent,发送区

调试器跟踪可以看到地址:

R02就是DataSent,字节方式可以看到内容不变最前面那一段乱码就是输出内容

但是模拟器输出的却并不是flag文件中的内容问题在于字节转换,可以看到,字节方式存储都是031,在原来的8位字节前补了一个0dt可以看到clemency的内存:

就是将31转成二进制后前补0,成为clemency的一个字节(9位),然后按照中端序存储方式(9-18,0-9,18-27)存储:

这样子生成clemency下的3个字节,作为x86架构下则是3个字节+3位,最后一个比特不变,第二个比特最后补上了一个0,第一个比特最后则补上了两个0十六进制表示时由于每个字符表示8位,所以最左边还多出了3位,由第一比特的高位决定值是0或1

按照这个思路可以得到clemency的内存表示,然后输出的时候将它们化成二进制,每8位做一个byte进行chr()

说到底就是每个比特前补0,然后重新分组输出

逆向脚本就简单多了,直接每9位读一次,刨掉第一位然后转字符即可:

得到flag

醒来看到大佬的WP就傻了其实github上的IDA脚本里面为了反汇编所以已经做了clemency的字节和端序转换,因此用IDA直接打开flag.enc就能得到flag……

杂项题硬生生被做成了逆向题OTZ

不过话是这么说,如果给出的bin里对输入进行了变换,这种方法就解不出flag了嘛,所以逆bin还是挺有必要的

Reverse Crackme

查壳发现有NsPack,百度下来脱壳机搞定IDA反编译看到算法

将两个数组Dump下来写脚本可得:

Juckcode

反编译不全,在OD中运行跟踪发现有大量花指令阻碍F5于是一步一步跟先打开”flag”文件,失败则报错,于是创建一个文件给他接着在sub_401350函数中进行了大量运算,后来看结果发现是b64再往下看,发现进行了四次b64+略微处理的操作观察sub_401350的call可以发现四次调用b64的地址:

B64的调用向上翻一点就能找到,分别是+0×40、<<7和-0x9e

得到4个字符串以后:

将它们进行了拼接:

然后对它进行b64decode以后,通过sprintf(“%x”)以十六进制形式写入字符串,最后每个字符+0×10后输出

加密看起来很复杂,解密就很简单了,因为得到-0×10再b64encode以后的合成字符串只要提取其中一个就可以解出明文了。于是写出逆变换脚本:

Pwn p200

和pwnablde.kr上的UAF一题很像,放一个分析很详细的网址:

http://blog.csdn.net/qq_20307987/article/details/51511230

Python脚本截图:

FLAG:flag{d41d8cd98f00b204e9800998ecf8427e}

CRYPTO Classical

Ld hcrakewcfaxr, f hofjjlhfo hlaxuc lj f krau ev hlaxuc kxfk zfj tjui xljkeclhfoor gtk dez xfj vfooud, vec kxu pejk afck, ldke iljtju. Ld hedkcfjk ke peiucd hcrakewcfaxlh foweclkxpj, pejk hofjjlhfo hlaxucj hfd gu acfhklhfoor hepatkui fdi jeoyui gr xfdi. Xezuyuc, OrmkO3vydJCoe2qyNLmcN2qlpJXnM3SxM2Xke3q9 kxur fcu foje tjtfoor yucr jlpaou ke gcufn zlkx peiucd kuhxdeoewr. Kxu kucp ldhotiuj kxu jlpaou jrjkupj tjui jldhu Wcuun fdi Cepfd klpuj, kxu uofgecfku Cudfljjfdhu hlaxucj, Zecoi Zfc LL hcrakewcfaxr jthx fj kxu Udlwpf pfhxldu fdi guredi. F btlhn gcezd veq mtpa eyuc kxu ofsr iew.

简单替换密码,这个网址解一下https://quipqiup.com/

0 -2.660 In cryptography, a classical cipher is a type of cipher that was used historically but now has fallen, for the most part, into disuse. In contrast to modern cryptographic algorithms, most classical ciphers can be practically computed and solved by hand. However, Ly?tL3fvnSRlo2?v?I?r?2?imSH??3?h?2Hto3?9 they are also usually very simple to brea? with modern technology. The term includes the simple systems used since Gree? and Roman times, the elaborate Renaissance ciphers, World War II cryptography such as the Enigma machine and beyond. A ?uic? brown fo? ?ump over the la?y dog.

中间有?,手动替换一下,得到中间的密文

LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9

根据上面那段话的意思,推测有多种加密混合,且含有凯撒加密,尝试后得到flag

FLAG:

flag{classical_cipher_so_easy}

rrrsa(300pt)

Emmm,这题赛后知道是一个朋友出的,可把我队友累坏了,喵喵喵。首先是md5扩展攻击拿到d和e,md5扩展攻击可以用hashpump使用方法参考猫神的Blog:

http://www.cnblogs.com/pcat/p/5478509.html

因为有\00,用pwntools发送一下

In [25]: r = remote('106.75.98.74', 10030) [x] Opening connection to 106.75.98.74 on port 10030 [x] Opening connection to 106.75.98.74 on port 10030: Trying 106.75.98.74 [+] Opening connection to 106.75.98.74 on port 10030: Done In [26]: r.sendline('1') In [27]: r.recv() Out[27]: 'Welcome to RRRSA world!\nThis is your token: 05526842a272d77c0127bb8498e6b28f\nThere are some options for you!\n1\. regenerated the key\n2\. get public key\n3\. get encrypted flag\nOption:\nGive me your username\n' In [28]: r.sendline('guest\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x ...: 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ ...: x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x0 ...: 0\x00root') In [29]: r.recv() Out[29]: 'Give me your token\n' In [30]: r.sendline('ab132f1d9527bf5b3462bf3793445ef7') In [31]: r.recv() Out[31]: 'e = 46957\nd = 10025376989936072505039846057794501927528527372889258010084848452510038807649542645621941049733296360842498419248238502260955678307712093819434394340825192942240119687104000822784840458919421408109463348050935040590639131709694956562902307700282901077904316938354738327613881299413301583191668119072266067323607557915389480709387932801041412286734924225174062576682617130883573819621747767084643860452305253784808003449679233782814523859265037579176957533528792695107856390842459149075530419196892200820080500188827979335536444828904802004680774584080047452127844771087533166226782205556391851994673794840231058701205\nThe value above will be abondanded!\nThere are some options for you!\n1\. regenerated the key\n2\. get public key\n3\. get encrypted flag\nOption:\n' In [32]: r.sendline('2') In [33]: r.recv() Out[33]: 'n = 20387234304119707098833140675408446018403579743136325337991175297064392719708959075417672940640353263872556332451584398712385595526189285413329039671825758303614797979617278014616419965764985105045085549973052561648029176202509465823229988423289774627134078665901149696841411120200528450129104840296063302729258608317996848949687652605396864503216474590022011494474497649444202919573418476237393901784554099955192285282481219500507832420354961654049125769191897538486714025092457423252770387770113256917810472623739379079270248363645792990847000724914678920104516941123685393052070011634490604188666638815420990989961\ne = 56167\nThere are some options for you!\n1\. regenerated the key\n2\. get public key\n3\. get encrypted flag\nOption:\n' In [34]: r.sendline('3') In [35]: r.recv() Out[35]: 'flag_enc = 9117402643222807234736271789727568529191310967976330598942232462281378829172836343779425447522285007951410481183181748194357691498004045054306192423916255361032155322568857346821049694745471566958873211488100694148184094892389945499802569413724583787084677168889869826495011071519572585851739669837748518771904718804990821526604062284812086540186012708878632098847601998826470843873205391733625671843587731874164373105525865590989611203756403681590884478335501918326210771899135987143689094956482603490830208734159960763543053119551109020561972608936094539539443384131019904721914894731300660673129968979152792711624\n' In [36]:

这里我们得到了一个失效的d和e,和新的e,加上一个没变的n,注意这里重新生成密钥的时候没有改变n的值,于是我们可以算出p和q,可以看这个网址:

https://www.40huo.cn/blog/get-pq-from-ned.html

求出此时的

P: 166233490022233314214163891617800371811366294486204044840682497791628376394365532057044821680576301672802014920135196388087127787931827566314911249599553142713256512394826796466501363720013082220333756146413145012697296255669934377601927323083555073751716695633582567537190245145619519940578889367461284734869 Q: 122642160141094104542426371805931882987463462419075544853352953614378889115633867527383779542767898235912013985983467106200896184997367788941940694209662026704139919488616107573602535191736869777442068893124795165755107933583983521919659511369611213311043417463716142975751446956954225120553325459707581036069 然后就能解出新生成的密钥 e = 56167 d=15362204095879401847061709060574922300227797558508709692164447310656725356103090336833054495819995214038104254426058121436151041705181140643942616590358779509033580125186355999298711738406385681998738685197883162117071213068506562964668983567555559875802439357219263243887318938883098004073817440060004756554528210438526503672149043949282120749724571051898791895704301486772848018710739145426735457041538387303347147695564877202828012051923740044221436165571799560348972323559832668588987907631750140725526134379727553520738398329851822769422712483949696426161736860301614178523038935096218726812089650977527635366759

然后用这个d去解密

from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes m = pow(flag_enc, d, n) print long_to_bytes(m) 得到FLAG: flag{Do_you_think_change_e_d_means_change_the_key

附:

差一题AK的队伍的WP 密码:wing

* 本文作者:幽夜寒香,转载请注明来自FreeBuf.COM返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。