Top

모의 침투 입문자를 위한 파이썬 3 활용 [파이썬 3 기반의 TCP/IP 활용 지침서]

  • 지은이오동진, 박재유
  • 감수자이경문
  • ISBN : 9791161753973
  • 25,000원
  • 2020년 02월 28일 펴냄
  • 페이퍼백 | 288쪽 | 188*235mm
  • 시리즈 : 해킹과 보안

책 소개

2020년 세종도서 학술부문 선정도서
요약

데비안/우분투 계열의 운영 체제에서 제공하는 파이썬 3.4를 이용해 TCP/IP 소켓을 구현하고, 이를 기반으로 주요한 모의 침투 도구의 구현 과정을 소개한다.

감수의 글

공과 계열의 대학에서는 네트워크 이론 과목이 대부분 필수 항목으로 들어가 있다. 대학뿐만 아니라 관련 교육 기관에서도 네트워크 이론을 접할 수가 있는데, 수업의 내용은 암기 과목으로 여겨져 왔다. 교육은 대부분 달달 외우기식으로 진행된다. 프로토콜이 왜 이렇게 디자인됐을까 하는 능동적 사고 방식을 할 겨를도 없이 기존에 설계가 이렇게 돼 있으니 그저외우기만 하면 된다는 식의 주입식 내용 전달이 대부분이다.
현업에서 네트워크와 관련된 일을 하면서 이러한 교육 방식(의구심을 갖지 말고 외우기)은 단기간 학점 취득에는 도움이 되나, 근본적인 네트워크 설계 이해에는 오히려 역효과를 가지고 올 수 있다는 생각이 들었다. 기존의 교육 방식으로는 현업에서 요구하는 바를 충족시키기에는 한계가 있음을 절감한다.
해결 방안이 없는 것은 아니다. 실무 위주의 교육을 하는 것이다. 직접 패킷을 잡아가면서 각 헤더의 연결 관계를 이해하고, 프로토콜의 각각의 필드가 어떠한 역할을 하는지 스스로 확인하면서 습득하는 것이 한결 나은 교육 방식이라고 생각한다.
지금까지 이러한 방식의 교육을 하는 데는 C 언어로 된 교재가 많이 이용됐다. 네트워크 분야와 시스템 분야는 떨어뜨릴 수 없는 부분이 있고, 이러한 영역을 접하는 데는 C 언어가 가장 적합한 언어로 인식돼 왔기 때문이다. 하지만 시대가 지나면서 다양한 프로그래밍 언어가 생겨나고 있으며, 요즘에는 파이썬(Python) 언어가 기존의 C 언어가 하는 역할들을 조금씩 대체하고 있는 추세다.
Scapy는 네트워크 패킷을 잡아서 분석할 수 있도록 하는 파이썬 기반의 프로그램이다. 네트워크를 실용적인 차원에서 공부하고 싶다면 Scapy를 배우는 것이 훨씬 효과적인 선택일 수도 있다. 하지만 국내서 중에서 Scapy에 대해 자세한 정보를 전달하는 교재는 그리 보이지 않는 것 같다. 이 책은 네트워크에 입문하는 사람들뿐만 아니라, 파이썬 프로그래밍을 통해 패킷을 분석하면서 제대로 된 네트워크의 이해를 돕고자 하는 이들에게 실질적으로 많은 도움을 줄 수 있는 책이라 평가할 수 있다.
단순히 이 책을 읽기만 하지 말고, 책에서 설명하는 대로 실습 내용을 차근차근 따라가다 보면 어느덧 네트워크 전문가의 길에 들어서 있는 자신을 발견할 수 있을 것이다.

감수자 소개

이경문

