로컬 투명 프록시 SSLSplit로 인해 전달 루프가 발생함

로컬 투명 프록시 SSLSplit로 인해 전달 루프가 발생함

HTTPS를 통해 RPC를 보내는 응용 프로그램을 디버깅하려고 합니다. 실제 RPC 콘텐츠를 읽기 위해 MITM 연결 애플리케이션과 동일한 시스템에서 SSLSplit을 사용해 보았습니다. 이를 위해 루트 애플리케이션에서 들어오지 않는 모든 트래픽을 다음을 통해 라우팅하는 iptables NAT 테이블에 규칙을 설정했습니다 127.0.0.1:8443.

iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8443

그 후, SSLSplit에서 대상 서버로의 아웃바운드 트래픽이 SSLSplit로 다시 리디렉션되는 것을 방지하기 위해 sslsplit -D -k key.pem -c cert.pem -P https 127.0.0.1 8443실행 했습니다 . root그럼에도 불구하고 나는 다음 Error 24 on listener: Too many open files과 같은 결과를 얻습니다.https://github.com/droe/sslsplit/issues/93#issuecomment-96894847아마도 너무 많은 소켓이 열려 있기 때문일 것입니다. 이는 SSLSplit에서 보낸 트래픽이 SSLSplit으로 루프백되는 증상일 수 있습니다.

SSLSplit이 루트로 실행되고 루트 트래픽이 리디렉션 규칙의 영향을 받지 않는다는 점을 고려하면 내가 뭘 잘못하고 있는지 알 수 없습니다. 또한 루트로 한 번, 비루트로 한 번, 두 번 컬을 실행하여 내 iptables 규칙이 올바른지 확인했습니다. 예상대로 루트가 아닌 컬은 작동하지 않지만( curl: (7) Failed to connect to unix.stackexchange.com port 443: Connection refused) 루트 컬은 완벽하게 작동합니다(==> iptables 규칙의 영향을 받지 않음).

질문:

  1. SSLSplit이 루트로 실행 중인 경우 내 iptables 규칙은 SSLSplit에서 전송된 트래픽이 자체적으로 피드백되도록 하는 루프를 어떻게 생성할 수 있습니까?

  2. 최종적으로 통신 내용을 읽으려면 이 문제를 어떻게 해결해야 합니까?

액세스를 시도할 때 얻은 출력의 발췌https://unix.stackexchange.com내 브라우저에서 SSLSplit을 실행합니다.

SNI peek: [www.gravatar.com] [complete]
Connecting to [192.0.73.2]:443
<repeated 96 times>

SNI peek: [platform-lookaside.fbsbx.com] [complete]
SNI peek: [www.gravatar.com] [complete]
Connecting to [157.240.17.15]:443
Connecting to [192.0.73.2]:443
<repeated some more times>

SNI peek: [www.gravatar.com] [complete]
Connecting to [192.0.73.2]:443
<repeated 95 times>

SNI peek: [platform-lookaside.fbsbx.com] [complete]
SNI peek: [www.gravatar.com] [complete]
Connecting to [157.240.17.15]:443
Connecting to [192.0.73.2]:443
<repeated some more times>

Error 24 on listener: Too many open files
Main event loop stopped (reason=0).
Child pid 12445 exited with status 0

답변1

OP 읽기매우 동일한 링크 댓글:

인바운드 연결만 sslsplit로 전송되도록 입력 인터페이스를 추가합니다(예: LAN 연결 인터페이스가 eth0이고 WAN 연결 인터페이스가 eth1인 경우).

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

이것은 수행된 작업이 아니므로 실행 방법을 경고할 방법이 없습니다.뿌리사용자는 에 의해 처리됩니다 sslsplit.

sslsplit실행 시 실제 명령은 다음과 같습니다.뿌리, 전환하여 권한 포기사용자에게nobody달리 구성하지 않는 한:

/*
 * User to drop privileges to by default.  This user needs to be allowed to
 * create outbound TCP connections, and in some configurations, perform DNS
 * resolution.
 *
 * Packagers may want to use a specific service user account instead of
 * overloading nobody with yet another use case.  
[...]
 */
#define DFLT_DROPUSER "nobody"

이는 분기된 "작업자" 하위 프로세스에 대해 수행됩니다. 내가 이것을 다음과 같이 실행하는 데 관심이 있는지 잘 모르겠습니다.뿌리낮은 포트에 바인딩되지 않는 한.

따라서 수행해야 할 작업은 다음과 같습니다.

  • sslsplit일반 사용자로 실행

    uid 또는 gid는 변경되지 않으며 차단하려는 애플리케이션이 해당 사용자로 실행되고 있지 않은지 확인합니다. 리디렉션을 다음으로 변경합니다.

    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner normaluser --dport 443 -j REDIRECT --to-port 8443
    
  • 또는 구성SSL 분할루트로 실행하는 경우 전용 사용자 및/또는 그룹을 사용하십시오.

    바라보다구성 파일또는 옵션-u그리고-m이 목적을 위해. 나는 proxy이 목적을 위해 이 그룹을 사용(또는 생성 및 사용)할 것입니다 . 그런 다음 사용됩니다 ! --gid-owner proxy.

관련 정보