CTF部落
高质量CTF社区,致力于国内网CTF比赛研究,每日分享行业最新资讯,交流解答各类技术问题。星球中可以获取各类CTF比赛信息、解题工具、技巧、书籍、各种资源,发布政府机关、企业、厂商网络安全招聘信息,及内类内推资格。所有发布的内容均精心挑选、成体系化,让你远离无用信息及零碎的知识点。
CTF之misc杂项解题技巧总结(二)——隐写术
隐写术Steganography
(一)NTFS数据流隐写
(二)base64隐写
(三)图像隐写
(四)零宽字符隐写
(五)word隐写
(六)PYC隐写
(七)音频隐写
(八)文件合成与分离
(九)BMP/PDF隐写
【附】检测工具
隐写术Steganography
(一)NTFS数据流隐写
参考NTFS数据流隐写_m0re’s blog
NTFS是微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。NTFS比FAT文件系统更稳定,更安全,功能也更为强大。
这个NTFS数据流文件,也叫Alternate data streams,简称ADS,是NTFS文件系统的一个特性之一,允许单独的数据流文件存在,同时也允许一个文件附着多个数据流,即除了主文件流之外还允许许多非主文件流寄生在主文件流之中,它使用资源派生的方式来维持与文件相关信息,并且这些寄生的数据流文件我们使用资源管理器是看不到的。
(二)base64隐写
参考:[Base64隐写 (cltheorem.github.io)](https://cltheorem.github.io/2018/10/base64隐写/#:~:text=可以看出一串base64的编码最多也只有4bit的隐写空间,所以实现隐写往往需要大量编码串。,隐写时把明文的每个 字符用8位二进制数表示,由此将整个明文串转为bit串,按顺序填入base64编码串的可隐写位中即可实现隐写。)
题目:
- [GXYCTF2019]SXMgdGhpcyBiYXNlPw==
Base64码表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Base64是一种用64个可打印字符来表示二进制数据的方法。
base64编码
-
1个字节对应8个比特,一个可打印字符对应6个比特,即一个单元,将目标字串变成二进制数据流,然后6个一单元划分对应成码表的索引,用base64码表中的字符替换。
码文c和明文m的关系为len©×6==len(m)×8len©×6==len(m)×8,即len©×3==len(m)×4len©×3==len(m)×4,那么必须码文字符串的长度必须为4的倍数,明文字符串的长度必须为3的倍数。
-
对于明文字符串长度不足3的倍数的情况用每一个二进制位用0 bit0 bit补足直到满足明文字符串长度为3的倍数。
不难看出,一个base64码文最多可以有2个‘=’,最少可以没有等号(此时明文长度刚好是3的倍数)。
base64解码
-
把码文末端的
‘=’
去除 -
在其二进制数据的末尾丢弃最小数目的二进制位使二进制位数为8的倍数,然后8位一组进行ASCII编码。
base64隐写原理
在base64解码中,去除等号之后将末尾一些二进制位丢弃使二进制位数为8的倍数,所以一些隐藏数据可以写在可以被丢弃的部分,这部分可以随意写成任意值而不用担心影响解码的结果,同时也说明了不同的base64码文可能生成相同的明文。
下面是提取脚本
import re
path = 'flag.txt' #your path
b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open(path, 'r')as f:
cipher = [i.strip() for i in f.readlines()]
plaintext = ''
for i in cipher:
if i[-2] == '=': # There are 4-bit hidden info while end with two '='
bin_message = bin(b64char.index(i[-3]))[2:].zfill(4)
plaintext += bin_message[-4:]
elif i[-1] == '=': # There are 2-bit hidden info while end with one '='
bin_message = bin(b64char.index(i[-2]))[2:].zfill(2)
plaintext += bin_message[-2:]
plaintext = re.findall('.{8}', plaintext) # 8bits/group
plaintext = ''.join([chr(int(i,2)) for i in plaintext])
print(plaintext)
下面是隐写脚本
#!/usr/bin/env python
import base64
with open('./gitanjali.txt', 'r')as f:
data = [i.strip() for i in f.readlines()]
base64Data = [base64.b64encode(i) for i in data]
b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
msg = 'Gitanjali' # 隐写内容,注意隐写内容不应超过最大隐写bit数
msg_bit = ''.join([bin(ord(i))[2:].zfill(8) for i in msg])
offset = 0
new_data = []
for i in base64Data:
if i[-2]=='=': # There are 4-bit hidden info while end with two '='
offset = int(msg_bit[:4],2)
i = i.replace(i[-3], b64char[b64char.index(i[-3])+offset])
msg_bit = msg_bit[4:]
elif i[-1]=='=': # There are 2-bit hidden info while end with one '='
offset = int(msg_bit[:2],2)
i = i.replace(i[-2], b64char[b64char.index(i[-2])+offset])
msg_bit = msg_bit[2:]
new_data.append(i+"\n")
with open('./encodeFile.txt', 'w')as f:
f.writelines(new_data)
(三)图像隐写
EXIF信息隐藏
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。Exif信息是可以被任意编辑的,因此只有参考的功能。——《百度百科》
exiftool使用 exiftool查看图片属性 (yii3.cn)
有时候会出现许多文件的情况,此时想找出某一个关键的信息字段可以用下面的指令
exiftool *|grep flag #搜索当前文件夹下所有文件的exif信息中的flag字符
还有直接在图片属性的备注里给出flag,这种情况可以用010editor或者winhex等工具打开图片搜索关键字如flag、ctf等查看。
宽高修改
IHDR隐写(.png)
对.png格式的图片进行宽高的修改进而隐藏图片关键信息
-
原理:png图片的宽和高信息在png的IHDR数据块内,通过修改图片的宽和高数据使图片仅显示一部分,另一部分不显示
-
特征:010 Editor中打开后会出现CRC校验值错误的报错提示
-
破解:可以通过CRC值来暴破获取正确的宽值或者高值
import zlib
import struct
filename = #图片路径
crc_str= #图片的CRC值
# 同时爆破宽度和高度
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
#替换成图片的crc
if crc32result == crc_str:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))
.jpg宽高隐写
SOF0段的X_image
和Y_image
分别记录图片的宽和高,直接修改,不用担心校验错误。
.bmp宽高隐写
IDAT隐写(.png)
图像数据块 IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
-
储存图像像数数据
-
在数据流中可包含多个连续顺序的图像数据块
-
采用 LZ77 算法的派生算法进行压缩
-
可以用 zlib 解压缩
值得注意的是,IDAT 块只有当上一个块充满时,才会继续一个新的块。一旦出现不符合这个规律的情况(有一块IDAT还没填满但紧跟其后的是一个新的块),那么就是人为添加了数据块。
破解:010 editor直接提取出数据,然后扔进zlib解压脚本(如下)里解压获得原始数据。
#! /usr/bin/env python
import zlib
import binascii
IDAT = ".........".decode('hex') #填入dump出的IDAT数据
result = binascii.hexlify(zlib.decompress(IDAT))
print (result.decode('hex'))
print (len(result.decode('hex')))
LSB隐写
原理:LSB全称Least Significant Bit,最低有效位。PNG文件中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色,人类的眼睛可以区分约1000万种不同的颜色,这意味着人类的眼睛无法区分余下的颜色大约有6777216种,LSB隐写就是修改RGB颜色分量的最低二进制位(LSB),而人类的眼睛不会注意到这前后的变化,每个像素可以携带3比特的信息
判断方法(来源于网络,谨慎参考)
参考:png文件隐写——不负责任的总结:
-
LSB-Steganography工具实现的不加密隐写可以用Stegsolve查看,这种算法的特点就是LSB位前面很多0
-
[cloacked-pixel](https://github.com/livz/cloacked-pixel#:~:text=cloacked-pixel. Platform independent Python tool to implement LSB,Hide files within least significant bits of images.)工具实现的加密隐写(带密钥)可以用Stegsolve查看,这种算法的特点是开头有个数字,根据观察,这个数字应该是有用的数据的长度,然后才是很多个0,接着是相应长度的数据。
cloacked-pixel使用方法:
lsb.py hide <img_file> <payload_file> <password> #隐写 lsb.py extract <stego_file> <out_file> <password> #提取 lsb.py analyse <stego_file> #分析检测
提取工具:
-
对于不加密的LSB隐写:Stegsolve中extract
-
对于带密码的LSB隐写:[cloacked-pixel](https://github.com/livz/cloacked-pixel#:~:text=cloacked-pixel. Platform independent Python tool to implement LSB,Hide files within least significant bits of images.)
outguess隐写(.jpeg)
题目:[WUSTCTF2020]alison_likes_jojo
使用outguess实现隐写加密与解密
-
加密:
outguess -k "my secret key" -d hidden.txt in.jpg out.jpg
加密之后,in.jpg会覆盖out.jpg,hidden.txt中的内容是要隐藏的东西
-
解密:
outguess -k "my secret key" -r out.jpg hidden.txt
解密之后,解密内容放在hidden.txt中
-
检测:使用stegdetect工具可以检测
F5隐写
-
检测:使用stegdetect工具可以检测
-
提取:F5-steganography
盲水印
盲水印是一种肉眼不可见的水印方式,可以保持图片美观的同时,保护资源版权。
-
提取:
-
ImageIN:GUI交互(建议只得到一张图的情况下使用)
-
BlindWaterMark:命令行python脚本(CTF题中可能会给两张一样的图,这个时候用此工具更好)
JPHide(.jpeg)
先解压压缩JPEG图像,得到DCT系数;然后对隐藏信息用户给定的密码进行Blowfish加密;再利用Blowfish算法生成伪随机序列,并据此找到需要改变的DCT系数,将其末位变为需要隐藏的信息的值,最后把DCT系数重新压回成JPEG图片。
-
提取:JPHS
JPHS内置JPHIDE和JPSEEK
-
JPHide程序主要是实现将信息文件加密隐藏到JPEG图像功能,
-
JPSeek程序主要实现从用JPHide程序加密隐藏得到的JPEG图像探测提取信息文件
SilentEye(.jpeg)
(四)零宽字符隐写
参考:一个你所不知道的加密方式–零宽字符加密 - 知乎 (zhihu.com)
在线解码(需要多个网站都试试):
Unicode Steganography with Zero-Width Characters (330k.github.io)
隐藏字符加密 - 一个工具箱 - 好用的在线工具都在这里!(atoolbox.net)
Zero Width Lib (yuanfux.github.io)
辨别:把目标文本粘贴到vim中
零宽字符是一种在浏览器中不打印的字符,大致相当于 display: none ,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等
html中有三种零宽字符 – 零宽空格、零宽连字、零宽不连字
零宽字符在浏览器中对应的转义字符
零宽空格 --- ​
零宽不连字 --- ‌
零宽连字 --- ‍
零宽字符在Unicode中的编码为
\u200B \u200C \u200D
(五)word隐写
-
word中隐藏字段:在Word中选中要隐藏的字段,右击选择字体选项,在效果一栏中有隐藏选项,选中后即可隐藏。默认情况下隐藏文字是不会被打印出来的。
破解:如果想知道是否有隐藏文本,可在文件选项中单击文件→选项→显示文件→选项→显示,在
始终在屏幕上显示这些格式标记
标签下选择隐藏文字
复选框,即可查看,打印选项
标签勾选打印隐藏文字
即可打印。或者在保存文件后选择文件→检查→检查文件文件→检查→检查文件,查看是否有隐藏文字。 -
**白色背景下的白字无法被识别出有隐藏的文字 **。
破解:
-
全选改字体颜色为别的颜色
-
搜索字符串,例如flag等
-
word中隐藏图片:word中插入的图片分为嵌入式和非嵌入式,区别在嵌入式会跟着文本的位置产生移动,即有回车后,图片下移。但非嵌入的不会跟着文本走,即有回车后,图片保持原位置不动。
word改后缀名为zip然后解压
(六)PYC隐写
参考:pyc文件 - CTF Wiki (ctf-wiki.org)
原理是在 python 的字节码文件中,利用冗余空间,将完整的 payload 代码分散隐藏到这些零零碎碎的空间中。
例如,从 Python 3.6开始,有一个较大的改变,就是不管 opcode 有没有参数,每一条指令的长度都两个字节,opcode 占一个字节,如果这个 opcode 是有参数的,那么另外一个字节就表示参数;如果这个 opcode 没有参数,那么另外一个字节就会被忽略掉,一般都为00。
Stegosaurus 是一款隐写工具,它允许我们在 Python 字节码文件 (pyc 或 pyo) 中嵌入任意 Payload。由于编码密度较低,因此我们嵌入 Payload 的过程既不会改变源代码的运行行为,也不会改变源文件的文件大小。Payload 代码会被分散嵌入到字节码之中,所以类似 strings 这样的代码工具无法查找到实际的 Payload。Python 的 dis 模块会返回源文件的字节码,然后我们就可以使用 Stegosaurus 来嵌入 Payload 了。
-
提示:Stegosaurus 仅支持 Python3.6 及其以下版本
-
快速入门:-p 要隐藏的文本,-r 显示最大隐藏字节,-x可以解密
(七)音频隐写
DeepSound隐写
DeepSound 是一种隐写术工具和音频转换器,可将秘密数据隐藏到音频文件中。该应用程序还使您能够直接从音频文件或音频 CD 曲目中提取秘密文件。DeepSound 可用作 wave、flac、wma、ape 和音频 CD 的版权标记软件。DeepSound 还支持使用 AES-256(高级加密标准)加密机密文件以提高数据保护。该应用程序还包含一个易于使用的音频转换器模块,可以将多种音频格式(FLAC、MP3、WMA、WAV、APE)编码为其他格式(FLAC、MP3、WAV、APE)。
DeepSound 2.0 Free Download (soft112.com)
MP3stego隐写
MP3stego是命令行工具(也有图形界面的)
decode -X -P <your password> <your encoded filename>
SilentEye隐写
https://sourceforge.net/projects/silenteye/
(八)文件合成与分离
binwalk:可快速分辨文件是否由多个文件合并而成,并将文件进行分离。如果分离成功会在目标文件的目录。
分析文件:
binwalk filename
分离文件:
binwalk -e filename
formost命令:formost filename -o 输出的目录名
dd:当文件自动分离出错或者因为其他原因无法自动分离时使用
(九)BMP/PDF隐写
提取工具:wbStego Steganography Tool (bailer.at)
针对.bmp/.pdf隐写,得到的_is文件用notepad++打开
【附】检测工具
stegdetect
stegdetect 用来检测jpg
类型的图片是否隐藏着其他文件或内容。它可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息。
安装:
推荐在linux环境下,下载stegdetect 源码包之后进入其目录,执行下面指令
linux32 ./configure linux32 make
使用stegdetect时会有一些参数,下面简单罗列一下:
-
q ——仅显示可能包含隐藏内容的图像
-
n ——启用检查JPEG文件头功能,以降低误报率。如果启用,所有带有批注区域的文件将被视为没有被嵌入信息。如果JPEG文件的JFIF标识符中的版本号不是1.1,则禁用OutGuess检测。
-
s ——修改检测算法的敏感度,该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。
-
d ——打印带行号的调试信息。
-
t ——设置要检测哪些隐写工具(默认检测jopi),可设置的选项如下:
-
j ——检测图像中的信息是否是用jsteg嵌入的。
-
o ——检测图像中的信息是否是用outguess嵌入的。
-
p ——检测图像中的信息是否是用jphide嵌入的。
-
i ——检测图像中的信息是否是用invisible secrets嵌入的。
常用指令
stegdetect.exe -tjopi -s 10.0 hide.jpg
网络安全入门学习路线
其实入门网络安全要学的东西不算多,也就是网络基础+操作系统+中间件+数据库,四个流程下来就差不多了。
1.网络安全法和了解电脑基础
其中包括操作系统Windows基础和Linux基础,标记语言HTML基础和代码JS基础,以及网络基础、数据库基础和虚拟机使用等…
别被这些看上去很多的东西给吓到了,其实都是很简单的基础知识,同学们看完基本上都能掌握。计算机专业的同学都应该接触了解过,这部分可以直接略过。没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。
当然你也可以看下面这个视频教程仅展示部分截图:
学到http和https抓包后能读懂它在说什么就行。
2.网络基础和编程语言
3.入手Web安全
web是对外开放的,自然成了的重点关照对象,有事没事就来入侵一波,你说不管能行吗!
想学好Web安全,咱首先得先弄清web是怎么搭建的,知道它的构造才能精准打击。所以web前端和web后端的知识多少要了解点,然后再学点python,起码得看懂部分代码吧。
最后网站开发知识多少也要了解点,不过别紧张,只是学习基础知识。
等你用几周的时间学完这些,基本上算是具备了入门合格渗透工程师的资格,记得上述的重点要重点关注哦!
再就是,要正式进入web安全领域,得学会web渗透,OWASP TOP 10等常见Web漏洞原理与利用方式需要掌握,像SQL注入/XSS跨站脚本攻击/Webshell木马编写/命令执行等。
这个过程并不枯燥,一边打怪刷级一边成长岂不美哉,每个攻击手段都能让你玩得不亦乐乎,而且总有更猥琐的方法等着你去实践。
学完web渗透还不算完,还得掌握相关系统层面漏洞,像ms17-010永恒之蓝等各种微软ms漏洞,所以要学习后渗透。可能到这里大家已经不知所云了,不过不要紧,等你学会了web渗透再来看会发现很简单。
其实学会了这几步,你就正式从新手小白晋升为入门学员了,真的不算难,你上你也行。
4.安全体系
不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。
所以想要成为一名合格的网络工程师,想要拿到安全公司的offer,还得再掌握更多的网络安全知识,能力再更上一层楼才行。即便以后进入企业,也需要学习很多新知识,不充实自己的技能就会被淘汰。
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
尾言
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,最后联合CSDN整理了一套【282G】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦!
如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享