인하대학교에서 컴퓨터 공학을 전공했다. 대학 시절 삼성 소프트웨어멤버십에서 활동하면서 IT와 관련된 당시 최신 기술들을 습득했다. 졸업한 후 새롬기술에서 다이얼패드 인터넷 전화의 클라이언트 모듈을 담당했고, 아라기술에서 ISP급 트래픽을 분류 처리하는 업무를 맡았으며, 시큐아이에서 각종 애플리케이션 트래픽 처리 업무를 담당했다. 씨디네트웍스 회사에 다니며 C/C++ 기반으로 웹 프록시를 제작하는 프로젝트에 참여하기도 했다. 프리랜서 활동 기간에는 다양한 클라이언트를 만나며 네트워크 분야에서 실질적인 많은 요구 사항을 접하고 처리했다.
삼성 멀티캠퍼스에서 네트워크 취약점 분석과 보안을 주제로 강의했었고, 현재는 중부대/고려대/BoB 등에서 네트워크 보안 교육을 진행하고 있다. 이력이 교육 분야로 조금 전향되기는 했어도, 아직은 순수 개발에 몸담고 있는 현역으로서 매일 코딩에서 손을 놓지 않으려고 노력하고 있다.

이 책에서 다루는 내용

■ 모든 내용을 파이썬 3에 기반해 작성
■ 각 계층별 헤더를 중심으로 TCP/IP 소켓 구현 과정 소개
■ TCP/IP 소켓 구현 과정을 기반으로 주요 침투 도구 소개
■ 소스 코드에 비중을 두고 최대한 이해하기 쉽게 주석을 달고 순차적인 구현 과정 제시
■ Github를 통해 본문에서 사용한 소스 코드를 지속적으로 제공

이 책의 대상 독자

■ TCP/IP 이론을 숙지한 사람
■ 파이썬 3 기본 문법을 숙지한 사람
■ 데비안/우분투 환경에 익숙한 사람
■ 모의 침투 기량을 한 단계 높이려는 사람
■ 대학교와 대학원에서 정보 보안을 전공하는 사람

이 책의 구성

