Utiliser un serveur Proxy Transparent pour faire du Reverse Engineering

Largement inspiré de l’excellent article {Securité} Utiliser un serveur Proxy Transparent pour faire du Reverse Engineering
Posté par Dyrk le 03/02/2019

Un proxy qu’est-ce que c’est ?

Un serveur proxy (appelé aussi serveur mandataire en français) est, dans le cadre des réseaux et d’internet, est une machine qui fait l’intermédiaire entre votre matériel (ordinateur, smartphone, tablette…) et internet.

La principale conséquence de son utilisation : l’utilisation et donc l’affichage de l’adresse IP du proxy et non celle du périphérique utilisé, ce qui permet de surfer anonymement (ou presque) sur le web. Car contrairement à ce que certains peuvent penser, vous n’êtes pas anonyme sur internet, il est très facile de suivre votre navigation sur internet en traçant votre adresse IP…

Pour utiliser un serveur proxy, il faut configurer son navigateur ou son ordinateur ou alors utiliser un proxy web c’est-à-dire un site web qui va vous permettre de naviguer sur d’autres sites à partir de ce site.
Cette deuxième solution est bien sûr la plus facile à mettre en œuvre puisqu’il suffit juste de se rendre sur un site et de surfer sur le web via ce site, il n’y a pas de compétence technique particulière à avoir ou de configuration de son navigateur à effectuer.

Proxies directs et inverse

Les mandataires directs envoient les demandes d’un client à un serveur Web. Les utilisateurs accèdent à ces mandataires en naviguant directement jusqu’à leur adresse sur le Web ou en configurant leurs paramètres Internet. Les mandataires directs permettent de contourner les pare-feu et renforcent la confidentialité et la sécurité d’un utilisateur, mais servent parfois à télécharger des contenus illégaux.

Un proxy inverse ou mandataire inverse (reverse proxy) est un type de serveur, habituellement placé en frontal de serveurs web. Contrairement au serveur proxy qui permet à un utilisateur d’accéder au réseau Internet, le proxy inverse permet à un utilisateur d’Internet d’accéder à des serveurs internes.

Des mandataires inverses sont utilisés dans les cas suivants :

  • Contourner les interdictions : permettre un accès indirect lorsqu’un site Web interdit les connexions directes par mesure de sécurité
  • Filtrer des sites et des utilisateurs : Un Proxy permettra d’autoriser ou d’interdire certaines personnes de s’y connecter.
  • Se rendre anonyme (partiellement) : Un proxy se connecte à votre place, vous pouvez donc l’utiliser pour vous anonymiser (partiellement). Lorsque je me connecte sur un site, celui-ci a des informations sur ma connexion (mon ip par exemple), il pourrait savoir d’où je me connecte par exemple, quel est mon FAI (Fournisseur d’Accès Internet), … Un Proxy camouflerait tout ça, par ses propres informations.
  • Permettre l’accès à certains services : Un proxy va permettre de vous connecter sur certaines machines qui interdisent toutes connexions autres que provenant de celui-ci. Ainsi vous pourrez dire, je ne veux que personne ne puisse se connecter sur ce serveur, sauf si les utilisateurs passent par le proxy.
  • pour permettre l’équilibrage de la charge entre serveurs, la répartition de charge (load-balancing)
  • pour diffuser du contenu interne en flux auprès d’utilisateurs Internet
  • pour désactiver l’accès à un site, par exemple lorsqu’un fournisseur d’accès ou un gouvernement souhaite bloquer un site Web.

La principale différence entre un proxy direct (ou explicite) et un proxy transparent est qu’un proxy direct est connu de l’application, qui réalise qu’il s’agit d’un proxy et non du serveur de destination, alors que le mode proxy transparent est un modèle d’interception et nécessite moins de changements à mettre en œuvre sur le terminal. Les applications pensent qu’elles vont directement vers la destination mais, en réalité, un service réseau redirige le trafic vers le proxy, qui l’achemine ensuite vers sa destination.

Trouver des failles dans des applications à l’aide d’un proxy !

Il s’agit de trouver des failles dans une application.
Lorsque vous utiliser un proxy, celui-ci voit de manière transparente, tout ce que vous faites (excepté pour les sites en HTTPS …) !
Un proxy voit donc toutes vos requêtes, et peut récupérer au passage vos cookies … il est donc primordial de ne pas utiliser n’importe quel proxy que vous trouverez sur internet si vous souhaitez vous connecter sur des sites avec des informations confidentielles (votre messagerie, vos réseaux sociaux, le cloud …)

