HackingLab解密关writeup

夺旗攻略 2018-05-02

HackingLab解密关writeup

很考验知识面能力的关卡

前言

本人也是第一次写这种CTF的writeup,可能会存在一定的错误和遗漏之处,本攻略主要是提供解体思路,尽量会避免直接显示答案,请各位见谅,但是如果有一些直接显示在响应包中的key,本攻略则会直接显示。以下攻略部分代码和思路引用自其他人的博客或者网站,大部分以注明出处,如有遗漏,烦请告知,谢谢~

更新时间为2017.01.09,所有关卡题目攻略皆已补全

作者:古月蓝旻

解密关

Q1:


以管理员身份登录系统
分值: 450
以管理员身份登录即可获取通关密码(重置即可,无需登录)

补充说明:假设除了admin用户,其它用户的邮箱都可被登录获取重置密码的链接。

点进去看就是一个登陆界面,而且有重置密码的页面,除了admin用户,其他用户都可以直接生成一个重置密码的链接,短时间内用户重复提交两次生成不同的链接

http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=c15d254039b61703594f05be49835974&username=aaa
http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=309c59223d2c5fa51bbc8776f125c303&username=aaa

我们解密一下两次的sukey

1483689531
1483689605

差别很小,目测是基于时间戳的加密,获取一下当前时间

果然啊,拿burp跑一下就ok了

链接就是
http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=309c59223d2c5fa51bbc8776f125c303&username=admin

将sukey标记一下,payload在1483689605的基础上加1000(你自己的时间戳),然后md5加密一下,爆破即可

Q2:

邂逅对门的妹纸
分值: 150
小明想要认识对门的漂亮妹纸,但又不好意思直接去敲门,但是小明知道妹纸今年(2014年)上大三(提交wifi密码的md5 32位小写)

2014年大三,讲道理妹子的出生日期应该在1994年9月之前,但是查的不严啊,下载了cap握手包,拿水滴minidwep或者ewsa找个生日字典都能跑出来,然后md5加密即可

Q3:

万恶的Cisco
分值: 100
小明入侵了某企业内网,成功的从一管理员电脑获取了某型号交换机running-config文件,发现以下密码
02070D48030F1C294940041801181C0C140D0A0A20253A3B
请你帮他破解该密码。

我们的小明同学真是厉害,一会儿查妹子wifi密码,一会搞企业内网,真是人生赢家

这个python有一个cisco-decrypt 的库可以直接解密的,先pip安装一下


    
from cisco_decrypt import CiscoPassword

txt = '02070D48030F1C294940041801181C0C140D0A0A20253A3B'
result = CiscoPassword().decrypt(txt)
print result

Q4:

万恶的加密
分值: 50
这次小明通过某漏洞获取到了某huawei/h3c交换机的加密密码,请你帮他破解。
aK9Q4I)J'#[Q=^Q`MAF4<1!!

我们的小明同学又和华为正面杠上了,这道题目,参考了独自等待大兄弟的一篇文章,下载脚本运行一下即可

解密关万恶的加密过关攻略

这位哥们儿py功底很扎实

Q5:

喜欢泡网吧的小明
分值: 550
小明特别喜欢泡网吧,而这个月小明拿到了他第一个月的薪水,于是这次到了他平时最常去的网吧充了100元办理了一张会员卡,于是乎小明再也不用花钱上网了。

小明在读取数据的时候,女朋友来电话导致手机响了,而又不小心碰了一下子卡,导致卡片数据产生一个字节的错误
下面是读取后的dump文件
下载地址
你的任务是:找出小明免费上网的方法,并给小明的卡充值到200元。
现在赠送你一台刷卡机,可以查看你的卡片金额
刷卡机
成功纠正卡片产生的字节错误并充值到200元即可获得key
Good luck boy!

本人最喜欢的一道题目,前几个月和小伙伴拿acr122u和pm3撸了N多智能卡,这道题网上攻略不多,我来详细说一下

首先需要仔细审题,得到信息如下

1.卡中有一个字节的信息错误
2.小明卡里充了100元
3.过关条件是改正错误+金额改成200
4.小明有女朋友了...大三妹子?

