이 도구는 청취 소켓을 열고 데이터를 수신한 다음 프록시 모듈 체인을 통해 이 데이터를 실행합니다. 모듈이 완료되면 결과 데이터가 대상 서버로 전송됩니다. 응답이 수신되고 최종 데이터를 클라이언트로 다시 보내기 전에 모듈 체인을 통해 다시 실행됩니다. 데이터를 가로채려면 게이트웨이가 되거나 일종의 중간자 공격을 수행해야 합니다. PREROUTING 체인이 대상을 수정하고 이를 프록시 프로세스로 보내도록 iptables를 설정합니다. 그런 다음 프록시는 지정된 대상으로 데이터를 보냅니다.
이 도구는 Justin Seitz의 저서 "Black Hat Python"에서 사용된 TCP 프록시 예제에서 영감을 얻었으며 부분적으로 기반을 두고 있습니다.
$ ./tcpproxy.py -h
usage: tcpproxy.py [-h] [-ti TARGET_IP] [-tp TARGET_PORT] [-li LISTEN_IP]
[-lp LISTEN_PORT] [-pi PROXY_IP] [-pp PROXY_PORT]
[-pt {SOCKS4,SOCKS5,HTTP}] [-om OUT_MODULES]
[-im IN_MODULES] [-v] [-n] [-l LOGFILE] [--list]
[-lo HELP_MODULES] [-s] [-sc SERVER_CERTIFICATE]
[-sk SERVER_KEY] [-cc CLIENT_CERTIFICATE] [-ck CLIENT_KEY]
Simple TCP proxy for data interception and modification. Select modules to
handle the intercepted traffic.
optional arguments:
-h, --help show this help message and exit
-ti TARGET_IP, --targetip TARGET_IP
remote target IP or host name
-tp TARGET_PORT, --targetport TARGET_PORT
remote target port
-li LISTEN_IP, --listenip LISTEN_IP
IP address/host name to listen for incoming data
-lp LISTEN_PORT, --listenport LISTEN_PORT
port to listen on
-pi PROXY_IP, --proxy-ip PROXY_IP
IP address/host name of proxy
-pp PROXY_PORT, --proxy-port PROXY_PORT
proxy port
-pt {SOCKS4,SOCKS5,HTTP}, --proxy-type {SOCKS4,SOCKS5,HTTP}
proxy type. Options are SOCKS5 (default), SOCKS4, HTTP
-om OUT_MODULES, --outmodules OUT_MODULES
comma-separated list of modules to modify data before
sending to remote target.
-im IN_MODULES, --inmodules IN_MODULES
comma-separated list of modules to modify data
received from the remote target.
-v, --verbose More verbose output of status information
-n, --no-chain Don't send output from one module to the next one
-l LOGFILE, --log LOGFILE
Log all data to a file before modules are run.
--list list available modules
-lo HELP_MODULES, --list-options HELP_MODULES
Print help of selected module
-s, --ssl detect SSL/TLS as well as STARTTLS
-sc SERVER_CERTIFICATE, --server-certificate SERVER_CERTIFICATE
server certificate in PEM format (default: mitm.pem)
-sk SERVER_KEY, --server-key SERVER_KEY
server key in PEM format (default: mitm.pem)
-cc CLIENT_CERTIFICATE, --client-certificate CLIENT_CERTIFICATE
client certificate in PEM format in case client
authentication is required by the target
-ck CLIENT_KEY, --client-key CLIENT_KEY
client key in PEM format in case client authentication
is required by the target
TARGET_IP 및 TARGET_PORT를 제공해야 하며 기본 수신 설정은 0.0.0.0:8080입니다. 프로그램을 실제로 유용하게 만들려면 나가는(클라이언트에서 서버로) 트래픽과 들어오는(서버에서 클라이언트로) 트래픽에 사용할 모듈을 결정해야 합니다. 각 방향마다 다른 모듈을 사용할 수 있습니다. 모듈 목록을 쉼표로 구분된 목록으로 전달합니다(예: -im mod1,mod4,mod2). -n/--no/chain 스위치를 사용하지 않는 한 데이터는 첫 번째 모듈로 전달되고, 반환된 데이터는 두 번째 모듈로 전달되는 식으로 계속됩니다. 이 경우 모든 모듈은 원본 데이터를 받게 됩니다. -im mod1:key1=val1,mod4,mod2:key1=val1:key2=val2와 같이 옵션을 각 모듈에 전달할 수도 있습니다. 어떤 옵션을 모듈에 전달할 수 있는지 알아보려면 다음과 같이 -lo/--list-options를 사용하세요: -lo mod1,mod2,mod4
$ ./tcpproxy.py --list
digestdowngrade - Find HTTP Digest Authentication and replace it with a Basic Auth
hexdump - Print a hexdump of the received data
http_ok - Prepend HTTP response header
http_post - Prepend HTTP header
http_strip - Remove HTTP header from data
log - Log data in the module chain. Use in addition to general logging (-l/--log).
removegzip - Replace gzip in the list of accepted encodings in a HTTP request with booo.
replace - Replace text on the fly by using regular expressions in a file or as module parameters
hexreplace - Replace hex data in tcp packets
size - Print the size of the data passed to the module
size404 - Change HTTP responses of a certain size to 404.
textdump - Simply print the received data as text
Tcpproxy.py는 모듈을 사용하여 가로채는 데이터를 보거나 수정합니다. 가장 쉬운 모듈 구현을 보려면 프록시모듈 디렉터리에 있는 textdump.py 모듈을 살펴보세요.