0 r- q ]" k* X , d- u5 I! S0 I: d
" i8 y7 i. w" Z" y4 q' u; V8 D
3 ` M, \% B" }9 `5 T/ {4 k
: s1 \- z# `$ H) ?
9 ~9 ^$ W! t$ V% B* v& B, A) D; C ^
4 _+ P7 `$ B7 B, R% `7 y- {. I 简介$ B) u V$ W6 D
% m2 z. |1 [; c; f! f
# z; Y! E0 L6 Z! y
, o& M+ O0 G7 i: ^: w+ v 3 E7 B1 p/ H$ d, n
1 a8 m5 {) [! I; K. C) j 为了绕过静态和动态分析,威胁组织经常为恶意程序采取"加壳"或"加密"措施,并且这种做法非常流行。实际上,免杀和查杀是一个军备竞赛,因此,在这场持久战中,各种新技术会不断涌现,并被迅速采用。例如,据我们观察,许多加密服务都是由地下论坛提供的,他们声称能够绕过反病毒技术、沙箱和其他端点解决方案,任何恶意软件只要采用了他们的服务,就能够实现“完全无法检测(Fully Undetectable,FUD)”的效果。我们还发现,越来越多的威胁组织正在设法模拟正常的用户行为,并将其作为基于恶意软件指纹分析技术的有效对策。% \; C1 [: I: J1 G1 r; f
, {, \: |+ m4 _* G5 r* Y, e* q% c0 Q7 D# ]1 y( ]
恶意软件的保护神:Delphi代码( A/ N+ Y3 i/ ~- C1 ^0 t0 H
$ r0 P+ m u/ C% q0 D$ S9 U$ b) ^; v$ b5 T) ^
# E1 `! F# q+ b+ u3 I9 M
# q- C* v& \/ r) m; v' u" r4 ? 6 W0 H" n; T' ]% I& I
, V3 \( N: D9 f3 }* }7 c- D 在这里,我们所考察的样本具有Delphi签名(见图1),并且与使用IDR(Interactive Delphi Reconstructor)分析时看到的Delphi代码构造完全一致。4 d4 M+ P6 t& l! a# J+ D
7 N, @! r3 y* ^8 n! j! w% q& {4 m2 X0 C* ^# k y
# V& n9 a. Z5 M$ j: `* }! R* Y* T
+ n8 Q2 P( ^6 S8 i, f; u. ?
' ]0 Q1 U: ^6 O. Q' z. W$ K
图1:样本中的Delphi签名8 S# p2 e* g: X# T& [5 q, S
8 d" W# |$ K1 Y" T. Q' `, E
' c8 h, w: y4 q1 { 对于基于Windows API函数的应用程序和程序来说,Delphi是一种简单易用的编程语言。事实上,一些组织会故意将某些默认库包含进恶意软件中,以此转移静态分析人员的注意力,并能让应用程序在进行动态分析时“看起来很正常”。图2显示的地下论坛帖子,就是在讨论这些技术。
7 q. S2 Z" m$ ?/ f 4 }0 j/ ^6 d3 h0 d0 w
9 X: Y/ z" D3 i* X7 q ~
6 ~$ @9 S/ @2 ^% l2 f1 e1 _
& ~; r6 X, V9 |3 e$ d& g
( ?6 c j. |6 X- E! q- W 图2:地下论坛中的免杀技术帖$ K, j1 C! `3 O! p4 C4 c0 T5 I
) _* f4 v" I: Q- i/ L5 d. t; {" {
有效载荷的投递) m& u9 f7 [- j2 I8 P* C; P
0 e0 O1 I- ]1 e1 b8 [' p& {/ O5 ^* [7 q
% z6 i) n$ P- h9 T " K2 _# I% ~/ w. P1 s1 n5 T
3 r% e% P; t, r% ~5 ^+ @' Z
, a% o9 B( ^( z( s
我们发现,许多攻击组织都曾利用这种有效载荷进行加壳处理,然后通过垃圾邮件进行分发,当然,针对不同的人群,他们会使用不同的邮件主题。
# Q9 I" P+ ~' q6 @. l7 ^4 m A7 n
% y' V; F5 ^2 f! Q. H
* A" R. j# i# O/ U 一个样本是与电汇有关的垃圾邮件,它将一个文档文件作为邮件附件(哈希值:71cd5df89e3936bb39790010d6d52a2d),其作用是利用恶意宏来投递有效载荷。该垃圾邮件如图3所示。 g' j& p8 R* ^4 }5 o7 w
) e; U5 }9 N. `" y3 \! L
/ ?- Y! Z( x0 A$ m" P/ B . v; I: V4 P0 S% P |
/ K1 G" } m% {" M+ M4 F# Z% S0 A2 z- J& b" j# R I: m
图3:垃圾邮件样本1, u- c- \# s# K |" t. ~, e4 n
& |: Y/ t2 S4 v) o2 S1 Q" P' Y5 W7 x, O0 o6 Z/ L ?) `
另一个例子是报价方面的垃圾邮件,它将一个漏洞利用文档文件作为附件(哈希值:0543e266012d9a3e33a9688a95fce358),其作用是利用公式编辑器漏洞来投递有效载荷(图4)。9 G4 R& A7 \0 f1 `7 |
! Y* H9 g2 h' b
6 Y: `: w2 S! a0 J e
" D! ~& E, b( B- F3 |) E 4 M6 ~+ g4 C: ^
- P& X0 M0 Q- H0 x8 u
图4:垃圾邮件样本2
; x @3 W9 g* X" r( R" T. \" B* \
4 Y$ O7 Q2 s. P2 \8 P. o- c& Q; t7 a Z+ |: b3 I
样本中的文档会从http://5.152.203.115/win32.exe下载有效载荷,其实,就是Lokibot恶意软件。
% H4 g* x7 |9 o ) ~, v$ g, J0 ~/ p/ d
# D0 o; e+ S/ n9 U 用户行为检测2 I( I3 t Q5 e( Z. M; z! N( M/ p* Y
# E9 U" R5 ?* D1 R3 ` d% i1 o+ @5 _5 u3 N) G
$ r. k {% |8 _. q- c9 i
6 \6 y8 y7 X9 _# T5 Y+ _. X5 S
; ~) M+ s" y A/ z# \- t, ~
这个加壳器会尽力确保自己不在安全分析环境中运行。对于普通用户来说,通常会在一定时间内切换多个应用程序窗口。该加壳器的第一个变体,会使用GetForegroundWindow API来检测用户切换窗口的次数,准确来说,只有切换三次之后,它才会继续执行其他代码。如果它没有检测到窗户的变化,就会自动进入无限期的睡眠状态,具体代码如图5所示。有趣的是,尽管这种技术非常简单,却能检测到多种常用的沙箱。
: w, r- X1 Q2 O( u/ }6 w _
6 l$ R3 z& m: b: v
7 h C* \% x& N3 Q
! v0 q% |& F7 g' |$ E4 z# A 8 F0 Y2 B$ |4 r. K# A
1 a2 {- @$ Y& _- k
图5:检测窗口的变化情况
) y. g f0 o8 V. Q/ D5 I6 o
9 R: n: u6 p# w9 r) Y1 J. l8 F% R( u
/ o1 }' N9 c( z# i# n2 d' e 为了对用户活动进行印证,加壳器的第二个变体使用GetCursorPos和Sleep API来检查鼠标和光标的移动情况,而第三个变体则使用GetLastInputInfo和GetTickCount API来检查系统的空闲状态。
: k5 k) Z8 k8 S) O; t: w8 \7 k. F8 ? + b' p8 \) E7 w1 l& J
+ Z/ d. \, a8 |$ I: W: ]
从PE资源中提取实际有效载荷
7 s9 D V. P2 z% o ! ~ K. s' o- }( }
# h8 u- e( g2 i* N% k' T; ~
" Z2 N1 U$ ?! S" E
9 q; k, i' H: d* z/ y# r C6 \5 I4 `9 S E
原始的有效载荷被拆分为多个二进制代码段,并分别存储在资源目录内的不同位置,如图6所示。! z l( c1 u4 i9 w0 L7 @7 s4 A
2 b- U6 `" @! d9 P& g3 ]9 @$ g
. q, Q- s( [5 t - V: X" @ D6 u( X- B# Y
8 v( O6 a2 c6 F7 r/ w
. F& C3 k- p7 g# J
图6:具有加密内容的位图资源& C1 L, ?: j* H6 v
- M# |' k9 a2 y7 d* c
* y/ N6 Y1 g: O; t; Q/ v4 X* @ 为了定位和组装实际有效载荷的代码字节,该加壳器首先会从资源部分内硬编码的资源ID中读取相应的内容。其中,前16个字节用于生成一个XOR密钥,用于通过滚动XOR方法来解密其余字节。解密后的字节内容,实际上就是一些内部数据结构,具体如图7所示,供加壳器用于引用各种资源ID对应的缓冲区,注意,这些缓冲区都经过了相应的加密和混淆处理。
0 t, R/ v6 J3 C* z4 x6 } ) A9 a! S9 Q1 H9 }
: p. u! p3 I: Z. G, j
- r+ E1 m- o/ d) z. N6 ^& M 7 Q* p, s0 _4 `/ H
0 G- B5 J5 {9 T
图7:展示加密文件信息的数据结构5 w! s, u) \, @8 P R- J8 h# @
. o, T( {/ J: i+ c; C0 ]
; Q r$ \# {& H \ y 之后,该加壳器就会从加密缓冲区读取相应的值,从dwStartResourceId开始,直到dwStartResourceId+dwNumberOfResources为止;并通过读取dwChunkSize块信息将其放到一个地方。一旦准备好最终数据缓冲区,就会通过前面讲过的滚动XOR算法和上述结构中的新密钥对其进行解密,从而生成有效载荷可执行文件。这个脚本可用于静态提取实际有效载荷。
1 i& \/ b) s' U7 |9 ?! Z' ?
6 k4 r. I8 {* X* W9 U- P9 e) a# b/ D' v' U- n' ~5 ^/ e) y
恶意软件的家族分布- N9 u5 y, x+ Z
4 j1 }- T; p6 l0 c! i
~6 [7 Q; n2 z# Z/ [+ ^5 q
- C1 d: u* K# M h0 ?5 y
! d) U& T: c' B& n4 {( I _7 u( x/ o0 Z
根据我们从样本集中提取的许多未加壳的二进制文件来看,它们都属于Lokibot恶意软件家族。此外,我们还能够识别Pony、IRStealer、Nanocore、Netwire、Remcos和nJRAT恶意软件家族,以及挖矿恶意软件家族,等等。使用该加壳器的恶意软件家族的分布如图8所示。不难看出,这里出现了多种恶意软件家族,这意味着许多威胁组织正在使用这种“加密”服务/工具进行免杀处理,并且很可能是从开发人员本身那里购买的。7 ^7 w! ~( P& g% y, N( d
" H- T) k2 B6 f# z+ P; p
. l8 [! b) z; m
7 s1 S3 E, Y" h& P' U
8 y7 B# K- |# T7 L1 B5 t5 a& E( f; o; e: g9 g3 y
图8:使用该加壳器的恶意软件家族分布情况
. E( R$ g3 D2 y" H9 w5 m3 j' W2 b. m / o/ F: R0 R. c
: S( Z5 d& W' ^( A( ]( i7 A
小结
5 [" t& `' e' W1 P2 I1 ^. A. d
$ y( n' ]3 u- Q( ~4 e' U
5 S$ q; z$ J% J. G* D0 B' E+ J
! J1 r Y9 A. z3 w, B W6 z
/ E8 m* h8 J8 P$ _! Y7 K! p* U
% d) q3 G9 {6 Y 自从有了加壳和加密服务之后,威胁组织就可以直接将有效载荷的免杀工作外包出去,一方面是简单省事,另一方面,还能提高免杀效果。而且,这些免杀服务的提供者经常会找到基于安全分析对抗技术的沙箱环境绕过方法;因此,利用模拟真实用户行为的沙箱环境来“引爆”恶意软件样本的方法已经不再可靠了。
4 M: x9 L' r8 t. s( @
: N- Z/ m9 `8 `
' \4 s- S( {; c# \( j$ s. k' p, P' n IOC h9 @9 u( b! v
- g' a6 ^8 ~7 B& {; ~' i
' \: q8 \. R! v( H. y' A 8 r. A: ]4 Y e% A
4 u1 M4 G2 m" m8 M, y @% g) `
6 Y# T0 D8 ]4 N/ ^' [) @% M( ? 853bed3ad5cc4b1471e959bfd0ea7c7c& x9 S, n/ w! }: S; I
" N Z$ L8 ^) I4 l$ P* @6 w5 `- z7 h8 d6 T
e3c421d404c08809dd8ee3365552e305
% x$ Q9 @6 G& t& A
( c0 p! i0 g% i6 O# S/ [' Y3 S- @* U; c+ F1 ^. [$ Q+ s
14e5326c5da90cd6619b7fe1bc4a97e1
, s% e' @$ V4 M) o7 n% Y: d
5 m% j. Z6 j% `; _3 n
3 G, \( s" v' G0 c0 n dc999a1a2c5e796e450c0a6a61950e3f' g' D1 O, D0 R m' t
* P( R+ V7 c0 I; M. P
) o8 A+ r* ^. ]8 _3 p 3ad781934e67a8b84739866b0b55544b+ e3 e0 z# C0 X
~ \' t, q5 e/ Y& d$ [! ]
8 ~. h" x- J3 \* k. y
b4f5e691b264103b9c4fb04fa3429f1e: K& S: }( j/ r+ j3 c- I# B( @
+ g( g$ o# a+ o: ?, [' N( n
% s& c R% U& @6 W2 r' m' b
- {6 u. U* f% q2 K/ v. u) B ( [3 ]: A+ K8 p. k. i+ Q
U- B$ R* |' A
! j& d- e7 M$ ?& |. T6 b
$ a2 v6 I( K- h( U. M- Z }
% O4 @$ h3 P _# O
/ `) s& m0 a: f* t
|