bloedername
Goto Top

UDP Portscan per PHP

Hallo zusammen,

ich möchte mittels PHP prüfen, ob eine Webcam eingeschaltet ist oder nicht. Um genauer zu sagen muss ich eigentlich nur überprüfen ob ein bestimmter Port offen ist oder halt geschlossen.

Das Problem ist, dass es sich um eine iOS Webcam App handelt, wo man keinerlei Konfiguration vornehmen kann und evtl. das Protokoll von UDP auf TCP angeben kann.

Daher funktionieren die einfachen Portscan-Funktionen von PHP mittels fsockopen etc allesamt leider nicht.

Mittels Apple's Airport Dienstprogramm sowie unter den Porteinstellungen in der Netzwerkumgebung unter Windows XP habe ich zwar unter der Portweiterleitung nur TCP Ports angegeben (bzw. bei XP den Port benannt und nur TCP ausgewählt) aber es scheint sich um einen UDP Port handeln zu müssen. Auch hatte ich schon extra nur nach reinen TCP Ports gesucht und lediglich den Port 80 (http) gefunden, der sich ja leider nicht eignet, da ich plane mehrere Webcams aufzustellen und über die jeweilige DYNDNS:Portangabe zu erreichen. Einzig hier hat die fsockopen-Funktion ein richtiges Ergebnis angezeigt.

Lediglich dort funktionierte die fsockopen-Funktion von PHP aber ist wie gesagt für meine Zwecke ja leider nicht förderlich, zumal den http Port 80 zudem zu belegen, sowieso keine gute Idee sein dürfte, oder täusche ich mich da? Denn normalerweise sind doch die User-Ports von 1024-49151 für solche Anwendungen zu verwenden, wenn ich mich recht entsinne.

Über online Portscanner wie z.B. http://www.mynetworktest.com/ports.php funktioniert ein Scan tadellos, also bei einschalten der App wird auch richtig angezeigt, dass der jeweilige Port offen ist. Da die Dateiendung eine PHP-Datei ist, muss es ja doch irgendwie funktionieren mit PHP.

Für Hilfestellungen wäre ich sehr dankbar.

Mit besten Grüßen

Content-Key: 241900

Url: https://administrator.de/contentid/241900

Printed on: April 20, 2024 at 00:04 o'clock

Member: colinardo
colinardo Jun 26, 2014 updated at 09:12:55 (UTC)
Goto Top
Moin,
Lediglich dort funktionierte die fsockopen-Funktion von PHP aber ist wie gesagt für meine Zwecke ja leider nicht förderlich, zumal den http Port 80 zudem zu belegen, sowieso keine gute Idee sein dürfte, oder täusche ich mich da? Denn normalerweise sind doch die User-Ports von 1024-49151 für solche Anwendungen zu verwenden, wenn ich mich recht entsinne.
Portumleitung ist hier das Stichwort ..., Ansonsten besser ein VPN zu deinem Netz aufbauen, so wirken sich eventuell entdeckte Sicherheitslücken deiner Cams nicht direkt negativ aus. Wenn die Cam nur auf Port 80 reagiert wird sie vermutlich nur darüber angesprochen; das kannst du aber ganz schnell mit Wireshark herausfinden, wie und worüber die CAM kommuniziert!
By the way wenns trotzdem noch benötigt wird, eine funktionierenden PHP UDP Portscanner Klasse findest du hier: https://github.com/jperkins/PHP-Portscanners/blob/master/udpPortScanner. ...

Grüße Uwe
Member: aqui
aqui Jun 26, 2014 at 09:11:17 (UTC)
Goto Top
den Port 80 (http) gefunden, der sich ja leider nicht eignet, da ich plane mehrere Webcams aufzustellen und über die jeweilige DYNDNS:Portangabe zu erreichen
Auch das würde gehen wenn du am Router oder Firewall mit Port Translation arbeitest !
TCP 8081 in --> Lokale IP Kamera 1 TCP 80 out
TCP 8082 in --> Lokale IP Kamera 2 TCP 80 out
TCP 8083 in --> Lokale IP Kamera 3 TCP 80 out
usw.
Hat auch noch den Vorteil das du so wenigstens etwas deine Videodaten verscheierst und mit TCP 80 nicht gleich in den ersten Sekunden jedem Port Scanner in die Hände fällst.
Wenn du mit den Videodaten nicht gerade Oma Grete beim Stricken überwachen willst sondern sensitives Video überträgt kann man dir nur dringenst ans Herz legen den Rat vom Kollegen colinardo zu beachten und ein VPN zu nutzen, was heutzutage mit 3 Mausklicks auf (fast) jedem Router installiert ist.
Dadurch gehst du nicht nur deiner ganzen Port Forwarding oder Translation Frickelei aus dem Weg sondern verschlüsselst auch noch deine Video Daten das das nicht JEDER im Internet das alles mitlesen und ansehen kann !!
Member: bloedername
bloedername Jun 26, 2014 updated at 09:40:03 (UTC)
Goto Top
Hallo Uwe,