首先如何打开这个dump文件,推荐使用ultraedit这个编辑器

打开之后发现有数据的行不多

我一卡是以为错误的一行是b0h的F0然后改成了FF,后来发现刷卡还是错误,如果这个是错误的话改了之后应该显示金额100,所以不是这里错了,而且这里虽然是keyA,但是整个扇区都没有值怎么可能是这里。。。

目光转向第0h,看看校验位有没有问题

在ic卡中,校验位存在的意义就是防止数据被人恶意篡改,如果用户只修改了数据,没有修改或者乱修改校验位,那么读卡器就读不了ic卡

0扇区0块前4个字节是卡的uid,是没有问题的

然而第5个字节是校验位,校验位的值就是前4字节依次异或XOR的值,拿出计算器,程序员模式,16进制,将AA xor 3E xor BA xor A4得到的值是8A,而不是88,将其改成8A就可以通过读卡器验证了,现在金额是100

然后就是修改金额

一般的ic卡喜欢将金额乘以一定数之后转为16进制,明文存储

然后这个数值常常是10或100,我们发现10000的16进制为2710

而第50h的数字为1027,这是因为ic卡在写卡的时候是低字节在前,高字节在后写卡的,我们读卡时应该还原为高字节在前,低字节在后的顺序。所以1027应该对应2710,所以这就是金额位

1027 0000 EFD8 FFFF 1027 0000 0000 0037

金额位也有校验位,而EFD8 FFFF恰好是1027 0000取反NOT所得

而后面的1027是金额的重复

最后的0037 是27和10异或所得,所以金额块的规则是

1027 0000 EFD8 FFFF 1027 0000 0000 0037

金额          NOT              10 XOR 27

所以改成200应该查查20000的16进制,改好的行就是这样

204E 0000 DFB1 FFFF 204E 0000 0000 006E

保存之后提交即可

Q6:

异常数据
分值: 200
小明今天去妹纸家开Party,而妹纸却给他出了一个谜语,说只要他能答出来,她就会答应小明一个要求.
这是妹纸给小明的谜语序列:AGV5IULSB3ZLVSE=
Tips:key就是解密结果

看起来很像base64加密的结果,解密的结果都是乱码,但是base64全部是大写字母的机率很小,尝试将字符串的一些大写字母改成小写字母,发现可以解密一部分了,所以这个字符串就是将一部分大写字母改成小写字母就Ok

参考一下40huo同学写的脚本,非常nice

解密关 writeup

# coding=utf-8
from base64 import *
import re

def dfs(res, arr, pos):
    res.append(''.join(arr))
    i = pos
    for i in range(i, len(arr)):
        if arr[i] <= 'Z' and arr[i] >= 'A':
            arr[i] = arr[i].lower()
            dfs(res, arr, i + 1)
            arr[i] = arr[i].upper()

arr = list('AGV5IULSB3ZLVSE=')
res = []

dfs(res, arr, 0)

res_decode = map(b64decode, res)

for i in res_decode:
    if re.findall(r'\\x', repr(i)):     # 使用  repr 防止转义 
        continue
    else:
        print i

Q7:

md5真的能碰撞嘛?
分值: 350
md5真的能碰撞嘛?其实有时候我们不需要进行碰撞得到完全一致的MD5

点击去之后发现,有一个code.txt是一段php源码

<?php
$flag=FLAG;
if(isset($_POST["password"])){
    $password=$_POST['password'];
    $rootadmin="!1793422703!";
    if($password==$rootadmin){die("Please do not attack admin account!");}
    
    if(md5($password)==md5($rootadmin)){
        echo $flag;
    }else{
        die("Password Error!");
    }
}
?>

大意就是找一个和!1793422703!md5值一样的字符串,且这个字符串不能是!1793422703!,讲道理32位MD5可表示16的32次方个字符串,是一个天文数字,但是世界上的数据量远超这个数字,所以MD5还是可以碰撞的,但是指定字符串的碰撞难度还是非常高的

但是php特性存在的缺陷导致MD5的“碰撞”成为可能,详细见

