1、前言
CTF的全称是Capture The Flag,直译过来就是“获取旗帜”。这种比赛属于网络安全领域,是网络安全技术人员之间的一种竞技形式。CTF起源于1996年DEFCON全球黑客大会,以代替黑客们通过发起真实攻击进行技术比拼。
发展至今,全球已经有各种CFT类的比赛了,DEFCON作为CTF赛制的源头,DEFCON CTF自然成为了全球最高技术水平和影响力的CTF竞赛,类似于足球里的“世界杯” ,比赛的奖金也很高。
CTF既然叫“获取旗帜”,那么肯定得有个Flag,如下图,目标靶机里面藏着Flag,选手们通过各种手段去得到这个Flag,提交就可以拿到分数。
CTF比赛主要分为下面大三类:
- 解题模式 - Jeopardy
- 攻防模式 - Attack & Defense
- 混合模式 - 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后可以在评论区留言。