CTF之图片隐写

Posted 红帽小生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTF之图片隐写相关的知识,希望对你有一定的参考价值。

1、前言

CTF的全称是Capture The Flag,直译过来就是“获取旗帜”。这种比赛属于网络安全领域,是网络安全技术人员之间的一种竞技形式。CTF起源于1996年DEFCON全球黑客大会,以代替黑客们通过发起真实攻击进行技术比拼。

发展至今,全球已经有各种CFT类的比赛了,DEFCON作为CTF赛制的源头,DEFCON CTF自然成为了全球最高技术水平和影响力的CTF竞赛,类似于足球里的“世界杯” ,比赛的奖金也很高。

CTF既然叫“获取旗帜”,那么肯定得有个Flag,如下图,目标靶机里面藏着Flag,选手们通过各种手段去得到这个Flag,提交就可以拿到分数。

CTF比赛主要分为下面大三类:

  1. 解题模式 - Jeopardy
  2. 攻防模式 - Attack & Defense
  3. 混合模式 - Mix

而第一类解题模式又主要分为以下类型:

  • Web 网络攻防
  • RE 逆向工程
  • Pwn 二进制漏洞利用
  • Crypto 密码攻击
  • Misc 安全杂项

安全杂项的涉及范围也比较广,但比较喜欢考的就是"图片隐写"。今天我们讲的就是图片隐写。

2、图片隐写

隐写术对于刚接触CTF的人来说会感觉比较神奇。题目的Flag会隐藏到图片、音频、视频等各类数据载体中供参赛选手获取。要么是修改这些载体来隐藏flag,要么就是将flag隐藏在这些载体的二进制空白位置。有时需要很强的侦察能力才能发现(有时也需要脑洞)。此类题目考查选手们对各种隐写工具、隐写算法的熟悉程度。

2.1、 LSB隐写

图片一般由RGB三原色组成,每个像素点的R、G、B都占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216中颜色,人类的眼睛可以区分约1,000万种不同的颜色,剩下无法区分的颜色就有6777216。换句话说,人类对相近的颜色敏感度较低,因此部分像素点改变肉眼不容易察觉,LSB隐写就是利用这一特点,修改了像素中的最低位,把一些信息隐藏起来。

在计算机中,数据以二进制形式存储,假如某个像素点的一个值是255,二进制值是11111111,把最后一位替换成0,对应的十进制变为254,通过这一方法隐藏信息,但是肉眼不易察觉(写轮眼除外)。

那么如何获取隐写的Flag呢,这就需要一些工具,比较好使的是:Stegsolve。这个使用很方便,也很小巧,305KB,不到0.5MB,什么概念,比一张图片都小。如下图:

使用命令启动:

java -jar Stegsolve.jar

启动之后如图:

2.2、StegSolve

可以看到,菜单栏有三列:File、Analyse、Help。全部功能都在Analyse这列,File负责打开文件。我们随便打开一张图片:

File Format:查看文件格式。如下图:

该功能会显示图片的具体信息。最关键的是这个"Data Extract"功能,负责数据提取。如图:

左边是4个通道:Alpha(表示透明度)通道和R、G、B通道。Alpha表示透明度:Alpha=0表示完全透明,Alpha=255为完全不透明。颜色值前面讲过,是0-255,2的8次方,可以自由选择0-7任意一个通道(例如Red 勾选3,就是把图片中Red值为8的全部提取出来,2的3次方是8)。
右边的Bit Order有MSB和LSB,看到这个LSB大家就明白上面讲的了,MSB是一串数据的最高位,LSB是一串数据的最低位。
Bit Plane Order:这个是调整位平面的顺序,前面我们说过,每个像素点都有RGB三个值,即每像素点相当于有3层,3*8个bit。从LSB(最低有效位0)到MSB(最高有效位7)随着从位平面0 到位平面7,位平面图像的特征逐渐变得复杂,细节不断增加。

采用LSB隐写,每个像素可以携带3bit的信息。修改后肉眼无法区分,如下图:

左边3种绿色几乎不能区分(写轮眼除外)。我们只需要把最低位的二进制全部提取出来,就可以获取隐写的信息。

这种题目可以通过调整Bit Planes中的数值,预览文本框中的十六进制表,即可获取flag。
PS:png图片是一种无损压缩,也只有在无损压缩或无压缩的图片(bmp图片是一种无压缩)上实现LSB隐写,如果是jpg图片,就没法使用LSB隐写。

练习

最后出一道题,找出图片中的Flag,文件可以在本人公众号:极客随想,回复:图片隐写,即可获取(StegSolve工具和图片文件都已打包)。找到Flag后可以在评论区留言。

