team:我是狗汪汪
author:redrain,金龜子,ztz,hellove,cbuteng,琴心劍氣,saline
描述
米特尼克剛到中國人生地不熟,想要找到一些中國的黑客朋友幫助他,他知道Capture The Flag奪旗競賽是黑客云集的地方,于是也報名參加了中國第一次全國性的CTF大賽 @BCTF百度杯網絡安全技術對抗賽。而要進入BCTF圈交流,[email protected],才能找到一個密語。
解題
很簡單,微博上at了后會多個粉絲,查看簡介即有flag。
描述
為了收集更多參加 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的。沒寫出來。