본문 바로가기

리눅스 따라하기/Centos7 취약점 점검

13. SetUID, SetGID, Sticky Bit 설정 파일 검사

13. SetUID, SetGID, Sticky Bit 설정 파일 검사

 

centos 7  최소설치 기준 나오는것들

 

 SetUID

SetGID

Sticky_Bit 

 /usr/bin/chfn
/usr/bin/chsh
/usr/bin/fusermount
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/mount
/usr/bin/su
/usr/bin/umount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/passwd
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/usernetctl
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/libexec/dbus-1/dbus-daemon-launch-helper

 /run/log/journal
/run/log/journal/34100cd9036e4e39836fdaba0807866d
/usr/bin/wall
/usr/bin/write
/usr/bin/ssh-agent
/usr/sbin/netreport
/usr/sbin/postdrop
/usr/sbin/postqueue
/usr/libexec/utempter/utempter
/usr/libexec/openssh/ssh-keysign

 /dev/mqueue
/dev/shm
/var/tmp
/var/tmp/systemd-private-f45a5e825def4d36a5d10679471ba435-chronyd.service-HjlReM/tmp
/tmp
/tmp/.ICE-unix
/tmp/.XIM-unix
/tmp/.X11-unix
/tmp/.font-unix
/tmp/.Test-unix
/tmp/systemd-private-f45a5e825def4d36a5d10679471ba435-chronyd.service-4Tz1P4/tmp

 

chmod 100 *

 

 

 

 

 

■ 대상 OS : SunOS, Linux, AIX, HP-UX

 


■ 취약점 개요

    - *SUID(Set User-ID)와 SGID(Set Group-ID)가 설정된 파일은(특히, root 소유의 파일인 경우) 특정 명령어를 실행하여 root 권한 획득 및 정상 서비스 장애를 발생시킬 수 있으며, 로컬 공격에 많이 이용되므로 보안상 철저한 관리가 필요함.

    - root 소유의 SUID 파일의 경우에는 꼭 필요한 파일을 제외하고는 SUID, SGID 속성을 제거해주고, 잘못 설정되어 보안 위협이 되고 있는지 주기적인 진단 및 관리가 요구됨.

    * SUID(Set User-ID) : 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유자의 권한을 얻게 됨.

    * SGID(Set Group-ID) : 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유 그룹의 권한을 얻게 됨.

 


■ 보안대책


    - 양호 : 주요 파일의 권한에 SUID와 SGID에 대한 설정이 부여되어 있지 않은 경우

    - 취약 : 주요 파일의 권한에 SUID와 SGID에 대한 설정이 부여되어 있는 경우

 


■ 조치방법

    1. 불필요한 SUID, SGID 파일 제거

    2. 아래의 목록 이외에 애플리케이션에서 생성한 파일이나, 사용자가 임의로 생성한 파일 등 의심스럽거나 특이한 파일의 발견 시 SUID 제거 필요

 


■ 보안설정 방법

    ◆ OS별 점검 파일 위치 및 점검 방법

        - SunOS, Linux, AIX, HP-UX

          OS별 주요 파일에 대한 SUID/SGID 설정 여부 확인

          #ls -alL [check_file] | awk '{print $1}' | grep -i 's'

 

 

    ※ 주요 파일에 불필요한 SUID/SGID 가 설정된 경우 아래의 보안설정 방법에 따라 SUID/SGID를 제거

 


■ SunOS, Linux, AIX, HP-UX

    1. 제거 방법

       #chmod -s <file_name>

    2. 주기적인 감사 방법

       #find / -user root -type f \( -perm -04000 -o -perm -02000 \) -xdev -exec ls -al {} \;

    3. 반드시 사용이 필요한 경우 특정 그룹에서만 사용하도록 제한하는 방법

       일반 사용자의 Setuid 사용을 제한함 (임의의 그룹만 가능)

       #/usr/bin/chgrp <group_name> <setuid_file_name>

       #/usr/bin/chmod 4750 <setuid_file_name>

 

참고문서

https://explainshell.com/explain?cmd=find+%2F+-type+f+%5C%28+-perm+-04000+-o+-perm+-02000+%5C%29+-xdev+-exec+ls+-alL+%7B%7D+%5C%3B

 

 

지워야 하는 파일들 (리눅스 기준)

/sbin/dump

/usr/bin/lpq-lpd

/usr/bin/newgrp

