[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

这是做者网络安全自学教程系列,主要是关于安全工具和实践操做的在线笔记,特分享出来与博友们学习,但愿您喜欢,一块儿进步。前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、经常使用快捷键和TraceMe案例分析。这篇文章将继续详细讲解WannaCry蠕虫的传播机制,带领你们详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。做者分析该病毒一个月,一方面以为本身技术菜,另外一方面深知系统安全须要坚持,继续加油。但愿文章对您有所帮助~php

在这里插入图片描述

做者做为网络安全的小白,分享一些自学基础教程给你们,主要是关于安全工具和实践操做的在线笔记,但愿您们喜欢。同时,更但愿您能与我一块儿操做和进步,后续将深刻学习网络安全和系统安全知识并分享相关实验。总之,但愿该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!若是文章对您有帮助,将是我创做的最大动力,点赞、评论、私聊都可,一块儿加油喔~html

PS:本文参考了github、安全网站和参考文献中的文章(详见参考文献),并结合本身的经验和实践进行撰写,也推荐你们阅读参考文献。c++

做者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其余工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
Wannacry分析:https://github.com/eastmountyxz/WannaCry-Experimentgit


声明:本人坚定反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络须要咱们共同维护,更推荐你们了解它们背后的原理,更好地进行防御。github

前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通讯(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防御
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防护初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防护原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防护原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防护(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提升班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制做(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客经常使用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和经常使用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
[网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
[网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
[网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
[网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
[网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
[网络安全自学篇] 六十九.宏病毒之入门基础、防护措施、自发邮件及APT28样本分析
[网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
[网络安全自学篇] 七十一.深信服分享以外部威胁防御和勒索病毒对抗
[网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析web


前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差别备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包正则表达式



一.WannaCry背景

2017年5月12日,WannaCry蠕虫经过永恒之蓝MS17-010漏洞在全球范围大爆发,感染大量的计算机。WannaCry勒索病毒全球大爆发,至少150个国家、30万名用户中招,形成损失达80亿美圆,已影响金融、能源、医疗、教育等众多行业,形成严重的危害。算法

WannaCry是一种“蠕虫式”勒索病毒软件,由不法分子利用NSA泄露方程式工具包的危险漏洞“EternalBlue”(永恒之蓝)进行传播。该蠕虫感染计算机后会向计算机中植入敲诈者病毒,致使电脑大量文件被加密。shell

WannaCry利用Windows系统的SMB漏洞获取系统的最高权限,该工具经过恶意代码扫描开放445端口的Windows系统。被扫描到的Windows系统,只要开机上线,不须要用户进行任何操做,便可经过SMB漏洞上传WannaCry勒索病毒等恶意程序。数据库

在这里插入图片描述


WannaCry利用永恒之蓝漏洞进行网络端口扫描攻击,目标机器被成功攻陷后会从攻击机下载WannaCry蠕虫进行感染,并做为攻击机再次扫描互联网和局域网的其余机器,行成蠕虫感染大范围超快速扩散。

木马母体为mssecsvc.exe,运行后会扫描随机IP的互联网机器,尝试感染,也会扫描局域网相同网段的机器进行感染传播,此外会释放敲诈者程序tasksche.exe,对磁盘文件进行加密勒索。木马加密使用AES加密文件,并使用非对称加密算法RSA 2048加密随机密钥,每一个文件使用一个随机密钥,理论上不可攻破。同时@WanaDecryptor@.exe显示勒索界面。其核心流程以下图所示:

在这里插入图片描述


WannaCry勒索病毒主要行为是传播和勒索。

  • 传播:利用基于445端口的SMB漏洞MS17-010(永恒之蓝)进行传播
  • 勒索:释放文件,包括加密器、解密器、说明文件、语言文件等;加密文件;设置桌面背景、窗体信息及付款帐号等。


二.WannaCry传播机制源码详解

WannaCry蠕虫主要分为两个部分:蠕虫部分用于病毒传播,并释放出勒索程序;勒索部分用于加密用户文件索要赎金。你们可能看到的不少样本都是没有传播部分代码或域名开关的。接下来是做者一点点的摸索,但愿对您有所帮助,也欢迎批评和指正。


1.WannaCry蠕虫传播流程

WannaCry运行的总体流程推荐安天公司的框架图,以下图所示:

  • 主程序文件利用漏洞传播蠕虫,运行WannaCry勒索程序
  • WannaCry勒索程序释放tasksche.exe,对磁盘文件进行加密勒索
  • @WanaDecryptor@.exe显示勒索信息,运行TOR客户端

在这里插入图片描述


其中,图中上半部分为WannaCry蠕虫的传播部分,该蠕虫经过网络进行传播,有自我复制和传播迅速等特色。传播步骤以下:

(1) 链接远程域名开关
(2) 判断参数个数,选择蠕虫安装流程或服务传播流程

  • <2时,进入安装流程,点击直接运行
    ① 建立服务:服务名称mssecsvc2.0,参数为–m security
    ② 释放并启动tasksche.exe程序
  • ≥2时,进入服务传播流程
    ① 服务函数中执行传播感染功能
    ② 打开mssecsvc2.0服务并设置其状态
    ③ 蠕虫初始化操做后,会进行局域网和公网传播(创建局域网或公网IP表,建立IP线程)
    ④ 尝试链接445端口,测试是否存在SMB漏洞
    ⑤ 若是存在漏洞,则创建通讯链接并发送Payload(X86或X64)进行攻击
    ⑥ 执行shellcode并使用APC注入将生成的dll注入到进程lsass.exe
    ⑦ dll调用导出函数PlayGame,释放资源文件并保存为mssecsvc.exe执行

做者的分析工具主要是IDA Pro静态分析和OllyDbg动态调试,你们分析恶意样本必定在虚拟机中,并作好相关安全保护(如断网、物理隔离、共享协议端口关闭等)。

在这里插入图片描述



2.程序入口Start

经过OD打开样本wcry.exe,发现程序入口地址为0x00409A16,对应start()函数。

在这里插入图片描述

经过一些初始化设置,紧接着会调用WinMain()函数进入主程序。

在这里插入图片描述

主程序调用关系以下图所示,调用地址为0x00409B45。

在这里插入图片描述



3.域名开关WinMain

主程序运行后会先链接域名(KillSwitch)hxxp://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com

  • 若是该域名链接成功,则直接退出且不触发任何恶意行为
  • 若是该域名没法访问,则触发传播勒索行为,执行sub_408090函数

在这里插入图片描述

该代码会调用InternetOpenUrl打开对应的网址,并根据其访问状况执行不一样的操做。若是网址没法访问,会调用sub_408090()函数建立蠕虫服务。这也意味着若是蠕虫做者注册并访问了该URL,WannaCry蠕虫也就中止了传播。目前该域名已被英国的安全公司接管,网上怀疑该操做能有效防止在线沙箱检测。

在这里插入图片描述



4.参数判断sub_408090

接着进入sub_408090函数,经过判断参数个数来执行相应的流程。

  • sub_407F20函数:当参数<2,进入蠕虫安装流程
  • sub_408000函数:当参数≥2,进入蠕虫服务传播流程并建立mssecsvc2.0服务

该函数调用了相关的API函数,好比建立服务(OpenSCManagerA)、打开服务(OpenServiceA)等。当咱们直接运行wcry.exe时,传递的参数是1(程序自己),则进入蠕虫安装程序;当咱们传递参数3(程序自己、二进制程序、服务参数)时,则进入蠕虫服务传播流程。

推荐绿盟API词典:恶意样本分析手册——API函数篇 - 李东宏


在这里插入图片描述

mssecsvc2.0服务对应的数据部分以下图所示,该服务会假装成微软安全中心的服务,服务的二进制文件路径为当前进程文件路径,参数为“-m security”。

在这里插入图片描述


OD动态调试以下图所示,包括调用CALL访问函数,将服务PUSH入栈等。

在这里插入图片描述



5.蠕虫安装流程sub_407F20

蠕虫安装流程主要调用sub_407F20函数,包括sub_407C40和sub_407CE0。

在这里插入图片描述

(1) sub_407C40:建立mssecsvc2.0服务,并启动该服务,参数为”-m security”,蠕虫假装为微软安全中心。

在这里插入图片描述

在这里插入图片描述


(2) sub_407CE0:读取并释放资源tasksche.exe至C:\Windows路径,建立线程运行。
主要调用的函数包括GetProcAddress、MoveFileEx、CreateFile等。

在这里插入图片描述

动态调用过程以下图所示:

在这里插入图片描述

释放的C:\Windows\tasksche.exe效果以下图所示:

在这里插入图片描述



6.蠕虫服务传播流程sub_4080000

当参数≥2时,蠕虫执行服务传播流程,调用sub_4080000实现,其代码以下:

在这里插入图片描述

sub_4080000会打开mssecsvc2.0服务并设置其状态,服务设置函数包括RegisterServerCtrlHandlerA、SetServiceStatus。

在这里插入图片描述

动态分析过程以下图所示:

在这里插入图片描述


核心函数是sub_407BD0,它的功能包括:

  • 初始化操做
  • 局域网传播
  • 公网传播

在这里插入图片描述



7.蠕虫初始化操做sub_407B90

蠕虫初始化操做主要调用sub_407B90函数实现,具体功能包括:

  • WSAStartup:初始化网络
  • sub_407620:初始化密码
  • sub_407A20:获取Payload

在这里插入图片描述


函数WSAStartup主要是进行相应的Socket库绑定。函数原型以下:

  • int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
    使用Socket程序以前必须调用WSAStartup函数,之后应用程序就能够调用所请求的Socket库中的其它Socket函数

  • int WSACleanup (void)
    应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定而且释放Socket库所占用的系统资源

  • gethostbyaddr \ gethostbyname \ gethostname \ getprotolbynumber \ getserverbyname \ getservbyport
    Socket接口的检索有关域名、通讯服务和协议等Internet信息的数据库函数

在这里插入图片描述

继续调用sub_407A20函数从内存中读取MS17-010漏洞利用代码,Payload分为x86和x64两个版本,32位大小为0x4060,64位大小为0xc8a4。

在这里插入图片描述



8.局域网传播sub_407720

蠕虫初始化操做后,会生成两个线程,分别进行局域网和公网传播。

  • result = sub_407B90
  • v1 = (void *)beginthreadex(0, 0, sub_407720, 0, 0, 0)
  • v3 = (void *)beginthreadex(0,0, sub_407840, v2, 0, 0)

局域网传播: 蠕虫根据用户内网IP,生成覆盖整个局域网网段表,而后循环尝试攻击。

在这里插入图片描述


这里存在一个疑问:你怎么能肯定v1是局域网传播,而v3是外网传播呢?
在函数sub_407720中,会继续调用线程执行sub_4076B0函数。同时,函数若是同时调用10个以上IP地址,会执行Sleep暂停100毫秒(1秒=1000毫秒)。

  • 核心函数:sub_4076B0

在这里插入图片描述


函数sub_407720会调用函数sub_409160,接着调用GetAdaptersInfo获取网卡配置和IP地址详细信息,最终进行局域网IP地址拼接和传播。而外网传播的IP地址是经过四个随机数产生的,经过这些差别就能判断是局域网传播仍是外网传播。

在这里插入图片描述


函数sub_4076B0会链接445端口,若是445端口链接成功,接着发起漏洞攻击。若是链接超过10分钟则终止该线程。

在这里插入图片描述


接下来调用sub_407540函数发起漏洞攻击。

  • 核心函数:sub_407540

在这里插入图片描述



9.公网传播sub_407840

公网传播:公网IP地址经过4个随机数拼接而成,而后循环尝试攻击。

在这里插入图片描述


sub_407840函数会生成四个随机数,而后调用aDDDD进行IP拼接,表示成%d.%d.%d.%d。0xFF表示255,对应最大地址,v8余数不等于127内网。接着调用sub_407540函数进行外网传播。

  • in_addr_t inet_addr(const char cp)
    做用:将一个点分十进制的IP转换成一个长整数型数
    参数:字符串,一个点分十进制的IP地址
    返回值:若是正确执行将返回一个无符号长整数型数,若是传入的字符串不是一个合法的IP地址,将返回INADDR_NONE
  • char * inet_ntoa(struct in_addr in)
    做用:将一个十进制网络字节序转换为点分十进制IP格式的字符串
    参数:一个网络上的IP地址
    返回值:若是正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区;若是错误返回NULL

在这里插入图片描述

在sub_407840函数中,继续调用线程执行sub_407540函数,该函数为漏洞利用核心函数。

在这里插入图片描述



10.漏洞检测及建立通讯链接sub_407540

IP地址拼接好后,会建立漏洞利用线程,调用sub_407540函数。

  • 第一步:检测目标是否能够安装双星脉冲DOUBLEPULSAR(端口445)
    若是须要,后续能够分享一篇永恒之蓝和双星脉冲相关知识。

在这里插入图片描述

  • 第二步:利用MS17-010漏洞,尝试创建通讯链接并发送漏洞利用程序数据包
    经过connet创建Socket通讯链接,再调用send和recv进行数据包握手确认。最后会调用核心函数sub_406F50。

在这里插入图片描述



11.发送SMB数据包sub_4072A0

创建通讯链接(connect、send、recv),发送利用Eternalblue的蠕虫SMB数据包。具体流程包括:(还需进一步分析)

  • 创建链接:IP地址、445端口
  • 先发送一个SMB请求
  • 接受正常回复后往SMB作缓冲区溢出
  • 先往SMBv2的缓冲区发数据,而后是往SMBv1发大量数据,最后往SMBv2发数据
  • SMBv1链接关闭后SMBv2附近会产生空洞
  • 造成永恒之蓝攻击后门
  • 最后用双星脉冲来将dll注入有后门主机并运行

在这里插入图片描述



12.获取Payload(dll+shellcode)

样本在利用漏洞MS17-010获取目标主机权限后,并不会直接发送蠕虫自身到目标,而是发送一段通过简单异或加密后的Payload到目标机器中执行。在sub_4077A0函数中,v7是系统标记,当v7等于1时表示32位操做系统,当v7等于0时表示64位操做系统。

  • 核心函数:sub_406F50(发送Payload)

在这里插入图片描述


Payload由shellcode和包含样本自身的dll组成,Payload分为64位与32位,函数sub_406F50以下图所示。

  • 32位shellcode起始地址0x42E758
  • 64位shellcode起始地址0x42FA60

在这里插入图片描述

在这里插入图片描述


dll一样分为64位与32位版本,根据目标主机系统的不一样,读取不一样版本的dll

  • 32位dll起始地址0x40B020,大小为0x4060字节
  • 64位dll起始地址0x40F080,大小为0xc8a4字节

在这里插入图片描述


Shellcode相关信息

  • 32位shellcode起始地址0x42E758,大小为0x1305字节
  • 64位shellcode起始地址0x42FA60,大小为0x1800字节

在这里插入图片描述

在这里插入图片描述



13.提取shellcode

对应的反汇编代码以下,包括x64_payload_addr、x86_payload_addr。

在这里插入图片描述

32位Shellcode获取:0x42E758~0x42FA5D。

在这里插入图片描述

64位Shellcode提取:0x42FA60~0x43125F。

在这里插入图片描述



14.shellcode分析之安装后门

Shellcode反汇编及功能分析以下:

  • 第一部分:安装后门
  • 第二部分:利用安装的后门,APC向应用程序注入dll
    ① 查找基地址
    ② 获取Hash计算方法
    ③ 根据基地址、函数hash字符查找导出函数地址
    ④ 查找须要用到导出函数地址并保存导出函数hash对照表
    ⑤ 查找目标进程,经过hash编码782BF0E7h进程名查找(lsass.exe)
    ⑥ 使用查到导出函数的地址,并进行APC注入
    ⑦ 最后将shellcode自身以及其所分配的内存清0

shellcode部分做者还须要进一步研究,加油~

安装后门主要执行sub_401370函数,在远程电脑上安装双星脉冲DOUBLEPULSAR后门。

在这里插入图片描述

在这里插入图片描述



15.shellcode分析之APC注入

参考两篇文章:
[原创]WannaCry勒索软件中“永恒之蓝”漏洞利用分析 - 展博
[原创]经过Wannacry分析内核shellcode注入dll技术 - dragonwang

shellcode第二部分是利用安装的后门,APC向应用程序注入dll。

(1) 查找ntoskrnl.exe基地址
首先找到gs[38]处的_KIDTENTRY64指针,在KIDTENTRY64的偏移4,获得中断处理的函数指针,这个地址在ntoskrnl.exe中,咱们就找到了ntoskrnl.exe的地址空间,而后去地址空间的页头地址对比PE头MZ,找到则函数返回。

在这里插入图片描述

在这里插入图片描述


(2) 获取Hash计算方法
须要使用的函数并无硬编码写到程序里,而是硬编码了这些函数的hash值。因此咱们须要首先知道函数编码和hash值得对应关系。Hash计算方法以下,用c++代码注释了一下。

在这里插入图片描述

在这里插入图片描述


(3) 根据ntoskrnl.exe基地址、函数hash字符查找导出函数地址

在这里插入图片描述

find_func函数以下,有了ntoskrnl.exe全部导出函数hash对照表,整个程序流程就明朗了。

在这里插入图片描述


(4) 查找须要用到ntoskrnl.exe导出函数地址并保存备用

在这里插入图片描述


(5) 查找目标进程,经过hash编码782BF0E7h进程名查找(lsass.exe)
查找目标进程,经过hash编码782BF0E7h进程名查找,直接没找到“lsass.exe”,查找方法是使用pid暴力查找。具体经过pid调用PsLookupProcessByProcessId获得pEProcess结构指针,再经过pEProcess调用PsGetProcessImageFileName获得进程名。

在这里插入图片描述

在这里插入图片描述


(6) 使用查到导出函数的地址,并进行APC注入
APC注入,使用查到导出函数的地址,注释见截图。第六个参数包含了第三层shellcode和dll代码,可自行dump出研究,第七个参数指定为usermode。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


(7) 最后将shellcode自身以及其所分配的内存清0

在这里插入图片描述

在这里插入图片描述

内核部分的注入代码主要流程就分析完了,到用户层的shellcode本身实现的一个pe loader而没有使用LoadLibary,这样使得注入更加隐蔽,查询PEB_LDR_DATA的也查不到被注入了dll。



16.dll导出及分析

shellcode使用APC注入将生成的dll注入到系统进程lsass.exe,导出的dll文件以下图所示:

在这里插入图片描述

火绒剑检测结果以下,经过APC注入将生成的dll注入到系统进程lsass.exe,接着释放资源mssecsvc.exe,最后释放勒索程序tasksche.exe。

在这里插入图片描述



17.释放资源tasksche.exe

dll具备一个导出函数PlayGame,它会将母体程序释放到被攻击的计算机,保存为C:\WINDOWS\mssecsvc.exe并执行。下面是做者分析导出的dll静态代码,主函数PlayGame。

在这里插入图片描述

PlayGame包括两个核心函数:sub_180001014和sub_1800010F8。

  • sub_180001014:释放资源
  • sub_1800010F8:运行文件

在这里插入图片描述

在这里插入图片描述

最后释放资源tasksche.exe(勒索加密程序)到C:\WINDOWS目录下,并将其启动。

在这里插入图片描述

被攻击的计算机包含蠕虫的完整功能,除了会被勒索,还会继续使用MS17-010漏洞进行传播,这种传播呈几何级向外扩张,也是该蠕虫短期内大规模爆发的主要缘由。

在这里插入图片描述



18.勒索行为

勒索行为下一篇文章将详细介绍

运行病毒程序后的界面以下图所示,已经成功被勒索。再次强调,全部代码必须在虚拟机中执行,而且关闭文件共享。

在这里插入图片描述

样本的解压密码是WNcry@2ol7,经过资源工具也能够查看到。解压后的文件结构以下:

在这里插入图片描述

msg文件夹下就是全部的语言包。

在这里插入图片描述

其余文件内容以下,下一篇文章会详细介绍勒索原理。

  • b.wnry: 中招敲诈者后桌面壁纸
  • c.wnry: 配置文件,包含洋葱域名、比特币地址、tor下载地址等
  • f.wnry: 可免支付解密的文件列表
  • r.wnry: 提示文件,包含中招提示信息
  • s.wnry: zip文件,包含Tor客户端
  • t.wnry: 测试文件
  • u.wnry: 解密程序

在这里插入图片描述



三.总结

写到这里,这篇文章就介绍完毕。主要讲解了WannaCry蠕虫的传播机制,也是做者一个月的研究成果,感受是全网WannaCry蠕虫传播部分最详细的一篇文章了。最后,感受本身真的好菜,但也须要加油,但愿您喜欢这篇文章~

  1. WannaCry蠕虫传播流程
  2. 程序入口Start
  3. 域名开关WinMain
  4. 参数判断sub_408090
  5. 蠕虫安装流程sub_407F20
  6. 蠕虫服务传播流程sub_4080000
  7. 蠕虫初始化操做sub_407B90
  8. 局域网传播sub_407720
  9. 公网传播sub_407840
  10. 漏洞检测及建立通讯链接sub_407540
  11. 发送SMB数据包sub_4072A0
  12. 获取Payload(dll+shellcode)
  13. 提取shellcode
  14. shellcode分析之安装后门
  15. shellcode分析之APC注入
  16. dll导出及分析
  17. 释放资源tasksche.exe
  18. 勒索行为

做者分享github资料:https://github.com/eastmountyxz/WannaCry-Experiment

这篇文章中若是存在一些不足,还请海涵。做者做为网络安全初学者的慢慢成长路吧!但愿将来能更透彻撰写相关文章。同时很是感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知本身很菜,得努力前行。

欢迎你们讨论,是否以为这系列文章帮助到您!任何建议均可以评论告知读者,共勉。

(By:Eastmount 2020-05-05 中午12点写于贵阳 http://blog.csdn.net/eastmount/ )



参考文献
为了更好帮助读者,做者将参考文献提早。下面给出下各大安全厂商及安全大佬对WannaCry蠕虫分析的文章,强烈推荐你们阅读,做者也吸收了它们的精华,在此感谢。