wsl ubuntu에서 telnet을 이용해서 접속해봤다. 1단계 id와 pw는 gate/gate다.
ls 명령어로 무슨 파일이 있는지 확인해봤다. gremlin, gremlin.c라는 문제 파일과 그 소스코드가 존재하는 것을 알 수 있다. gremlincp 파일은 풀이 과정에서 디버깅을 위해 gremlin 파일을 복사한 것이다.
권한을 확인해보면 gremlin 파일에는 gremlin 계정으로 setuid가 걸려있다. 이 문제 파일을 공격한다면 gremlin 권한으로 된 쉘을 얻을 수 있을 것이다.
int main(int argc, char *argv[])
{
char buffer[256];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]); // 취약점 발생
printf("%s\n", buffer);
}
gremlin 파일의 소스 코드를 살펴보면 strcpy 함수를 통해 256byte 크기의 char형 배열 buffer에 인자 값을 복사하는 것을 알 수 있다.
하지만 strcpy는 복사 값의 길이에 제한을 두지 않으므로 만약 500byte의 입력 값을 준다면 500byte가 그대로 buffer에 복사돼 buffer overflow가 발생할 것이다. 이를 이용해 풀면 될 것 같다.
문제에 쉘을 얻게해주는 다른 함수가 없는 것을 봐서 쉘 코드를 이용해서 풀어야할 것 같다. 쉘 코드는 지난 게시글(https://dypar-study.tistory.com/115)에서 만든 /bin/sh를 실행해주는 25byte 쉘 코드를 사용할 것이다.
gremlin 파일은 실행 권한만 있기 때문에 디버깅을 할 수 없으므로(정확히는 bp를 걸 수 없다.) cp 명령어로 문제 파일을 복사한 뒤 gdb로 열었다.
set disassembly-flavor intel 명령어를 사용해 어셈블리를 intel 문법 보려 했으나 효과는 없었다.. 그래서 그냥 AT&T 문법으로 분석하기로 했다.
ret와 buf의 스택 주소를 확인하기 이해 main의 스택 프롤로그 부분과 main+54(call strcpy 명령이 존재하는 부분)에 bp를 걸고 실행하여 스택을 확인해봤다.
ret는 0xbffffcdc, buf는 0xbffffbf8인 것을 알 수 있다. 따라서 ret와 buf 사이의 거리는 260byte다.
이 시점에서 생각해 볼 수 있는 공격 방법이 ftz 때 처럼 환경변수에 쉘 코드를 삽입하고 ret를 환경변수의 주소로 변조하는 것, 혹은 스택 주소가 변하지 않다면 ret를 buf의 스택 주소로 변조해 쉘을 얻는 것이다.
여러 번 실행해본 결과 스택 주소는 변하지 않는다. 귀찮게 환경변수를 쓸 필요없이 쉘 코드가 들어간 buf의 주소로 ret를 변조하면 되겠다.
payload는 다음과 같이 구상했다. \x90 sled * 235+ 쉘 코드(25byte)+ buf의 주소
ftz의 경우 환경변수에 쉘 코드를 삽입할 때 \x90 sled가 없다면 제대로 exploit이 되지 않았다. lob에서도 혹시 모르니 앞에 \x90 sled를 235byte를 추가해줌으로써 공격의 신뢰도를 높힐 것이다.
./gremlin `python -c "print '\x90'*235+'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80' + '\xd8\xfb\xff\xbf'"`
wsl에서는 제대로된 payload를 인자로 줬으나 Illegal instruction 오류가 뜨면서 공격이 되지 않았다. 처음에는 payload나 exploit code가 잘못된줄 알고 삽질했으나, 디버깅을 해봐도 잘못된 부분은 없었다.
마지막 수단으로 putty로 접속해 똑같은 payload를 인자로 주니 성공했다. 다음 레벨인 gremlin의 password는 hello bof world다.
그냥 putty 쓰자
'Wargame > LOB' 카테고리의 다른 글
[LOB] cobolt -> goblin (0) | 2021.06.27 |
---|---|
[LOB] gremlin -> cobolt (0) | 2021.06.27 |
[LOB] Lord Of BOF bash 문제 (0) | 2021.06.26 |