Ashing's Blog

想学的太多 懂得的太少

0%

BugKu-MISC-WP史诗全集

0x01 信息收集与社工

1 签到

微信扫二维码回复:flag 得 flag

2 猜

提示是某人姓名全拼音,运用谷歌识图搜到是liuyifei

0x02 编码分析

1 多种方法解决

用 NotePad++ 打开发现是使用 python 的 b64img 模块,把图片转换成文本的文本。直接在线还原 base64 编码的图片的二维码,扫描得 flag

2 普通的二维码

扫码说:flag就在这里。各种分析方法发现都没用。最后在文本最后发现一串数字

没有8,猜测是八进制,然后把八进制转换成字符应该是 flag,每三个数字一组写个脚本。

1
2
3
4
5
c = '146154141147173110141166145137171060125137120171137163143162151160164137117164143137124157137124145156137101163143151151041175'  
flag = ''
for i in xrange(0,126,3):
flag += chr(int(c[i:i+3],8))
print flag

运行脚本得到flag

3 convert

写个脚本把二进制转换成字符存到一个新文件

1
2
3
4
5
6
7
8
9
10
11
12
13
import libnum  

file = open('1.txt','r')
f = file.read()
c = f.replace('\\r\\n','')
m = libnum.b2s(c)
print m

getflag = open('flag','wb')
getflag.write(m)
file.close
getflag.close
print 'ok!!!'

在linux里面直接检查到文件格式为 rar

解压图片查看 exif 找到 base64 字符,python 解码 base64 即可得 flag

4 就五层你能解开吗

感觉这个题目多为密码题,就放这里吧…给出了提示:

  • 第一层为 CRC32 碰撞

    • 打开压缩包可以看见 CRC32 校验码分别为:0x7c2df918、0xa58a1926、0x4dad5967分别爆破
    • 把有意义的连接起来得到解压密码:_CRC32_i5_n0t_s4f3
  • 第二层为维吉尼亚密码,给出了key和Hint。但是 KEY 有点多看网上有人说猜测开头字母可能是什么然后猜是 the ,对应开头秘钥为 YEWCQGEWCYBNHDHPXOYUBJJPQIRAPSOUIYEOMTSV 解密找到秘密

  • 第三层 SHA1 碰撞,python 脚本得到解压密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
