我是狗汪汪 · 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的。没写出来。