Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / практический хакинг.pdf
Скачиваний:
23
Добавлен:
19.04.2024
Размер:
31.35 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

нажав Analize > Reload Lua plugins (Анализировать > Перезагрузить

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

плагины Lua).

 

w

 

df-x chan

 

o

 

 

.

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

e

 

Рис.5.8.Контекст информации пользователя –58.Выделенное сообщение имеет размер 62 байта (58 байтов данных,1 байт для типа,1 зарезервированный байт и 2 байта для размера)

Разработка сканера служб DICOM для механизма сценариев Nmap

Ранее в этой главе вы узнали, что DICOM имеет похожую на ping ути- литу, называемую запросом C-Echo, сформированным из нескольких сообщений A-типа. Затем вы создали диссектор Lua для анализа этих сообщений с помощью Wireshark. Теперь вы воспользуетесь Lua для решения другой задачи: написания сканера служб DICOM. Сканер удаленно идентифицирует поставщиков услуг DICOM (DSP) в сетях, чтобы активнотестировать их конфигурации и даже запускать атаки. Поскольку Nmap хорошо известен своими возможностями сканиро- вания,а его скриптовый движок также работает в Lua,это идеальный инструмент для написания такого сканера.

Вэтомупражнениимысосредоточимсянаподмножествефункций, связанных с отправкой частичного запроса C-ECHO.

Написание библиотеки сценариев Nmap для DICOM

Начнем с создания библиотеки Nmap Scripting Engine для нашего кода, связанного с DICOM. Мы будем использовать библиотеку для

138  Глава 5

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

хранения любых функций, используемых при создании и удалении

 

 

 

 

 

m

w Click

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

сокетов,отправке и получении пакетов DICOM,атакжедействиях наd-f-x chan

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

подобие связывания и запросов служб.

Nmap уже включает библиотеки, которые помогут вам выполнять стандартные операции ввода/вывода, обработку сокетов и другие задачи. Найдите минутку, чтобы просмотреть коллекцию библиоте- ки, чтобы знать, что уже доступно. Прочтите документацию по этим скриптам и библиотекам на странице https://nmap.org/nsedoc/.

Обычно библиотеки Nmap Scripting Engine можно найти в папке <установочный каталог>/nselib/. Найдите этот каталог и создайте файл с именем dicom.lua. В этом файле начните с объявления других используемых стандартных библиотек Lua и Nmap Scripting Engine. Также укажите среде имя новой библиотеки:

local nmap = require "nmap" local stdnse = require "stdnse" local string = require "string" local table = require "table"

local nsedebug = require "nsedebug"

_ENV = stdnse.module("dicom", stdnse.seeall)

В этом случае мы будем использовать четыре разные библиотеки: две библиотеки Nmap Scripting Engine (nmap и stdnse) и две стандарт- ные библиотеки Lua (string и table). Библиотеки Lua string и table, что неудивительно, предназначены для операций со строками и таблицами. В основном мы будем использовать обработку сокетов библиотеки nmap, а также stdnse – для чтения пользовательских ар- гументов и печати отладочных операторов, когда это необходимо. Кроме того,мы воспользуемся полезной библиотекой nsedebug, кото- рая отображает различные типы данных в удобочитаемой форме.

Коды и константы DICOM

Теперь давайте определим некоторые константы для хранения ко- дов PDU, значений UUID и минимально и максимально допустимых размеров пакетов.Это позволитписатьболее читаемый код,который легче будет поддерживать. В Lua мы обычно определяем константы прописными буквами:

local MIN_SIZE_ASSOC_REQ = 68 -- Минимальный размер запроса ASSOCIATE local MAX_SIZE_PDU = 128000 -- Максимальный размер любого PDU

local MIN_HEADER_LEN = 6 -- Минимальная длина заголовка DICOM local PDU_NAMES = {}

local PDU_CODES = {} local UID_VALUES = {}

-- Таблица имен PDU для кодов

PDU_CODES =

Анализ сетевых протоколов  139

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

