netcat이 기존 HTTP 프록시를 사용하게하는 방법


11

다음과 같이 웹 서버를 직접 누르면 웹 페이지에 액세스 할 수 있습니다.

$ 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 트래픽 라우팅) 모두 공유 할 수 있다면 대단히 감사하겠습니다.

미리 감사드립니다.

답변:


14

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요청은 보통 명백한 포트로 제한됩니다.


@sr_ 브라우저가 서버 부분을 통해 TCP 연결을 달성하는 방법에 대해 조금 더 자세히 설명해 주 시겠습니까? socks4, socks5 및 connect와 마찬가지로 일반 HTTP 프록시를위한 프로토콜도있는 것 같습니다. 이것을 확인 하시겠습니까? 많은 감사합니다.
Harry

1
@BruceEdiger, 그렇습니다. 나는 0.1나의 무지를 숨기려고 빼었다 . :)
sr_

1
@Harry 내 게임 nc과 Firefox에서 약간의 차이가 있습니까?
sr_

@ sr_ nc squid-proxy 3128다음에 시도했지만 GET http://webserver/sample HTTP/1.0HTTP / 1.0 403 Forbidden (액세스 거부 오류)이 발생했습니다.
Harry

1
아 죄송합니다. 여기에 전문가가 :)tcpdumpwiresharkCONNECT
아니라는

3

고마워요, +1 매우 정교하고 복잡한 도구처럼 보입니다. 시도 echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN했지만이 오류가 발생했습니다 : 2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden. 이제이 도구를 올바르게 이해했는지 확인하기 위해 프록시가 아닌 기본 사용법을 시도했지만 echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDIN응답이 없습니다! 그래서 분명히 socat 사용법에서 여기에 뭔가 빠져 있습니다. 내 실수를 지적 해 주시면 감사하겠습니다.
Harry

좋아, 대신 STDIO(또는 -) 을 사용하여 비 프록시 버전 호출을 작동시킬 수 STDIN있습니다. 그러나 프록시 버전은 여전히 ​​동일한 오류를 발생시킵니다.
Harry

1
또 다른 업데이트 : 시도 echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128하고 작동했습니다. 이것이 주소 지정 socat대신에 내가 사용해야하는 방법인지 확인 하시겠습니까 PROXY:...?
Harry

1
안녕하세요, 나는 그것을 너무 많이 사용하지는 않았지만 맞습니다. Socat은 http-proxy에 대한 일반 TCP 연결을 열고 오징어는 http-GET을 구문 분석하고 나머지는 수행합니다. https btw.에서 작동합니까? 그리고 마지막으로 또 다른 링크 : technostuff.blogspot.com/2008/10/…
Fabian Zeindl

아니요, 아직 https를 시도하지 않았습니다. 곧 https에 대해서도 걱정할 것입니다. 감사.
Harry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.