/sbin/restore

/usr/bin/lpr

/usr/sbin/lpc

/sbin/unix_chkpwd

/usr/bin/lpr-lpd

/usr/sbin/lpc-lpd

/usr/bin/at

/usr/bin/lprm

/usr/sbin/traceroute

/usr/bin/lpq

/usr/bin/lprm-lpd

 

■ 아래의 표에서 파일명을 확인하여 SUID, SGID을 제거하여야 함

 

------------------------------------------------------------------------

 

추가로 찾음

 

[03] suid/sgid 파일 점검
setuid로 설정을 하려면 앞에 4를 붙이고
setgid로 설정을 하려면 앞에 2를 붙이고

stickey bit를 설정하려면 앞에 1을 붙입니다.

즉,
find / -type f -perm -4000
이라는 것은 파일중에 setuid를 찾는다는 것이다.

find / -type f -perm -2000
이라는 것은 파일중에 setgid를 찾는다는 것이다.
참고로 권한(퍼미션) 설정은 4자리입니다.

setuid, setgid를 검색
/bin
/sbin
위 두곳만 검색해 볼께요

find /bin -perm -4000
find /sbin -perm -2000
--------------------------------------
<실습>
suid가 설정된 파일에서 s 비트를 해제해보자.


chmod g-s file2

<설명>
위는 group에 설정된 s 비트를 해제(-)하는 명령어이고, 만약 s 비트를 설정하려면 -s 대신 “chmod g+s”를 실행하면 된다. 도는 s 비트를 해제하려면 아래와 같이 2xxx 대신 0xxx 또는 0을 빼고 실행해도 된다.

# chmod 0700 /usr/bin/wall
# chmod 700 /usr/bin/wall
---------------------------------------

 


***************************************************************************
<TIP>
file 명령어로 –s 옵션을 주면 그 파일에 대한 자세한 정보가 나타난다.
[root@localhost /]# file -s /usr/bin/chage
/usr/bin/chage: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped


/usr/bin/chage (suid)
chage는 유저의 암호 만기일 정보를 변경하거나 조회하는 명령어인데 root만 사용하면 되므로 suid가 설정될 필요 없다.


/usr/bin/gpasswd (suid)
/etc/group이나 /etc/gshadow 파일을 관리할 때 사용되는 명령어인데 잘 사용되지 않으므로 굳이 설정할 필요 없다.


/usr/bin/wall (sgid)
터미널에 연결되어 있는 유저들에게 메시지를 보내고자 할 때 사용되는데, 실제 서버를 이용시 사용될 이유가 없으므로 해제하는 것이 좋다.


/usr/bin/chfn (suid)
finger로 질의시 보이는 정보를 변경하는 명령어인데, finger 자체가 보안 문제등으로 잘 사용되지 않으므로 필요 없다.


/usr/bin/chsn (suid)
bash나 csh등 로그인시 실행되는 쉘을 변경하는 명령어인데, 쉘을 변경 필요가 없다면 필요 없다.


/usr/bin/newgrp (suid)
새로운 그룹으로 로그인하는 명령어인데, 잘 사용되지 않으므로 역시 필요 없다.


/usr/bin/write (sgid)
talk와 같이 다른 유저에게 메시지를 보내는 명령어인데, 서버 운영시 잘 사용되지 않고 필요도 없다.


/usr/bin/at (suid)
at는 cron과 같이 반복적인 작업을 하고자 할 때 사용되는데, at 자체가 cron에 비해 보안 결함이 있고 잘 사용되지 않으므로 필요 없다.


/usr/sbin/usernetctl (suid)
일반 유저가 인터페이스를 제어하도록 하는 명령어인데, 허용할 필요가 없으므로 필요 없다.


/usr/sbin/userhelper (suid)
GUI를 통해 암호를 관리하고자 할 때 필요한데, 서버 운영시 GUI 자체가 보안상 문제가 될 수 있으므로 필요 없다.


/bin/mount (suid)
파일 시스템을 마운트 하고자 할 때 필요한데, 일반 유저에게 마운트 권한을 줄 필요가 없으므로 필요 없다.


/bin/umount (suid)
파일 시스템을 언마운트 하고자 할 때 필요한데, 일반 유저에게 언마운트 권한을 줄 필요가 없으므로 필요 없다.


