본 글은 개인적인 의견이며 본 글에 설명되어 있는 공부 방법보다 훨씬 더 좋은 공부 방법이 있을 수 있다는 점을 미리 알려드립니다. 만약 제가 설명한 공부 방법보다 효율 적인 방법을 알고 계신다면 댓글로 공유해주시면 감사하겠습니다.

본 글은 포너블과 웹해킹 '기초' 공부방법에 대해서만 설명해놨습니다.

바쁘신 분들은 서론은 그냥 넘어가셔도 됩니다!

 

서론

 저는 14년 제가 졸업한 대학에 편입했을 때부터 회사에 다니고 있는 지금까지 동아리 후배들을 위한 교육 및 멘토링을 진행하고 있습니다. 편입 직후에는 제가 해킹 공부를 갓 시작했을 때라 아는 게 없어서 무식하게 단순히 제가 공부한 내용을 정리해서 알려주는 수준이었죠. 하지만 여러 대외활동을 하면서 다양한 공부방법을 전해 듣고 실제로 겪어보면서 매년 입문자들을 위한 공부 방법을 개선해왔습니다. 작년 2학기쯤 때부터 쭉 개선해오던 공부 방법이 어느 정도 정립된 듯싶어서 이 공부 방법을 공유하고자 합니다. 해킹 및 정보보안에 입문하고 싶지만 어떻게 시작해야 할지 감도 안 잡혀서 막막한 분들에겐 어느 정도 도움이 되지 않을까 싶네요. 물론, 완벽한 공부방법이 아니다 보니 읽고 나서 '비효율적'이라고 생각하시거나 '좋지 않은 방법'이라고 생각하시는 분들이 계실 겁니다. 그런 분들은 어느 부분을 개선해야 할지 알려주시면 감사하겠습니다 :)

 

공부 방법

 본 설명은 비전공자를 기준으로 합니다.

 해킹을 쉽게 설명하자면 '서비스(프로그램/웹 등)에 비정상적인 방법을 통해 내가 원하는 것을 얻어내는 것' 이라고 보면 됩니다. (물론 정확한 설명은 아닙니다.) 그럼 우리는 그 서비스에 대한 완벽한 이해까지는 아니더라도 적당한 이해는 필요할겁니다.

 예를 들어서 여러분들이 어느 날 지각을 했는데 선생님 몰래 출석부를 조작해서 지각을 출석으로 변경하고 싶다고 가정해봅시다. 그러기 위해서는 여러분들은 출석부를 읽을 줄 알아야 하고 출석부에 마킹된 표시의 의미를 알아야 합니다. 그리고 지각을 출석으로 변경할 때의 절차도 알아야 하죠.

예시용 출석부

 만약 여러분이 '김가나'씨고 6월 5일 날 지각을 했지만 출석부를 조작하여 지각을 출석으로 변경하고 싶다고 했을 때 위의 내용을 보고 출석 체크의 절차에 대해 이해할 수 있어야 합니다. 다행히 예시용 출석부 하단에 각 표시에 대한 설명이 있군요. 그런데 날짜 우측의 공란과 하단의 공란에 대해 정확한 설명이 없습니다. 하지만 하단 서명은 최종 확인란이라고 추측이 가능하고 우측 공란은 지각자를 출석으로 수정했을 때 담당자가 서명하는 것이라고 추측이 가능합니다. 그럼 여러분들은 지각 표시에 선하나 더 긋고 우측에 담당자 서명란에 서명을 하고 하단의 공란에 다시 한번 서명을 하면 원하는 바를 이룰 수 있습니다!

 위의 예시처럼 뭔가를 조작하기 위해서는 '완벽한 이해'까지는 아니더라도 '적당한 이해'가 필요합니다. 완벽하게 이해하면 좋겠지만 현실적으로 매우 어려우니 위의 예시처럼 어느 정도 이해하고 추측할 수 있는 정도의 이해면 됩니다.

 

 그럼 본격적으로 해킹을 위해서 어느정도 알고 있어야 하고 어떻게 공부해야 할까요? 먼저 공부 방법에 대해 설명드리자면 크게 2가지 방식이 있습니다. Top-Down과 Bottom-Up이라고 부르는 방식이죠. 간단히 설명하자면 아래 그림으로 요약이 가능합니다. (그림이 이쁘진 않아요..)

