02_sample远控

sample.exe分析报告

0x00 概述

基本信息

样本名称sample.exe
样本类型远控、蠕虫病毒
样本大小27.5KB(28,160字节)
MD54D049BC 19B03572EF8A00980050BAFFF

简介

经过分析,该病毒样本是一个远控与蠕虫病毒的结合体,通过弱口令进行爆破局域网内的主机,进行传播。并通过访问两个C&C服务器接收远程指令,根据接收到的指令执行不同的操作,包括:下载文件并执行,更新自身,DDOS等任务。

流程图

sample.exe

0x01 样本细节详细分析

样本行为分析

大量网络行为

运行样本后, 该样本进行了大量的网络请求,其中不断尝试与内网IP地址192.168.1.107:83进行连接。如图1

1568536102575

图1

然后通过fiddler抓取到,该样本访问异常URL,下载telnet.exe。并且不断尝试与内网网段进行连接,如图2:

1568537695315

图2

样本详细分析

脱壳

首先用查壳工具查下壳,发现该样本是UPX壳。如图:

1568193338945

然后尝试用OD进行脱壳,F8单步执行一次,然后在ESP下硬件断点,F9运行到该硬件断点处,再单步几次就到了OEP处。然后dump下来,并用ImportREC工具修复IAT,但发现再该OEP处无法找到有用的信息。如图:

1568193802608

这时再拿查壳工具查一下dump出来的文件,发现还有一层UPX壳,如下图:

1568195358436

所以目前的IAT表肯定是无法修复的,继续用OD单步跟,寻找下一个OEP。单步几步就会发现,该壳程序通过LoadLibrary和GetProcAddress获取了一些壳所需要的API,如图:

1568203038353

随后继续单步,发现该壳程序通过获取到的virtualAlloc开辟了一段空间,并往里存储了一些数据,然后将其全部释放掉了。这里我们不管,我们只寻找下一个pushad。再走没几步,就发现了pushad,这里再进行一次UPX脱壳

1568203614365

然后继续单步,直到一个大跳便会跳到函数入口。出现如下图的55 8BEC。便可以dump下来,修复IAT表了。

1568204331597

创建互斥体

先创建名为121212的互斥体,然后进行判断,若互斥体存在,则退出当前进程。若不存在则执行主要行为函数sub_404BD7。如图:

1568537469886

创建服务

创建一个名为.Net CLR的服务,并设置该服务的状态。创建服务的目的可能是用来守护该进程。

1568538257839

再次创建互斥体

再次创建名为.Net CLR的互斥体,如图:

1568539531920

枚举资源

通过调用上图中的EnumResourceNames函数,枚举二进制模块中的资源,并将读取到的资源写入hra33.dll中。如图:

1568540312153

更新资源段

先检索注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.Net CLR中的ImagePath的值。

1568541164659

然后更新从ImagePath中获取的文件的资源段数据。

1568541902631

加载释放的文件

先拼接出hra33.dll,再通过LoadLibrary加载该模块。如图:

1568545252074

创建三个线程

连续创建了3个线程,其中第三个线程是一个死循环,不断创建执行线程3。如图:

1568547969803

线程1:传播扩散

  • 初始化字典

    首先初始化了一个简单的字典,后面用来弱口令爆破,如图:

    1568548103805

  • 将主机号与网络号拼接成IP地址

    通过图中gethostbyname函数获取当前主机的IP地址信息,然后获取当前主机IP地址的所处的网段信息(网络号),并与初始化的主机号:inc_IP_408724进行拼接,将网络号与主机号进行拼接,IP地址:10.95.16.1

    1568548635418

  • 弱口令爆破该网段的所有主机

    利用如图黄色标识的主机号:inc_IP_408724,然后与当前主机所在的网段(网络号)拼接出的IP地址。通过调用如下图函数WNetAddCon_copy_exec_402A40,利用之前初始话的字典,进行爆破传播。然后执行完一个IP后,主机号自加1,爆破该网段的下一个地址。直到主机号为254时停止。如下图:

    1568549042369

  • 爆破传播函数WNetAddCon_copy_exec_402A40

    WNetAddCon_copy_exec_402A40传入了三个值,分别是IP地址,用户名,密码。通过调用WNetAddConnection函数,用之前初始化的字典(用户名,密码),对该网段的网络资源进行连接。

    若连接成功,将自身文件拷贝到网络共享资源的多个盘符中,看哪个盘符可以拷贝成功。当拷贝成功便跳到LABEL_14:再两分钟后运行复制后的程序,从而达到通网段的传播。拷贝的目标盘符,如下表:

    拷贝的目标盘符:
    \10.95.16.1\admin$\g1fd.exe
    \10.95.16.1\c$\NewArean.exe
    \10.95.16.1\D$\g1fd.exe
    \10.95.16.1\E$\g1fd.exe
    \10.95.16.1\F$\g1fd.exe

    创建网络资源连接,复制自身代码如下图:

    1568550413617

