欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]HW行动 rdpscan后门简单分析

[原创]HW行动 rdpscan后门简单分析

笔者目前是初学者,该文章的分析的每一步都是经过实践与参考他人分析报告而输出。

分析时间花了三个星期,文中如有错误,欢迎各位指正。


样本概况

文件名称 :rdpscan.exe

文件大小 :85504 byte

文件类型 :PE32 executable for MS Windows (console) Intel 80386 32-bit

MD5:d0840aeb2642d718f325a07a4b7f6751

SHA1:ae77ca712670176650b01d30e6fe4801e90fafe2

SHA256:9966826ada8b1f366a9e7b9b1e7c430a2a49dda60eb7025c7481295e3ab7f9e4


文件名称 :ssleay32.dll

文件大小 :67416 byte

文件类型 :data

MD5:27b0374083f46693df15c0e3fffad070

SHA1:0eb87babebc32e526f6128fc4be3686c034c4185

SHA256:948e2def7339cf87071913148705bbba3cd9a8279c6157251036d6fac59983d5


拿到文件后,是个压缩包,进行解压后,发现如下文件。




本地静态分析

有个exe文件,查下壳。


无壳,发现是VS2013编写的控制台程序。


在线分析

VT检测

rdpscan.exe 因为之前国内厂商已经检测,并且已经添加特征库,所以在线分析会被检测出。

https://www.virustotal.com/gui/file/9966826ada8b1f366a9e7b9b1e7c430a2a49dda60eb7025c7481295e3ab7f9e4/detection


得到的特征为木马后门


ssleay32.dll(shellcode) 由于关键信息数据已加密,静态分析时则无法检测。

https://www.virustotal.com/gui/file/948e2def7339cf87071913148705bbba3cd9a8279c6157251036d6fac59983d5/detection



在线云沙箱检测

微步云沙箱检测如下,结果是该文件为安全:

这与自己在本地虚拟机运行时一致,当第一次拿到样本时,当晚就在虚拟机里实际运行,直接提示缺失组件,无法成功运行。

因为后门编译为debug版本,没有找到对应的运行库,无法运行,导致沙箱无法对其进行恶意性行为检测。

https://s.threatbook.cn/report/file/0b5a6f745a47e2cb83c167e1f53f92db38f21e07a73f8600fc58dbc73cd927a7/?env=win7_sp1_enx64_office2013


如果要实际运行,本地需要安装VS2015以上版本后才会自带VC运行库。

直接在网上搜索VCRUNTIME140.dll缺失,会找到一些解决文章, 但是经过实践,都失败了,无法安装运行库。

最后只能退而求其次,安装了VS2015,因为会自带所需运行库。

附一个视频,安装VCRUNTIME140.dll。还未实验,不知道是否能行。

https://www.youtube.com/watch?v=AqxebQEFU64

该rdpscan扫描工具参考了之前网上公布的工具源码,所以按照之前网上的分析步骤,先去源项目的github查下源码。

https://github.com/robertdavidgraham/rdpscan/blob/master/src/main.c

经过仔细对比,在471-190行之间的代码被加入了一个判断,如果条件成立就跳转执行恶意代码。

/* See if we have a single IPv4 range, in which case we expand

* this into a larger range */

if (cfg.list_filename == NULL && cfg.target_count == 1 && is_ipv4_range(cfg.targets[0])) {

char *string = cfg.targets[0];

unsigned index = 0;

struct Range range;

struct RangeList list = {0};

size_t i;

uint64_t count;

struct BlackRock br;

/* Free the old list and reset it to NULL */

free(cfg.targets);

cfg.targets = 0;

cfg.target_count = 0;

/* Parse the range */

range = range_parse_ipv4(string, &index, (unsigned)strlen(string));

if (!range_is_valid(range)) {

fprintf(stderr, "[-] %s: invalid range\n", string);

exit(1);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功