FormBook钓鱼攻击事件分析

概述

  2023年7月末客户反馈收到可疑邮件,经确认最终执行的是FormBook 4.1版本窃密木马,FormBook是一款非常活跃的商业窃密木马,经常通过广撒网式投递钓鱼邮件,其主要由C#编写的加载器和C或汇编语言编写的核心PE程序组成,加载器采用套娃模式执行PE程序,PE程序无任何直接的API调用,无法静态分析,其代码包含各种反调试、反沙箱操作,对抗分析强度极大。

  FormBook 4.1版本主要窃取目标系统中浏览器、邮箱客户端、Windows Vault(凭据保管库)的敏感信息,同时具备远程控制能力,具体包括更新、下载执行、关机、重启、主动窃取信息、键盘记录和屏幕截图等功能。

ATT&CK 矩阵

战术 技术 具体行为
TA0001 初始访问 T1566 网络钓鱼 使用带有漏洞的文档附件的鱼叉式网络钓鱼电子邮件
TA0002 执行 T1203 利用漏洞执行 诱导用户执行带有漏洞的恶意文档附件
TA0003 持久化 T1547 启动或登录自动执行 创建注册表项实现开机自启动
TA0003 持久化 T1053 计划任务/作业 创建计划任务实现持久化
TA0005 防御规避 T1140 去混淆或解密文件和信息 解码多层载荷
TA0005 防御规避 T1055 进程注入 遍历进程多次执行注入explorer进程
TA0005 防御规避 T1497 虚拟化/沙盒规避 检测是否在沙盒,虚拟机环境中
TA0006 凭证访问 T1555 从密码存储中获得凭据 使用vaultcli.dll导出函数枚举凭据
TA0007 环境发现 T1057 收集进程信息 遍历进程
TA0007 环境发现 T1087 枚举帐户 获取当前用户名
TA0007 环境发现 T1082 收集系统信息 获取系统版本、架构
TA0009 收集信息 T1056 捕获用户输入 获取受害机的键盘记录
TA0009 收集信息 T1113 屏幕截图 对受害机屏幕进行截图
TA0009 收集信息 T1115 剪贴板数据 监控剪贴板
TA0009 收集信息 T1119 自动收集 收集浏览器、邮件客户端等隐私信息
TA0011 指挥与控制 T1071 应用层协议 使用HTTPS协议与服务器进行通信
TA0010 外传信息 T1041 通过C2通道外传 接收控制指令与上传数据共用同一条通道
TA0040 影响 T1529 系统关闭/重启 攻击者会关闭/重新启动系统

事件详情

  攻击者投递的钓鱼邮件正文通常包含订单法律诉讼支付收据等极具吸引力的内容来诱导目标打开附件中的文档,该文档实际上是利用已知Microsoft Office漏洞的RTF文档,打开该文档就会后台下载FormBook窃密木马到本地并运行,进而实施窃密和远程控制,本次获取到的钓鱼邮件收件人皆是比亚迪公司高管,邮件内容如下:

image

图:钓鱼邮件1

image

图:钓鱼邮件2

攻击流程

image

样本分析

C#加载器分析

字段 内容
原始文件名 cOLe.exe
文件大小 759KB
文件MD5 90098f1344688dd290aff40381e8e56f
文件类型 EXE
主要功能 多层解密递进执行进而加载核心PE程序

  C#加载器主函数中,通过初始化一个FormChinh类来执行其核心功能,在其初始化函数中获取名为CHM的母体资源进行数据解密、加载并调用第二层加载器的vx函数

image

图:第一层加载

  第二层加载器依然获取母体资源DqtZ进行解密,使用Assembly进行加载,调用第三层加载器的ON6screhSa函数。

image

图:第二层加载

  第三层加载器去混淆后动态调试分析可知其获取资源45CBu7RBg解密出核心PE,创建互斥量,防止重复运行,然后创建自身傀儡进程,将核心PE通过进程注入的方式运行起来。

image

图:第三层加载器获取资源解密出核心PE

image

