다음과 같이 웹 서버를 직접 누르면 웹 페이지에 액세스 할 수 있습니다.
$ echo "GET /sample" | nc web-server 80
This is contents of /sample...
$
이제는 프록시 환경 설정을 통해 Firefox 브라우저를 구성하고 HTTP 프록시를 통해 가져갈 수있는 것처럼 netcat이 Squid HTTP 프록시 (포트 3128에서 수신)를 통해 가고 싶습니다.
다음을 시도했지만 작동하지 않았습니다.
$ echo "GET /sample" | nc -x squid-proxy:3128 web-server 80
<Seemed to be blocked FOREVER on input, so I killed it.>
<Ctrl-C>
$
참고 : 다음 옵션이있는 RHEL 5.3 버전의 netcat을 사용하고 있습니다.
$ nc --help
nc: invalid option -- -
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
의 맨 페이지에서 발췌 nc
:
EXAMPLES
<snip>
Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080.
This example could also be used by ssh(1); see the ProxyCommand directive in
ssh_config(5) for more information.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
이제 내 것이 ssh / SSL 유스 케이스가 아니기 때문에 -x
/ -X
옵션 을 사용하는 방법 또는 전혀 사용하지 않아야하는지 확실하지 않습니다 !
위의 목표를 달성하는 방법이 두 가지 이상인 경우 (즉, HTTP 프록시를 통해 netcat 트래픽 라우팅) 모두 공유 할 수 있다면 대단히 감사하겠습니다.
미리 감사드립니다.
답변
Netcat은 특수한 HTTP 클라이언트가 아닙니다. 따라서 Netcat 용 프록시 서버를 통해 연결한다는 것은 서버를 통해 TCP 연결을 만드는 것을 의미하므로 다음 과 같이 -x
인수가 지정된 SOCKS 또는 HTTPS 프록시가 필요합니다 -X
.
-X proxy_protocol
Requests that nc should use the specified protocol when talking
to the proxy server. Supported protocols are “4” (SOCKS v.4),
“5” (SOCKS v.5) and “connect” (HTTPS proxy). If the protocol is
not specified, SOCKS version 5 is used.
connect
프록시 서버를 통해 SSL (HTTPS) 연결을 작성하는 방법을 지정합니다. 프록시는 다른 엔드 포인트가 아니며 연결은 엔드 포인트 방식으로 암호화되므로 CONNECT
요청을 통해 HTTP 프록시를 통해 지점 간 연결을 터널링 할 수 있습니다 (허용되는 경우). (자세한 내용은 여기서 글로시 할 수도 있지만 중요한 것은 아닙니다. 여기 에서 ” HTTP CONNECT
터널링” 에 대한 세부 사항 )
따라서 프록시를 사용하여 웹 서버에 연결하려면 웹 브라우저가 수행 하는 작업을 프록시와 대화해야합니다 .
$ nc squid-proxy 3128
GET http://webserver/sample HTTP/1.0
( 이 질문은 이것과 유사합니다 proxychain
. 여기서 사용 되는지 모르겠습니다 . )
부록
사용하는 브라우저 일반 netcat을 당신을 보여 수있는 HTTP 프록시, 예를 들어, 오징어 (I가 알고있는), 무엇을 더 많거나 적은 예를 예시 것을 수행하십시오 후 nc
전화, 나는 프록시 127.0.0.1 포트 8080을 사용하는 파이어 폭스를 구성 그리고 구글을 열려고 시도했는데, 이것이 출력되었습니다 (쿠키 제외).
$ nc -l 8080
GET http://google.com/ HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Proxy-Connection: keep-alive
행동으로 이 방법을 , 너무, 당신은 HTTP 프록시를 통해 HTTP 서버에 액세스 할 netcat을 사용할 수 있습니다. 이제 HTTPS 웹 서버에 액세스하려고하면 어떻게됩니까? 반드시 브라우저는 모든 사용자에게 트래픽을 공개하지 말아야 중간에 소위, 직접 연결이 필요합니다; 여기 CONNECT
가 시작됩니다. 프록시를로 설정하여 다시 시작 nc -l 8080
하고 액세스하려고하면 다음 https://google.com
과 같이 127.0.0.1:80
나타납니다.
CONNECT google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Proxy-Connection: keep-alive
Host: google.com
보시다시피, CONNECT
요청은 서버에게 google.com
포트 443
(https) 에 대한 직접 연결을 요청합니다 . 이제이 요청은 무엇을합니까?
$ nc -X connect -x 127.0.0.1:8080 google.com 443
nc -l 8080
인스턴스 의 출력 :
CONNECT google.com:443 HTTP/1.0
따라서 동일한 방법을 사용하여 직접 연결을 만듭니다. 물론이 캔 (예를 들어 사용하는 거의 아무것도 악용 될 그러나 corkscrew
) CONNECT
요청은 보통 명백한 포트로 제한됩니다.