写在前面

MISC的学习是极广的,很多都要学习,而记在博客上是最方便有效的方法了,可以随时翻阅

这篇博客会随着我的一点点学习而逐渐被填写,因此不会很快。。

各种文件头尾

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
.zip的文件头:50 4B 03 04 14 00 08 00
.rar的文件头:52 61 72 21
.rar的文件尾:C4 3D 7B 00 40 07 00
.7z的文件头:37 7A BC AF 27 1C
.pyc的文件头:03 F3 0D 0A
.jpg的文件头:FF D8 FF E0 00 10 4A 46 49 46 00 01
.png的文件头:89 50 4e 47 0d 0a 1a 0a 文件尾:49 45 4E 44 AE 42 60 82
.gif的文件头:47 49 46 38 39 61(GIF89A)或 47 49 46 38 37 61(GIF87A)
.gif的文件尾:00 3B
.gz的文件头:1F 8B 08 00
.pyc的文件头:03 F3 0D 0A
.psd的文件头:38 42 50 53
TIFF (tif),文件头:49492A00
Windows [Bitmap](https://so.csdn.net/so/search?q=Bitmap&spm=1001.2101.3001.7020) (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
M4a,文件头:00000018667479704D3441

加密

思路:

加密的方法有很多,要看是什么加密了

base加密

原理:

Base 编码(Base Encoding)是一种将二进制数据转换为可打印字符的编码方式。常见的 Base 编码有 Base64、Base32 和 Base16 等,它们的工作原理相似,只是使用的字符集和编码方式不同。

基本原理

Base 编码的核心原理是将一串二进制数据(字节)按照一定的规则分组,并将每组数据映射为一个字符。这样可以保证编码后的数据由可打印的字符组成,通常用于在文本格式中传输二进制数据。

Base64 为例,下面是其编码原理:

  1. 输入数据分组:将输入的二进制数据每 3 个字节一组,每个字节 8 位,总共 24 位。
  2. 划分为 4 组:将这 24 位数据分成 4 组,每组 6 位。例如,输入数据为 3 字节(24 位),经过分组后就变成 4 个 6 位的数据块。
  3. 字符映射:将每个 6 位的数据块映射到一个字符表。Base64 的字符表包括大小写字母(A-Z、a-z)、数字(0-9)和两个符号(+ 和 /)。总共有 64 个字符,所以叫 Base64。
  4. 输出结果:输出的是一个由这 64 个字符组成的字符串。如果原始数据的字节数不是 3 的倍数,Base64 编码会使用一个或两个 = 来填充,使得输出的字符数是 4 的倍数。

举个例子

假设我们要对字符串 Hello 进行 Base64 编码:

1
Hello

的 ASCII 码为:

1
72 101 108 108 111

对应的二进制是:

1
01001000 01100101 01101100 01101100 01101111

将其按 3 字节分组,得到:

1
010010000110010101101100 011011000110111101101111

每组 24 位拆成 4 组,每组 6 位:

1
010010 000110 010101 101100 011011 000110 111101 101111

查表映射每 6 位得到对应字符:

1
H e l l o

最终输出的 Base64 编码结果为:SGVsbG8=

其他常见的 Base 编码

  • Base32:将每 5 个字节转为 8 个字符,使用 32 个字符(A-Z、2-7)。它的特点是比 Base64 更加健壮,对字母区分大小写的要求较低,通常用于限制字符集时(如避免使用特殊字符)。
  • Base16(Hex):将每个字节编码为两个十六进制字符,常用于表示十六进制数据。

总结

Base 编码的核心思想是将二进制数据映射为可打印字符,使得原本只能通过二进制传输的数据能够通过文本协议进行传输。不同的 Base 编码有不同的字符集,常见的有 Base64、Base32 和 Base16。

解密的工具

解密的时候要注意是不是换表的base

网站:

cyberchef就可以

工具:

随波逐流

随波逐流支持换表base,多行base

其中有个base64隐写解密甚至可以把解密出来的脚本运行了

puzzlesolver

这个可以补全base32,64隐写

basecrack

先要装好工具

因为我给basecrack单独装了一个虚拟环境,所以运行时候要激活它

切换到目录

1
cd basecrack

激活虚拟环境

1
source venv/bin/activate

运行

1
python basecrack.py
2024-11-28 111731

就可以开始解密了。

如果想让他一直解密的话用

1
python basecrack.py -m

MD5加密解密

网站

加密网站(适用于让你包上md5提交的): https://www.geekstool.com/tool/md5

凯撒加密

凯撒加密的原理是换位,我们需要注意换位的key会不会变化

如果key会变的话我们需要编写脚本来解密了

如果没有的话直接cyberchef或者随波逐流都可

brainfuck加密

-随波逐流里有

-网站:https://www.splitbrain.org/services/ook

Ook! Obfuscation加密

-网站:https://www.splitbrain.org/services/ook

serpent加密(蛇对称加密算法)

-网站:http://serpent.online-domain-tools.com

颜文字加密(aaencode/jjencode/ppencode/uuencode/xxencode)

-aaencode随波逐流里面有

-其他的可以用在线网站http://www.hiencode.com/

AES-ECB加密

可以用cyberchef

可以用脚本,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import base64
from Crypto.Cipher import AES
def aes_decrypt(data, key):
key = key.encode('utf-8')+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
cipher = AES.new(key, AES.MODE_ECB)
decrypted = cipher.decrypt(base64.b64decode(data))
return decrypted

if __name__ == "__main__":
data = 'Kln/qZwlOsux+b/Gv0WsxkOec5E70dNhvczSLFs+0pkHaovEOBqUApBGBDBUrH08' #加密的文本
for i in range(100000,999999):
key = str(i)
res = aes_decrypt(data=data,key=key)
res = str(res)
if 'flag' in res or 'DASCTF' in res: #关键词
print(f"key:{key}")
print(f"flag:{res}")
break

奇奇怪怪的加密

有一些奇怪的加密可以尝试去随波逐流找找看

随波逐流/其他工具/更多图形密码(在线)

TXT文本隐写

思路:

看是什么隐写了,是NTFS?还是snow?还是什么

字频统计

有一些txt里面是一堆乱码,实际上是要我们统计字频

可以使用puzzlesolver

看不懂的乱码

诸如

2024-11-21 004240

这样实在看不懂的乱码可以试试把txt拖进010,

在010的视图里面选择EBCDIC,说不定能看到。

反转的16进制

有时候遇到打开文本,看到一堆东西,能观察出是反转过的16进制文件(因为发现了文件头)

可以使用puzzlesolver的反转

或者使用脚本反转回来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
with open('E:/python3.7/1.txt', 'r', encoding='utf-8') as file:  #记得改路径
text = file.read()

# 将文本按空格分隔成列表
hex_numbers = text.split()

# 反转每个十六进制数字,并转换为大写
reversed_hex_numbers = [num[::-1].upper() for num in hex_numbers]

# 每16个数字分为一行
lines = []
for i in range(0, len(reversed_hex_numbers), 16):
line = ' '.join(reversed_hex_numbers[i:i+16])
lines.append(line)

# 将所有行连接成最终文本
reversed_text = '\n'.join(lines)

with open('E:/python3.7/reversed_document.txt', 'w', encoding='utf-8') as file:
file.write(reversed_text)

NTFS交换数据流(简称ADS)

NTFS交换数据流(简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,除了主文件流之外还可以有许多非主文件流寄宿在主文件流中,而我们无法查看到非主文件数据流,因文件夹大小始终显示0

注意ntfs的压缩包要用WinRAR解压,否则可能解压不出来ntfs流

以下是进行文件流计生和查看的方法,以后在windows命令行下查看文件,都用 dir /r

寄生一:

echo 写入内容>>宿主文件:交换数据流文件(寄生文件)

echo ever>>1.txt:2.txt

2.txt为echo创建出交换数据流文件,ever在2.txt中

寄生二:

type 交换数据流文件(寄生文件)>>宿主文件夹:交换数据流文件(寄生文件)

type 2.txt>>temp:2.txt

temp为空文件夹,执行后2.txt寄生在temp文件夹上

type a.jpg>>temp:a.jpg

temp为空文件夹,执行后a.jpg寄生在temp文件夹上

查看:

notepad 宿主文件:交换数据流文件(寄生文件)

notepad 1.txt:2.txt

查看图片文件:

mspaint 宿主文件:交换数据流文件(寄生文件)

notepad a.jpg:b.jpg

过滤

dir /r | findstr $DATA (过滤DATA字符串)

例题可以看BUUctf的 [SWPU2019]我有一只马里奥

网站讲解: https://zhuanlan.zhihu.com/p/654643812

工具:NtfsStreamsEditor或AlternateStreamView

snow加密

需要密码,当然也可以无密码解密

1
snow.exe -p password -C encoded.txt

看不到的情况——sunblime

有时候什么东西都看不到,感觉类似于无字天书。

可以复制进sunblime看看

图片题

思路:

可以先拖进随波逐流看看

没有再010看看有无隐写

实在不行看看文件属性里有没有备注

压缩了宽高

有些题目会压缩图片宽高,我们需要爆破出来,jpg可以乱改宽高,png不行,需要知道原本的宽高。

1.随波逐流把文件拖进去会自己分析,如果压缩了宽高会自己爆破回来,很好用

2.010可以自己修改宽高

png爆破crc脚本

实测这个脚本在宽高比较低的时候好用,超过1000就不好用了,爆破得很慢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#使用python3爆破png图片的宽高数据
import os
import binascii
import struct

for i in range(20000):#一般 20000就够
wide = struct.pack('>i',i)
for j in range(20000):
high = struct.pack('>i',j)
data = b'\x49\x48\x44\x52' + wide+ high+b'\x08\x02\x00\x00\x00'
#因为是 Py3,byte和str型不能直接进行运算,要写把 str写 b'...'。不然把 wide和 high写成 str(...)

crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x90BECB72: # 0x90BECB72是这个 png文件头的 CRC校验码,在 21~25byte处
print('\n\n',i,j,crc32) #0x 后的数字为十六进制中crc位置的代码(winhex左016,13-下一行的0)
print(type(data))
exit(0)
print(i,end=' ')

stegdetect

这个是用来检查图片是什么隐写的

我这里下的是windows版本,对应目录下cmd

1
stegdetect.exe  图片路径

outgruss隐写

1
outguess -k ‘key’ -r 加密后的图片.jpg -t 明文.txt

F5-steganography

题目可能会提示关于刷新一类的字眼

装好工具后

1
cd F5-steganography

1
java Extract 1.jpg -p 123456 #-p后接f5的key

有时候报错需要我们加上

1
--add-opens java.base/sun.security.provider=ALL-UNNAMED

steghide

直接跑

1
2
steghide extract -sf stg.jpg
或steghide extract -sf filename -p passwd

stegseek

1
stegseek --seed example.jpg

pngcheck——png图像修复

检查png的chunk

1
pngcheck -v decode.png

如果检查出来如 invalid chunk name “0000” (30 30 30 30)

就去010把对应的chunk 0000 修改为 IDAT

oursecret隐写

一种隐写方式,需要密码。

binwalk和formost提取

如果有文件隐写在图片里面,可以尝试binwalk和formost提取一下

LSB隐写

stegsolve

lsb是利用人眼看不到的原理在最低位隐写内容

stegsolve可以查看图片的LSB通道,如果是最低位lsb隐写的话可以stegsolve一下

运行stegsolve

1
java -jar stegsolve.jar

需要电脑配置好了java环境变量

stegsolve可以看到最低位的一些数据,然后手动save bin,再用010转化

zsteg——无密钥

1
2
3
zsteg -a (文件名)  #查看各个通道的lsb
-b的位数是从1开始的 zsteg zlib.bmp -b 1 -o xy -v
提取文件并导出 zsteg -e b1,r,lsb,xy 3.png > 123.jpg

感觉stegsolve更好用

cloacked-pixel——有密钥

1
cd cloacked-pixel

1
2
3
4
python2 lsb.py extract encoded.png result.txt 123456 
#encoded.png 是加密的图片
#result.txt是解密后的文档,不确定格式的话可以改成out.data
#123456是密钥

最后

1
cat result.txt

盲水印

用puzzlesolver的fft(傅里叶变换)

图片拼接

使用PPT或者PS

提取等距像素点

特征:放大图片后看到一个个小的像素点

提取方法1:PS

2024-12-08 170926

将宽度高度/10 重新采样选择 临近(硬边缘)

或者在调宽高的时候用鼠标滚轮来调,能更精细一点

但是实测出来效果不佳,得到的图片很糊

方法二:脚本

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
import os
import re
import cv2
import argparse
import itertools
import numpy as np


parser = argparse.ArgumentParser()
parser.add_argument('-f', type=str, default=None, required=True,
help='输入文件名称')
parser.add_argument('-p', type=str, default=None, required=True,
help='输入左上顶点和右下顶点坐标 (如:-p 220x344+3520x2150)')
parser.add_argument('-n', type=str, default=None, required=True,
help='输入宽度间隔和高度间隔 (如:-n 44x86)')
parser.add_argument('-size', type=str, default='1x1', required=False,
help='输入截取图像的大小 (如:-size 7x7)')
parser.add_argument('-resize', type=int, default=1, required=False,
help='输入截取图像放大倍数 (如:-resize 1)')
args = parser.parse_args()

if __name__ == '__main__':
if re.search(r"^\d{1,}x\d{1,}\+\d{1,}x\d{1,}$", args.p) and re.search(r"^\d{1,}x\d{1,}$", args.n) and re.search(r"^\d{1,}x\d{1,}$", args.size):
x1, y1 = map(lambda x: int(x), args.p.split("+")[0].split("x"))
x2, y2 = map(lambda x: int(x), args.p.split("+")[1].split("x"))
width, height = map(lambda x: int(x), args.n.split("x"))
width_size, height_size = map(lambda x: int(x), args.size.split("x"))

img_path = os.path.abspath(args.f)
file_name = img_path.split("\\")[-1]

img = cv2.imread(img_path, cv2.IMREAD_COLOR)
row, col = img.shape[:2]

r, c = len(range(y1, y2 + 1, height)), len(range(x1, x2 + 1, width))
new_img = np.zeros(shape=(r * height_size * args.resize, c * width_size * args.resize, 3))
for y, x in itertools.product(range(r), range(c)):
for y_size in range(height_size):
for x_size in range(width_size):
# new_img[y * height_size + y_size, x * width_size + x_size] = img[y1 + y * height + y_size, x1 + x * width + x_size]
pt1 = ((x * width_size + x_size) * args.resize, (y * height_size + y_size) * args.resize)
pt2 = ((x * width_size + x_size) * args.resize + args.resize, (y * height_size + y_size) * args.resize + args.resize)
color = img[y1 + y * height + y_size, x1 + x * width + x_size].tolist()
cv2.rectangle(new_img, pt1=pt1, pt2=pt2, color=color, thickness=-1)

# cv2.imshow(new_img)
cv2.imwrite(f"_{file_name}", new_img)
print("已保存到运行目录中...")
else:
print("参数-p或参数-n或参数-size, 输入错误!")

python脚本跑的更精确一点,需要知道图片像素起始位置和结束位置,以及像素之间的间距(可以在PS里知道)

输入以下代码:(要注意有时候跑不出来可以复制到桌面上试试)

1
2
3
4
python get_pixels.py -f comeon.png -p 0x0+3828x2148 -n 12x12
# comeon.png 是待解密图片
# 0x0 是图片里像素点起始位置,3828x2148 是图片里像素点结束位置
# 12x12 是图片的像素点间距

这个脚本跑出来更精细一点,也更推荐

cimbar

对照表(简单的),项目地址: https://github.com/sz3/cimbar

2024-11-28 115212

exiftool分析图片信息,如GPS

查看信息,记得要在对应目录下开终端

1
.\exiftool 1.jpg

查看GPS

1
.\exiftool -gps:all 1.jpg

Arnold猫脸变换

参考链接: https://1cepeak.cn/post/arnold/

解密需要提供打乱次数,a,b 。

加密 / 解密代码:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: UTF-8 -*-

import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image

img = cv2.imread('flag.png')

if img is None:
print("图像加载失败,请检查文件路径或格式")
exit()

def arnold_encode(image, shuffle_times, a, b):
""" Arnold shuffle for rgb image
Args:
image: input original rgb image
shuffle_times: how many times to shuffle
Returns:
Arnold encode image
"""
# 1:创建新图像
arnold_image = np.zeros(shape=image.shape)

# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w

# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = (1*ori_x + b*ori_y)% N
new_y = (a*ori_x + (a*b+1)*ori_y) % N

# 像素赋值
print(image[ori_x, ori_y, :])
print(arnold_image[new_x, new_y, :])
arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :]

cv2.imwrite('flag_arnold_encode.png', arnold_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return arnold_image

def arnold_decode(image, shuffle_times, a, b):
""" decode for rgb image that encoded by Arnold
Args:
image: rgb image encoded by Arnold
shuffle_times: how many times to shuffle
Returns:
decode image
"""
# 1:创建新图像
decode_image = np.zeros(shape=image.shape)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w

# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = ((a * b + 1) * ori_x + (-b) * ori_y) % N
new_y = ((-a) * ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]

cv2.imwrite('flag.png', decode_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
return decode_image

# arnold_encode(img, 1, 2, 3)
arnold_decode(img, 1, 29294, 7302244)

如果报错如下:

decode_image = np.zeros(shape=image.shape) AttributeError: ‘NoneType’ object has no attribute ‘shape’

可以修改如下:

1
2
# 1:创建新图像,指定 dtype 为 uint8
arnold_image = np.zeros(shape=image.shape, dtype=np.uint8)

GIF

gif一般是拆分gif

以及帧间隔里面可能藏东西

使用puzzlesolver即可

二维码

得到的二维码可以用CQR扫一下,或者微信扫一下

在线二维码解码网站: https://qrcode-decoder.com

二维码也容易出拼接题目。

PDF题

编辑pdf

例如那种把图片底下有东西的题目

-在线网站 https://tool.lu/pyc/

音频题

思路:

拿到不管三七二十一先拖进audacity看一下

摩斯密码

看频谱图的时候如果发现是摩斯密码我们直接对着摩斯密码手敲解密

拨号音隐写——DTMF

听着像是在拨号一般的声音,频谱图发现

2024-11-28 115211

类似这样的是DTMF隐写

需要我们手敲

把最高和最低一一对应

[!NOTE]

注意DTMF中频率只有697 Hz、770 Hz、852 Hz、941 Hz、 1209 Hz、1336 Hz、1477 Hz 和 1633 Hz

上图手敲得到

1
1336-697 1336-941 1336-697 1209-770 1336-941 1477-852 1477-697 1336-941 1336-697 1336-941 1336-697 1209-770 1209-697 1209-697 1336-941 1477-697

然后复制进网站解密即可: https://www.dcode.fr/dtmf-code#:~:text=A DTMF code for dual-tone multi-frequency

SSTV慢扫描

github项目: https://github.com/colaclanth/sstv

1
sstv -d audio_file.wav -o result.png

注意解码出来是一张图片

然后查看图片

1
2
eog result.jpg 
或者v3m result.jpg

deepsound

如果把音频拖进deepsound解密要密码的话一般就是deepsound隐写

密码看有没有其他地方得到

ZIP题

思路:

zip有密码先看是不是伪加密,再看能不能爆破出来,要不要明文攻击,有没有注释,还有可能是脑洞。。

手动修复zip文件可以看看 其他 && 工具里的 010editor .zip模板对照表

伪加密

压缩源文件数据区:7-8位表示有无加密

压缩源文件目录区:9-10位表示是否是伪加密

一般这俩地方都是09 00的,大概率就是伪加密了(直接把第二个PK后的09改了就行)

具体可看zip文件结构

010

用010把09 00改了就行

随波逐流

随波逐流提供伪加密修复

ZipCenOp

说是能改伪加密,但实测感觉不好用

1
java -jar ZipCenOp.jar -r 111.zip

直接爆破

archpr

如果已知zip的密码很弱可以直接使用archpr来爆破密码

实际上感觉这个也用的比较多

fcrackzip

kali的工具

1
2
3
4
5
6
fcrackzip -u -v -D -p PASSWORD_FILE ZIP_FILE
#-u 表示使用暴力攻击模式
#-v 表示详细输出
#-D 表示使用字典攻击模式
#-p PASSWORD_FILE 表示指定密码字典文件
#ZIP_FILE 表示要破解的 ZIP 文件

我没怎么用过,感觉应该没有archpr好用

CRC32爆破

项目地址: https://github.com/allblue147/zip-crc-tools

crc爆破是里面文件很短,一般只有几字节的情况下

1
python .\main.py -f decode.zip

特别需要注意的是要保证 zip 及里面 txt 的名字不能出现中文,有的话重命名一下

掩码爆破

已知部分明文,而且知道密钥的位数的情况下使用掩码爆破

利用archpr进行掩码爆破,不知道的部分改为 ? (注意是英文的问号)

明文攻击

明文攻击的压缩方式是store,如果是store的话一般就是需要明文攻击

pkcrack——已知所有的明文或三段密钥

命令

1
pkcrack -c "README.txt" -p README.txt -C flag.zip -P README.zip

方法

1
2
3
4
-C:要破解的目标文件(含路径)
-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)
-P:压缩后的明文文件
-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)

bkcrack——已知部分明文/部分文件的所有明文

1.已知部分文件里的部分明文

1
2
3
4
至少已知明文的12个字节及偏移,其中至少8字节需要连续。
明文对应的文件加密方式为ZipCrypto Store
Tips:进行明文攻击前要判断制作压缩包的压缩工具,然后对已知明文使用特定工具进行压缩,再进行明文攻击
例子:bkcrack -C \$R9EG7XR.zip -c flag.txt -k 958597ea b9f7740b 622aed5e -d flag.txt

参数

1
2
3
4
5
6
7
8
9
-c 要解密的文件
-P 已知明文所在的压缩包
-p 已知的明文部分
-x 压缩包内目标文件的偏移地址 部分已知明文值
-C 加密压缩包
-o offset -p参数指定的明文在压缩包内目标文件的偏移量
-k 后面加破解出的三段密钥
-d 后面加解密后数据的保存位置
-U 修改压缩包密码并导出 bkcrack -C flag.zip -c hint.jpg -k afb9fee3 f8795353 f6de1d4e -U out.zip 114514

已知的部分明文可以是zip的文件名字

2.已知一个zip里的一个文件的全部内容

例如一个zip里包含 flag.txt 和 md5.txt,可以

1
2
3
bkcrack -C 222.zip -c md5.txt -P 11.zip -p flag.txt
# 222.zip是待解密zip,md5是已知的txt
# 新建一个flag.txt,内容是md5一样的,打包成11.zip

或者可以

1
2
bkcrack -C 222.zip -c important-md5.txt  -p flag.txt
# 不打包成11.zip

就可以明文攻击三段密钥了。

=>>拿到了三串密钥之后可以改加密密码另存文件

1
2
3
4
bkcrack -C 222.zip -k 119be489 086fed79 8cbf1ed7 -U out.zip 1234
# 222.zip是待解密的zip
# -k后面跟的是三段密钥
# -U 表示转出为out.zip,密码是1234

或者爆破出原本密码(知道密码长度)

1
2
3
4
bkcrack -k 119be489 086fed79 8cbf1ed7 -r 11 \?b
# -k后面跟的是三段密钥
# 11 是已知的密码的长度
# \?b表示尝试所有可打印字符,\?l是所有小写字母,\?u是所有大写字母,\?d是所有数字,\?s是所有特殊字符,\?a是字母加数字(等同?l?u?d),\?p是ascii字符(等同?l?u?d?s)

不知道长度也可以爆破

1
bkcrack -k 119be489 086fed79 8cbf1ed7 -b \?b

流量分析题

思路:

先导出一下http,tcp,ftp看一下有没有什么东西,没有再过滤,一个个查看tcp流

如果有东西可以保存下来。

有的是键盘流量和鼠标流量,注意辨别。

如果没思路的话可以试试foremost或者binwalk一下

常用命令

过滤post

1
http.request.method==POST

过滤get

1
http.request.method==GET

键盘流量

键盘流量是8字节的,鼠标是4字节

可以先用tshark提取

1
2
3
#这个格式为 usbhid 
tshark -r keyboard.pcapng -T fields -e usbhid.data > usbdata.txt
#keyboard.pcapng是被提取的流量

或者

1
2
3
4
5
6
7
#这个格式是 usb.capdata.
#提取数据的命令,这里用正则表达式剔除了空行
tshark -r usb.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
# -r 指定了需要读取的文件
# -T 表示仅仅输出所选字段
# -e 指定提取的字段
# 在sed中使用正则表达式过滤掉所有空行(其中 ^\s*$ 匹配空行,`d` 表示删除)

键盘流量有标准——hid键盘标准: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

如果看的烦的话也可以去网上搜相关的标准

SQL注入——布尔盲注

它是用ascii码的大小比较来判断库名、表名、字段名和字段值的内容的

用二分法来爆破得出库里内容的

可以试着先过滤一下http流量,再/文件/导出分组解析结果/AS CSV,把流量导出成表格。看得更清楚。

一般来说,前面的内容是hacker来判断数据库名、表名、字段名的,我们可以直接拉到最下面来看。

因为用的是二分法,所以在对一个字符进行bool判断时,被重复判断的ASCII值就是正确的字符。

我们需要找到被重复判断的flag的ascii转化。

NTML流量分析(SMB流量)

我们需要的是这些东西

1
username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response

有两种方式

1.tshark

tshark可以获得username::domain:ServerChallenge:NTproofstring:,但是没有modifiedntlmv2response

命令(tshark是kali自带的)

1
tshark -n -r eztraffic.pcapng -Y 'ntlmssp.messagetype == 0x00000003' -T fields -e ntlmssp.auth.username -e ntlmssp.auth.domain -e ntlmssp.ntlmv2_response.ntproofstr -e ntlmssp.auth.sesskey -e smb2.sesid

接下来还是要回到流量里找modifiedntlmv2response,这里顺便讲了第二种方法

2.流量里找

过滤这个

1
ntlmssp

找到NTLMSSP_AUTH 包 打开流量包中的 Security Blob层 复制用户名、域名

然后过滤

1
ntlmssp.ntlmserverchallenge

查找NTLM Server Challenge字段,通常这个数据包是在NTLM_Auth数据包之前,将该值作为十六进制字符串复制到文本文档

最后需要的modifiedntlmv2response仍然在NTLM_Auth

需要我们在里面找到NTLMv2 Response

除了NTProofStr以外的就是我们要找的modifiedntlmv2response了(注意这里复制hex值)

==>得到的所有东西需要以

username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response

形式保存到txt文本里,然后使用hashcat爆破

1
2
3
.\hashcat -m 5600 hash.txt rockyou.txt
# 5600 表示NetNTLMv2模式
# rockyou是github上找的字典,还挺大

就能拿到密码了。

内存取证/磁盘取证

思路:

这种需要虚拟机来挂载文件,可以使用vmware或者FTK,我做的不多。。

或者用vera挂载的。

veracrypt

这个需要一个文件,可以挂载磁盘

而且可能会需要密钥和密钥文件,例子:

2024-12-12 162453

vol2 || vol3

可以使用vol2或3来分析

查看imageinfo——查看操作版本

1
vol.py -f image.raw imageinfo

lsadump——看用户密码

1
2
3
vol.py -f image.raw --profile=Win7SP1x86_23418 lsadump  
#profile后面跟的是imageinfo得到的操作版本
#lsadump需要安装插件

vol2的一些基本命令

1
2
3
4
5
6
7
8
# 识别操作系统的基本信息
vol.py mem.dump imageinfo
# 查看进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pslist
# 查看隐藏或者解链的进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 pstree
# 通过memdump爆破出进程对应的信息,3036是对应进程
vol.py -f OtterCTF.vmem --profile=Win7SP1x64 memdump -p 3036 --dump-dir=./

注意,mspaint.exe是画图进程,可能会藏东西,如果有的话可以dump下来,改后缀为.data,使用GIMP2打开图片。不断修改x,y的值直到看到藏的东西。(GIMP2可以在microsoft store里下到)

.vmdk文件

后缀为 .vmdk 的文件是 VMware 虚拟磁盘文件,通常用于虚拟机环境中存储虚拟机的磁盘数据。

可以使用虚拟机打开试试。

有些可以看010,有内容的话,可以尝试解密,有时候直接复制解密不了

可以使用kali自带的7z解密提取这些文件

1
7z x flag.vmdk -o./

解压后就能看到好几个文件夹

vhd文件

这是磁盘文件,可以直接双击打开,会发现多了两个磁盘,在磁盘里可以找东西

怎么虚拟化来看图形化界面?

使用Hyper-V搭建虚拟机(怎么下Hyper-V?可以看这个

注意挂载vhd的时候要选择第一代来挂载,不然会报错

进入后可以win+r看上一条命令找线索。

理论上也可以更改vhd格式来使用vmware挂载。

iso映像文件

一般是u盘文件,可以直接改后缀为zip然后解压,或者formost提取出里面的内容

pyjail / py沙盒逃逸

思路:

要看他给没给源代码,没有怎么猜测,给了怎么绕过黑名单/长度限制等等

ms-office题

思路:

可以改后缀为zip看看,文本里可能会把文字改成白色的来隐藏可以ctrla+改色看看

ms-office文件本质是zip

MS-Office文件word、excel、ppt本质都是zip文件,就可以隐写。

可以直接改后缀名为zip

如果后缀是docm的话可能有宏,在宏里看看

1.WPS自带宏查看,在 视图/宏/查看宏 里

2.使用olevba

1
olevba decode.docm

doc里隐藏文字

勾选文件/选项/显示/隐藏文字

然后看看有无隐藏的东西

视频题

思路:

我遇到的一般是在视频的某一帧里藏二维码之类的内容,需要好点的眼力

帧慢放

使用potplayer即可

其他 && 工具

反编译——这应该是reverse领域才对。。

pyc反编译

.pyc 是 Python 编译后的字节码文件,通常是在运行 Python 脚本时由解释器自动生成,用于加速程序运行

想查看 .pyc 文件的源码,可以使用反编译工具 uncompyle6 将其还原为 .py 文件。

-使用 uncompyle6

-在线网站 https://tool.lu/pyc/

exe反编译

使用IDA

apk反编译

使用jadx-gui-1.4.4-no-jre-win.exe

画图工具

gnuplot

得到诸如(7,7)的文本我们需要转化成 7 7 ,如

2024-11-20 212245

转化成 ↓ ↓ ↓

2024-11-20 213106

这里的转化我们可以使用脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with open('E:\meihuai.txt', 'r') as res:  # 坐标格式文件比如(7,7)
re = res.read()
res.close()

with open('E:\output.txt', 'w') as gnup: # 将转换后的坐标写入output.txt
re = re.split()
tem = ''
for i in range(0, len(re)):
tem = re[i]
tem = tem.lstrip('(')
tem = tem.rstrip(')')
for j in range(0, len(tem)):
if tem[j] == ',':
tem = tem[:j] + ' ' + tem[j+1:]
gnup.write(tem + '\n')
gnup.close()

然后再用

gnuplot

plot ‘zuobiao.txt’

来进行画图,画好后会自己打开

路由器配置查看工具

RouterPassView

-下载 https://routerpassview.en.lo4d.com/windows

使用方法:

用于恢复路由器密码的工具,能够从路由器中提取用户,密码,无线密钥等信息

RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置,然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码,路由器的登录密码,无线网络的关键。如果你失去了这些密码1 /钥匙,但你仍然有你的路由器配置的备份文件,RouterPassView可以帮助你从你的路由器恢复您丢失密码的文件。

010editor .zip模板对照表

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
+ ZIPFILERECORD record # 压缩源文件数据区
- char frSignature[4] # 压缩源文件标志
- ushort frVersion # 压缩源文件版本
- ushort frFlags # 压缩源文件标志 (有无加密,这个更改这里进行伪加密,改为01 00打开就会提示有密码了)
- enum COMPTYPE frCompression
- DOSTIME frFileTime # 压缩源文件时间
- DOSDATE frFileDate # 压缩源文件日期
- uint frCrc # 压缩源文件CRC32校验值
- uint frCompressedSize # 压缩源文件压缩后大小
- uint frUncompressedSize # 压缩源文件压缩前大小
- ushort frFileNameLength # 压缩源文件名长度
- ushort frExtraFieldLength # 压缩源文件扩展域长度
- char frFileName[frFileNameLength] # 压缩源文件名
- uchar frData[frCompressedSize] # 压缩源文件数据
+ ZIPDIRENTRY dirEntry # 压缩源文件目录区
- char deSignature[4] # 目录标志
- ushort deVersionMadeBy # 创建该条目的版本
- ushort deVersionNeeded # 解压该条目所需的版本
- ushort deFlags # 标志位 (判断是不是伪加密的位置,如果是真加密则两个都是0900,伪加密这个则是0000或0100)
- enum COMPTYPE deCompression # 压缩方法
- DOSTIME deFileTime # 最后修改时间
- DOSDATE deFileDate # 最后修改日期
- uint deCrc # CRC32校验值
- uint deCompressedSize # 压缩后的大小
- uint deUncompressedSize # 压缩前的大小
- ushort deFileNameLength # 文件名长度
- ushort deExtraFieldLength # 扩展域长度
- ushort deFileCommentLength # 文件评论长度
- ushort deDiskNumberStart # 起始磁盘编号
- ushort deInternalAttributes # 内部属性
- uint deExternalAttributes # 外部属性
- uint deRelativeOffset # 该条目在 ZIP 文件中的偏移位置
- char deFileName[deFileNameLength] # 文件名
- char deExtraField[deExtraFieldLength] # 扩展域
- char deFileComment[deFileCommentLength] # 文件评论
+ ZIPENDLOCATOR endLocator # 压缩源文件目录结束标志
- char elSignature[4] # 结束标志
- ushort elDiskNumber # 当前磁盘编号
- ushort elStartDiskNumber # 目录开始的磁盘编号
- ushort elEntriesOnDisk # 当前磁盘上的条目数量
- ushort elEntriesTotal # 总条目数量
- uint elSizeOfDirectory # 目录的总大小
- uint elOffsetOfDirectory # 目录开始的偏移位置
- ushort elCommentLength # 注释长度
- char elComment[elCommentLength] # 注释

一些kali的小知识

基本命令

1
2
3
4
5
6
ls  #列出所有东西
cd #切换
cat #查看
sudo su #提升权限至管理员
rm -rf profire_name #删除文件目录
ifconfig #查看ip地址

切换python版本

kali自带python2.7和python3.x,有时候需要我们切换

1
update-alternatives --config python

然后选序号就行

图形化桌面-远程连接

这个要自己下

1
kex

虚拟环境

Kali Linux 对 Python 包管理进行了限制,防止系统范围内的 Python 安装被破坏。所以有时候报错是需要使用虚拟环境

创建一个新的虚拟环境:

1
python3 -m venv env  #env是虚拟环境名称,可以更改

激活虚拟环境:

1
source env/bin/activate

在虚拟环境中就可以安装一些东西了

退出虚拟环境:

1
deactivate

删除虚拟环境只需要删除对应虚拟环境的目录即可

一些windows的小知识

基本命令

1
2
3
4
ls  #列出所有东西
cd #切换
cat #查看
ipconfig #查看ip地址

alt

按住alt再按小键盘的数字的话可以输出对应的ascii码值,比如我按住alt再按65的话会输出A

删除windows自带防火墙——windows defender

github网址: https://github.com/ionuttbara/windows-defender-remover