PDA

Просмотр полной версии : Сканер портов на Php


Utochka
10.03.2006, 16:50
Иногда любому хакеру бывает просто необходимо просканировать порты удаленного сервера на наличие уязвимых сервисов и просто их доступности. Для этого используются специальные программы под винду или известный никсовый сканер Nmap, но не всегда есть shell для установки Nmap, а если сканить прогами под винду, то светишь свой IP. Но есть простой выход это написание скрипта на PHP! Сейчас мы рассмотрим написание довольно простого сканера портов на PHP. Итак приступим.

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


<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

// 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 ($time, 3);

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

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]

TTyck
10.03.2006, 17:07
не плохо =-) +1

nerezus
10.03.2006, 17:39
потоков нет =\

D1mOn
10.03.2006, 17:42
nerezus, а ты же как то на перле выкладывал)))

nerezus
10.03.2006, 18:11
nerezus, а ты же как то на перле выкладывал))) все ошибаются )

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

D1mOn
10.03.2006, 18:26
сорри если ошибся, но помню кто то выкладывал))
а многопоточный конечно напиши)))

KEZ
10.03.2006, 20:02
Очень тормозной способ - сканировать порты штатными средствами Winsock - tcp connect(), и т д

FIND ME
13.03.2006, 02:23
a mozno ego peredelat pod scaner proxi ?
zadavat 1 port pod mnogo hostov ?

donetsk
15.03.2006, 00:02
Сори за вопрос возможно тупой!
Но зачем пользоваться сканером н пхп, когда есть пауки, нмэпы, что в них плохого?

Nova
15.03.2006, 13:56
Сори за вопрос возможно тупой!
Но зачем пользоваться сканером н пхп, когда есть пауки, нмэпы, что в них плохого?
Обьясню попроще как для чайников....
Когда ты бедеш со своей тачки сканить Xspiderom чела у которого стоит фаервол то фаер покажет твой Ip к примеру а сканер на php это анонимность по тому что он покажет Ip хоста или сервера на котором лежит данный php скрипт и всё....

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

donetsk
15.03.2006, 16:05
Nova
Ну а прокси в пауке придумали для кого?
nmap помоему является пасивным сканером!хотя всё равно его лицезреть можно!

Nova
15.03.2006, 16:12
Nova
Ну а прокси в пауке придумали для кого?
nmap помоему является пасивным сканером!хотя всё равно его лицезреть можно!
Ну я вобщето образно сказал... и всё равно сканировать на php являеться более безопасным способом хотя хз

w4rd3n
15.03.2006, 17:30
Обьясню попроще как для чайников....Когда ты бедеш со своей тачки сканить Xspiderom чела у которого стоит фаервол то фаер покажет твой Ip к примеру а сканер на php это анонимность по тому что он покажет Ip хоста или сервера на котором лежит данный php скрипт и всё....
Поправьте меня если я ошибся немного....

А как же nmap нах что то придумывать если уже есть....?
Заходи по shh чеоез прокси да скань...
Тут и инфы больше получишь и безопасность на высоте...

donetsk
15.03.2006, 17:53
а если nmap закинуть юзеру бедному, заходить по ssh через прокси или цепочку соксов реально ли так? тогда безопастность вообще на высоте!
Только вопрос реально ли это?Ниразу не пробовал!
Сори за отклонение от темы!

fucker"ok
15.03.2006, 20:39
Nerezus: А разве в php можно делать fork? :?]

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

Developer
04.05.2006, 17:35
Интерестная статья. В код сильно не внимал, тут как обычно сокеты. В общем один совет - вместо split юзай explode, т.к. она быстрее - да это и очевидно, ведь split поддерживает регулярные выражения POSIX.

nerezus
04.05.2006, 18:17
Nerezus: А разве в php можно делать fork? :?] да, но многопоточность через сабж имхо глупо делать.

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

k1b0rg
04.05.2006, 18:42
pcntl рулит, для многопоточности php

nerezus
04.05.2006, 19:04
pcntl рулит, для многопоточности php а синхронизацию потоков как сделать?
блокираторы и т.д.

