许多消费者个人跟踪设备的保质期似乎只有几年,因此,如果你想要长期记录你的进程,你就必须弄清楚如何绕过他们的应用从他们的服务器取回你自己的数据。否则,一旦他们的应用或服务器停止工作,你的数据就会消失。

我使用过两个跟踪设备,它们不容易导出数据,Microsoft Band(一款健康追踪可穿戴设备,2019年5月关闭)和Hello Sense(睡眠追踪器,2017年6月关闭,但从未发送过他们即将发布的数据导出说明),因此,我正在记录检索自己数据的过程,希望这对其他试图在其他设备上做同样事情的人有用。

Microsoft Band(2014年12月的记录)

当Microsoft Band发布时,我激动地发现这是第一款既配有心率传感器又配有全球定位系统(GPS)的腕带设备。通过分析,这款手环也遭遇了困扰许多有发展前景的可穿戴设备的同样问题,即无法导出我自己的每分钟数据。

1.jpeg

Microsoft Band可以同步到自己的智能手机应用“微软健康”(Microsoft Health)上,但在网上进行了一番搜索后发现,没有人知道有什么方法可以将他们的数据发布出去。我问微软研究院Microsoft Band的设计人员,他是否知道从Band中获取数据的方法,设计人员表示这种数据是不能公开的。

数据在哪里?

于是我从手机应用程序中提取数据,以找出这些数据是如何存储的。通过设法导出了一些文件,但在挖掘之后,我发现了具有每日摘要的缓存数据,而不是我所知道的存储在某个地方的每分钟的原始值,因为Microsoft Health应用中的睡眠图表显示了更细粒度的数据(见下图)。

2.png

我决定进一步挖掘并反编译应用程序,以通过读取应用程序代码来了解数据的去向。我在手机上使用了一个名为ES File Explorer的应用程序,以将应用程序包(apk文件)从手机下载到计算机上(右图)。

apk只是一个zip文件,下面是Microsoft Health apk文件解压缩后的样子。

3.png

该应用程序的主要代码位于一个名为classes.dex的文件中,该文件是Dalvik可执行文件,基本上是一个已编译的Java二进制文件。文件格式定义得很好,我很幸运找到了一个名为jadx的开源工具来反编译源代码。

在编译完classes.dex文件后,我浏览了几个文件夹,在“microsoft/”文件夹中找到了该文件夹,该文件夹似乎是Microsoft Health应用程序的根目录。

4.png

每个文件夹里都有数百个文件,所以我搜索了像“sleep”这样的关键字,然后发现“sleeppevents”是一个经常出现的词。

当我在/src/com/microsoft/krestsdk/services/KRestServiceV1.java中遇到这个getsleeppevents函数时,我感到很惊讶。

5.png

显然,为了获取睡眠事件,应用程序正在构造一个REST调用。所以Band必须与手机上的应用程序同步,而应用程序则与微软拥有的一些服务器同步。这解释了为什么我无法在应用的文件转储中找到原始数据,因为只有缓存的数据是本地存储的。

拦截消息

我的下一个直觉是尝试拦截我手机上的应用程序和微软服务器之间的数据,看看正在传输什么。通常,这是通过在应用程序中使用代理来完成的,因此我首先尝试在Android手机上启用代理(下面的左侧屏幕截图)。

6.png

经过一些测试,很明显,Android中的代理功能仅影响Web浏览器,而不影响Microsoft Health应用程序。因此,我尝试了另一种技巧:将手机wifi的网关(即路由器)设置为我的计算机,而不是使用DHCP,以便将所有网络数据发送到我的计算机。我编辑了此设置(上面的右侧屏幕截图)并启用了IP转发,因此网络数据包仍然可以到达互联网,而不是打到我的计算机上而丢失。

7.png

接下来,我检查了一下手机上的浏览器是否还在运行,结果证明这是个好兆头。然后是棘手的部分。我设置了一个数据包筛选器,以将传入的数据包转发到计算机上的其他端口。在一个新的.conf文件中:

8.png

然后运行以下pfctl(数据包过滤实用程序):

9.png

然后我安装了一个流量检查器(一个名为mitmproxy的开源工具),研究这些标志,直到我弄明白如何激活透明代理模式。

10.png

这基本上模拟了中间人攻击来拦截数据,注意,这只是捕获我的手机发送和接收的数据,所以这不是通常意义上的真正攻击,而只是我查看我的手机正在处理的数据的一种方式。

当我访问网站时,我可以放心看到流量通过mitmproxy控制台路由。但是,当我启动Microsoft Health应用程序时,它根本不会启动(下面的左侧屏幕截图)。

11.png

最终,我发现它使用的是HTTPS,该HTTPS在另一个端口上运行。所以我做了一些改变。首先,我在手机上安装了SSL证书,以便手机可以信任拦截消息的计算机(上面的右侧屏幕截图)。然后,我在数据包过滤器中添加了一行,以通过在.conf文件下面添加额外的一行并重新运行pfctl命令来也在HTTPS端口上转发数据包。

12.png

基本上,不是通过Microsoft Health应用程序通过HTTPS与Microsoft服务器进行通信,而是通过我的计算机路由所有通信。 mitmproxy工具拦截SSL密钥并注入自己的密钥,因此它可以解密和重新加密通过它的消息。

最后,我能够看到来自Microsoft Health应用程序的流量。幸运的是,这些请求很容易弄清楚,数据也很容易理解。

13.png

