Comment faire une requête HTTP GET manuellement avec netcat?

4 réponses

bien sûr, vous pouvez creuser dans les normes recherchées pour google, mais en fait si vous voulez obtenir une seule URL, il ne vaut pas la peine de l'effort.

vous pouvez aussi démarrer un netcat en mode d'écoute sur un port:

nc -l 64738

...et puis faire 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, le problème est que HTTP / 1.1 ne ferme pas la connexion automatiquement, mais il attend votre prochain URL que vous voulez récupérer. La solution est simple:

Utiliser le protocole HTTP/1.0:

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

ou un Connection: en-tête de requête pour dire le serveur que vous voulez fermer après cela:

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

Poste: après l'en-tête GET, n'écrivez que la partie chemin de la requête. Le nom d'hôte à partir duquel vous souhaitez obtenir des données appartient à un Host: en-tête comme vous pouvez le voir dans mes exemples. C'est parce que plusieurs sites Web peuvent fonctionner sur le même serveur web, donc les navigateurs ont besoin pour dire lui, de quel serveur ils veulent charger la page.

16
répondu peterh 2015-09-01 22:22:27

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 la double <enter>, i.e. une fois pour le serveur http distant et une fois pour le nc la commande.

source: pentesterlabs

6
répondu Keith 2018-01-28 22:37:13

sur 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 CRLF comme fin de ligne".

pour être compatible avec HTTP/1.1, vous avez besoin de L'en-tête Host, ainsi que du "Connection: close" si vous voulez désactiver keepalive.

1
répondu Graham Leggett 2018-08-23 13:27:15

tester localement avec python3 http.server

C'est aussi une façon amusante de tester. Sur un shell, lancez un serveur de fichiers local:

python3 -m http.server 8000

puis sur le second shell, faites une requête:

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

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

affiche une liste HTML du répertoire, comme vous pouvez le voir de:

firefox http://localhost:8000

Ensuite, vous pouvez essayer de lister les fichiers et les répertoires, et d'observer le 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 faites avec succès une requête, 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

IANA maintenu domaine est un autre bon test de l'URL:

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

et de les comparer avec: http://example.com/

https SSL

nc ne semble pas pouvoir poignée https URLs. 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 se bloque:

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

et en essayant de 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 à l' https version:

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

testé sur Ubuntu 18.04.

0