k1b0rg
04.05.2006, 19:45
http://php.rinet.ru/manual/en/ref.pcntl.php

хреново что под винду не пашет

kubik
10.11.2006, 12:27
хороший скриптик :)

Zadoxlik
10.11.2006, 16:58
portscan.php.txt (http://zadoxlik.info/portscan.php.txt)

Вот этот по-быстрее будет =)

Zadoxlik
10.11.2006, 17:10
Очень тормозной способ - сканировать порты штатными средствами Winsock - tcp connect(), и т д
По-умному сканить порты можно только с правами администратора =)

Morph
10.11.2006, 18:43
Если в позновательных целях то так можно глянуть, но чтобы именно этим сканить это жесть, на то софт другой есть.

cRiLaZ
10.11.2006, 20:09
А по моему вполне норм способ для скана. тЫ же не дыры ищеш как спайдером, а порты открытые......

Ch3ck
10.11.2006, 20:43
А по моему вполне норм способ для скана. тЫ же не дыры ищеш как спайдером, а порты открытые......
Да-да... особенно, когда файер режет всё и вся... да и не только...

cRiLaZ
10.11.2006, 23:28
Ну уж извиняйте-с, это пхп в сто строк......

FaLL3N
25.05.2007, 11:03
Никто так и не написал многопоточного сканера ?

ant0ha
26.05.2007, 17:52
На пхп имхо, если это и возможно то нет смысла писать многопоточный сканер, скорости все равно не те будут

Sharky
17.07.2007, 19:42
дураку понятно что скорости не те...но как пример я считаю многопоточный сканер многим бы пригодился...может кто возьмётся написать?

Ch3ck
17.07.2007, 19:53
я считаю многопоточный сканер многим бы пригодился...может кто возьмётся написать?
Я считаю Php тоже бы не помешала многопоточность. Может придумаешь?

Sharky
17.07.2007, 19:59
ну синхронизация...чтоб работал быстрее

xena-mil1
02.09.2007, 23:58
это мой сканер портов
написал его для своего веб шела
вот кусок


<h1>Portscan</h1>

<body bgcolor=#FFCCDD>

<form method=post action=<?=$PHP_SELF?> >
IPz<input type=text name=ip value="<?=$ip?>">

portz<input type=text name=port value="<?=$port?>">
Resolve only<input type=checkbox name=resolv value="yes" <?if (isset($resolv)) echo ("checked");?> >
Show only opened<input type=checkbox name=opened value="yes" <?if(isset($opened)) echo ("checked");?> >
timeoutz<input type=text name=timeout size=2 value=<?=$timeout?>>

*<input type=submit value=Scan>
<br>standart ports: 21,22,23,25,80,110,111,119,135,139,443,445,1080,31 28,4899,5000,6000,8000,8080


</form>
<hr>
<?
if (!isset($timeout))$timeout=2;
if (isset($ip))
{
echo "\n<br>Starting scan againt ips:ports $ip:$port with timeout $timeout sec <br>";
$mt1=time()+microtime();
if (strpos($ip,"*")!=0){
for ($i=0;$i<254;$i++)
{
$iplist[$i]=str_replace("*", $i+1, "$ip");}
} else
{
$iplist=split(",",$ip);};
$portlist=split(",",$port);
for ($i=0;$i<count($iplist);$i++)
{

if (isset($resolv))
echo("\n<br>$iplist[$i] ".gethostbyaddr($iplist[$i]));
else
for ($j=0;$j<count($portlist);$j++) {

$fp = fsockopen($iplist[$i], $portlist[$j], &$errno, &$errstr, $timeout);
if(!$fp) {
if (!isset($opened)) echo ("\n<br>$iplist[$i]:$portlist[$j] closed. Reason: $errstr ($errno)");
}
else
{
if (!isset($opened))
echo("\n<br>$iplist[$i]:$portlist[$j] <b>opened</b> ");
else
echo("<br>$iplist[$i]:$portlist[$j]");
};

@fclose($fp);
};
};
$mt2=time()+microtime();
echo "<br><hr><br>Scan complete in ".($mt2-$mt1)." seconds<br>";
}
?>