제1장, ‘주요 헤더의 구조와 항목’에서는 네트워크 프로그래밍을 시작하기 위한 사전 지식으로서 TCP/IP 패킷 헤더를 설명한다. 제1장의 배경 지식을 토대로 소스 코드를 이용해 패킷을 자유자재로 생성하거나 조작할 수 있다.
제2장, ‘주요 내장 모듈의 소개와 활용’에서는 본격적으로 네트워크 프로그래밍을 시작하기에 앞서, 파이썬 3의 주요 모듈을 살펴본다. 파이썬은 현재 2 버전과 3 버전이 혼용되고 있지만, 향후 2 버전의 지원이 중단될 예정이므로 3 버전을 기준으로 설명한다. 파이썬 3의 os•socket 등의 패키지 활용법은 반드시 숙지하기 바라며, 바이트 순서 내용을 명확히 이해하고 다음 장으로 넘어가기 바란다.
제3장. ‘소켓의 개념과 객체 생성 방법’에서는 본격적으로 파이썬 3의 socket 모듈을 사용해 간단한 통신 객체 생성 방법을 설명한다. 특히, 통신 연결 과정에서 사용되는 connect()•bind()•accept() 등과 같은 함수들이 호출되는 순서를 서버 측과 클라이언트 측에 알맞게 배치할 수 있도록 반드시 숙지하고 넘어가기 바란다.
제4장, ‘간단한 서버와 클라이언트 구현과 응용’에서는 네트워크 관점에서 서버와 클라이언트를 서로 다른 위치에 있다고 가정하고, 소켓을 통해 상호 통신이 가능함을 확인한다. 파이썬 3는 다른 언어에 비해 월등히 수월하게 소켓 관련 기능을 구현할 수 있으므로, 필수 함수 정도는 꼭 기억하기 바란다.
제5장, ‘간단한 포트 스캐너 구현’에서는 포트 스캐닝을 수행할 수 있는 오픈 소스 nmap 패키지를 파이썬 3와 연동해 간단한 포트 스캐닝 도구를 구현한다. 제5장의 내용을 정확히 숙지한다면, nmap 관련 스크립트 코드들을 해석하는 기초를 쌓을 수 있다.
제6장, ‘간단한 FTP 클라이언트 구현’에서는 직접 FTP 클라이언트 프로그램을 구현하는 과정을 진행한다. 여기에서 제시한 내용을 기반으로 각자에게 필요한 기능을 검색을 통해 하나씩 추가하면서 구현해보기 바란다.
제7장, ‘원시 소켓 방식에 따른 헤더의 생성’에서는 제3, 4장에서 다룬 표준 소켓 방식(socket.SOCKDGRAM)이 아닌, 사용자가 직접 임의로 제어할 수 있는 원시 소켓 방식(socket.SOCKRAW)을 학습한다. 이를 이해하기 위한 선행 지식으로 각 방식의 차이점을 살펴보고, 사용자가 직접 헤더를 구현할 때 필요한 코드를 설명한다. 이 방식으로 생성된 헤더의 복원 과정은 추후 제10장에서 자세히 다룬다.
제8장, ‘오류 검사 여부에 따른 TCP/IP 헤더의 생성’에서는 원시 소켓을 생성할 때 TCP 헤더의 오류 검사 여부에 따라 패킷의 내용이 상이하다는 것을 확인한다. 이러한 사전 지식이 없다면, 예측과 다른 전개에 당황할 수 있다. 따라서 반드시 TCP 헤더의 오류 검사 여부를 점검해야 하는 만큼 제8장의 설명 내용을 잘 이해하고 넘어가기 바란다.
제9장, ‘수신 관점에 따른 주요 헤더의 복원’에서는 패킷의 내용을 역으로 분석해 관련 정보를 해석할 수 있는 접근 방법을 설명한다. 이는 제8장의 과정에 대한 리버스 엔지니어링이라고 볼 수 있으며, 결국 패킷 스니핑의 근간을 이루는 기술을 구현한 것이다.
원시 소켓 방식에 따른 헤더의 생성과 복원은 이후 내용에서도 중요한 만큼 충분히 이해할 때까지 반복해서 익히기 바란다.
제10장, ‘하위 계층 기반의 원시 소켓 방식에 따른 주요 헤더의 복원’에서는 하위 계층 기반의 원시 소켓 방식을 통해 물리 계층에서부터 응용 계층까지 복원이 가능하다는 사실을 설명한다. 이를 통해 캡처된 임의의 패킷 내용을 직접 분석해 보는 다양한 경험을 쌓기 바란다.
제11장, ‘헤더 복원을 통한 단순한 패킷 스니핑 도구의 구현’에서는 제9장을 기반으로 스니핑 도구를 간단히 구현한다. 제11장에서 구현한 도구를 기반으로 좀 더 정교하고 다양한 기능을 추가할 수 있기를 바란다.
제12장, ‘ARP 스푸핑 공격 도구의 구현’에서는 ARP 스푸핑 공격의 개념을 설명하고, 파이썬 3을 이용해 ARP 스푸핑 공격 도구를 구현한다다. ARP 스푸핑 공격은 특히 공항이나 카페 등 공용으로 사용할 수 있는 내부 무선망 환경에서 상당히 치명적이다. 따라서 말미에 대응책까지 제시한다. 제13장, ‘스캐닝 도구의 구현’에서는 socket만을 사용해 나머지 세부적인 스캐닝 기능을 직 접 구현할 수도 있다는 것을 설명한다. 제5장에서 nmap을 이용한 간단한 도구를 구현한 적이 있지만, 이는 개발 속도 향상을 위해 모듈을 사용한 것에 불과하기 때문에 제13장의 내용을 참고해 자신만의 포트 스캐닝 도구를 구현해 보기 바란다.
제14장, ‘서비스 거부 공격 도구의 구현’에서 언급한 서비스 거부 공격은 가장 단순하면서 도 가장 효과적인 공격일 수 있다. 제14장에서 다룬 소스 코드를 통해 서비스 거부 공격 도구를 구현한다. 서비스 거부 공격 도구의 동작 원리를 충분히 이해한다면, 칼리 리눅스 등의 모의 침투 운영체제에 포함된 hping 등과 같은 도구들이 어떻게 구현돼 있는지 충분히 가늠할 수 있을 것이다.
제15장, ‘네트워크 퍼징 도구의 구현’에서는 퍼즈 테스팅 방안을 확인하고, scapy를 통해 실제적 퍼징 방안을 확인한다. 이 방법론을 통해 얻어진 정보를 단서로 독자들 각자가 한층 더 심화된 모의 침투 기법 능력을 함양하기 바란다.

저자/역자 소개

지은이의 말