线程2:与远控服务器通信,执行指令

首先初始化了winsock服务,然后是循环,获取当前系统时间,并进行了判断当日期大于2013年2月21日后,便不断创建线程2.1,创建套接字链接远程服务器,获取指令执行命令。如图:

1568552086331

线程2.1:与远控服务器通信,获取指令并执行
初始化套接字,并建立链接

现通过htons函数将整型变量8090转换成网络字节顺序,初始化端口。

然后通过Swap_init_IPaddr将域名“arwah.uy1433.com”转换为IP地址,然后初始化socket,然后通过函数connect连接该套接字。如下图:

1568554186815

  • 其中Swap_init_IPaddr,转化IP的代码如图:

1568554466165

获取主机信息并发送致远控服务器

先与套接字建立连接,然后执行get_info_405150获取主机信息。包括版本信息,内存大小,CPU信息,以及适配器信息等。然后将这些信息,通过套接字发送到远控服务器上。

将获取到的数据发送给远程服务器,如下图:

1568599865588

获取到的主机信息,如下图:

1568601803942

  • 其中get_info_405150获取系统信息函数,如下:
    • 1.判断当前操作系统版本
    • 通过Getversion函数,获取操作系统信息,再根据获取到的操作系统信息,判断当前操作系统的版本,如图:

1568552954567

    • 2.获取CPU频率
    • 通过获取注册表中的键值,来获取CPU的频率信息。

1568552888140

    • 3.获取物理和虚拟内存信息
    • 通过GlobalMemoryStatsEx来获取系统物理和虚拟内存信息。

1568553016127

    • 4.获取适配器信息
    • 通过GetAdaptersInfo检索本地计算机的适配器信息,然后获取到网络适配器的网络信息。

1568553326893

接收指令执行操作

创建死循环,通过调用receive_info_4036C8来接收远控服务器下发的指令,然后根据下发的指令进行相应的操作,如图:

1568598189550

  • 其中receive_info_4036C8函数,通过函数rec来接收远控服务器下发的指令或数据,如图:

1568562440939

接收的指令为:0x10,下载并执行

当接收到是0x10时,通过URLDownloadToFileA将接收的数据写入临时文件夹下,并以系统自启动以来的毫秒数来命名。当下载完后,运行下载后的程序。如图:

1568562998892

接收的指令为:0x12,更新自身

先关闭之前创建的.Net CLR互斥体,通过URLDownloadToFileA将接收的数据写入临时文件夹下,并以随机字符串命名。然后关闭之前创建的.Net CLR服务,并删除注册表项.Net CLR,然后再删除自身,运行下载后的程序。这里推测是更新自身

  • 关闭之前创建的互斥体如图:

1568601120782

  • 下载文件,并以随机字符串命名如图:

1568601212938

  • 关闭服务如图:

1568601292710

  • 删除注册表项和自身文件,并运行下载后的文件,如图:

1568601380109

接收的指令为:0x14,打开IE

打开Iexplore.exe,并执行接收到的参数,初步推断为访问某些特殊的网站刷流量。如图:

1568601454250

接受的指令为:0x06,删除自身

先关闭之前创建的互斥体.Net CLR,关闭服务.NET CLR,然后再删除注册表项.Net CLR,删除自身,退出进程。

  • 关闭互斥体,关闭服务,如图:

1568602630773

  • 删除注册表项,删除自身,退出进程,如图:

1568602700057

接收的指令小于0x06时,进行DDOS攻击

当收到的指令小于6时,再次进行switch case判断。根据接收的参数,构造套接字,或是请求包头来进行连接。推测是进行DDOS攻击,如图:

1568605182440

  • 其中当接收的指令为:0x02,执行sub_4030A5,根据收到的数据,初始化不同的套接字,并最终都交由LABEL_29来创建循环,不断进行链接,如图:

