취약점

공격자는 rootkit 설정 파일들을 서버 관리자가 쉽게 발견하지 못하도록 /dev 디렉터리에 device 파일인 것처럼 위장하는 수법을 많이 이용함

따라서 /dev 안에 일반 파일이 있는 지 확인한다.

 

더보기

/dev 디렉터리

: 논리적 장치 파일을 담고 있는 /dev 디렉터리는 /devices 디렉터리에
있는 물리적 장치 파일에 대한 심볼릭 링크임. 예를 들어 rmt0를 rmto로 잘못 입력한
경우 rmto 파일이 새로 생성되는 것과 같이 디바이스 이름 입력 오류 시 root 파일
시스템이 에러를 일으킬 때까지 /dev 디렉터리에 계속해서 파일을 생성함.

 

 

 

보안조치

◾ 일반 파일 존재 유무를 확인

[root@localhost dev]# find /dev -type f -exec ls -l {} \;

결과는 일반 파일이 없다! 

 

◾ major, minor number을 가지지 않는 device일 경우 삭제

일반적으로 디바이스 파일은 권한앞에 c가 붙고 5번째 인자에 Major Number와 이어서 Minor Number가 붙는다.

만약 위 넘버가 설정되어있지 않다면 비정상적인 파일이라고 볼 수 있다.

더보기

Major Number와 Minor Number

커널이 디바이스 드라이버를 식별하는 번호이며 드라이버가 개별 호출을 식별하는 번호이다.

ex) 프린터를 이용할 경우 주변장치인 프린터는 /dev에 연결되고 디바이스 드라이버에 의해 호출된다.

다만 사용자가 어떤 장치(프린터이냐 스캐너이냐)를 호출한 것인지 알려주는 것이 전자이고 프린터 내에 여러 통신 중 특정 통신을 식별하는 것이 후자이다. 

 

<참조 ssmsig.tistory.com/109 >

 

 

마무리

공격자는 해킹툴을 PC내 특정 저장소에 숨겨두고자 한다. /dev는 해커들이 찾는 피난처라고 보인다.

취약점

1. world writable은 파일의 내용을 소유자나 그룹 외 모든 사용자에 대해 쓰기가 허용된 파일이다.

시스템 파일과 같은 중요 파일에 설정이 될 경우, 악의적인 사용자가 해당 파일을 마음대로 파일을 덧붙이거나 지울 수 있게 되어 시스템의 무단 접근 및 시스템 장애를 유발할 수 있음

따라서 "world writable"파일 존재 시 사용 목적을 확실히 알고 불필요 시 삭제한.

 

2. 리눅스에서 각 사용자는 환경 변수를 가진다. 이 파일을 통해 특정 명령어의 참조 우선순위를 지정할 수 있다.

비인가자가 이 파일을 변조하여 의도되지 않은 명령어 수행이 가능하다.

따라서 관리자 또는 사용자 이외 쓰기 권한이 부여되지 않도록 한다.

 

더보기

환경변수 파일 종류

/etc/profile / (홈디렉토리).profile / .kshrc / .cshrc / .bashrc / .bash_profile / .login / .exrc / .netrc

 

 

보안조치

◾ Other에게 2(쓰기권한)이 부여된 파일을 검색

[root@localhost ~]# find / -type f -perm -2 -exec ls -l {} \;

 

◾ ls -l "환경변수 파일"

쓰기권한이 사용자 이외에 부여되어있는 지 확인

[root@localhost ~]# ls -l .bashrc 
-rw-r--r--. 1 root root 176 12월 29  2013 .bashrc

 

 

취약점

SUID, SGID 파일의 접근권한이 적절하지 않을 경우 roo권한 탈취가 발생할 수 있다.

◾ Sticky bit #

더보기

SUID와 SGID 정의

SUID : 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유자의 권한을 얻게 됨

SGID : 파일 소유 그룹의 권한을 얻게 됨

 

 

실습

일반 유저가 shadow파일을 열람할 수 없다. 하지만 파일의 소유자가 root이면서 SetUID설정이 되면