注意,为了请求数据,手机会向一个URL(如https://prodphseus.dns-cargo.com/v1/Events(eventId='1234567890')?$expand=Sequences)发出一个REST GET请求,如果你只对一个事件的数据感兴趣(比如昨晚的睡眠),那么此时你就会感到满意,因此你可以保存来自Microsoft prodphseus.dns-cargo.com服务器的响应并感到高兴。为了获得更多的事件,你可以简单地点击每次睡眠(左图),运动(右图),或其他类型的事件,直到你的手机(和你的电脑拦截信息)接收到所有的数据。然后将它们保存到一个文件中,你可以在你喜欢的文本编辑器中查看它,并使用脚本处理它。

14.png

获得完整的导出

但是如果你不想手动检查你手机上的每一个入口来让它传输数据呢?基本上,当你有Band而不是单个事件的时候,你可以获得整个时间的数据。然后回想一下本文开头的反编译Java代码,其中包含:

15.png

它提供了一个线索,可以检索完整的数据集而不必选择手机上的每个条目,你可以将URL编辑为:

16.png

简单地将URL粘贴到浏览器中是行不通的,因为你必须重用Microsoft Health应用正在使用的身份验证令牌,但编辑先前的请求应该可以让你检索整个原始数据流,而不必逐个检索每个事件。

总的来说,Band的工作原理是,一些数据被缓存在手机上,而其他数据则存储在微软的“云”服务器上。通过拦截手机应用程序对服务器的请求,你可以下载正在发送的原始数据,或检索你的整个历史数据,如心率、gps、步数等每分钟的数据。

Hello Sense(2017年1月的记录)

我非常喜欢用Hello Sense,这是一个颇受欢迎的Kickstarter项目,其口号是“了解更多,睡得更好”。这是一个设计精美的仪器,里面装有传感器,可以告诉你你的睡眠环境,还有一个枕头上的运动跟踪夹子。通过研究,我知道了这个设备是如何测量的。

17.png

用了几个月,我却发现无法从传感器获取数据,再次令人失望。相反,我只能查看它生成的图表,且只能看到Hello Sense应用允许我看到的内容。更令人气愤的是,Kickstarter的页面上承诺说:“我们正在开发工具,让你可以导出、使用或删除你的数据。”Hello Sense会同步到自己的智能手机应用程序Sense,但很显然,没有实际办法导出此数据。实际上,在寻找解决方案之后,我所能找到的只是其他用户对缺乏数据导出性的抱怨。

拦截消息

我将此作为一个挑战,并希望尝试与Microsoft Band相同的程序来拦截消息。许多应用程序将使用REST调用来请求数据的特定部分,因此知道如何这样做可以让你与保存数据的服务器进行对话。基本上,我会拦截Sense应用程序和它的服务器之间的消息,看他们如何验证并将我的数据传输到应用程序,以制作图表。然后我可以学习“语言”,模仿应用程序,从服务器请求我自己的数据。

和以前一样,我第一次在我的Android手机上启用代理(左下方截图),我的Macbook被设置为网关。然后再设置一个数据包过滤器,将传入的数据包转发到计算机上的其他端口。在新的.conf文件中:

18.png

然后像以前一样运行pfctl,并以透明代理模式启动mitmproxy来拦截数据。

19.png

最后,我在我的手机上安装了一个来自http://mitm.it的SSL证书,这样它就可以拦截通过https(端口443)发送的消息。

当访问网站时,流量通过我的mitmproxy控制台被正确地路由(见右上方的截图,可以看出我窃听了手机的Chrome浏览器导航)。然而,当我启动我的Hello Sense应用程序时,它没有正确连接到服务器,因为安全地连接到服务器时出现问题。

20.png

反汇编程序

我想更好地了解是什么在应用程序中导致错误出现,这次我使用Android Debug Bridge从我的手机中提取了apk文件。与Microsoft Ban应用程序一样,主代码位于apk中的一个名为classes.dex的文件中。

仔细检查代码后,很明显该应用程序使用了一个名为OkHttp的库,该库可以进行某种类型的证书固定。基本上,其中存在用于检查SSL证书是否正确的代码,如果不是,则会引发异常。此时,有两种选择:我可以反汇编该应用程序(请注意,反编译后的Java不能简单地重新编译为一个应用程序,因此需要将其反汇编为smali并进行编辑)并删除证书固定检查。

但是,当我在查看源代码时,我遇到了一个名为ApiService.java的文件,它显示了应用程序为从服务器检索数据而进行的REST API查询。因此,从理论上讲,我要做的就是发出与应用程序相同的查询,然后服务器会将原始数据发送回去!

21.png

注意,为了请求数据,手机使用了/v2/timeline/{date}/events/{type}/{timestamp}等链接。这个时间轴实际上就是我想要得到的在一个特定日期的晚上睡眠中发生的所有事件。

但是在我发送自己的REST查询之前,服务器会要求使用OAuth协议进行身份验证。 OAuth身份验证使用客户端ID和secret进行。因此,我在源代码树中搜索了此消息,并幸运地在一个简单的配置文件中找到了它。

22.png

我突出显示了指定客户端ID和secret的两行,这个文件还告诉我REST服务器的基本URL,它是https://api.hello.is,因此我现在有了所需的所有内容:REST服务的主机名,请求的格式以及客户端ID和secret。注意,还有几行被涂黑了,我认为这是不应该公开的秘密密钥。

发送POST请求

在任何web浏览器中发送GET请求都很容易,只需输入正确的URL即可。但制作一个POST请求,这是我需要做的,需要使用像curl这样的命令行工具或寻找一个应用程序来处理烦人的部分。我用的是邮差,它是免费的,设计简单(而且我喜欢双关语的应用程序名称)。

因此,我在POST请求中输入了适当的字段,使用了非常标准的OAuth格式。根据我在源代码中找到的内容,URL是https://api.hello.is/v1/oauth2/token。

让我有点惊讶的是,请求中的Content-Type标头需要设置为“application/x-www-form-urlencoded”,否则请求将被拒绝。一旦设置了该参数,POST请求的结果就是access_token,它使我能够访问可以使用其他查询获取的其余数据。在下面的屏幕截图中,我介绍了部分访问令牌,以防止人们窥探我的睡眠数据。

23.png

有趣的是,我在标头中将访问令牌用作“授权”字段(需要在其前面加上单词“Bearer”,以表明它是Bearer令牌类型)。现在,我可以将URL更改为所需的URL,在本例中为http://api.hello.is/v1/room/current,可以从任何地方查看我当前的房间状况。

24.png

如果你真的想对你的数据做些什么,你可以编写自己的脚本来自动验证,然后获取几天的数据,例如创建一个在线仪表板或向自己发送睡眠建议。

可能Hello Sense存储的最详细的数据是它如何对我在晚上的时间进行分类,分为醒着、中等睡眠、良好睡眠等。这是在应用程序中以条形图的形式显示的时间轴,但现在我可以访问实际数据来生成我自己的可视化效果,或进行比较和分析。一夜之间发生了很多事情,但情况是这样的。

25.png

好消息是,Hello Sense已经有了一个用于数据导出的API。我花了一些时间才弄清楚如何访问这些数据,但是我想他们还没有公开发布此信息,因为他们想为API提供更好的接口。

许多消费者个人跟踪设备的保质期似乎只有几年,因此,如果你想要长期记录你的进程,你就必须弄清楚如何绕过他们的应用从他们的服务器取回你自己的数据。否则,一旦他们的应用或服务器停止工作,你的数据就会消失。

我使用过两个跟踪设备,它们不容易导出数据,Microsoft Band(一款健康追踪可穿戴设备,2019年5月关闭)和Hello Sense(睡眠追踪器,2017年6月关闭,但从未发送过他们即将发布的数据导出说明),因此,我正在记录检索自己数据的过程,希望这对其他试图在其他设备上做同样事情的人有用。

Microsoft Band(2014年12月的记录)

当Microsoft Band发布时,我激动地发现这是第一款既配有心率传感器又配有全球定位系统(GPS)的腕带设备。通过分析,这款手环也遭遇了困扰许多有发展前景的可穿戴设备的同样问题,即无法导出我自己的每分钟数据。

1.jpeg

Microsoft Band可以同步到自己的智能手机应用“微软健康”(Microsoft Health)上,但在网上进行了一番搜索后发现,没有人知道有什么方法可以将他们的数据发布出去。我问微软研究院Microsoft Band的设计人员,他是否知道从Band中获取数据的方法,设计人员表示这种数据是不能公开的。

数据在哪里?

于是我从手机应用程序中提取数据,以找出这些数据是如何存储的。通过设法导出了一些文件,但在挖掘之后,我发现了具有每日摘要的缓存数据,而不是我所知道的存储在某个地方的每分钟的原始值,因为Microsoft Health应用中的睡眠图表显示了更细粒度的数据(见下图)。

2.png

我决定进一步挖掘并反编译应用程序,以通过读取应用程序代码来了解数据的去向。我在手机上使用了一个名为ES File Explorer的应用程序,以将应用程序包(apk文件)从手机下载到计算机上(右图)。

apk只是一个zip文件,下面是Microsoft Health apk文件解压缩后的样子。

3.png

该应用程序的主要代码位于一个名为classes.dex的文件中,该文件是Dalvik可执行文件,基本上是一个已编译的Java二进制文件。文件格式定义得很好,我很幸运找到了一个名为jadx的开源工具来反编译源代码。

在编译完classes.dex文件后,我浏览了几个文件夹,在“microsoft/”文件夹中找到了该文件夹,该文件夹似乎是Microsoft Health应用程序的根目录。

4.png

每个文件夹里都有数百个文件,所以我搜索了像“sleep”这样的关键字,然后发现“sleeppevents”是一个经常出现的词。

当我在/src/com/microsoft/krestsdk/services/KRestServiceV1.java中遇到这个getsleeppevents函数时,我感到很惊讶。

5.png

显然,为了获取睡眠事件,应用程序正在构造一个REST调用。所以Band必须与手机上的应用程序同步,而应用程序则与微软拥有的一些服务器同步。这解释了为什么我无法在应用的文件转储中找到原始数据,因为只有缓存的数据是本地存储的。

拦截消息

我的下一个直觉是尝试拦截我手机上的应用程序和微软服务器之间的数据,看看正在传输什么。通常,这是通过在应用程序中使用代理来完成的,因此我首先尝试在Android手机上启用代理(下面的左侧屏幕截图)。

6.png

经过一些测试,很明显,Android中的代理功能仅影响Web浏览器,而不影响Microsoft Health应用程序。因此,我尝试了另一种技巧:将手机wifi的网关(即路由器)设置为我的计算机,而不是使用DHCP,以便将所有网络数据发送到我的计算机。我编辑了此设置(上面的右侧屏幕截图)并启用了IP转发,因此网络数据包仍然可以到达互联网,而不是打到我的计算机上而丢失。

7.png

接下来,我检查了一下手机上的浏览器是否还在运行,结果证明这是个好兆头。然后是棘手的部分。我设置了一个数据包筛选器,以将传入的数据包转发到计算机上的其他端口。在一个新的.conf文件中:

8.png

然后运行以下pfctl(数据包过滤实用程序):

9.png

然后我安装了一个流量检查器(一个名为mitmproxy的开源工具),研究这些标志,直到我弄明白如何激活透明代理模式。

10.png

这基本上模拟了中间人攻击来拦截数据,注意,这只是捕获我的手机发送和接收的数据,所以这不是通常意义上的真正攻击,而只是我查看我的手机正在处理的数据的一种方式。

当我访问网站时,我可以放心看到流量通过mitmproxy控制台路由。但是,当我启动Microsoft Health应用程序时,它根本不会启动(下面的左侧屏幕截图)。

11.png

最终,我发现它使用的是HTTPS,该HTTPS在另一个端口上运行。所以我做了一些改变。首先,我在手机上安装了SSL证书,以便手机可以信任拦截消息的计算机(上面的右侧屏幕截图)。然后,我在数据包过滤器中添加了一行,以通过在.conf文件下面添加额外的一行并重新运行pfctl命令来也在HTTPS端口上转发数据包。

12.png

基本上,不是通过Microsoft Health应用程序通过HTTPS与Microsoft服务器进行通信,而是通过我的计算机路由所有通信。 mitmproxy工具拦截SSL密钥并注入自己的密钥,因此它可以解密和重新加密通过它的消息。

最后,我能够看到来自Microsoft Health应用程序的流量。幸运的是,这些请求很容易弄清楚,数据也很容易理解。

13.png

注意,为了请求数据,手机会向一个URL(如https://prodphseus.dns-cargo.com/v1/Events(eventId='1234567890')?$expand=Sequences)发出一个REST GET请求,如果你只对一个事件的数据感兴趣(比如昨晚的睡眠),那么此时你就会感到满意,因此你可以保存来自Microsoft prodphseus.dns-cargo.com服务器的响应并感到高兴。为了获得更多的事件,你可以简单地点击每次睡眠(左图),运动(右图),或其他类型的事件,直到你的手机(和你的电脑拦截信息)接收到所有的数据。然后将它们保存到一个文件中,你可以在你喜欢的文本编辑器中查看它,并使用脚本处理它。

14.png

获得完整的导出

但是如果你不想手动检查你手机上的每一个入口来让它传输数据呢?基本上,当你有Band而不是单个事件的时候,你可以获得整个时间的数据。然后回想一下本文开头的反编译Java代码,其中包含:

15.png

它提供了一个线索,可以检索完整的数据集而不必选择手机上的每个条目,你可以将URL编辑为:

16.png

简单地将URL粘贴到浏览器中是行不通的,因为你必须重用Microsoft Health应用正在使用的身份验证令牌,但编辑先前的请求应该可以让你检索整个原始数据流,而不必逐个检索每个事件。

总的来说,Band的工作原理是,一些数据被缓存在手机上,而其他数据则存储在微软的“云”服务器上。通过拦截手机应用程序对服务器的请求,你可以下载正在发送的原始数据,或检索你的整个历史数据,如心率、gps、步数等每分钟的数据。

Hello Sense(2017年1月的记录)

我非常喜欢用Hello Sense,这是一个颇受欢迎的Kickstarter项目,其口号是“了解更多,睡得更好”。这是一个设计精美的仪器,里面装有传感器,可以告诉你你的睡眠环境,还有一个枕头上的运动跟踪夹子。通过研究,我知道了这个设备是如何测量的。

17.png

用了几个月,我却发现无法从传感器获取数据,再次令人失望。相反,我只能查看它生成的图表,且只能看到Hello Sense应用允许我看到的内容。更令人气愤的是,Kickstarter的页面上承诺说:“我们正在开发工具,让你可以导出、使用或删除你的数据。”Hello Sense会同步到自己的智能手机应用程序Sense,但很显然,没有实际办法导出此数据。实际上,在寻找解决方案之后,我所能找到的只是其他用户对缺乏数据导出性的抱怨。

拦截消息

我将此作为一个挑战,并希望尝试与Microsoft Band相同的程序来拦截消息。许多应用程序将使用REST调用来请求数据的特定部分,因此知道如何这样做可以让你与保存数据的服务器进行对话。基本上,我会拦截Sense应用程序和它的服务器之间的消息,看他们如何验证并将我的数据传输到应用程序,以制作图表。然后我可以学习“语言”,模仿应用程序,从服务器请求我自己的数据。

和以前一样,我第一次在我的Android手机上启用代理(左下方截图),我的Macbook被设置为网关。然后再设置一个数据包过滤器,将传入的数据包转发到计算机上的其他端口。在新的.conf文件中:

18.png

然后像以前一样运行pfctl,并以透明代理模式启动mitmproxy来拦截数据。

19.png

最后,我在我的手机上安装了一个来自http://mitm.it的SSL证书,这样它就可以拦截通过https(端口443)发送的消息。

当访问网站时,流量通过我的mitmproxy控制台被正确地路由(见右上方的截图,可以看出我窃听了手机的Chrome浏览器导航)。然而,当我启动我的Hello Sense应用程序时,它没有正确连接到服务器,因为安全地连接到服务器时出现问题。

20.png

反汇编程序

我想更好地了解是什么在应用程序中导致错误出现,这次我使用Android Debug Bridge从我的手机中提取了apk文件。与Microsoft Ban应用程序一样,主代码位于apk中的一个名为classes.dex的文件中。

仔细检查代码后,很明显该应用程序使用了一个名为OkHttp的库,该库可以进行某种类型的证书固定。基本上,其中存在用于检查SSL证书是否正确的代码,如果不是,则会引发异常。此时,有两种选择:我可以反汇编该应用程序(请注意,反编译后的Java不能简单地重新编译为一个应用程序,因此需要将其反汇编为smali并进行编辑)并删除证书固定检查。

但是,当我在查看源代码时,我遇到了一个名为ApiService.java的文件,它显示了应用程序为从服务器检索数据而进行的REST API查询。因此,从理论上讲,我要做的就是发出与应用程序相同的查询,然后服务器会将原始数据发送回去!

21.png

注意,为了请求数据,手机使用了/v2/timeline/{date}/events/{type}/{timestamp}等链接。这个时间轴实际上就是我想要得到的在一个特定日期的晚上睡眠中发生的所有事件。

但是在我发送自己的REST查询之前,服务器会要求使用OAuth协议进行身份验证。 OAuth身份验证使用客户端ID和secret进行。因此,我在源代码树中搜索了此消息,并幸运地在一个简单的配置文件中找到了它。

22.png

我突出显示了指定客户端ID和secret的两行,这个文件还告诉我REST服务器的基本URL,它是https://api.hello.is,因此我现在有了所需的所有内容:REST服务的主机名,请求的格式以及客户端ID和secret。注意,还有几行被涂黑了,我认为这是不应该公开的秘密密钥。

发送POST请求

在任何web浏览器中发送GET请求都很容易,只需输入正确的URL即可。但制作一个POST请求,这是我需要做的,需要使用像curl这样的命令行工具或寻找一个应用程序来处理烦人的部分。我用的是邮差,它是免费的,设计简单(而且我喜欢双关语的应用程序名称)。

因此,我在POST请求中输入了适当的字段,使用了非常标准的OAuth格式。根据我在源代码中找到的内容,URL是https://api.hello.is/v1/oauth2/token。

让我有点惊讶的是,请求中的Content-Type标头需要设置为“application/x-www-form-urlencoded”,否则请求将被拒绝。一旦设置了该参数,POST请求的结果就是access_token,它使我能够访问可以使用其他查询获取的其余数据。在下面的屏幕截图中,我介绍了部分访问令牌,以防止人们窥探我的睡眠数据。

23.png

有趣的是,我在标头中将访问令牌用作“授权”字段(需要在其前面加上单词“Bearer”,以表明它是Bearer令牌类型)。现在,我可以将URL更改为所需的URL,在本例中为http://api.hello.is/v1/room/current,可以从任何地方查看我当前的房间状况。

24.png

如果你真的想对你的数据做些什么,你可以编写自己的脚本来自动验证,然后获取几天的数据,例如创建一个在线仪表板或向自己发送睡眠建议。

可能Hello Sense存储的最详细的数据是它如何对我在晚上的时间进行分类,分为醒着、中等睡眠、良好睡眠等。这是在应用程序中以条形图的形式显示的时间轴,但现在我可以访问实际数据来生成我自己的可视化效果,或进行比较和分析。一夜之间发生了很多事情,但情况是这样的。

25.png

好消息是,Hello Sense已经有了一个用于数据导出的API。我花了一些时间才弄清楚如何访问这些数据,但是我想他们还没有公开发布此信息,因为他们想为API提供更好的接口。

Duo与Microsoft Windows客户端和服务器操作系统集成,可以为远程桌面和本地登录添加双因素身份验证。不过Duo的双因素身份验证早在2018年就已经被绕过了。

最近研究人员在使用Duo的双重身份验证解决方案时就是这种情况。然而,他们能够发现相同双因素身份验证的两种变体。这依赖于将受害者的推送通知重定向到攻击者控制的设备,从而授权访问受害者的账户。目前研究人员已经把这个问题提交给了Duo,详情请点击这里

在仔细查看Burp中生成的HTTP流量时,研究人员决定对Duo进行再次查看。研究人员有额外的应用程序帐户,可以用来进行安全测试,这很重要,你很快就会看到。在典型的身份验证流程中,用户最终会触发通过POST请求发送到Duo终端的双因素身份验证,例如:

1.png

请求Duo API

研究人员使用攻击者帐户登录到应用程序,并捕获了前面提到的双因素身份验证请求。研究人员复制了请求(从Cookie标头向下的所有内容)并删除了请求。接下来,研究人员登录了第二个受害者的账户。拦截该请求后,研究人员将其替换为攻击者帐户请求。接下来,向攻击的目标账号的设备发送双因素身份验证请求。但研究人员现在可以伪装成受害者进行账号登陆了。现在,双因素身份验证已经发送到攻击者的设备了。

令人惊奇的是,它竟然奏效了。研究人员想这可能是一种侥幸,所以研究人员用其他账户和设备进行了类似地测试。

为了成功绕过,攻击者需要在其控制的设备上启用Duo的有效应用程序帐户,以及仅访问受害者的凭据的权限。

第一次绕过尝试

下一步是确定哪个请求参数标识了请求推送通知的用户,研究人员首先尝试使用Cookie值。比较并复制多个请求的Cookie值,以识别可能用于识别用户的任何部分,但没有任何结果。

接下来检查请求正文中的sid参数,此时研究人员再次查看了几个请求,试图识别sid的任何部分是否为标识符。在没有明确指示研究人员需要sid的哪一部分的情况下,他们只是复制了整个值。这招奏效了!研究人员现在可以只使用sid值而不是完整的请求来绕过双因素身份验证。

下图显示了绕过请求的示例流程:

2.png

原始受害者推送通知请求

3.png

受害者sid替换为攻击者的sid

概括起来就是,攻击者登录到应用程序,并请求发送一个双因素身份验证推送通知发送到目标设备。复制请求中的sid并删除请求,以使其永远不会到达Duo且不会触发推送通知。接下来,攻击者使用受害者的凭据登录并请求双因素身份验证推送通知。截获该请求,并将请求中的sid替换为先前复制的攻击者sid。这会将推送通知发送到攻击者的设备,使他们可以接受双因素身份验证提示。

现在研究人员可以在客户端应用程序上复制一个绕过流程,有人建议研究人员在能够访问的另一个Duo实例上尝试它,以确认问题是来自Duo还是来自客户端实现。经过一些测试,研究人员发现绕过也适用于Duo的第二个实例,这意味着这不是一个实现错误。

发现攻击变体

第一种方法非常不稳定,通常会失败,因为sid会严重超时,这使它对时间非常敏感,并且如果你花费太长时间进行复制/粘贴,则会失败。此时研究人员开始寻找另一种方法来可靠地进行绕过。

当请求双因素身份验证时,将返回一个事务ID (txid)。这个令牌被连续轮询以确认用户是否接受了推送请求。

4.png

服务器响应中的事务ID

5.png

发送到用户设备的推送通知

6.png

用户接受的推送通知和登录已批准

上面的屏幕截图显示当用户请求推送通知时,txid是从服务器返回的。然后,在随后的请求中使用txid来查询状态。通过在一个设备上接受推送,删除请求,然后将txid复制到另一个用户的请求中,你可以欺骗Duo,使其认为第二个用户已经接受了该推送。

这种绕过方法被证明是比较稳定的,它还允许用户在使用txid之前接受推送。

漏洞报告

研究人员已经撰写了一份详细说明绕过的报告发给了Duo Security。他们迅速做出反应并修复了漏洞。为了确认Duo是否进行了修复,研究人员尝试使用sid和txid值,但现在两种绕过方法都不起作用。

7.png

受害者用户双因素身份验证请求

8.png

带有攻击者txid的受害者请求

每次尝试任何绕过时,服务器都会以“无效的txid”响应。

Duo与Microsoft Windows客户端和服务器操作系统集成,可以为远程桌面和本地登录添加双因素身份验证。不过Duo的双因素身份验证早在2018年就已经被绕过了。

最近研究人员在使用Duo的双重身份验证解决方案时就是这种情况。然而,他们能够发现相同双因素身份验证的两种变体。这依赖于将受害者的推送通知重定向到攻击者控制的设备,从而授权访问受害者的账户。目前研究人员已经把这个问题提交给了Duo,详情请点击这里

在仔细查看Burp中生成的HTTP流量时,研究人员决定对Duo进行再次查看。研究人员有额外的应用程序帐户,可以用来进行安全测试,这很重要,你很快就会看到。在典型的身份验证流程中,用户最终会触发通过POST请求发送到Duo终端的双因素身份验证,例如:

1.png

请求Duo API

研究人员使用攻击者帐户登录到应用程序,并捕获了前面提到的双因素身份验证请求。研究人员复制了请求(从Cookie标头向下的所有内容)并删除了请求。接下来,研究人员登录了第二个受害者的账户。拦截该请求后,研究人员将其替换为攻击者帐户请求。接下来,向攻击的目标账号的设备发送双因素身份验证请求。但研究人员现在可以伪装成受害者进行账号登陆了。现在,双因素身份验证已经发送到攻击者的设备了。

令人惊奇的是,它竟然奏效了。研究人员想这可能是一种侥幸,所以研究人员用其他账户和设备进行了类似地测试。

为了成功绕过,攻击者需要在其控制的设备上启用Duo的有效应用程序帐户,以及仅访问受害者的凭据的权限。

第一次绕过尝试

下一步是确定哪个请求参数标识了请求推送通知的用户,研究人员首先尝试使用Cookie值。比较并复制多个请求的Cookie值,以识别可能用于识别用户的任何部分,但没有任何结果。

接下来检查请求正文中的sid参数,此时研究人员再次查看了几个请求,试图识别sid的任何部分是否为标识符。在没有明确指示研究人员需要sid的哪一部分的情况下,他们只是复制了整个值。这招奏效了!研究人员现在可以只使用sid值而不是完整的请求来绕过双因素身份验证。

下图显示了绕过请求的示例流程:

2.png

原始受害者推送通知请求

3.png

受害者sid替换为攻击者的sid

概括起来就是,攻击者登录到应用程序,并请求发送一个双因素身份验证推送通知发送到目标设备。复制请求中的sid并删除请求,以使其永远不会到达Duo且不会触发推送通知。接下来,攻击者使用受害者的凭据登录并请求双因素身份验证推送通知。截获该请求,并将请求中的sid替换为先前复制的攻击者sid。这会将推送通知发送到攻击者的设备,使他们可以接受双因素身份验证提示。

现在研究人员可以在客户端应用程序上复制一个绕过流程,有人建议研究人员在能够访问的另一个Duo实例上尝试它,以确认问题是来自Duo还是来自客户端实现。经过一些测试,研究人员发现绕过也适用于Duo的第二个实例,这意味着这不是一个实现错误。

发现攻击变体

第一种方法非常不稳定,通常会失败,因为sid会严重超时,这使它对时间非常敏感,并且如果你花费太长时间进行复制/粘贴,则会失败。此时研究人员开始寻找另一种方法来可靠地进行绕过。

当请求双因素身份验证时,将返回一个事务ID (txid)。这个令牌被连续轮询以确认用户是否接受了推送请求。

4.png

服务器响应中的事务ID

5.png

发送到用户设备的推送通知

6.png

用户接受的推送通知和登录已批准

上面的屏幕截图显示当用户请求推送通知时,txid是从服务器返回的。然后,在随后的请求中使用txid来查询状态。通过在一个设备上接受推送,删除请求,然后将txid复制到另一个用户的请求中,你可以欺骗Duo,使其认为第二个用户已经接受了该推送。

这种绕过方法被证明是比较稳定的,它还允许用户在使用txid之前接受推送。

漏洞报告

研究人员已经撰写了一份详细说明绕过的报告发给了Duo Security。他们迅速做出反应并修复了漏洞。为了确认Duo是否进行了修复,研究人员尝试使用sid和txid值,但现在两种绕过方法都不起作用。

7.png

受害者用户双因素身份验证请求

8.png

带有攻击者txid的受害者请求

每次尝试任何绕过时,服务器都会以“无效的txid”响应。

在本文中,我们将演示另一种通过利用 Python 库和脚本在基于 Linux 的设备上提升权限的方法。

通常,要在具有 python 文件的环境中发起攻击时。攻击者可以用来提升其访问权限的选项是有限的。我们将在本文中发现 3 种方法。一些错误配置包括写入权限、sudo 权限和编辑路径变量。

Python脚本创建

为了演示使用 python 脚本提升权限的操作,我们创建了一个导入一些库的示例脚本。在现实场景中,这可以是一群漏洞利用人员正在漏洞利用的通用 Python 脚本或项目。在现实场景中,这些很容易找到,并且可能包含与此类似的脚本。该脚本导入 webbrowser 模块,然后继续使用 open 函数运行设备上的默认 Web 浏览器以打开 hackingarticles 网页。

1.png

为了查看脚本是如何工作的,我们运行脚本并发现 Web 浏览器打开了 hackingaricles 网页,如下所示。

2.png

方法一

此漏洞基于应用于脚本导入的模块文件的权限。当正在导入的模块文件具有允许任何用户进行编辑的权限时,它就会成为一个漏洞。在我们创建的python脚本中,有被调用的 webbrowser.py 模块文件。当你拥有一个具有所有默认权限的未更改环境时,这不是问题,但在漏洞利用环境中,往往会在安全性方面做出一些妥协,而不是较小的便利性。为了更好地理解什么在后台运行,什么权限会导致权限升级,我们将首先在我们的ubuntu环境中创建这个漏洞,然后使用Kali Linux来利用这个漏洞。

漏洞创建

如前所述,在这种方法中,漏洞基于模块文件的权限。要创建此漏洞,我们需要先定位模块文件。我们使用 locate 命令来找到它。看到它位于/usr/lib/python3.8/中。这可能因安装而异。因此,请尝试在你的环境中找到它。然后我们可以看到,模块文件默认的权限是拥有者的读、写、执行权限,组的执行和读取权限,其他的只有执行权限。这意味着除非用户是 root,否则它不能编辑文件。为了创建漏洞,我们更改了权限,以便每个用户都可以读取、写入和执行这些权限。

3.png

使我们的设备容易受到攻击的下一个任务是提供一种运行python脚本的方法,最简单的方法是在sudoers文件中创建一个条目,这样攻击者(可以访问用户pavan)就能够执行我们创建的python脚本(hack.py)。

4.png

这是一个完整的过程,使设备容易受到 Python 库劫持。所有没有提到的配置都被设置为Linux的默认配置。没有任何其他变化,现在就可以伪装成攻击者了。

漏洞利用

漏洞利用不会包含在目标设备上获得初始立足点的方法。它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到可以使用python3.8来运行hack.py。作为攻击者,我们使用 cat 命令调查脚本以查看它是否正在通过 webbrowser 的名称导入模块。我们使用locate命令查找模块的位置,发现它位于/usr/lib/python3.8中。接下来,我们检查模块的权限,发现它可由我们有权访问的 pavan 用户写入的。

5.png

我们使用 nano 编辑器打开模块文件,并在 hack.py 文件调用的函数中添加了 python 逆向 shell 脚本。我们之前看到它在浏览器中打开了一个网页。因此,它将使用 open 函数。此时,就可以添加如下所示的逆向 shellcode。

6.png

编辑完模块文件后,我们保存并关闭编辑器。回到 Kali Linux 控制台,我们在逆向 shell 脚本中提到的端口上打开一个 Netcat 监控程序,然后以 pavan 用户身份返回 shell 并使用 sudo 执行 hack.py 脚本,如图所示。

7.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 whoami 命令揭示了我们拥有的会话是针对目标设备上的 root 用户的。我们已经成功地将权限从 pavan 用户提升到了 root 用户。

8.png

方法二

此漏洞是基于应用于脚本导入的Module文件的Python库路径的优先级顺序。当一个模块被导入到脚本中时,Python将在默认目录中按照特定的优先级顺序查找特定的模块文件。在我们创建的python脚本中,webbrowser.py模块文件被调用。正在搜索的模块将位于一个默认路径中。尽管在与原始脚本相同的目录中存在一个python模块文件,它将获得高于默认路径的优先级。为了更好地理解后台发生了什么,它如何导致特权升级,我们将首先在ubuntu环境中创建这个漏洞,然后使用Kali Linux来利用这个漏洞。

漏洞创建

如前所述,在这种方法中,漏洞基于模块文件执行的优先级顺序。要创建此漏洞,首先,我们需要恢复之前创建的易受攻击的权限。这样这台设备就不会以多种方式受到攻击,这就要求必须更改 webbrowser.py 的权限。

9.png

接下来,我们回到之前创建的 python 脚本。我们可以看到它位于 pavan 用户的家中,它仍然包含与我们开始时相同的代码。它仍然导入 webbrowser 模块。

10.png

由于我们将脚本从 pentest 用户主目录移动到 pavan 用户的主目录,我们还需要在 sudoers 文件中进行更改,以便它包含脚本 hack.py 的正确路径。

11.png

这是一个完整的过程,使设备容易受到 Python 库劫持。所有没有提到的配置都被设置为Linux的默认配置,如果没有任何其他变化,我们就可以伪装成攻击者了。

漏洞利用

同样,该漏洞利用不会包含在目标设备上获得初始立足点的方法,它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到可以使用python3.8来运行hack.py。作为一个攻击者,我们使用cat命令调查这个脚本,看它是否正在导入一个名为webbrowser的模块。

12.png

由于 hack.py 位于 pavan 用户的主目录中,并且我们以 pavan 用户的身份访问,因此我们可以在主目录中创建一个文件。在这种情况下,需要注意的是我们无法编辑 hack.py 文件。如果是这种情况,我们将直接编辑该文件并在其中添加一个逆向 shellcode,但在这种情况下,我们将创建一个 webbrowser.py 文件。我们将在刚刚创建的 webbrowser.py 文件中添加 python的 逆向 shellcode。

13.png

接下来,我们需要在逆向 shellcode 中提到的端口上运行一个 Netcat 监控程序。然后我们将继续使用 sudo 执行 hack.py 脚本。

14.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 id 命令提示我们拥有的会话是针对目标设备上的 root 用户的。我们已经成功地将权限从 pavan 用户提升到了 root 用户。

15.png

方法三

此漏洞基于通过 Python PATH 环境变量搜索的 Python 库。这个变量包含一个目录列表,python 在其中搜索导入模块的不同目录。如果攻击者可以更改或修改该变量,则他们可以使用它来提升目标设备上的权限。为了更好地了解后台发生了什么,它是如何导致权限提升的,我们将首先在运行的 ubuntu 环境中创建该漏洞,然后使用 Kali Linux 来利用该漏洞。

漏洞创建

如前所述,这种方法的漏洞是基于环境路径变量的。要创建此漏洞,首先,我们需要恢复之前创建的易受攻击的权限。这样这台设备就不会以多种方式受到攻击。我们在 tmp 目录中创建 hack.py 脚本,就可以验证脚本的内容是否与之前相同。

16.png

接下来,我们需要在 sudoers 文件中进行一些更改。首先,我们将文件的位置更改为 /tmp 目录,然后将 SETENV 标记添加到文件中。这意味着 pavan 用户可以使用具有 sudo 权限的 SETEV 命令,而无需输入 root 密码。 SETENV 是一种工具,它可以更改 PYTHONPATH 环境变量的值,以将任何位置包含到我们在前面的方法中学到的执行顺序中。

17.png

这是使设备容易受到 Python 库劫持的完整过程。所有没有提到的配置都被设置为Linux的默认配置。如果没有任何其他变化,就可以伪装成攻击者了。

漏洞利用

同样,利用不会包含在目标设备上获得初始立足点的方法。它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到我们可以使用具有提升访问权限的 SETEV。这意味着我们可以使用它来改变导入模块的优先级顺序。由于 hack.py 位于 /tmp 目录中,我们可以进入它并检查 hack.py 脚本。

18.png

因为它正在导入web浏览器模块,所以我们首先将创建一个名为webbrowser.py的恶意模块文件,然后使用更改环境变量PYTHONPATH的功能,我们将创建一个条目以包含我们的恶意模块文件。恶意模块文件包含逆向shellcode。我们在脚本中提到的相同端口上启动一个 Netcat 监控程序,然后继续将 /tmp 目录添加到 Python 路径中,然后执行 hack.py 文件以提升我们的访问权限。

19.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 whoami 命令说明了我们拥有的会话是针对目标设备上的 root 用户的。此时,我们已经成功地将权限从 pavan 用户提升到了 root 用户。

20.png

结论

在本文中,我们能够为 Python 库的环境设置三个真实攻击场景,然后引入了一些可能导致攻击者将其访问权限提升到root级别的错误配置。漏洞利用环境是最有针对性的环境之一,因为在这些环境中,执行任务的便利性优先于环境的安全性。这再次证明,一个错误配置的设置足可以导致全局毁灭性的结果。

在本文中,我们将演示另一种通过利用 Python 库和脚本在基于 Linux 的设备上提升权限的方法。

通常,要在具有 python 文件的环境中发起攻击时。攻击者可以用来提升其访问权限的选项是有限的。我们将在本文中发现 3 种方法。一些错误配置包括写入权限、sudo 权限和编辑路径变量。

Python脚本创建

为了演示使用 python 脚本提升权限的操作,我们创建了一个导入一些库的示例脚本。在现实场景中,这可以是一群漏洞利用人员正在漏洞利用的通用 Python 脚本或项目。在现实场景中,这些很容易找到,并且可能包含与此类似的脚本。该脚本导入 webbrowser 模块,然后继续使用 open 函数运行设备上的默认 Web 浏览器以打开 hackingarticles 网页。

1.png

为了查看脚本是如何工作的,我们运行脚本并发现 Web 浏览器打开了 hackingaricles 网页,如下所示。

2.png

方法一

此漏洞基于应用于脚本导入的模块文件的权限。当正在导入的模块文件具有允许任何用户进行编辑的权限时,它就会成为一个漏洞。在我们创建的python脚本中,有被调用的 webbrowser.py 模块文件。当你拥有一个具有所有默认权限的未更改环境时,这不是问题,但在漏洞利用环境中,往往会在安全性方面做出一些妥协,而不是较小的便利性。为了更好地理解什么在后台运行,什么权限会导致权限升级,我们将首先在我们的ubuntu环境中创建这个漏洞,然后使用Kali Linux来利用这个漏洞。

漏洞创建

如前所述,在这种方法中,漏洞基于模块文件的权限。要创建此漏洞,我们需要先定位模块文件。我们使用 locate 命令来找到它。看到它位于/usr/lib/python3.8/中。这可能因安装而异。因此,请尝试在你的环境中找到它。然后我们可以看到,模块文件默认的权限是拥有者的读、写、执行权限,组的执行和读取权限,其他的只有执行权限。这意味着除非用户是 root,否则它不能编辑文件。为了创建漏洞,我们更改了权限,以便每个用户都可以读取、写入和执行这些权限。

3.png

使我们的设备容易受到攻击的下一个任务是提供一种运行python脚本的方法,最简单的方法是在sudoers文件中创建一个条目,这样攻击者(可以访问用户pavan)就能够执行我们创建的python脚本(hack.py)。

4.png

这是一个完整的过程,使设备容易受到 Python 库劫持。所有没有提到的配置都被设置为Linux的默认配置。没有任何其他变化,现在就可以伪装成攻击者了。

漏洞利用

漏洞利用不会包含在目标设备上获得初始立足点的方法。它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到可以使用python3.8来运行hack.py。作为攻击者,我们使用 cat 命令调查脚本以查看它是否正在通过 webbrowser 的名称导入模块。我们使用locate命令查找模块的位置,发现它位于/usr/lib/python3.8中。接下来,我们检查模块的权限,发现它可由我们有权访问的 pavan 用户写入的。

5.png

我们使用 nano 编辑器打开模块文件,并在 hack.py 文件调用的函数中添加了 python 逆向 shell 脚本。我们之前看到它在浏览器中打开了一个网页。因此,它将使用 open 函数。此时,就可以添加如下所示的逆向 shellcode。

6.png

编辑完模块文件后,我们保存并关闭编辑器。回到 Kali Linux 控制台,我们在逆向 shell 脚本中提到的端口上打开一个 Netcat 监控程序,然后以 pavan 用户身份返回 shell 并使用 sudo 执行 hack.py 脚本,如图所示。

7.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 whoami 命令揭示了我们拥有的会话是针对目标设备上的 root 用户的。我们已经成功地将权限从 pavan 用户提升到了 root 用户。

8.png

方法二

此漏洞是基于应用于脚本导入的Module文件的Python库路径的优先级顺序。当一个模块被导入到脚本中时,Python将在默认目录中按照特定的优先级顺序查找特定的模块文件。在我们创建的python脚本中,webbrowser.py模块文件被调用。正在搜索的模块将位于一个默认路径中。尽管在与原始脚本相同的目录中存在一个python模块文件,它将获得高于默认路径的优先级。为了更好地理解后台发生了什么,它如何导致特权升级,我们将首先在ubuntu环境中创建这个漏洞,然后使用Kali Linux来利用这个漏洞。

漏洞创建

如前所述,在这种方法中,漏洞基于模块文件执行的优先级顺序。要创建此漏洞,首先,我们需要恢复之前创建的易受攻击的权限。这样这台设备就不会以多种方式受到攻击,这就要求必须更改 webbrowser.py 的权限。

9.png

接下来,我们回到之前创建的 python 脚本。我们可以看到它位于 pavan 用户的家中,它仍然包含与我们开始时相同的代码。它仍然导入 webbrowser 模块。

10.png

由于我们将脚本从 pentest 用户主目录移动到 pavan 用户的主目录,我们还需要在 sudoers 文件中进行更改,以便它包含脚本 hack.py 的正确路径。

11.png

这是一个完整的过程,使设备容易受到 Python 库劫持。所有没有提到的配置都被设置为Linux的默认配置,如果没有任何其他变化,我们就可以伪装成攻击者了。

漏洞利用

同样,该漏洞利用不会包含在目标设备上获得初始立足点的方法,它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到可以使用python3.8来运行hack.py。作为一个攻击者,我们使用cat命令调查这个脚本,看它是否正在导入一个名为webbrowser的模块。

12.png

由于 hack.py 位于 pavan 用户的主目录中,并且我们以 pavan 用户的身份访问,因此我们可以在主目录中创建一个文件。在这种情况下,需要注意的是我们无法编辑 hack.py 文件。如果是这种情况,我们将直接编辑该文件并在其中添加一个逆向 shellcode,但在这种情况下,我们将创建一个 webbrowser.py 文件。我们将在刚刚创建的 webbrowser.py 文件中添加 python的 逆向 shellcode。

13.png

接下来,我们需要在逆向 shellcode 中提到的端口上运行一个 Netcat 监控程序。然后我们将继续使用 sudo 执行 hack.py 脚本。

14.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 id 命令提示我们拥有的会话是针对目标设备上的 root 用户的。我们已经成功地将权限从 pavan 用户提升到了 root 用户。

15.png

方法三

此漏洞基于通过 Python PATH 环境变量搜索的 Python 库。这个变量包含一个目录列表,python 在其中搜索导入模块的不同目录。如果攻击者可以更改或修改该变量,则他们可以使用它来提升目标设备上的权限。为了更好地了解后台发生了什么,它是如何导致权限提升的,我们将首先在运行的 ubuntu 环境中创建该漏洞,然后使用 Kali Linux 来利用该漏洞。

漏洞创建

如前所述,这种方法的漏洞是基于环境路径变量的。要创建此漏洞,首先,我们需要恢复之前创建的易受攻击的权限。这样这台设备就不会以多种方式受到攻击。我们在 tmp 目录中创建 hack.py 脚本,就可以验证脚本的内容是否与之前相同。

16.png

接下来,我们需要在 sudoers 文件中进行一些更改。首先,我们将文件的位置更改为 /tmp 目录,然后将 SETENV 标记添加到文件中。这意味着 pavan 用户可以使用具有 sudo 权限的 SETEV 命令,而无需输入 root 密码。 SETENV 是一种工具,它可以更改 PYTHONPATH 环境变量的值,以将任何位置包含到我们在前面的方法中学到的执行顺序中。

17.png

这是使设备容易受到 Python 库劫持的完整过程。所有没有提到的配置都被设置为Linux的默认配置。如果没有任何其他变化,就可以伪装成攻击者了。

漏洞利用

同样,利用不会包含在目标设备上获得初始立足点的方法。它将包含在攻击者获得初始立足点后提升特权的方法。为了验证这一点,我们作为用户 pavan 连接到目标设备。作为任何需要提升权限的攻击者,我们运行 sudo -l 命令来查看我们可以使用提升的访问权限运行哪些脚本或二进制文件。我们看到我们可以使用具有提升访问权限的 SETEV。这意味着我们可以使用它来改变导入模块的优先级顺序。由于 hack.py 位于 /tmp 目录中,我们可以进入它并检查 hack.py 脚本。

18.png

因为它正在导入web浏览器模块,所以我们首先将创建一个名为webbrowser.py的恶意模块文件,然后使用更改环境变量PYTHONPATH的功能,我们将创建一个条目以包含我们的恶意模块文件。恶意模块文件包含逆向shellcode。我们在脚本中提到的相同端口上启动一个 Netcat 监控程序,然后继续将 /tmp 目录添加到 Python 路径中,然后执行 hack.py 文件以提升我们的访问权限。

19.png

一旦脚本运行,我们就会看到一个会话连接到我们的 Netcat 监控程序。 whoami 命令说明了我们拥有的会话是针对目标设备上的 root 用户的。此时,我们已经成功地将权限从 pavan 用户提升到了 root 用户。

20.png

结论

在本文中,我们能够为 Python 库的环境设置三个真实攻击场景,然后引入了一些可能导致攻击者将其访问权限提升到root级别的错误配置。漏洞利用环境是最有针对性的环境之一,因为在这些环境中,执行任务的便利性优先于环境的安全性。这再次证明,一个错误配置的设置足可以导致全局毁灭性的结果。

本文详细介绍了对Hexedglobals.3793系列基于PHP的恶意软件和反混淆过程的研究。Hexedglobals.3793系列恶意软件的变体为:Kidslug,php.obfuscated!, php.malware.GLOBALS.003 and php.malware.GLOBALS.004。

调查背景

我得到了一个WordPress网站的备份以托管在开发区域中,在实际过程中我安装了一个安全扫描程序,并在几秒钟内识别出了名为hexedglobals.3793的签名,感染被嵌入网站的两个单独区域中。

1.png

扫描程序并没有显示太多,它已突出显示正在使用变量编码,并且它是恶意软件使用的可疑特征。但是它确实在检测方面做得很好,如果你有WordPress网站,我建议你安装一个插件以检测此类问题。

分析过程

因此,首先进行一次快速的Google搜索,以了解有关此签名的信息,不过我一无所获。因此,我开始研究代码本身以及可以发现的内容。

2.png

我浏览了一下这个主题,发现MITRE攻击页面在提供有关使用Web Shell的组类型和野外攻击的上下文信息方面非常方便。

经过检查,混淆的Web Shell是攻击者在Web服务器上保持持久性的一种方式。

根据我的初步分析,我能够确定它是一个Web Shell,并且攻击者通过某种不安全因素将其注入了网站。看起来像个文件,但它只是个文件吗?

下面显示了嵌入其中的看似无害的文件,但是,黑客已经将恶意脚本注入了一个乍一看不到的地方。你需要滚动才能看到它。这是我在研究的样本中注意到的一个常见属性,即它们通过在原始代码与其本身之间增加较大的空间而隐藏了代码。在注入的行的末尾与恶意软件的开始之间大约有500个字符的间隔。

3.png

如果识别出签名,并且网站扫描程序可以在服务器上的文件目录中搜索(查找非公共php文件),则网站扫描程序可能会检测到此类恶意文件。我找到的一些样本是由于它们被注入的位置,代码被带到主要的面向公众的页面,就像在网上搜索特征时发现的那样。

有一些非常复杂的web shell可以逃避IDS/ IDPS、日志甚至行为分析。你可以在web服务器日志中寻找可疑的行为,但是攻击者可能会非常狡猾,并通过向服务器发送不被注意的命令来使用不同的方法来隐藏其踪迹。这种行为的示例可以是发送POST请求,或者通过使用用户代理发送命令。

防止它们的一个好方法是首先加强web服务器和客户端代码,这样就不可能有web shell注入。从一开始就没有漏洞确实有助于防止此类事件的发生。

另外,最好通过使用文件完整性监控来破坏持久性。这将有助于发现任何变化。不幸的是,在WordPress网站上,由于插件上经常发生更新,有时未经培训的人有时会很麻烦,因为插件的更新可能会被遗漏。此外,web shell被注入到普通的模板、插件或服务器上被命名为无害的文件中,这使得它们更难被检测到。

混淆会隐藏代码本身并使其唯一,从而使检测变得更加困难,因此不会被签名类型检测所识别。除此之外,它通常被压缩到一行,以使其对执行的操作不太透明。因此,在查看文件时,你可能看不到注入。

有一些在线工具可以提供混淆处理,还有Kali内部的工具(例如Weevley)和其他此类工具(例如FOPO)。但是,它们生成和显示混淆代码的方式与我发现的方式不同。我尝试了一些不同的网站和方法来快速解决混淆问题,但都无济于事,但是我至少掌握了一些初始信息,可以帮助我入门。我开始觉得我需要手动进行混淆处理。

4.png

FOPO混淆代码与发现代码

其他野外攻击

现在,我正在调查的网站受到两次感染,因此我有足够的资源来查找相似之处并与其他网站进行比较。

通过一些Google Dorking和NerdyData.com的使用,我能够在互联网上识别其他受感染的网站。通过搜索{" \x47\x4c\x4fB\x41\x4c\x53 "}的十六进制字符串,我可以找到更多的样本。这确实带来了误报,但也带来了其他类似但不属于同一家族的恶意软件变体。通常这种类型的感染不会在客户端公开。但是,如上所述,由于WordPress引擎将页面整合在一起的方式,我能够找到一些内容。当攻击者注入某些主题页面或插件时,由于该页面是通过CMS显示的,所以它们最终可能在公共页面上可见。

5.png

还有其他网站在其主要位置进行了类似的注入。

你也可以通过GitHub搜索字符串,如“\x47\x4c\x4fB\x41\x4c\x53”。这样网上有很多代码,因为开发人员可能会为了真实的目的使用混淆处理,但是我确实发现了问题。然而,这不是我唯一一次看到这种情况,随着各种插件成为目标,用户有时会向插件所有者抱怨他们已被黑客入侵。

6.png

找到的四个主要样本。

7.png

有一些细微的差异,在方括号内是混淆的代码-变量名称和初始标识号。最初的可识别号码可能是递增的,因为我在同一台服务器上找到499和497。每个恶意软件样本开始时的数字都不一样,并且可能指向攻击者的特定攻击,以帮助他们进行命令和控制。

发现其他变体

如上所述,我没有在原始的带属性名称hexedglobals.3793上找到太多信息,但我在诸如Sucuri的恶意软件签名列表之类的网站中进行了搜索,并手动查看了显示的混淆样本片段。我能够识别出似乎来自同一家族但名称不同的恶意软件。它们在混淆代码的方式上具有相同的模式。我还在堆栈交换中发现了类似的内容,并进行了另一个混淆处理。

我注意到,有时十六进制字符串没有为x4fB大写,因此是x4fB {" \x47\x4c\ x4fB \x41\x4c\x53 "}。

以下是我发现的其他属性名称:

hexedglobals.3793 | Kidslug | php.obfuscated! | php.malware.GLOBALS.003 | php.malware.GLOBALS.004

撰写本文时,我在网上进行了一些搜索,发现了一些有趣的内容。看来卡巴斯基在被攻击的服务器上发现了Code29.php和Proxy87.php的类似文件。

8.png

关于文件code29.php和proxy87.php。我做了一些调查看看有多少网站有这些文件。似乎有相当多的文件具有其他类似的名称。我在回溯设备上进行了搜索,发现来自\etc目录的其他文件具有相同的编号格式。

9.png

9.2.png

10.png

针对澳大利亚律师的Wayback Machine输出

攻击过程

它使用自己的字母来调换代码中需要的字符,这是为了帮助混淆和阻止逆向工程的尝试。它还在代码中添加了额外的变量,需要删除这些变量才能显示其真正的本性。

我从许多行代码开始,似乎使用了很多十六进制来覆盖它的结构、变量和行为。在美化代码之后,它确实开始变得更有意义,并且有可能开始识别功能。

11.png

手动将十六进制解码成相关变量名,它的结构开始变得明显。

$ GLOBALS变量的使用有很多重复项,还似乎是使用具有编程功能的字母来通过代码中调用的数字查找字母的位置并进行替换。

12.png

黑客获取代码后会进行如下操作。

13.png

一旦字母表被破译,就可以清楚地看到变量和函数的定义。执行了另一次查找和替换迭代。起初,这是一个缓慢而艰难的过程,需要反复试验,但正如前面提到的,我现在创建了一个工具来帮助自动化这个过程,将时间从几小时缩短为几秒钟!

这是一种非常简单但有效的方法,但是看来攻击者已经简化了通信过程。

通过研究,攻击者只能使用加密密钥来访问后门,然后他们才能通过发布请求中发送的cookie来发送命令。

这种后门称为非对称后门,即使在公开场合,攻击者也将是唯一使用它的人。

清除混淆后,我只能了解部分发生的事情。因此,我在下面记录了原始版本的外观和标准化版本的外观。在MKorostoff Github的帮助下,我可以开始构建一个更好的图片。用红色突出显示的值显示这些值。假设MKorostoff可能有cookie、日志或其他方法来帮助混淆函数变量。

14.png

MKorostoff Github提取

15.png

@kielwadner在Weeveley Web Shell上的Sans DFIR峰会上作了介绍,在他的幻灯片上,我们可以看到Weeveley在混淆加密过程中承担着类似的XOR功能。

16.png

此外,在看了卡巴斯基的发现后,他们还将类似XOR的函数命名为函数,这表明他们也注意到了这种行为,不幸的是,他们没有提供进一步的分析。

17.png

下一部分将处理加密机制,Mkorostoff评论说它将执行了两次加密机制。

18.png

我认为使用cookie是代码中最聪明的部分。

19.png

20.png

如果我们查看Mkorostoff的注释和代码,我们可以看到他用新的变量名替换了一些变量名。这些用绿色标出。$encrypted_text现在被命名为$attack_payload。$decryption_key是cookie的名称。

这是因为攻击有效载荷是通过cookie发送的。cookie名称用于进行解密,一旦cookie值被解密,它就包含了攻击有效载荷。这有助于验证机制。

21.png

22.png

其他恶意软件(例如WSO)也具有类似的行为,Sjoerd撰写了一篇很棒的文章,介绍了如何绕过webshell代替身份验证。本文介绍了他所审阅的代码如何将Cookie与MD5配合使用,以确定正确的身份验证。

代码的最后一部分有一个函数,如果它接收到“i”,它将显示服务器信息,如php版本。攻击者这样做可能是为了帮助其他事情的自动化。这确实让我想知道,如果现在对PHP 7+版本的服务器PHP版本进行升级,是否某些php C&C工具仍然可以正常工作以及需要多长时间才能更新。当查看B374K webshell时,它说它支持4.5和版本5。在issues选项卡中,您可以看到有人在php 版本7上成功地使用它。但是github页面在很长一段时间没有更新。在接下来的几年里会发布php的未来版本,看看在这个过程中会更新哪些工具。

23.png

最后是评估攻击有效载荷和行动,Mkorostoff将“e”定义为执行命令,将“d”定义为有效载荷。当攻击者提供正确的访问密钥时,它将发起攻击。

24.png

可以从集体样本中建立任何签名吗?

在分析过程中注意我注意到了以下几个特点:

注入恶意软件之前,大约有500个字符的空白间隔;

全部重复使用全局变量;

它们都使用了相同的十六进制替换混淆技术;

所有文件在感染文件的开头都有一个分配的编号,作为某种标识符;

都有相同的不对称后门与攻击者交互的聪明方法;

以下是两个链接,可以帮助你在未来删除和防止出现本文所讲的类似攻击:

https://codex.wordpress.org/FAQ_My_site_was_hacked

https://codex.wordpress.org/Hardening_WordPress

总结

尽管从本质上来说攻击原理很简单,但是攻击者使用了聪明的身份验证机制来提供一个非对称后门来与其进行通信。服务器上已经发现了类似恶意软件的攻击痕迹,文件名是code29.php和proxy87.php。在搜索这些文件的过程中,野外似乎已经出现了类似的感染。

本文详细介绍了对Hexedglobals.3793系列基于PHP的恶意软件和反混淆过程的研究。Hexedglobals.3793系列恶意软件的变体为:Kidslug,php.obfuscated!, php.malware.GLOBALS.003 and php.malware.GLOBALS.004。

调查背景

我得到了一个WordPress网站的备份以托管在开发区域中,在实际过程中我安装了一个安全扫描程序,并在几秒钟内识别出了名为hexedglobals.3793的签名,感染被嵌入网站的两个单独区域中。

1.png

扫描程序并没有显示太多,它已突出显示正在使用变量编码,并且它是恶意软件使用的可疑特征。但是它确实在检测方面做得很好,如果你有WordPress网站,我建议你安装一个插件以检测此类问题。

分析过程

因此,首先进行一次快速的Google搜索,以了解有关此签名的信息,不过我一无所获。因此,我开始研究代码本身以及可以发现的内容。

2.png

我浏览了一下这个主题,发现MITRE攻击页面在提供有关使用Web Shell的组类型和野外攻击的上下文信息方面非常方便。

经过检查,混淆的Web Shell是攻击者在Web服务器上保持持久性的一种方式。

根据我的初步分析,我能够确定它是一个Web Shell,并且攻击者通过某种不安全因素将其注入了网站。看起来像个文件,但它只是个文件吗?

下面显示了嵌入其中的看似无害的文件,但是,黑客已经将恶意脚本注入了一个乍一看不到的地方。你需要滚动才能看到它。这是我在研究的样本中注意到的一个常见属性,即它们通过在原始代码与其本身之间增加较大的空间而隐藏了代码。在注入的行的末尾与恶意软件的开始之间大约有500个字符的间隔。

3.png

如果识别出签名,并且网站扫描程序可以在服务器上的文件目录中搜索(查找非公共php文件),则网站扫描程序可能会检测到此类恶意文件。我找到的一些样本是由于它们被注入的位置,代码被带到主要的面向公众的页面,就像在网上搜索特征时发现的那样。

有一些非常复杂的web shell可以逃避IDS/ IDPS、日志甚至行为分析。你可以在web服务器日志中寻找可疑的行为,但是攻击者可能会非常狡猾,并通过向服务器发送不被注意的命令来使用不同的方法来隐藏其踪迹。这种行为的示例可以是发送POST请求,或者通过使用用户代理发送命令。

防止它们的一个好方法是首先加强web服务器和客户端代码,这样就不可能有web shell注入。从一开始就没有漏洞确实有助于防止此类事件的发生。

另外,最好通过使用文件完整性监控来破坏持久性。这将有助于发现任何变化。不幸的是,在WordPress网站上,由于插件上经常发生更新,有时未经培训的人有时会很麻烦,因为插件的更新可能会被遗漏。此外,web shell被注入到普通的模板、插件或服务器上被命名为无害的文件中,这使得它们更难被检测到。

混淆会隐藏代码本身并使其唯一,从而使检测变得更加困难,因此不会被签名类型检测所识别。除此之外,它通常被压缩到一行,以使其对执行的操作不太透明。因此,在查看文件时,你可能看不到注入。

有一些在线工具可以提供混淆处理,还有Kali内部的工具(例如Weevley)和其他此类工具(例如FOPO)。但是,它们生成和显示混淆代码的方式与我发现的方式不同。我尝试了一些不同的网站和方法来快速解决混淆问题,但都无济于事,但是我至少掌握了一些初始信息,可以帮助我入门。我开始觉得我需要手动进行混淆处理。

4.png

FOPO混淆代码与发现代码

其他野外攻击

现在,我正在调查的网站受到两次感染,因此我有足够的资源来查找相似之处并与其他网站进行比较。

通过一些Google Dorking和NerdyData.com的使用,我能够在互联网上识别其他受感染的网站。通过搜索{" \x47\x4c\x4fB\x41\x4c\x53 "}的十六进制字符串,我可以找到更多的样本。这确实带来了误报,但也带来了其他类似但不属于同一家族的恶意软件变体。通常这种类型的感染不会在客户端公开。但是,如上所述,由于WordPress引擎将页面整合在一起的方式,我能够找到一些内容。当攻击者注入某些主题页面或插件时,由于该页面是通过CMS显示的,所以它们最终可能在公共页面上可见。

5.png

还有其他网站在其主要位置进行了类似的注入。

你也可以通过GitHub搜索字符串,如“\x47\x4c\x4fB\x41\x4c\x53”。这样网上有很多代码,因为开发人员可能会为了真实的目的使用混淆处理,但是我确实发现了问题。然而,这不是我唯一一次看到这种情况,随着各种插件成为目标,用户有时会向插件所有者抱怨他们已被黑客入侵。

6.png

找到的四个主要样本。

7.png

有一些细微的差异,在方括号内是混淆的代码-变量名称和初始标识号。最初的可识别号码可能是递增的,因为我在同一台服务器上找到499和497。每个恶意软件样本开始时的数字都不一样,并且可能指向攻击者的特定攻击,以帮助他们进行命令和控制。

发现其他变体

如上所述,我没有在原始的带属性名称hexedglobals.3793上找到太多信息,但我在诸如Sucuri的恶意软件签名列表之类的网站中进行了搜索,并手动查看了显示的混淆样本片段。我能够识别出似乎来自同一家族但名称不同的恶意软件。它们在混淆代码的方式上具有相同的模式。我还在堆栈交换中发现了类似的内容,并进行了另一个混淆处理。

我注意到,有时十六进制字符串没有为x4fB大写,因此是x4fB {" \x47\x4c\ x4fB \x41\x4c\x53 "}。

以下是我发现的其他属性名称:

hexedglobals.3793 | Kidslug | php.obfuscated! | php.malware.GLOBALS.003 | php.malware.GLOBALS.004

撰写本文时,我在网上进行了一些搜索,发现了一些有趣的内容。看来卡巴斯基在被攻击的服务器上发现了Code29.php和Proxy87.php的类似文件。

8.png

关于文件code29.php和proxy87.php。我做了一些调查看看有多少网站有这些文件。似乎有相当多的文件具有其他类似的名称。我在回溯设备上进行了搜索,发现来自\etc目录的其他文件具有相同的编号格式。

9.png

9.2.png

10.png

针对澳大利亚律师的Wayback Machine输出

攻击过程

它使用自己的字母来调换代码中需要的字符,这是为了帮助混淆和阻止逆向工程的尝试。它还在代码中添加了额外的变量,需要删除这些变量才能显示其真正的本性。

我从许多行代码开始,似乎使用了很多十六进制来覆盖它的结构、变量和行为。在美化代码之后,它确实开始变得更有意义,并且有可能开始识别功能。

11.png

手动将十六进制解码成相关变量名,它的结构开始变得明显。

$ GLOBALS变量的使用有很多重复项,还似乎是使用具有编程功能的字母来通过代码中调用的数字查找字母的位置并进行替换。

12.png

黑客获取代码后会进行如下操作。

13.png

一旦字母表被破译,就可以清楚地看到变量和函数的定义。执行了另一次查找和替换迭代。起初,这是一个缓慢而艰难的过程,需要反复试验,但正如前面提到的,我现在创建了一个工具来帮助自动化这个过程,将时间从几小时缩短为几秒钟!

这是一种非常简单但有效的方法,但是看来攻击者已经简化了通信过程。

通过研究,攻击者只能使用加密密钥来访问后门,然后他们才能通过发布请求中发送的cookie来发送命令。

这种后门称为非对称后门,即使在公开场合,攻击者也将是唯一使用它的人。

清除混淆后,我只能了解部分发生的事情。因此,我在下面记录了原始版本的外观和标准化版本的外观。在MKorostoff Github的帮助下,我可以开始构建一个更好的图片。用红色突出显示的值显示这些值。假设MKorostoff可能有cookie、日志或其他方法来帮助混淆函数变量。

14.png

MKorostoff Github提取

15.png

@kielwadner在Weeveley Web Shell上的Sans DFIR峰会上作了介绍,在他的幻灯片上,我们可以看到Weeveley在混淆加密过程中承担着类似的XOR功能。

16.png

此外,在看了卡巴斯基的发现后,他们还将类似XOR的函数命名为函数,这表明他们也注意到了这种行为,不幸的是,他们没有提供进一步的分析。

17.png

下一部分将处理加密机制,Mkorostoff评论说它将执行了两次加密机制。

18.png

我认为使用cookie是代码中最聪明的部分。

19.png

20.png

如果我们查看Mkorostoff的注释和代码,我们可以看到他用新的变量名替换了一些变量名。这些用绿色标出。$encrypted_text现在被命名为$attack_payload。$decryption_key是cookie的名称。

这是因为攻击有效载荷是通过cookie发送的。cookie名称用于进行解密,一旦cookie值被解密,它就包含了攻击有效载荷。这有助于验证机制。

21.png

22.png

其他恶意软件(例如WSO)也具有类似的行为,Sjoerd撰写了一篇很棒的文章,介绍了如何绕过webshell代替身份验证。本文介绍了他所审阅的代码如何将Cookie与MD5配合使用,以确定正确的身份验证。

代码的最后一部分有一个函数,如果它接收到“i”,它将显示服务器信息,如php版本。攻击者这样做可能是为了帮助其他事情的自动化。这确实让我想知道,如果现在对PHP 7+版本的服务器PHP版本进行升级,是否某些php C&C工具仍然可以正常工作以及需要多长时间才能更新。当查看B374K webshell时,它说它支持4.5和版本5。在issues选项卡中,您可以看到有人在php 版本7上成功地使用它。但是github页面在很长一段时间没有更新。在接下来的几年里会发布php的未来版本,看看在这个过程中会更新哪些工具。

23.png

最后是评估攻击有效载荷和行动,Mkorostoff将“e”定义为执行命令,将“d”定义为有效载荷。当攻击者提供正确的访问密钥时,它将发起攻击。

24.png

可以从集体样本中建立任何签名吗?

在分析过程中注意我注意到了以下几个特点:

注入恶意软件之前,大约有500个字符的空白间隔;

全部重复使用全局变量;

它们都使用了相同的十六进制替换混淆技术;

所有文件在感染文件的开头都有一个分配的编号,作为某种标识符;

都有相同的不对称后门与攻击者交互的聪明方法;

以下是两个链接,可以帮助你在未来删除和防止出现本文所讲的类似攻击:

https://codex.wordpress.org/FAQ_My_site_was_hacked

https://codex.wordpress.org/Hardening_WordPress

总结

尽管从本质上来说攻击原理很简单,但是攻击者使用了聪明的身份验证机制来提供一个非对称后门来与其进行通信。服务器上已经发现了类似恶意软件的攻击痕迹,文件名是code29.php和proxy87.php。在搜索这些文件的过程中,野外似乎已经出现了类似的感染。

Crime-r3d3.png

上文我们介绍Fast flux先进的逃避技术,今天我们继续来通过具体案例来分析。

对域的控制

Emilia只有一个选择,她不得不去加强对ralnbowbank[.]com域名本身的控制。Emilia有几个选择可以考虑,比如她可以向管理ralnbowbank[.]com的域名服务器(NS)运营商(TLD运营商称为注册管理机构)提出投诉,也可以向将域名出售给Mallory的经销商(注册商)提出投诉,要求他们删除恶意域。也可以使用统一域名争议解决政策(称为UDRP)或统一快速搁置(Uniform Rapid Suspension简称URS)。但是,与响应迅速和负责任的注册管理机构相比,这些流程要慢得多。

当Emilia向拥有ralnbowbank[.]com与Penny域名的主机投诉后,这两个域名都被删除了。不过Mallory现在已经是一个经验丰富的攻击者,他很快就注册了新的域名,每个域名都只使用很短的一段时间。所有新的TLD(例如.xyz)使Mallory的工作变得更加轻松,在那里他能够以便宜的价格获得域名,而无需进行身份验证。同时,艾米利亚(Emilia)的团队也获得了专业知识,可以更快地找到Mallory(Mallory)的域名,并且拥有更好的流程来删除这些域名。尽管如此, Emilia的团队仍然只能处于被动防御阶段,无法跟上Mallory的攻击频率。

Emilia最终只能利用行政抓捕手段抓住了Mallory,Mallory总是在同一个论坛上和Bart交流,而Bart的用户名和他的社交媒体用户名很相似。利用这条线索和Mallory的其他线索,Emilia的团队确定了Mallory的真实身份,从而彻底结束了他的网络钓鱼行动。

域生成算法

不幸的是,Mallory并不是唯一一个利用Bart的僵尸网络实施恶意活动的人。在Mallory被起诉后,Bart利用他的僵尸网络对Emilia的部门实施了分布式拒绝服务(DDOS)报复攻击。此外,Bart有很多朋友利用他的僵尸网络进行各种恶意活动,如诈骗、恶意软件传播、潜在有害程序的传播、非法赌博和网络钓鱼。

接下来,Emilia的团队就开始追查Bart的僵尸网络。图4提供了Bart的僵尸网络基础设施的概述。Bart实施的僵尸网络攻击会实施无差别攻击,从防护能力较弱的个人电脑到强大的服务器,他都能控制。在每个设备上,他都安装了恶意软件,能够要求他的命令和控制(C2)服务器进一步运行代码。当一个设备想要与C2服务器通信时,恶意软件首先尝试解析域名bartrules247[.]net获取C2的IP地址。

7.png

Bart的僵尸网络基础结构

当Emilia对Bart的代码(在受感染的计算机上发现的)进行反向工程时,她得知该代码使用了域名bartrules247[.]net。当她的团队掐断Bart的域名后,该僵尸网络就停止攻击了。

为了防止被Emilia检测到,Bart想出了一个巧妙的策略。他在他的恶意软件代码库中隐藏了一段代码,每天生成上千个不同的域名。Bart的设备试图访问所有这些域,即使其中一个域是Bart注册的,通信也成功了。Bart的新方法让Emilia无法摧毁他的僵尸网络,因为随着时间的推移,Emilia可能需要控制数百万个潜在的域名。

最后,在Emilia和她的团队的努力下,Bart和Mallory一样都被抓住了。研究小组之所以能找到Bart的住处,是因为Mallory在前一年给他送了一份生日礼物。虽然Bart和Mallory的操作失误看起来像是新手犯的错误,但任何事情都会留下线索。

注意以上攻击场景都经过了简化,以展示攻击者试图加强其基础设施以对抗执法和躲避安全研究人员的一些巧妙方法。

检测Fast flux和DGA域

在以上的示例中,我们已经看到了Emilia的团队是如何防御Fast flux网络的。Palo Alto Networks Next-Generation Firewall安全订阅URL过滤和DNS安全包括一个自动分类器检测Fast flux域并保护用户。

研究人员的分类器基于这些域名的两个独特功能,首先,Fast flux运营商通常依赖于各种受攻击的设备作为其代理主机。第二,Fast flux域经常改变它们指向的受攻击宿主。基于这些观察,研究人员可以设计出三种类型的特征。首先,基于IP多样性的特征依赖于使用的IP总数、不同地理位置的数量、使用的ISP数量、ASN的数量以及IP地址的类型(移动、住宅、数据中心等)等指标。其次,研究人员还研究这些特征的熵,以捕获它们在这些维度上分布的均匀程度。第三,Fast flux运营商可能会在开始活动时迅速增加域名解析的IP数量。因此,研究人员可以通过使用计算所使用的IP数量及其多样性变化的功能来防御这种方法。

在2020年12月至2021年1月期间,研究人员的分类器检测到2679个Fast flux域,平均每周发现约300个域。研究人员经常在同一天用相似的命名模式识别出数百个Fast flux域。

此外,研究人员还利用另一个检测器保护用户免受DGA域的影响。传统的恶意域检测和阻止方法要么预先建立了阻止列表,要么无法实现实时防御。不幸的是,DGA域的可抛弃性和几乎无限的大小使这些方法不足以保护DGA。

为了在首次出现时阻止新的DGA域,研究人员开发了一种能够在分辨时间检测DGA域的新系统。为了实现这一点,研究人员的防火墙拦截并检查每一个DNS查询。DNS查询然后被同时发送到云中的DNS解析器和DGA检测器。研究人员的检测器单独检查每个DNS查询,并在相应的DNS响应返回给用户之前向防火墙返回一个结论。如果被查询的域被检测为DGA,研究人员的防火墙可以阻止DNS响应,或者返回一个预先指定的DNS响应,比如DNS漏洞的IP地址。研究人员的DGA检测器的核心是一个基于域特征列表建立的机器学习(ML)模型,如根域名的随机性,例如,“foo”代表“foo.com”。ML模型的输出不仅包含表明该域是否为DGA的判断,而且还提供一个恶意软件家族(如果该域确实为DGA),还提供了研究人员的DNS安全分析的完整列表

现实世界中的Fast flux案例研究

案例1:社会工程活动

研究人员发现攻击者在heygamersnort[.]at上进行了精心设计的社会工程活动,利用Fast flux来避免检测,这些攻击者通过向受害者承诺在短时间内支付高额回报来吸引受害者,这些类型的活动可以用于网络钓鱼和诈骗用户支付攻击者。

攻击者用几种方式宣传他们的攻击活动,比如他们发送了主题为“每月赚取15000欧元”的垃圾邮件,邮件正文包含hXXp[:]//heygamersnort[.]at?gcGDRAewqASzXFDXcGCHjBJnhBGvFCCDRXTCyVBunINHBYGTFCRx (垃圾邮件源),他们还设置了与垃圾邮件内容相同的网站,如图5所示。

8.png

hXXp[:]//latestforexsoftware.blogspot[.]com/2020/12/earn-15000-euro-every-month.html的截图

该活动与其他活动的不同之处在于,攻击者以许多不同的语言(包括荷兰语、法语、德语、意大利语、丹麦语、捷克语和英语)建立了相对高质量的网站,如图6所示。研究人员观察到heygamersnort[.]at在不到两个月的时间内就解析了200多个IP地址,这些IP地址分布在全球各地(主要是东欧、中东和中南美洲)不同的ISP。

9.png

英语版的 heygamersnort[.]at

10.png

意大利语版的 heygamersnort[.]at

11.png

德语版的 heygamersnort[.]at

12.png

另一个英语版的 heygamersnort[.]at

用户可以查找多个警告标志,以避免类似的社会工程网络钓鱼和欺诈网站。首先,当它看起来“太好了以至于无法实现”时,那么它很可能就是真的。如果攻击者每月能轻松赚到15000欧元,那么他们就不会在广告上宣传他们是如何做到这一点的。其次,这些网站总是传达出一种紧迫感,他们可能会说:“只剩28个免费的地方了”,或者包括一个计时器,让你认为你只有几分钟的时间来致富。

案例2:Smoke Loader活动的C2

Smokeloader从2011年就开始在黑客论坛出售,一直处于更新状态Smokeloader主要通过垃圾邮件携带恶意宏代码的Office文档进行传播,该样本具备远程下载其它组件、窃取用户敏感信息和发起DDoS攻击等功能。该僵尸网络曾被发现用来传播GandCrab勒索软件、Kronos银行木马等多款臭名昭著的恶意软件。

2020版本的Smokeloader使用多种规避检测和对抗分析的技术,如运行环境的检测、花指令、代码自解密、反虚拟机等。运行成功后将自身添加为计划任务,保证自身的持久化。

研究人员的Fast flux检测器发现多个与Smokeloader恶意软件家族相关的C2域,如jamb2[.]monster, tinnys[.]monster 和 netvxi[.]com。例如,研究人员报告了多个“Smokeloader”恶意软件家族的实例,分别与一个银行木马和一个虚假的海啸预警垃圾邮件活动有关

Smoke Loader是一种模块化的恶意软件,安装后,它充当后门,并允许攻击者通过C2服务器下载更多恶意有效载荷,这些载荷可能是勒索软件或信息窃取程序。研究人员发现的域名在不到两周的时间内解析到近100个IP地址,这些IP地址位于许多不同的ISP和地理位置(主要是东欧、中东和中美洲)。

案例3:非法赌博和成人网站

研究人员发现了几个利用Fast flux网络并同时托管赌博和成人内容的大型域名集群,这些站点几乎都是中文的,因为它们的活动在中国是非法的。为了逃避检测和阻止,他们通常使用Fast flux技术。通常,研究人员观察到这些域名指向世界各地(主要是北美、西欧和亚洲)的数百个不同的IP地址。此外,它们仅指向几次给定的IP地址。

域5651v[.]com(如图7所示)是解决许多IP地址的此类赌博网站的示例。域 99guise[.]com(图8)是赌博和成人内容列表网站的典型示例,该页面上有数十个链接。

13.png

翻译成英文的赌博页面示例5651v[.]com

14.png

99guise [.com]列出了不同的赌博网站和成人内容(未显示)

比它们用来逃避权威的非法技术更糟糕的是,这些网站中有许多都向用户提供移动下载,而这些下载经常是恶意的。612852[.]com 和 por99f9yw[.]com (图9和图10)都提供了被发现是恶意的文件下载。

微信截图_20210304184551.png

612852[.]com提供的Android应用程序下载

16.png

por99f9yw[.]com提供Android和IOS应用程序下载

总结

有各种各样的战术和技术可供攻击者加强他们的系统,以对抗各种安全保护,如fast flux,double flux和DGA。虽然可以轻松地防御一些基本技术,但先进的技术却导致攻击者与防御者之间经常猫捉老鼠似的游戏。double flux会使基于IP的阻止列表和主机删除无效。 DGA域使静态域阻止列表和域接管的效率降低。

IOCs

23.png

Crime-r3d3.png

上文我们介绍Fast flux先进的逃避技术,今天我们继续来通过具体案例来分析。

对域的控制

Emilia只有一个选择,她不得不去加强对ralnbowbank[.]com域名本身的控制。Emilia有几个选择可以考虑,比如她可以向管理ralnbowbank[.]com的域名服务器(NS)运营商(TLD运营商称为注册管理机构)提出投诉,也可以向将域名出售给Mallory的经销商(注册商)提出投诉,要求他们删除恶意域。也可以使用统一域名争议解决政策(称为UDRP)或统一快速搁置(Uniform Rapid Suspension简称URS)。但是,与响应迅速和负责任的注册管理机构相比,这些流程要慢得多。

当Emilia向拥有ralnbowbank[.]com与Penny域名的主机投诉后,这两个域名都被删除了。不过Mallory现在已经是一个经验丰富的攻击者,他很快就注册了新的域名,每个域名都只使用很短的一段时间。所有新的TLD(例如.xyz)使Mallory的工作变得更加轻松,在那里他能够以便宜的价格获得域名,而无需进行身份验证。同时,艾米利亚(Emilia)的团队也获得了专业知识,可以更快地找到Mallory(Mallory)的域名,并且拥有更好的流程来删除这些域名。尽管如此, Emilia的团队仍然只能处于被动防御阶段,无法跟上Mallory的攻击频率。

Emilia最终只能利用行政抓捕手段抓住了Mallory,Mallory总是在同一个论坛上和Bart交流,而Bart的用户名和他的社交媒体用户名很相似。利用这条线索和Mallory的其他线索,Emilia的团队确定了Mallory的真实身份,从而彻底结束了他的网络钓鱼行动。

域生成算法

不幸的是,Mallory并不是唯一一个利用Bart的僵尸网络实施恶意活动的人。在Mallory被起诉后,Bart利用他的僵尸网络对Emilia的部门实施了分布式拒绝服务(DDOS)报复攻击。此外,Bart有很多朋友利用他的僵尸网络进行各种恶意活动,如诈骗、恶意软件传播、潜在有害程序的传播、非法赌博和网络钓鱼。

接下来,Emilia的团队就开始追查Bart的僵尸网络。图4提供了Bart的僵尸网络基础设施的概述。Bart实施的僵尸网络攻击会实施无差别攻击,从防护能力较弱的个人电脑到强大的服务器,他都能控制。在每个设备上,他都安装了恶意软件,能够要求他的命令和控制(C2)服务器进一步运行代码。当一个设备想要与C2服务器通信时,恶意软件首先尝试解析域名bartrules247[.]net获取C2的IP地址。

7.png

Bart的僵尸网络基础结构

当Emilia对Bart的代码(在受感染的计算机上发现的)进行反向工程时,她得知该代码使用了域名bartrules247[.]net。当她的团队掐断Bart的域名后,该僵尸网络就停止攻击了。

为了防止被Emilia检测到,Bart想出了一个巧妙的策略。他在他的恶意软件代码库中隐藏了一段代码,每天生成上千个不同的域名。Bart的设备试图访问所有这些域,即使其中一个域是Bart注册的,通信也成功了。Bart的新方法让Emilia无法摧毁他的僵尸网络,因为随着时间的推移,Emilia可能需要控制数百万个潜在的域名。

最后,在Emilia和她的团队的努力下,Bart和Mallory一样都被抓住了。研究小组之所以能找到Bart的住处,是因为Mallory在前一年给他送了一份生日礼物。虽然Bart和Mallory的操作失误看起来像是新手犯的错误,但任何事情都会留下线索。

注意以上攻击场景都经过了简化,以展示攻击者试图加强其基础设施以对抗执法和躲避安全研究人员的一些巧妙方法。

检测Fast flux和DGA域

在以上的示例中,我们已经看到了Emilia的团队是如何防御Fast flux网络的。Palo Alto Networks Next-Generation Firewall安全订阅URL过滤和DNS安全包括一个自动分类器检测Fast flux域并保护用户。

研究人员的分类器基于这些域名的两个独特功能,首先,Fast flux运营商通常依赖于各种受攻击的设备作为其代理主机。第二,Fast flux域经常改变它们指向的受攻击宿主。基于这些观察,研究人员可以设计出三种类型的特征。首先,基于IP多样性的特征依赖于使用的IP总数、不同地理位置的数量、使用的ISP数量、ASN的数量以及IP地址的类型(移动、住宅、数据中心等)等指标。其次,研究人员还研究这些特征的熵,以捕获它们在这些维度上分布的均匀程度。第三,Fast flux运营商可能会在开始活动时迅速增加域名解析的IP数量。因此,研究人员可以通过使用计算所使用的IP数量及其多样性变化的功能来防御这种方法。

在2020年12月至2021年1月期间,研究人员的分类器检测到2679个Fast flux域,平均每周发现约300个域。研究人员经常在同一天用相似的命名模式识别出数百个Fast flux域。

此外,研究人员还利用另一个检测器保护用户免受DGA域的影响。传统的恶意域检测和阻止方法要么预先建立了阻止列表,要么无法实现实时防御。不幸的是,DGA域的可抛弃性和几乎无限的大小使这些方法不足以保护DGA。

为了在首次出现时阻止新的DGA域,研究人员开发了一种能够在分辨时间检测DGA域的新系统。为了实现这一点,研究人员的防火墙拦截并检查每一个DNS查询。DNS查询然后被同时发送到云中的DNS解析器和DGA检测器。研究人员的检测器单独检查每个DNS查询,并在相应的DNS响应返回给用户之前向防火墙返回一个结论。如果被查询的域被检测为DGA,研究人员的防火墙可以阻止DNS响应,或者返回一个预先指定的DNS响应,比如DNS漏洞的IP地址。研究人员的DGA检测器的核心是一个基于域特征列表建立的机器学习(ML)模型,如根域名的随机性,例如,“foo”代表“foo.com”。ML模型的输出不仅包含表明该域是否为DGA的判断,而且还提供一个恶意软件家族(如果该域确实为DGA),还提供了研究人员的DNS安全分析的完整列表

现实世界中的Fast flux案例研究

案例1:社会工程活动

研究人员发现攻击者在heygamersnort[.]at上进行了精心设计的社会工程活动,利用Fast flux来避免检测,这些攻击者通过向受害者承诺在短时间内支付高额回报来吸引受害者,这些类型的活动可以用于网络钓鱼和诈骗用户支付攻击者。

攻击者用几种方式宣传他们的攻击活动,比如他们发送了主题为“每月赚取15000欧元”的垃圾邮件,邮件正文包含hXXp[:]//heygamersnort[.]at?gcGDRAewqASzXFDXcGCHjBJnhBGvFCCDRXTCyVBunINHBYGTFCRx (垃圾邮件源),他们还设置了与垃圾邮件内容相同的网站,如图5所示。

8.png

hXXp[:]//latestforexsoftware.blogspot[.]com/2020/12/earn-15000-euro-every-month.html的截图

该活动与其他活动的不同之处在于,攻击者以许多不同的语言(包括荷兰语、法语、德语、意大利语、丹麦语、捷克语和英语)建立了相对高质量的网站,如图6所示。研究人员观察到heygamersnort[.]at在不到两个月的时间内就解析了200多个IP地址,这些IP地址分布在全球各地(主要是东欧、中东和中南美洲)不同的ISP。

9.png

英语版的 heygamersnort[.]at

10.png

意大利语版的 heygamersnort[.]at

11.png

德语版的 heygamersnort[.]at

12.png

另一个英语版的 heygamersnort[.]at

用户可以查找多个警告标志,以避免类似的社会工程网络钓鱼和欺诈网站。首先,当它看起来“太好了以至于无法实现”时,那么它很可能就是真的。如果攻击者每月能轻松赚到15000欧元,那么他们就不会在广告上宣传他们是如何做到这一点的。其次,这些网站总是传达出一种紧迫感,他们可能会说:“只剩28个免费的地方了”,或者包括一个计时器,让你认为你只有几分钟的时间来致富。

案例2:Smoke Loader活动的C2

Smokeloader从2011年就开始在黑客论坛出售,一直处于更新状态Smokeloader主要通过垃圾邮件携带恶意宏代码的Office文档进行传播,该样本具备远程下载其它组件、窃取用户敏感信息和发起DDoS攻击等功能。该僵尸网络曾被发现用来传播GandCrab勒索软件、Kronos银行木马等多款臭名昭著的恶意软件。

2020版本的Smokeloader使用多种规避检测和对抗分析的技术,如运行环境的检测、花指令、代码自解密、反虚拟机等。运行成功后将自身添加为计划任务,保证自身的持久化。

研究人员的Fast flux检测器发现多个与Smokeloader恶意软件家族相关的C2域,如jamb2[.]monster, tinnys[.]monster 和 netvxi[.]com。例如,研究人员报告了多个“Smokeloader”恶意软件家族的实例,分别与一个银行木马和一个虚假的海啸预警垃圾邮件活动有关

Smoke Loader是一种模块化的恶意软件,安装后,它充当后门,并允许攻击者通过C2服务器下载更多恶意有效载荷,这些载荷可能是勒索软件或信息窃取程序。研究人员发现的域名在不到两周的时间内解析到近100个IP地址,这些IP地址位于许多不同的ISP和地理位置(主要是东欧、中东和中美洲)。

案例3:非法赌博和成人网站

研究人员发现了几个利用Fast flux网络并同时托管赌博和成人内容的大型域名集群,这些站点几乎都是中文的,因为它们的活动在中国是非法的。为了逃避检测和阻止,他们通常使用Fast flux技术。通常,研究人员观察到这些域名指向世界各地(主要是北美、西欧和亚洲)的数百个不同的IP地址。此外,它们仅指向几次给定的IP地址。

域5651v[.]com(如图7所示)是解决许多IP地址的此类赌博网站的示例。域 99guise[.]com(图8)是赌博和成人内容列表网站的典型示例,该页面上有数十个链接。

13.png

翻译成英文的赌博页面示例5651v[.]com

14.png

99guise [.com]列出了不同的赌博网站和成人内容(未显示)

比它们用来逃避权威的非法技术更糟糕的是,这些网站中有许多都向用户提供移动下载,而这些下载经常是恶意的。612852[.]com 和 por99f9yw[.]com (图9和图10)都提供了被发现是恶意的文件下载。

微信截图_20210304184551.png

612852[.]com提供的Android应用程序下载

16.png

por99f9yw[.]com提供Android和IOS应用程序下载

总结

有各种各样的战术和技术可供攻击者加强他们的系统,以对抗各种安全保护,如fast flux,double flux和DGA。虽然可以轻松地防御一些基本技术,但先进的技术却导致攻击者与防御者之间经常猫捉老鼠似的游戏。double flux会使基于IP的阻止列表和主机删除无效。 DGA域使静态域阻止列表和域接管的效率降低。

IOCs

23.png