PHP端口扫描


PHP Port Scanning

这可能是一个重复的帖子,但我还没有看到任何正确解决这个问题的答案。

我试图找到一个php脚本,可以正确地确定TCP或UDP端口的状态。

我已经尝试了几个我在网上找到的,他们都返回错误的结果。例如:在我的本地网络上,我有端口5000 UDP;5060 TCP/UDP打开,路由正常。

如果我通过http://www.ipfingerprints.com/portscan.php或GRC Shields Up运行测试,则返回正确的结果,但我尝试过的所有PHP脚本都失败并显示端口关闭。

我正在通过我的托管帐户运行php脚本,并试图扫描和测试我自己的网络。

这是我尝试过的脚本之一:

    <html>
<head>
<?php echo "<title>Port Scanning " . $_GET['host'] . "</title>"; ?>
</head>
<body>
<?php
ini_set('display_errors', 0);
if(isset($_GET['host']) == true) 
    $host = $_GET['host'];
else
{
    echo "You didn't set the host parameter";
    die();
}
if(isset($_GET['sport']) == true) 
    $sport = $_GET['sport'];
else
{
    echo "You didn't set the sport parameter";
    die();
}
if(isset($_GET['eport']) == true) 
    $eport = $_GET['eport'];
else
{
    echo "You didn't set the eport parameter";
    die();
}
if($sport > $eport)
{
    $sport = $eport;
}
$scanned = 0;
$openports = 0;
$maxports = 1;
$totalports = ($eport - $sport) + 1;
$mins = floor(($totalports / 10) / 60);
$secs = ($totalports / 10) - $mins * 60;
echo "<font color='"blue'">Scanning " . $totalports . " ports on " . $host . ", this should take around " . $mins . " minute(s) and " . $secs . " second(s), probably more depending on local website load, hardware, and other factors.<br/><br/></font>";
flush();
do
{
    if($scanned >= $maxports && $maxports != 0)
    {
        echo "<font color='"darkgreen'" size='"4'">Scan limit of " . $maxports . " ports reached, scanning stopped.</font><br/><br/><font color='"darkred'" size='"4'">Scanner written by Samo502</font>";
        flush();
        die();
    }
    if(fsockopen($host, $sport, $errorno, $errorstr, 0.1))
    {
        echo "<font color='"darkgreen'">Port " . $sport . " is open on " . $host . "</font><br/>";
        $openports++;
        flush();
    }
    else
    {
        echo "<font color='"red'">Port " . $sport . " is not open on " . $host . "</font><br/>";
        flush();
    }
    $scanned++;
    $sport++;
} while($sport <= $eport);
echo "<br/><font color='"blue'">Done, " . $openports . " out of " . $totalports . " ports are open.</font><br/><br/><br/><font color='"darkred'" size='"4'">Scanner written by Samo502</font>";
die();
?>
</body>
</html>

有谁知道正确的方法吗?

感谢

* *更新* * 我发现这似乎工作得更好一点,但它仍然没有检测到端口21目前在我的网络上打开。

http://resources.infosecinstitute.com/php-build-your-own-mini-port-scanner-2/

感谢您的帮助。由于

最好的解决方案是用PHP为nmap编写一个包装器-说真的,您不可能重新编写一个比nmap更好的端口扫描。

如果你真的想这样做,你不应该简单地打开TCP端口并检查它是否连接,你应该从较低层次的套接字开始,原始套接字。

$mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

这允许你调查SYN, ACK握手标志和做隐身或简单的更快的扫描。

您可以并行创建(非阻塞)套接字,并使用socket_select();检查它们的缓冲区/连接,这是在PHP中处理多个套接字的最快和最可靠的方法。我可能会使用fork或线程或分派部分代码来运行完整的端口扫描,在同一时间内运行单个端口扫描。

您想使用的其他函数是socket_set_timeout()socket_set_blocking()

shell_exec不能使用nmap命令

https://unix.stackexchange.com/questions/28732/fastest-way-to-port-scan-nmap

http://phpnmap.sourceforge.net/

可能是最好的解决方案,一个PEAR包nmap包装器:http://pear.php.net/package/Net_Nmap/

代替

if(fsockopen($host, $sport, $errorno, $errorstr, 0.1))

$connection = @fsockopen($host, $sport);
if (is_resource($connection)){
  // OK
}

我在我的共享主机帐户上尝试了同样的事情,它没有工作。我能够安装端口扫描所需的PEAR包,它似乎对"yahoo.com"等互联网网站有效。但不是我想要的任何港口。我最后设置了一个单独的虚拟机,其中安装了APACHE和PEAR包,现在代码运行得很好。这里你可以自己试试:

www.admin-toolkit.com/port_scan.html <一口> (死链接)

这里是代码。首先,为$scanhost$port$timeout赋值(以秒为单位),然后:

$status = Net_Portscan::checkPort($scanhost, $port, $timeout);
$servicename = Net_Portscan::getService($port);
if ($status == NET_PORTSCAN_SERVICE_FOUND) {
    if($servicename == null)
        echo $port.": OPEN ".PHP_EOL;
   else
        echo $port." (".$servicename .") : OPEN ".PHP_EOL;
   }
else{
   if($servicename == null)
      echo $port.": CLOSED".PHP_EOL;
   else
      echo $port." (".$servicename ."): CLOSED".PHP_EOL;
}