Bottom-Up / Top-Down

 

 Bottom-Up의 경우는 해킹 공부를 위해 배경 지식을 먼저 학습하고 공격 기법을 학습한 뒤 본격적인 해킹 문제(워게임이나 CTF 등)를 푸는 방법입니다. Top-Down은 이와 반대로 해킹 문제 혹은 공격 기법을 먼저 접하고 이를 위해 필요한 배경 지식만 골라서 학습하는 방법이죠. 두 방법의 장단점이 있습니다.

 먼저 Bottom-Up의 경우 Top-Down에 비해 훨씬 효율적입니다. 애당초 필요한 내용을 다 알고 있는 상태에서 다음 단계로 넘어가는 형식이니 시간적인 면이나 학습적인 면에서 매우 효율적일 수 밖에 없죠. 하지만 재미나 흥미 등의 동기부여면에서는 Top-Down에 비해 약하다고 볼 수 있습니다.

 반면에 Top-Down의 경우 재미나 흥미 등의 동기부여면에서는 강하지만 효율적인 측면에서는 Bottom-Up을 따라갈 수 없습니다. 에당초 문제를 직면하고 문제의 의도를 파악한 뒤 공격 기법을 공부하다가 이해가 안돼서 공격 기법 설명에 나오는 배경지식들을 하나하나 검색하며 공부하는 방법인데 효율이 좋을 리가 없죠. LoL로 따지면 상황에 따른 아이템 트리를 그때그때 인벤에서 검색하며 빌드업 방법과 이미 상황에 따른 아이템 트리를 다 알고 있는 상황에서 빌드업하는 방법 정도라고 생각하시면 이해가 가실 거라 생각합니다. (LoL을 안 한 지 오래돼서 맞는 비유인지는 잘 모르겠네요.. 예전에 제가 저랬거든요.)

 위의 내용을 보면 '뭐야 그럼 Bottom-Up이 최고네!'라고 하시겠지만 사실 막상 해보면 그렇지 않습니다. 이런 문제는 우리가 흔히 볼 수 있는 무협, 판타지, 액션 장르의 웹툰이나 영화 등에 자주 나옵니다.

웹툰 강남 도깨비중 일부

 위의 짤처럼 주인공이 강해지기 위해 수련받는 도중에 강력한 기술이나 스킬을 알려주기는 커녕 '기초 훈련'이라는 이유로 허드렛일을 하다가 빡치는 장면을 많이 보셨을 겁니다. 위처럼 '아니 나는 해킹을 배우고 싶은데 언제까지 이런 걸 배워야 하지?'라고 생각하는 경우도 있고 배경 지식을 공부하다가 재미없어서 포기하는 친구들을 많이 봐왔습니다. 특히 개발보단 해킹이 이런 일이 더 흔합니다. 개발의 경우 '프로그래밍 언어'를 학습한 뒤 바로 간단한 결과물이라도 만들어낼 수 있지만 해킹의 경우 '프로그래밍 언어'를 학습 한 뒤 '공격 기법'을 학습하고 나서야 간단한 문제라도 풀 수 있기 때문이죠.

 그래서 저는 이런 문제를 해결하고자 Top-Down과 Bottom-Up을 반반(?)씩 섞어서 후배들에게 알려주고 있습니다. '최소한의 배경지식'만 학습하고 바로 '해킹 기법'을 학습시킨 뒤 그 기법에 맞는 '해킹 문제'를 풀게 하는 거죠. 정확한 커리큘럼은 아래와 같습니다.

