我是狗汪汪 · 2014/03/14 17:53php
team:我是狗汪汪python
author:redrain,金龜子,ztz,hellove,cbuteng,琴心劍氣,salinelinux
描述算法
米特尼克剛到中國人生地不熟,想要找到一些中國的黑客朋友幫助他,他知道Capture The Flag奪旗競賽是黑客雲集的地方,因而也報名參加了中國第一次全國性的CTF大賽 @BCTF百度杯網絡安全技術對抗賽。而要進入BCTF圈交流,[email protected],才能找到一個密語。 複製代碼
解題mongodb
很簡單,微博上at了後會多個粉絲,查看簡介即有flag。chrome
描述shell
爲了收集更多參加 BCTF 大賽的中國黑客朋友的信息,米特尼克決定嘗試滲透進入 BCTF 的內網以獲取更多的信息。經過信息蒐集和網絡監聽,他發現了進入內部數據庫的一個入口代理,而且在代理入口處拿到了少許流量數據。正當他想繼續收集更多信 息的時候,他的行跡被發現並被踢出了網絡。 http://bctf.cn/files/downloads /misc200_23633b6b34ccf6f2769d35407f6b2665.pcap 入口代理:218.2.197.236:12345
複製代碼
解題數據庫
下載獲得pcap,丟wireshark如圖安全
端口53 使用工具TCPDNS Tools將本機做爲dns服務器服務器
ping目標域名或者使用nslookup -vc獲得ip nc鏈接後輸入所獲得ip得到flag
描述
米特尼克從FBI探員凱瑟琳郵箱中發現了一位中國安全專家發給她的郵件,郵件內容以下: 我在THU高校部署了一些誘騙系統,捕獲到了與米特尼克網絡攻擊行爲相關的數據,見附件,我以爲大家有必要深刻分析一下。固然若是大家沒有能力分析的話,能夠聘用我作技術顧問,不過個人諮詢費用很高哦。 附件:http://bctf.cn/files/downloads/dionaea.bistream.38930db22ae8cc6a2e589672ca39dca9 米特尼克很是急迫地想知道這位中國安全專家到底發現了什麼?
提示
[hint0]: 也許蜜罐replay會幫助你:) [hint1]: 好吧,再提示另外一段蜜罐log,只能說這麼多了. http://bctf.cn/files/downloads/kippo.ttylog.692ce16db7d940cb9ec52a8419800423
複製代碼
解題
描述中附件獲得一份dionaea的蜜罐log,可是未再win下搭建成功,後來給力hint是一份linux下的蜜罐系統kippo的log,成功搭建並重現攻擊過程
kippo中axel沒法使用,下載只能經過curl,經過復現找到了後門地址2792326331/fool
解密後獲得真實ip:166.111.132.187 將後門下載http://166.111.132.187/fool 接下來就交給妹子逆向這個後門了:) 這裏的這個跳轉不能讓它跳
下面是加載一些枚舉進程和模塊須要用到的函數
提權操做
挨個枚舉進程,檢查有沒有百度殺毒的進程。
這裏咱們只須要將這幾個跳轉改了就行了。
過了那個百度殺毒進程的驗證那兒。Key就本身跳出來了呢
描述
據傳說,米特尼克進任何門都是不須要鑰匙的,不管是金鎖銀鎖 仍是密碼鎖。使用僞造身份在BAT安所有門工做的時候,有一扇帶着密碼鎖的大門吸引了他的注意。門後面到底藏着什麼呢?米特尼克決定一探究竟。 http://bctf.cn/files/downloads/passcode_396331980c645d184ff793fdcbcb739b.py 218.2.197.242:9991 218.2.197.243:9991
複製代碼
解題
下載源碼後閱讀
#!python
#-*- coding:utf-8 -*-
import base64,binascii,zlib
import os,random
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def abc(str):
return sha.new(str).hexdigest()
def bin2dec(string_num):
return str(int(string_num, 2))
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
def dec2bin(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def hex2bin(string_num):
return dec2bin(hex2dec(string_num.upper()))
def bin2hex(string_num):
return dec2hex(bin2dec(string_num))
def reverse(string):
return string[::-1]
def read_key():
os.system('cat flag')
def gb2312(string):
return string.decode('gb2312')
answer='78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375'
func_names = ['fun1', 'fun2', 'fun3', 'fun4', 'fun5', 'fun6', 'fun7', 'fun8', 'fun9']
f={}
f['fun1']=reverse
f['fun2']=base64.b64decode
f['fun3']=zlib.decompress
f['fun4']=dec2hex
f['fun5']=binascii.unhexlify
f['fun6']=gb2312
f['fun7']=bin2dec
f['fun8']=hex2bin
f['fun9']=hex2dec
def check_equal(a, b):
if a == b:
return True
try:
if int(a) == int(b):
return True
except:
return False
return False
def main():
print "Welcome to Secure Passcode System"
print "First, please choose function combination:"
in1=raw_input('f1: ')
f1='fun'+in1[:1]
in2=raw_input('f2: ')
f2='fun'+in2[:1]
in3=raw_input('f3: ')
f3='fun'+in3[:1]
in4=raw_input('f4: ')
f4='fun'+in4[:1]
if f1 not in func_names or f2 not in func_names or f3 not in func_names or f4 not in func_names:
print 'invalid function combination'
exit()
try:
answer_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](answer))))))
except:
print "Wrong function combination, you bad guy!"
exit()
if len(answer_hash) == 0:
print 'You must be doing some little dirty trick! Stop it!'
exit()
usercode = raw_input('Your passcode: ')
try:
user_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](usercode))))))
if user_hash == answer_hash:
if check_equal(answer, usercode):
print "This passcode has been locked, please use the new one\n"
else:
print "Welcome back! The door always open for you, your majesty! "
read_key()
else:
print "Sorry, bad passcode.\n"
except:
print "Sorry, bad passcode. Please try again."
if __name__ == '__main__':
main()
複製代碼
添加continue,跑了一下,結果是fun3,fun5,fun1,fun4 媽蛋,結果是This passcode has been locked, please use the new one 發現read_key()
,使用python的 zlib.compress函數
#!python
usercode= hex2dec(reverse(binasci.b2a_hex(zlib.compress(f[f1](f[f2](f[f3](f[f4](usercode)))),4))))
複製代碼
描述
逃離到中國的米特尼克與之前的老朋友都失去了聯繫,這讓他常 常懷念逝去的時光。在一次潛入某著名外企嘗試獲取重要資料的行動中,米特尼克尚未拿到目標文件就不幸被保安發現了。在逃離的過程當中,他闖進了一個辦公 室,結果驚奇地發現本身二十年前的老朋友 Tupper 就在眼前。更神奇的是,Tupper 知道米特尼克須要什麼,給了他想要的東西而且幫助他成功脫逃。你知道米特尼克拿到的信息是什麼嗎? http://bctf.cn/files/downloads/meeting-tupper_baaa58809f2a0435cb5f282ce4249fdf.txt
複製代碼
解題
二人對話應該是Tupper的自指公式中的k值,谷歌後瞭解到Tupper自指公式是用來繪製圖的 再wiki上找到了的程序跑不出後面兩段k值,後來又再csdn上找到了一段程序解決 使用程序以下:
#!python
def Tupper_self_referential_formula(fd, k):
size = 61
def f(x,y):
d = ((-size * x) - (y % size))
e = reduce(lambda x,y: x*y, [2 for x in range(-d)]) if d else 1
f = ((y / size) / e)
g = f % 2
return 0.5 < g
for y in range(k+size - 1, k-1, -1):
line = ""
for x in range(0, 1000):
if f(x,y):
line += "@"
else:
line += " "
line += '\n'
fd.write(line)
if __name__ == '__main__':
d = k值
e = k值
f = open('ans2','w')
Tupper_self_referential_formula(f,d)
Tupper_self_referential_formula(f,e)
f.close()
'''
row = 17
print len(str(a))
ans = str(bin(a))[2:]
print len(ans)
col = len(ans) / row + 1
print col
f =open('ans1','w')
for i in range(0,row - 1):
f.write(ans[col * i: col * (i+1)])
f.write('\n')
f.close()
'''
'''
row = 61
print len(str(d))
ans = str(bin(d))[2:]
print len(ans)
col = len(ans) / row + 1
print col
##f =open('ans1','w')
for i in range(0,col):
f.write(ans[row * i: row * (i+1)])
f.write(ans[row * i + row: row * (i+2)])
f.write('\n')
f.close()
'''
複製代碼
使用註釋的代碼速度會更快
解出flag: p1e4se-d0nt-g1ve-up-cur1ng 。。。不要放棄治療麼。。。我已經病入膏肓了
描述
米特尼克須要用社工辦法拿到THU安全專 家的磁盤鏡像以瞭解更多信息,因而他收買了THU專家的博士生,來到BJ市須要與博士生當面聯繫。可是,來到BJ市以後遇到的第一個問題就是交通。BJ市 人滿爲患,上下地鐵時人們也不先下後上,而是互相擠。左邊的人想擠到右邊下車,右邊的人也想擠到左邊上車。你做爲米特尼克在BJ的一位小夥伴,可否幫他和 全部乘客設計一個儘可能少移動次數的方案,使得須要上車的人都上車,須要下車的人都下車。 218.2.197.242:6000 or 218.2.197.243:6000
複製代碼
解題
nc 連上去,須要爆破 4 位給定的 sha1, 每次進入系統的須要爆破的內容不一樣,有時間限制。 直接 4 個 for 循環,時間複製度爲 O(62^4) python 沒法在規定時間內完成。 採用分佈式爆破或者多進程 接着 讓全部的 L 移動到右邊,全部的移動到左邊,中間是空格 4 種狀況 空格跟左邊相鄰的位置交換 空格跟左邊隔着的一個位置交換位置 空格跟右邊相鄰的位置交換, 空格跟右邊隔着的一個位置交換。 而後要求用最小的步數,採用 bfs。 而後運行跑 100 輪出現 flag
描述
米特尼克路被各路大神追查痛苦飢渴難耐。順手撿起身邊一個水杯,打開瓶蓋,竟然寫着one more,實在太神奇了。 http://bctf.cn/files/downloads/re_100.8cd4820cbd1300bda951e694298f73a0
複製代碼
解題
放入OD以後,發現有反調試,要把這幾個反調試的跳轉改了就行了。
而後把messagebox nop掉
而後運行,等他執行完畢,就能夠看到key了。Th3_H4rd3st_H3r3
首先,下面是將這些數字從字符轉換成內存中的數字。
將這些數字初始化到內存中,若是遇到內存不是FF的那麼就跳想下一個內存地址。
初始化完畢以後就是這樣了:
最重要的部分就是下面這個算法: 下面這個算法是求整數商,MagicNumber是0x66666667,一共移位了34位,帶入公式o=2^n/c C是MagicNumber,n是34,這樣就能夠求得o爲0xA,也就是10進制的10,那麼下面就是用一個數來對10求商。
再下面也是同樣的。用上面求商那個式子的被除數來對0xA求餘。也就是求模。
而且要知足下面的比較
上面的這部分算法總結一下 過程就是
(bit6*bit7/10+bit7*1)%10==bit1
比較第二位和bit6*bit7%10的關係
比較bit6*bit7/10+bit7是否是大於等於10
因爲第二次是8能夠肯定第6位必定是0.1.2中的一個
若是都成立第二位鑑於bit6*bit7%10
複製代碼
以後第二次循環開始,第7位的部分變成固定值8。再次知足上述條件並知足最後減處來的小於等於1 這裏就根據關係湊數字吧 湊了幾組199XX11,697XX25等,而後根據下面去肯定
好下來下面這個1404這個地方,這裏call了一個00CF1000 此處這個call能夠用黑盒的辦法處理。
上面這個[ebp-0x58] 肯定是否是運算結果大於100,失敗 bx的值和以前輸入的值有關 bl位低位4數 這裏有點忘記了,動態調一下。 而後就很容易去定了第8位和第9位爲09 大不了湊幾組就知道規律了比分析快多了。 下面這個循環就是在比較剩餘的那些數字了。不對的地方改一下就行了。
最後的結果是:6970825096996108
首先在xp裏面將虛擬機MBR覆蓋爲神祕系統的MBR,而後用IDA+VM調試。 在7C00斷下來:
下面是在計算aLoading___|的長度爲
讀取屏幕上光標的當前位置
下面是顯示Loading這個字符串。
下面使用int13中斷來讀取系統扇區 讀系統的第二個扇區開始讀A個扇區。
下圖是第二個扇區的一部分。確實不知道是什麼。。。先日後看吧。
將這些數據讀到0x8000處
下面是在屏幕上面輸出Access code:
繼續,這裏要求你輸入一個0-9的數字
下面是在解密剛剛從第二扇區讀入的數據
解密完畢以後,就會跳到8000去執行。若是咱們這時候輸入的不對的話,那麼就會錯了。
這裏應該是和系統進入的時候同樣的,首先會在8000處有一個段跳轉指令,而後繼續執行
而後咱們看看MBR開始的地方,看上去很類似啊。。
咱們試一下吧。
0xDA ^ 0xEB = 31
0x3B ^ 0x08 = 33
0x71 ^ 0x42 = 33
0x74 ^ 0x47 = 37
複製代碼
咱們再試試 1337,就進入系統了。
若是咱們用記事本打開這個文件的話,能夠看到:
下面使用了int16的0號功能,也就是從鍵盤上讀ASCII碼
下面這個地方就是解析咱們輸入的字符。
輸入的大於2位的話,就會判斷是否是wr 若是是wr的話,就匹配參數
而後正式進入wr的處理函數 這裏產生隨機數
寫入文件
下面是對文件名稱進行加密
保存加密後的文件名字
根據這個存放文件名字的函數,咱們能夠知道,他將這個文件按照必定的格式保存在內存中的。
首先一個操做系統要有適當的格式來保存文件,若是一個文件是按照這種格式來保存的話,那麼系統中的全部文件都是按照這種格式來保存的,咱們能夠經過咱們寫入的文件來逆向出系統保存文件的方式。
後門再分析文件存儲的加密算法,而後咱們在內存中搜索符合格式要求的內容,那麼這一塊內容就是要找的文件。而後咱們再根據逆出來的加密算法就能夠解密文件了。
最後解密出的文件是 Dear CTFer, if you see this message, you have completely unerstood my OS. Congratulations! Here is what you want: BCTF{6e4636cd8bcfa93213c83f4b8314ef00}
描述
米特尼克拿到了BAT數據中心的口令後,爲了確保口令被更改後仍能登錄數據中心,他從一位小夥伴那拿到了一個後門程序植入進了服務器。這個後門程序沒有任何說明,可是米特尼克迅速找到了使用方法。後門程序:http://bctf.cn/files/downloads/backdoor_844d899c6320ac74a471e3c0db5e902e 安裝地址:218.2.197.250:1337 安裝地址2:218.2.197.249:1337
複製代碼
解題
主要思路: 通過分析,發現程序的主要功能是將用戶輸入與<baidu-rocks,froM-china-with-love>
輪番異或並判斷結果是否等於n0b4ckd00r。
若是這個判斷經過,就會把從第10個字節的剩餘輸入數據做爲函數調用。
所以要利用這個咱們的shellcode要用n0b4ckd00r開頭而且用<baidu-rocks,froM-china-with-love>
異或一遍而後發送給服務器。 須要注意的是要保證scanf能完整接受shellcode,它會把0x20等字符截斷形成shellcode沒法執行。 shellcode用的是這個:http://www.shell-storm.org/shellcode/files/shellcode-857.php
描述
米特尼克在BAT上班時,發現不少同事都在用新款Android手機,非常羨慕,他也想搞一部,來替換他那部用了「二十多年」的摩托羅拉手機。可是他在BAT公司還沒拿到第一筆工資,用假身份申請的信用卡在租房與平常飲食上也快刷爆了,能夠說是身無分文了。這卻難不倒米特尼克,他發現了這個銷售手機的在線商店。商店地址:218.2.197.251:1234 http://bctf.cn/files/downloads/mobile_shop_4d904f700ef95bae39936cd9c0829d31
複製代碼
解題
主要思路:
下載程序後載入ida,找到顯示菜單函數sub_8048b80。
經過這個函數的調用者咱們找到接受參數的函數sub_8048C00,而該函數會調用購買手機的函數(sub_8048840)、顯示菜單的函數等等,而sub_8048840中會對傳入的參數進行校驗:
檢查是否爲‘-’
開頭,若是不是,用strtol把字符串參數轉換成數字,若是一次購買的商品大於8則退出,不然
a1[8 - result]
加一,若是此處咱們能控制讓傳入的參數爲負數,那麼就能夠在a1 + 8的任意地址+1了,此處能夠更改sub_8048C00的返回地址。 由於函數會檢查傳入參數是否以‘-’開頭,因此傳入一個以空格開頭的字符串‘ -1’,這樣就能繞過檢測而且在通過strtol函數後還能轉換爲-1,至此,能夠達到改a1 + 8之上任意地址了。 來看sub_8048A30函數,函數接受傳入的信用卡號存放在變量中,咱們能夠在此處存放shellcode,而後經過上面的地址操做更改地址爲變量的地址就能夠exploit了。
因此,經過這點就能夠利用上面的任意地址修改,將返回地址修改成咱們存放的shellcode的地址就能夠達到exploit了。
進入題目後看到了幾我的的名字對應的鏈接,其中的參數格式是id={32位字符串},id後面的數字目測都很像MD5,就去cmd5解了下,發現md5值都是 (對應的名字+三位數字)的md5值,那麼如今提示要求得到Alice的的文件,就嘗試去猜想一下Alice的id看看 交給burp,切換到burp的Intruder,而後把id出設置一個payload位置:
而後指定paylad爲Alice+三位數字取md5運算:
而後就能夠attack
最後能夠看到結果爲Alice479時候出現了正確的頁面,訪問一下,源代碼中看到了<!-- $_POST['key=OUR MOTTO'] -->
的提示,圖片是BT5的圖片,就嘗試bt5的motto,各類大小寫,逗號,空格的嘗試以後,獲得又一個提示config.php.bak 下載以後獲得的東西在chrome console中獲得了flag:
話說。。。主辦方大家敢不敢不要換代碼了。。。今天覆現的時候發現flag和以前提交的不同。。。還好有之前的截圖,這倆flag我也忘記了哪一個是第一天咱們提交的了
訪問題目頁面提交提示只能在本地運行,而後F12 把ip的值改成了127.0.0.1提交,彈出了一個401登錄認證,admin/admin 就進去了,彈出來一個遊戲頁面,可是坑爹的怪物根本打不死啊有木有!!! 跑去看agnet1.js的代碼,ctrl+f了下BCTF,找到了生成key的函數:
繼續ctrl+f看哪裏調用了,找到了調用的地方:
就看到進入以前的那個if判斷,根據變量名字猜到了deadghost=10就是打死十個怪物纔會彈出key,開始找到了player的一個life屬性,發現是5,還有些攻擊間隔之類的變量,就直接改這些值,跑去傻逼呵呵的打死了10只怪物到了小黃門前面彈出了flag,可是坑爹的是一直就不對! 返回來仔細看代碼原來life和移動速度也參加了生成key的運算,這些屬性不能改,看代碼好心煩啊好蛋疼,從if那看到authnum的第二個參數是deafghost,就是打死的怪物數量,是定值10,繼續傻逼呵呵的跑去看authnum的第一個參數是怎麼算出來的,看的好亂,突然就發現2b了,直接chrome的js console應該就ok,f12過去,輸入 authnum(gameObj.key,10) 出來了flag:
根據<form class="form-signin" action="test.php.bak">-->
中下載到的源碼,根據裏面key和room長度的判斷以及那個正則,構造出了一個合適的url:query.php?key=abcd123AB124564&room=xxx room哪裏貌似能夠執行, 當room=$(2*3))時輸入以下:
不過只能返回%d數字。。。。。 後面繼續嘗試其餘各類猥瑣命令,redrain大牛說若是命令返回值有多行或者爲空彷佛都不會傳給room去運行,能夠用ls 和通配符來判斷文件是否存在,相似於盲注,經過返回頁面判斷這個文件活目錄在不在。。.即 room=$(ls B) 若是頁面返回那串180xxx的隨機數,說麼這個文件或目錄一個字符爲B,繼續room=$(ls BX) 這樣去匹配,同時控制整個room長度小於15就ok了,而後手工帝就用黃金右手去跑了,逗比的跑去寫了個程序發現還沒人家的右手跑的快,呵呵呵了: 最後跑出來flag:
描述
在上一個站點中米特尼克學會了特殊的Web技巧,在開始滲透前,他會左顧右盼裝做看風景。他對BAT這個公司的好奇與日俱增,彷佛BAT並不像是表面上看起來的那樣,僅僅是個互聯網公司。他追尋一系列蛛絲馬跡找到了這個站點,裏面彷佛隱藏着BAT的一項核心機密。站點入口:http://218.2.197.240:1337/0cf813c68c3af2ea51f3e8e1b8ca1141/index.php(注意:本題flag非「BCTF{可見字符串}」形式)
複製代碼
解題
訪問url是一個登陸窗口:
在通過掃描後發現開放了mongodb端口,因而直接mongodb注入:
獲得這個頁面:
經過提示得知存在you_guys_fxxking_smart.php/jpg
兩個文件,訪問php又是一個登陸窗口。。
而jpg則是代碼提示:
經過代碼提示,能夠看到關鍵語句的password通過了hash函數加密,而第三個參數true告訴咱們加密後的密文是二進制輸出的,因此構造一個通過加密後存在SQL注入的密文就能夠。 密鑰能夠經過提示:「I love the first letter of my name」以及「<meta name="author" content="bob">
」獲得爲b,因而我寫了一個腳本調用hash的全部支持函數並遍歷輸出尋找SQL注入語句,同時也沒閒着用burpsuite對登陸窗口進行爆破(驗證碼複用)。 而後爆破成功,密碼9384。 獲得這個:
猜想多是hash中的某函數加密過了,因而把密碼取出來扔cmd5試,在試到sha512的時候成功了,最後兩個密碼解密還原獲得flag。
存在一個支付的bug,取消交易能夠無限刷rmb和btc 首先用rmb買入btc,而後交易管理中取消該交易,此時burp抓包,重放此包n次可刷n倍rmb 刷btc也是同樣,先買入一枚btc,而後搞價賣出,此時爲掛單狀態,而後取消交易,此時抓包,重放此包n次可刷n倍btc 刷夠200btc就能夠盲打到後臺,在rmb提現處能夠xss,打到cookie進入後臺,發現一處蛋疼蛋疼的注入,在後臺返利處:
抓包得到的id=’能夠注入 Id=xxx’當id號有效時會出現http 500錯誤 雖然提交 id=xxx and 1=1 和 id=xxx and 1=2 以後返回頁面相同 可是提交and 1=1以後再提交 單引號就不會拋出http 500錯誤 提交 and 1=2 以後 再提交單引號會報錯 因此能夠用第二次請求加單引號去驗證上次請求的結果。
並且只要條件爲真,id號就失效,選片換下一個id號
由此思路,能夠寫程序去實現: 首先發包生成返利 Id=xxx +payload進行盲注 發id=xxx加單引號驗證上步結果 若是3中未出現http 500 則繼續更換下一個payload。若出現http 2000則 從新生成返利id
而後就循環2-5步驟貌似就能跑數據了。固然都是YY的。沒寫出來。