Ошибка Морриса





introduction

articles


КPOBb te4et..
Creative Down
Chill..
Dnevnik Gubnyh
Infernal Flame
IRCZlo
Kazantip '98
Litestep
MSX Culture
Parashoot
SceneUp!
Underground
One day..
Virus inside me
Harmed

interview

Catbones
God Among Lice
Jazztiz
Encore
Nixus
Mutant

lits

Bound
Harmless
Manifesto
Mirage
Nika Bathen 95-97
Alka
Allegory
An other side

tutorials

Textmode Art FAQ
Inet Couriers
NukeM3
MegaDemos Review
Drugz Corner 1
Drugz Corner 2
Linux Corner 1
Linux Corner 2
Linux Corner 3
Linux Corner 4
Linux Corner 5
Linux Corner 6
RTM

download
feedback

home

2 ноября 1988 некий Robert Tappan Morris инфицировал своим свеженаписанным сетевым вирусом довольно большое количество компьютеров, чем сильно прославился и дал по заднице многим сисадминам. По всей стране, в попытках выполнять несуществующие задачи, перегружались и становились абсолютно бесполезными машины типа VAX и Sun 3. Вирус Морриса заражал только эти машины, которые работали под управлением UNIX'a версии 4 BSD. Эффект при заражении был настолько странным, что многие администраторы отключали свои узлы от интернета, дабы обезопаситься от растущей неведомой инфекции.

Так что же это был за неведомый червяк, который плутал и вырубал машины ?

Это была совсем небольшая программа, размером в 99 строк, не включающая в себя обьектные модули. Сам Роберт был 23-летним студентом Корнельского Университета. Благодаря ему, кстати, с этих пор код такого типа стали называть червем. Однако многие заблуждаются, называя червя вирусом. Это не совсем верно, так как червь отличается от вируса самим способом размножения. В отличие то обычного вируса, который в большинстве случаев, при попадании на машину ищет исполняемый файл, который он заражает, расчитывая в дальнейшем на еще большее заражение при запуске этого файла; червь, на самом деле, попав на свежую машину, собирал информацию про окружающие машины, потом переходил на них, компилировался, запускался и опять собирал информацию про соседние машины. Подробнее алгоритм работы червя, мы рассмотрим ниже.

По своей задумке ето была экспериментальная программа. Совершенно очевидно, что выпускать ее в интернет будет большим упущением. Буквально сразу, Роберт понял, что совершил большую ошибку в своей программе, а именно: червь распространялся быстрее, гораздо быстрее, чем предполагал он сам. В это время уже множество машин стали абсолютно непригодны для использования. Как только растерявшийся автор понял, в чем дело, он тут же связался со своим другом в Гарварде, чтобы обсудить решение сложившейся проблемы. Возможно даже, что он послал анонимное сообщение в сеть, адресованное программистам и системным администраторам, обьясняющее, как убить червя и предотвратить дальнейшее заражение. Однако, из-за сильных сбоев в сети, вызванных множественными копиями червя, сообщение так и не смогло выйти за пределы его системы, пока не стало совсем поздно. В это время количество зараженных компьютеров увеличивалось с ужасающей быстротой. Были выведены из строя важные узлы в университетах, сервера военных министерств и множественные медицинские сети.

Как это ни странно, но по всему земному шару, почти сразу, не сговариваясь, началась работа по поимке и обезвреживанию червя. Странность этого в том, этой работой занимались не только администраторы сетей, потенциально подвергающихся опасности заражения, но и множественные добровольные группы. Hескольким людям из Калифорнийского Университета удалось выловить копию червя и они тут же дизассемблировали ее для того, чтобы понять принцип его работы. Параллельно с ними, команды программистов работали безостановочно для того, чтобы написать fix, который бы можно было поставить на машину и обезопасить ее от проникновения вируса. Через двенадцать часов команда из Калифорнии смогла в чем-то продвинуться, и получила информацию о том, как замедлить распространение вируса-червя. Однако борьбе с червем мешал несвоевременный обмен свежей информаций, который возник в результате того, что, испугавшись инфекции, множество серверов просто напросто отключались от сети.