php的特性导致的安全隐患

由于!1793422703!字符串的MD5为0e332932043729729062996282883873就引发了这个漏洞,只要找一个字符串的MD5开头为0第二个字符为字母,就可以碰撞成功,这样的字符串还是有的

所以post提交password=240610708 或 QNKCDZO都可以拿到key

Q8:

小明爱上了一个搞硬件的小姑凉
分值: 350
小明爱上了一个搞嵌入式开发的小姑凉,于是特别想通过一种与众不同的方式向她表白,于是他在她的电脑桌面放了一个文件.
数据下载
Tips: 该文件为某逻辑分析仪抓包数据,请分析其中的内容,过关密钥为抓包数据内容的小写.

下载了一个后缀名是logicdata格式的文件啊,网上搜索了一下,下载安装saleae logic点开Decode protocols就能打开了

然后注意一下,里面的COMMA是逗号,自己转成,不要写成comma好吗

Q9:

有签名限制的读取任意文件
分值: 600
我们一直认为,只要消息签名了,salt不泄露且无法猜解到,即便是算法使用公开的加密算法,那么黑客也无法篡改信息.可是真的是这样嘛?
通关地址
Tips: MD5 Length Extension Attack!
Tips: 除已经告知的/etc/hosts文件外,若能读取到任意系统文件即可获取Flag.
Info: 增加密钥长度为32位

这道题目还是很有难度和意思的

一定要看提示

点进去就是一串32位字符串,很像是MD5,拿去cmd5解密无果

int(32)
f3d366138601b5afefbd4fc15731692e

点开之后有源码

int(32)
f3d366138601b5afefbd4fc15731692e<!--<?php
header("Content-type:text/html;charset=utf-8");
include "_flag.php";
include "salt.php";


$mysalt=SALT;

if(isset($_GET['filepath'])&&!empty($_GET['filepath']) &&isset($_GET['sign']) &&!empty($_GET['sign'])){
    myreadfile($_GET['filepath'],$mysalt,$_GET['sign']);
    
}
else{
    //降低一点复杂度
    var_dump(strlen($mysalt));
    testsign("/etc/hosts",$mysalt);
}


function myhash($message,$mysalt){
        return md5($mysalt.$message);
}
function checksign($message,$mysalt,$sign){
    if($sign==myhash($message,$mysalt)){
        return True;
    }else{
        return False;
    }
}
function myreadfile($filepath,$mysalt,$sign){
    $res=checksign($filepath,$mysalt,$sign);
    if($res){
        echo getfile($filepath);
    }
    else{
        echo 'sign error!';
    }
}
function testsign($filepath,$mysalt){
    echo myhash($filepath,$mysalt);
}


echo "<!--".file_get_contents(__FILE__);

题目的提示已经很清楚了,最关键的就是利用

长度扩展攻击(Length extension attacks)

要理解这个攻击需要一定的密码学知识,推荐两篇FB上的文章吧

科普哈希长度扩展攻击(Hash Length Extension Attacks)

深入理解hash长度扩展攻击(sha1为例)

理解了这两篇文章之后就可以开始攻击了,推荐的工具是hash_extender,推荐使用Ubuntu进行安装

git clone https://github.com/iagox86/hash_extender
sudo apt-get install g++ libssl-dev
cd hash_extender
make

编译安装完成之后就可以继续了

./hash_extender -f md5 -l 32 -d '/etc/hosts' -s 'f3d366138601b5afefbd4fc15731692e' -a '' --out-data-format=html

-d 原始数据

-f 代表加密方式

-l key的长度

-s 原始的hash值

-a 添加的值

--out-data-format 输出的格式

组合一下New string和New signature

最后payload如下

http://lab1.xseclab.com/decrypt1_53a52adb49c55c8daa5c8ee0ff59befe/md5_le.php?filepath=%2fetc%2fhosts%80%00%00%00%00%00%00%00%00%00%00%00%00%00P%01%00%00%00%00%00%00&sign=1b17d9594eb404c97c5090b11660ac63

访问即可拿KEY~


本文由 古月蓝旻 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论