misc学习笔记
misc学习笔记
省赛组队之后感觉team里面可以来点数据安全和misc,之前也学过一些,这段时间就系统的学习一下,以下内容仅仅是个人学习!!并且也可以当作不出网参考材料
一举两得desuwa
题外话(省赛加油哇哇哇哇!!!!
隐写
这个其实之前已经学过了,很多东西大概都过一遍,再记录一下怎么装工具叭~
主要参考了这几篇文章,写的相当不错
https://cloud.tencent.com/developer/article/2130795
https://forum.butian.net/share/340
常见文件头总结
文件类型大部分是由文件头决定的,这也是经常出题的一点。查看文件头的话可以用010editer
比如这个就是一个png文件
总结一下常见的文件头(老图):
图片隐写
1、附加式的图片隐写
(1)附加字符串
操作系统识别,从文件头标志,到文件的结束标志位
当系统识别到图片的结束标志位后,默认是不再继续识别的
所以可以在文件尾后面加东西,这种算是比较基础的,010翻到最底下就能看见了。
(2)隐藏压缩文件
可以把压缩文件藏在图片文件尾后,看起来还是图片。
解决方法就是binwalk -e xxx.jpg
(3)EXIF隐写
就是在图片属性切换详细信息可以查看exif备注,一般出现在jpg的格式图片上。
还有一个exiftool的工具,使用方法是 exiftool xxx.jpg
2、基于文件结构的图片隐写
主要是针对PNG图片
标准的PNG文件结构应包括:
PNG文件标志
PNG数据块:关键数据块和辅助数据块,其中正常的关键数据块有长度、数据块类型码、数据块数据和CRC这4种
(1)png图片文件头数据块(IHDR)
PNG图片的第一个数据块
一张PNG图片仅有一个IHDR数据块
包括了图片的宽,高,图像深度,颜色类型,压缩方法等信息
省流就是可以修改图片长宽隐藏一些内容,我大一的时候整理了一个脚本,可以计算图片原本尺寸:
1 | import os |
然后去010editer改掉就好了
如何查看png长宽和CRC值:
先加载png模板:
然后在view查看结果:
(2)IDAT 数据块
在数据流中可包含多个连续顺序的图像数据块,写入一个多余的IDAT也不会多大影响肉眼对图片的观察
识别方法:
用pngcheck对图片进行检测pngcheck -v hidden.png
可能会出现一个size为0的异常块
这时候使用脚本提取内容:
1 | #!/usr/bin/python |
python solve.py stegano_image.png
3、LSB隐写
LSB,最低有效位,英文是Least Significant Bit,容量大、嵌入速度快、对载体图像质量影响小.在PNG和BMP上可以实现
原理:图片中的像素一般是由三种颜色组成,即三原色(红绿蓝),由这三种原色可以组成其他各种颜色,在png图片的存储中,每个颜色占有8bit,即有256种颜色,一共包含256的三次方颜色,即16777216种颜色,人类的眼睛可以区分约1,000万种不同的颜色,剩下无法区分的颜色就有6777216,LSB隐写就是修改了像素中的最低位,把一些信息隐藏起来
方法:stegsolve
俺本地的:java -jar StegSolve-1.5-alpha1.jar
还学到一手新的工具
zsteg a.png # 查看 LSB 信息
zsteg a.png –a # 尝试所有组合
zsteg a.png –v # 显示细节
4、对于两张相同图片的隐写
(1)盲水印
数字水印(digital watermark)
在数字化的数据内容中嵌入不明显的记号,被嵌入的记号通常是不可见或不可察的,可以通过计算操作检测或者提取
一般特征是题目提供了两张看起来一样的照片。
解决方法: https://github.com/chishaxie/BlindWaterMark.git。
用法:python bwmforpy3.py decode hui.png hui_wm_py3.png wm_out_py3.png
(2)组合进行不同运算(and、or、xor等)
还是用stegsolve,点击
之后会再让你打开一张图片,此时需要注意两张图片的打开顺序不同,运算的结果也不同,实际操作中就需要各位来回试一下了
文档隐写
1、隐藏文字(mac版)
点击屏幕左上角的苹果 logo 旁边的“Word”菜单。在下拉菜单中选择“偏好设置.”,“视图”(View)。“显示非打印字符”区域,找到并勾选“隐藏文字”(Hidden text) 选项。就可以接触隐藏文字。
2、通过解压文档进行隐藏:
由于 docx 文件实质上也是一种压缩包文件,可以对其改后缀为 zip 进行解压,逐一查看里面的文件是否隐藏了敏感信息。具体特征就就是一个过大的docx文件。
3、PDF隐写
wbStego43open 会将插入的数据中每一个 ASCII 码转换为二进制形式,并将其中的 0 替换成十六进制的 20,1 替换成十六进制的 09,最终将这些转换后的十六进制数据嵌入到 PDF 文件中。所以如果利用十六进制编辑器打开某个 PDF 文件,发现混入了许多由 20 和 09 组成的字符,可以猜测该文件存在 PDF 隐写。使用 wbStego43open 工具的 Decode 模块进行解密。可能会需要密码,下载地址:http://www.bailer.at/wbstego/(只有windows)
4、零宽隐写
零宽字符是一些不可见的,不可打印的字符。零宽隐写工具:https://330k.github.io/misc_tools/unicode_steganography.htmlhttps://330k.github.io/misc_tools/unicode_steganography.html
5、NTFS流隐写
NTFS数据流文件也被称为 Alternate data streams,简称ADS,是NTFS文件系统的一个特性之一,允许单独的数据流文件存在,同时也允许文件附着多个数据流,除了主文件流之外还允许许多非主文件流寄生在主文件流中,使用资源派生的方式来维持与文件的相关信息,并且这些寄生的数据流文件我们使用资源管理器无法看到。
注意一个点就是:WinRAR是支持NTFS数据流压缩的,如果使用不支持NTFS数据流压缩的软件进行解压,会丢失隐藏的数据,因此这个题目提示使用WinRAR打开。
做法:https://www.nirsoft.net/utils/alternate_data_streams.html(只有windows)下载扫描解压出来的rar目录。
音频隐写
摩斯电码
这个不多说了,特征就是打开有嘟嘟哒哒和电报一样的声音。音频隐写常使用 Audacity工具。
下载地址:(https://www.audacityteam.org/download/mac/)
MP3音频隐写
MP3stego 是著名的音频数据隐写工具。
支持常见的压缩音频文件格式如 mp3 的数据嵌入,它采用的是一种特殊的量化方法,并且将数据隐藏在 mp3 文件的奇偶校验块中。
下载地址:https://www.petitcolas.net/steganography/mp3stego/
(依旧只有windows,mac就别和misc沾边了好吗?)
使用该工具的 decode 命令进行对 sound.mp3 文件解密,会得到一个 sound.mp3.txt 文件,该文件里的信息即为被隐写的 data.txt 文件的内容。
波形图
通常来说对于音频中的波形图题目,在使用相关软件(Audacity, Adobe Audition 等)进行观察其波形规律,将波形进一步转化为 01 字符串等,从而提取转化出最终的 flag。可以利用python 代码将 01 字符串按照 7 位一组转成 ASCII 码,得到最终 flag。
频谱图
音频中的频谱隐写是将字符串隐藏在频谱中,此类音频通常会有一个较为明显的特征,听起来是一段杂音或者声音比较刺耳。
使用 Audacity 工具打开选择频谱图进行分析,没准可以直接看到flag。
视频隐写
视频隐写中最常见的就是将关键信息藏在某一帧或者某几帧中,所以我们要想拿到隐藏的信息可以将视频转换成图片。
常用工具:VideotoPicture、ffmpeg。这里我VideotoPicture没找到很好用的安装包,就brew install ffmpeg了,用法是:ffmpeg -i xxx.mp4 -r 30 %3d.jpg
压缩包相关
加密手段
一般可以将加密手段分为三种:未加密、真加密和伪加密。
未加密时,压缩文件数据区中的通用位标记应为 0000,并且压缩源文件目录区的通用位标记也为 0000,我们可以直接进行解压得到压缩包里面的内容。
真加密时,压缩文件数据区中的通用位标记应为 0900,并且压缩源文件目录区的通用位标记也为 0900,我们无法直接解压,需要输入正确的压缩包密码才能完成解压。

伪加密时,压缩文件数据区中的通用位标记的值无所谓,重点是压缩源文件目录区的通用位标记得存在奇数的情况,例如 0900,0100等,此时我们无法直接打开文件,且压缩包也不存在真正的密码,需要手动修改其标志位。

zip 伪加密破解
修改压缩源文件目录区的通用位标记为偶数即可。
直接放入 Linux 系统中,伪加密的文件是可以直接打开的,并不用输入密码。

rar 伪加密破解
RAR 文件由于有头部校验,使用伪加密时打开文件会出现报错,修改标志位后如果报错消失且正常解压缩,说明就是伪加密。

暴力破解
暴力破解即通过枚举的方式,将所有可能的情况都进行尝试。
常用工具:ARCHPR、Ziperello。
Ziperello 主要用于破解 ZIP 格式的压缩包。
ARCHPR 可以对多种压缩格式文件的密码进行破解。
(都是只有windows版本,之前都用过不多赘述了)
当使用纯数字没有破解出来时,可以增加英文字母,不过长度需要调小一点。
破解五位的数字加大小写字母时耗时预计 40 秒左右,六位时则需要 30 分钟左右。在 CTF 比赛中如果没有任何有关密码的提示,我们就可以尝试使用暴力破解去获取压缩包的密码。
字典攻击
比赛中如果存在对密码的提示,我们会优先采用字典破解的方式。
掩码攻击
如果已知密码的某几位,如已知 7 位密码中的第 3 位为 b,第 6 位为 c ,那么可以构造 ??b??c? 进行掩码攻击。
掩码攻击的原理相当于构造了第 3 位为 b,第 6 位为 c 的字典,因此掩码攻击的效率也比爆破高出不少。
明文攻击
我们对压缩文件设置密码时,密码首先被转换成 3 个 32bit 的 key,所有可能的 key 的组合就有 296 种,所以如果想要通过枚举的方式来破解这 3 个 key 的话基本上是不可能的。接着压缩软件会用生成的 3 个 key 加密压缩包中的所有文件。
如果我们能得到其中一个被加密的文件,就可以通过相同的压缩方式进行压缩,压缩完后与带密码的压缩包进行比对。找出两个文件的不同点,就是我们需要找的 key 了。
当然我们不需要做这么多麻烦的工作,在 ARCHPR 中有明文攻击这个功能,我们只需要填入两个压缩文件即可。
明文攻击是一种较为高效的攻击手段,我们不知道一个压缩包的密码,但是有此压缩包中的一个已知文件(文件需大于12Byte)时,因为同一个压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件。
注意:明文对应文件的加密算法得是 ZipCrypto Store 或是 ZipCrypto Deflate。
情景一:密码不难,可直接获得

情景二:密码很难,即使没有得到密码,只要得到下图框中的三个密钥,即可解密文件

CRC32碰撞
CRC 全称 Cyclic Redundancy Check(循环冗余校验),是为了保证数据正确采用的一种检错手段。
压缩包中的每个文件都有一个 CRC32 值,当文件中的内容改变时,它的 CRC32 的值也会随之改变。
枚举的方式在一定的长度内是可行的,所以长度很长的话,这种方法也就失效了。
例如一个文件,内容长度只有 4 字节,可以看到它的 CRC32 的值为 0x6526B899。我们可以利用脚本去遍历所有四位数字符串的 CRC32 值,如果和 a.txt 的 CRC32 相同,那么就能断定这个字符串就是 a.txt 中的内容。
1 | import string,binascii,itertools |
流量分析
主要参考了这篇文章和一些之前题目遇见过的简单知识点:https://www.freebuf.com/articles/web/330553.html
wireshark 基础
常见过滤器规则
1 | http: 按照 http 协议进行过滤显示 |
常见操作
追踪:
导出:
蚁剑(AntSword)
这里用 BUU UPLOAD COURSE 1 抓包先上手看看~
上传php文件之后,用蚁剑连接,打开监听之后在打开终端执行一些命令
蚁剑流量特征较为明显:
请求内容中参数有一些 14 字节长度的 16 进制字符;
响应内容中开头和结尾有随机 4-16 字节长度的 16 进制字符;
若流量经过编码的话,会有 eval、assert、base64、chr 等字符。
解密后的请求内容中会有 asenc、asoutput 等字符

哥斯拉(Godzilla)
下载地址:https://github.com/BeichenDream/Godzilla/releases
1.使用 Godzilla 生成 shell 文件
2.上传 shell 文件到服务端
3.使用 Godzilla 管理 webshell
Godzilla流量的特征有:
1.第一次请求的数据包通常要比后面的数据包要大很多,且其对应的响应内容为空;
2.响应包内容前后都有 16 字节长度的 16 进制字符;
3.请求报文里的 Cookie 末尾有个分号(;);
4.Accept 字段(弱特征)默认是:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
在 PHP_EVAL_XOR_BASE64 这种模式的流量的请求报文里可以直接解出 shell 内容,只需要经过“url解码->逆序字符->base64解码”即可得到 shell 内容。其内容和 PHP_XOR_BASE64 加密器生成的 shell 一样,因此其解密方式也是一样的。 而 PHP_XOR_RAW 这种模式的流量就只是少了 base64 加密,其他是一样的。
php实现解密
在 PHP_EVAL_XOR_BASE64、PHP_XOR_BASE64 模式下的流量解密:
1 | php实现解密 |
在 PHP_XOR_RAW 这种模式的流量相比于 PHP_EVAL_XOR_BASE64、PHP_XOR_BASE64 模式就只是少了 base64 加密,其他加密操作其实是一样的。因此我们可以先将密文通过 wireshark 的“文件->导出对象->HTTP”导出对应的密文文件,再对其进行解密即可。
在 PHP_XOR_RAW 模式下的流量解密:
1 | import gzip,base64 |
FTP流量分析
在传输文件时:
FTP客户端程序先与服务器建立连接,然后向服务器发送命令;服务器收到命令后给予响应,并执行命令。
如下图所示,可以看到ftp传输的所有信息,FTP是明文形式传输数据包,我们能在info中看到登录FTP的用户名、密码、执行命令等
(这里直接用文章的图片代替了)
客户端首先与FTP服务器TCP三次握手建立连接,建立连接成 功后,FTP服务器返回状态码220,表示服务就绪。
FTP服务器返回状态码220 特征: File Transfer Protocol (FTP) 220 Welcome to the FTP Server\r\n Response code: Service ready for new user (220) Response arg: Welcome to the FTP Server
向FTP服务器发送登录用户名:ftp并等待验证,用户名验证通过后,FTP 服务器返回状态码331,表示用户名验证已通过并需要输入密码。
特征:
File Transfer Protocol (FTP) USER ftp\r\n Request command: USER Request arg: ftp 使用了FTP协议,输入的用户名为ftp,请求的命令是USER,请求参数为ftp。
服务器返回331,用户名验证通过(存在此用户名) File Transfer Protocol (FTP) 331 User name ok, password required\r\n Response code: User name okay, need password (331) Response arg: User name ok, password required
将登录密码:123456发送给FTP服务器,FTP服务器验证后返回状态码 230,表示用户已经登录。

特征:
File Transfer Protocol (FTP) PASS 123456\r\n Request command: PASS Request arg: 123456 输入的密码为123456,请求的命令是PASS,请求参数为123456。
服务器返回230: File Transfer Protocol (FTP) 230 Password ok, continue\r\n Response code: User logged in, proceed (230) Response arg: Password ok, continue
终端向FTP服务器发送命令,FTP服务器返回状态码 200,表示命令执行成功
特征:
执行命令: File Transfer Protocol (FTP) PWD\r\n Request command: PWD 服务器返回200: File Transfer Protocol (FTP) 200 Connection established (60309)\r\n Response code: Command okay (200) Response arg: Connection established (60309)
TLS流量分析
首先TLS握手过程(经典寄网):
从 TLS 握手过程中可以知道,如果其中的主密钥暴露出来,就相当于能拿到双方协商好的会话密钥,从而可以对被加密的通信内容进行解密。
为了拿到主密钥相关内容,我们可以在环境变量里设置“SSLKEYLOGFILE”指向一个文件路径,例如桌面上的 a.log 文件。
接着启动浏览器访问 https 网址进行一系列操作,同时使用 Wireshark 进行抓包。抓到的数据包内容中 Protocol 字段表现为 TLS 协议。
此时刚才环境变量里“SSLKEYLOGFILE”所指向的路径已经生成了 a.log 文件,内容包括 TLS 握手过程中的 client random、server random、master secret 和事先商定好的加密方法等信息。
要完成对刚才截获的数据包进行解密,我们只需将该文件导入到 Wireshark 中去,即可对 TLS 流量进行解密。其中导入步骤为 编辑 -> 首选项 -> Protocols -> TLS。
导入 a.log 文件
导入完成后,Wireshark 会利用 a.log 文件里的内容计算出通信双方的会话密钥,接着对截获的数据包进行解密,其中“HTTP/JSON”协议的即为解密出来的数据报。
计算机取证
三种常见的取证场景:磁盘镜像取证、内存镜像取证、流量分析取证。
磁盘分区方式有多种,Windows下目前比较主流的是 FAT 和 NTFS,Linux下常见文件系统是ext2、ext3、ext4。
磁盘取证
工具:DiskGenius
下载地址:https://www.diskgenius.cn/download.php
使用方法:首先通过“磁盘->打开虚拟磁盘文件”功能打开磁盘文件,接着通过“恢复文件”功能可以找到一些已被删除的文件。
extundeleteextundelete是 Linux 文件恢复工具,无图形化界面。 可以恢复 ext3 与 ext4
内存取证
最常用的取证工具之一是 volatility
安装好之后参考常见用法:https://wiki.wgpsec.org/knowledge/ctf/Volatility.html
二维码
二维码通常分为堆叠式二维码和矩阵式二维码。
堆叠式二维条码 (如 PDF417) 是在一维条码的基础上,将多行条码堆叠而成。这种设计继承了一维条码的编码和识读原理,使其能兼容部分一维条码的设备与印刷技术。不过,由于存在多行,需要更复杂的算法来判断和解码各行数据 。
矩阵式二维条码 (如 QR 码) 则完全不同,它在一个矩形区域内,通过黑白像素(点)的矩阵排列来编码信息 。点的有无代表二进制的“1”和“0”,其组合决定了条码的含义 。这种条码基于计算机图像处理技术,我们日常最常见的二维码就属于这一类 。
根据坐标画二维码
1 |
|
根据 01 比特串画二维码
有时我们能拿到一个全是 01 bit 串的文件,目的就是依据 01 比特串进行画图。
1 | from PIL import Image |
批量扫描二维码
有时我们能拿到很多二维码,利用工具一个一个进行扫描不太现实,可以使用 python 的 pyzbar 进行批量扫描。
1 | from PIL import Image |
