Как сделать запрос 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

  • Создайте сокет TCP через неиспользуемый дескриптор файла, т.е. я использую 88 здесь
  • Напишите запрос в это
  • использовать фд

    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
    

Ответ 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