지금 뒤돌아 보면 내가 관공서에서 정보 기술 분야를 강의한 지도 벌써 15년이 흘렀다. 그동안 강의했던 내용을 기반으로 2015년 생애 처음으로 내 책을 출간했다. 바로 『칼리 리눅스 입문자를 위한 메타스플로잇 중심의 모의 침투』(2019)다. 이후 6권의 책을 더 출간했다. 그리고 이제 이 책은 나의 8번째 저서이자 3번째 공저다.
이 책의 주제는 파이썬 3 버전을 이용한 TCP/IP 소켓 구현과 응용이다. 다시 말해, 이전에 내가 출간한 『해킹 입문자를 위한 TCP/IP 이론과 보안 2/e』(2019)과 『해커의 언어 파이썬 3 입문』(2018) 다음 내용에 해당하는 책이 바로 이 책이다. 그런 만큼 이 책을 완전히 소화하기 위해서는 『해킹 입문자를 위한 TCP/IP 이론과 보안 2/e』에서 다루는 내용을 충분히 이해한 뒤 『해커의 언어 파이썬 3 입문』을 통해 파이썬 3 버전의 기본 문법을 숙지해야 한다. 이는 이 책에서 TCP/IP 이론에 대한 설명이나 기본 문법 내용이 빠진 이유이기도 하다. 이런 내용까지 이 책에 모두 담는다면 분량이 너무 많아졌을 것이다.
이 책에서는 파이썬 3 버전을 이용해 TCP/IP 소켓을 구현하는 과정을 소개하고, 그러한 소켓 구현 지식을 기반으로 가장 대표적인 모의 침투 도구를 구현하는 과정을 소개한다. 그러나 모의 침투 도구의 종류는 무수히 많기 때문에 이 책에서 모든 내용을 소개할 수는 없다. 이 책의 기본 내용을 완전히 터득한다면 나머지 도구들은 독자의 필요에 따라 스스로 구현할 수 있으리라 확신한다.
이런 점에서 본다면 이 책은 모의 침투 전문가를 지향하는 독자에게 파이썬 3 버전을 이용한 TCP/IP 소켓 구현과 그에 기반한 응용 과정을 제시하는 데 목적이 있다.
전반부, 다시 말해 제1장부터 제10장까지는 내가 2019년 1월과 2월 사이에 주도적으로 집필했다. 전반부에서는 파이썬 3 버전을 이용해 TCP/IP 소켓을 구현하는 내용을 소개했다. 다양한 침투 도구를 개발하기에 앞서 해당 내용을 완전히 터득할 때까지 반복해 익히기 바란다. 제11장부터 제15장까지가 후반부로서 박재유 선생님이 2020년 1월과 2월 사이에 주도적으로 집필한 부분이다. 후반부에서는 전반부에서 익힌 내용을 기반으로 가장 대표적인 침투 도구를 구현하는 과정을 소개했다. 좀 더 많은 유형을 담으면 좋았겠지만 늘 제한적인 지면을 고려해야 하는 만큼 유형을 선정하는 데 많은 고심을 해야 했다. 특히, 제15장은 국내 서적에서는 좀처럼 확인하기 어려운 내용을 담았다. 개인적으로 볼 때 박재유 선생님의 탁월한 기량이 나타난 부분이 제15장이라고 생각한다.
다른 분야와 마찬가지로 사이버 보안 분야 역시 한 권의 책으로 모든 내용을 담을 수는 없다. 그래서 늘 다양한 책을 통해서 지식을 습득할 수밖에 없는 실정이다. 파이썬 언어의 매력과 활용은 무궁무진하다. 이 책은 파이썬의 무궁한 활용 분야 중 소켓에 초점을 두고 그에 기반한 응용 방식을 소개했다. 아울러 TCP/IP 이론을 숙지한 독자 또는 파이썬 3의 기본 문법을 숙지한 독자, 데비안/우분투 환경에 익숙한 독자, 모의 침투 기량을 한 단계 높이려는 독자, 대학교와 대학원에서 정보 보안을 전공하는 독자 등을 대상으로 집필했다. 이런 분들에게 이 책이 일익을 담당할 수 있다면 우리에게는 더할 나위 없을 기쁨이겠다.

지은이 소개

오동진

