Ce référentiel contient des artefacts pour l'article « Terrapin Attack: Breaking SSH Channel Integrity By Sequence Number Manipulation », accepté lors du 33e USENIX Security Symposium.
Le code de ce référentiel contient, entre autres artefacts, des proxys d'attaque de preuve de concept pour les CVE suivants :
Tous les PoC et scripts contenus dans ces artefacts sont conçus pour être exécutés dans des conteneurs Docker. À ce titre, assurez-vous de disposer d’un système d’exploitation Linux (testé) ou MacOS/Windows (non testé) récent avec Docker installé. Pour une reproduction facile des résultats de l'article, reportez-vous aux scripts contenus dans le dossier scripts
(voir la structure du référentiel ci-dessus).
Tous les scripts exécuteront les conteneurs dans --network host
pour permettre une capture facile à l'aide de Wireshark sur l'interface lo. Par défaut, les serveurs SSH se lieront au port 2200/tcp tandis que les scripts PoC se lieront au port 2201/tcp. Étant donné que les scripts PoC et les serveurs SSH sont liés à la version 0.0.0.0, il est conseillé de déconnecter votre système du réseau ou de configurer correctement votre pare-feu pour éviter de divulguer des services SSH non sécurisés sur votre réseau local.
Vous pouvez également créer et exécuter des conteneurs Docker individuels (implémentations PoC et SSH) à votre propre discrétion.
Vous pouvez exécuter impl/build.sh
et pocs/build.sh
pour vérifier votre configuration. La sortie doit indiquer que les images d’évaluation sont créées à l’aide de Docker. S'il n'y a pas de sortie, toutes les images Docker sont déjà créées.
$ impl/build.sh
[+] Building 2.0s (15/15) FINISHED
[...]
= > = > naming to docker.io/terrapin-artifacts/openssh-server:9.4p1
[...]
$ pocs/build.sh
[...]
Attaque | Mastic 0,79 | OuvertSSH 9.4p1 | OuvertSSH 9.5p1 | Dropbear 2022.83 | AsyncSSH 2.13.2 | libsh 0.10.5 |
---|---|---|---|---|---|---|
C1 RcvAugmentation | ✅ | - | ✅ | ✅ | ✅ | ✅ |
C1 RcvDiminuer | ✅ | - | R. | ✅ | T | T |
C1 SndAugmentation | ✅ | - | R. | U | T | T |
C1 SndDiminution | ✅ | - | R. | U | T | T |
C2 ChaCha20-Poly1305 | ✅ | ✅ | ✅ | - | - | - |
C2 CBC-EtM | 0,0300 (INCONNU) 0,8383 (PIN) | 0,0003 (INCONNU) | 0,0003 (INCONNU) 0,0074 (PIN) | - | - | - |
Extension C3 malveillante | - | - | - | - | ✅ | - |
Session voyou C4 | - | - | - | - | ✅ | - |
Légende:
(E1) : scripts/test-sqn-manipulation.sh
- Exécutez l'une des quatre attaques de manipulation de numéro de séquence pour prouver (C1).
(E2a) : scripts/test-ext-downgrade.sh
- Exécutez l'attaque de déclassement d'extension pour prouver (C2) pour ChaCha20-Poly1305.
Durée d'exécution prévue : environ 1 minute.
Exécution : après avoir démarré le script, choisissez une combinaison arbitraire de client et de serveur. Ensuite, choisissez la variante d'attaque 1 pour sélectionner ChaCha20-Poly1305.
Résultats : Le script se terminera en ouvrant simultanément les fichiers suivants dans less
:
diff
des fichiers 3 et 4diff
des fichiers 5 et 6Accédez au deuxième fichier. Le fichier compare la sortie du client SSH sélectionné dans le cas d'une attaque de rétrogradation d'extension à la sortie d'une connexion non modifiée. Le diff indiquera la présence de SSH_MSG_EXT_INFO et l'absence de SSH_MSG_IGNORE dans la connexion non modifiée uniquement, prouvant ainsi (C2) pour ChaCha20-Poly1305.
(E2b) : scripts/bench-ext-downgrade.sh
- Exécutez l'attaque de rétrogradation de l'extension 10 000 fois pour prouver (C2) pour CBC-EtM (INCONNU et PING).
(E3) : scripts/test-asyncssh-rogue-ext-negotiation.sh
less
. Reportez-vous aux résultats de (E2a) pour une liste des fichiers ouverts. Accédez au deuxième fichier. Le diff indiquera la présence de l'extension server-sig-algs avec une valeur choisie par l'attaquant dans la connexion falsifiée, prouvant ainsi (C3). (E4) : scripts/test-asyncssh-rogue-session-attack.sh
less
. Reportez-vous aux résultats de (E2a) pour une liste des fichiers ouverts. Accédez au premier fichier. Le diff indiquera une authentification réussie pour la victime (connexion non modifiée) et l'attaquant (connexion falsifiée), respectivement. Ensuite, accédez au deuxième fichier et examinez la sortie de chaque connexion client à la fin du fichier. Dans la connexion non modifiée, le serveur répondra avec le nom d'utilisateur de la victime, tandis que dans la connexion attaquée, le serveur répondra avec le nom d'utilisateur de l'attaquant. Cela prouve (C4). Pour utiliser scan_util.py, créez le conteneur Docker en exécutant la commande suivante dans le dossier scan
:
docker build . -t terrapin-artifacts/scan-util
Évaluation d'un fichier de résultats zgrab2 :
docker run --rm -v ./sample:/files terrapin-artifacts/scan-util evaluate -i /files/sample.json -o /files/sample.acc.json
Suppression des adresses IP bloquées d'une liste d'adresses IP renvoyée par zmap :
docker run --rm -v ./sample:/files terrapin-artifacts/scan-util filter-blocked-ips -i /files/zmap.csv -o /files/zmap-filtered.csv -b /files/blocklist.txt
Ranger le fichier de résultats zgrab2 en supprimant les entrées avec des échecs de connexion :
docker run --rm -v ./sample:/files terrapin-artifacts/scan-util tidy-zgrab2 -i /files/sample.json -o /files/sample-clean.json
scripts/cleanup-system.sh
qui supprime tous les résultats intermédiaires et termine et supprime tout conteneur en cours d'exécution lié à ces artefacts. Pour reconstruire les images lors de la prochaine exécution d'un script de test, spécifiez l'indicateur --full
. .
├── impl
│ ├── asyncssh # AsyncSSH 2.13.2 (client / server) Dockerfile and additional files
│ ├── dropbear # Dropbear 2022.83 (client / server) Dockerfile and additional files
│ ├── libssh # libssh 0.10.5 (client / server) Dockerfile and additional files
│ ├── openssh # OpenSSH 9.4p1 / 9.5p1 (client / server) Dockerfile and additional files
│ ├── putty # PuTTY 0.79 (client only) Dockerfile and additional files
│ └── build.sh # Script to build all required implementation Docker images for reproducing our results
├── pocs # Proof of concept scripts
│ ├── sqn-manipulations # Scripts related to sequence number manipulation (section 4.1)
│ ├── ext-downgrade # Scripts related to the extension downgrade attack (section 5.2)
│ ├── asyncssh # Scripts related to AsyncSSH vulnerabilities (section 6)
│ ├── Dockerfile # Multistage Dockerfile to build PoC docker images
│ └── build.sh # Script to build all required PoC Docker images for reproducing our results
├── scan # Files related to the internet-wide scan conducted
│ ├── paper # Directory containing the aggregated scan data referenced in the final version of the paper
│ ├── sample # Directory containing an anonymized zgrab2 ssh results sample to use with scan_util.py
│ ├── scan_util.py # Utility script for aggregating zgrab2 ssh results
│ ├── requirements.txt # pip requirements file for scan_util.py
│ └── Dockerfile # Dockerfile to build a docker image running scan_util.py
├── scripts # Scripts for easier reproduction of our results presented in the paper
│ ├── bench-ext-downgrade.sh # Benchmark script to evaluate the success rate of the CBC-EtM variant of the extension downgrade attack
│ ├── cleanup-system.sh # A cleanup script which can be used to containers and images related to these artifacts
│ ├── start-wireshark.sh # A convenience script to start Wireshark capturing on lo interface with SSH decoding and display filter
│ ├── test-asyncssh-rogue-ext-negotiation.sh
│ │ # Test script for the AsyncSSH-specific rogue extension negotiation attack (section 6.1 / figure 6)
│ ├── test-asnycssh-rogue-session-attack.sh
│ │ # Test script for the AsyncSSH-specific rogue session attack (section 6.2 / figure 7)
│ ├── test-ext-downgrade.sh # Test script for the extension downgrade attack (section 5.2 / figure 5)
│ └── test-sqn-manipulation.sh # Test script for sequence number manipulation (section 4.1)
├── traces # PCAP traces of the PoC scripts
├── LICENSE
└── README.md
Les bibliothèques tierces suivantes sont utilisées :