로그인
Sign in
(1) SetUID의 위험성

잠시 setuid 라는 것을 짚고 넘어가자면 파일에 설정되는 룰중에 하나로
어떤 사람이든 그 룰이 설정된 파일을 실행하면 그 파일의 소유권의
계정(ID)으로 그 프로그램이 돌게 되죠.

혹시 cat 이라는 명령을 아시나요?
이 프로그램은 파일을 읽거나, 쓸수 있는 기능을 가지고 있죠.
예를 들면,
$ cat /etc/passwd 라고 하면 /etc/passwd 파일을 읽죠.

만약 bugscan 이라는 사람이 만든 파일이 있는데 퍼미션이 일반 사용자들
한테는 닫혀 있다고 합시다.
즉, 이런 식으로 퍼미션이 설정되어있다고 보면 될꺼에요..

-rw------- 1 bugscan admin 45147 8월 19일 15:45 /tmp/passwd
(세번째 단이 --- 으로 되어있으므로 일반 사용자들한테는 퍼미션이 닫혀 있어서
읽지도 실행하지도 쓰지도 못한다. 오로지 파일 소유자만이 읽고 쓸수 있다.)

$ whoami
guest
$ ls -al /tmp/passwd
-rw------- 1 bugscan admin 45147 8월 19일 15:45 /tmp/passwd
$ ls -al /bin/cat
-r-xr-xr-x 1 bin bin 9388 Jul 16 1997 /bin/cat
$ cat /tmp/passwd
cat: cannot open /tmp/passwd

보다 시피 /tmp/passwd 파일은 있지만 cat 으로 파일을 열수 없다고 나오죠?
바로 guest 와 같은 bugscan 과 다른 아이디의 사용자 에게는 퍼미션을 열지
않아서 겠죠.

자 한번 이번에는 이런 식으로 되어있을 경우 /tmp/passwd 파일을 읽을 수 있죠.

$ whoami
guest
$ ls -al /tmp/passwd
-rw------- 1 bugscan admin 45147 8월 19일 15:45 /tmp/passwd
$ ls -al /bin/cat
-r-sr-xr-x 1 bugscan bin 9388 Jul 16 1997 /bin/cat
$ cat /tmp/passwd
어쩌구 저쩌구.
패스워드가 여기있고, 저기있고..
여기도 있었군. 이제 없나보다..

지금은 /tmp/passwd 파일을 읽을 수 있죠..
왜 그럴까요?
그 해답은 바로 /bin/cat 라는 파일의 퍼미션을 보시면 될꺼에요.
cat 의 소유권은 bugscan 이고 setuid 가 걸려 있죠.
즉, 현재의 guest 사용자는 cat 이라는 프로그램을 돌리는 순간만큼은 bugscan
이라는 아이디로 돌아간것이죠..
그렇기 때문에 퍼미션이 닫혀진 /tmp/passwd 파일을 읽을 수 있는 것이고요..

그럼 이번에는 cat 프로그램이 아닌 /bin/more 라는 프로그램을 살펴봅시다.
more 라는 프로그램도 cat과 같이 파일을 읽을 수 있는 기능을 가지고 있습니다.
하지만 cat 명령과 다른 점은 한페이지가 넘는 문서 파일일 경우 아무키나
누르도록하고 화면을 정지 시킵니다.
도스의 dir /p 명령과 같이 p 옵션을 줘서 화면을 멈추게 하는 거죠.
cat 대신 more 라는 파일에 setuid 를 주고 다시 한번 /tmp/passwd 파일을 봅시다.

$ whoami
guest
$ ls -al /tmp/passwd
-rw------- 1 bugscan admin 45147 8월 19일 15:45 /tmp/passwd
$ ls -al /bin/cat
-r-sr-xr-x 1 bugscan bin 21418 Jul 16 1997 /bin/more
$ more /tmp/passwd
어쩌구 저쩌구.
패스워드가 여기있고, 저기있고..
여기도 있었군. 이제 없나보다..
....
....
....
--More--(2%)


