Глава 1. Написание безопасных программ ......................................... 31
Введение ............................................................................................................... 32
C/C++ .................................................................................................................... 33
Характеристики языка ...................................................................................... 34
Язык C ........................................................................................................ 34
Язык C++.................................................................................................... 35
Безопасность ............................................................................................... 35
Пример «Здравствуй, мир!» ............................................................................. 36
Типы данных .................................................................................................... 37
Поток управления ........................................................................................... 40
Функции ........................................................................................................... 41
Классы (только C++) ....................................................................................... 42
Пример: ряды Фурье ....................................................................................... 44
Язык Java.............................................................................................................. 48
Характеристики языка ...................................................................................... 49
Объектно-ориентированные возможности .............................................. 49
Платформенная независимость ................................................................. 49
Многопоточность ....................................................................................... 49
Безопасность ............................................................................................... 50
Дополнительные возможности ................................................................. 50
Пример «Здравствуй, мир!» ............................................................................. 50
Типы данных .................................................................................................... 51
Поток управления ........................................................................................... 52
Методы ............................................................................................................. 54
Классы ............................................................................................................... 54
Получение заголовков HTTP............................................................................ 57
Язык C# ................................................................................................................ 59
Основания для перехода на C# ......................................................................... 59
Характеристики языка ...................................................................................... 60
Объектно-ориентированные возможности .............................................. 60
Прочие возможности ................................................................................. 61
Безопасность ............................................................................................... 61
Пример «Здравствуй, мир!» на языке C# ........................................................ 62
Типы данных .................................................................................................... 62
Поток управления ........................................................................................... 64
Методы ............................................................................................................. 66
Классы ............................................................................................................... 66
Потоки в языке C# ........................................................................................... 69
Пример: разбор IP-адреса, заданного в командной строке ........................... 70
Язык Perl .............................................................................................................. 79
Типы данных .................................................................................................... 80
Операторы ........................................................................................................ 82
Пример Perl-сценария ...................................................................................... 84
Анализ ......................................................................................................... 85
Специальные переменные .............................................................................. 86
Сопоставление с образцом и подстановка ...................................................... 87
Модификаторы регулярных выражений ........................................................ 88
Канонические инструменты, написанные на Perl .......................................... 88
Я умею писать на Perl! ...................................................................................... 89
Каноническая атака на Web-сервер ............................................................ 89
Анализ ......................................................................................................... 90
Утилита модификации файла протокола ......................................................... 90
Результат выполнения ................................................................................ 93
Анализ ......................................................................................................... 94
Язык Python ........................................................................................................ 96
Пакет InlineEgg ................................................................................................. 96
Анализ ......................................................................................................... 98
Анализ ......................................................................................................... 99
Резюме ................................................................................................................ 101
Обзор изложенного материала ..................................................................... 103
Ссылки на сайты................................................................................................ 104
Часто задаваемые вопросы ............................................................................ 105
Глава 2. Язык сценариев NASL ............................................................ 107
Введение ............................................................................................................. 108
История .......................................................................................................... 108
Назначение NASL .......................................................................................... 109
Простота и удобство ................................................................................ 109
Модульность и эффективность................................................................ 109
Безопасность ............................................................................................. 110
Ограничения NASL................................................................................... 110
Синтаксис языка NASL ..................................................................................... 110
Комментарии ............................................................................................ 110
Пример правильного комментария ................................................... 110
Примеры неправильных комментариев ............................................ 111
Переменные.............................................................................................. 111
Целые числа ......................................................................................... 111
Строки.................................................................................................. 111
Массивы ............................................................................................... 111
NULL.................................................................................................... 113
Булевские величины ........................................................................... 113
Операторы ................................................................................................ 113
Операторы вне категории .................................................................. 113
Операторы сравнения ......................................................................... 114
Арифметические операторы .............................................................. 114
Операторы работы со строками ........................................................ 115
Логические операторы ........................................................................ 115
Побитовые операторы ........................................................................ 116
Операторы составного присваивания в стиле C ............................... 116
Управляющие конструкции..................................................................... 117
Инструкции if ....................................................................................... 117
Циклы for .............................................................................................. 117
Циклы foreach ....................................................................................... 118
Циклы while ......................................................................................... 118
Циклы repeat-until ............................................................................... 118
Инструкция break ................................................................................ 118
Пользовательские функции ............................................................... 119
Встроенные функции.......................................................................... 120
Инструкция return ............................................................................... 120
Написание сценариев на языке NASL .......................................................... 120
Написание сценариев для личного пользования ........................................ 121
Сетевые функции ..................................................................................... 121
Функции, связанные с протоколом HTTP ................................................ 121
Функции манипулирования пакетами ..................................................... 121
Функции манипулирования строками ..................................................... 122
Криптографические функции ................................................................. 122
Интерпретатор команд NASL .................................................................. 122
Пример................................................................................................. 122
Программирование в среде Nessus ............................................................... 124
Описательные функции ........................................................................... 124
Функции, относящиеся к базе знаний ............................................... 124
Функции извещения о результатах работы ....................................... 125
Пример................................................................................................. 125
Пример: канонический сценарий на языке NASL ....................................... 127
Перенос на язык NASL и наоборот ............................................................... 131
Логический анализ ......................................................................................... 131
Логическая структура программы ............................................................ 131
Псевдокод ................................................................................................. 132
Перенос на NASL ...................................................................................... 133
Перенос на NASL с C/C++ ........................................................................ 134
Перенос с языка NASL .............................................................................. 140
Резюме ................................................................................................................ 142
Обзор изложенного материала ..................................................................... 143
Ссылки на сайты................................................................................................ 144
Часто задаваемые вопросы ............................................................................ 145
Глава 3. BSD!сокеты............................................................................... 147
Введение ............................................................................................................. 148
Введение в программирование BSD-сокетов ............................................. 148
Клиенты и серверы для протокола TCP ........................................................ 149
Компиляция ................................................................................................... 151
Пример выполнения ...................................................................................... 151
Анализ............................................................................................................. 151
Компиляция ................................................................................................... 154
Пример выполнения ...................................................................................... 154
Анализ............................................................................................................. 154
Анализ............................................................................................................. 156
Клиенты и серверы для протокола UDP ....................................................... 156
Компиляция ................................................................................................... 158
Пример исполнения ....................................................................................... 158
Анализ............................................................................................................. 158
Компиляция ................................................................................................... 160
Пример исполнения ....................................................................................... 160
Анализ............................................................................................................. 161
Компиляция ................................................................................................... 163
Пример исполнения ....................................................................................... 163
Анализ............................................................................................................. 163
Компиляция ................................................................................................... 165
Пример исполнения ....................................................................................... 165
Анализ............................................................................................................. 165
Опции сокетов .................................................................................................. 166
Анализ............................................................................................................. 168
Сканирование сети с помощью UDP-сокетов ............................................ 169
Компиляция ................................................................................................... 176
Пример исполнения ....................................................................................... 176
Анализ............................................................................................................. 177
Сканирование сети с помощью TCP-сокетов ............................................. 178
Компиляция ................................................................................................... 188
Пример исполнения ....................................................................................... 188
Анализ............................................................................................................. 189
Многопоточность и параллелизм .................................................................. 191
Резюме ................................................................................................................ 193
Обзор изложенного материала ..................................................................... 193
Ссылки на сайты................................................................................................ 195
Часто задаваемые вопросы ............................................................................ 195
Глава 4. Сокеты на платформе Windows (Winsock) ......................... 197
Введение ............................................................................................................. 198
Обзор Winsock ................................................................................................... 198
Winsock 2.0 ......................................................................................................... 200
Компоновка с использованием Visual Studio 6.0 ........................................... 201
Задание компоновки в исходном коде ......................................................... 201
Анализ............................................................................................................. 203
Пример: скачивание Web-страницы с помощью WinSock ...................... 206
Анализ............................................................................................................. 207
Программирование клиентских приложений ............................................ 207
Анализ............................................................................................................. 210
Программирование серверных приложений.............................................. 211
Анализ............................................................................................................. 214
Написание эксплойтов и программ для проверки наличия
уязвимостей ....................................................................................................... 215
Анализ............................................................................................................. 222
Анализ............................................................................................................. 223
Резюме ................................................................................................................ 224
Обзор изложенного материала ..................................................................... 224
Ссылки на сайты................................................................................................ 225
Часто задаваемые вопросы ............................................................................ 226
Глава 5. Сокеты в языке Java ............................................................... 233
Введение ............................................................................................................. 234
Обзор протоколов TCP/IP ............................................................................... 234
TCP-клиенты .................................................................................................. 235
Компиляция .............................................................................................. 237
Пример выполнения................................................................................. 238
Анализ ....................................................................................................... 238
Разрешение IP-адресов и доменных имен .................................................... 239
Пример выполнения................................................................................. 240
Анализ ....................................................................................................... 240
Пример выполнения................................................................................. 241
Анализ ....................................................................................................... 242
Ввод/вывод текста: класс LineNumberReader ................................................. 242
Компиляция .............................................................................................. 245
Пример выполнения................................................................................. 245
Анализ ....................................................................................................... 245
TCP-серверы ................................................................................................... 246
Компиляция .............................................................................................. 249
Пример выполнения................................................................................. 249
Анализ ....................................................................................................... 249
Использование Web-браузера для соединения с сервером TCPServer1 ....... 250
Работа с несколькими соединениями ............................................................ 251
Компиляция .............................................................................................. 257
Пример выполнения................................................................................. 257
Анализ ....................................................................................................... 258
Программа WormCatcher ................................................................................ 260
Компиляция .............................................................................................. 264
Пример выполнения................................................................................. 264
Анализ ....................................................................................................... 265
Клиенты и серверы для протокола UDP ......................................................... 266
Компиляция .............................................................................................. 271
Пример выполнения................................................................................. 271
Анализ ....................................................................................................... 272
Резюме ................................................................................................................ 275
Обзор изложенного материала ..................................................................... 276
Часто задаваемые вопросы ............................................................................ 277
Глава 6. Написание переносимых программ .................................... 279
Введение ............................................................................................................. 280
Рекомендации по переносу программ между платформами UNIX
и Microsoft Windows ......................................................................................... 280
Директивы препроцессора ............................................................................. 281
Использование директив #ifdef ..................................................................... 281
Определение операционной системы ........................................................... 283
Пример исполнения ................................................................................. 284
Анализ ....................................................................................................... 284
Порядок байтов ............................................................................................. 285
Пример исполнения ................................................................................. 286
Анализ ....................................................................................................... 286
Создание и завершение процессов............................................................... 287
Системный вызов exec .................................................................................... 287
Пример исполнения ................................................................................. 288
Анализ ....................................................................................................... 288
Пример исполнения ................................................................................. 289
Анализ ....................................................................................................... 289
Пример исполнения ................................................................................. 292
Анализ ....................................................................................................... 292
Системный вызов fork ................................................................................... 293
Системный вызов exit .................................................................................... 293
Многопоточность .......................................................................................... 293
Создание потока............................................................................................. 294
Пример исполнения ................................................................................. 295
Анализ ....................................................................................................... 295
Пример исполнения ................................................................................. 296
Анализ ....................................................................................................... 296
Синхронизация потоков ................................................................................ 297
Пример исполнения ................................................................................. 299
Анализ ....................................................................................................... 299
Пример исполнения ................................................................................. 301
Анализ ....................................................................................................... 301
Сигналы .......................................................................................................... 302
Анализ ....................................................................................................... 303
Анализ ....................................................................................................... 304
Работа с файлами ............................................................................................ 304
Анализ ....................................................................................................... 305
Анализ ....................................................................................................... 307
Работа с каталогами ........................................................................................ 307
Анализ ....................................................................................................... 308
Анализ ....................................................................................................... 309
Анализ ....................................................................................................... 311
Библиотеки ..................................................................................................... 311
Динамическая загрузка библиотек ............................................................... 313
Анализ ....................................................................................................... 315
Анализ ....................................................................................................... 316
Программирование демонов и Win32-сервисов .......................................... 317
Пример исполнения ................................................................................. 319
Анализ ....................................................................................................... 319
Анализ ....................................................................................................... 323
Управление памятью ..................................................................................... 324
Анализ ....................................................................................................... 325
Обработка аргументов, заданных в командной строке ................................ 325
Анализ ....................................................................................................... 326
Анализ ....................................................................................................... 328
Пример исполнения ................................................................................. 329
Анализ ....................................................................................................... 329
Целочисленные типы данных ....................................................................... 330
Анализ ....................................................................................................... 331
Резюме ................................................................................................................ 332
Обзор изложенного материала ..................................................................... 332
Часто задаваемые вопросы ............................................................................ 332
Глава 7. Написание переносимых сетевых программ ..................... 335
Введение ............................................................................................................. 336
BSD-сокеты и Winsock ..................................................................................... 336
Требования спецификации Winsock ............................................................. 337
Анализ ....................................................................................................... 338
Подлежащие переносу компоненты ............................................................. 338
Возвращаемые значения ............................................................................... 338
Анализ ....................................................................................................... 339
Анализ ....................................................................................................... 340
Анализ ....................................................................................................... 341
Расширенная информация об ошибках ....................................................... 341
Анализ ....................................................................................................... 342
API................................................................................................................... 343
Расширения, определенные в Winsock 2.0 .................................................... 343
Функции read() и write() ................................................................................ 343
Функция socket() ............................................................................................ 343
Анализ ....................................................................................................... 345
Функция connect() .......................................................................................... 346
Анализ ....................................................................................................... 348
Функция bind() ............................................................................................... 348
Анализ ....................................................................................................... 351
Функция listen() ............................................................................................. 351
Анализ ....................................................................................................... 354
Функция accept() ............................................................................................ 354
Анализ ....................................................................................................... 357
Функция select() .............................................................................................. 358
Анализ ....................................................................................................... 362
Функции send() и sendto() .............................................................................. 363
Анализ ....................................................................................................... 366
Функции recv() и recvfrom() ........................................................................... 366
Анализ ....................................................................................................... 370
Функции close() и closesocket() ...................................................................... 370
Анализ ....................................................................................................... 372
Функция setsockopt() ...................................................................................... 372
Анализ ....................................................................................................... 375
Функции ioctl() и ioctlsocket() ........................................................................ 375
Анализ ....................................................................................................... 377
Простые сокеты ............................................................................................. 378
Обзор API ....................................................................................................... 378
Заголовочные файлы..................................................................................... 379
Заголовок IPv4 ......................................................................................... 379
Заголовок ICMP ........................................................................................ 381
Заголовок UDP .......................................................................................... 381
Заголовок TCP ........................................................................................... 382
Определение локального IP-адреса .............................................................. 383
Запрос у пользователя .................................................................................... 383
Перечисление интерфейсов ...................................................................... 384
Пример исполнения ................................................................................. 388
Анализ ....................................................................................................... 388
Библиотеки pcap и WinPcap ........................................................................ 389
Пример исполнения ................................................................................. 394
Анализ ....................................................................................................... 394
Резюме ................................................................................................................ 396
Обзор изложенного материала ..................................................................... 397
Часто задаваемые вопросы ............................................................................ 397
Глава 8. Написание shell!кода I ........................................................... 399
Введение ............................................................................................................. 400
Что такое shell-код? ......................................................................................... 400
Инструменты ............................................................................................ 401
Язык ассемблера ....................................................................................... 402
Анализ .................................................................................................. 403
Анализ .................................................................................................. 403
Анализ .................................................................................................. 404
Ассемблер в Windows и UNIX .................................................................. 406
Проблема адресации ...................................................................................... 406
Применение команд call и jmp ............................................................... 407
Анализ .................................................................................................. 407
Анализ .................................................................................................. 408
Заталкивание аргументов в стек ............................................................. 408
Проблема нулевого байта ............................................................................... 409
Реализация системных вызовов..................................................................... 410
Номера системных вызовов ........................................................................... 410
Аргументы системных вызовов ............................................................... 411
Анализ .................................................................................................. 411
Анализ .................................................................................................. 412
Анализ .................................................................................................. 412
Значение, возвращаемое системным вызовом ....................................... 413
Внедрение shell-кода в удаленную программу ............................................ 413
Shell-код для привязки к порту ..................................................................... 413
Анализ .................................................................................................. 415
Shell-код для использования существующего дескриптора сокета .............. 415
Анализ .................................................................................................. 416
Внедрение shell-кода в локальную программу ............................................ 417
Shell-код, выполняющий execve ..................................................................... 417
Shell-код, выполняющий setuid ..................................................................... 419
Shell-код, выполняющий chroot .................................................................... 420
Написание shell-кода для Windows ................................................................ 425
Резюме ................................................................................................................ 431
Обзор изложенного материала ..................................................................... 431
Ссылки на сайты................................................................................................ 433
Списки рассылки .............................................................................................. 434
Часто задаваемые вопросы ............................................................................ 434
Глава 9. Написание shell!кода II.......................................................... 437
Введение ............................................................................................................. 438
Примеры shell-кодов ........................................................................................ 438
Системный вызов write .................................................................................. 441
Анализ ....................................................................................................... 442
Анализ ....................................................................................................... 444
Системный вызов execve ................................................................................ 446
Анализ ....................................................................................................... 446
Анализ ....................................................................................................... 447
Анализ ....................................................................................................... 449
Анализ ....................................................................................................... 451
Анализ ....................................................................................................... 453
Анализ ....................................................................................................... 454
Shell-код для привязки к порту ..................................................................... 455
Анализ ....................................................................................................... 456
Системный вызов socket ................................................................................ 458
Анализ ....................................................................................................... 458
Системный вызов bind ................................................................................... 459
Анализ ....................................................................................................... 459
Системный вызов l isten ................................................................................. 460
Анализ ....................................................................................................... 460
Системный вызов accept ................................................................................ 460
Анализ ....................................................................................................... 461
Системный вызов dup2 ................................................................................. 461
Анализ ....................................................................................................... 462
Системный вызов execve ................................................................................ 462
Анализ ....................................................................................................... 462
Анализ ....................................................................................................... 466
Shell-код для обратного соединения ............................................................. 468
Анализ ....................................................................................................... 470
Shell-код для повторного использования сокета .......................................... 471
Анализ ....................................................................................................... 473
Повторное использование файловых дескрипторов .................................. 474
Анализ ....................................................................................................... 474
Анализ ....................................................................................................... 476
Анализ ....................................................................................................... 477
Анализ ....................................................................................................... 478
Анализ ....................................................................................................... 479
Анализ ....................................................................................................... 480
Анализ ....................................................................................................... 480
Кодирование shell-кода .................................................................................. 481
Анализ ....................................................................................................... 482
Анализ ....................................................................................................... 485
Анализ ....................................................................................................... 486
Повторное использование переменных программы ................................ 488
Программы с открытыми исходными текстами ..................................... 488
Анализ ....................................................................................................... 489
Программы с недоступными исходными текстами ................................ 490
Анализ ....................................................................................................... 491
Анализ ....................................................................................................... 492
Shell-код, работающий в разных ОС............................................................. 492
Анализ ....................................................................................................... 493
Как разобраться в работе готового shell-кода?.......................................... 493
Анализ ....................................................................................................... 496
Резюме ................................................................................................................ 499
Обзор изложенного материала ..................................................................... 499
Ссылка на сайты ................................................................................................. 500
Списки рассылки .............................................................................................. 500
Часто задаваемые вопросы ............................................................................ 501
Глава 10. Написание эксплойтов I....................................................... 503
Введение ............................................................................................................. 504
Обнаружение уязвимостей ............................................................................. 504
Эксплойты для атаки на локальные и удаленные программы................. 505
Анализ ....................................................................................................... 507
Атаки на форматную строку ........................................................................... 507
Форматные строки ........................................................................................ 507
Анализ ....................................................................................................... 508
Анализ ....................................................................................................... 509
Исправление ошибки из-за некорректного использования
форматной строки .................................................................................... 510
Пример: уязвимость xlockmore вследствие задания пользователем
форматной строки (CVE-2000-0763) ............................................................. 510
Детали уязвимости.................................................................................... 510
Детали эксплойта....................................................................................... 511
Анализ ....................................................................................................... 513
Уязвимости TCP/IP........................................................................................... 513
Гонки ................................................................................................................... 514
Гонки, связанные с файлами ......................................................................... 515
Гонки, связанные с сигналами ...................................................................... 516
Пример: ошибка в программе man при контроле входных данных ...... 517
Детали уязвимости.................................................................................... 517
Резюме ................................................................................................................ 520
Обзор изложенного материала ..................................................................... 521
Ссылки на сайты................................................................................................ 523
Часто задаваемые вопросы ............................................................................ 523
Глава 11. Написание эксплойтов II ..................................................... 525
Введение ............................................................................................................. 526
Программирование сокетов и привязки к порту в эксплойтах .............. 527
Программирование клиентских сокетов ...................................................... 527
Анализ ....................................................................................................... 528
Анализ ....................................................................................................... 529
Программирование серверных сокетов ....................................................... 529
Анализ ....................................................................................................... 530
Эксплойты для переполнения стека .............................................................. 531
Организация памяти ...................................................................................... 531
Переполнение стека ......................................................................................... 532
Поиск поддающихся эксплуатации переполнений стека в программах
с открытыми исходными текстами .......................................................... 537
Пример: переполнение XLOCALEDIR в X11R6 4.2 .................................... 538
Описание уязвимости .............................................................................. 538
Эксплойт ................................................................................................... 541
Вывод ........................................................................................................ 543
Поиск переполнений стека в программах с недоступными исходными
текстами .................................................................................................... 543
Эксплойты для затирания кучи...................................................................... 544
Реализация Дуга Леа .................................................................................. 545
Анализ ....................................................................................................... 547
Пример: уязвимость, связанная с переполнением буфера
из-за неправильно сформированного клиентского ключа
в OpenSSL SSLv2, CAN-2002-0656 .................................................................. 549
Описание уязвимости .............................................................................. 550
Описание эксплойта ................................................................................. 550
Трудности.................................................................................................. 552
Усовершенствование эксплойта............................................................... 553
Вывод ........................................................................................................ 553
Код эксплойта для переполнения буфера из-за неправильно
сформированного клиентского ключа в OpenSSL SSLv2 ................. 554
Реализация malloc в ОС System V ............................................................ 560
Анализ ....................................................................................................... 562
Анализ ....................................................................................................... 563
Эксплойты для ошибок при работе с целыми числами........................... 564
Переполнение целого числа .......................................................................... 564
Анализ ....................................................................................................... 565
Анализ ....................................................................................................... 567
Обход проверки размера ................................................................................ 567
Анализ ....................................................................................................... 568
Анализ ....................................................................................................... 569
Другие ошибки, связанные с целыми числами ........................................... 569
Пример: уязвимость OpenSSH из-за переполнения целого в процедуре
оклика/отзыва CVE-2002-0639 ........................................................................ 570
Детали уязвимости ......................................................................................... 570
Детали эксплойта....................................................................................... 571
Пример: уязвимость в UW POP2, связанная с переполнением буфера,
CVE-1999-0920 ................................................................................................... 574
Детали уязвимости ......................................................................................... 574
Резюме ................................................................................................................ 584
Обзор изложенного материала ..................................................................... 584
Ссылки на сайты................................................................................................ 585
Часто задаваемые вопросы ............................................................................ 586
Глава 12. Написание эксплойтов III .................................................... 587
Введение ............................................................................................................. 588
Использование каркаса Metasploit Framework............................................. 588
Разработка эксплойтов с помощью каркаса Metasploit .............................. 595
Определение вектора атаки ........................................................................... 596
Нахождение смещения .................................................................................. 597
Выбор вектора управления ............................................................................ 602
Вычисление адреса возврата .......................................................................... 607
Использование адреса возврата ..................................................................... 612
Определение недопустимых символов ......................................................... 614
Определение ограничений на размер............................................................ 615
Дорожка из NOP-команд ............................................................................... 617
Выбор полезной нагрузки и кодировщика .................................................... 619
Интегрирование эксплойта в каркас ......................................................