Через несколько дней все постепенно становилось на свои места и сеть возвращалась к своей нормальной работе. Газета New York Times обьявила Роберта автором червя. Robert T. Morris был обвинен в злоупотреблениии компьютером и компьютерном мошенничестве, и был осужден на 3 года испытательного срока, 400 часов испытательных работ и оштрафован на 10050 долларов.

Многие люди осуждают Морриса, что этот человек уничтожил тонны полезной информации, загубил множество компьютеров, разрушил систему всемирного(?) олутинга и, наконец, что из-за него чуть не взорвался последний шаттл и Белый Дом в Вашингтоне. Все время хочется спросить: ребята, откуда у вас такая информация ? Поделились бы источниками..

Давай же реально посмотрим на то, что действительно делал червь:

- Червь не изменял и не удалял файлы.
- Червь нигде не сохранял и никуда не передавал пароли, которые он взламывал Он использовал лишь их при своей работе. (!!)
- Червь не предпринимал никаких попыток захватить полномочия root'a.
- Червь не заносил свои копии в память для того, чтобы запуститься позже.
- Червь не атаковал никаких машин, кроме Sun 3 и VAX работающих под управлением 4 BSD UNIX.
- Червь не атаковал машины, не подключенные к интернету (Модемы, в данной ситуации, не означают подключение к интернету)
- Червь не переносился с компьютера на компьютер на дисках
- И наконец, червь никак не мог "сломать" машину, которую он заражал.

Так что говорить о злостном замысле Морриса, решившего сломать сеть просто глупо. Единственно, надо было немного подумать головой и представить возможный масштаб заражений. Хотя согласитесь, уважаемые, что если сейчас кто нибудь сделает червя, способного выполнять только действия, описанные выше, страшно даже подумать, что может произойти, так как со времен Морриса мало что изменилось, и существует немало подобных дыр в защите.

Разбор кода.

Ознакомившись с историей про Роберта Морриса и его детище, нормальный человек, занимающийся хакингом прежде всего задастся вопросом: а какая реальная польза достижима от червя ? И сразу попадет в точку, так как за своей внешней бесполезностью, червь несет нам очень много полезного. Когда червь попадает на незараженную машину он запускает программу, сканирующую на другие адреса машин, которые червь смог бы заразить. То есть мы можем по цепочке попасть на машину, прямого доступа к которой мы не имеем. Очень удобен тот факт, что нам не нужно за ним следить и как-то его корректировать. Кроме того, после того как червь попал на нужный нам хост, если он попал, и смог запустить утилиту сканирования соседних машин, то все, можно уже заниматься непосредственно локальной работой, например унести нужный нам файл, запустить что нам надо и т.д. Разберем, наконец, подробно алгоритм работы червя.

прим. В квадратных скобках обозначены [имена процессов]

Hачальные действия ( [маскировка] )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

С самого начала, червь изменяет имя процесса, в котором он выполняется на Sh. Такое же имя имеет процесс работающего Bourne Shell'a, то есть процесса запуска шелла. И если системный администратор пробежится по списку выполняющихся процессов, он не увидит ничего необычного.

Совершенно естественно постараться как можно сильнее усложнить попытку получить копию кода червя. Если ето произойдет, человек получивший его, сможет определить как остановить червя, как от него защищатся. Для этой цели, вторая вещь, которую сразу делает червь, это установка размера копий процессов в ноль байт. При определенном размере копии процесса, ядро помещает копию работаюего процесса в определенное место. То есть, если произойдет крушение системы, можно будет взять копию памяти и посмотреть, что же происходило. Установив ето значение в ноль, уже можно не опасаться того, что кто то мозьмет копию кода червя.

Затем червь запоминает текущее системное время для того, чтобы генерировать относительно него случайные числа. Это используется позднее.

Когда червь запускается, он должен запускаться с ключом -p и при необходимости десятичным числом, обозночающим номер процесса, в котором он будет выполнятся. Все программы, которые запускает червь, запускаются с этим параметром. Зачем ? Затем, что после того, как программа загрузится в память, она удалит свою физическую копию с диска, и сам червь, соответственно самоудалится в конце работы. Одновременно с этим, происходит попытка удаления файла /tmp/.dumb .Если червь не смог загрузить нужные ему файлы, он [выходит], если все в порядке, то он переходит к этапу [инициализации].

[Инициализация]
~~~~~~~~~~~~~~~

червь проверяет свою командную строку на наличие в ней хотя бы одного коммандного файла. Если файла нет, он немедлено [выходит].

Затем он проверяет правильность загрузки файла l1.c, который потом используется для заражения других систем. Если файл не загружен, червь [выходит].

Дальше стирается информация в массиве документов, для того, чтобы скрыть все возможные следы своего присутствия.

Дальше червь ищет сетевые интерфейсы на данной машине, а так же флаги и адреса каждого найденного интерфеса. Если ни один интерфейс не найдет, червь [выходит]. Он так же загружает маску сети, чтобы определить адрес в интернете данной подсети.

После этого червь убивает процессы, запущенные с параметром -p, изменяет текущую группу процессов, чтобы избежать самоуничтожения.

Hа этом инициализация окончена, и червь переходит к центральному шаблону, который называется [doit]. По этому шаблону, он пытается найти все хосты, которые имеют соединение с данным. Это первая попытка червя [заразить] остальные машины.

[doit]
~~~~~~

Используя случайное число, червь выбирает, осуществлять ли проверку на себя или нет. В одном случае из семи червь не будет делать проверку. ( Это и явилось ошибкой, в результате которой скорость распространения оказалась слишком большой )

Если червь не осуществляет проверку на себя, то он идет дальше и продолжает свою работу. Ето сделано для того, чтобы червя было сложнее убить.

Тут же предполагается посылка одного байта по адресу 28.32.137.13 (ernie.berkeley.edu), порт 11357. Ето явно не будет работать, так как программа использует команду TCP sendto, вместо UDP datagram. Так, соединение с упомянутым хостом никогда не будет установлено и TCP вывалится с ошибкой "socket not connected". Этот случайный ( один из 15 ) байт должен был контролировать общий прогресс распространения червя в сети.

Дальше червь переходит к [главному циклу]

[Главный Цикл]
~~~~~~~~~~~~~~

Выполнение шаблона [cracksome], где червь определяет хосты, которые он может взломать и проникнуть на них.

Запуск процедуры [other_sleep] на 30 секунд.

Опять запуск процедуры [cracksome].

Затем, червь убивает процесс, в котором он выполняется, перенося свое выполнение в два дочерних процесса. Дочерние процессы имеют ту же информацию и данные, что и главный процесс, но имеют другой идентефикатор, что усложняет попытки выследить червя.

Запуск процедуры [заражения].

[other_sleep] на 120 секунд.

Прежде чем перейти к началу главного цикла, червь проверяет, как долго он работает. Если больше 12 часов, он очищает некоторые хосты из своего списка.

Дальше, червь проверяет глобальную переменную pleasequit. Если она установлена и червь попробовал из своего словаря больше, чем 10 слов, он [выходит].

Процедура cracksome
~~~~~~~~~~~~~~~~~~~

Hулевая фаза.
~~~~~~~~~~~~~

Червь сканирует файл /etc/hosts.equiv, если он существует. Это он делает из соображений, что если аккаунт был взломан на этом хосте, то он может быть взоман и на хосте, который присутствует в списке, находящемся в этом файле.

Дальше, червь сканирует файл /.rhosts, запоминая, какие хосты он может взломать потом.

Дальше он просматривает файл /etc/passwd, где содержатся все аккаунты пользователей, работающих с этим хостом. Этот файл почти всегда открыт для свободного чтения. Это очень большая дыра в безопастности, на которую червь очень расчитывает.

Затем червь использует файл /etc/passwd чтобы найти персональные .forward файлы, которые используются для персональных форвардов почты, чтобы найти дополнительные машины для атаки.

[Первая фаза]
~~~~~~~~~~~~~

Hа этой фазе, червь начинает серьезную работу, по взлому аккаунтов пользователей. Червь подбирает пароль, используя нехитрые правила. подобрав один пароль, червь зашифровывает его, пользуясь своими инструкциями, и сравнивает с зашивфрованным паролем в файле /etc/passwd. Hайдя алгоритм шифровки, червь получает доступ к паролям, без повторных попыток повтора, которые могут привлекать много внимания.

Пароли, используемые червем в первой фазе:

- Hулевой пароль
- Пароль совпадающий с login'ом
- Пароль состоящий из двух login'ов (например victorvictor)
- Второе значение в GECOS строке, найденной в файле /ect/passwd . Чаще всего это кличка.
- Окончание полного имени после имени в GECOS строке. Часто это фамилия пользователя. Если этот фариант не проходит, то попытка повторяется, но первая буква вводится в нижнем регистре.
- Перевернутая "фамилия"
- Первернутый login

Червь атакует 50 аккаунтов таким способом каждый раз, когда вызывается эта процедура, пока не пройдет весб список пользователей. Если червь находит пароль, он вызывает функцию [attack-user], куда он передает пароль, для взлома аккаунта.

Если же червь безрезультатно прошел весь список, он переходит ко [второй фазе].

[Вторая фаза]
~~~~~~~~~~~~~

Червь содержит в себе небольшой словарь слов которые он использует для подбора паролей. Эти слова - известные клички, и наиболее используемые пароли пользователями, которые опасаясь забыть используют довольно часто. После ушпешного подбора, червь вызывает функцию [attack-user] для взлома аккаунта.

После перебора словаря, червь переходит к [третьей фазе]. Для полного перебора всех вариантов, червю требуется примерно 9 часов.

Словарь червя:

"academia", "aerobics", "airplane", "albany", "albatross", "albert", "alex", "alexander", "algebra", "aliases", "alphabet", "amorphous", "analog", "anchor", "andromache", "animals", "answer", "anthropogenic", "anvils", "anything", "aria", "ariadne", "arrow", "arthur", "athena", "atmosphere", "aztecs", "azure", "bacchus", "bailey", "banana", "bananas", "bandit", "banks", "barber", "baritone", "bass", "bassoon", "batman", "beater", "beauty", "beethoven", "beloved", "benz", "beowulf", "berkeley", "berliner", "beryl", "beverly", "bicameral", "brenda", "brian", "bridget", "broadway", "bumbling", "burgess", "campanile", "cantor", "cardinal", "carmen", "carolina", "caroline", "cascades", "castle", "cayuga", "celtics", "cerulean", "change", "charles", "charming", "charon", "chester", "cigar", "classic", "clusters", "coffee", "coke", "collins", "commrades", "computer", "condo", "cookie", "cooper", "cornelius", "couscous", "creation", "creosote" "cretin", "daemon", "dancer", "daniel", "danny", "dave", "december", "defoe" "deluge", "desperate", "develop", "dieter", "digital", "discovery", "disney" "drought", "duncan", "eager", "easier", "edges", "edinburgh", "edwin", "edwina", "egghead", "eiderdown", "eileen", "einstein", "elephant", "elizabeth", "ellen", "emerald", "engine", "engineer", "enterprise", "enzyme", "ersatz", "establish", "estate", "euclid", "evelyn", "extension", "fairway", "felicia", "fender", "fermat", "fidelity", "finite", "fishers", "flakes", "float", "flower", "flowers", "foolproof", "football", "foresight" "format", "forsythe", "fourier", "fred", "friend", "frighten", "fungible", "gabriel", "gardner", "garfield", "gauss", "george", "gertrude", "ginger", "glacier", "golfer", "gorgeous", "gorges", "gosling", "gouge", "graham", "gryphon", "guest", "guitar", "gumption", "guntis", "hacker", "hamlet", "handily", "happening", "harmony", "harold", "harvey", "hebrides", "heinlein", "hello", "help", "herbert", "hiawatha", "hibernia", "honey", "horse", "horus", "hutchins", "imbroglio", "imperial", "include", "ingres", "inna", "innocuous", "irishman", "isis", "japan", "jessica", "jester", "jixian", "johnny", "joseph", "joshua", "judith", "juggle", "julia", "kathleen", "kermit", "kernel", "kirkland", "knight", "ladle", "lambda", "lamination", "larkin", "larry", "lazarus", "lebesgue", "leland", "leroy", "lewis", "light", "lisa", "louis", "lynne", "macintosh", "mack", "maggot", "magic", "malcolm", "mark", "markus", "marty", "marvin", "master", "maurice" "mellon", "merlin", "mets", "michael", "michelle", "mike", "minimum", "minsky", "moguls", "moose", "morley", "mozart", "nancy", "napoleon", "nepenthe", "ness", "network", "newton", "next", "noxious", "nutrition", "nyquist", "oceanography", "ocelot", "olivetti", "olivia", "oracle", "orca", "orwell", "osiris", "outlaw", "oxford", "pacific", "painless", "pakistan", "papers", "password", "patricia", "penguin", "peoria", "percolate", "persimmon", "persona", "pete", "peter", "philip", "phoenix", "pierre", "pizza", "plover", "plymouth", "polynomial", "pondering", "pork", "poster", "praise", "precious", "prelude", "prince", "princeton", "protect", "protozoa", "pumpkin", "puneet", "puppet", "rabbit", "rachmaninoff", "rainbow", "raindrop", "raleigh", "random", "rascal", "really", "rebecca", "remote", "rick", "ripple", "robotics", "rochester", "rolex", "romano", "ronald", "rosebud", "rosemary", "roses", "ruben", "rules", "ruth", "saxon", "scamper", "scheme", "scott", "scotty", "secret", "sensor", "serenity", "sharks", "sharon", "sheffield", "sheldon", "shiva", "shivers", "shuttle", "signature", "simon", "simple", "singer", "single", "smile", "smiles", "smooch", "smother", "snatch", "snoopy", "soap", "socrates", "sossina", "sparrows", "spit", "spring", "springer", "squires", "strangle", "stratford" "stuttgart", "subway", "success", "summer", "super", "superstage", "support" "supported", "surfer", "suzanne", "swearer", "symmetry", "tangerine", "tape" "target", "tarragon", "taylor", "telephone", "temptation", "thailand", "tiger", "toggle", "tomato", "topography", "tortoise", "toyota", "trails", "trivial", "trombone", "tubas", "tuttle", "umesh", "unhappy", "unicorn", "unknown", "urchin", "utility", "vasant", "vertigo", "vicky", "village", "virginia", "warren", "water", "weenie", "whatnot", "whiting", "whitney", "will", "william", "williamsburg", "willie", "winston", "wisconsin", "wizard", "wombat", "woodwind", "wormwood", "yacov", "yang", "yellowstone", "yosemite", "zimmerman"

Третья фаза.
~~~~~~~~~~~~

При безуспешном взломе, червь пробует различные комбинации, оперируя различными регистрами букв. При положительном результате, червь вызывает функцию [attack-user], иначе он возвращается к [главному_циклу] фунции [doit].

[Процедура выхода]
~~~~~~~~~~~~~~~~~~

Червь стирет все свои файлы из памяти, и затем нормально заверщает процесс.

[Other_sleep]
~~~~~~~~~~~~~

В этой процедуре, которая вызывается с аргументом задержки, червь пытается обнаружить присутствие другой копии червя в системе. Червь попеременно переходит в режимы прослушивания и передачи. Если червь червь получает сигнал от другого червя, они обмениваются "магическими числами" для подтверждения обнаружения.

Если другая копия найдена, то устанавливается переменная pleasequit. Однако, эта процедура всегда возвращается туда, откуда она была вызвана. Что же обозначает переменная pleasequit ? Это индикатор того, что червь должен завершить свою работу после того, как очередной цикл процедуры doit будет завершен.

Однако Моррис запрограммировал червя таким образом, что он выйдет только в том случае, если:

- Собран список хостов для дальнейшей аттак.
- Собран список пользователей для аттак.
- Завершены нулевая и первая фазы процедуры [cracksome].
- Опробованы как минимум 10 слов из встроенного словаря.

Общая цель процедуры [other_sleep], предотвратить переполнение системы копиями червей, однако есть некоторые моменты, когда червь не может обнаружить другую копию червя:

- Ситуация, когда несколько червей заразили систему одновременно. Они будут одновременно "слушать" и передавать сигнал присутствия. Совершенно естественно, что они не смогут друг друга обнаружить. Однако, во время режима прослушивания только один червь обнаружит себя как копию. Все остальные черви станут бессмертными.

- Если несколько червей стратуют в присутствии уже выполняющегося червя, и выполняющийся червь исчезнет, так как закроет свой процесс, то все новые черви как бы одержат над ним победу и будут продолжать работать.

- Если сервер очень сильно перегружен, то есть очень велико время lag'a, то черви, при обмене магическими числами, достигнут тамаута, и решив, что другого червя не существует, продолжат работу в нормальном режиме.

Ошибка Морриса заключалась в том, что в одном из семи случаев, червь не обращал внимание на присутствие другого червя, то есть переменная pleasequit никогда не устанавливалась. Однако этого хватило, чтобы система достигала громадных перегрузок очень и очень быстро.

Рассмотрим скорость распространения червя Морриса:

6:00 PM Червь стартовал
8:49 PM Червь заразил первый VAX 8600 (cs.utah.edu)
9:09 PM Червь произвел первую атаку, с зараженного VAX'a
9:21 PM Уровень загруженности в системе достиг 5 ( Для сравнения, загрузка VAX'a ночью обычна имеет коэффициент 1 )
9:41 PM Загрузка достигла 7
10:01 PM Загрузка достигла 16
10:06 PM К этому моменту в системе выполнялось столько копий червя, что ни одни новый процесс не мог стартовать. Hи один пользователь не мог использовать систему.
10:20 PM Системный администратор убил все процессы, занятые червями.
10:41 PM Система была снова заражена и уровень загрузки достиг 27
10:49 PM Системный администратор перегрузил систему. Система стартовала заново.
11:21 PM Заражение повлекло за собой достижения коэффициентся загрузки 37

Отсюда видно, что за 90 минут после заражения, червь сделал систему невозможной к использованию. Примерно по такому же сценарию в Америке было заражено около 6.000 машин. Hе будем сейчас вдаваться в моральные аспекты заражения, однако уже сейчас понятно, что из этого заражения можно вынести много уроков и усовершенствовать многое даже на сегодняшнее время. (21:44:03 17-10-98). А если еще и, совсем не напрягаясь, слегка модифицировать и модернизировать его, то можно получить очень мощное оружие. Но ето совсем другая история, может быть и главная, к которой все предыдущее было понятийным вступлением..

---------------------------------------------------------------------------
Это одна из немногих, я бы даже сказал - та единственная моя статья, когда я горячо жду от тебя какой либо отдачи. Если тебе не лень, то помни, что существует email ter@acps.saog.ac.ru, и то, что меня почти всегда можно найти на каналах #hrg, #ruslinux, #ter находящеся на american EFnet серверах. (irc.emory.edu, irc.arpa.com)

tEr

 


[c] HARM on-line      
1996-1999