写在前面 有幸当上了这个冬令营桂电的负责人,然后也通过活动弄到了想要蛮久的零组文库邀请码,这个活动主要是面向零基础的小白入门 CTF 的,虽然我已经不算新手了,但是每次直播时间也不长,给自己查缺补漏吧,所以这就是2021涅普冬令营的直播随堂笔记啦
课程大纲
2021.2.1——教你如何在一张图片中隐藏不可告人的秘密
这次讲课的是Nepnep战队的贝塔姐姐,声音真的好好听
Misc介绍
miscellaneous 前四个字母,意为杂项,一锅端,大杂烩
主要类型
- 数据编码/图形密码
- 图片隐写
- 音频&视频隐写
- 流量分析
- 内存取证
- 游戏隐写
常用工具
- 010editor(winhex)
- 图片十六进制文件头+文件模板
常见文件头
JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 MS Word/Excel (xls.or.doc),文件头:D0CF11E0 Adobe Acrobat (pdf),文件头:255044462D312E ZIP Archive (zip),文件头:504B0304 RAR Archive (rar),文件头:52617221 Wave (wav),文件头:57415645 AVI (avi),文件头:41564920 Quicktime (mov),文件头:6D6F6F76
文件属性(exiftools)
kali
Misc必备知识
- 常见的文件头要记得
- 010editor / winhex 等工具使用熟练
- 学的东西广而杂,保持良好的心态
图片隐写分类
右击属性
- 就右键看看属性
文件末尾藏有字符串
- 可用 kali 里的
strings
程序,也可在010editor
中的模板直接看到 - Linux 中的
grep
命令,常用:grep -a "要查找的字符串" 图片.jpg
- Linux 中的
file
命令,用来查看文件类型,直接file 文件
文件包含
- kali 中的
binwalk
工具,直接binwalk 文件
用来查看是否有文件包含,分离常用有dd
和foremost
,dd
能分离出所有东西,foremost
可能不能分离出想要的所有东西,常用命令:binwalk -e 文件
、foremost 文件
、dd if=文件 of=分离出来的文件名 bs=1(每次读取一个块) skip=24437(从什么地方开始分离)
、foremost -t 需要恢复文件类型后缀 -i 扫描的分区 -o 指定存放文件目录(该目录必须为空)
修改文件头
- 只要破坏了文件头,就破坏了文件原有的二进制格式,就打不开了,比赛常见的是恢复原有文件格式,常见的有图片的(jpg、png、gif等),zip 的(伪加密)
GIF
- 用
Ps
逐个图层分析 - 注意特殊的帧和帧的时间间隔
Stegsolve
神器,懂的都懂
png(bmp)
修改文件的宽和高,可以直接 Windows 画图工具改,也可以用 010editor/winhex 改控制宽和高的位置,010editor 中
IHDR
可以看到位置(一般修改高,修改宽容易出问题,而且改的大小要注意,图片容易花)可通过
校验和
来检验文件是否被修改宽和高,选中IHDR
到宽的数据,用 010editor 中的校验和工具校验IDAT(图像数据块)
,所有的 png 图片的IDAT
都是不变的,因为要填充满每一个数据块,值一般为65524
,常用于 png 图片隐写的工具是pngcheck
,用来查看异常的IDAT
,常用命令pngcheck.exe -v 文件
IDAT 文件
00 00 00 27 数据长为39字节 49 44 41 54 IDAT标识 78 9C…… 压缩的数据,LZ77派生压缩方法 DA 12 06 A5 CRC校验
lsb隐写(只有 png 图片有)
,png 图片中的图像像数一般是由 RGB 三原色(红绿蓝)组成,每一种颜色占用 8 位,取值范围为 0x00~0xFF,即有 256 种颜色,一共包含了 256 的 3 次方的颜色,即 16777216 种颜色。而人类的眼睛可以区分约 1000 万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有 6777216 种,修改 Color 的二进制末尾两位(最低有效位(LSB)),颜色没有肉眼上的变化,但是每个像数可以携带 3 比特的信息,常用的工具是神器Stegsolve
,一把梭的zsteg
,wbStego4.3open
JPG
jphide(jphs)
,jphide
是一种隐写术,jphs
是用于解密的软件steghide
,很老的工具,不常用了,命令:steghide extract -sf good-文件.jpg -p 123456
stegdetect
,自动化一把梭工具,常用命令:stegdetect.exe -tjopi -s1000.0 *.jpg(查看图片隐写方式)
、stegbreak -r rules.ini -f password.txt -t p *.jpg(爆破密码,需要字典)
outguess
,工具下载地址https://github.com/crorvick/outguess,工具也可用来加密,解密常用命令:`outguess -k "key" -r 文件名 -t 保存文件名`F5-steganography
,工具下载地址https://github.com/matthewgao/F5-steganography,用于`F5隐写`,常用命令:`java Extract 图片 -p 密码`
双图隐写
- 泛指以两张图片为解题线索的题型,可能是一张图隐藏了另一张图,更多的是给了两张图,需要结合分析提取隐藏数据
- 常见解题思路有
图像格式拼接
、图层叠加(图像由图层叠加而成,而图层由像素组合而成)
、图像运算(图像的运算实质上是像素的运算。常见的图像运算方式有10种:加、减、乘、除、逻辑与、逻辑或、逻辑非、逻辑异或、按比混合和位移)
- 有具体的脚本,
Xor
stegpy
- 用 python 写的一个隐写工具,常用命令:
stegpy 隐写内容 XXX.jpg -p 设置的密码
silenteye
- 也是一个隐写工具,没啥好说的,百度都有教程
2021.2.2——明人不说暗话数据编码的㊙
常见进制及进制转换
hex
- 十六进制
ord
- 八进制
bin
- 二进制
- 01010100101,逢二进一
二进制转万物
- 二进制转 ascii 码:二进制转十进制,对应的 ascii 码
- 二进制转 morse 码:二进制转十进制,对应的 ascii 码是
.
和-
- 二进制转二维码(绘图):给出二进制字符串的位数可以开方,说明可能是一个正方形,再配合脚本转成二维码图片
from PIL import Image
MAX = 25
pic = Image.new("RGB",(MAX,MAX))
str = "二进制字符串"
i = 0
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([x,y],(0,0,0))
else:
pic.putpixel([x,y],(255.255.255))
i = i+1
pic.show()
pic.save("flag.png")
- 二进制转图片(hex):二进制转十六进制以后放 010/winhex 中打开保存为一个图片就行
- ......
常见编码
Ascii
Base 家族,最常见的就是
base64
,其原理就是:把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+,/这64个编码字符,=号不属于编码字符,而是填充字符)的原因,这样就需要一张映射表
- base32 :使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理,tips:末尾最多有6个=
- Base16 :使用数字0-9和字母A-F共计16个ASCII可打印字符对任意字节数据进行编码,tips:不会出现=
- Base36:包含0~9的数字,加上所有26个字母,不区分大小写,不包含任何标点,所有的字母要不全大写,要不全小写。所以加起来就是 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ,或者 0123456789abcdefghijklmnopqrstuvwxyz
- Base58:采用的字符集为123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ,从这不难看出,Base58 是纯数字与字母组成而且去掉了容易引起视觉混淆的字符
(0:数字零,O:大写O,I:大写i,l:小写L)
,9个数字+49个字母=58个,故称 base58。 - base62:就是26个字母的大小写再加上0-9,一共62个字符。相比于 base64 只是去掉了两个符号
(+和/)
- base85:是一种类似于 Base64 的二进制文本编码形式,通过使用五个 ASCII 字符来表示四个字节的二进制数据
- base91:由91个字符(0-9,a-z,A-Z,!#$%&()*+,./:;<=>?@[]^_`{|}”)组成
- base92:比 base91 多一个字符 〜
Morse:如图所示,还有变种,比如排列很像的例如 AAAAB BBBA,还有音频隐写中也有类似的,这些都可理解为摩斯变种
Shellcode:是一段用于利用软件漏洞而执行的代码,shellcode 为二进制的机器码,因为经常让攻击者获得 shell 而得名,经常使用如下所示的16进制格式来表示,我们也可以用16进制格式来表示其他隐写信息,常用就是先十六进制转十进制,十进制对应 ascii 得到明文
Urlencode:又叫百分号编码,是统一资源定位(URL)编码方式。
URL地址(常说网址)规定了常用的数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过 %xx 编码处理。
编码方法很简单,在该字节 ascii 码的16进制字符前面加 % 如
空格字符,ascii 码是 32,对应 16 进制是 '20' ,那么 urlencode 编码结果是:%20
Unicode:万国码,比如
\u574f\u5973\u4eba\u4e07\u5c81\uff01
和坏女人万岁!
aaencode(可以将 JS 代码转换成常用的网络表情,也就是我们说的颜文字 js 加密) 、jjencode(跟前一个差不多) 、uuencode(二进制信息和文字信息之间的转换编码)
Jsfuck(可以让你只用 6 个字符
[ ] ( ) ! +
来编写 JavaScript 程序) 、brainfuck(+ < ]
三个符号组成) 、ook!(都是由ook
组成)、short ook(! ? .
三个符号组成)直接找解密网站
敲击码:是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于 5 ×5 方格波利比奥斯方阵来实现的,不同点是是用 K 字母被整合到 C 中
- 二维码:用某种特定几何图形按一定规律在平面分步的黑白相间的图形记录数据符号信息
稀奇古怪的编码
- 社会主义核心价值观
- 与佛论禅
- 与熊论道
2021.2.3——关于我转生成为流量包的那些事
网络中的不同流量
互联网五层模型:自下而上,即物理层->数据链路层->网络层->传输层->应用层
这五层模型,不是相互独立的,属于包含关系,在数据传输过程中,数据包在每一层通过加包/解包的操作进行数据的识别、解析、工作还有传输
burpsuite 抓的是应用层的包,wireshark 抓的是数据链路层的包
传输层 TCP 三次握手四次挥手的大致流程:
客户端向服务端发送一个请求连接包,标识符为 SYN 序号为 J
服务端收到请求连接包,并对 SYN J 进行确认,然后发送一个回复包,标识符为 SYN K,ACK J+1
客户端向服务端发一个确认收到回复包,标识符为 ACK K+1
关于流量分析其实还是多做题,多分析,多用 wireshark