打造定制化的Metasploit—邮服用户枚举

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

——AnonySec

https://payloads.cn

前言

本文开始学习Metasploit Web类模块开发,从HTTPClient类的了解,到Http数据包的Get与Post请求发送,从而实现模拟发包,最终到实现某邮服接口枚举用户的功能模块。

HTTPClient

HttpClient mixin是发送基本HTTP请求的模块。

Get

首先copy下官方的例子,进行发送get请求。

1
def run
2
    uri = target_uri.path
3
4
    res = send_request_cgi({
5
        'method'   => 'GET',
6
        'uri'      => normalize_uri(uri, 'admin', 'index.php'),
7
        'vars_get' => {
8
            'p1' => "This is param 1",
9
            'p2' => "This is param 2"
10
        }
11
    })
12
13
    if res && res.code == 200
14
        print_good("I got a 200, awesome")
15
    else
16
        print_error("No 200, feeling blue")
17
    end
18
end

在发包过程中,可以结合抓包,查看实际发送的Http数据包,也可以直接将RequestResponse输出查看。

1
print_good ("Request: \n#{res.request.to_s}")
2
print_good ("Response: \n#{res.to_s} \n")

458f79999f87ade732d24adf53f9b8b4

完整的RequestResponseHttp数据包请求。

3e45864171a4fac55850e781894af9c4

Post

Post请求只需要将'method'=>'POST',并加上post_data

1
post_data = ("username=admin")
2
res = send_request_cgi({
3
  'method'   => 'POST',
4
  'uri'      => normalize_uri(uri, '/index.html'),
5
  'ctype'    => 'text/x-json',
6
  'data'     => post_data
7
})

eec9e637834c522bdf00dfcf55d25d84

至此,通过HttpClient mixin,已经实现了Http数据包的Get与Post请求发送。


Module

某邮服,可通过用户接口,枚举存在的用户名。
接下来要将该利用方式转化为Metasploit的扫描模块。

c5f3df33a2484b8d5e4cd33d1209607f

字典读取

首先要探测用户接口是否存在,之后才能继续下面操作。
打开用户名字典,进行读取。

1
if res.code.to_s == '200'
2
    print_status("Exist username interface, start enumerating ...")
3
    # 数组:用户名行分割
4
    queue = []
5
    File.open(datastore['USER_FILE']).each_line do |users|
6
      queue << users.strip
7
    end
8
    print_status ("#{queue}")
9
    while(not queue.empty?)
10
      # 删除并获取数组第一个元素
11
      user = queue.shift
12
      print_status ("#{user}")
13
    end
14
  else
15
    print_error("Exist not username interface")
16
end

5beb24b94ec0e78d9c7d2c65e3345916

数据处理

因请求数据是json格式,所以post_data需要进行转换。

1
data = {"email":"#{user}"}
2
print_status ("#{data}")
3
# 转换json
4
post_data = data.to_json
5
print_status ("json: #{post_data}")

转换前后对比:

04832436d916486b8b5f1a8e889fbfd6

Response返回包是xml格式,所以要进行xml解析。
这样,就通过Metasploit实现了该利用模块的Http数据包的发送与接收。

1
# 解析xml
2
xml = res.get_xml_document
3
print_good ("Response_xml\n#{xml}")

56739b0c6c78048edee7a040b287271f

最后将Response_xml中的数据进行处理,并把存在的用户名写入txt文本中。

1
# 输出文件格式
2
outfile = store_loot(
3
    "MailUser",
4
    "text/plain",
5
    rhost,
6
    "")
7
    
8
# at查找string元素
9
string = xml.at('string')
10
# text方法也可以被用作去除所有HTML标签
11
text = string.text
12
# print_status ("#{text}")
13
if not text.empty?
14
  print_good ("#{user} : #{text}")
15
  # 存在用户写入文件
16
  output = file_local_write( outfile ,"#{user} : #{text}")
17
end
18
print_status ("OutFile: #{outfile}")

f25fba50292524c0ffb39a4bbdcd9839

完整模块运行Demo:

47840989779f7c20a84e9f878ea41149

References


xq