아까 cat 명령을 내렸을 때 와 별 다른거 없죠?
다만 --More--(2%) 라는 것이 나와서 페이지 별로 내용을 볼수 있을뿐..
하지만 more 의 내부 명령중 이런 것이 있죠..
! 라는 명령이 핵심입니다.
! (느낌표) 명령은 그 뒤에 붙인 파일이름을 실행하라는 명령과 같아요.
즉 이렇게 명령을 내릴수가 있죠.
!cat /tmp/passwd 라고 명령을 내리면 현재의 권한으로 cat /tmp/passwd
명령을 내리죠.

아!!! 잠깐 여기서..

현재의 권한으로 cat /tmp/passwd 명령을 내린다고 했죠?
한가지 간과하고 넘어간 부분은 바로 suid 가 걸린 프로그램을 실행시키는
순간은 파일의 소유자 권한이라고 했죠? 그렇다면 프로그램의 종료가 아닌
중간에 ! 명령으로 임시 명령을 내리는 순간에도 setuid는 유효하다 이말이죠.
결국 중간에 !cat /tmp/passwd 라고 해도 /tmp/passwd 파일은 보인다는 거죠.
이제 좀 눈치가 생기나요?



(2) /bin/sh 라는 파일은 뭐하는 건가?
/bin/sh 라는 것은 아주 여러분이 실행시키고, 무의식적으로 넘어가는 부분이죠.
/etc/passwd 파일을 한번 살펴보세요.

% cat /etc/passwd
proto40M:x:9683:200:Quota Proto 40M:/tmp:/bin/sh
proto30M:x:9684:200:Quota Proto 30M:/tmp:/bin/sh
proto20M:x:9685:200:Quota Proto 20M:/tmp:/bin/sh
proto10M:x:9686:200:Quota Proto 10M:/tmp:/bin/sh
proto3M:x:8000:200:Quota Proto 3M:/tmp:/bin/sh
proto50M:x:9687:200:Quota Proto 50M:/tmp:/bin/sh
proto70M:x:7833:200:Quota Proto 70M:/tmp:/bin/sh
....

맨 끝부분에 /bin/sh 라고 되어있지 않은가? 한번 각 서버의 /etc/passwd 파일을
읽어보기 바래요.

/bin/sh(쉘:SHELL) 파일의 쓰임은 흔히 사용하는 도스의 command.com 파일과
같다고 생각하세요.
"명령어 해석기" 라고도 부르죠.
우리가 일반적인 유닉스 로그인을 하게 되면 /etc/passwd 파일의 마지막에 붙어
있는 /bin/sh 가 실행되면서 prompt가 뜨게 되죠. $ 혹은 # 이런식으로요.
바로 쉘이 실행된것을 뜻하죠..
쉘이 뜨면 그때부터 유닉스의 모든 명령을 내릴수가 있는 거에요..
/bin/sh 파일에 손상이 가거나 삭제되면 로그인을 못하게 되는 결과를 낳게 되죠.

그렇다면 이런 식의 행동은 어떤 결과를 부를까요?

more 를 사용하는 과정에서 !/bin/sh 라고 치게 되면 어떻게 되나요?
쉘을 실행했으니 $ 화면이 나오겠죠? 또한 현재 실행되는 suid 는 유효할테고...
그렇다면 whoami 를 이상태에서 치면 bugscan 이라고 나오지 않을까요?
내리는 명령마다 bugscan 으로 실행할 수 있겠죠.. 왜냐...
setuid는 아직까지도 유효하기 때문이죠.. 아직 more 프로그램은 종료된게 아니라
more 의 ! 라는 내부 명령어 안에 있는 것이기 때문이죠.

다음은 당신이 계정에 접속한후 more 를 실행해 !로 쉘로 빠진 경우를 보여줍니다.
login -> /bin/sh -> more -> ! -> /bin/sh -> ls , cat, vi, telnet , ftp .. 등등

(3) 루트쉘(RootShell)
; setuid 가 root 로 되어있는 쉘을 말합니다.
setuid는 무엇인지 아시겠죠?
실행할 파일이 /bin/sh 이고 그 소유권이 root 인 경우 어떤 모습일까요?

-r-sr-xr-x 3 root 88620 Jul 16 1997 /bin/sh

바로 이런 모습이겠죠?

일반적인 정상적인 /bin/sh는 이렇습니다.

-r-xr-xr-x 3 root 88620 Jul 16 1997 /bin/sh

맨위의 /bin/sh를 실행하는 순간 우리는 setuid 가 걸려 있기때문에 root가
되는 거죠.
쉘 자체를 루트로 실행하는 거랍니다.
다음의 예제를 보세요.