대략적인 커리큘럼

 포너블과 웹해킹 모두 공통적으로 C언어 혹은 객체지향 언어 1개를 필수로 학습합니다. 포너블의 경우 기초 문제들이 C나 C++로 이루어진 경우가 많아서 필수고 웹의 경우는 지금 바로는 도움이 되지 않아도 향후에 도움이 되기 때문이죠. 리눅스 역시 포너블의 경우 리눅스에서 풀어야 하는 경우가 많고 포너블에 사용하는 툴들이 리눅스에서 구동되는 경우가 많기 때문이죠. 웹의 경우엔 대부분의 웹 서비스가 리눅스에서 사용돼서 두 가지 부분은 공통적으로 학습을 권장하고 있습니다.

 단, 언어의 경우는 간단하게 포인터와 사용자 함수 부분까지만 학습시키고 리눅스도 단순히 기초 명령어 수준까지만 학습시킵니다. 언어의 경우 어차피 학교에서 나머지 부분을 다루기 때문에 굳이 뒷부분을 다룰 필요가 없고 리눅스의 경우도 초반엔 리눅스 기초 명령어만 다룰 줄 알아도 문제 푸는 데엔 지장이 없기 때문이죠.

 3단계부터는 갈립니다. 포너블의 경우 Assembly를 웹의 경우 HTML, PHP, MySQL을 학습시킵니다. Assembly의 경우 그냥 간단하게 함수 생성 및 호출 정도까지만 학습시키고 웹의 경우엔 HTML과 PHP, MySQL을 학습한 뒤 간단하게 게시판 구축하는 것까지 진행합니다. 게시판엔 회원가입, 로그인, 게시글 및 댓글 생성/수정/삭제/조회, 파일 업로드/다운로드 기능까지 구현합니다.

 4단계의 경우 포너블은 매우 유명한 달고나 문서라젠카 테크노트(https://www.lazenca.net/), 드림핵(https://dreamhack.io/)를 통해 학습시키고 웹의 경우 OWASP TOP 10드림핵(https://dreamhack.io/)을 통해 학습시키고 있습니다.

DreamHack

 5단계의 경우 포너블은 LOB Redhat을 통해 Stack 영역에 대한 공격 기법 학습을 먼저 진행하고 그 후에는 상황에 따라 LOB Fedora 혹은 드림핵, 폰케알(http://pwnable.kr/) 등을 학습시키고 있습니다. 웹의 경우에는 워게임 문제풀이 전에 각자 구축한 게시판을 공개하여 서로가 서로의 게시판에 대한 실제 취약점을 찾아보고 간단한 보고서까지 작성해서 공유하고 각자 해당 보고서를 보고 자신의 게시판의 취약점을 패치하는 작업까지 진행한 뒤 웹케알(http://webhacking.kr/), 드림핵 등의 문제를 풀이시키고 있습니다.

공격의 흔적이 난무하는 훈훈한(?) 모습

 이 이후에는 개별적인 학습 지도만 해주고 있습니다. 저 정도면 기초 부분은 끝났고 대략적인 학습 방법도 익힌 상태라 알아서 공부를 잘하더라고요. 가끔 '여기까지 했는데 이제 뭘 해야 할지 모르겠다.'라고 연락 올 때나 이렇게 저렇게 공부해라 정도만 하고 있습니다. 이 방법을 통해 여러 명을 가르쳤는데 저보다 더 잘된 친구도 있고 단기간에 네이버 버그 바운티 프로그램에 취약점을 여러 개 제보한 친구도 있는 걸 보면 나름 괜찮은 학습법이라 생각합니다.

 

 이 포스팅 내용이 해킹 공부의 앞길이 막막하신 분들에게 큰 도움이 됐으면 좋겠습니다. :)

'기타' 카테고리의 다른 글

황금연휴에 DDoS 공격 받은 이야기..  (0) 2020.05.10
글또 4기 시작.  (0) 2020.03.01
근황 업데이트  (0) 2020.01.18
2019 하반기 CJ 인적성 후기  (0) 2019.10.22
2019 하반기 KT 인적성 후기  (0) 2019.10.13

+ Recent posts