Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / практический хакинг.pdf
Скачиваний:
24
Добавлен:
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

 

 

Теперь мы можем определить наши собственные вызывающие

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

df-x chan

 

o

 

и вызываемые названия объектов приложения,используя аргументы

.

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

e

 

скрипта.Мытакжемоглибыиспользоватьаргументыскриптадляна- писания инструмента,который пытается угадать правильный объект приложения,как если бы мы вводили пароль путем прямого подбора.

Определение структуры запроса A-ASSOCIATE

Давайте соберем воедино наш запрос A-ASSOCIATE. Мы определяем его структуру так же, как и в контексте:

-- ASSOCIATE request

local assoc_request = string.pack(">I2 I2 c16 c16 c32 c" .. application_ context:len() .. " c" .. presentation_context:len() .. " c".. userinfo_context:len(),

0x1, -- версия протокола ( 2 байта )

0x0, -- зарезервировано ( 2 байта должны быть равны 0x0 ) called_ae_title, -- заголовок вызываемого AE ( 16 байтов) calling_ae_title, -- заголовок вызывающего AE ( 16 байтов) 0x0, -- зарезервировано ( 32 должны быть равны 0x0 ) application_context,

presentation_context, userinfo_context)

Мы начинаем с указания версии протокола (два байта) , зарезер- вированного раздела (два байта) , заголовка вызываемого объекта приложения (16 байтов) , заголовка вызывающего объекта прило- жения (16 байтов) , другой зарезервированный раздел (32 байта)

итолько что созданные контексты (приложение , презентация

иинформация пользователя ).

Теперь нашему запросу A-ASSOCIATE не хватает только заголовка. Пришловремяиспользоватьфункциюdicom.pdu_header_encode(), ко- торую мы определили ранее, чтобы сгенерировать его:

local status, header = pdu_header_encode(PDU_CODES["ASSOCIATE_REQUEST"], #assoc_request)

-- с заголовком может что-то пойти не так if status == false then

return false, header end

assoc_request = header .. assoc_request

stdnse.debug2("PDU len minus header:%d", #assoc_request-#header) if #assoc_request < MIN_SIZE_ASSOC_REQ then

return false, string.format("запрос ASSOCIATE должен содержать не менее %d байтов и мы пробуем послать %d.", MIN_SIZE_ASSOC_REQ, #assoc_request)

end

Мы создаем заголовок стипом PDU,соответствующим значению запроса A-ASSOCIATE, а затем добавляем тело сообщения . Также добавляем здесь логику проверки ошибок.

146  Глава 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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь можно отправить полный запрос A-ASSOCIATE и прочитать

 

 

 

 

 

m

w Click

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

ответ с помощью ранее определенных функций для отправки и чтеd-f-x chan

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

ния пакетов DICOM:

status, err = send(dcm, assoc_request) if status == false then

return false, string.format("Невозможно отправить запрос ASSOCIATE:%s", err) end

status, err = receive(dcm) if status == false then

return false, string.format("Невозможно прочитать запрос ASSOCIATE:%s", err) end

if #err < MIN_SIZE_ASSOC_RESP then

return false, "Ответ ASSOCIATE слишком короткий." end

Отлично! Далее необходимо определить тип PDU, используемый для принятия или отклонения соединения.

Анализ ответов A-ASSOCIATE

На этом этапе остается единственная задача – проанализировать от-

вет из string.unpack(). Он похож на string.pack(), и мы используем строки формата для определения структуры, которую нужно прочи- тать. В этом случае мы читаем тип ответа (один байт), зарезервиро- ванное поле (один байт), длину (четыре байта) и версию протокола (два байта), в соответствии со строкой формата > B B I4 I2:

local resp_type, _, resp_length, resp_version = string.unpack(">B B I4 I2", err) stdnse.debug1("PDU тип:%d длина:%d Protocol:%d", resp_type, resp_length, resp_version)

Далее проверяем код ответа, чтобы увидеть, соответствует ли он коду PDU для принятия или отклонения ASSOCIATE:

if resp_type == PDU_CODES["ASSOCIATE_ACCEPT"] then stdnse.debug1("Обнаружено сообщение ASSOCIATE ACCEPT!") return true, dcm

elseif resp_type == PDU_CODES["ASSOCIATE_REJECT"] then stdnse.debug1("Обнаружено сообщение ASSOCIATE REJECT!") return false, "получено ASSOCIATE REJECT "

else

return false, "Неопеределенный ответ:" .. resp_type end

end -- end of function

Если мы получим сообщение о принятии ASSOCIATE, мы вернем значение true; в противном случае – false.

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

 

 

 

 

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

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

t

 

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

 

NOW!

r

 

 

 

 

 

 

BUY

 

 

Создание окончательного сценария

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

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

description = [[

Пытается обнаружить серверы DICOM (провайдеры служб DICOM) при помощи частичного запроса

C-ECHO.

Запросы C-ECHO также известны как проверочные пакеты DICOM для проверки соединения. Обычно проверочный пакет DICOM формируется так:

*Client -> A-ASSOCIATE request -> Server

*Server -> A-ASSOCIATE ACCEPT/REJECT -> Client

*Client -> C-ECHO request -> Server

*Server -> C-ECHO response -> Client

*Client -> A-RELEASE request -> Server

*Server -> A-RELEASE response -> Client

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

]]

---

--@usage nmap -p4242 --script dicom-ping <target>

--@usage nmap -sV --script dicom-ping <target>

--

 

-- @output

 

-- PORT

STATE SERVICE REASON

--4242/tcp open dicom syn-ack

--|_dicom-ping: провайдер служб DICOM обнаружен

---

author = "Paulino Calderon <calderon()calderonpale.com>"

license = "Same as Nmap--See http://nmap.org/book/man-legal.html" categories = {"discovery", "default"}

local shortport = require "shortport" local dicom = require "dicom"

local stdnse = require "stdnse" local nmap = require "nmap"

portrule = shortport.port_or_service({104, 2761, 2762, 4242, 11112}, "dicom", "tcp", "open")

action = function(host, port)

local dcm_conn_status, err = dicom.associate(host, port) if dcm_conn_status == false then

stdnse.debug1("Association failed:%s", err) if nmap.verbosity() > 1 then

return string.format("Association failed:%s", err) else

return nil end

end

148  Глава 5