$ whoami
guest
$ ls -al /bin/sh
-r-sr-xr-x 3 root 88620 Jul 16 1997 /bin/sh
$ /bin/sh
# whoami
root
# exit
$ whoami
guest


이제 아시겠죠?
쉘 자체가 종료될때까지는 setuid 가 유효 하답니다.

(4) 퍼미션 설정 방법
우선 일반적인 rwx 모드 부터 봅시다.

chmod 숫자(퍼미션) 파일이름

보통 이런 방법을 많이 사용합니다. 이런 방법외에도 숫자 대신 직접 퍼미션
모드 이름을 넣을 수도 있지만 숫자를 조합해서 만드는 것이 가장 편합니다.

숫자란에다 넣을 수 있는 규칙은 아주 간단합니다.
r = 4 , w = 2 , w = 1 로 계산을 하는 거죠.
또한 세단으로 나눠지는 퍼미션을 생각해야 겠죠.
rwxrwxrwx 이런 식으로요.. 자 그러면 이런 예제를 보시면 금방 규칙을 알 수
있을꺼에요.

퍼미션 : rwxrwxrwx
4+2+1 + 4+2+1 + 4+2+1 = 777 ( chmod 777 file_name )

퍼미션 : rwx---r-x
4+2+1 + 0+0+0 + 4+0+1 = 705 ( chmod 705 file_name )

퍼미션 : r-xrw---x
4+0+1 + 4+2+0 + 0+0+1 = 561 ( chmod 561 file_name )

퍼미션 : --x--x--x
0+0+1 + 0+0+1 + 0+0+1 = 111 ( chmod 111 file_name )

다음은 setuid 설정이에요.
setuid 는 3자리 숫자가 아닌 하나더 추가해서 사용해요. 4자리 숫자
주의 해야 할 점은 setuid 가 걸린 프로그램은 실행권한이 있어야 해요.

퍼미션 : rws------
4 + 4+2+1 + 0+0+0 + 0+0+0 = 4700 ( chmod 4700 file_name )

퍼미션 : --sr-xr-x
4 + 0+0+1 + 4+0+1 + 4+0+1 = 4155 ( chmod 4155 file_name )

* 만약 4155 가 아닌 4055 로 하면 실행이 안되죠.
# chmod 4055 sh
# ls -al sh
---Sr-xr-x 1 bugscan informix 88620 Aug 20 02:54 sh*
# ./sh
./sh: Permission denied.
# chmod 4155 sh
# ls -al sh
---sr-xr-x 1 bugscan informix 88620 Aug 20 02:54 sh*
# ./sh
$ whoami bugscan
조회 수 :
1033
추천 수 :
29 / 0
등록일 :
2003.03.10
07:39:11 (*.233.250.108)
엮인글 :
http://bestceok.com/xe/index.php?mid=unix_com&document_srl=2666&act=trackback&key=1c6
게시글 주소 :
http://bestceok.com/xe/index.php?mid=unix_com&document_srl=2666
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 자주 사용하는 명령어 제비게릴라 2019-06-27 179
12 GSP Mode 에서 CM Mode에서 빠져 나오는 방법 하록 2004-01-25 542
11 GSP 상에서 DUMP 받고 Rebooting 방법... 하록 2004-01-25 672
10 2G 이상의 파일 생성할 수 있는 파티션 설정 [1] 하록 2004-01-25 578
9 Telnet Session 늘려주기... [7] 하록 2004-01-25 4096
8 Mirroring 확인 법 하록 2004-01-25 616
7 아파치 환경 설정파일 가이드.... 하록 2003-03-11 1172
6 UNIX 패스워드 해킹방법 관리자 2003-03-10 1551
» SUID 의 위험성에 대해..... 관리자 2003-03-10 1033
4 크래킹의 "크"자도 모르고 크래킹하기- 2 탄 관리자 2003-03-10 1061
3 크래킹의 "크"자도 모르고 크래킹하기- 1 탄 [1] 관리자 2003-03-10 1073
2 유닉스 패스워드 크랙프로그램 과 패스워드 암호화의 원리[유닉스편] 관리자 2003-03-10 972
1 리눅스란 무엇인가?! 관리자 2003-03-10 669