У меня есть мантра, нельзя сломать то, что нельзя построить, ну конечно можно, но гораздо проще, если умеешь это строить. Возьмем веб-приложения. Много лет назад у меня был RCE на Redis, потому что я знал, как его настраивать; возьмем AD — поскольку я рано развернулся в Azure, я знал несколько ошибок, которые позволили мне перенять традиционную AD из Azure, и, наконец, создав свою собственную систему Unix, я смог определить ряд приватных. escs, просто смонтировав файловые системы или изменив основные стартовые библиотеки и т. д. Дело в том, что если вы можете это сделать, вы можете сломать это.
Частью создания чего-то является понимание этого, сегодня мы попытаемся понять основной компонент Unix, Glibc, что он делает, и рассмотрим предыдущие проблемы безопасности, которые затронули их, и другие эксплойты, которые злоупотребляют им. Я надеюсь, что все перечисленные двоичные файлы, библиотеки и каталоги будут полезны для людей, которые ищут хорошие цели для фаззинга или места для статического анализа кода.
Glibc
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет базовые процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и т.д.
Установленные двоичные файлы
пойматьсегв
Может использоваться для создания трассировки стека, когда программа завершается с ошибкой сегментации.
генкат
Генерирует каталоги сообщений
getconf
Отображает значения конфигурации системы для конкретных переменных файловой системы.
получить
Получает записи из административной базы данных
значок
Выполняет преобразование набора символов
iconconfig
Создает быстро загружаемые файлы конфигурации модуля icon
ldconfig
Настраивает привязки среды выполнения динамического компоновщика.
лдд
Отчеты о том, какие общие библиотеки требуются каждой данной программе или общей библиотеке.
lddlibc4
Помогает ldd с объектными файлами
регион
Выводит различную информацию о текущей локали
localedef
Компилирует спецификации локали
сделаноb
Создает простую базу данных из текстового ввода
мтрейс
Читает и интерпретирует файл трассировки памяти и отображает сводку в удобочитаемом формате.
nscd
Демон, обеспечивающий кеширование наиболее распространенных запросов службы имен.
pldd
Перечисляет динамические общие объекты, используемые запущенными процессами.
слн
Статически связанная программа ln
сотрусс
Отслеживает вызовы процедур общей библиотеки указанной команды
sprof
Читает и отображает данные профилирования общих объектов.
tzselect
Спрашивает пользователя о местоположении системы и сообщает соответствующее описание часового пояса.
xtrace
Отслеживает выполнение программы, печатая текущую выполняемую функцию
сдамп
Дампер часовых поясов
Зик
Компилятор часового пояса
Установленные библиотеки
ld-2.28.so
Вспомогательная программа для исполняемых файлов общей библиотеки
libBrokenLocale
Используется внутри Glibc как грубый взлом для запуска сломанных программ (например, некоторых приложений Motif). См. комментарии в glibc-2.28/locale/broken_cur_max.c
для получения дополнительной информации
libSegFault
Обработчик сигнала ошибки сегментации, используемый catchsegv.
libanl
Библиотека асинхронного поиска имен
libc
Основная библиотека C
libcidn
Используется внутри Glibc для обработки интернационализированных доменных имен в функции getaddrinfo()
.
libcrypt
Библиотека криптографии
libdl
Библиотека интерфейса динамической компоновки
libg
Пустая библиотека, не содержащая функций. Раньше это была библиотека времени выполнения для g++.
libieee
Связывание в этом модуле устанавливает правила обработки ошибок для математических функций, определенные Институтом инженеров по электротехнике и электронике (IEEE). По умолчанию используется обработка ошибок POSIX.1.
libm
Математическая библиотека
libmcheck
Включает проверку выделения памяти при подключении к
libmemusage
Используется memusage для сбора информации об использовании памяти программой.
libnsl
Библиотека сетевых сервисов
libnss
Библиотеки коммутатора службы имен, содержащие функции для разрешения имен хостов, имен пользователей, имен групп, псевдонимов, служб, протоколов и т. д.
libpthread
Библиотека потоков POSIX
libresolv
Содержит функции для создания, отправки и интерпретации пакетов на серверы доменных имен в Интернете.
librpcsvc
Содержит функции, предоставляющие различные службы RPC.
librt
Содержит функции, предоставляющие большинство интерфейсов, указанных в расширении реального времени POSIX.1b.
libthread_db
Содержит функции, полезные для создания отладчиков многопоточных программ.
libutil
Содержит код для «стандартных» функций, используемых во многих различных утилитах Unix.
Каталоги
/usr/include/arpa /usr/include/bits /usr/include/gnu /usr/include/net /usr/include/netash /usr/include/netatalk /usr/include/netax25 /usr/include/neteconet /usr/include/netinet /usr/include/netipx /usr/include/netiucv /usr/include/netpacket /usr/include/netrom /usr/include/netrose /usr/include/nfs /usr/include/protocols /usr/include/rpc /usr/include/rpcsvc /usr/include/sys /usr/lib/audit /usr/lib/gconv /usr/lib/locale /usr/libexec/getconf /usr/share/i18n /usr/share/zoneinfo /var/cache/nscd /var/lib/nss_db
Уязвимости
Топ 10 критических
- CVE-2015–0235: переполнение буфера динамической памяти в функции __nss_hostname_digits_dots в glibc 2.2 и других версиях 2.x до 2.18 позволяет злоумышленникам, зависящим от контекста, выполнять произвольный код с помощью векторов, связанных с функция (1) gethostbyname или (2) gethostbyname2, также известная как GHOST.
- CVE-2017–16997: elf/dl-load.c в библиотеке GNU C (также известной как glibc или libc6) 2.19–2.26 неправильно обрабатывает RPATH и RUNPATH, содержащие $ORIGIN для привилегированного (setuid или AT_SECURE). ), которая позволяет локальным пользователям получать привилегии через библиотеку троянского коня в текущем рабочем каталоге, связанные с функциями fillin_rpath и decompose_rpath. Это связано с неверным истолкованием пустого токена RPATH/RUNPATH как каталога ./. ПРИМЕЧАНИЕ: эта конфигурация RPATH/RUNPATH для привилегированной программы, по-видимому, очень необычна; скорее всего, такая программа не входит ни в один распространенный дистрибутив Linux.
- CVE-2014–9402: реализация getnetbyname nss_dns в библиотеке GNU C (она же glibc) до версии 2.21, когда серверная часть DNS включена в конфигурации переключателя службы имен, позволяет удаленным злоумышленникам вызывать отказ в обслуживании (бесконечный цикл) путем отправки положительного ответа во время обработки сетевого имени.
- CVE-2017–8804: Функции xdr_bytes и xdr_string в библиотеке GNU C (она же glibc или libc6) 2.25 неправильно обрабатывают ошибки десериализации буфера, что позволяет удаленным злоумышленникам вызвать отказ в обслуживании (виртуальный выделение памяти или потребление памяти, если параметр overcommit не используется) через созданный UDP-пакет на порт 111, проблема, связанная с CVE-2017–8779.
- CVE-2000–0335: преобразователь в glibc 2.1.3 использует предсказуемые идентификаторы, что позволяет локальному злоумышленнику подделывать результаты DNS-запроса.
- CVE-2002–0684:Переполнение буфера в функциях преобразователя DNS, выполняющих поиск сетевых имен и адресов, которые используются в BIND 4.9.8 и перенесены в glibc 2.2.5 и более ранние версии, позволяет удаленно DNS-серверы для выполнения произвольного кода через подпрограмму, используемую такими функциями, как getnetbyname и getnetbyaddr.
- CVE-2003–0028: Целочисленное переполнение в функции xdrmem_getbytes() и, возможно, других функциях библиотек XDR (внешнее представление данных), производных от SunRPC, включая libnsl, libc, glibc и dietlibc. , позволяет удаленным злоумышленникам выполнять произвольный код с помощью определенных целочисленных значений в полях длины, что является другой уязвимостью, чем CVE-2002–0391.
- CVE-2010–0015: nis/nss_nis/nis-pwd.c в библиотеке GNU C (она же glibc или libc6) 2.7 и Embedded GLIBC (EGLIBC) 2.10.2 добавляет информацию из пароля .adjunct.byname сопоставляется с записями в карте passwd, что позволяет удаленным злоумышленникам получать зашифрованные пароли учетных записей NIS, вызывая функцию getpwnam.
- CVE-2012–4412: Целочисленное переполнение в string/strcoll_l.c в библиотеке GNU C (она же glibc или libc6) 2.17 и более ранних версий позволяет контекстно-зависимым злоумышленникам вызвать отказ в обслуживании (сбой ) или, возможно, выполнить произвольный код через длинную строку, которая вызывает переполнение буфера кучи.
- CVE-2014–4043: функция posix_spawn_file_actions_addopen в glibc до версии 2.20 не копирует свой аргумент пути в соответствии со спецификацией POSIX, что позволяет злоумышленникам, зависящим от контекста, запускать уязвимости использования после освобождения.
Использование GLibC в наших интересах
Атака возврат к libc — это атака компьютерной безопасности, обычно начинающаяся с переполнения буфера, при котором подпрограмма возврат адреса в стеке вызовов заменяется адресом подпрограммы, которая уже присутствует в исполняемой памяти процесса, обходя функцию неисполняемого бита (если она есть) и избавляя злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки в дикой природе был предоставлен Александром Песляком в списке рассылки Bugtraq в 1997 году.
В POSIX-совместимых операционных системах стандартная библиотека C (
libc
) обычно используется для обеспечения стандартной среды выполнения для программ, написанных на языке программирования C. Хотя злоумышленник может заставить код возвращаться куда угодно, наиболее вероятной целью являетсяlibc
, так как он почти всегда связан с программой и предоставляет злоумышленнику полезные вызовы (такие как функцияsystem
, используемая для выполнения команд оболочки).