열람이 가능해진다. 이것은 일시적으로 root의 권한을 부여받기 때문이다.

[test@localhost /]$ cat /etc/shadow
cat: /etc/shadow: 허가 거부
[root@localhost /]# su root
[root@localhost /]# ls -l /usr/bin/cat
-rwxr-xr-x. 1 root root 54080  8월 20  2019 /usr/bin/cat

[root@localhost /]# chmod 4755 /usr/bin/cat
[root@localhost /]# ls -l /usr/bin/cat
-rwsr-xr-x. 1 root root 54080  8월 20  2019 /usr/bin/cat

[root@localhost /]# su test
[test@localhost /]$ cat /etc/shadow
root:$6$kZXbeAFq$bpGsWrBsetT5c5DYgmhQWV3bd3siNkf2dGd6wAd3G.HIthFTVBFoReYd.UUUE47eSi70D5qEuKnAgF81:18712:1:60:7:::

 

 

보안조치

◾ SetUID(4000)와 SetGID(2000)가 설정된 파일을 조회하는 명령어(-4000는 4000 이상을 의미)

[root@localhost ~]# find / -user root -type f \( -perm -4000 -o -perm -2000 \) -exec ls -al {} \;

 

◾ SetUID, SetGID 제거 명령어

[root@localhost ~]# ls -l /usr/bin/vi
-rwsr-xr-x. 1 root root 928056 10월 14 01:13 /usr/bin/vi
[root@localhost ~]# chmod -s /usr/bin/vi
[root@localhost ~]# ls -l /usr/bin/vi
-rwxr-xr-x. 1 root root 928056 10월 14 01:13 /usr/bin/vi

 

 

마무리

SetUID는 권한을 다루기때문에 꼭 확인해주어야 하고 주기적인 검사를 위한 cron을 이용하는 것이 좋다.

 

 

취약점

1. 사용자가 없는 파일은 관리가 되지 않아 공격자의 도구로 사용될 수 있다. 따라서 NOUSER 파일은 삭제해주자!

2. 시스템의 중요 파일의 권한 관리가 미비할 경우 내부 자원의 유출 및 변조와 서비스 오작동을 초래할 수 있다.

 

보안조치

사용자가 없는 파일은 지워준다.

#find / -nouser -exec rm {} \;
#find / -nogroup -exec rm {} \;

 

/etc/passwd파일의 소유자가 관리자인 것과 권한이 644로 설정되어있는지 확인한다.

"/etc/passwd" 파일의 변조가 가능할 경우 shell변조, 사용자 추가/삭제, root 권한 획득이 가능함

[root@localhost ~]# ls -la /etc/passwd 
-rw-r--r--. 1 root root 2456  1월  5 23:41 /etc/passwd

 

■ /etc/shadow 파일의 소유자가 관리자인 것과 오직 읽기 권한만 할당되어있는지 확인한다.

"/etc/shadow" 파일은 시스템 모든 계정의 암호화된 패스워드가 저장된 파일이다. 따라서 관리자만이 열람할 수 있도록 한다.

[root@localhost ~]# ls -la /etc/shadow
-r--------. 1 root root 1501  1월  5 23:41 /etc/shadow

 

"/etc/hosts" 파일의 소유자가 관리자인 것과 권한이 600인지 확인한다.

"/etc/hosts" 파일은 웹페이지의 IP주소를 찾을 때 사용되며 DNS 서버보다 우선한다. 이 파일이 변조되면 악성 사이트로 접속되는 파밍 공격 등에 악용될 수 있다.

[root@localhost ~]# ls -la /etc/hosts
-rw-------. 1 root root 158  6월  7  2013 /etc/hosts

 

"/etc/(x)inetd.conf" 파일의 소유자가 관리자인 것과 권한이 600인지 확인한다.

위 파일은 슈퍼데몬 설정 파일로써, 비인가자에게 쓰기 권한이 부여되어있을 경우 root권한으로 불법적인 서비스를 실행할 수 있다.

