Обновить
128K+
20
Angry Agent@angry_agent

Пользователь

144,1
Рейтинг
12
Подписчики
Отправить сообщение

Ситуация просто сюр

Если очень сильно захотят, то могут выпустить серт от УЦ минцифры на домен Ютуба, отдавать на DNS серверах НСДИ IP-шник сервера который будет редиректить на рутуб.

Звучит как какой-то пранк.

Сможет, но если MITM будет только на 443 порту, тогда DoH сервер можно разместить на другом.

Относительно перехвата DNS запросов со стороны операторов связи у меня есть следующие наблюдения:

  1. Эр-телеком: подмены dst адреса нет, при использовании стороннего резолвера используется реально введённый DNS сервер в настройках системы или роутера (это видно по пингу и по всяким различным тестам "DNS утечки"), однако при попытке резолвинга заблокированных доменов по реестру, будет отдаваться IP-адрес заглушки (отдаёт так же только по UDP). Они отдают заглушку даже если резолвить домены извне:

    ~# dig rutracker.org @188.187.188.255 
    
    ; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> rutracker.org @188.187.188.255
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21106
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;rutracker.org.                 IN      A
    
    ;; ANSWER SECTION:
    rutracker.org.          600     IN      A       188.186.146.207
    
    ;; Query time: 46 msec
    ;; SERVER: 188.187.188.255#53(188.187.188.255) (UDP)
    ;; WHEN: Sat Aug 29 12:38:58 MSK 2026
    ;; MSG SIZE  rcvd: 47

    При этом реального DNS сервера на 188.187.188.255 - нет

    ~# dig 2ip.ru @188.187.188.255 
    ;; communications error to 188.187.188.255#53: timed out

    (IP-адрес был взят наугад)

  2. Уфанет: подмены ответа при использовании других резолверов нет, но на операторских DNS серверах заблокированные домены по реестру не резолвятся

  3. Ростелеком: на их резолверах отдаётся в ответе 127.0.0.1 при резолвинге фейсбука или инстаграма, с остальными ресурсами по типу рутрекера всё хорошо, при использовании сторонних серверов отдачи заглушки нет

Принцип работы перехвата DNS эр-телекома и ТСПУ значительно отличаются.

Ничего не мешает поднять свой приватный DoH сервер и пользоваться им (если публичные перебанят, или если ГРЧЦ/ЦМУ ССОП начнёт путём сканирования всего интернета искать DoH сервера дёргая GET/POST /dns-query и блокировать их)

Через DNS тоже можно отдавать A/AAAA записи самого прокси сервера, но в случае использования DoH провести MITM не получится.

А TXT записи резолвятся через восьмёрки в незашифрованном DNS? Если исходящий и входящий трафик проходят через разные ТСПУ, то вряд ли трансляция адресов будет корректно работать в этом случае, ответ придёт далеко не от 8.8.8.8

