victim : windows XP SP3 32bit, globalSCAPE secure FTP server (192.168.50.152)
attacker : backtrack5 R2 32bit
FTP 커맨드 입력 받을 때 입력받는 문자열에 대한 길이 체크를 안하기 때문에 stack overflow 취약점이 발생한다. 위의 그림은 입력 받는 함수의 이전 함수가 호출 됬을 때의 스택 구조이다. 즉 사용자가 cmd를 입력하면 cookie 위쪽의 RET 밑에 매개변수 전달 형식으로 사용자가 입력한 CMD가 쌓이게 된다.
여기서 FTP 는 입력받는 문자열의 길이 체크를 안하기 때문에 사용자가 cmd를 길게 입력한다면 밑에 있는 cookie와 SFP, RET를 모두 수정 할 수 있다.
스택 오버플로 공격 중 트램플린 공격의 경우 RET에 현재 레지스터에서 권한이있는 영역의 메모리 주소를 갖고 있는 레지스터를 CALL 해주는 코드의 시작주소를 넣고 레지스터가 갖고있는 시작주소부터 shellcode를 삽입하면 공격을 실행 할 수 있지만
security cookie로 스택이 보호되고 있는 위의 경우에는 exception이 발생하여 트램플린 공격이 무력화 된다.
이 경우에는 SEH overwrite 기법을 사용하여 공격을 실행 할 수 있다. 프로그램은 exception이 발생하면 fs레지스터의 값(오프셋)을 참조하여 GDT(kernel)에 TEB(Thread Environment Block)에 포함된 TIB(Thread Information Block)에 체인형식으로 구성되있는 구조체인 _EXCEPTION_REGISTRATION_RECORD(_next, _handler)를 첫번째부터 순서대로 참조하여 handler()를 호출한다. handler()는 무조건 순서대로 전부 호출되며 exception을 처리할 능력이 있다면 처리를 하고 처리할 능력이 없다면 다음 _EXCEPTION_REGISTRATION_RECORD로 넘어가서 handler()를 호출한다. 마지막 _EXCEPTION_REGISTRATION_RECORD에 _next에는 0xffffffff로 마지막을 확인 할 수 있다. SEH overwrite공격은 여기서 _next와 _handler를 조작 함으로써 실행 되는 공격이다.
cmd socket에 A를 2043개 넣고 RET변경을 위한 4개 넣고 B를 60개 넣고 오버플로 공격을 실행한 FTP 스택메모리이다. (RET변경은 의미 없다)
*A 가 2043개가 들어가야 오버플로가 생긴다는 것은 dummy를 일정한 pattern으로 보내 exception이 발생했을 때의 eip를 보고 확인 할 수 있다.
_next(Pointer to next SEH record)와 _handler(SE handler)가 덮여 쓰여진 것을 볼 수 있다.
exception이 발생하면 _handler가 호출된다 _handler에 pop, pop, ret 가 있는 로딩된 dll의 메모리주소를 넣는다(프로그램에 로딩되는 dll파일을 윈헥스등으로 열어 검색한다.) pop, pop, ret코드를 넣는 이유는 handler가 호출될 때 전달되는 매개 변수와 관련이 있다. pop, pop, ret을 하게되면 3번째 인자인 현재 _EXCEPTION_RECORD의 주소가 ret에 의해 eip에 들어가게 된다. 그러면 _EXCEPTION_RECORD(_next)에는 jmp 6이라는 기계어 코드를 덮어 써서 _handler밑에서부터 실행되도록 한다. jmp 6은 \x90\x90(NOP) \xAA\xBB\xCC\xDD(pop, pop, ret가 있는 주소) 이렇게 6바이트를 점프해야 하기 때문에 6이다.
곧 위 그림의 SE handler 바로 밑부터 실행 됨으로 여기에 shellcode 를 넣으면 공격 성공을 할 수 있다.
위의 그림은 _next 와 _handler를 덮어 씌운 모습이다. 0x1650110B는 pop,pop,ret코드의 시작주소이고 0x06EB 는 jmp 6, 0x9090은 nop이다.
exception이 발생하면 0x1650110B에 가서 pop, pop, ret를 실행하고 0x0147FA9C로 와서 jmp 6을 실행하여 SE handler 밑으로 eip가 내려가게 된다
이제 SE handler 밑에 shellcode를 덮으면 공격이 된다.
python으로 작성된 4321 port 로 접속 연결하여 cmd를 넘겨주는 exploit코드를 실행 한 후 netcat으로 4321 port를 listen하고 있으면
밑의 그림처럼 victim의 cmd가 넘어 오게된다.
0 개의 댓글:
댓글 쓰기