Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Вскрытие червяка

Крис Касперски aka мыщъх

Спецвыпуск Xakep, номер #045, стр. 045-044-2


Конструктивные особенности червя

С анатомической точки зрения червь представляет собой морфологически неоднородный механизм, в котором можно выделить, по меньшей мере, три основных компонента: компактную голову и протяжный хвост с ядовитым жалом. Разумеется, это только схема, и черви совсем не обязаны полностью ей соответствовать.

Необходимость дробления монолитной структуры червя на голову и хвост вызвана ограниченным размером переполняющихся буферов, который в подавляющем большинстве случаев не превышает пары десятков байт. Только самым крохотным и примитивным червям удается втиснуться в этот объем целиком, в остальных же случаях сначала на атакуемую машину забрасывается загрузчик, устанавливающий TCP/IP-соединение и подтягивающий оставшийся хвост, иначе называемый основным телом червя.

Голова червя отвечает за переполнение буфера, захват управления удаленной машиной, установку TCP/IP-соединения и транспортировку хвоста. Образно говоря, голова – это ниндзя, десантирующийся в укрепленный район вражеского подразделения, бесшумно делающий охране харакири, отпирающий ворота и зажигающий посадочный маяк, обеспечивающий приземление основной группы. Как минимум, голова червя включает в себя запрос, посылаемый серверу, срывающий крышу одному из его буферов и передающий управление либо на shell-код, либо на секретную функцию root, которая обеспечивает удаленный доступ к серверу. Голова червя чаще всего пишется на голом ассемблере, а в наиболее ответственных случаях – непосредственно в машинном коде (трансляторы ассемблера не переваривают многих эффективных трюков).

Голова у червя может быть не одна. Тогда он может поражать несколько типов серверов (например, сервера MS SQL, MS IIS и SendMail), значительно расширяя ареал своего обитания. У червя Морриса было две головы – одна поражала finger, другая – sendmail, а MWORM'а – целых пять, что позволяло ему распространятся через web-, ftp-сервера и дыры в демонах rpc, bind и lpd. Love San, Slapper и Slammer имели по одной голове, что совсем не помешало занять им первые места в Top10. Как видно, количество голов само по себе еще ни о чем не говорит, и одна умная голова лучше трех глупых.

Голова червя Code Red, приходящая в первом TCP-пакете запроса

GET /default. ida?

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00= a HTTP 1.0

Content- type: text/ xml,

Content- length: 3379

Хвост червя решает более общие задачи. Оказавшись на территории вероятного противника, спецназ должен первым делом окопаться. Некоторые черви зарываются в исполняемые файлы, прописывая путь к ним в ключе автоматического запуска, некоторые довольствуются одной лишь оперативной памятью, погибая после выключения питания или перезагрузки. И это правильно! Настоящий червь должен вести кочевую жизнь, блуждая от машины к машине, – в этом и есть его предназначение. Как говорится, мавр сделал свое дело и может уходить, а червю предстоит сделать не так уж и много: найти, по меньшей мере, две жертвы, пригодные для внедрения, и забросить в них свою голову (точнее, копии своих голов). Теперь, даже если червь умрет, численность его популяции будет расти в геометрической прогрессии. Ввиду высокой алгоритмической сложности и отсутствия ограничений на предельно допустимый размер, хвост червя чаще всего разрабатывается на языках высокого уровня, например, на языке Си, хотя Форт или Алгол подошли бы ничуть не хуже, но это уже дело вкуса, о котором не спорят (но Си все равно лучше).

Назад на стр. 045-044-1  Содержание  Вперед на стр. 045-044-3