[root@localhost ~]# ls -la /etc/xinetd.conf 
-rw-------. 1 root root 1001  4월  1  2020 /etc/xinetd.conf

 

"/etc/syslog.conf" 파일의 소유자가 관리자인 것과 권한이 644인지 확인한다.

위 파일은 syslog데몬의 설정 파일로서, 공격자는 파일 변조를 통해 흔적 또는 시스템 오류 사항을 분석하기 어렵게 할 수 있다.

[root@localhost ~]# ls -la /etc/rsyslog.conf 
-rw-r--r--. 1 root root 3232  9월 30 22:19 /etc/rsyslog.conf

 

"/etc/services" 파일의 소유자가 관리자인 것과 권한이 644인지 확인한다.

위 파일은 시스템 내의 모든 서비스에 매칭 되는 포트번호를 정의하는 파일이다. 공격자는 운영 포트 번호를 변경하여 정상적인 서비스를 제한하거나 허용되지 않은 포트를 열어 악성 서비스를 의도적으로 실행할 수 있다.

[root@localhost ~]# ls -la /etc/services 
-rw-r--r--. 1 root root 670293  6월  7  2013 /etc/services

 

 

마무리

위 파일들이 보편적인 설정 파일인 만큼 공격의 노출도 또한 높다. 따라서 권한 관리를 잘해줘야 한다.

취약점

관리자가 명령어(예: ls, mv, cp등)를 수행했을 때 root 계정의 PATH 환경변수에 "." (현재 디렉터리 지칭)이 포함되어 있으면 현재 디렉터리에 명령어와 같은 이름의 악성파일이 실행되어 악의적인 행위가 일어날 수 있음

 

직접해보기

 

기존 환경변수 내용 확인

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

실습을 위해 "." 추가!

[root@localhost ~]# vi /etc/profile
...
export PATH=.:$PATH
...
[root@localhost ~]# source /etc/profile

 

변경된 환경변수 확인

[root@localhost ~]# echo $PATH
.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

 

 

다음과 같이 c프로그램을 짜고 ls라는 이름으로 컴파일!

 

root는 ls를 입력하였으나 환경변수에 .이 선행하므로 공격자가 만들어 놓은 ls명령어를 수행

 

결과

hack파일이 setuid설정을 받아 실행시 root의 권한을 이용할수있게됨

 

 

보안조치

root 계정의 환경변수 설정파일("/.profile", "/.cshrc" 등)과 "/etc/profile" 등에서 PATH 환경변수에 포함되어 있는 현재 디렉터리를 나타내는 "."을 PATH 환경변수의 마지막으로 이동 "/etc/profile", root 계정의 환경변수 파일, 일반계정의 환경변수 파일을 순차적으로 검색하여 확인

 

Unix 서버 취약점 분석, 평가 항목

환경 :

VMware

CentOS Linux release 7.9.2009 (Core)

 

다음 항목을 나만의 리눅스 서버에 적용하자!

 

참조

취약점

- 로그인이 불필요한 계정이나 OS 및 패키지 설치 시 기본적으로 생성되는 계정으로 쉘이 설정되어있을 경우, 공격자는 기본 계정들을 통하여 중요파일 유출이나 악성코드를 이용한 root 권한 획득 등의 공격을 할 수 있음

 

- Session timeout 값이 설정되지 않은 경우 유휴 시간 내 비인가자의 시스템 접근으로 인해 불필요한 내부 정보의 노출 위험이 존재함

 

보안조치

 

1. 로그인이 필요하지 않은 계정에 대해 /etc/passwd에서 /bin/false/bin/nologin 쉘 부여

2. /etc/profile에서 TMOUT=600초(10분) 설정

동안 입력이 없을 경우 접속된 Session을 끊도록 설정

 

1. 사용자 shell 점검

#vi /etc/passwd 

root와 test 계정만 로그인 할 수 있고 이외의 계정은 로그인할 수 없게해주자

 

결과

 

 

2. TMOUT 설정