CTF—图片隐写+数据隐写

一、【图片隐写】

题目描述:

在实验主机上的C:\\Stegano\\3目录下提供了一个名为stego的文件,
找到一个形式为flag{word_word_word}的字符串。

预备知识

【TrID】
TrID是一款根据文件二进制数据特征进行判断的文件类型识别工具。
虽然也有类似的文件类型识别工具,但是大多数都是使用硬编码的识别规则,而TrID则没有固定的匹配规则,
TrID具有灵活的可扩展性,可以通过训练来进行文件类型的快速识别。

TrID通过附加的文件类型指纹数据库来进行匹配,可用于 取证分析、未知文件 识别等用途。

【BinWalk】
BinWalk是一个固件的分析工具,旨在协助研究人员对固件进行分析,提取及逆向工程用处。
简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,
还有重要一点的是可以轻松地扩展。最简单的使用方法很直接,提供文件路径和文件名即可。
【StegHide】
Steghide是一个隐写程序,其可以将数据隐藏在各种图片文件以及音频文件之中。
Steghide可以对隐写的数据进行加密和压缩操作。

考察意图:

考察选手的文件隐写取证分析能力,包括对工具TrID、BinWalk、StegHide等的了解。

分析文件类型

题目提供的文件没有文件扩展名,因此我们需要先确定文件的真实文件类型,
使用【TrID】工具可以对未知文件类型进行有效的识别。

1、打开cmd命令提示符,切换到相关路径下,然后使用TrID对文件进行识别,如图所示:

根据TrID的识别结果,这是一个GZip压缩文件,我们使用7Zip对其进行解压
得到另一个没有扩展名的文件,再次使用TrID对其进行识别,提示为TAR压缩文件,如图所示:
同样使用7Zip对其进行解压,得到 bowser.jpg 文件,是一张图片

内嵌文件数据分析

在CTF竞赛中,很多情况下会把一个文件的二进制数据嵌入到另一个文件之中,
对于[嵌入ZIP]之类的数据,我们可以尝试直接将文件名的后缀改为zip,
然后使用WinRAR之类的解压缩工具打开即可
但是对于未知的文件类型,这样可能就显得力不从心了,这里介绍一种通用的文件识别方法,就是使用BinWalk工具。

打开cmd命令提示符,切换到相关路径下。执行python binwalk命令来对bowser.jpg文件进行处理,如图所示:

从BinWalk的分析结果可以看出,JPG文件中有一个Zip压缩包,其文件偏移地址范围是0x226B5~0x2C842,这里我们使用C32Asm将Zip数据提取出来。

打开桌面上的【C32Asm工具】,选择 “文件”、“打开十六进制文件”载入C:\\Stegano\\3\\bowser.jpg文件,然后右键选择“定义选择块”
填入数据块的起始地址为 0x226B5,结束地址为 0x2C842,单击确定就选中数据块了
右键复制数据,然后新建一个十六进制文件,将原有的数据替换为复制的数据
保存即可得到压缩包文件。操作过程如图所示:


但是实际测试时发现压缩包不能正常解压,这是因为BinWalk对ZIP的识别机制还不完善,漏掉了ZIP文件末尾的一段数据,所以我们需要重新复制数据,文件的开始位置仍然是0x226B5,结束位置直到文件的末尾,如图所示:

这样提取出来的压缩包就可以正常解压了,得到图片文件MarioCastle.jpg

提取隐写数据

从实验步骤二中得到了MarioCastle.jpg文件,
这个图片里面显示有一个Passphrase字段,值为BaD_DR4G0N,
看到  [  Passphrase  ]我们就可以猜测使用了【steghide】进行数据隐写。
因此我们尝试使用steghide对MarioCastle.jpg进行隐写数据提取

打开cmd命令提示符,输入steghide extract -sf MarioCastle.jpg -p BaD_DR4G0N命令,提示没有任何可以提取的数据。

那么如果尝试对原来的 bowser.jpg 进行处理呢?实际测试表明bowser.jpg里面隐写了数据,通过steghide我们提取出了1.tar.gz文件,如图所示:

解压1.tar.gz文件,得到flaga.jpg文件,打开即可看到flag为flag{You_F0unD_M3}。

以上是关于CTF之图片隐写的主要内容,如果未能解决你的问题,请参考以下文章

2021-11-28 Misc 杂项略览 一 图片隐写1 直接隐写T.O.CTF

蓝鲸安全CTF打卡题——第一期隐写术

安全技术揭秘系列探索图片隐写的奥秘

CTF中图片隐藏文件分离方法总结

Web安全之CTF测试赛

蓝盾杯网络空间安全攻防对抗大赛小记