vielen Dank für deine Antwort. Auf diese Klasse bin ich auch schon gestoßen und habe aber keinen Erfolg damit.

Das Script scheint nicht zu funktionieren. Hier mal mein Code, wie ich es eingebunden habe:

<?php
error_reporting(E_ALL);
function get_ip() {
	$ip = '';  
	if (isset($_SERVER['HTTP_CLIENT_IP']))  
		$ip = $_SERVER['HTTP_CLIENT_IP'];  
	else if($_SERVER['HTTP_X_FORWARDED_FOR'])  
		$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
	else if($_SERVER['HTTP_X_FORWARDED'])  
		$ip = $_SERVER['HTTP_X_FORWARDED'];  
	else if($_SERVER['HTTP_FORWARDED_FOR'])  
		$ip = $_SERVER['HTTP_FORWARDED_FOR'];  
	else if($_SERVER['HTTP_FORWARDED'])  
		$ip = $_SERVER['HTTP_FORWARDED'];  
	else if($_SERVER['REMOTE_ADDR'])  
		$ip = $_SERVER['REMOTE_ADDR'];  
	else
		$ip = 'UNBEKANNT';  
	return $ip;
}

$rem_ip = get_ip();

$REMOTE_ADDR = $rem_ip;

echo "REMOTE_ADDR: $REMOTE_ADDR";  

include ('../udpPortScanner.inc');  

$udpScanner = new udpPortScanner("$REMOTE_ADDR");  
$openPorts = $udpScanner-> scan();

if (count($openPorts) == 0) {
	echo "no open UDP ports detected.<br/>";  
} else {
	echo "open UDP ports:<br/>";  

	foreach ($openPorts as $portNumber => $service) {
		echo "$portNumber ($service)<br/>";  
	}
}
?>

Die Datei in der Zeile: include ('../udpPortScanner.inc'); enthält den Code gemäß dem Link.