서울에서 출생해 인천대학교(구 인천전문대학) 일어과와 경희사이버대학교 정보통신학과를 졸업하고 한국외국어대학교 교육대학원에서 전산교육학 석사를 취득했다.
약 9년 동안 한국 통신(KT) 등에서 근무하며 다양한 행정 처리와 정보 기술 환경을 경험했다. 사무 처리와 관련해 한자 능력 2급 등을 취득했고, 정보 기술과 관련해 정보처리산업기사•정보보안산업기사•CCNA/CCNP 등과 같은 자격증을 취득했다. 또한 교원 2급 자격증과 직업 능력 개발 훈련 교사 3급 자격증 등을 취득했다.
2004년부터 현재까지 국가공무원인재개발원과 서울시인재개발원 등에서 정보보안기사 자격증과 모의 침투 분야를 강의 중이다. 2016년 경찰인재개발원(구 경찰교육원)에서 우수 외래 강사로 감사장을 받았다. 사이버 보안 중 다양한 모의 침투 운영체제와 사회공학에 특히 관심이 많다.
강의가 없을 때는 문학•사학•철학과 관련된 책을 읽거나 국가 정보학과 같은 책을 읽는다. 이와 관련해 페이스북에서 모의 침투 연구회(www.facebook.com/groups/metasploits)와 사이버 안보 연구회(www.facebook.com/groups/koreancyberwar)를 개설해 활동 중이다.
저서로는 에이콘출판사에서 출간한 『해킹 입문자를 위한 TCP/IP 이론과 보안 2/e』(2019), 『칼리 리눅스 입문자를 위한 메타스플로잇 중심의 모의 침투 3/e』(2019), 『백박스 리눅스를 활용한 모의 침투』(2017), 『해커의 언어 파이썬 3 입문』(2018), 『소켓 개발 입문자를 위한 백박스 기반의 파이썬 2.7』(2016) 등이 있고, 공저로는 『데비안 리눅스 활용과 보안』(2017)•『우분투 리눅스 기반의 IDS/IPS 설치와 운영』(2018) 등이 있다.

박재유

한국항공대학교에서 컴퓨터 정보공학을 전공하고, 공군 정보통신 장교로 복무하며 정보 보안에 입문했다. 전역 후 KITRI의 Best of the Best 4기 디지털 포렌식 과정을 수료하고 한국과학기술원(KAIST) 대학원에 입학해 소프트웨어 보안을 연구했다. 석사 졸업 후 현재는 LG전자 소프트웨어 공학연구소에서 보안 기술(퍼즈 테스팅과 바이너리 분석)을 연구하고 있다.
2017년 대덕 소프트웨어 마이스터 고등학교의 멘토로 위촉돼 강의 및 디지털 포렌식 동아리 활동을 지도했고, 현재 LG전자에서 소프트웨어 보안을 위한 퍼즈 테스팅 과정을 담당하는 사내 강사로도 활동하고 있다.
정보처리기사•전자계산기조직응용기사•정보보안기사•디지털 포렌식 전문가 2급 등을 보유하고 있다. 또한 2016년 한국정보기술연구원(KITRI) 주관의 정보 보안 스타트업 프로젝트 그랑프리 우승, 2018년 한국 디지털 포렌식 학회 주관의 챌린지에서 장려상을 수상했다.
사이버 범죄와 소프트웨어 보안에 특히 관심이 많아 한국정보보호학회•CODEGATE•디지털포렌식학회 등에서 연구 결과를 발표했다. 최근에는 KISA 사이버 침해 사고 정보 공유 세미나, FORENSIC INSIGHT의 FITALK 등에 참여해 주로 리눅스 악성 코드 관련 동향을 공유하고 있고, 서울 지방 경찰청 사이버 명예 경찰 누리캅스로 활동하고 있다.
『APT 악성 코드와 메모리 분석 첼린지 풀이 사례』(비팬북스, 2016), 『VolUtility 리뷰와 첼린지 문제 풀이 사례』(비팬북스, 2016), 『리눅스 시스템의 메모리 포렌식』(브이메이커스, 2018) 등 메모리 포렌식 관련 전자책을 집필했으며, 틈틈이 떠오르는 연구 주제는 개인 블로그인 cpuu.postype.com을 통해 느리지만 꾸준하게 흔적을 남기려 애쓰고 있다.

