이번에는 SUID에 대해 잘못알고 있었던 내용으로 인해 꽤 오래 삽질했다....


환경

1. /bin/sh 파일 ( rws r-x r-x root root ...)

2. vi /etc/shadow 명령어를 통해서 변경을 하려함.

3. 변경 불가



잘못알고있던 내용 

1. SUID가 걸려있으므로 실행 시 process 소유주 권한으로 파일이 실행될 것이다.

2. vi /etc/shadow 하면 현재 root권한이므로 수정가능할 것이다.




지금부터 정리하겠습니다.




SUID 동작 과정


SUID가 걸린 프로세스를 실행하면 바뀌는것은 EUID가 바뀌는것이다. RUID(즉, uid)는 변함없다. 

자, 지금부터 A(/bin/sh)  B(vi /etc/shadow)라고 가정하자. 물론 A는 SUID걸린 프로그램이다.


1. user1계정이 A를 실행하면 (EUID: root // RUID: user1) 이다.

2. 이때 새로운 프로세스 B를 실행시키면 EUID는 RUID에 맞춰 변경한다. (최근커널에는 보안상)

   (EUID: user1 // RUID: user1)

3. 결국 /etc/shadow는 root파일인데 user1권한으로 vi를 하게 되는 꼴이된다.

4. 결국 수정 불가!!!



하지만 RUID를 못바꾸는 것은 아니다. 아래 예제를보자

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

#include<stdio.h>
int main()
{ 

setreuid(0 , 0);

system("/bin/sh");

return 0;

}

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


이번에는 A라는 프로세스를 위 예제라고 가정하자. 여기서도 마찬가지로 

(rws r-x r-x) 권한을 가지고 있다.


1. user1계정이 저 프로그램을 실행하면 EUID: root // RUID: user1 일 것이다.

2. 그 후 setreuid(0,0)로 인해 현재 EUID:root이니까 RUID도 user1 -> root로 바뀐다.

3. system("/bin/sh")을 실행하면 EUID,RUID 모두 root로 /bin/sh를 실행하게된다.

4. RUID가 root인 쉘 실행 성공!!!!!

5. 프로그램이 종료되면 setreuid의 효력은 없어지고 원래대로 돌아옴



[참고]

https://kldp.org/node/69198

http://idkwim.tistory.com/78




마지막으로 정리를 하자면

일반적으로 EUID와 RUID는 같다. 그렇지만 Setuid가 걸린 프로세스를 실행하게 된다면 EUID는 실행시킨 프로세스의 소유주 권한으로 변경이 된다.

그러다가 실행시킨 프로세스 내부에 어떤 동작을 하는 코드를 만난다? --> ruid가 euid로 변경되는 함수가 없는 한 ruid권한으로 실행된다.  
setuid가 걸린 프로세스 소유주 권한으로 동작시키고 싶으면 ruid를 setuid(geteuid())이런식으로 ruid를 euid로 맞춰줘야함.



'System Hacking > 정리' 카테고리의 다른 글

IDA 리모트 디버깅 설정  (0) 2015.11.11
소멸자(.dtors) +4 하는 이유  (0) 2015.11.10
FSB 소멸자 주소가 아닌 ret주소를 이용한 공격  (0) 2015.11.10
/proc/pid/maps  (0) 2015.11.09
; cat 을 쓰는 이유  (0) 2015.11.03

실행시켜보니 다음과 같이 출력되었습니다.
gdb로 디버깅 해보도록 하죠.

 

Level01과 별반 다른게 없습니다.
SUID,SGID로 설정하고 getenv함수를 통해 어떤 환경변수 값의 주소를 구한 뒤,
asprintf함수를 사용했습니다. Sprintf하고 포맷이 같은 함수이네요.

먼저 getenv함수부터 보겠습니다.


getenv("USER")라는 것을 알 수 있고 그 리턴 값을 보면 level02를 얻을 수 있습니다.

 

 

그리고 asprintf 함수를 분석해보도록 하겠습니다.

asprintf의 파라미터로는

#1 – 아직안들어감

#2 – "/bin/echo %s is cool"

#3 – level02 ßgetenv함수 결과 값

 

 

이렇게 수행된 후 system함수가 호출된다.

결과적으로 System("/bin/echo level02 is cool"); 인 것을 알 수 있다.

그럼 환경변수 USER에 ;\"/home/level02/test""로 변경해줘서 test파일이 실행되게 해줍니다.


그럼 system("/bin/echo ; "/home/level02/test" is cool")이 되고,
결과적으로 echo명령이 수행된 다음 /home/level02/test 명령이 수행되어 쉘을 얻을 수 있습니다.


<test.c 소스코드>

 

 

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level01]  (0) 2015.10.29

처음 실행했을 때 화면입니다.
"and now what"이라는 문자열을 출력해서 지금 뭐하느냐고 묻는 것 같습니다..맞나
바로 분석해보도록 해보겠습니다.

 

 

 

 

보시면 setresgid함수와 setresuid 함수를 사용하여 SUID,SGID를 설정한 후
System("cmd")를 수행하는 간단한 소스코드입니다.
그러면 system함수의 파라미터로 들어간 0x80485e0의 값을 살펴보도록 하겠습니다.

 

 


bp걸고 실행시켜줍니다.

 

 

 

 

아~ 이래서 실행시키면 and now what? 이라는 문자열이 출력되었군요.
그런데 /usr/bin/env 때문에 echo 명령어를 수행할 때 PATH변수에 저장된 경로를 우선으로 해서 echo 를 실행시킵니다.

 

 

한번 맞는지 현재 PATH 변수에 저장된 경로와 echo의 위치를 살펴보도록 하겠습니다.

살펴본 결과 PATH에 /bin이라는 경로가 등록되어있기 때문에 echo만 입력하여도 수행되는 것을 볼 수 있습니다.

 


그렇다면 현재 echo 가 무조건 실행되니까 PATH변수의 경로를 바꿔줘서 다른 echo파일이 실행되도록 만들어줍니다.

경로를 앞부분에 추가함으로써 우선순위로 참조하게 합니다.
그렇게 되면 /bin/echo파일보다 /home/level01/echo파일이 먼저 참조되어 실행시켜서 쉘을 획득할 수 있습니다.

물론 echo는 /bin/sh을 실행시켜주는 코드입니다.

 

  

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level02]  (0) 2015.10.29

+ Recent posts