独辟蹊径,Python打造新型基于图像隐写术的C2通道

0x00 前言

在11月下旬,我决定启动一个既有趣又有实际意义的项目,尝试提出了一种具有独特性的C2通道概念证明,其中涉及到隐写术和某种可信域名,而不再使用定制的基础结构。在我的研究过程中,广泛参考了较大时间跨度的许多红队资料,并从中收获了一些高级的概念。目前我们知道,网络中有一些代理工具或植入工具需要执行任务,并且需要将数据以隐蔽的方式发送回服务器。而这正是我们本次研究的重点。

我首先研究了与可信Web应用程序、可信域名相关的开源C2通道概念,并从中找到了许多不错的项目,例如Slackor、gcat和twittor。

然后,我明确了此次研究的目标:

1、打造一个有意思的工具;

2、创造一种独特的隐写术方法;

3、通过图像的方式传递任务与响应;

4、应用程序中不包含随机的Base64字符串转储;

5、使用可信的域名;

6、使用Python脚本来模拟代理工具或植入工具(我计划在明年完成Windows漏洞利用和原理研究后,再编写合适的植入工具)。

以上就是我们的目标,我们接下来就开始整个的研究过程。

0x01 选择一个受信任的域名

经过一些研究之后,我选择了Imgur平台。Imgur具有一些优势,我们可以匿名上传图像,也可以匿名创建临时站点访问者无法查看的相册。

但是,这个平台具有一个明显的缺点,匿名上传的图像无法在“图库”中建立索引并进行搜索。这也就意味着,要完成任务,我们必须对框架中“传递任务”的一方进行身份验证。我们会在后面完成这一实现。实际上,我们可以使用多种不同的方法来进行配置,在这里我研究的方法也许不是最佳方案,大家可以基于此再展开深入的研究。

0x02 打造新型隐写方法

2.1 常规思路,使用Alpha通道值

这一步骤,是我花费时间最多的步骤。要将JPEG文件上传至Imugr往往不是很可靠, JPEG格式的照片因为压缩的问题,无法保证其二进制完整性。经过一些研究,我发现PNG文件中除了Red、Green和Blue之外,还包含第四个像素值,称为“Alpha通道”。这个Alpha通道值将确定该像素的不透明度。在我检查的约30个PNG文件中,所有的Alpha通道值几乎都设置为了255,因此,这似乎是我们用来隐藏数据的一个理想目标。

我想到的第一种方法是对一个字符串(例如一个命令)进行简单地Base64编码,然后在Python中对一个字典进行硬编码,以便使所有可能的Base64字符都能充当键,并且可以对应于255-190之间的值。如果有分析人员手动检查了像素数据,可能就会发现这一点不同寻常之处,因为通常情况下的Alpha值几乎没有变化。更简单地说,在我的Python实现方案中存在一个巨大的错误,使我相信每次我打开PNG图像时,Python库PIL都会将Alpha通道值设置为255。因此,我放弃了这个方案,尽管这个方案除了会出现不同寻常的Alpha通道值之外,其他地方都很好。

 

接下来,还有一个选择正确图像尺寸的问题。Imgur允许不同的帐户类型上传不同大小的图片,这一点进行了严格的限制。经过身份验证的帐户最大可以上传5MB的PNG文件,而未经身份验证的帐户至多只能上传1MB的PNG文件,大于这个限制的图片文件将会被转换为JPEG格式。这样的限制,使得我无法应用我最开始提出的方案。

2.2 探寻新思路,使用红色数值的差异

最终,我想到了一种方法,该方法可以优先保证图像看起来像是正常的,同时还可以最大程度减少要更改的像素值。具体原理如下。

2.2.1 像素

在使用PIL Python库时,PNG像素值可以使用包含Red、Green、Blue和Alpha值的元组表示。利用这个库,我们可以在元组列表中收集图像的所有像素值。在2560×1440分辨率的图像中,列表中有360万个元素,每个元组都有四个值。元组列表类似于[(128, 0, 128, 255), (128, 0, 128, 255)…],这样重复了360万个元组。

2.2.2 利用思路

红色像素值的范围可以是0-255,之间,用二进制表示为00000000-11111111之间。我决定采用每个相邻红色像素的最低有效位的绝对差,并将8个值作为一组,形成一个新的二进制数值。接下来,我将详细说明这种思路。

假设我们有两个相邻的红色像素值128(二进制10000000)和128(二进制10000000),每个值的最低有效位是最右边的数字,在这里分别是0和0。那么,0和0的绝对差显然为0.因此,这种绝对差将构成我们新二进制数字的第一位。现在,我们得到的二进制数字是0xxxxxxx,我们将重复这一过程,每次都会向后计算接下来的两个红色值,最终获得一个8位的二进制数字。如果说一张图片中共有360万个像素的话,那我们就可以携带((3686400/2)/8)=230400个有效值。

2.2.3 用上述方式表示Base64编码

在有了8位二进制数字后,下一步就是以某种方式,将其转换为有意义的数字。在这一步骤中,我们是通过使用一个硬编码字典encode_keys来完成的,该字典如下所示:

encode_keys = {'=': '00000001', '/': '00000010', '+': '00000011', &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值