cobolt --- hacking exposed
우선 cobolt의 디렉터리를 확인한다.
goblin이라는 의심스러운 파일이 존재한다. goblin는 goblin의 권한을 가지고 있고, setuid가 걸려있는 파일이다.
goblin.c를 가지고 goblin 파일을 만들었을 가능성이 있기 때문에 goblin.c 파일을 본 뒤 어떤 취약점을 가지고 있는지 확인해보자.
배열이 하나 선언되어 있다. (char buffer[16])
사용자로부터 하나의 문자열 입력을 기다리고 입력받은 문자열을 buffer에 저장한다.(gets(buffer))
사용자로부터 입력받은 문자열을 출력한다. ( printf("%s\n", buffer) );
cobolt의 메모리 구조를 예상해보면 아래와 같이 그려볼 수 있다.
하지만 실제 배열이 할당되면서 중간 중간에 gcc가 최적화를 위해 자동적으로 dummy를 생성할 수 있다.
gdb를 이용해서 소스를 분석해보자. 소스에 permission denied가 발생하면 cp 명령을 이용해 파일을 복사하면 현재 user의 권한으로 똑같은 파일을 가질 수 있다.
위와 같이 cobolt 권한으로 goblin 파일이 복사된 것을 확인 할 수 있다.
dummy가 생성되었는지 gdb를 통해 확인해보자.
dummy가 추가적으로 생성되지 않고 정확히 16byte만 생성된 것을 확인 할 수 있다.
이제 공격을 시작하면 되는데, 일반적으로 우리는 buffer 공간이 충분하다면 buffer 공간에 쉘 코드를 삽입한 뒤 RET을 buffer의 주소로 바꿔서 쉘을 실행한다.
하지만 현재 프로그램은 buffer는 16byte로 쉘코드가 들어가기에 크기가 작다.
또한 지금까지 풀어왔던것과 달리 파라미터로 인자를 전달하는것이 아니라 프로그램을 실행한뒤 gets를 통해 buffer에 입력해야한다.
이와 같은 구조를 가질 때 다음과 같이 공격코드를 작성하면 된다.
1. 환경변수에 쉘코드를 등록하고 RET을 환경변수의 주소로 바꿀것이다.
위와 같이 파이프를 사용해서 gets에 들어갈 인자를 전달할 수 있다.
2. 쉘 코드를 삽입할 공간 찾기
쉘 코드를 일반적으로 buffer에 삽입했지만 무조건 쉘 코드는 buffer에 삽입되어야한다는것은 아니다.
쉘 코드를 넣을만한 공간이 있어야하고, 그러한 공간의 주소를 알 수 있어야한다.
따라서 스택 공간에 쉘코드를 삽입할 것이다.
gdb를 통해 보다 쉽게 이해할 수 있다.
스택 영역의 RET 뒷 부분을 이용해 공격하면 된다.
성공률을 높이기 위해 NOP패딩을 많이 하고 공격 주소를 0xbffffb74로 잡겠다.
다음과 같이 스택에 삽입된 NOP padding을 따라 쉘코드가 삽입된 곳에 도착하고 쉘 코드를 실행해 쉘을 딸 수 있다.
'Wargame > LOB' 카테고리의 다른 글
해커스쿨 LOB wolfman 풀이, write-up (0) | 2018.08.13 |
---|---|
해커스쿨 LOB orc 풀이, write-up (2) | 2018.08.12 |
해커스쿨 LOB goblin 풀이, write-up (0) | 2018.08.12 |
해커스쿨 LOB gremlin 풀이, write-up (0) | 2018.08.09 |
해커스쿨 LOB gate 풀이, write-up (0) | 2018.08.09 |