/usr/sbin/lockdev (sgid)
devices를 잠글 때 필요하며 lock 이라는 그룹 권한으로 설정되어 있는데, 그대로 두는 것이 좋다.


/bin/ping (suid)
ping은 잘 알고 있듯이 icmp echo request 패킷을 발송하는 것으로 일반 유저에게 ping을 허용하려면 suid를 그대로 유지하고 일반유저에게 ping을 금지하려면 suid를 해제하면 된다. 만약 4755 대신 0755로 설정한 상태에서 일반 유저가 ping을 실행하면 아래와 같은 에러가 나게 된다.
ping : icmp open socket: Operation not permitted

/usr/sbin/traceroute (suid)
traceroute는 네트워크 경로를 추적하는 명령어로서 일반 유저에게 traceroute를 허용하려면 suid를 그대로 유지하고, 금지하려면 suid를 해제하면 된다.


/usr/bin/passwd (suid)
suid가 설정된 파일 중 가장 많이 사용되는 명령어일 것이다. 일반 유저가 자신의 암호를 변경하려면 /etc/shadow 파일을 읽고 쓸 수 있는 권한이 있어야 하는데, 이는 root 권한만이 가능하므로 passwd 파일은 root 소유의 suid가 설정되어 있어야 한다. 따라서 이 파일의 퍼미션을 755 등으로 변경하면 오직 root 만이 암호를 변경할 수 있게 된다.


/usr/bin/crontab (suid)
일반 유저가 cron을 설정하여 사용하도록 허용할 경우에는 suid가 필요하지만 일반 유저가 cron을 사용할 수 없도록 제한할 경우에는 불필요하다.


***************************************************************************

 

 

**************************************************************************
<TIP>
[find와 관련된 유용한 명령어]
시스템 관리뿐만 아니라 해킹당한 시스템을 분석하기 위한 보안상의 목적으로도 사용될 수 있을 것이다.
# find ./ -name "*" -exec grep -H hack {} \;
# find ./ -type f -print | xargs grep -H "hack" /dev/null
# find ./ -type f -exec grep -H hack {} /dev/null \;
# egrep -r hack *
<설명>
위 명령어들은 현재 디렉토리에서부터 하위 디렉토리까지 내려가면서 파일 내 hack이라는 문자가 포함된 파일을 찾아준다. 사용될 일이 많기 때문에 한 가지 정도는 외워두는 것도 좋다.
# find / -user 427 –print
<설명> 전체 디렉토리에서 소유자의 uid가 427인 파일들을 보여준다.
# find / -cmin -5
<설명> 최근 5분 안에 생성되거나 업데이트 된 파일들을 보여준다.
# find / -perm -0002 –type d –print
<설명> 일반 유저가 쓰기 권한이 있는 디렉토리(directory)를 보여준다.
# find / -perm -0002 –type f –print
<설명> 일반 유저가 쓰기 권한이 있는 파일(file)을 보여준다.
# find / -nouser –o –nogroup –print
<설명> 유저나 그룹이 없는 파일을 보여준다.
# find / -minute 2 –o –ctime 2
<설명> 지난 2일 사이에 번경된 파일을 보여준다.
[TIP]
만약 한 디렉토리에 파일이나 디렉토리가 많을 경우에 find나 ls, rm,mv 등을 실행하면
“Argument list too long”과 같은 에러가 나오게 되는데 이는 buffer의 크기가 한정되어 있기 때문이다.
※ Fedora Core 6의 경우
이는 /usr/include/linux/limits.h 파일에 ARG_MAX 값이 정의되어 있으므로 hard kernel tuning을 하여야 가능하다.
[root@localhost ~]# getconf ARG_MAX
131072
<해결.01> 이런한 경우 굳이 소스를 수정할 필요 없이 아래와 같이 find나 xargs를 이용하면 가능하다.
<예제.01>
# ls –al * 시에 “Argument list too long” 발생 했을때
# find . | xargs ls –al 하면 된다!
<예제.02>
# find . –name ‘*.html’ –print0 | xargs -0 rm : . 현재의 dir 에서 *.html을 rm 한다.
<예제.03>
# find $batch_data_dir -name '*.*' | xargs -I{} mv {} $dat_dir
<예제.04>
아니면 ls –al * 전체를 주지 말고, 검색 필터를 적게 잡아 주면 된다.
더욱 자세한 것은 http://www.linuxjournal.com/article/6060 링크 보기를 권한다.
[04]
***************************************************************************