图:注入自身傀儡进程,启动核心PE

  除此之外第三层加载器还具备其它能力但在本次攻击中并未启用,如下载运行其他恶意软件、使用PowerShell将母体路径加入到MD的排除列表中、复制母体到系统Roaming目录并添加计划任务等。

image

图:添加计划任务部分代码

核心PE分析

字段 内容
文件大小 186KB
文件MD5 6a96eeb7424d03714f71b1f740be2ab6
文件类型 EXE
病毒名 Stealer.Formbook!1.C470
主要功能 环境检测、数据窃取、数据回传、远程控制等

  核心PE运行后首先会初始化一块内存做为自身控制块,用来存储包括母体加载基址、ntdll基址、ntdll副本基址、反分析检测标记、以及后续检测用到的哈希数据等,然后读取自身模块链表,使用CRC32-BIZP2算法依次对模块名称进行校验,这里检测sbiedll.dll(CRC:E11DA208)验证自身是否运行在沙盒中。

image

图:检测自身模块列表中是否存在sbiedll.dll模块

  申请内存并复制两份ntdll副本并重构部分ntdll敏感函数调用表,后续部分API调用则直接通过动态获取第一份ntdll副本数据来获取相应的函数地址,以此逃避安全软件对这些敏感函数的监测,检查ntdll路径是否包含wow64(CRC:0x5c4ee455)并判断WOW32Reserved是否被挂钩,动态调用NtQuerySystemInformation来确认是否处于调试状态。

