버퍼 오버플로우를 이용한 루트쉘 획득 기법에 관한 궁금증이....있어서 질문 올립니다.
글쓴이: criny / 작성시간: 목, 2014/05/15 - 12:09오전
보안 관련해서 처음 해킹관련 지식을 배우고있는 초보 입니다.
제가 현재 보고있는 책에서 버퍼 오버플로우를 이용한 루트쉘을 획득하는 방법을 소개했고,
이방법은 아직까지 널리 쓰이는 해킹방법중 하나라고 설명했는데요...
책에서 소개한 방법은 대략 아래와 같습니다.
======================================
setuid가 설정된 프로그램을 이용해서
euid가 0인 상태에서
프로그램의 허점을 이용하여 "setuid(0), system("/bin/bash")" 코드를 어떻게든 실행해서 루트 쉘을 획득 한다.
======================================
제가 궁금한 것은, 저 방법은
커널을 수정해서
uid가 0이 아닐때에는 setuid 시스템콜을 막아 버리면 되지 않나요?
ps)
현재 질문을 올리는 본인은, 커널에 대한 관심이 많은 학생이며,
교육용 커널을 만들어 보면서 x86아키텍쳐에 대해서는 어느정도 지식은 쌓였지만,
리눅스 시스템에 대해서는 이제 막 공부를 시작한 초보입니다.
전문가들 입장에서 보기에 하찬아 보일지 모르는 질문이라도, 부디 자세한 답변좀 부탁드립니다.
Forums:
?
setuid 시스템콜을 호출하든 하지 않든 그건 아무런 의미가 없습니다.
결론은 root 권한으로 임의 코드 실행이 된다는 것이고 쉘을 실행시키지 않더라도
다른 어떤 작업이든 그냥 하면 됩니다. ( cp /etc/shadow ~/ 라든지 rm -rf /* 라든지 )
그렇다면, 결국 setuid 비트를 가진 실행프로그램을 이용해서만 위의 공격이 가능 하다는 말인것이죠???
그렇다면, 결국 setuid 비트를 가진 실행프로그램을 이용해서만 위의 공격이 가능 하다는 말인것이죠???
해킹에서 루트쉘을 얻거나 파일복사, 삭제 등을 한다는 말은
setuid 가진 프로그램의 취약점을 이용한다는 것인가요?
setuid 프로그램의 취약점을 이용하지 않고, 커널상 버그나 다른 방법으로 루트 권한을 획득하는 방법이 있나요?
?
굳이 setuid 가 걸린 프로그램에 대해서만 해킹을 할 이유는 없습니다. 다양한 방식이 있고 그걸 한 가지로 정형화할 수는 없습니다.
윈도우즈에 비해 소프트웨어가 비교적 적은 리눅스의 경우 많은 취약점이 커널 익스플로잇에 치중되고 있습니다.
실제로 exploit-db 를 참조해 보시면 리눅스에서의 로컬 익스플로잇은 대부분이 커널 익스플로잇입니다.
커널에서 발생하는 취약점의 경우 setuid 와 관계없이 유저가 직접 소스 코드를 만들고 컴파일해서
실행만 해도 루트 권한을 얻어낼 수 있으며, 이 원리는 커널의 시스템 콜에 취약점이 있을 경우 커널 모드에서
임의 코드 실행이 가능해지기 때문에 커널이 액세스할 수 있는 메모리 영역에 액세스하여
현재 유저의 uid/gid 정보 등을 직접 수정해버리는 방식을 보통 이용하고 있습니다.
하지만 요즘은 로컬 익스플로잇보다는 대부분 리모트 상에서의 취약점이 주류가 되고 있습니다.
파급력도 훨씬 크고 공격 대상 시스템이 더욱 많기 때문이며 굳이 루트 권한이 아니더라도 특정 시스템 상에
원격으로 접속할 방법이 없을 때 쉘을 얻어낼 수 있는(일반 유저 권한이라도) 유일한 방법이기 때문입니다.
물론 그렇게 쉘을 얻어낸 다음은 로컬 익스플로잇으로 루트를 얻어내는 것은 같습니다.
또한 setuid 가 걸린 프로그램은 보통 일반적인 소프트웨어가 아니라 시스템과 밀접하게 연관된 프로그램들입니다.
따라서 이런 프로그램의 종류 자체가 적을 뿐더러 이들 프로그램은 이미 오랜 시간 검증되어 온 프로그램이기 때문에
이미 취약점을 발견하기는 어렵습니다. 상식적으로 아무 프로그램에나 setuid 를 걸어놓을 관리자는 없습니다.
댓글 달기