Ich habe auch schon versucht: include ('udpPortScanner.php'); sowie include_once. Die Funktion arbeitet er nicht ab. Er schreibt weder:
echo "no open UDP ports detected.<br/>";  
} else {
	echo "open UDP ports:<br/>";  

was er ja eigentlich müsste.

Besten Dank soweit erstmal
Member: colinardo
colinardo Jun 26, 2014 updated at 09:26:34 (UTC)
Goto Top
finde doch erst mal mit Wireshark raus auf welchen Ports die Cam überhaupt kommuniziert, dann hast du es schwarz auf weiß und musst nicht immer nur mutmaßen ...sondern kannst darauf deinen Test aufbauen.
und zur Funktion: Du solltest beim Aufruf auch die zu scannenden Ports mit übergeben, Standardmäßig sind das die Ports 1-1024.
siehe dazu den Constructor:
function __construct($hostIp, $startPort = 1, $endPort = 1024, $output = 1)

p.s. Code ohne Code-Tags: <code> Quellcode </code> schaue ich mir nicht mehr an ...
Member: bloedername
bloedername Jun 26, 2014 updated at 10:37:19 (UTC)
Goto Top
Hallo,

okay, ich habe jetzt mal Wireshark laufen lassen. Kenne mich damit noch nicht aus. Hier mal ein Auszug:

37442	152.421607000	XX.64.XX.1X6	10.0.1.3	WebSocket	622	WebSocket Binary [FIN] 

37443	152.421623000	10.0.1.3	XX.64.XX.1X6	TCP	66	50634 > 81 [ACK] Seq=476 Ack=16361462 Win=130512 Len=0 TSval=174222904 TSecr=288657516

Wobei die feste IP der Cam die 10.0.1.8 ist und im Monitor gar nicht auftaucht, obwohl sie eingeschaltet ist.

Ich habe von außerhalb des Netzwerks eine externe Anfrage an die Cam starten lassen und dabei folgendes gesehen:

84705	132.484934000	10.0.1.3	XX.64.XX.1X6	TCP	66	56589 > 50634 [ACK] Seq=1 Ack=48310261 Win=8164 Len=0 TSval=177085332 TSecr=291507408
84706	132.523393000	XX.64.XX.1X6	10.0.1.3	TCP	1514	[TCP segment of a reassembled PDU]

Daher schließe ich daraus, dass die IP 10.0.1.3 der bzw. die TimeCapsule ist, die das Portforwarding instruiert.

Beste Grüße
Member: bloedername
bloedername Jun 26, 2014 at 10:34:09 (UTC)
Goto Top
Heißt das im Umkehrschluss, dass die App den TCP Port 56589 benötigt? Ich habe jetzt eine öffentlichePortweiterleitung auf den 50634 eingerichtet bei privatem TCP Port 80.

Was das Thema VPN angeht, kann das Apple Airport Dienstprogramm bzw. die Hardware (Apple Timecapsule) kein VPN. Und einen VPN-Server laufen zu lassen kommt nicht in Frage.

Beste Grüße
Member: colinardo
colinardo Jun 26, 2014 updated at 11:04:37 (UTC)
Goto Top
Um den Traffic der CAM abzufangen musst du entweder am LAN-Port der CAM mit einem HUB den Traffic scannen, oder wenn es eine Wireless-CAM ist, mit einer WLAN Karte im Promiscous-Mode den Traffic aufzeichnen. Alternativ lässt sich das auch mit einem Proxy machen den dein Telefon im LAN nutzt, dann schnorchelt man an diesem den Traffic ab:
http://attentionshard.wordpress.com/2013/06/13/sniffing-ios-and-android ...

Grüße Uwe
Member: bloedername
bloedername Jun 26, 2014 at 11:47:14 (UTC)
Goto Top
Danke für den Hinweis. Ich habe es jetz mal soweit installiert und eingerichtet, werde jedoch trotzdem nicht schlau daraus.

URL	https://XX.64.XX.1X6:50634
Status	Receiving response body...
Notes	SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations
Response Code	-
Protocol	HTTP/1.1
Method	CONNECT
Kept Alive	No
Content-Type	-
Client Address	/127.0.0.1
Remote Address	XX.64.XX.1X6/XX.64.XX.1X6
Member: colinardo
colinardo Jun 26, 2014 updated at 12:13:51 (UTC)
Goto Top
sagt doch eigentlich schon alles ...
Zugriff auf die Webcam via SSL auf Port 50634

also check mit PHP mal diesen Port via TCP (p.s. um welche Kamera sprechen wir hier überhaupt?)
Member: bloedername
bloedername Jun 26, 2014 updated at 12:27:39 (UTC)
Goto Top
Es handelt sich um ein iPad. Die dazugehörige App nennt sich Instant Webcam.

http://instant-webcam.com/

was ich nicht glaube ist, dass es ein ssl-zertifikat braucht, denn wenn ich die URL über den Browser aufrufe, erscheint kein HTTPS in der Adresse. Das verwundert mich. Außerdem ist in unter Notes angegeben, dass SSL nicht aktiviert ist, was mir ebenfalls komisch vorkommt. Ich habe zwar SSL auf dem iPad für Charles installiert und unter den Proxyeinstellungen die DNS Domain, bzw. meine IP samt Port hinterlegt, ändert aber rein gar nichts. Nun habe ich die SSL-Proxyeinstellungen gelöscht und auch das Zertifikat auf dem iPad bzw. das Profil gelöscht aber es kommt dasselbe bei raus.

Die Weiterleitung auf den Port 50634 ist ja eingerichtet, sodass die Cam über XX.64.XX.1X6:50634 erreichbar ist.

Wenn ich das über PHP mit folgendem Script laufen lasse:

$url_src = gethostbyname('xxx.dyndns.org');  

$ports = array(50634);

foreach ($ports as $port)
{
    $connection = @fsockopen($url_src, $port);

    if (is_resource($connection))
    {
        echo '<h2>' . $url_src . ':' . $port . ' ' . '(' . getservbyport($port, 'tcp') . ') is open.</h2>' . "\n";  

        fclose($connection);
    }

    else
    {
        echo '<h2>' . $url_src . ':' . $port . ' is not responding.</h2>' . "\n";  
    }
}

dann bekomme ich, dass der Port angeblich nicht antwortet, was ja offensichtlich nicht sein kann.
Member: colinardo
colinardo Jun 26, 2014 updated at 15:07:06 (UTC)
Goto Top
teste das bitte erst mal im LAN intern bevor du über den Router gehst.
für SSL im Zusammenhang mit "fsockopen" siehe: http://us2.php.net/manual/en/function.fsockopen.php#75388
Über SSL wird dann vermutlich nur die Authentifizierung laufen ... Leider kost die App was sonst würde ich das hier mal testen, aber so, viel Erfolg noch.

Grüße Uwe
Member: bloedername
bloedername Jun 26, 2014 at 15:04:41 (UTC)
Goto Top
Das ist neu... vor kurzem war die noch umsonst. Schade. Trotzdem vielen Dank.