关于SVG的简介:
SVG格式文件是可缩放矢量图形文件的缩写,是一种标准的图形文件类型,用于在互联网上渲染二维图像。与其他流行的图像文件格式不同,SVG格式文件将图像存储为矢量,这是一种基于数学公式由点、线、曲线和形状组成的图形。图像文件格式可以分为两类:光栅图形和矢量图形。
我们熟知的PNG和JPEG就是光栅图形格式,它们将图像信息存储在彩色正方形网格中,也称为位图。该位图中的正方形组合在一起形成一个连贯的图像,很像计算机屏幕上的像素。光栅图形适用于需要指定每个像素的确切颜色的照片等高度详细的图像,具有固定的分辨率,因此增加大小会降低图像的质量。
矢量图形格式(如 SVG 和 PDF)的工作方式不同,矢量格式将图像存储为一组点和点之间的线,数学公式决定了这些点和线的位置和形状,并在放大或缩小图像时保持它们的空间关系,矢量图形文件还存储颜色信息,甚至可以显示文本。
使用010editor打开附件,发现一串base64编码,尝试解码
从开头可以看出是jpg格式,将文件保存
并且我们在结尾可以看到steghide并且密码为6位数字
关于Steghide的介绍:
这是一个命令行软件,可以用来将文件隐藏在图片或音频文件中,当然也可以从隐藏有文件的图片或音频中把隐藏文件提取出来,但是需要密钥。
假设密码是123456
该命令的用法:
将secret.txt文件隐藏到my.jpg中:steghide embed -cf my.jpg -ef secret.txt -p 123456
从my.jpg中提取出secret.txt文件:steghide extract -sf my.jpg -p 123456
由于steghide本身不具备爆破密码的功能,这里我们需要借助shell脚本
脚本1:
#bruteStegHide.sh #!/bin/bash for line in `cat $2`;do steghide extract -sf $1 -p $line > /dev/null 2>&1 if [[ $? -eq 0 ]];then echo 'password is: '$line exit fi done
脚本2:
#!/bin/bash if [ $# -lt 2 ]; then echo "Usage: $0 [steghide file] [dictionary file]" exit 1 fi file=$1 dict=$2 if [ ! -f $file ]; then echo "Error: File not found: $file" exit 1 fi if [ ! -f $dict ]; then echo "Error: Dictionary not found: $dict" exit 1 fi while read password; do if steghide extract -sf $file -p $password &> /dev/null; then echo "Password found: $password" exit 0 else echo "Trying: $password" fi done < $dict echo "Password not found" exit 1
在使用脚本前,我们还需要自己先创建用来爆破的密码字典
使用crunch命令,因为密码是6位的数字,我们创建000000-999999的字典即可
关于crunch命令的用法:
crunch <min-len> <max-len> [<charset string>] [options]
min-len crunch要开始的最小长度字符串,max-len crunch要开始的最大长度字符串,charset string 是指定设置的字符集,否则将使用缺省的字符集设置,缺省的设置为小写字符集,大写字符集,数字和特殊字符(符号),options则是后面可以追加的一些参数。
使用脚本进行爆破
我们使用./来执行脚本,如果权限不够就使用chmod命令,755表示加上可执行权限
执行脚本:./脚本名 要爆破的图片名 密码字典
这里要说一下:
爆破到正确key时会自动将txt文档分离出来,如果已经存在分离出txt时,再次爆破是找不到密码的
通过爆破得知密码是666666,且自动分离出了一个flag.txt
打开即可看到flag
此时已经存在这个flag.txt了,我们知道密码是666666,但是我们再去跑脚本
你会发现提示密码未找到,这是因为已经存在被分离出的文件
当然我们如果已经知道密码,也可以steghide命令直接提取
最终flag为
NSSCTF{svg?_base642png!&steghide!}