it-swarm.com.de

Wie mache ich eine HTTP GET Anfrage manuell mit Netcat?

Also muss ich die Temperatur aus einer der Städte von http://www.rssweather.com/dir/Asia/India abrufen.

Nehmen wir an, ich möchte von Kanpur abrufen.

Wie erstelle ich eine HTTP GET-Anfrage mit Netcat?

Ich mache so etwas.

nc -v rssweather.com 80
GET http://www.rssweather.com/wx/in/kanpur/wx.php HTTP/1.1

Ich weiß nicht genau, ob ich überhaupt in die richtige Richtung gehe oder nicht. Ich kann keine guten Tutorials zum Erstellen einer HTTP-Get-Anfrage mit netcat finden, daher veröffentliche ich sie hier.

28

Natürlich könnte man in Standards nach Google suchen, aber wenn man nur eine einzige URL erhalten möchte, lohnt sich der Aufwand nicht.

Sie können ein Netcat auch im Listening-Modus an einem Port starten:

nc -l 64738

... und dann mit einem echten Browser eine Browseranfrage in diesen Port stellen. Gib einfach deinen Browser ein http://localhost:64738 und sehen.

In Ihrem tatsächlichen Fall besteht das Problem darin, dass HTTP/1.1 die Verbindung nicht automatisch schließt, sondern auf Ihre nächste URL wartet, die Sie abrufen möchten. Die Lösung ist einfach:

Verwenden Sie HTTP/1.0:

GET /this/url/you/want/to/get HTTP/1.0
Host: www.rssweather.com
<empty line>

oder benutze ein Connection: fordern Sie den Header an, um anzugeben, welchen Server Sie danach schließen möchten:

GET /this/url/you/want/to/get HTTP/1.1
Host: www.rssweather.com
Connection: close
<empty line>

Extension: Schreibe nach dem GET-Header nur den Pfad-Teil der Anfrage. Der Hostname, von dem Sie Daten abrufen möchten, gehört zu einem Host: Header, wie Sie in meinen Beispielen sehen können. Dies liegt daran, dass mehrere Websites auf demselben Webserver ausgeführt werden können. Daher müssen die Browser angeben, von welchem ​​Server sie die Seite laden möchten.

22
peterh

Das funktioniert bei mir:

$ nc www.rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.0
Host: www.rssweather.com

Und dann drücken Sie doppelt <enter>, d. h. einmal für den fernen http-Server und einmal für den Befehl nc.

quelle: Pentesterlabs

10
Keith

Sie müssen netcat nicht einmal verwenden/installieren

  • Erstellen Sie einen TCP-Socket über einen nicht verwendeten Dateideskriptor, d. H. Ich verwende hier 88
  • Schreiben Sie die Anfrage hinein
  • benutze den fd

    exec 88<>/dev/tcp/rssweather.com/80
    echo -e "GET /dir/Asia/India HTTP/1.1\nhost: www.rssweather.com\nConnection: close\n\n" >&88
    sed 's/<[^>]*>/ /g' <&88
    
5
user3527765

Unter MacOS benötigen Sie das Flag -c wie folgt:

Little-Net:~ minfrin$ nc -c rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.1
Host: rssweather.com
Connection: close
[empty line]

Die Antwort sieht dann folgendermaßen aus:

HTTP/1.1 200 OK
Date: Thu, 23 Aug 2018 13:20:49 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

Das Flag -c wird als "CRLF als Zeilenende senden" beschrieben.

Um mit HTTP/1.1 kompatibel zu sein, benötigen Sie den Host-Header sowie "Connection: close", wenn Sie Keepalive deaktivieren möchten.

4
Graham Leggett

Teste es lokal mit python3 http.server

Dies ist auch eine unterhaltsame Möglichkeit, es auszuprobieren. Starten Sie auf einer Shell einen lokalen Dateiserver:

python3 -m http.server 8000

Dann machen Sie auf der zweiten Shell eine Anfrage:

printf 'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n' | nc localhost 8000

Das Host: Header ist in HTTP 1.1 erforderlich.

Dies zeigt eine HTML-Liste des Verzeichnisses, so wie Sie es sehen würden:

firefox http://localhost:8000

Als Nächstes können Sie versuchen, Dateien und Verzeichnisse aufzulisten und die Antwort zu beobachten:

printf 'GET /my-subdir/ HTTP/1.1\n\n' | nc localhost 8000
printf 'GET /my-file HTTP/1.1\n\n' | nc localhost 8000

Bei jeder erfolgreichen Anforderung druckt der Server Folgendes:

127.0.0.1 - - [05/Oct/2018 11:20:55] "GET / HTTP/1.1" 200 -

bestätigung, dass es empfangen wurde.

example.com

Diese IANA gepflegte Domain ist eine weitere gute Test-URL:

printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80

und vergleiche mit: http://example.com/

https SSL

nc scheint nicht in der Lage zu sein, https URLs zu verarbeiten. Stattdessen können Sie Folgendes verwenden:

Sudo apt-get install nmap
printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | ncat --ssl github.com 443

Siehe auch: https://serverfault.com/questions/102032/connecting-to-https-with-netcat-nc/650189#650189

Wenn Sie nc versuchen, hängt es nur:

printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443

und versuche port 80:

printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443

gibt nur eine Umleitungsantwort auf die https -Version:

HTTP/1.1 301 Moved Permanently
Content-Length: 0
Location: https://github.com/
Connection: keep-alive

Getestet unter Ubuntu 18.04.

Ich weiß, dass es nicht die richtige Antwort ist, aber ich habe mit nc und ncat getestet, um das Debugging von Webdiensten für http oder https zu vereinfachen, und bin zu dem Schluss gekommen, dass die Verwendung von curl die beste Option ist, um die nützlichste Ausgabe zu erzielen.

Hier ist meine einzeilige Linux-Bash-Funktion:

% http_debug() { bash -c "curl -v -I --insecure ${1} 2>&1 | egrep -v '^> |^< |^{|^}|^* T|^* AL|^  0' "; };

Verwendung:

% http_debug https://duckduckgo.com/

Ausgabe:

* Connected to duckduckgo.com (107.20.240.232) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* Server certificate:
*  subject: C=US; ST=Pennsylvania; L=Paoli; O=Duck Duck Go, Inc.; CN=duckduckgo.com
*  start date: Sep 18 00:00:00 2018 GMT
*  expire date: Sep 23 12:00:00 2019 GMT
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55f9d1e1e900)
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
  0  5418    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Connection #0 to Host duckduckgo.com left intact
HTTP/2 200 
server: nginx
date: Wed, 15 May 2019 18:02:26 GMT
content-type: text/html; charset=UTF-8
content-length: 5418
vary: Accept-Encoding
etag: "5cdc4dc7-152a"
strict-transport-security: max-age=31536000
x-frame-options: SAMEORIGIN
content-security-policy: default-src https: blob: data: 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self'
x-xss-protection: 1;mode=block
x-content-type-options: nosniff
referrer-policy: Origin
expect-ct: max-age=0
expires: Wed, 15 May 2019 18:02:25 GMT
cache-control: no-cache
accept-ranges: bytes
0