#vi /etc/profile
#source /etc/profile	//작성했으니 적용해주자!

600초 동안 미입력 상태일 경우 세션을 종료한다

더보기

쉘 종류에 따른 다른 적용방법

<sh, ksh, bash 사용 시>

#cat /etc/profile(.profile)

TMOUT=600

export TMOUT

 

<csh 사용 시>

#cat /etc/csh.login 또는 /etc/csh.cshrc

set autologout=10

 

계정별 적용방법

#cd ~ //홈디렉토리 이동

#vi .bash_profile

TMOUT=600

export TMOUT

결과

telnet이나 ssh 접속 중이라면 600초 이후 자동종료!

취약점

su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우, root 계정 권한을 얻기 위해 패스워드 무작위 대입 공격을 시도하여 root 계정 패스워드가 유출될 위협이 있음

 

따라서, su명령어가 su 관련 그룹에서만 허용되도록 설정하자!

 

보안조치

su 사용자를 지정하는 방법으로는 2가지 방식이 있다. 하나는 "PAM 설정", 두 번째는 "권한 설정"이다.

PAM 설정은 PAM 모듈을 이용하고 권한 설정은 wheel이라는 그룹을 관리하여 이 그룹의 구성원만이 su를 사용할 수 있도록 한다.

여기서는 두 번째 방식을 적용하도록 하겠다!

 

 

■ 먼저는 wheel 그룹을 확인해보자!

[root@localhost ~]# cat /etc/group | grep wheel
wheel:x:10:root,test

구성원으로서 root가 존재한다, test계정을 추가해주었다.

 

■  다음 3가지를 수행

