这可能是一个重复的帖子,但我没有看到任何正确解决此问题的答案。
我试图找到一个可以正确确定TCP或UDP端口状态的php脚本。
我已经尝试了几个我在网上找到的并且他们都返回了错误的结果。 EG:在我的本地网络上,我有端口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/
感激不尽的任何帮助。感谢
答案 0 :(得分:1)
最好的解决方案是在PHP中为nmap
编写一个包装器 - 严重的是,你不能重新编码比nmap更好的portscan。
如果你真的想这样做,你不应该只是打开TCP端口并检查它是否连接,你应该从较低级别的套接字,原始套接字开始。
$mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
这使您可以调查SYN
,ACK
握手标记并进行隐身或简单快速扫描。
您可以并行创建(非阻塞)套接字并使用socket_select();
检查其缓冲区/连接,这是处理PHP中多个套接字的最快且最可靠的方法。我可能会使用分叉或线程或调度部分代码来在单端口扫描的同时运行完整的端口扫描。
您要使用的其他功能包括socket_set_timeout()
和socket_set_blocking()
。
shell_exec not working with nmap command
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/
答案 1 :(得分:0)
而不是
if(fsockopen($host, $sport, $errorno, $errorstr, 0.1))
尝试
$connection = @fsockopen($host, $sport);
if (is_resource($connection)){
// OK
}
答案 2 :(得分:0)
我在共享主机帐户上尝试了相同的操作,但它无效。我能够安装端口扫描所需的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;
}