1568604291694

  • 其中当接收的指令为:0x03时,执行sub_4031F0,根据接收到的参数,构造请求包头,并最终创建死循环不断进行连接,如图:

    1568605639197

    • 其中sub_406C60构造的比较特殊的请求包头,如图:
    • 1568605762398

线程3:与线程2.1基本一样,只是远控服务器地址为内网IP

线程3与线程2.1大体上都是一致的,唯一的区别在于远控服务器不再是arwah.uy1433.com,而变成了写死的内网IP:192.168.1.107:83。而且该IP地址是通过解密函数获取到的,如图:

1568605994098

除黄色标识处不同外,其他部分都与线程2.1一致,这里便不再分析。

1568606079331

0x02 样本溯源

C&C服务器
arwah.uy1433.com
192.168.1.107:83

0x03 查杀、防御技术方案

关闭服务

由于该样本设置了一个服务.Net CLR,所以首先先关闭服务,并删除该服务。

修复注册表

由于上面提到的该样本创建了服务,对注册表进行了修改,所以这里需要对注册表进行修复,操作如下:

  • 删除注册表项HKEY_LOCAL_MACHINE\system\currentcontrolset\services.Net CLR中的所有内容。

删除病毒文件

  • 删除样本本身。

  • 删除释放出来的hra33.dll。

  • 查看下表中的文件路径,若该文件存在,则删除。

    拷贝的目标盘符:
    \10.95.16.1\admin$\g1fd.exe
    \10.95.16.1\c$\NewArean.exe
    \10.95.16.1\D$\g1fd.exe
    \10.95.16.1\E$\g1fd.exe
    \10.95.16.1\F$\g1fd.exe
  • 检查临时文件夹,是否存在以随机数命名的文件,且大小hash与该样本一致,若存在直接删除。

0x04 总结

这个样本是一个远控和蠕虫病毒的结合体,释放hra33.dll,由于该样本无法正常跑起来,因此没法详细分析该释放出来的hra33.dll。这次分析的蠕虫病毒是通过初始化一个简单的字典,通过爆破局域网内的主机来进行传播的。并且该蠕虫病毒可以通过C&C服务器获取指令,执行不同操作,主要操作有:下载文件并执行,更新自身,DDOS攻击等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码定义了一个宏 ABS(a) 和一个结构体 slid_reg_t,以及一个用于更新线性移位寄存器的函数 slid_update。下面对代码进行详细解析: 1. 宏定义 #define ABS(a) (0 - (a)) > 0 ? (-(a)) : (a) 该宏定义了一个对传入的参数取绝对值的操作,如果传入的参数 a 小于 0,则取其相反数作为返回值。 2. 静态常量 #define DYNAMIC_PRECISION 30 该宏定义了一个静态常量 DYNAMIC_PRECISION,其初始值为 30,用于过滤高频噪声。 3. 结构体定义 typedef struct slid_reg{ axis_info_t new_sample; axis_info_t old_sample; }slid_reg_t; 该结构体定义了一个线性移位寄存器 slid_reg_t,其中包含两个 axis_info_t 类型的变量 new_sample 和 old_sample,用于存储当前样本和旧样本的信息。 4. 函数定义 static char slid_update(slid_reg_t *slid, axis_info_t *cur_sample) { char res = 0; if (ABS((cur_sample->x - slid->new_sample.x)) > DYNAMIC_PRECISION) { slid->old_sample.x = slid->new_sample.x; slid->new_sample.x = cur_sample->x; res = 1; } else { slid->old_sample.x = slid->new_sample.x; } if (ABS((cur_sample->y - slid->new_sample.y)) > DYNAMIC_PRECISION) { slid->old_sample.y = slid->new_sample.y; slid->new_sample.y = cur_sample->y; res = 1; } else { slid->old_sample.y = slid->new_sample.y; } if (ABS((cur_sample->z - slid->new_sample.z)) > DYNAMIC_PRECISION) { slid->old_sample.z = slid->new_sample.z; slid->new_sample.z = cur_sample->z; res = 1; } else { slid->old_sample.z = slid->new_sample.z; } return res; } 该函数用于更新线性移位寄存器 slid 中的样本信息。首先定义了一个 char 类型的变量 res,并初始化为 0,用于记录是否更新了样本信息。然后分别对 x、y、z 三个轴上的样本信息进行判断,如果当前样本与新样本之间的差值大于 DYNAMIC_PRECISION,则将旧样本更新为新样本,将新样本更新为当前样本,并将 res 设为 1;否则只更新旧样本。最后返回 res。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值