mem_addr = Call_NtAllocateVirtualMemory_41BD00(a1, 0, 2 * (result + v3_image_size + 2 * result), 0x3000, 0x40);
*(a1 + 0x14) = mem_addr;
*(a1 + 0x18) = mem_addr + v3_image_size;
CopyMem_41BDA0(mem_addr, a3, v3_image_size);// 复制ntdll到新申请的内存
if ( sub_414060(a1, *(a1 + 0x14), mem_addr)
  && (CopyMem_41BDA0(*(a1 + 0x18), a3, v3_image_size), sub_414060(a1, *(a1 + 0x18), mem_addr)) )// 复制第二份ntdll
{
  Check_MZ_PE_flag(v15, *(a1 + 0x14));
  v6 = mem_addr + 2 * v3_image_size;
  v7 = mem_addr + *(v16 + 0x1C);
  v8 = 0;
  v20 = v7;
  v21 = v6;
  *v17 = 0x68;                              // push
  *&v17[4] = 0xC300;                        // ret
  if ( v18 )
  {
    v19 = v6 - mem_addr;
    while ( 1 )
    {
      *&v17[1] = a2 + *(v7 + 4 * v8);
      CopyMem_41BDA0(v6, v17, 6);
      v9 = v19;
      v21 += 6;
      *(v20 + 4 * v8++) = v19;
      v19 = v9 + 6;
      if ( v8 >= v18 )
        break;
      v6 = v21;
      v7 = v20;
    }
  }
  v10 = sub_415380(a1);                     // 检查ntdll路径是否存在wow64
  *(a1 + 0x1C) = v10;
  if ( v10 )
  {
    v11 = Check_WOW32Reserved_Point_is64_41AEC0(a1);// 判断 WOW32Reserved字段是否指向PE64 dll(COFF Magic 0x20B)
    *(a1 + 0x20) = v11;
    if ( !v11 )                             // 非64dll进,设置标志为1 后续标志判断退出进程
    {
      *(a1 + 0x4B0) ^= *(a1 + 0x14);
      *(a1 + 0x29) = 1;
    }
  }
  sub_41B030(*(a1 + 0x14), a2);
  sub_41AD30(a1, *(a1 + 0x14));
  *(a1 + 0x10) = *(a1 + 0x14) ^ *(a1 + 4);  // 保存第一份ntdll拷贝的基址 * 母体加载基址,后续获取api就用此地址
  memset_zero_41BDD0((a1 + 0xBA4), 0xF0u);
  NtQuerySystemInformation_419E80(a1, 0x23, &v22, 2, 0);
  v12 = v22 && !HIBYTE(v22);                // patch-1

  继续动态调用NtQueryInformationProcess函数检查调试端口,检测内容包括进程黑名单、母体所加载模块部分路径黑名单、用户名黑名单,最后根据所有保存的检查标记来决定退出与否。

v4 = NtQueryInformationProcess_41B270(a1);    // ProcessDebugPort 检测是否被调试
*(a1 + 0xC) = v4;
if ( !v4 )
  return 0;
*(a1 + 0x35) = RunTimeCheck_409900() > 0x300;
check_process(a1);                            // 进程名检测 20个
check_selfname_409550(a1);                    // 自身文件名检测 可能针对沙盒改名操作
check_selfpath_module_path_4097B0(a1);        // 检查母体加载模块的部分路径 7个
check_user_name(a1);                          // 检查用户名 7个
return Check_All_Flags(a1);                   // 所有检测标记校验

  校验先前保存的所有标记,检验通过后加载advapi32.dll获取提权函数,进行进程提权,无论提权成功与否都继续执行,至此所有初始化准备工作完成。

return !a1[0x29]                              // WOW32Reserved
    && a1[0x2A]                               // 调试端口检查
    && a1[0x2B]                               // NtQuerySystemInformation反调试
    && !a1[0x2C]                              // 自身进程名检查
    && !a1[0x2D]                              // 用户名检查
    && a1[0x2E]                               // 用户名检查
    && !a1[0x2F]                              // 进程路径,模块路径检查
    && a1[0x30]                               // 进程路径,模块路径检查
    && !a1[0x31]                              // 进程名检查 patch
    && a1[0x32]                               // 进程名检查
    && !a1[0x33];                             // 是否加载 sbiedll.dll

  检测的部分内容列表

进程名:vmwareuser.exe、vmwareservice.exe、vboxservice.exe、vboxtray.exe、sandboxiedcomlaunch.exe、
       sandboxierpcss.exe、procmon.exe、filemon.exe、wireshark.exe、netmon.exe
路径:\cuckoo\、\sandcastle\、\aswsnx\、\sandbox\、\smpdir\、\samroot\、\avctestsuite\
用户名:cuckoo、sandbox-、nmsdbox-、xxxx-ox-、cwsx-、wilbert-sc、xpamast-sc
模块名:sbiedll.dll

  两次尝试向explorer进行APC注入,注入的代码功能是创建一个系统进程以便后续进行二次注入,注入失败则直接使用CreateProcessInternalW创建一个系统进程来进行二次注入。

result = InjectExplorer_4087A0(a1, a3, a4, 0x1D);// 最后一个参数为0x1D遍历进程找explorer 0x1E结束explore在创建explorer在注入
if ( !result )
{
  result = InjectExplorer_4087A0(a1, a3, a4, 0x1D);
  if ( !result )
    result = CreateProcessInternalW_40F700(a1, a2, 0, a4);// 与上方注入代码目的一致,创建系统进程以备二次注入
}

  注入explorer后启动的系统进程如下表

svchost.exe rdpclip.exe cscript.exe nbtstat.exe msiexec.exe control.exe explorer.exe spoolsv.exe
wuauclt.exe taskhost.exe WWAHost.exe cmstp.exe lsass.exe rundll32.exe ipconfig.exe colorcpl.exe
wlanext.exe systray.exe msdt.exe wuapp.exe msg.exe audiodg.exe mstsc.exe cmd.exe lsm.exe help.exe   
wininit.exe NAPSTAT.exe cmmon32.exe dwm.exe services.exe netsh.exe autofmt.exe autochk.exe 
netstat.exe wscript.exe chkdsk.exe autoconv.exe raserver.exe    

  向explorer启动的系统进程注入代码,然后退出当前进程,注入的代码同样会进行环境检测(同上方检测一样),检测通过后将执行核心功能。

if ( result )
{
  result = TestInject_explorer_408A60(a1, v21, &v10, &v15);// 尝试进程注入explorer 注入成功后返回的是shellcode 创建的新进程
                                        // 尝试两次 如果都失败则找system32目录下系统文件如help.exe、spoolsv.exe等39个 随机创建一个为二次注入做准备
  v20 = result;
  if ( result )
  {
    v24[0] = GetSizeOfImage_41BC50(result);// 注入到explorer进程中的 1段 shellcode 启动的进程的 镜像大小
    NtReadVirtualMemory_41A4C0(a1, v22, v19, v20, v24[0], 0);
    v6 = *a1;
    v26 = 0;
    v27_sectionHandle = 0;
    if ( sub_40F490(a1, v6, &v27_sectionHandle, v14, &v26, 0)
      && NtMapViewOfSection_419FD0(a1, v27_sectionHandle, v22, v13, 0, 0, 0, v14, 1, 0, 64) >= 0
      && (v10 += v13[0],
          v4_RemoteProc_EP = GetPeEntryPoint_41BCC0(
                               v20,
                               v19),    // 获取explorer启动的进程入口
          v25 = v10 - (v4_RemoteProc_EP + 5) - 5,
          CopyMem_41BDA0(&v29 + 2, &v25, 4),
          v5 = GetPeEntryPoint_41BCC0(v20, v20),
          CopyMem_41BDA0(v5, &v28, 10),
          sub_40F490(a1, *a1, &v17, v24, &v18, 0)) )
    {
      CopyMem_41BDA0(v18, v20, v24[0]);
      RtlFreeHeap_41BD80(a1, v20);
      NtUnmapViewOfSection_41A020(a1, v22, v19);
      result = NtMapViewOfSection_419FD0(a1, v17, v22, &v19, 0, 0, 0, v24, 1, 0, 64);// 映射到远程进程空间
      if ( result >= 0 )
      {
        CopyMem_41BDA0(v26, MapPEBasev12, v14[0]);
        NtResumeThread_419DE0(a1, v23, 0);// 恢复线程,运行shellocde
        result = ExitProcess_41A670(a1, 0);
      }
    }
    else
    {
      result = RtlFreeHeap_41BD80(a1, v20);
    }
  }
}

  获取用户名,解密C2地址,并根据用户名和用户名加C2地址分别创建互斥量,并设置标识以便决定后续注入那些进程,然后将母体读取到内存,解密出自删除命令并执行、解密自复制后的名字和自复制命令。

v5 = CreateMutant_UseUserName_40F370(a1, 1);  // 获取用户名创建互斥体  返回0 表示成功 1表示已存在
result = CreateMutant_Use_UserNameAndC2_40F400(a1, 1);// 解密数据C2 然后与 用户名 构造出第二个互斥量并创建 返回0表示成功
if ( v5 )
{
  if ( result )
    return result;
  a1[0x2D0] = 1;                              // 后续进程注入已此标识做为判断
}

image

图:自删除母体

image

图:解密自复制名称和拷贝命令

  然后根据创建互斥量时的标识,循环且选择性注入explorer或者其它iexplore.exe,firefox.exe、360se.exe 等92个进程之一。

do
{
  if ( sub_407EA0(v1, v14) )              // NtQuerySystemInformation  准备遍历进程找explorer
  {
    sub_4080B0(v14, v7);                  // 复制进程名
    do
    {
      memset_zero_41BDD0(v11, 0x104u);
      UnicodeToAscii_41C440(v11, v8);
      if ( v1[0x2D0] )                    // 当前面用户名互斥量不存在,C2+用户名互斥量存在时注入到explorer中
      {
        v4 = Get_Hash_414D80(v1, 0x7C);   // 注入到explorer.exe
        if ( Compare_hash_calc_414DE0(v4, v11) )
          sub_40C7A0(v1, v14, v7, &v9, &v12, 4u);
      }
      else
      {                                   // 注入到其他 92个进程之一
        for ( i = 0x78; i <= 0xD3; ++i )
        {
          v6 = Get_Hash_414D80(v1, i);
          if ( Compare_hash_calc_414DE0(v6, v11) )// 0x216500C2(iexplore.exe) 
                                          // 0x9e01fc32(firefox.exe)
                                          // 0x48E207C9(chrome.exe)
                                          // 0x2DECF13E(microsoftedgecp.exe)
                                          // 0x19996921(explorer.exe)
                                          // 0xB7DA3DD7(opera.exe)
                                          // 0x47F39D2B(safari.exe)
                                          // 0x6777E2DE(torch.exe)
                                          // 0xD980E37F(360se.exe)
                                          // 0x963FEA3B(maxthon.exe)
                                          // 0xACDDB7EA(seamonkey.exe)
            sub_40C7A0(v1, v14, v7, &v9, &v12, i - 0x78);
        }
      }
    }
    while ( !v3->BeingDebugged && sub_4080E0(v14, v7) );// 检查是否被调试
    CallNtFreeVirtualMemory_408160(v1, v14);
  }
  v1[0x2DC] = 0;
  result = Sleep_40F660(v1, 0xFD050F80);
  if ( v1[501] )
    result = sub_40F070(v1, 0);           // 窃取信息、添加自启动、接收指令完成指定功能
}
while ( !v3->BeingDebugged );

  注入前根据用户名和C2拼出日志文件路径,并构造回传信息头,由标识FBNG开始后跟8位用户SID的CRC32校验和与程序版本号4.1以及操作系统版本等,然后创建网络线程发送、接收数据。

a1[0x1F4] = 1;
v1 = sub_40D980(a1);                          // a1+0x0x7D8 = Roaming_path + 根据用户名和C2生成16字节数据取前8字节做为目录名+目录名+log.ini
a1[0x1F5] = v1;
if ( v1 )
{
  sub_403BD0(a1);                             // FBNG:4867CAF14.1:Windows 7 Ultimate x64:
                                              // 标识:SID-crc32版本:系统版本
  Call_CreateThread_419170(a1);
}
result = AllocateHeap_and_init_41BF50(a1, 0x1000u);// RtlAllocateHeap
a1[0x281] = result;
if ( result )
{
  if ( a1[0x2DB] )                            // 前方判断母体在Roaming目录则标记为1
    result = StealerFun_40EF90(a1);
}

  判断待注入进程位数进行注入,挂起线程,进行APC注入。

if ( a6 == 1 )                            // firefox.exe进程
  Sleep_40F660(v6, 0xFD050F80);
memset_41BE20(v16, 0, 0x2C8u);
v21_PID[0] = *inject_pid;
v21_PID[1] = 0;
v15 = 0x10007;
v20[0] = 24;
v20[1] = 0;
v20[3] = 0;
v20[2] = 0;
v20[4] = 0;
v20[5] = 0;
result = NtOpenProcess_419CD0(v6, &a1, 0x438, v20, v21_PID);
if ( result >= 0 )
{
  v24 = 0;
  if ( !v6[7] || (result = NtQueryInformationProcess_419EC0(v6, a1, ProcessWow64Information, &v24, 4, 0), v24) )// x64/x86 判断
  {
    v18 = 0;
    memset_41BE20(v19, 0, 0x3Fu);
    sub_40C740(v6, a1, &v18, 0x20);
    if ( v19[1] || !sub_40C6B0(v6, a2, &v25) )// 挂起线程
    {
      result = NtClose_41A450(v6, a1);
    }
    else
    {
      v12 = a5;
      if ( v6[0x1F5] )
        Call_NtMapViewOfSection_40C630(v6, a5, &a1, 50);
      NtGetContextThread_419D50(v6, v25, &v15);
      **(v12 + 4) = 0x68;
      **(v12 + 8) = v17;
      v17 = sub_40C4B0(v6, &a1, a4, *v12, 2);// 注入的代码 修改  eb fe 
      if ( v17 )
      {
        NtSetContextThread_419D80(v6, v25, &v15);
        if ( (!a6 || a6 == 3 || a6 == 4) && v17 != -5 )// iexplore.exe| microsoftedgecp.exe | explorer.exe
          NtQueueApcThread_419E10(v6, v25, v17 + 5, 0, 0, 0);
      }
      NtResumeThread_419DE0(v6, v25, 0);  // Second_Inject_explorer_41BA00
      NtClose_41A450(v6, a1);
      result = NtClose_41A450(v6, v25);
      v13 = *(v12 + 12);
      if ( v13 )
        *v13 = 0x88888888;
      if ( a6 == 4 )
        result = sub_408310(v6, v6[0x288]);// Call_PostThreadMessageW
    }
  }

  注入的代码主要功能为解密所有C2、Hook API、按键监控、劫持火狐和基于Chrome内核的浏览器所用动态库的导出函数。

result = (loc_4076E0)(a1);                    // 数据初始化,获取网络相关API、剪切板、窗口Text相关API
if ( !result )
  return result;
result = sub_409150(a1, 0, 0);                // 使用用户SID + 进程ID 作为参数创建互斥量
if ( result )
  return result;
result = sub_40E960(a1);                      // 解密C2,创建网络线程 sub_40E8D0
if ( result )
  return result;
result = a1[0x32B];
if ( result != 1 )
{
  if ( result == 2 )
  {
    KeyBoardMon_40DA90(a1);                   // Hook 消息类api并监控键盘
    result = sub_40B800(a1);                  // Hook 火狐浏览器 nspr4.dll 导出函数
    goto LABEL_18;
  }
  if ( result == 3 )
  {
    KeyBoardMon_40DA90(a1);
    result = (hijack_Chrome_40B930)(a1);      // 劫持基于chrome内核的浏览器chrome_child.dll-hook导出函数
    goto LABEL_18;
  }
  if ( result != 4 )
  {
    if ( result == 5 )
    {
      Get_API_Addr_405790(a1);                // ole32.dll、shell32.dll导出函数获取
      KeyBoardMon_40DA90(a1);
      sub_40B750(a1);                         // 获取wininet网络API
      result = sub_405270(a1);
    }
    else if ( result )
    {
      if ( result >= 0x32 )
      {
        KeyBoardMon_40DA90(a1);
        result = sub_40BF40(a1);              // hook网络api ws2_32.send  InternetConnect等
      }
      else
      {
        KeyBoardMon_40DA90(a1);
        result = sub_40BBE0(a1);              // Hook API
      }
    }
    goto LABEL_18;
  }
}
KeyBoardMon_40DA90(a1);
result = sub_40BA30(a1);                      // Hook sspicli.dll和wininet.dll部分Api 并wininet.dll入口点部分代码改变执行流程

  在注入成功且构造出log目录后设置注册表自启动、将存储目录设置为隐藏属性等。

if ( !*(a1 + 0xB6C) )
{
  if ( *(*(a1 + 0x7D8) + 0x2050) )
  {
    *(a1 + 0xB6C) = 1;
    sub_40D900(a1, (a1 + 0xA28));             // 设置自启动 Machine.....\Run
    sub_414A40(a1, (a1 + 0x7F0), 4, 0);       // 设置存放获取到的敏感信息的文件夹 属性为隐藏  C:\Users\Win7\AppData\Roaming\********
    sub_414A40(a1, (a1 + 0x8F0), 0x11, 0);    // 在 C:\Users\Win7\AppData\Roaming\********\目录 创建***log.ini文件在
    StealerFun_40EF90(a1);                    // 窃取数据、凭据+屏幕截图
  }
  if ( !*(a1 + 0xB6C) )
    goto LABEL_14;
}
v2 = sub_40DFB0(a1);
if ( v2 > 0x1400 )
  sub_40EC50(a1, v2);
if ( *(a1 + 0x7D8) )
{
  if ( a2 )
    sub_40EDB0(a1);
  sub_40EF30(a1);
}
sub_40EEC0(a1);
result = sub_40EDF0(a1);
if ( !a2 )
{
  sub_40EA90(a1);
  if ( !*(a1 + 0xA24) )
    *(a1 + 0xA24) = sub_414A40(a1, (a1 + 0xA28), 22, 0);
 LABEL_14:
  result = command_control_4041D0(a1);        // 接收指令完成特定功能
}

  窃取系统凭据和Outlook、IE、FirFox、ThunderBird、Chrome、Opera等应用程序隐私数据,屏幕截图等。

OutLook_Stealer_413D60(a1);                   // 窃取Outlook邮件客户端隐私信息
 IE_Stealer_412A40(a1);                        // 窃取IE浏览器隐私信息
 FireFox_Thunderbird_Stealer_410E50(a1);       // 窃取FirxFox浏览器和ThunderBird邮件客户端隐私信息
 Chrome__Stealer_411BC0(a1, a1, 22);           // 窃取Chrome浏览器隐私信息
 Opera_Stealer_412D60(a1, a1);                 // 窃取Opera浏览器隐私信息
 ret_1();
 Stealer_Credential_4133D0(a1);                // 窃取凭据
 result = ScreenShot_4160D0(a1, 0, 0, 0);      // 屏幕截图
 if ( a1[0x2D3] && !a1[0x280] || a1[0x2D2] && !a1[0x27F] )
 {
   v3 = a1[0x1F6];
   if ( v3 )
     *(v3 + 0x2034) = 1;
 }

  除此之外病毒还会接收C2指令完成特定功能。

if ( *v7 != '3' )
  {
    switch ( v14 )
    {
      case '5':
        if ( **(a1 + 0xB38) == 'GNBF' )
        {
          sub_404D40(a1);                       // Clear-Cookies
          return 0;
        }
        return 0;
      case '6':
        if ( **(a1 + 0xB38) == 'GNBF' )
        {
          Call_ExitWindowsEx_404580(a1, 0x12);  // EWX_REBOOT 重新引导系统-重启
          return 0;
        }
        return 0;
      case '7':
        if ( **(a1 + 0xB38) == 'GNBF' )
          Call_ExitWindowsEx_404580(a1, 0x18);  // EWX_POWEROFF 关掉系统电源
        return 0;
      case '8':
        if ( **(a1 + 0xB38) == 'GNBF' )
          sub_4048C0(a1);                       // 窃取隐私数据、屏幕截图
        return 0;
      case '1':
      case '2':
      case '4':
      case '9':
        v15 = *(a1 + 0xB38);
        v16 = 0;
        if ( v22 != 2 )
        {
          do
          {
            if ( *(v15 + v16) == 'GNBF' )
            {
              v7 = v21;
              v20 = v16;
            }
            ++v16;
          }
          while ( v16 < (v22 - 2) );
        }
        break;
    }

  后门功能指令列表如下:

指令 功能
1 启动Temp目录下解密出的PE
2 更新FormBook
3 卸载FormBook
4 使用ShellExecute执行命令
5 删除Cookies
6 重启系统
7 关闭系统
8 执行窃密和屏幕截图
9 下载并解压文件到temp目录

总结

  FormBook作为一款商业窃密木马,2016年在地下论坛开始出售,至今依然异常活跃,通常采用广撒网的方式投递钓鱼邮件,也存在高价值目标的“定制化”攻击,如企业、组织高管等,一旦中招将对用户隐私和企业网络安全造成严重威胁,望企业单位和用户重视,加强防御措施。

预防措施

  1. 不打开可疑文件。

    不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。

  2. 部署网络安全态势感知、预警系统等网关安全产品。

    网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。

  3. 安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。

    杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。

    瑞星ESM目前已经可以检出此次攻击事件的相关样本

image

  1. 及时修补系统补丁和重要软件的补丁。

沦陷信标(IOC)

  • MD5

    ffda2fd7f1408e0d0216cbd41e0f501a
    39bc03dac6d8cd21e3b3c66466c5e49a
    90098f1344688dd290aff40381e8e56f
    6a96eeb7424d03714f71b1f740be2ab6
  • Domain

    iqixuehe.com
    beidixi.com
    claudiobarros.online
    lemmy.systems
    julieslive.com
    bepnuclasechia.com
    bollywood.nexus
    hotshark-shop.com
    akabou-hayasaka.com
    slotjitu88.website
    matsuri-jujutsukaisen.com
    loadtransfer.site
    pacersun.com
    castlegrouplt.com
    sactribune.com
    showshoe.info
    tcbbuilds.com
    osisfeelingfee.com
    tr-ij.com
    nbgonghe.com
    7141999.com
    imaswe.com
    elnoh.life
    quailrun-inc.com
    gemwhk.store
    collibrishop.online
    locduongseafood.com
    bakepreneurs.com
    crissmendez.com
    homerevamps.today
    spicax.com
  • 瑞星病毒名

    Stealer.Formbook!1.C470

参考链接

Author