# 乌云归档：数据隐藏技术

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2016-01-29T08:30:00Z
Canonical: https://wepostx.com/topics/57

> 乌云历史资料归档
>
> **原始作者：** Gump
> **原始编号：** superkieran-wooyundrops:1023
> **原始发布时间：** 2016-01-29 16:30
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

数据隐藏已经渗透到了生活中的方方面面，之前一直对数据隐藏很有兴趣，但是乌云上关于数据隐藏的文章偏少，看了[隐写术总结](http://drops.wooyun.org/tips/4862)之后，我又去找了一些关于数据隐藏的资料，这里来与大家分享和总结下其他一些比较常见的隐藏手段，如果有写错的地方请直接指出，谢谢。

# 0x01 vmdk隐写

vmdk文件大家应该都比较熟悉了，它本质上是物理硬盘的虚拟版，所以也会存在跟物理硬盘的分区和扇区中类似的填充区域，我们可以利用这些填充区域来把我们需要隐藏的数据隐藏到里面去，这样可以避免隐藏的文件增加了vmdk文件的大小(如直接附加到文件后端)，也可以避免由于vmdk文件大小的改变所带来的可能导致的虚拟机错误。而且vmdk文件一般比较大，适合用于隐藏大文件。
这里采用Dsfok-tools来对数据进行隐藏，通常这个工具是用来编辑vmdk文件中的描述符。从[这里](http://www.sanbarrow.com/vmdk-tools.html)可以下载到该软件。套件里包含了dsfi工具可以对vmdk文件进行嵌入。 我们首先来看下需要隐藏的文件和它的大小

![原文图片](/media/2016/06/6966e3b65d7933a8f44cdfea4ababf0a)

![原文图片](/media/2016/06/6b5a910c4b0d62e6100f72e8a958f6d4)

按照下载页面的提示输入命令

![原文图片](/media/2016/06/0926f0b554e1cd0c824900ae170164a3)

嵌入完成后该vmdk文件依然是可以继续使用，而且虚拟机并不会报错。再来对嵌入的文件进行提取。

![原文图片](/media/2016/06/349d45dffb70831e1d14afdcbf5f051b)

![原文图片](/media/2016/06/d35f242967ec66e37361195bcc03a0aa)

这里要提醒的是，如果长期运行该虚拟机，隐藏在里面的数据是很有可能被覆盖掉，但是如果仅仅是作为数据隐藏的载体，除了需要提取的那个人外谁又在意这个问题呢，或许别人还巴不得这样。

# 0x02 交换数据流

Windows NTFS文件系统的交换数据流(ADS)也可以用于数据隐藏，对很多人来讲或者已经很熟悉了，这里也来做个小小的总结给不了解的同学开个头吧。
交换数据流的诞生源于Windows系统与苹果的HFS系统的交互需求，NTFS使用交换数据流来存储文件相关元数据等等。
创建交换数据流是很简单的

![原文图片](/media/2016/06/31c71bf278128f740d1627dfe3a03b77)

并输入This is hidden file
dir当前目录是找不到刚才编辑的那个文件的，只有一个0字节的visiable.txt

![原文图片](/media/2016/06/c2b57e5c5c04368f153e0ed021ea6403)

要用记事本打开打开刚才那个文件直接输入相同的命令就行了
在web安全中有时候还用得上ADS，如：
[pkav之当php懈垢windows通用上传缺陷](http://www.wooyun.org/bugs/wooyun-2014-071540)
当时在网上看资料的时候发现其实有不少人理解错了该漏洞的含义，原因就是不清楚ADS
对于 IIS6.0+PHP、IIS7.5+asp、IIS7.5+php 环境下，如果某目录通过 HTTP Basic 来认证，假设其目录下有 index.php 文件，我们可以通过构造如下方式来绕过认证直接访问其目录下的文件。

```text
#!bash /admin::$INDEX_ALLOCATION/index.php /admin:$i30:$INDEX_ALLOCATION/index.asp
```
ADS结合保留设备名来进行绑定，如:CON、NUL、COM1等等，这样在一些情况下可以避开某些软件对交换数据流的检测。
使用这些保留设备名作为目录名或文件名的时候会被系统提示错误，但我们可以使用\\?\来取消字符串的解析(通常这种方法用于Windows API编程)，这样就可以创建以保留设备名为名的文件或目录
如：绑定cmd.exe到NUL文件

![原文图片](/media/2016/06/00ab26a371f5cb0e54a9fb2bf78c4f48)

用wmic来运行即可

![原文图片](/media/2016/06/898436856e2262911137705d09357b31)

![原文图片](/media/2016/06/d6a0ea5db96f248ede072e975f26ef15)

关于ADS在web安全中的利用的资料：
[http://pan.baidu.com/s/1dDo9iQP](http://pan.baidu.com/s/1dDo9iQP) 提取码:1bft
xfocus上关于ADS的文摘：
[http://www.xfocus.net/articles/200212/466.html](http://www.xfocus.net/articles/200212/466.html)

# 0x03 TCP中的数据隐藏

我们都知道TCP的典型3次握手

![原文图片](/media/2016/06/0b1b73c424f005ebfb765b888581162b)

我们可以利用该过程对数据进行隐藏发送，如：

- 发送方和接受方规定一个常数X

- 发送方把要发送的每个字符的ASCII值*X并放在SYN字段中进行发送

- 接受方把接受到的SYN值除以常数X获得该字符的ASCII值
这种方法存在明显的局限性，就是每次只能传送1到2个字节，但是如果是用在隐藏发送短密钥或者短消息之类的不妨也是个好的方法。

# 0x04 可执行文件中隐藏

相比于jpeg文件来说，可执行文件能隐藏数据的空间非常小，jpge图像每17个字节就可以隐藏1个字节，而对于可执行文件则是每150个字节才可以隐藏1个字节。对于可执行文件的数据隐藏可以使用[Hydan](http://www.crazyboy.com/hydan/)，不过不得不说这个软件有点老，而且有时候还可能引入运行时错误。

# 0x05 在TTL字段中隐藏

IP报文在路由间穿梭的时候每经过一个路由，TTL就会减1，当TTL为0的时候，该报文就会被丢弃。TTL所占的位数是8位，也就是0-255的范围，但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发，远远比上限255小得多，所以我们可以用TTL值的前两位来进行传输隐藏数据。
如：须传送H字符，只需把H字符换成二进制，每两位为一组，每次填充到TTL字段的开头两位并把剩下的6位设置为1（xx111111），这样发4个IP报文即可传送1个字节。

# 0x06 后记

数据隐藏的范围实在是太大，除了用来在传输中隐藏数据外，还可以用于作为一种防护手段，给文档等提供标识等。希望大家能在乌云更多地交流关于数据隐藏方面的知识，相信你也会发现研究数据隐藏的乐趣的。

## Replies
