Code: Exemplo simples de portscanner em php

2 02 2007

Exemplo simples, pra começar, de como se criar um portscanner utilizando php.

<?php

    // Define as portas que serao verificadas durante o scan.
    // Nenhuma verificacao sobre a validade da porta sera feita,
    // entao utilize apenas portas validas, ou seja, numeros entre
    // 1 e 65535
    $ports = array ( 21, 22, 23, 80 );

    // Endereco ip inicial e final
    // Novamente, nenhume verificacao sera feita, entao utilize um
    // endereco ip valido, sendo o ipInicial menor que o ipFinal
    $ipInicial = '10.0.0.1';
    $ipFinal   = '10.0.0.254';

    // Para facilitar a execucao, transformamos o endereco ip no formato
    // padrao para um formato indicando o mesmo endereco em um numero inteiro.
    // Por exemplo, o endereco 10.0.0.1 sera transformado em 167772161 e o
    // endereco 10.0.0.254 sera transformado em 167772414 (ou seja,
    // 167772161+253)
    //
    // Tendo o ip inicial e o ip final em um numero inteiro, fica mais simples
    // executar um loop que comece no ip inicial e termine no ip final
    $ipInicialL = intval(ip2long($ipInicial));
    $ipFinalL   = intval(ip2long($ipFinal));

    $ips = array();

    // Aqui iniciamos o loop. Enquanto o ipInicial for menor que o
    // ipFinal, o loop continuara. Internamente no loop, a funcao long2ip
    // ira efetuar o oposto do que foi feito acima, em ip2long, ou seja
    // o numero inteiro sera transformado em um endereco ipv4 padrao.
    //
    // Funcionara assim: No inicio do loop, $cont valera 167772414. A funcao
    // ip2long ira transforma este numero no endereco ipv4 equivalente, que
    // e' 10.0.0.1 . Apos isso sera adicionado 1 ao $cont, que valera
    // 167772415, o equivalente a 10.0.0.2 . E assim vai, ate que o loop
    // chegara no valor final, que seria 167772414, ou seja, 10.0.0.254 .
    // Desta forma temos uma lista com todos os enderecos ips que serao
    // verificados
    for ( $cont = $ipInicialL; $cont < $ipFinalL; $cont++ )
        $ips[] = long2ip($cont);

    // Apenas para "nao ficar na cara" que um scan esta sendo executado em
    // rede, a ordem com que as portas serao verificadas e a ordem com que os
    // ips serao verificados e' pseudo-randomizada. A funcao shuffle serve
    // apenas para isso, randomizar um array
    shuffle ($ips);
    shuffle ($ports);

    // Aqui abrimos um file descriptor para o arquivo que contera o resultado
    // da verificacao.
    $fd = fopen ( 'result.txt', 'w+' );

    $cont = 1;             // variavel auxiliar
    $total = sizeof($ips); // aqui verificamos quantos ips serao analisados

    // foreach ira passar por todos os itens no array $ips
    foreach ( $ips as $ip ) {
        // exibimos a contagem atual do ip que esta sendo verificado, juntamente
        // com o total de ips e o endereco ip atual
        echo sprintf('(%s/%s)%s...%s', $cont, $total, $ip, "n");

        // Para cada um dos ips que sera verificado, verifica-se cada uma
        // das portas definidas em $ports, no comeco do script
        foreach ( $ports as $port ) {
            // Aqui e' efetuada a conexao em $ip, utilizando a porta
            // $port. O numero 0.2 indica o tempo maximo de espera na conexao
            // antes de indicar, por conta de um timeout, que a porta esta fechada.
            // Este numero pode ser aumentado caso a verificacao nao esteja ocorrendo
            // em rede local
            $a = @fsockopen ( $ip, $port, $es, $en, 0.2 );

            // verifica-se se a conexao foi bem sucessida. Caso positivo,
            // executa proximas acoes. Caso negativo, retorna para o foreach e verifica
            // a proxima porta. Caso seja a ultima porta, retorna para o primeiro
            // foreach e utiliza-se um outro endereco ip. Caso seja o ultimo endereco ip,
            // a execucao do script e' finalizada
            if ( $a ) {
                // formata e exibe o endereco ip e a porta que foi encontrada aberta
                $msg = sprintf('%s %s%s', $ip, $port, "n");
                echo sprintf('[open] %s%s', $msg, "n");

                // escreve para o arquivo a mensagem formatada
                fwrite ( $fd, $msg, strlen($msg) );

                // finaliza a conexao efetuada anteriormente
                fclose($a);
            }
        }
        // incremeta o contador que esta sendo utilizado para exibir o host
        // atual sendo verificado
        $cont++;
    }
    // Por ultimo, fecha o arquivo com o resultado da verificacao
    fclose($fd);
Anúncios

Ações

Information

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: