«Техника сетевых атак»

Вид материалаКраткое содержание

Содержание


Fake HotMail
Рисунок 087 Подделка сайта HotMail
Рисунок 088 Истинный адрес перехода при выделении ссылки с помощью клавиши
Рисунок 089 Выяснение подлинного адреса ссылки
Приложения Технология срыва стека
Эрл Стенли Гарднер “Кот привратника”
Подобный материал:
1   ...   39   40   41   42   43   44   45   46   ...   51

  • Go to
  • "onclick="fake()" onMouseOver="window.status='om';
  • return true">
  • HotMail




    Рисунок 087 Подделка сайта HotMail



    Для введения пользователя в заблуждение требуется подделать: 1) содержимое строки статуса, появляющееся при наведении мыши на ссылку; 2) строку адреса открывшегося окна; 3) заголовок окна; 4) содержимое фальсифицируемой странички.

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

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

    • "onclick="fake()" onMouseOver="window.status='om';
    • return true">


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




    Рисунок 088 Истинный адрес перехода при выделении ссылки с помощью клавиши



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

    • z=window.open("view-source:tw_refs/384/383301/win.php",b,"width=215,height=300,resizable=no");
    • }
    • }




    Результат его работы под Windows 2000 показан на рисунке 085. Нижняя кривая в «Хронологии загрузки ЦП» – это загрузка ядра операционной системы. Через очень короткое время (буквально в течение одной минуты) она приблизится к 100% и с этого момента все станет очень сильно тормозить. Рост потребления памяти не столь значителен, но все равно достаточно ощутим, поскольку количество открытых окон в первом приближении увеличивается в геометрической прогрессии.

    Операционная система Windows 95 (Windows 98) намного хуже справляется с такой атакой и через некоторое время зависает, особенно если создавать окна очень большого размера, например, миллион на миллион пикселей (а большинство браузеров это позволяет).




    Рисунок 085



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

    Приложения




    Технология срыва стека




    • В этой главе:
    • Суть переполнения буфера
    • Состояние стека на момент вызова функции
    • Передача управление коду программы
    • Передача управления на собственный код
    • Ограничения, наложенные на вводимый код и пути их обхода


    а что может человек потерять? Не жизнь, потому что он ею не владеет. Он только берет ее в аренду. Он может потерять лишь деньги, а какого дьявола стоят деньги по сравнению с личностью? Это и есть один из способов прожить жизнь, все из нее извлечь. Человек ее сохраняет или лишается, поставив на карту все.

    Эрл Стенли Гарднер “Кот привратника”


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

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

    Процесс вызова функции, передача параметров и размещения локальных переменных варьируется от языка к языку и зависит от конкретного компилятора, но в целом выглядит приблизительно так: в стек заносятся параметры, и значение регистра-указателя стека уменьшается, т.е. стек растет от больших адресов к меньшим адресам; затем в стек помещается адрес инструкции, следующей за командой вызова подпрограммы (в микропроцессорах серии Intel 80x86 для этой цели служит инструкция CALL) и управление передается вызываемой подпрограмме.

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

    • myfunct()
    • {
    • char a;
    • char buff[5];
    • char b;
    • ...
    • }




    Смещение от кадра стека

    Содержимое ячеек

    0

    A

    1

    buf[0]

    2

    buf[1]

    3

    buf[2]

    4

    buf[3]

    5

    buf[4]

    6

    B

    7

    Адрес возврата

    8…

    Стек функции, вызвавшей myfunt


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

    Пример, приведенный ниже, служит наглядной иллюстрацией ошибки программиста, известной под названием «срыва стека» (на диске, прилагаемом к книге, он расположен в файле “/SRC/buff.demo.c.”)

    • #include
    • #include

    • root()
    • {
    • printf("Hello, Root!\n");
    • }

    • auth()
    • {
    • char user[10];
    • char pass[10];
    • printf("Login:"); gets(&user[0]);
    • printf("Passw:"); gets(&pass[0]);
    • if (!strcmp(&pass[0],"guest"))
    • return 1;
    • return 0;
    • }

    • main()
    • {
    • printf("Buffer Overflows Demo\n");
    • if (auth())
    • printf("Password ok\n");
    • else
    • printf("Invalid password\n");
    • }


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

    Например, если запустить этот пример под управлением Windows 2000, и в качестве имени пользователя ввести строку “1234567890qwerty” операционная система выдаст следующее сообщение, предлагая либо завершить работу приложения, либо запустить отладчик (если он установлен) для выяснения причин сбоя: «Исключение unknown software exception (0xc000001) в приложении по адресу 0x0012ffc0».