SEH overwriting

SEH overwriting (stackoverflow)

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 개의 댓글:

댓글 쓰기