it-swarm.com.de

Wie kann ich mit cURL in PHP eine Verbindung zu einem versteckten Tor-Dienst herstellen?

Ich versuche, mit dem folgenden PHP Code eine Verbindung zu einem versteckten Tor-Dienst herzustellen:

$url = 'http://jhiwjjlqpyawmpjx.onion/'
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);

print_r($output);
print_r($curl_error);

Wenn ich es ausführe, erhalte ich die folgende Fehlermeldung:

Hostname konnte nicht aufgelöst werden

Wenn ich jedoch in Ubuntu den folgenden Befehl in meiner Befehlszeile ausführe:

curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion

Ich erhalte wie erwartet eine Antwort

In der Dokumentation PHP cURL heißt es:

--socks5-hostname
Use  the  specified  SOCKS5 proxy (and let the proxy resolve the Host name).

Ich glaube, der Grund, warum es über die Befehlszeile funktioniert, ist, dass Tor (der Proxy) den .onion-Hostnamen auflöst, den es erkennt. Ich vermute, dass cURL oder PHP beim Ausführen des obigen PHP-Codes versuchen, den .onion-Hostnamen aufzulösen, und ihn nicht erkennen. Ich habe nach einer Möglichkeit gesucht, cURL/PHP anzuweisen, den Hostnamen vom Proxy auflösen zu lassen, aber ich kann keinen Weg finden.

Es gibt eine sehr ähnliche Stapelüberlauf-Frage: cURL-Anforderung mit socks5-Proxy schlägt fehl, wenn PHP verwendet wird, funktioniert jedoch über die Befehlszeile.

333
frosty

Es sieht so aus, als ob CURLPROXY_SOCKS5_HOSTNAME in PHP nicht definiert ist, aber Sie können seinen Wert explizit verwenden, der gleich 7 ist:

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
95
dr.scre

Ich benutze Privoxy und cURL, um Tor-Seiten zu scrappen:

<?php
    $ch = curl_init('http://jhiwjjlqpyawmpjx.onion'); // Tormail URL
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
    curl_setopt($ch, CURLOPT_PROXY, "localhost:8118"); // Default privoxy port
    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    curl_exec($ch);
    curl_close($ch);
?>

Nach der Installation von Privoxy müssen Sie diese Zeile zur Konfigurationsdatei hinzufügen (/etc/privoxy/config). Beachten Sie das Leerzeichen und '.' a das Ende der Linie.

forward-socks4a / localhost:9050 .

Starten Sie dann Privoxy neu.

/etc/init.d/privoxy restart
19
FattyPotatoes

Versuchen Sie dies hinzuzufügen:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

TL; DR: Stellen Sie _CURLOPT_PROXYTYPE_ ein, um _CURLPROXY_SOCKS5_HOSTNAME_ zu verwenden, wenn Sie ein modernes PHP haben, andernfalls den Wert _7_ und/oder korrigieren Sie den Wert _CURLOPT_PROXY_.

Wie Sie richtig abgeleitet haben, können Sie _.onion_ -Domänen nicht über das normale DNS-System auflösen, da dies eine reservierte Top-Level-Domain, die speziell von Tor verwendet wird ist und solche Domänen keine IP-Adressen haben zu kartieren.

Wenn Sie _CURLPROXY_SOCKS5_ verwenden, wird der cURL-Befehl angewiesen, den Datenverkehr an den Proxy zu senden. Bei der Auflösung von Domänennamen geschieht dies jedoch nicht . Die DNS-Anforderungen, die gesendet werden , bevor cURL versucht, die tatsächliche Verbindung mit der Onion-Site herzustellen, werden weiterhin an den normalen DNS-Resolver des Systems gesendet. Diese DNS-Anfragen werden mit Sicherheit fehlschlagen, da der normale DNS-Resolver des Systems nicht weiß, was mit einer _.onion_-Adresse zu tun ist, es sei denn, auch er leitet solche Anfragen speziell an Tor weiter.

Anstelle von _CURLPROXY_SOCKS5_ müssen Sie CURLPROXY_SOCKS5_HOSTNAME verwenden. Alternativ können Sie auch _CURLPROXY_SOCKS4A_ verwenden, SOCKS5 wird jedoch stark bevorzugt. Bei beiden Proxy-Typen wird cURL angewiesen, sowohl die DNS-Suche als auch die eigentliche Datenübertragung über den Proxy durchzuführen. Dies ist erforderlich, um eine _.onion_ -Domäne erfolgreich aufzulösen.

Es gibt auch zwei zusätzliche Fehler im Code der ursprünglichen Frage, die von früheren Kommentatoren noch korrigiert werden müssen. Diese sind:

  • Fehlendes Semikolon am Ende von Zeile 1.
  • Der Proxy-Adresswert ist auf eine HTTP-URL festgelegt, der Typ lautet jedoch SOCKS. diese sind nicht kompatibel. Bei SOCKS-Proxys muss der Wert eine Kombination aus IP-Adresse oder Domänenname und Portnummer ohne Schema/Protokoll/Präfix sein.

Hier ist der korrekte Code vollständig mit Kommentaren, die auf die Änderungen hinweisen.

_<?php
$url = 'http://jhiwjjlqpyawmpjx.onion/'; // Note the addition of a semicolon.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050"); // Note the address here is just `IP:port`, not an HTTP URL.
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME); // Note use of `CURLPROXY_SOCKS5_HOSTNAME`.
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);

print_r($output);
print_r($curl_error);
_

Sie können die Einstellung _CURLOPT_PROXYTYPE_ auch ganz weglassen, indem Sie den Wert _CURLOPT_PROXY_ so ändern, dass er das Präfix _socks5h://_ enthält:

_// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
_
3
Meitar