#1 su명령어 위치 확인
[root@localhost ~]# which su
/usr/bin/su
[[root@localhost ~]# ls -l /usr/bin/su
-rwsr-xr-x. 1 root root 32128 10월  1 02:46 /usr/bin/su

#2 그룹변경
[root@localhost ~]# chgrp wheel /usr/bin/su
[root@localhost ~]# ls -l /usr/bin/su
-rwxr-xr-x. 1 root wheel 32128 10월  1 02:46 /usr/bin/su

#3 SetID설정
[root@localhost ~]# chmod 4750 /usr/bin/su
[root@localhost ~]# ls -l /usr/bin/su
-rwsr-x---. 1 root wheel 32128 10월  1 02:46 /usr/bin/su

#3에서 SetUID를 설정해주는 이유는 기본적으로 su명령어는 관리자 권한이 필요하기 때문이다.

따라서, 명령어가 실행될 때만 사용자의 권한을 위임받을 수 있는 setuid를 적용해준 것이다(su 사용자는 현재 root)

*chmod 4750 : other에게 실행권한을 주면 말짱도로묵

 

 

결과

test는 wheel에 속하므로 정상 사용이 되고

test2는 wheel에 속하지 않으니 사용이 안된다!

 

 

참조

취약점

1. root 계정과 동일 UID 계정이 존재하면 비인가자에게 노출되었을 경우, 시스템 권한을 탈취당할 수 있다(UID=0을 일반 계정이 갖는 경우)

2. OS나 Package 설치 시 Default로 생성되는 계정 및 불필요한 계정들이 존재할 경우, 스워드가 무작위 대입 공격에 의해 유출될 수 있다.

3. 시스템에 불필요한 그룹이 존재할 경우, 해당 그룹 소유의 파일이 비인가자에게 노출될 수 있는 위험이 존재함

4. 관리자 그룹에 속한 계정이 비인가자에게 유출될 경우, 시스템 권한이 탈취당 할 수 있다. 

5. 침해사고 이후 추적할 경우, 동일한 UID를 악용한 공격자의 추적이 어려움

 

따라서, UID(0)은 오직 루트에게만 설정하고 기타 사용자와 그룹에 대한 관리를 해주자!

 

 

보안조치

 

■ passwd파일에서 살펴볼것

[root@localhost ~]# vi /etc/passwd
root:x:0:0:root:/root:/bin/bash
test:x:1000:1000::/home/test:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
...

*0은 오직 루트만

*중복UID 없게끔

*디폴트계정은 nologin으로 설정

 

 

■ group파일에서 살펴볼것

[root@localhost ~]# vi /etc/group
root:x:0:
test:x:1000:
test2:x:1001:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
...

*관리자 그룹에 불필요한 계정 없게끔
*불필요한 그룹 없게끔

 

 

참조

취약점

시스템의 사용자 계정 정보가  평문으로 저장되었다면 패스워드가 노출될 수 있음

따라서, 계정 정보를 포함하는 파일에 사용자 계정 패스워드가 암호화되어 있는지 점검하자!

 

보안조치

살펴볼 파일은 2가지로 /etc/passwd, /etc/shadow

각 각 계정 정보와 암호화된 패스워드가 저장된 파일이다.

 

■ 두번째 필드가 x인지 확인!

[root@localhost ~]# vi /etc/passwd
root:x:0:0:root:/root:/bin/bash
test:x:1000:1000::/home/test:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...

*x처리 되었다는 것은 /etc/shadow에 암호를 저장하겠다는 의미

*파일명 : 암호화여부 : UID : GID : 코멘트 : 홈디렉토리 : 쉘 종류

 

 

■ 암호화되어있는지 확인해보자

[root@localhost ~]# vi /etc/shadow
root:$6$8ENNViD/$vfuTIgR7auG3sTACSusNYHypDIUrrbDPeagimsVh96JZ9HDyst1AbtnWkLtWs78V8YmEK3EQWDH.T4icl1qUp1:18625:0:99999:7:::
test:$6$2SxS4Y3U$BobgW3YEDqlf04oy4z7uBR66ZDKJur6APphZpEdkRPCJS6fzo//S6pWwjPpI7REiz6e7WP/4uLPrZPDT6g3pm/:18625:1:60:7:::
test2:$6$B0PgwlUW$OXvi78nRXbCVLJ19.8wrFsJVfLIhBMQutlbE2ncQR9WtDGep793My.sIG2wvYl.OHoRJ/ONAqIZwibfl91upq0:18629:1:60:7:::
bin:*:18353:0:99999:7:::
...

암호화가 되어있는 것을 확인할 수 있다.

$SHA-512 해쉬$솔트 값$암호화된 패스워드

더보기

○ Hash 종류 
- $1 : MD5 
- $2 / $2a / $2y : Blowfish  
- $5 : SHA-256  
- $6 : SHA-512 
○ salt : 동일한 패스워드가 서로 같은 해시 값을 갖지 않도록 사용하는 랜덤 값  
○ hash 결과 : 패스워드 + salt 데이터를 해시 함수에 넣은 결과 값 

출처 : infosecguide.tistory.com/9

 

추가로 pwunconv명령어는 passwd에 암호를 표기하겠다는 뜻이지만

passwd파일이 모든 사용자에게 읽기 권한을 허용하기 때문에 리눅스에서는 자동으로 shadow에 저장되고 있다.

[root@localhost ~]# pwunconv
[root@localhost ~]# vi /etc/passwd
root:$6$8ENNViD/$vfuTIgR7auG3sTACSusNYHypDIUrrbDPeagimsVh96JZ9HDyst1AbtnWkLtWs78V8YmEK3EQWDH.T4icl1qUp1:0:0:root:/root:/bin/bash
test:$6$2SxS4Y3U$BobgW3YEDqlf04oy4z7uBR66ZDKJur6APphZpEdkRPCJS6fzo//S6pWwjPpI7REiz6e7WP/4uLPrZPDT6g3pm/:1000:1000::/home/test:/bin/bash
test2:$6$B0PgwlUW$OXvi78nRXbCVLJ19.8wrFsJVfLIhBMQutlbE2ncQR9WtDGep793My.sIG2wvYl.OHoRJ/ONAqIZwibfl91upq0:1001:1001::/home/test2:/bin/bash

 

참조

+ Recent posts