Analyser les requêtes

Ayant eu chez moi un peu de Windows, j’ai eu recourt parfois à des antivirus payant.
A cette époque, comme beaucoup de personne, je récupérais des licences publiées à la sauvette sur des pages Facebook ou des sites internet un peu louche …
J’ai fini par prendre le temps d’analyser un peu le fonctionnement de cet antivirus.
Faire ce que l’on appelle de l’ingénierie inversée ou “Reverse Engineering”.
Notamment en analysant les requêtes que l’antivirus échangeait avec un serveur lors d’une première installation ! Car c’est à ce moment-là que l’antivirus générait une licence d’essai …

Grâce au proxy j’ai pu visualiser ce que l’antivirus envoyait comme information au serveur … pour générer la licence.
Cela m’a permis d’automatiser la génération de licences… une sorte de “KeyGen” (Générateur de clés)
Comme je le dis souvent n’installez pas de crack … et encore moins pour un antivirus …

Installer / Configurer un Proxy “Squid Proxy” pour faire de l’analyse de requête !

Sur votre serveur en tant qu’utilisateur “root”, je vous invite à copier ceci dans votre terminal :

echo "1" > /proc/sys/net/ipv4/ip_forward
apt-get install openssl gcc devscripts build-essential libssl-dev
wget https://github.com/saucelabs/squid3/archive/master.zip
unzip master.zip
cd squid3-master
./configure --prefix=/usr/local/squid --enable-icap-client --enable-ssl --enable-ssl-crtd --with-default-user=squid --with-openssl
make all
make install
useradd squid
chown -R squid:squid /usr/local/squid/var/logs/
cd /usr/local/squid
mkdir ssl_cert
cd ssl_cert
openssl genrsa -out example.com.private 2048 
openssl req -new -key example.com.private -out example.com.csr 

L’opération prend une bonne dizaine de minutes…

Normalement à la fin vous devriez être invité à répondre à un petit formulaire, avec des questions basiques (votre pays, ville, entreprise, …) vous n’êtes pas obligé de mettre de véritables informations ;)
Lorsque vous aurez terminé de remplir ce formulaire, poursuivez avec ces commandes :

openssl x509 -req -days 3652 -in example.com.csr -signkey example.com.private -out example.com.cert  
mkdir /usr/local/squid/var/lib
/usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db -M 4MB
chown -R squid:squid /usr/local/squid/var/lib/ssl_db/
iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 80  -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3127
iptables -I INPUT -p tcp -m tcp --dport 3127 -j ACCEPT

À partir de là, vous avez un proxy Squid qui fonctionne.
Mais il n’est pas encore configuré !

Il vous suffit de remplacer le contenu du fichier /usr/local/squid/squid.conf par :

strip_query_terms off
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access allow all
#http_access deny all
http_port  3128 ssl-bump cert=/usr/local/squid/ssl_cert/example.com.cert key=/usr/local/squid/ssl_cert/example.com.private version=1 options=NO_SSLv2,NO_SSLv3,SINGLE_DH_USE generate-host-certificates=on
https_port 3127 cert=/usr/local/squid/ssl_cert/example.com.cert key=/usr/local/squid/ssl_cert/example.com.private ssl-bump intercept options=NO_SSLv2,NO_SSLv3,SINGLE_DH_USE generate-host-certificates=on
ssl_bump stare all
ssl_bump bump all
sslproxy_cert_error allow all

#logformat squid  %tl %6tr %>a %Ss/%03>Hs %<st %[un %Sh/%<a  %mt %rm %>h            %>rs  %>rd
logformat squid      %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt  %>h
coredump_dir /var/cache/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Installer le certificatexample.com.private” qui se trouve dans /usr/local/squid/ssl_cert sur les machines qui vont utiliser le proxy

La plupart du temps, ouvrez ce fichier avec votre téléphone et / ou votre smartphone, celui-ci se chargera automatiquement de faire le reste.

Pour démarrer le serveur proxy, exécutez la ligne de commande suivante :

/usr/local/squid/sbin/squid -NCd9

Et observez les logs dans un autre terminal avec celle-ci :

tail -f /usr/local/squid/var/logs/access.log