]> Untitled Git - articles.git/commitdiff
В первом приближении написал статью про исследование PowerDNS при помощи natch
authorNikolay Shaplov <dhyan@nataraj.su>
Fri, 18 Apr 2025 19:30:46 +0000 (22:30 +0300)
committerNikolay Shaplov <dhyan@nataraj.su>
Fri, 18 Apr 2025 19:30:46 +0000 (22:30 +0300)
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_tcp.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_udp.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_tcp.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_udp.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_2.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_3.png [new file with mode: 0644]
SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.md

diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_tcp.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_tcp.png
new file mode 100644 (file)
index 0000000..7f600f3
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/call_graph_tcp.png" differ
diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_udp.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/call_graph_udp.png
new file mode 100644 (file)
index 0000000..4876a87
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/call_graph_udp.png" differ
diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_tcp.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_tcp.png
new file mode 100644 (file)
index 0000000..220aa55
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/resources_1_tcp.png" differ
diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_udp.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_1_udp.png
new file mode 100644 (file)
index 0000000..a24d8a9
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/resources_1_udp.png" differ
diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_2.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_2.png
new file mode 100644 (file)
index 0000000..fff11dd
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/resources_2.png" differ
diff --git a/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_3.png b/SDL/2025-04 Taint-анализ Ñ\81Ñ\80едÑ\81Ñ\82вами Natch. Ð\97накомÑ\81Ñ\82во Ñ\81 инÑ\81Ñ\82Ñ\80Ñ\83менÑ\82ом на небаналÑ\8cнÑ\8bÑ\85 пÑ\80имеÑ\80аÑ\85/1. PowerDNS.imgs/resources_3.png
new file mode 100644 (file)
index 0000000..c3e5e58
Binary files /dev/null and "b/SDL/2025-04 Taint-\320\260\320\275\320\260\320\273\320\270\320\267 \321\201\321\200\320\265\320\264\321\201\321\202\320\262\320\260\320\274\320\270 Natch. \320\227\320\275\320\260\320\272\320\276\320\274\321\201\321\202\320\262\320\276 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\274 \320\275\320\260 \320\275\320\265\320\261\320\260\320\275\320\260\320\273\321\214\320\275\321\213\321\205 \320\277\321\200\320\270\320\274\320\265\321\200\320\260\321\205/1. PowerDNS.imgs/resources_3.png" differ
index 83617beef9c5e2906cc0cdc7bf84903a0a6ec424..2c6ca64aa4502d2d804a49f04322af14a5fe3737 100644 (file)
@@ -173,7 +173,7 @@ test.example.com.   3600    IN      A       8.8.8.8
 Для этого в скрипт запуска виртуалки в опции настройки сети добавим параметры `hostfwd=udp::15353-:53,hostfwd=tcp::15353-:53`, в результате чего в теории 53 порт внутри виртуалки будет замэплен на порт 15353 хост машины и по TCP и по UDP.
 Проделав это перезапустим виртуалку.
 
-9. Тестирование извне виртуалки
+#### 5. Тестирование извне виртуалки
 
 Зайдя в виртуалку запускаем DNS-свервер как в п.1
 
@@ -213,7 +213,7 @@ dig @127.0.0.1 -p15353 test.example.com
 
 Далее командой `natch replay` снимаем трассу между первым и вторым снепшотом и загружаем ее в snatch.
 
-### Анализ результатов.
+### Анализ результатов
 
 Данные пришедшие в систему 53 TCP или UDP порта, были помечены, и при помощи программы визуализации snatch можно посмотреть как они распространялись по системе
 
@@ -223,3 +223,42 @@ dig @127.0.0.1 -p15353 test.example.com
 
 ![...](1. PowerDNS.imgs/resources_0.png)
 
+заглянув внутрь узла `pdns_server/sockets` мы можем увидеть, что помеченные данные читаются из tcp или udp сокета (в зависимости от того на результаты какого эксперимента мы смотрим) и более ни в какие другие сокеты и файлы не направлялись
+
+![...](1. PowerDNS.imgs/resources_1_tcp.png)
+
+![...](1. PowerDNS.imgs/resources_1_udp.png)
+
+Если нажать на подсвеченный голубым сокет, то в появившейся справа панели можно увидеть, что помеченные данные из сокета читаются, и потом обратно в него частично пишутся, и при этом пределы pdns_server'а не покидают, например не участвуют в запросе к базе данных.
+Интересно, как им это удалось? Вся база записей оказывается загруженной в память и сервер делает `strcmp` с содержимым памяти?
+
+![...](1. PowerDNS.imgs/resources_2.png)
+
+Так же можно увидеть, что сервер по адресу 10.0.2.3 (адрес сетевого интерфейса виртуальной машины) сервер сам себе посылает udp-пакет с неким запросом `security-status`.
+Это явно должно насторожить безопасников, этот механизм должен быть как минимум исследован, и возможно, если результаты исследования окажутся неудовлетворительными, то отключен.
+
+![...](1. PowerDNS.imgs/resources_3.png)
+
+#### Call Graph
+##### TCP
+
+В графе вызовов снятом для случая передачи данных по TCP соединению хорошо виден алгоритм обработки входящего запроса.
+После ряда вызовов посвященных получению данных из сокета, вызывается большой метод отвечающий за разбор входящего пакета `DNSPacket::parse`, после чего происходит обработка входящего запроса `AuthPacketCache::get` (не совсем четко понятно что он делает, надо код читать) и `PacketHandler::doQuestion`, после чего происходит отправка ответа: `ResponseStats::submitResponse`.
+Первичной целью для фаззинга совершенно очевидно следует выбрать функцию `DNSPacket::parse`, которая оказывается первой на острее атаки. Для более глубокого фаззинг исследования следует в качестве цели выбрать всю последовательность обработки запроса включая парсинг и обработку запроса, но не включая отправку ответа.  
+
+![...](1. PowerDNS.imgs/call_graph_tcp.png)
+
+
+##### UDP
+
+Для случая UDP соединения мы видим те же самые функции `DNSPacket::parse`, `AuthPacketCache::get`, `PacketHandler::doQuestion` и `ResponseStats::submitResponse` перемежающиеся вызовами обеспечивающими работу с UDP-сетевым соединением, и завернутые в два потока выполнения. 
+По какой-то причине для работы с UPD-соединением была выбрана многопоточная архитектура. Видимо в этом был какой-то практический смысл.
+Принципиально новых элементов в поверхность атаки при обработке UDP-соединения обнаружено не было.
+
+![...](1. PowerDNS.imgs/call_graph_udp.png)
+
+
+### Выводы
+
+Natch достаточно хорошо показал себя как инструмент для начального знакомства с ранее неизвестным продуктом, а так же позволил быстро проанализировать потенциальную поверхность атаки.
+Natch должен быть незаменимым инструментом для организаций занимающихся исследованием безопасности большого количества стороннего кода.