encoding:utf-8  

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)
  • 第四层 md5 相同文件不同,百度就能找到HelloWorld-colliding.exeGoodbyeWorld-colliding.exe两个文件不同但是md5值相同。得到解压密码:Goodbye World :-(

  • 第五层RSA解密,得到两个文件.enc.pem

    • 解法一:直接用RSA-Tool快速解题
    • 解法二:用 OpenSSL 提取 N 和 E,发现都很大。擦侧是维纳攻击(低解密指数攻击)。然后用 Wienerattack 攻击的脚本跑一下得到 d=8264667972294275017293339772371783322168822149471976834221082393409363691895
    • 然后用 python 的 rsatool 生成私钥。这里有个问题,脚本比较老用的 gmpy。而我不知道为何始终没有解决安装老的 gmpy 库,最后是把脚本里面的 gmpy 全部改成 gmpy2 就好了。
    • 用Openssl和私钥解密得到flag:openssl rsautl -decrypt -in flag.enc -inkey key.pem -out flag.txt

0x03 取证隐写

(一)图片隐写

1 这是一张单纯的图片

用 NotePad++ 打开发现最后附加了一段 Unicode 编码,解码得flag

2 隐写

PNG 图片,NotePad++ 打开后发现有一段 IHDR 字样。

利用 Window 忽略 CRC 检验码然后修改高度和宽度后仍然可以显示来隐藏信息。

然后放到 Kali linux下面,果然无法显示(Linux会检验CRC检验码)

然后用01Editor打开修改IHDR后面的后八位(前四位为长,后四位为宽)把后四位的 A4 改为 F4,即改为正方形,保存显示flag。

3 啊嗒

省赛题目,前面写过 wp 就不写了。答题思路就是 binwalk 分离压缩包,通过 exif 信息找到压缩包密码解压即可。

4 又一张图片,还单纯吗

binwalk 分析有很多夹杂的信息,用 foremost 提取一下,直接提取出 flag 图像。

5 隐写2

首先用 NotePad++ 打开文件,最后发现 flag.rar

binwalk 分析,foremost 分离。

打开压缩包发现又一个 flag.rar 和一个提示 jpg

根据提示是 3 位数密码,然后公共爆破工具爆破得到密码。

解压得到一张图片,然后用 Notepad++ 打开,最后找到 flag

6 闪的好快

gif 图片,很多张二维码不停跳,用 StegSolve 的 Frame Brower 打开一个个扫拼接得到 flag。

最后扫描完拼接得:SYC{F1aSh_so_f4sT}

7 隐写3

下载压缩得到 PNG 图片,用 010Editor 打开发现 IHDR。观察图片感觉明显窄很多。修改高度得到flag。(原理同2 隐写)

8 细心的大象

图片的文件 exif 有信息,但是不是 flag。然后在 kali linux 下 binwalk 分析发现有 RAR 压缩包,foremost分离

发现一个加密的压缩包,这个时候就用到 exif 里面的备注了。当时直接当密码不行,需要 base64 解密才可以,解密后得到一张图片

貌似很熟悉的样子。上面题目刚做了。然而这次修改高度貌似显示不了,用 StegSolve 查看得到 flag

9 爆照

Notepad++ 打开发现文件尾部有一段 .gif 的信息

binwalk分析,foremost分离得到压缩包

解压后得到一堆 88888 的未名文件

放到 kali 里面分析,直接显示为图片,而且很容易发现 88 有二维码扫面得 bilibili

挨个 binwalk 分析发现 88、888、8888 存在修改痕迹,且 8888 里面夹杂 zip。

分离 zip 发下二维码得到 panama

看下 888 的exif

得到 base64,解密得 silisili

最后按照顺序连接得到flag

10 猫片

png 图片,下载后常规分析:搜索、查看exif、二进制分析、CRC校验都无果。

提示:LSB、BRG(有错误,估计打错了,应该是BGR)、NTFS

用 StegSolve 打开 LSB 最低位通道查看,发现 BGR 里面数据是 PNG 图片的数据

Save Bin 后用 010Editor 打开,发现不行。用 WinHex 就可以。把开头四字节删了保存,发现了一半二维码。

放到 Linux 里面看一下是否存在 CRC 校验失败(判断是否修改了高度)。

果然,修该高度后找到全的二维码

但是貌似有一点莫名的异样。原来是黑白正好相反。通过 StegSolve 就可以查看 xor 后的图像了,扫面后是一个网盘,下载 flag.rar

没有 flag。但是我们还有一条信息没用到:NTFS。猜测应该是NTFS隐写

用 NSE 打开扫描发现确实

是个 pyc 文件,关于 pyc 文件之前写过。就是编译后的 py 文件,在线反编译一下得到源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import base64  

def encode():
   flag = '*************'
   ciphertext = []
   for i in range(len(flag)):
       s = chr(i ^ ord(flag[i]))
       if i % 2 == 0:
           s = ord(s) + 10
       else:
           s = ord(s) - 10
       ciphertext.append(str(s))
return ciphertext[::-1]

ciphertext = ['96','65','93','123','91','97','22','93','70','102','94','132','46','112','64','97','88','80','82','137','90','109','99','112']

逆向操作思路,解密脚本解密得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- codeing: UTF-8 -*-  

import base64

def decode():
ciphertext = ['96','65','93','123','91','97','22','93','70','102','94','132','46','112','64','97','88','80','82','137','90','109','99','112']
flag = ''
ciphertext.reverse() # 因为加密用到了append()函数
for i in range(len(ciphertext)):
if i % 2 == 0:
s = int(ciphertext[i]) - 10
else:
s = int(ciphertext[i]) + 10
s = chr(i ^ s)
flag += s
return flag

def main():
flag = decode()
print flag

if __name__ == '__main__':
main()

11 多彩

下载后图片名字是:lipstick。翻译是口红的意思…

结合图片颜色应该是不同的口红色号吧

用StegSolve打开后找到这么一段信息

这些口红颜色和 YSL 什么关系?搜一下发现是一个口红的品牌。继续搜索信息发现 LSB 最低位里面有 PK 字段,应该是压缩包数据。

果断保存二进制为 .zip 格式。但是打不开,因为后面有一堆没有的数据。用 binwalk 分离一下就好了。

分离出来发现是个加密的压缩包。那么秘密是什么?和 YSL 口红色号有什么关系?有点脑洞了。搜索后发现是N1CTF国际赛的一道题目。秘密啊竟然是YSL对应口红色号的二进制转字符串。。。

用PS取色:

'BC0B28','D04179','D47A6F','C2696F','EB8262', 'CF1A77','C0083E','BC0B28','BC0B28','D13274', '6A1319','BC0B28','BC0B28','D4121D','D75B59', 'DD8885','CE0A4A','D4121D','7E453A','D75B59', 'DD8885'

进入YSL的网站:https://www.yslbeautyus.com/on/demandware.store/Sites-ysl-us-Site/en_US/Product-Variation?pid=194YSL

可以看见:color=1

抄个脚本吧.(眼力好也可以手撕)(发现抄的脚本看不懂也运行不了,手撕)

最后得到色号:1,27 ,59 ,11 ,23 ,7 ,57,1 ,1 ,76 ,222 ,1,1,50 ,214 ,6 ,77 ,50,53,214 ,6

写脚本转换成二进制再转换成和字符

1
2
3
4
5
6
7
import libnum  

color = [1,27 ,59 ,11 ,23 ,7 ,57,1 ,1 ,76 ,222 ,1,1,50 ,214 ,6 ,77 ,50,53,214 ,6]
flag = ''
for i in color:
flag +=str(bin(i)[2:])
print libnum.b2s(flag)

解压得到 flag

12 乌云邀请码

Stegsolve,LSB,BGR 分析直接得到flag

13 图穷匕见

用 010Editor 打开,根据题目意思应该是在这张图的后面还有数据。

FF D9 是 jpg 文件头,提取后面的数据。然后用 Notepad++ 的 Converter 功能把 16 进制转为字符。发现是一堆点。加上提示:问会画图吗?猜测应该是合成二维码。

用 python 的 Image 库生成反向图片

14 color

省赛题目,当时也是没做出来。前面 wp 也写了。思路就是用 SteSolve 打开发现隐藏 Hint:makemetall。修改高度得到黑白块,联想二进制和 ASCII 码的可打印字符正好是 7 位(坑点:七张图片要竖着组合01)

15 2B

binwalk分析发现存在zip文件,foremost分离出来

压缩包加密了,用 01Editor 打开搜索 50 4B 01 02,发现是伪加密。

修改后解压得到另一张看似一模一样的png图片名字叫B2。猜测双图还是盲水印?答案是盲水印。脚本有两个,一个可以另一个不可以。不知道为啥。。

16 妹子的陌陌

binwalk 分析发现存在压缩包,foremost 分离出压缩包

压缩包有密码,经过尝试给的信息,竟然是:喜欢我吗.(脑洞….)

然后摩斯电码解密得到一个网址

进去加上后面的提示,应该是吧有=的看似想base64的用 AES 解密,而且给出了秘钥。

然后进去网站发现二维码,取反色扫描得到flag。

(二)流量分析

1 talnet

直接搜索分组字节流,找到flag。也可以过滤 talnet 协议定位,追踪流找到 flag

(三) 压缩包分析

1 眼见非实

Notepad++ 打开后发现是 PK 文件头,最后有一段 .docx。

修改后缀为 zip,解压得到 .docx 文档,但是打不开。

再用 Notepad++ 打开发现 PK 头,修改后缀为 zip。解压得到文件夹,搜索找到 xml 文件里面有 flag

2 神秘文件

省赛题目。加密压缩包和压缩包外有相同文件,用 ARCHPR 明文攻击即可。注意一点要用 WinRar。然后解压得到 .doc。查看文本发现 PK 开头,改后缀为 zip。找到 flag.txt 然后 base64 解码。详解看上面WP

3 好多压缩包

这么多小压缩包肯定先想到CRC32碰撞攻击。

  • 原理:CRC32:CRC 本身是“[冗余校验码](http://baike.baidu.com/item/CRC32)”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。
  • CRC32校验码出现在很多文件中比如 png 文件,同样 zip 中也有 CRC32 校验码。值得注意的是 zip 中的 CRC32 是未加密文件的校验值。这也就导致了基于 CRC32 的攻击手法 。
  • 在产生 CRC32 时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容
  • 限于 CPU 能力,CRC 碰撞只能用于压缩文件较小的情况

破解脚本:

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
# coding:utf-8  
import zipfile
import string
import binascii
import base64


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):
                                           # print s

                       f.write(s)
                       return


def CrackZip():
   for I in range(68):
       file = '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

用 python 脚本解密写进 jm.txt 里面

1
2
3
4
5
6
7
8
9
10
#coding:utf-8  

import base64

file = open('out.txt','r')
c = file.read()
m = base64.b64decode(c)
file = open('jm.txt','w')
file.write(m)
print ok

用 01Editor 打开发现 Hint:修理文件得 flag。而我们在十六进制中发现C4 3D 7B 00 40 07 00查阅得知这是 rar 文件结尾。

新建一个文件,打上 rar 文件开头十六进制,然后复制前面的数据后保存得到压缩包

注释里面得到 flag

4 一个普通的压缩包

用 Winrar 打开发现说文件 secret.png 头被破坏

使用 Winrar 自动修复功能,对比两个压缩包明显发现大小不一样。但是修复的完全可以解压未修复的假 flag.txt 猜测第一个压缩包里面藏着 secret.png 但是文件头被损坏。用 binwalk 也分析不出来

发现这个地方。A8 3C 后面是被压缩文件文件头类型。把 7A 改成 74 再解压就得到了 secret.png

用 StegSolve 打开,在一个通道发现一半二维码。而且存在两帧

应该把第二帧提取出来在一个通道可以找到另一半。保存第二帧找到另一半拼接而且还得补全左上角,扫描得到flag

(四) 内存取证

1 Linux

提示Linux,下载文件是一个不知名的文件。根据提示放到 linux 下 file 命令看看

是一个映像文件,我们尝试挂载

找到目录即可找到flag文件

2 linux2

法一:Notepad++ 直接搜索key得到flag。但是我觉得这个题肯定不是这么做,这是个非预期做法。

法二:不知名的文件,接近20MB。放linux下file和binwalk分析

和上个题目类似,也是内存镜像。我们尝试挂载,发现一堆文件。观察上图发现一个jpg文件。我们尝试 foremost 分离得到 jpg。然而并不是flag。

最后貌似懂了出题人想考什么:应该是考 linux 的 strings 命令

(五) 音频隐写

1 旋转跳跃

MP3文件,听一下(真好听)。关于MP3的除了曲线就是MP3隐写了。用工具 MP3Stego 分析得到flag

2 听首音乐

用 Audacity 打开后发现

放大

这就很容易猜想了。三种状态:点、短横、空格正好对应摩斯电码的三种符号:.-/

手撕电码解密得 flag

3 PEN_AND_APPLE

NTFS流隐写,一种以前木马的隐藏方式

隐藏方法:type flag.png>pen_and_apple.mp4

查看方法:dir /r

0x04 Other

1 宽带信息泄露

给出一个 .bin 二进制文件,但是不知道什么生成的。根据题目提示用 RouterPassView 打开,搜索 username 找到 flag。

2 come_game

提示通关就有 flag。下载后发现是一个 exe 的小游戏,既然放在 MISC 应该不会用到 Re。随便玩一玩发现很难通关,不可能通关玩。

退出后生成了一个 save1 文件,猜测应该是存盘。这样的话我们把存的关数修改不就可以通关了吗?用 010Eeditor 打开修改数字2,一个个修改。最后到 5 的时候打开游戏就是通关了。

3 做个游戏

提示坚持六十秒,同上个题目差不多。不可能达到他的要求。jar 文件我们尝反编译查看源码找到 flag。

符强大的 java 在线反编译网址:http://www.javadecompilers.com/

4 想蹭网先解开密码

给了个 .cap 流量包,用 wireshark 打开。提示 WIFI 密码,WIFI 连接认证的重点在 WPA 的四次握手包,也就是 eapol 协议的包,过滤一下

正好四个包。接下来根据提示写个字典。

通过 kal i里面的 aircrack-ng 破解就可以得到 key 了,key 就是 flag 了。

5 账号被盗了

不抓包直接 getflag 提示 you are not admin! 抓包把 flase 改成 true。得到连接,访问下载 exe 文件。

打开后是一个刷枪的工具

尝试提交,抓流量包发现明显有 base64 编码。

解码是 163 邮箱。获取账号密码登录后得到flag。

6 好多数值

一看就是很多 RGB 值让我们绘制图片,先分析绘制图像的长宽。用 python 分析一下数据的长度。

开方开不尽,所以不是正方形。分解质数得到 503*61*2。python 脚本跑测试一下是 122*503。得到flag

脚本:

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

x = 503 #x坐标 通过对txt里的行数进行整数分解
y = 122 #y坐标 x*y = 行数

im = Image.new("RGB",(x,y))#创建图片
file = open('1 (1).txt') #打开rbg值文件

#通过一个个rgb点生成图片
for i in range(0,x):
  for j in range(0,y):
      line = file.readline().replace('(','').replace(')','')#获取一行
      rgb = line.split(",")#分离rgb
      im.putpixel((i, j), (int(rgb\[0\]), int(rgb\[1\]), int(rgb\[2\])))#rgb转化为像素
     
im.show()

7 很普通的数独

并不知道什么是数独。但是这 25 张图片加上里面的白黑相间很容易想到是个 5*5 的二维码。

关键是如何把他们拼接成二维码?….

看了大佬的 wp 是用 Python 的 PIL 库来处理。把数字涂黑然后拼接生成二维码。大致思路是计算一张图中的 81 个格子的位置,然后看每一个格子中心的一堆像素(比如设置了 6 x 6)中是否有黑色像素。如果没有说明是白格子,跳过;如果有说明是有数字的格子,涂黑。贴个大佬脚本:

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
from PIL import Image  

def work(s):
im = Image.open("{}.png".format(s))
width = im.size\[0\]
height = im.size\[1\]
newim = Image.new("RGB", (width, height), (255,255,255))
print(im.size)
print(newim.size)
sx = sy = 2
for i in range(width):
for j in range(height - sy):
try:
p = im.getpixel((i, j))
newim.putpixel((i,j), p)
except:
pass#print(i, j)
xx = yy = 14
blockx = 23
blocky = 22
r = 3
rr = 12
for i in range(9):
stx = int(xx + i * blockx)
for j in range(9):
sty = int(yy + j * blocky)
flag = False
for x in range(stx - r, stx + r):
for y in range(sty - r, sty + r):
p = newim.getpixel((x, y))
if p == (0,0,0):
flag = True
break
if flag:
break
if flag:
for x in range(stx - rr, stx + rr):
for y in range(sty - rr, sty + rr):
try:
newim.putpixel((x,y), (0,0,0))
except:
pass
newim.save("{}-1.png".format(s))

for i in range(1, 26):
work(i)

拼接后扫码得到多重base64

1
Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOamJGWnlWMjFHVlUxV1ZqTldNakZIWVcxS1IxTnNhRmhoTVZweVdWUkdXbVZHWkhOWGJGcHBWa1paZWxaclpEUmhNVXBYVW14V2FHVnFRVGs9

多解码几次得到flag

8 QAQ

用 01Eidtor 打开发现有 encode.txt、base64、key、encrypt 等字样猜测可能是 pyc 文件(py文件编译后)放到 kali 里面用命令查看一下确实是个 pyc 文件

在线反编译一下得到源码。

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
/usr/bin/env python  
encoding: utf-8

def encryt(key, plain):
   cipher = ''
   for i in range(len(plain)):
       cipher += chr(ord(key\[i % len(key)\]) ^ ord(plain\[i\]))

   return cipher


def getPlainText():
   plain = ''
   with open('plain.txt') as f:
       while True:
           line = f.readline()
           if line:
               plain += line
           else:
               break

   return plain


def main():
   key = 'LordCasser'
   plain = getPlainText()
   cipher = encryt(key, plain)
   with open('cipher.txt', 'w') as f:
       f.write(cipher.encode('base_64'))


if \_\_name\_\_ == '\_\_main\_\_':
   main()

然后还给了一个文件。三段数据,应该是用到脚本里面。

然后审计代码尝试写解密python脚本

过几天抽时间写吧,先放一下

解密后…

10 apple

未完代更新