web-dev-qa-db-fra.com

Comment faire une demande HTTP GET manuellement avec netcat?

Donc, je dois récupérer la température de n'importe laquelle des villes de http://www.rssweather.com/dir/Asia/India .

Supposons que je veuille récupérer celui de Kanpur.

Comment faire une requête HTTP GET avec Netcat?

Je fais quelque chose comme ça.

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

Je ne sais pas exactement si je suis dans la bonne direction ou non. Je ne suis pas en mesure de trouver de bons tutoriels sur la manière de faire une requête HTTP get avec netcat, je le poste donc ici.

28
Avinash Bhawnani

Bien sûr, vous pouvez creuser dans les normes de recherche de Google, mais si vous voulez obtenir une seule URL, cela ne vaut pas la peine.

Vous pouvez également démarrer un netcat en mode d’écoute sur un port:

nc -l 64738

... puis faites une demande de navigateur dans ce port avec un vrai navigateur. Il suffit de taper dans votre navigateur http://localhost:64738 et voir.

Dans votre cas réel, le problème est que HTTP/1.1 ne ferme pas la connexion automatiquement, mais attend votre prochaine URL à récupérer. La solution est simple:

Utilisez HTTP/1.0:

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

ou utilisez un Connection: en-tête de requête pour indiquer le serveur que vous souhaitez fermer par la suite:

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

Extension: Après l'en-tête GET, écrivez uniquement la partie chemin de la demande. Le nom d’hôte à partir duquel vous voulez obtenir des données appartient à un Host: en-tête comme vous pouvez le voir dans mes exemples. En effet, plusieurs sites Web peuvent s'exécuter sur le même serveur Web. Les navigateurs doivent donc lui dire quel serveur ils veulent charger la page.

22
peterh

Cela fonctionne pour moi:

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

Et puis appuyez sur double <enter>, c’est-à-dire une fois pour le serveur http distant et une fois pour la commande nc.

source: pentesterlabs

10
Keith

Vous n'avez même pas besoin d'utiliser/installer netcat

  • Créer un socket TCP via un descripteur de fichier inutilisé, c’est-à-dire que j’utilise 88 ici
  • Écrire la demande
  • utiliser le 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

Sous MacOS, vous avez besoin du drapeau -c comme suit:

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

La réponse apparaît alors comme suit:

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

L'indicateur -c est décrit comme "Envoyer le CRLF en fin de ligne".

Pour être conforme à HTTP/1.1, vous avez besoin de l'en-tête Host, ainsi que de "Connection: close" si vous souhaitez désactiver Keepalive.

4
Graham Leggett

Testez-le localement avec python3 http.server

C'est aussi un moyen amusant de le tester. Sur un shell, lancez un serveur de fichiers local:

python3 -m http.server 8000

Ensuite, sur le deuxième shell, faites une demande:

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

Le Host: en-tête est requis dans HTTP 1.1.

Cela montre une liste HTML du répertoire, comme vous le verriez dans:

firefox http://localhost:8000

Ensuite, vous pouvez essayer de lister les fichiers et les répertoires et observer la réponse:

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

Chaque fois que vous effectuez une demande, le serveur imprime:

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

confirmant qu'il a été reçu.

example.com

Ce domaine IANA est un autre bon URL de test:

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

et comparez avec: http://example.com/

https SSL

nc ne semble pas capable de gérer https URL. Au lieu de cela, vous pouvez utiliser:

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

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

Si vous essayez nc, il se bloque:

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

et essayer le port 80:

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

donne juste une réponse de redirection à la version https:

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

Testé sur Ubuntu 18.04.

Je sais que ce n’est pas la bonne réponse, mais j’ai testé l’utilisation de nc et de ncat dans l’objectif de débogage léger des services Web pour http ou https et j’ai conclu que l’utilisation de curl est la meilleure option pour obtenir le résultat le plus utile.

Voici ma fonction une ligne Linux bash pour cela:

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

Usage:

% http_debug https://duckduckgo.com/

Sortie:

* 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
Timothy C. Quinn