~# tcpdump -n -i ppp0 host 8.8.8.8 -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
16:31:22.488412 IP (tos 0x0, ttl 2, id 42116, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.30233 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:31:23.586324 IP (tos 0x0, ttl 64, id 30743, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.30233 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:31:23.630545 IP (tos 0x0, ttl 108, id 39417, offset 0, flags [none], proto UDP (17), length 102)
    8.8.8.8.53 > X.X.X.X.30233: 14557 2/0/1 rutracker.org. A 104.21.32.39, rutracker.org. A 172.67.182.196 (74)

Вы можете и самостоятельно экспериментировать, если у вас нет перехвата DNS запросов, то вы можете найти хостинг с подобным явлением из этого списка - https://globalping.io/?measurement=2TnuCfL63NIYzgR1Y001211g2&display=table

Могу лишь предположить, что ТСПУ перестаёт делать DNAT после получения ICMP TTL Exceeded:

~# tcpdump -n -i ppp0 host 8.8.8.8 or icmp -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
16:44:44.926651 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:44.934296 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 195.208.5.1.53:  [|domain]
16:44:45.928461 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:45.933575 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:46.929807 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:46.932393 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:47.931497 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:47.935700 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:48.933436 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:48.934812 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:49.935547 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:49.937371 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:50.937174 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:50.938080 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]
16:44:51.938533 IP (tos 0x0, ttl 2, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53: 58876+ [1au] A? 2ip.ru. (47)
16:44:51.939320 IP (tos 0x0, ttl 254, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    A.A.A.A > X.X.X.X: ICMP time exceeded in-transit, length 36
	IP (tos 0x0, ttl 1, id 52279, offset 0, flags [none], proto UDP (17), length 75)
    X.X.X.X.25212 > 8.8.8.8.53:  [|domain]

Но при резолвинге по несколько раз с TTL 64 в рамках одного соединения отдаёт NXDomain стабильно (за исключением случая кратковременно большого pps/rps, как это описано в статье):

~# tcpdump -n -i ppp0 host 8.8.8.8 -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
16:42:40.789678 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:40.800943 IP (tos 0x0, ttl 60, id 45883, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:41.790464 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:41.801422 IP (tos 0x0, ttl 60, id 45984, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:42.792903 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:42.803986 IP (tos 0x0, ttl 60, id 46022, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:43.794361 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:43.812382 IP (tos 0x0, ttl 60, id 37938, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:44.796254 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:44.807262 IP (tos 0x0, ttl 60, id 46353, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:45.797252 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:45.814865 IP (tos 0x0, ttl 60, id 38123, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:46.799729 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:46.818311 IP (tos 0x0, ttl 60, id 38189, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)
16:42:47.801971 IP (tos 0x0, ttl 64, id 3983, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.29231 > 8.8.8.8.53: 14557+ [1au] A? rutracker.org. (54)
16:42:47.819693 IP (tos 0x0, ttl 60, id 38337, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.29231: 14557 NXDomain* 0/0/1 (42)

По пути у меня нет узлов, которые бы не отдавали ICMP TTL Exceeded.

Если учитывать текущую техническую реализацию (а реализовано оно усечённым, легковесным и одновременно странным DNAT), то 443 порт должен уходить на какой-то сторонний прокси сервер в интернете, этот самый прокси должен по SNI отрезолвить домен, в результате чего исходный IP-адрес клиента просто потеряется (если его не добавлять отдельным заголовком конечно), это сломает веб-ресурсы, которые доступны только по белым спискам src адресов.

Если конечно, ТСПУ не научится в полноценный MITM в рамках TLS без потерь IP-адресов, или если провайдер не разместит прокси сервера у себя.

Получил NXDomain при отправке DNS запроса через 3 секунды после рандомного пакета:

~# tcpdump -n -i ppp0 host 8.8.8.8 -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
14:45:49.622629 IP (tos 0x0, ttl 2, id 30900, offset 0, flags [none], proto UDP (17), length 922)
    X.X.X.X.51228 > 8.8.8.8.53: 42463 updateA YXRRSet-$ [3055q], [|domain]
14:45:52.719270 IP (tos 0x0, ttl 64, id 3061, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.51228 > 8.8.8.8.53: 35076+ [1au] A? rutracker.org. (54)
14:45:52.730385 IP (tos 0x0, ttl 60, id 47761, offset 0, flags [none], proto UDP (17), length 70)
    8.8.8.8.53 > X.X.X.X.51228: 35076 NXDomain* 0/0/1 (42)

Интервала как такового нет, даже через 1 секунду такой же результат

С реальным DNS запросом при TTL 2 такая же ситуация, подождал целую минуту, а в ответ пришли настоящие IP-адреса:

~# tcpdump -n -i ppp0 host 8.8.8.8 -v
tcpdump: listening on ppp0, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
14:51:29.036601 IP (tos 0x0, ttl 2, id 63092, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.40231 > 8.8.8.8.53: 35076+ [1au] A? rutracker.org. (54)
14:52:29.133634 IP (tos 0x0, ttl 64, id 37612, offset 0, flags [none], proto UDP (17), length 82)
    X.X.X.X.40231 > 8.8.8.8.53: 35076+ [1au] A? rutracker.org. (54)
14:52:29.300782 IP (tos 0x0, ttl 109, id 5868, offset 0, flags [none], proto UDP (17), length 102)
    8.8.8.8.53 > X.X.X.X.40231: 35076 2/0/1 rutracker.org. A 104.21.32.39, rutracker.org. A 172.67.182.196 (74)


Проверил резолвинг TXT записей, они не перехватываются (DNAT не происходит)

Во будет анекдот, если 9.9.9.9 начнут перехватывать, а потом у него снова всё сломается)

В данном случае ТСПУ не занимается подделкой DNS ответа, он просто меняет dst адрес на НСДИ при выходе (только при условии, что в пакете содержится именно DNS запрос). У моего провайдера ТСПУ стоит после BRAS'a (PPPoE сервер фактически), у меня белый адрес, соответственно провайдерского CG-NAT в моём случае нет.

Я пробовал так же из интернета отправить самому себе DNS ответ заблокированного домена подделав src адрес на 8.8.8.8, подмены DNS ответа не произошло.

А запросы к корневым серверам ещё не перехватывают?

Пока перехватывают только определённые DNS сервера

Информация

В рейтинге
41-й
Зарегистрирован
Активность

Специализация

Системный администратор, DevOps-инженер
Средний
Linux
Git
Python
SQL
Docker
Nginx
Bash
Ubuntu
Ansible
GitLab