web-dev-qa-db-ja.com

netcatでHTTP GETリクエストを手動で行う方法は?

そのため、 http://www.rssweather.com/dir/Asia/India のいずれかの都市から気温を取得する必要があります。

Kanpurを取得したいとします。

NetcatでHTTP GETリクエストを行う方法は?

私はこのようなことをしています。

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

私が正しい方向にいるかどうかは正確にはわかりません。 netcatでHTTP getリクエストを行う方法に関する良いチュートリアルが見つからないので、ここに投稿しています。

28

もちろん、Googleで検索された標準を掘り下げることもできますが、実際には、1つの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:リクエストヘッダーを使用して、その後に閉じるサーバーを指定します。

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

Extension: GETヘッダーの後に、リクエストのパス部分のみを書き込みます。データを取得するホスト名は、私の例でわかるように、Host:ヘッダーに属します。これは、同じWebサーバー上で複数のWebサイトを実行できるため、ブラウザーはページをロードするサーバーを指定する必要があるためです。

22
peterh

これは私のために働く:

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

そして、ダブル<enter>、つまり、リモートhttpサーバーに対して1回、ncコマンドに対して1回。

ソース: pentesterlabs

10
Keith

Netcatを使用/インストールする必要さえありません

  • 未使用のファイル記述子を介してtcpソケットを作成します。つまり、ここで88を使用します。
  • リクエストを書き込みます
  • 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

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に準拠するには、ホストヘッダーと、キープアライブを無効にする場合の「Connection:close」が必要です。

4
Graham Leggett

python3 http.serverでローカルでテストする

これもテストするための楽しい方法です。 1つのシェルで、ローカルファイルサーバーを起動します。

python3 -m http.server 8000

次に、2番目のシェルで要求を作成します。

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

HTTP 1.1ではHost:ヘッダーが必要です。

次のように、ディレクトリの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

nchttps URLを処理できないようです。代わりに、次を使用できます。

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でテスト済み。

私はそれが正しい答えではないことを知っていますが、httpまたはhttpsのいずれかのWebサービスの軽量デバッグを目的にncとncatを使用してテストし、curlを使用することが最も有用な出力を得るための最良のオプションであると結論付けました。

これが私のLinux bashの1行関数です。

% 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
0