Авторские статьи Сканер портов на Php

Discussion in 'Статьи' started by Utochka, 10 Mar 2006.

  1. Utochka

    Utochka Elder - Старейшина

    Joined:
    21 Dec 2005
    Messages:
    495
    Likes Received:
    106
    Reputations:
    54
    Иногда любому хакеру бывает просто необходимо просканировать порты удаленного сервера на наличие уязвимых сервисов и просто их доступности. Для этого используются специальные программы под винду или известный никсовый сканер Nmap, но не всегда есть shell для установки Nmap, а если сканить прогами под винду, то светишь свой IP. Но есть простой выход это написание скрипта на PHP! Сейчас мы рассмотрим написание довольно простого сканера портов на PHP. Итак приступим.

    Для начала необходимо создать некое подобие интерфейса для удобства использования сканера. Страницу с интерфейсом назовем к примеру scan.html ну или как вам будет угодно. Я не буду описывать процесс создания интерфейса, думаю все разбираются в html и с легкостью напишут нужный им интерфейс.

    Code:
    <form action="portscan.php" method="post" target="view">
      <table align="center" cellpadding="0" cellspacing="0" style="border: #cccccc 1px solid" width="55%">
        <tr> 
          <td align="center" style="background-color: #cccccc; font-family: Verdana; font-size: 8pt; font-weight: bold; height: 20px">
            ПАРАМЕТРЫ СКАНИРОВАНИЯ
          </td>
        </tr>
        <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>
    
        <tr> 
          <td align="left" style="color: #aaaaaa; font-family: Verdana; font-size: 8pt; ">
          <table cellpadding="0" cellspacing="0" width="100%">
            <tr>
              <td style="font-size: 8pt; height: 27">
                &nbsp; Host:&nbsp;<input name="host" style="width: 90%" value="">
              </td>
              <td rowspan="10" style="background-color: #cccccc" width="1"><spacer type="block" width="1"></td>
              <td width="120" rowspan="10">
                <center><input style="border: 1px #cccccc solid;" type="submit" value="Start!"></center>
              </td>
            </tr>
            <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>      
            <tr>
              <td style="font-size: 8pt; height: 27">
                &nbsp; Сканировать порты, номера от
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input maxlength="6" name="from" size="6" value="20">&nbsp; до
                &nbsp;&nbsp;<input maxlength="6" name="to"   size="6" value="50">
              </td>
            </tr>
            <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>      
            <tr>
              <td style="font-size: 8pt; height: 27">
                &nbsp; Время подключения к порту не более (сек.):
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input maxlength="2" name="timeout" size="2" value="2"> 
              </td>  
           </tr>
          </table>
          </td>
        </tr>
        <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>
    
    
        <tr> 
          <td align="center" style="background-color: #cccccc; font-family: Verdana; font-size: 8pt; font-weight: bold; height: 20px">
            ПРОТОКОЛ СКАНИРОВАНИЯ
          </td>
        </tr>
        <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>
    
        <tr> 
          <td>
            <iframe border="0" frameborder="no" height="180" marginwidth="0" marginheight="0" name="view" scrolling="auto" src="about:blank" width="100%">
              Ваш браузер не поддерживает плавающие фреймы...
            </iframe>
          </td>
        </tr>
        <tr><td style="background-color: #cccccc; height: 1px"><spacer height="1" type="block"></td></tr>
    
        <tr> 
          <td align="center" style="background-color: #efefef; font-family: Verdana; font-size: 8pt; font-weight: bold; height: 20px">
            <a href="http://Xzone.org.ru"><font color=#FF5500>By Neo aka NeX [Antichat.ru]</font></a>
          </td>
        </tr>
      </table>
      </form>
    
    Вот мы и написали наш интерфейс теперь нам надо написать сам скрипт, который и будет сканировать порты. Я тоже не стану расписывать ход написания скрипта, чтобы не раздувать статью и это незачем т.к. весь скрипт снабжен подробными комментариями, так что я думаю каждый при желании растереться. Назовем наш скрипт portscan.php

    А вот его код:

    PHP:
    <?php

    // PortScan by Neo aka NeX [antichat.ru]

    // Снятие ограничения на время выполнения скрипта

       
    @set_time_limit (0);

    // Определение POST-переменных формы

       
    $host      $HTTP_POST_VARS ["host"];
       
    $to_port   $HTTP_POST_VARS ["to"];
       
    $from_port $HTTP_POST_VARS ["from"];
       
    $time_conn $HTTP_POST_VARS ["timeout"];

    // Время начала выполнения опроса портов

       
    $tm = @split (" ", @microtime());
       
    $started $tm [0] + $tm [1];

    // База данных служб и соответствующих им портов (стандарт) возможно дополнение

       
    $port_database = array (
         
    "21"   => "FTP",
         
    "22"   => "SSH",
         
    "23"   => "TELNET",
         
    "25"   => "SMTP",
         
    "38"   => "RAP",
         
    "43"   => "WHOIS",
         
    "80"   => "HTTP",
         
    "109"  => "POP",
         
    "110"  => "POP3",
         
    "115"  => "Simple FTP",
         
    "118"  => "SQL Services",
         
    "119"  => "NNTP",
         
    "143"  => "IMAP",
         
    "194"  => "IRC",
         
    "220"  => "IMAP3",
         
    "443"  => "HTTPS / SLL",
         
    "540"  => "UUCP",
         
    "585"  => "IMAP4-SSL",
         
    "591"  => "HTTP-ALT",
         
    "1112" => "mSQL — Mini-SQL Server",
         
    "1433" => "msSQL-Server",
         
    "1434" => "msSQL-Monitor",
         
    "3128" => "Proxy",
         
    "3197" => "Proxy",
         
    "3306" => "MySQL",
         
    "4000" => "ICQ",
         
    "4333" => "MSQL - Mini SQL Server",
         
    "5100" => "ICQ",
         
    "5432" => "Postgres SQL",
         
    "6669" => "IRC",
         
    "8000" => "Stream Audio",
         
    "8080" => "HTTP",
         
    "9014" => "VOC Daemon",
         
    "9200" => "WAP"
       
    );

    // Создание массива для хранения номеров существующих портов

       
    $success_port = array ();

    // Вывод информации для опознавания браузером

       
    for ($i 0$i 100$i++) echo "<!---->";
       
    flush ();

    // Скидываем счетчики

       
    $opened 0;
       
    $closed 0;

    // Сканирование порта

       
    $total $to_port $from_port 1;

       for (
    $port $from_port$port <= $to_port$port++) {
         
    $connect = @fsockopen ($host$port$errno$errstr$time_conn);

         echo 
    "<li> Подключение к <b><i>$host</i></b>, порт <b><i>$port</i></b>... ";

         if (
    $connect == TRUE) {
           
    $service "";

           foreach (
    $port_database as $wp => $wd) {
             if (
    $wp == $port) {
               
    $service "предположительно "$wd;
               break;
             }

             else if (
    $wp != $port) {
               continue;
             }
           }

           
    $opened++;

           if (@empty (
    $service) == 1$service "тип не определен";
           echo 
    "<font color='#008800'>порт открыт, $service</font>";
         }

         else if (
    $connect == 0) {
           
    $closed++;
           echo 
    "<font color='#FF5500'><b>[порт закрыт]</b></font>";
         }

         echo 
    "<br>\n";
         @
    flush ();
       }

    // Время начала выполнения опроса портов

       
    $tm    = @split (" ", @microtime());
       
    $ended $tm [0] + $tm [1];

       
    $time  $ended $started;
       
    $dtime = @round ($time3);

    // Вывод небольшой статистики

       
    echo "<hr><tt>\n";
       echo 
    "Всего портов проверено: <b>" $total "</b><br>\n";
       echo 
    "Открытых портов: <b>" $opened "</b><br>\n";
       echo 
    "Закрытых портов: <b>" $closed "</b><br>\n";
       echo 
    "Время, затраченное на сканирование: <b>" $dtime " сек.</b>\n";
       echo 
    "</tt>\n";

    ?>
    Я думаю с кодом все понятно, остается сказать лишь то, что теперь мы имеем полноценный сканер портов и он полностью готов к использованию в наших корыстных целях. Заливаем скрипт, на какой ни будь shell, думаю их у вас предостаточно, и используем по назначению. Свой IP мы скрыли и цель выполнили )).

    С вами был NeX aka Neo [Xzone.org.ru].
    Specially for [Antichat.ru]
     
    8 people like this.
  2. TTyck

    TTyck Elder - Старейшина

    Joined:
    12 Nov 2005
    Messages:
    91
    Likes Received:
    41
    Reputations:
    11
    не плохо =-) +1
     
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    потоков нет =\
     
    1 person likes this.
  4. D1mOn

    D1mOn Elder - Старейшина

    Joined:
    2 Oct 2005
    Messages:
    380
    Likes Received:
    144
    Reputations:
    29
    nerezus, а ты же как то на перле выкладывал)))
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    все ошибаются )

    многопоточный написать? )
     
  6. D1mOn

    D1mOn Elder - Старейшина

    Joined:
    2 Oct 2005
    Messages:
    380
    Likes Received:
    144
    Reputations:
    29
    сорри если ошибся, но помню кто то выкладывал))
    а многопоточный конечно напиши)))
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Очень тормозной способ - сканировать порты штатными средствами Winsock - tcp connect(), и т д
     
  8. FIND ME

    FIND ME New Member

    Joined:
    15 May 2005
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    a mozno ego peredelat pod scaner proxi ?
    zadavat 1 port pod mnogo hostov ?
     
  9. donetsk

    donetsk Elder - Старейшина

    Joined:
    30 Jan 2006
    Messages:
    158
    Likes Received:
    14
    Reputations:
    2
    Сори за вопрос возможно тупой!
    Но зачем пользоваться сканером н пхп, когда есть пауки, нмэпы, что в них плохого?
     
  10. Nova

    Nova Green member

    Joined:
    15 Jul 2005
    Messages:
    1,233
    Likes Received:
    420
    Reputations:
    280
    Обьясню попроще как для чайников....
    Когда ты бедеш со своей тачки сканить Xspiderom чела у которого стоит фаервол то фаер покажет твой Ip к примеру а сканер на php это анонимность по тому что он покажет Ip хоста или сервера на котором лежит данный php скрипт и всё....

    Поправьте меня если я ошибся немного....
     
    _________________________
  11. donetsk

    donetsk Elder - Старейшина

    Joined:
    30 Jan 2006
    Messages:
    158
    Likes Received:
    14
    Reputations:
    2
    Nova
    Ну а прокси в пауке придумали для кого?
    nmap помоему является пасивным сканером!хотя всё равно его лицезреть можно!
     
  12. Nova

    Nova Green member

    Joined:
    15 Jul 2005
    Messages:
    1,233
    Likes Received:
    420
    Reputations:
    280
    Ну я вобщето образно сказал... и всё равно сканировать на php являеться более безопасным способом хотя хз
     
    _________________________
  13. w4rd3n

    w4rd3n Banned

    Joined:
    6 Oct 2005
    Messages:
    143
    Likes Received:
    3
    Reputations:
    -4
    А как же nmap нах что то придумывать если уже есть....?
    Заходи по shh чеоез прокси да скань...
    Тут и инфы больше получишь и безопасность на высоте...
     
  14. donetsk

    donetsk Elder - Старейшина

    Joined:
    30 Jan 2006
    Messages:
    158
    Likes Received:
    14
    Reputations:
    2
    а если nmap закинуть юзеру бедному, заходить по ssh через прокси или цепочку соксов реально ли так? тогда безопастность вообще на высоте!
    Только вопрос реально ли это?Ниразу не пробовал!
    Сори за отклонение от темы!
     
  15. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Nerezus: А разве в php можно делать fork? :?]

    А так, реализовать добрый сканер (аля nmap) на php через сокеты просто невозможно (имхо)
     
  16. Developer

    Developer Elder - Старейшина

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Интерестная статья. В код сильно не внимал, тут как обычно сокеты. В общем один совет - вместо split юзай explode, т.к. она быстрее - да это и очевидно, ведь split поддерживает регулярные выражения POSIX.
     
  17. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    да, но многопоточность через сабж имхо глупо делать.

    асинхронные сокеты рулят )
     
  18. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    pcntl рулит, для многопоточности php
     
  19. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    а синхронизацию потоков как сделать?
    блокираторы и т.д.
     
  20. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479