이미 소장하고 있다면 판매해 보세요.
|
1장 흔적을 남기지 말라 ... 23
공격자의 동기 이해 ... 24 은닉의 역할 ... 24 은닉이 필요 없는 경우 ... 25 루트킷이란? ... 26 왜 루트킷이 존재하는가? ... 26 원격 명령 실행과 제어 ... 27 소프트웨어 감청 ... 27 루트킷의 합법적인 이용 ... 28 루트킷의 역사 ... 29 루트킷은 어떻게 동작하는가? ... 30 패치 ... 30 이스터 에그 ... 31 스파이웨어 ... 31 소스 코드 조작 ... 31 소프트웨어 변경의 합법성 ... 32 무엇이 루트킷이 아닌가? ... 32 루트킷은 공격툴이 아니다 ... 33 루트킷은 바이러스가 아니다 ... 34 루트킷과 소프트웨어 공격 ... 35 왜 공격 코드가 여전히 문제인가? ... 37 공격을 위한 루트킷 기술 ... 38 HIPS ... 38 NIDS ... 39 IDS/IPS 우회하기 ... 40 포렌식 툴 우회하기 ... 40 결론 ... 41 2장 커널 조작 ... 43 커널의 중요 요소 ... 44 루트킷 설계 ... 45 커널 레벨 코드 소개 ... 48 윈도우 디바이스 드라이버 개발 ... 49 Device Driver Development Kit ... 49 빌드 환경 ... 50 파일 ... 50 Build 툴 ... 52 언로드 루틴 ... 53 드라이버 로드, 언로드 ... 54 디버그 메시지 로그하기 ... 54 유저 모드와 커널 모드 요소를 모두 포함하는 루트킷 ... 55 IPR ... 56 파일 핸들 생성 ... 60 심볼릭 링크 추가 ... 61 루트킷 로딩 ... 63 드라이버 로드를 위한 비정상적인 방법 ... 63 드라이버 로드를 위한 정상적인 방법 ... 65 리소스에서 .sys 파일 추출하기 ... 67 재부팅시 자동 시작 ... 69 결론 ... 71 3장 하드웨어 레벨의 지식 ... 73 링 제로 ... 74 테이블, 테이블 그리고 또 테이블 ... 76 메모리 페이지 ... 77 메모리 접근 검사 ... 78 페이징과 주소 변환 ... 79 페이지 테이블 ... 81 페이지-디렉토리 엔트리 ... 83 페이지-테이블 엔트리 ... 83 페이지 테이블의 읽기 전용 속성 ... 84 멀티 프로세스와 멀티 페이지 디렉토리 ... 84 프로세스와 스레드 ... 85 메모리 디스크립터 테이블 ... 86 글로벌 디스크립터 테이블 ... 87 로컬 디스크립터 테이블 ... 87 코드 세그먼트 ... 87 콜 게이트 ... 87 인터럽트 디스크립터 테이블 ... 88 다른 형태의 게이트 ... 91 시스템 서비스 디스패치 테이블 ... 91 컨트롤 레지스터 ... 92 컨트롤 레지스터 0 ... 92 그 밖의 컨트롤러 레지스터들 ... 93 EFlags 레지스터 ... 93 멀티 프로세서 시스템 ... 93 결론 ... 95 4장 전통적인 후킹 기술 ... 97 애플리케이션 레벨의 후킹 ... 97 임포트 어드레스 테이블 후킹 ... 99 인라인 함수 후킹 ... 100 사용자 프로세스 영역으로 DLL 인젝션하기 ... 103 커널 후킹 ... 108 시스템 서비스 디스크립터 테이블 후킹 ... 109 인터럽트 디스크립터 테이블 후킹 ... 118 디바이스 드라이버 오브젝트의 Major Function 후킹 ... 123 하이브리드 후킹 ... 133 프로세스의 주소 공간으로 진입하기 ... 134 후킹을 위한 메모리 공간 ... 138 결론 ... 140 5장 런타임 패치 ... 141 우회 패치 ... 142 MigBot을 이용한 실행 흐름 변경 ... 143 함수의 바이트 코드 검사 ... 145 원래의 명령어 바이트 ... 146 NonPagedPool 메모리 이용 ... 149 런타임 주소 결정 ... 149 점프 템플릿 ... 153 인터럽트 후킹 예제 ... 154 기타 유사한 방법들 ... 161 결론 ... 162 6장 계층 드라이버 ... 163 키보드 스니퍼 ... 164 IRP와 스택 로케이션 ... 166 KLOG 루트킷 ... 169 파일 필터 드라이버 ... 183 결론 ... 197 7장 커널 오브젝트 직접 변경 ... 199 DKOM의 장점과 단점 ... 200 운영체제 버전 판단하기 ... 202 유저 모드에서 운영체제 버전 판단 ... 202 커널 모드에서 운영체제 버전 판단 ... 204 레지스트리를 이용한 운영체제 버전 판단 ... 204 유저 모드 프로세스에서 디바이스 드라이버로의 통신 ... 206 DKOM을 이용한 은닉 ... 210 프로세스 은닉 ... 210 디바이스 드라이버 은닉 ... 216 동기화 이슈 ... 220 DKOM을 이용한 토큰의 권한과 그룹 변경 ... 224 프로세스 토큰 변경 ... 225 윈도우 이벤트 뷰어 속이기 ... 239 결론 ... 241 8장 하드웨어 조작 ... 243 왜 하드웨어인가? ... 245 펌웨어 변경 ... 246 하드웨어 접근 ... 247 하드웨어 주소 지정 ... 247 하드웨어 접근은 RAM에 접근하는 것과 다르다 ... 248 타이밍 ... 249 I/O 버스 ... 249 BIOS에 접근 ... 251 PCI, PCMCIA 디바이스 접근 ... 252 예 : 키보드 컨트롤러 접근 ... 252 8259 키보드 컨트롤러 ... 253 키보드 LED 변경 ... 253 하드 리부팅 ... 260 키보드 모니터링 ... 260 마이크로코드 업데이트 ... 267 결론 ... 268 9장 은닉 채널 ... 269 원격 명령 및 제어 그리고 데이터 빼내기 ... 270 TCP/IP 프로토콜 위장 ... 271 트래픽 패턴의 인지 ... 272 데이터를 있는 그대로 전송하지 말라 ... 273 시간을 이용하라 ... 274 DNS 패킷 안에 숨겨라 ... 274 아스키 문자 숨기기 ... 274 다른 TCP/IP 채널 이용 ... 275 TDI를 이용한 루트킷 ... 276 어드레스 스트럭처 생성 ... 277 로컬 어드레스 오브젝트 생성 ... 279 TDI 엔드 포인트 생성 ... 283 엔드 포인트와 로컬 어드레스 연결 ... 286 리모트 서버로 연결 - TCP 핸드쉐이크 전송 ... 288 리모트 서버로 데이터 전송 ... 290 네트워크 패킷 변경 ... 293 윈도우XP에서의 로우 소켓 구현 ... 293 인터페이스에 바인딩 ... 294 로우 소켓 스니핑 ... 295 로우 소켓을 이용한 무차별적인 스니핑 ... 296 로우 소켓을 이용한 패킷 전송 ... 297 소스 포트, 주소 위조 ... 297 바운싱 패킷 ... 298 NDIS를 이용한 루트킷 ... 299 프로토콜 등록 ... 299 프로토콜 드라이버 콜백 ... 304 패킷 전체 이동 ... 309 호스트 에뮬레이션 ... 317 자체 MAC 주소 생성 ... 317 ARP 처리 ... 317 IP 게이트웨이 ... 320 패킷 전송 ... 320 결론 ... 325 10장 루트킷 탐지 ... 327 존재 탐지 ... 328 출입문 보호 ... 328 메모리 스캐닝 ... 331 후킹 탐지 ... 331 행동 탐지 ... 341 숨겨진 파일과 레지스트리 키 탐지 ... 341 숨겨진 프로세스 탐지 ... 342 결론 ... 345 |
|
컴퓨터 보안 분야에서 일을 하다 보니 루트킷에 흥미를 갖기 시작했고 루트킷에 관한 주제는 개인적인 업무(늦은 밤 또는 주말에 하는 개인적인 작업) 영역으로 빠르게 파고들었다. 이런 와중에 호글런드는 리버스 엔지니어링과 루트킷 개발에 관한 포럼인 rootkit.com을 발견하게 되었고, 우리 둘 모두 rootkit.com에 적극적으로 참여했다. 버틀러는 자신이 제작한 새롭고 강력한 루트킷인 FU에 대한 테스트를 위해 호글런드와 처음으로 웹사이트를 통해 접촉했다. 그런데 버틀러는 실수로 호글런드에게 커널 드라이버에 대한 소스 코드를 보내지 않았다. 물론 버틀러는 깜짝 놀랐지만, 호글런드는 아무런 의심도 하지 않고 그의 워크스테이션에 컴파일된 루트킷을 로드시켜 테스트했다. 그리고 FU가 올바로 동작하는 것 같다고 버틀러에게 테스트 결과를 알려줬다. 이를 계기로 우리 서로간에는 신뢰가 쌓이기 시작했다.
우리는 모두 오랫동안 윈도우 커널을 리버스 엔지니어링하는 것에 대한 대단한 집념을 가져왔다. 그래서 누군가 불가능하다고 말한 것을 결국엔 성취해 내곤 했다. 컴퓨터 보안 제품들의 동작 원리와 탐지 방법을 배워가는 것은 매우 만족스러웠으며, 이런 과정은 더욱 향상된 보안 메커니즘을 고안해 내는 데 도움이 된다. 보안 제품이 주장하는 대로 보호 기능이 항상 제대로 수행되는 것만은 아니다. 공격자의 측면에서는 항상 유리한 입장을 취할 수 있다. 공격자는 방어자가 미처 고려하지 못한 것을 한 가지만 생각해내면 되기 때문이다. 반면에, 방어자는 공격자가 취할 수 있는 모든 가능성을 생각해내야 한다. 따라서 공격자에게 확연히 유리한 게임이라고 할 수 있다. 몇 년 전부터 우리는 협력해서 ‘Offensive Aspects of Rootkit Technology’라는 교육을 제공해 왔다. 그 교육은 원래 하루 교육이었으나 지금은 수백 페이지의 설명과 예제 코드를 다루는 교육으로 확대되었으며, 그 교육에서 사용되는 교재를 기반으로 이 책이 저술되었다. 현재 우리는 블랙 햇(the Black Hat) 보안 컨퍼런스에서 한 해에 몇 번씩 루트킷 교육을 제공하고 있다. 물론 비공개적으로 교육을 제공하기도 한다. 우리는 교육을 어느 정도 함께 제공해 오면서 우리의 관계를 좀더 긴밀히 할 필요가 있다고 판단했으며 그에 따라 지금은 HBGray 사에서 같이 일하고 있다. HBGray에서 우리는 매우 복잡한 루트킷 문제와 매일 씨름하며, 오늘날 윈도우 사용자들에게 닥친 위협과 미래에 위협이 될 수 있는 것들을 다루기 위해 우리의 경험을 바탕으로 이 책을 저술했다. 저자 서문 |
|
‘과연 우리들이 사용하는 컴퓨터에는 얼마나 많은 악의적인 코드들이 발견되지 않은 채 동작하고 있을까?’ 늘 내 마음 속에 품어오던 의문점이었다. 우리들은 어떠한 이상도 느끼지 못하며 컴퓨터를 사용하고 있지만 네트워크 저편의 어느 누군가는 입가에 미소를 그리며 우리들을 조롱하고 있을 수 있다. 사실 이렇게 조롱만 한다면 고마운 일일지 모른다. 우리들의 귀중한 정보가 새나가거나 또는 우리들이 그들의 목적을 위한 또 하나의 수단으로 이용되고 있을 수 있다. 이를 정확히 증명하기란 쉽지 않은 일이지만, 분명한 현실이다. 현실이 아닌 것은 그 정도를 정확히 측정하기 힘들다는 것이다. 그럼 좀더 생각을 확장해 보자.
네트워크상에 흐르는 데이터들 가운데 어느 정도가 악의적인 목적으로 사용되고 있을까? 범죄자 없는 세상이 존재할 수 없듯이 악의적인 코드 없는 네트워크 세상이란 있을 수 없다. 하지만 문제는 악의적이든 그렇지 않든 간에 어쨌든 존재 여부를 판단할 수 있어야 한다는 것이다. 실체 없는 범죄를 과연 범죄라고 판단할 수 있을지 깊이 생각해 봐야 한다. 루트킷이 사용하는 기술을 이용해 그것을 방어하는 목적에 사용할 수 있다. 이와 반대로 방어를 위해 새롭게 고안된 기술이 악의적인 용도로 사용되면 강력한 루트킷이 될 수도 있다. 기술은 하나지만 그것을 어떤 목적으로 사용하느냐에 따라 정반대의 결과를 가져오는 셈이다. 적을 알아야 필승할 수 있듯이, 우리는 먼저 루트킷이 사용하는 기술을 자세히 알 필요가 있다. 그래야만 현재의 보안 취약점뿐만 아니라 잠재적인 취약점까지 예측하고 대비할 수 있다. 더 나아가서는 새로운 보안 기술을 위한 아이디어를 제공해 줄 수도 있다. 요즘은 하나의 목적을 위해 다양한 종류의 기술이 동시에 사용되고 있으며 루트킷 자체가 독립적인 기능을 지니기보다는 루트킷이 일부분의 역할을 수행하는 형태로 이용되는 경우가 많다. 그만큼 기술간의 경계가 모호해졌으며 융합과 통합이 이뤄졌다고 할 수 있다. 이 책에서 설명하는 기술이 루트킷이 사용하는 기술 모두를 포함하는 것은 아니지만, 지금까지 널리 알려진 루트킷 기술을 체계적으로 학습하고 정리할 수 있는 기회를 제공하는 것은 분명하다. 특히 시스템 내부에 대한 탐험 의지를 북돋우기에 충분한 책이라고 감히 말할 수 있다. 역자 서문 |
|
rootkit.com의 그렉 호글런드와 제임스 버틀러는 블랙 햇에서 루트킷과 관련한 유명한 교육을 만들고 꾸준히 강의도 해오고 있다.
이 책에서는 그들이 지금까지 공개한 바 없는 루트킷 기술들을 다루고 있다. 어떻게 하면 공격 시스템에 침투해서 몇 년 동안이나 탐지되지 않을 수 있는지 배울 수 있다. 저자들은 윈도우XP와 윈도우2000의 커널 조작 방법을 보여준다. 그리고 윈도우 서버 2003이나 리눅스, 유닉스에 쉽게 적용할 수 있는 공격 개념을 설명한다. 이 책에 나와있는 다운로드 가능한 다양한 예제를 통해 루트킷 프로그래밍 기술을 배울 수 있으며, 운영체제 드라이버나 디버거 같은 다양한 분야의 보안 툴 제작에 도움을 얻을 수 있다. ★ 이 책에서 다루는 내용 ★ ■ 원격 명령이나 제어, 소프트웨어 감청에서 루트킷의 역할 ■ 프로세스, 파일, 디렉토리를 숨길 수 있는 커널 루트킷 제작방법 ■ 후킹, 런타임 패치, 커널 오브젝트 조작 같은 루트킷의 핵심적인 프로그래밍 기술 ■ 계층 드라이버를 이용한 키보드 스니퍼와 파일 필터 드라이버 구현 ■ 루트킷 공격을 방어하기 위한 루트킷 탐지나 호스트 기반 침입 방지 시스템 제작 방법 루트킷의 개념은 리눅스를 비롯한 다양한 운영체제에 적용되지만 이 책에서는 윈도우 루트킷만을 설명한다. 그 중에서도 특히 커널 루트킷에 초점을 맞춘다. 커널 루트킷이 가장 탐지하기 어렵기 때문이다. 대부분의 알려진 윈도우 루트킷은 유저 모드 루트킷이다. 이는 알려지지 않은 윈도우 커널의 복잡한 동작 방식을 이해하지 않아도 되므로 그만큼 구현이 쉽다. 이 책은 특정한 실제 루트킷을 다루기보다는 모든 루트킷이 사용하는 일반적인 접근 방법을 설명한다. 각 장마다 기본적인 기술 개념과 목적을 설명하고 이어서 샘플 코드를 이용해 그것을 어떻게 구현하는지를 보여준다. 이렇게 제공된 정보를 이용해 여러분은 샘플 코드가 다양한 작업을 수행하도록 확장시킬 수 있다. 커널 레벨에서는 여러분이 상상할 수 있는 모든 작업을 수행하도록 할 수 있다. ★ 이 책의 대상 독자 ★ 이 책은 컴퓨터 보안에 관심이 있고 정확한 시각으로 보안 위협을 바라보고자 하는 사람들을 대상으로 한다. 침입자가 어떤 방법으로 컴퓨터 시스템에 대한 접근 권한을 획득하는지 설명하는 책들은 많지만 일단 공격자가 그런 권한을 획득하면 어떤 일이 발생할 수 있는지 설명하는 책들은 많지 않다. 이 책은 공격자가 공격 대상 시스템에서 은닉하기 위해 무엇을 할 수 있는지를 설명할 것이다. 마이크로소프트를 포함한 대부분의 소프트웨어 제조사들은 루트킷을 그렇게 심각하게 받아들이지 않고 있다. 이 점이 바로 우리가 이 책을 출판하게 된 계기라고 할 수 있다. 이 책의 내용은 루트킷이나 운영체제 분야에 수년간 종사해 온 사람들에게는 그리 혁신적인 것은 아니지만 대부분의 사람들에게 루트킷이 대단히 심각한 위협이라는 것을 보여주고 있다. 또한 여러분의 바이러스 스캐너나 데스크톱 방화벽만으로는 충분하지 않다는 사실을 깨닫게 하며, 루트킷이 여러분의 시스템에 침투해서 몇 년 동안이나 몰래 존재할 수 있다는 것을 보여준다. 루트킷 정보를 최대한 잘 전달하기 위해 우리는 공격자의 입장에서 전반적으로 이 책의 내용을 작성했지만 마지막 부분에서는 방어적인 측면의 내용으로 채워진다. 이 책을 통해 공격자의 목적과 기술을 배워 나감으로써 여러분은 시스템의 약점과 그것을 보완하는 방법에 대해 알게 될 것이다. 또한 이 책은 여러분의 시스템 보안성을 향상시키고 보안 소프트웨어 구입시에 합리적인 결정을 내릴 수 있도록 도와줄 것이다. ★ 소스코드 다운로드 ★ 이 책에서 제시하는 대부분의 소스 코드는 rootkit.com을 통해 다운로드할 수 있으며, 책 전반에 걸쳐 각 예제 소스를 다운로드할 수 있는 URL을 알려 주고 있다. 여러 루트킷 제작자들 또한 rootkit.com 사이트에 그들의 연구 결과를 올리기 때문에 여러분은 rootkit.com을 통해 최신의 유용한 기술을 접할 수 있을 것이다. 이 책에서 사용된 소스 코드와 프로그램은 http://www.acornpub.co.kr/book/rootkit에서도 내려받을 수 있다. |