Cet outil ouvre un socket d'écoute, reçoit des données puis exécute ces données via une chaîne de modules proxy. Une fois les modules terminés, les données résultantes sont envoyées au serveur cible. La réponse est reçue et à nouveau parcourue par une chaîne de modules avant de renvoyer les données finales au client. Pour intercepter les données, vous devrez soit être la passerelle, soit lancer une sorte d'attaque de l'homme du milieu. Configurez iptables pour que la chaîne PREROUTING modifie la destination et l'envoie au processus proxy. Le proxy enverra ensuite les données à la cible spécifiée.
Cet outil est inspiré et partiellement basé sur l'exemple de proxy TCP utilisé dans le livre de Justin Seitz "Black Hat Python" par no starch press.
$ ./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
Vous devrez fournir TARGET_IP et TARGET_PORT, les paramètres d'écoute par défaut sont 0.0.0.0:8080. Pour rendre le programme réellement utile, vous devrez décider quels modules vous souhaitez utiliser sur le trafic sortant (client vers serveur) et entrant (serveur vers client). Vous pouvez utiliser différents modules pour chaque direction. Transmettez la liste des modules sous forme de liste séparée par des virgules, par exemple -im mod1,mod4,mod2. Les données seront transmises au premier module, les données renvoyées seront transmises au deuxième module et ainsi de suite, sauf si vous utilisez le commutateur -n/--no/chain. Dans ce cas, chaque module recevra les données originales. Vous pouvez également transmettre des options à chaque module : -im mod1:key1=val1,mod4,mod2:key1=val1:key2=val2. Pour savoir quelles options vous pouvez transmettre à un module, utilisez -lo/--list-options comme ceci : -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 utilise des modules pour afficher ou modifier les données interceptées. Pour voir l'implémentation la plus simple d'un module, jetez un œil au module textdump.py dans le répertoire proxymodules :