목차

목차
  • 1장. 주요 헤더의 구조와 항목
    • 1-1 UDP 헤더의 구조와 항목
    • 1-2 TCP 헤더의 구조와 항목
    • 1-3 IP 헤더의 구조와 항목
    • 1-4 ICMP 헤더의 구조와 항목

  • 2장. 주요 내장 모듈의 소개와 활용

  • 3장. 소켓의 개념과 객체 생성 방법

  • 4장. 간단한 서버와 클라이언트 구현과 응용

  • 5장. 간단한 포트 스캐너 구현

  • 6장. 간단한 FTP 클라이언트 구현

  • 7장. 원시 소켓 방식에 따른 헤더의 생성

  • 8장. 오류 검사 여부에 따른 TCP/IP 헤더의 생성

  • 9장. 수신 관점에 따른 주요 헤더의 복원

  • 10장. 하위 계층 기반의 원시 소켓 방식에 따른 주요 헤더의 복원

  • 11장. 헤더 복원을 통한 단순한 패킷 스니핑 도구의 구현

  • 12장. ARP 스푸핑 공격 도구의 구현

  • 13장. 스캐닝 도구의 구현
    • 13-1 호스트 스캔 도구의 구현
    • 13-2 포트 스캔 도구의 구현
    • 13-3 다중 스레딩을 이용한 고속 스캐너 도구의 구현

  • 14장. 서비스 거부 공격 도구의 구현
    • 14-1 LAND 공격 도구
    • 14-2 UDP/TCP 플러딩 공격 도구
    • 14-3 슬로우로리스 공격 도구

  • 15장. 네트워크 퍼징 도구의 구현
    • 15-1 퍼징 개요
    • 15-2 Echo Server에 대한 퍼징
    • 15-3 FTP Server에 대한 퍼징

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p. 30 마지막행]
긴급 포인터(Urgent Pointer) 항목 역시도 1비트다.
->
긴급 포인터(Urgent Pointer) 항목 역시도 16비트다.

[p.30 아래에서 4행]
UDP·헤더 TCP 헤더의
->
UDP 헤더·TCP 헤더의

[p. 34 예제 1-9]

[p.52 아래에서 4행]
이제 소개할 os 모듈은 예제 2-8에서 출력한 프로토콜·포트 번호와 관련이 있다. 다시 말해 /etc/services 파일에 있는 프로토콜·포트 번호에 기반해 os 모듈을 사용할 수 있다.
->
이제 소개할 socket 모듈은 예제 2-8에서 출력한 프로토콜·포트 번호와 관련이 있다. 다시 말해 /etc/services 파일에 있는 프로토콜·포트 번호에 기반해 socket 모듈을 사용할 수 있다.

[p.59 아래에서 2행]
os 모듈과 struct 모듈
->
socket 모듈과 struct 모듈

[p.73 예제 3-5 마지막 행]
proto=0
->
proto=17

[p.75 1행]
예제 3-5에서는 proto=0과
->
예제 3-5에서는 proto=17과

[p.80 2-3행]
UDP 소켓 클라이언트를 구현한 예제 3-11은
->
TCP 소켓 클라이언트를 구현한 예제 3-11은

[p.84 3행]
이어서 예제 3-11에 기반해 TCP 소켓 클라이언트를 구현하면 예제 4-2와 같다.
->
이어서 예제 3-11에 기반해 TCP 소켓 클라이언트를 구현하면 예제 4-4와 같다.

[p.185 5행]
제7장에서는 하위 계층 기반의
->
이번 장에서는 하위 계층 기반의

[p.259 예제 15-16 소스코드 10행]
for length in range(100000, 500000, 10000): #2000~5000 사이의 값을 100 단위씩 순회
->
for length in range(2000, 5000, 100): #2000~5000 사이의 값을 100 단위씩 순회

[p.263 예제 15-20 소스코드 마지막행]
for length in range(100000, 500000, 10000): #10만~50만 사이의 값을 순회
->
for length in range(100000, 500000, 10000): # 10만 ~ 50만 사이의 값을 1만 단위씩 순회