Führen Sie die TCP-Traceroute sicher von der Benutzeranfrage aus aus

446
turrican_34

Ich muss einen TCP-Traceroute mit Linux Traceroute oder einem anderen Paket ausführen, aber ich kann nur schwer einen Weg finden, um die Anforderung von PHP zu erstellen, ohne Sudo-Berechtigungen zu benötigen.

Da die URL von einer Benutzeranfrage stammt, möchte ich sudo nicht verwenden.

Hier ist ein Beispiel:

 $url = 'ebay.com'; $exec = 'sudo traceroute -w 1 -q 1 -T ' . $url; $escaped_command = escapeshellcmd($exec); $result = shell_exec($escaped_command);  echo $result; var_dump($result); 

Dieser Code funktioniert, aber nur mit sudooder ohne -T. Ohne sudogibt es eine leere Zeichenfolge zurück. Ohne -Tdie Traceroute überleben Firewalls nicht.

Wenn es hilft, bin ich auf einem Centos 7 OS.

Hinweis: Ich kann UDP nicht anstelle von TCP verwenden, da dies häufig von der Zielfirewall blockiert wird.

1
Ein paar Überlegungen zur Verwendung von escapeshellcmd () https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36 Daisetsu vor 6 Jahren 0
@schroeder: "-T" ist die Abkürzung für "-M tcp". Diese Methode ist standardmäßig als halboffene Verbindungen dokumentiert und benötigt daher root. Es ist nicht explizit in die Manpage geschrieben, aber über die erforderlichen Berechtigungen wird überhaupt nichts geschrieben. Wahrscheinlich wird mit der (ausdrücklich nicht empfohlenen) Option "tcpconn" root nicht benötigt, da dann ein einfaches "connect" ausgeführt wird. Steffen Ullrich vor 6 Jahren 0
Danke Steffen, also in diesem Fall kann wahrscheinlich mit UDP und der Erhöhung der TTL gearbeitet werden, jedoch muss der Sender den von den Routern generierten ICMP lesen, also denke ich, dass die Quellanwendung Root-Berechtigungen zum Lesen des erzeugten ICMP-Unreach benötigt, Meiner Ansicht nach vor 6 Jahren 0
@camp0 das OP sagt, dass es ohne Sudo und ohne "-T" funktioniert schroeder vor 6 Jahren 0
Ich denke, @SteffenUllrich hat die ultimative Antwort, und dies ist weit mehr eine Linux-Frage als eine Sicherheitsfrage. schroeder vor 6 Jahren 0
Danke für die Antworten. Anscheinend ist es nicht möglich, eine TCP-Traceroute ohne Sudo auszuführen. Der Befehl `$ exec = 'traceroute -w 1 -q 1'. $ url; `funktioniert gut ohne Sudo (mit UDP), also ist es das oder nichts, was ich vermute ... turrican_34 vor 6 Jahren 0

1 Antwort auf die Frage

0
harrymc

Sie können Sudo nicht von PHP aus ausführen, da Apache Sie dies aus Sicherheitsgründen nicht zulässt. Sie müssen Traceroute in PHP in Ihrem Code implementieren.

Es gibt mehrere solcher Implementierungen, die im öffentlichen Bereich zu finden sind.

Siehe zum Beispiel:

Wenn Sie ein Traceroute-Programm in PHP erstellen, ist der Code auf github verfügbar .


Ein weiterer Ansatz zur Vermeidung von Sudo für Traceroute basiert auf der Tatsache, dass Traceroute nicht als Root ausgeführt werden muss. es braucht nur die Fähigkeit CAP_NET_ADMIN. Um dies als Dateifunktion für alle Benutzer festzulegen, wenn Ihr Kernel Dateifunktionen unterstützt und kein Linux-Sicherheitsmodul (SELinux, AppArmor) es blockiert:

setcap CAP_NET_ADMIN+ep /usr/sbin/traceroute 

Der PHP-Code kann dann sehr einfach sein popen():

$handle = popen("traceroute www.xxx.com 2>&1", "r"); while(!feof($handle)) { $buffer = fgets($handle); $buffer = "<p>".$buffer."</p>\n"; echo $buffer; } pclose($handle); 
Ich benutze Nginx, also kann ich Sudo laufen lassen, aber es ist nicht sicher. Die PHP-Implementierung, die Sie verlinkt haben, erfordert auch Sudo und verwendet UDP, nicht TCP, was ich brauche. . turrican_34 vor 6 Jahren 0
Als Nginx-Person können Sie mir vielleicht erklären, warum sudo zum Senden von Nachrichten auf Sockets erforderlich ist. harrymc vor 6 Jahren 0
Laut einem SO-Thread, den ich gefunden habe * Durch das Öffnen eines Raw-Sockets können Sie alles lesen, was in einer bestimmten Schnittstelle empfangen wird. Sie können also grundsätzlich jedes Paket lesen, das an eine Anwendung gerichtet ist - selbst wenn diese Anwendung einem anderen Benutzer gehört. Das bedeutet im Wesentlichen, dass der Benutzer mit dieser Fähigkeit alle Kommunikationen aller Benutzer lesen kann. https://stackoverflow.com/questions/4404860/raw-sockets-need-root-priviliege turrican_34 vor 6 Jahren 0
Richtig, also habe ich einen anderen Ansatz hinzugefügt. harrymc vor 6 Jahren 0
Das hat es geschafft! Vielen Dank. Seltsamerweise brauchte ich `cap_net_admin` nicht, es funktionierte nur mit` cap_net_raw` wie `sudo setcap cap_net_raw + ep / usr / bin / traceroute`. Wenn ich `getcap / usr / bin / traceroute` starte, erhalte ich` / usr / bin / traceroute = cap_net_raw + ep`. Ich habe Selinux im Moment im permissiven Modus, also werde ich, sobald ich ihn aktiviert habe, Probleme haben, die zu beheben sind. turrican_34 vor 6 Jahren 0