Curl-impersonate: Ein spezieller curl-Build, der wichtige Browser imitieren kann
(github.com/lwthiker)curl-impersonate
Ein spezieller Build von curl, der bestimmte Browser imitieren kann, darunter Chrome, Edge, Safari und Firefox. curl-impersonate kann denselben TLS- und HTTP-Handshake wie echte Browser ausführen. Es kann als Kommandozeilen-Tool verwendet oder als Bibliothek integriert werden.
Warum wird es benötigt?
- Wenn ein HTTP-Client mit einer TLS-Website kommuniziert, führt er zuerst einen TLS-Handshake durch. Die erste Nachricht dabei wird als Client Hello bezeichnet.
- Die von den meisten HTTP-Clients und Bibliotheken erzeugte Client-Hello-Nachricht unterscheidet sich stark von der echter Browser.
- Wenn der Server HTTP/2 verwendet, ist zusätzlich zum TLS-Handshake auch ein HTTP/2-Handshake erforderlich, und die dabei ausgetauschten Einstellungen unterscheiden sich ebenfalls von denen echter Browser.
- Aus diesen Gründen identifizieren einige Webdienste Clients über TLS- und HTTP-Handshakes und liefern anderen Clients andere Inhalte aus.
- Diese Methoden sind als TLS-Fingerprinting und HTTP/2-Fingerprinting bekannt und machen das Web weniger offen, weniger privat und gegenüber bestimmten Web-Clients restriktiver.
- Das modifizierte curl in diesem Repository sorgt dafür, dass TLS- und HTTP-Handshakes exakt wie bei echten Browsern aussehen.
Wie funktioniert es?
curlwurde erheblich verändert, damit es wie ein Browser aussieht.- curl wird mit nss kompiliert, der von Firefox verwendeten TLS-Bibliothek, und die Chrome-Version wird mit BoringSSL kompiliert, der TLS-Bibliothek von Google.
- Die Art und Weise, wie verschiedene TLS-Erweiterungen und SSL-Optionen konfiguriert werden, wurde angepasst.
- Unterstützung für neue TLS-Erweiterungen wurde hinzugefügt.
- Die Einstellungen von curl für HTTP/2-Verbindungen wurden geändert.
curlwird mit nicht standardmäßigen Flags wie--ciphers,--curvesund einigen-H-Headern ausgeführt.
Unterstützte Browser
- Es kann verschiedene Versionen von Chrome, Edge, Firefox und Safari imitieren.
- Für jeden Browser werden Wrapper-Skripte bereitgestellt, die
curl-impersonateausführen.
Grundlegende Verwendung
- Für jeden unterstützten Browser gibt es ein Wrapper-Skript, das
curl-impersonatemit den erforderlichen Headern und Flags ausführt. - Beispiel:
curl_chrome116 https://www.wikipedia.org
Dokumentation
- Weitere Dokumentation befindet sich im Verzeichnis docs/.
Installation
curl-impersonategibt es aus technischen Gründen in zwei Versionen. Es gibt eine chrome-Version, die Chrome, Edge und Safari imitiert, und eine firefox-Version, die Firefox imitiert.- Vorkompilierte Binärdateien für Linux und macOS sind auf der GitHub-Releases-Seite verfügbar.
Erweiterte Verwendung
libcurl-impersonate
libcurl-impersonate.soist libcurl, kompiliert mit denselben Änderungen wie das Kommandozeilen-curl-impersonate.- Es stellt die zusätzliche API-Funktion
curl_easy_impersonatebereit.
Verwendung der Umgebungsvariable CURL_IMPERSONATE
- In Anwendungen, die bereits
libcurlverwenden, kann mitLD_PRELOADdie bestehende Bibliothek zur Laufzeit ersetzt werden. - Durch Setzen der Umgebungsvariable
CURL_IMPERSONATEkönnen alle Optionen automatisch gesetzt werden.
Mitwirken
- Beiträge sind möglich, indem offene Issues geprüft und Pull Requests mit Änderungen eingereicht werden.
Sponsoren
- Es gibt Sponsoren, die dabei helfen, das Projekt offen zu halten und zu pflegen. Wer Sponsor werden möchte, kann direkt Kontakt aufnehmen.
1 Kommentare
Hacker-News-Kommentare
Lob an den Entwickler und den Einreicher. Ich arbeite an einem Browser-Projekt, das OpenSSL verwendet, und dachte, ich müsste das alles selbst mit WireShark analysieren. Jetzt gibt es eine Menge Material als Referenz. Wenn die häufigste Verwendung von OpenSSL in Python liegt, dann ist eine Firefox-TLS-Spoofing-Option im Zeitalter von Cloudflare unverzichtbar.
Ich hoffe, dass Ladybird in Zukunft Aufmerksamkeit bekommt. Derzeit verwendet es cURL für das Networking. cURL hat möglicherweise noch einige Einschränkungen (z. B. kann es WebSockets nicht über h2 verarbeiten). Wenn jedoch neue Browser-Engines auftauchen, kann legitimer Traffic denselben Fingerabdruck wie Standard-cURL haben.
Ich frage mich, ob der IP_TTL-Wert plattformgerecht gesetzt wurde. Falls nicht, könnte das auf der IP-Ebene einen gewissen Fingerabdruck hinterlassen. Wenn der TTL-Wert auf der IP-Ebene unter 64 liegt, deutet das darauf hin, dass es nicht auf einem aktuellen Windows läuft oder auf einem aktuellen Windows-Gerät mit geändertem Standard-TTL. Bei aktuellem Windows startet die Paket-TTL standardmäßig bei 128, bei den meisten anderen Plattformen bei 64. Andere Plattformen haben bei Internetkommunikation keine Probleme, daher sind IP-Pakete von aktuellem Windows aus der Ferne immer mit einer TTL von mindestens 64 sichtbar.
Wenn der TLS-Handshake anders aussieht, frage ich mich, ob ein Filter auf nginx-Ebene möglich wäre, der Traffic herausfiltert, der behauptet, ein Webbrowser zu sein (z. B. Chrome User-Agent). Das macht den Großteil des bösartigen Bot-Traffics aus, und ich würde das gern blockieren.
Ich habe immer gemischte Gefühle dabei, wenn so etwas hier auftaucht. Einerseits ist es gut, die Leute wissen zu lassen, dass Unabhängigkeit und Widerspenstigkeit noch leben. Andererseits kann unerwünschte Aufmerksamkeit es für die Menschen, die darauf angewiesen sind, schlimmer machen, so wie beim Projekt „Freedom is unstable“. Browser zu schreiben ist schwer, und die etablierten Anbieter machen es immer weiter schwerer.
Dieses Tool ist in Kombination mit kleinen bash-Skripten und gnu parallel sehr nützlich für Red-Team-Arbeit beim Mapping von https-Endpunkten. Ich verwende es bei Adressen innerhalb eines Bereichs, die nur auf den passenden Browser reagieren. Man kann normale curl-Schalter wie
-Hzum Header-Spoofing verwenden.Damals bei Show HN: Link
Ich warte jetzt auf eine MCP-Version :)
Ich vermisse die einfachen Zeiten, in denen Websites Bots einfach erlaubten oder blockierten.