{

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

o

= 0x01,

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

eASSOCIATE_REQUEST

 

.

 

 

 

 

 

e

 

 

 

p

df

 

 

 

 

g

.c

 

 

 

 

p

df

 

 

 

g

.c

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

ASSOCIATE_ACCEPT

= 0x02,

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ASSOCIATE_REJECT

= 0x03,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DATA

= 0x04,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RELEASE_REQUEST

= 0x05,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RELEASE_RESPONSE

= 0x06,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ABORT = 0x07

 

 

 

 

 

 

 

 

 

 

 

 

 

}

--Таблица имен UID для значений

UID_VALUES =

{

VERIFICATION_SOP = "1.2.840.10008.1.1", -- Проверочный класс SOP APPLICATION_CONTEXT = "1.2.840.10008.3.1.1.1", -- Имя контекста приложения DICOM IMPLICIT_VR = "1.2.840.10008.1.2", -- Подразумевает VR Little Endian: Синтаксис по умолчанию для DICOM

FIND_QUERY = "1.2.840.10008.5.1.4.1.2.2.1" -- Корень иноформационной модели запрос/ответ -

FIND

}

--Мы сохраняем имена, используя их коды и ключи для вывода на печать имен типов PDU

for i, v in pairs(PDU_CODES) do PDU_NAMES[v] = i

end

Здесь определены постоянные значения для общих кодов опера- ций DICOM. Мы также определили таблицы для представления раз- личных классов данных через UID и длины пакетов, специфичные для DICOM . Теперь мы готовы начать общение со службой.

Написание функций создания и уничтожения сокетов

Для отправки и получения данных мы будем использовать библиоте- ку скриптового механизма nmap. Поскольку создание и уничтожение сокетов – рутинные операции, рекомендуется написать функции для них в нашей новой библиотеке. Напишем нашу первую функцию dicom.start_connection(), которая создает сокет для службы DICOM:

---

--start_connection(host, port) открывает сокет для службы DICOM

--@param host Host object

--@param port Port table

--@return (status, socket) Если status равен true, сокет возвращает объект

DICOM

--Если status равен false, сокет возвращает сообщение

об ошибке.

---

function start_connection(host, port) local dcm = {}

local status, err

140  Глава 5

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

dcm['socket'] = nmap.new_socket()

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

status, err = dcm['socket']:connect(host, port, "tcp")

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

if(status == false) then

return false, "DICOM: невозможно подключиться к службе: " .. err end

return true, dcm end

Обратите внимание на формат блока NSEdoc в начале функции . Если вы планируете отправить свой скрипт в официальный репози- торий Nmap, вы должны отформатировать его в соответствии с пра- вилами, установленными в стандартах кода Nmap (см. https://secwiki. org/w/Nmap/Code_Standards). Наша новая функция, dicom.start_connection(host, port), получаеттаблицу хоста и порта, содержащую отска- нированную служебную информацию, создает таблицу и назнача- ет поле 'socket' нашему только что созданному сокету . Мы пока опустим функцию close_connection, чтобы сэкономить место, пото- му что это процесс, очень похожий на запуск соединения (вы просто вызываете close() вместо connect()). Когда операция завершается успешно, функция возвращает логическое значение true и новый объект DICOM.

Определение функций для отправки и получения пакетов

DICOM

Аналогичным образом создаем функции для отправки и получения пакетов DICOM:

--send(dcm, data) Отправляет пакет DICOM через открытый сокет

--@param dcm объект DICOM

--@param data данные для отправки

--@return status равен True если данные отправлены корректно, и False в случае ошибки

function send(dcm, data) local status, err

stdnse.debug2("DICOM: Sending DICOM packet (%d bytes)", #data) if dcm["socket"] ~= nil then

status, err = dcm["socket"]:send(data) if status == false then

return false, err

end else

return false, "No socket available" end

return true end

-- receive(dcm) Чтение пакетов DICOM через открытый сокет

Анализ сетевых протоколов  141