Как сделать запрос HTTP GET вручную с netcat?
Итак, я должен получить температуру из любого города из http://www.rssweather.com/dir/Asia/India.
Предположим, я хочу получить из Канпура.
Как сделать запрос HTTP GET с Netcat?
Я делаю что-то вроде этого.
nc -v rssweather.com 80
GET http://www.rssweather.com/wx/in/kanpur/wx.php HTTP/1.1
Я не знаю точно, если я даже в правильном направлении или нет. Я не могу найти хорошие учебники о том, как сделать запрос HTTP-запроса с netcat, поэтому я размещаю его здесь.
Ответы
Ответ 1
Конечно, вы можете копаться в стандартах, которые искали google, но на самом деле, если вы хотите получить только один URL-адрес, это не стоит усилий.
Вы также можете запустить netcat в режиме прослушивания на порту:
nc -l 64738
... и затем выполните запрос браузера в этот порт с помощью реального браузера. Просто введите свой браузер http://localhost:64738
и посмотрите.
В вашем фактическом случае проблема заключается в том, что HTTP/1.1 не закрывает соединение автоматически, но ждет вашего следующего URL-адреса, который вы хотите получить. Решение прост:
Использовать HTTP/1.0:
GET /this/url/you/want/to/get HTTP/1.0
Host: www.rssweather.com
<empty line>
или используйте заголовок Connection:
request, чтобы сказать сервер, который вы хотите закрыть после этого:
GET /this/url/you/want/to/get HTTP/1.1
Host: www.rssweather.com
Connection: close
<empty line>
Расширение: после заголовка GET пишите только часть пути запроса. Имя хоста, из которого вы хотите получить данные, принадлежит заголовку Host:
как вы можете видеть в моих примерах. Это связано с тем, что несколько веб-сайтов могут работать на одном и том же веб-сервере, поэтому браузеру нужно сказать ему, с какого сервера они хотят загрузить страницу.
Ответ 2
Это работает для меня:
$ nc www.rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.0
Host: www.rssweather.com
Затем нажмите дважды <enter>
, то есть один раз для удаленного http-сервера и один раз для команды nc
.
источник: pentesterlabs
Ответ 3
Вам даже не нужно использовать/установить Netcat
Ответ 4
В MacOS вам понадобится флаг -c следующим образом:
Little-Net:~ minfrin$ nc -c rssweather.com 80
GET /wx/in/kanpur/wx.php HTTP/1.1
Host: rssweather.com
Connection: close
[empty line]
Затем ответ появляется следующим образом:
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
Флаг -c описывается как "Отправить CRLF как конец строки".
Чтобы быть совместимым с HTTP/1.1, вам нужен заголовок Host, а также "Connection: close", если вы хотите отключить keepalive.
Ответ 5
Проверьте его локально с помощью python3 http.server
Это также интересный способ проверить это. На одной оболочке запустите локальный файловый сервер:
python3 -m http.server 8000
Затем на второй оболочке сделайте запрос:
printf 'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n' | nc localhost 8000
Заголовок HTTP Host:
требуется в HTTP 1.1.
Это показывает список каталогов HTML, как вы видите:
firefox http://localhost:8000
Затем вы можете попробовать просмотреть файлы и каталоги и наблюдать за ответом:
printf 'GET /my-subdir/ HTTP/1.1\n\n' | nc localhost 8000
printf 'GET /my-file HTTP/1.1\n\n' | nc localhost 8000
Каждый раз, когда вы делаете успешный запрос, сервер печатает:
127.0.0.1 - - [05/Oct/2018 11:20:55] "GET / HTTP/1.1" 200 -
подтвердив, что он был получен.
example.com
Этот поддерживаемый IANA домен является еще одним хорошим тестовым URL:
printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80
и сравните с: http://example.com/
https
SSL
nc
, похоже, не в состоянии обрабатывать URL-адреса https
. Вместо этого вы можете использовать:
sudo apt-get install nmap
printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | ncat --ssl github.com 443
См. Также: https://serverfault.com/questions/102032/connecting-to-https-with-netcat-nc/650189#650189
Если вы попробуете nc
, он просто зависает:
printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443
и пытается порт 80
:
printf 'GET / HTTP/1.1\r\nHost: github.com\r\n\r\n' | nc github.com 443
просто дает ответ перенаправления на версию https
:
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Location: https://github.com/
Connection: keep-alive
Протестировано на Ubuntu 18.04.
Ответ 6
Я знаю, что это не правильный ответ, но я протестировал использование nc и ncat с целью облегченной отладки веб-сервисов для http или https, и я пришел к выводу, что использование curl - лучший вариант для получения наиболее полезного результата.
Вот моя однострочная функция Linux bash для этого:
% http_debug() { bash -c "curl -v -I --insecure ${1} 2>&1 | egrep -v '^> |^< |^{|^}|^* T|^* AL|^ 0' "; };
Использование:
% http_debug https://duckduckgo.com/
Выход:
* 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