나는 노트 한 권으로 시작했다. 텍스트 에디터나 마크다운 파일이 아니라, 내가 이해하지 못하는 명령어들로 가득 찬 스프링 제본 종이 노트였다. ls, grep, find, chmod, nmap을 적어 내려갔다. 페이지마다 구문을 쌓아 올리며 리눅스와 사이버 보안을 마치 어휘 테스트처럼 대했다. 남들보다 더 많은 플래그(flag)를 알면 유능해질 것이라고 믿으면서 말이다. 구문을 유창하게 복사할 수는 있었다. 하지만 어떤 명령어가 왜 특정 결과를 반환했는지 설명해 보라고 하면, 나는 침묵할 수밖에 없었다. 그 침묵이 문제였다.
노트의 함정
그 노트는 마치 진전이 있는 것처럼 보였다. 페이지를 넘길 때마다 더 많은 잉크가 더해졌다: find / -name "*.conf", nmap -sV, 파이프와 정규 표현식을 사용한 grep. 튜토리얼에서는 이런 방식이 통하는 것처럼 보인다. 발표자가 명령어를 입력하면 화면에 예상된 결과가 나오고, 당신은 고개를 끄덕인다. 자신의 터미널이 발표자의 것과 정확히 일치하기 때문에 스스로 유능하다고 느낀다. 하지만 이 능력은 빌려온 것이다. 튜토리얼 경로를 설계한 사람의 능력이다.
실제 환경은 스크립트대로 흘러가지 않는다. 포트가 열려 있음에도 서버가 SSH 연결을 거부한다. chmod +x를 실행했는데도 스크립트가 "permission denied" 오류와 함께 실패한다. 스캔 결과 포트가 'open'이 아닌 'filtered'로 표시될 때, 이것이 방화벽 규칙 때문인지, 호스트 기반 제어 때문인지, 아니면 침입 방지 시스템(IPS)이 조용히 프로브(probe)를 차단하고 있는 것인지 결정해야 한다. 그런 순간에는 구문 암기가 무용지물이 된다. 문제는 잊어버린 명령어가 아니라, 이해하지 못한 시스템이기 때문이다.
복제는 학습이 아니다
튜토리얼을 따라 하는 것과 문제를 해결하는 것 사이에는 차이가 있다. 복사할 때, 당신은 타인이 만든 지도 위에서 A 단계에서 B 단계로 이동할 뿐이다. 무언가 어긋나면 당신은 얼어붙는다. 당신의 정신적 모델(mental model)이 비어 있기 때문이다. chmod 755가 권한을 변경한다는 것은 알지만, 파일이 noexec 플래그가 설정된 마운트 지점에 있을 때 왜 시스템이 여전히 접근을 차단하는지 설명할 수 없다. nmap이 포트를 스캔할 수 있다는 것은 알지만, 상태 기반 검사(stateful inspection)가 개입될 때 왜 SYN 스캔이 커넥트(connect) 스캔과 다른 결과를 반환하는지 해석할 수 없다.
당신은 리눅스나 네트워킹을 배우고 있었던 것이 아니다. 그저 흉내 내는 법을 배우고 있었을 뿐이다.
질문을 뒤집어라
나는 한 가지를 바꾸었다. "어떤 명령어가 이걸 해결할까?"라고 묻는 대신 "시스템이 실제로 무엇을 하고 있는가?"라고 묻기 시작했다. 이 변화는 나를 느리게 만들었기에 불편했다. 하지만 효과가 있었다.
파일 권한을 예로 들어보자. chmod는 마법의 숫자를 외우는 기도가 아니다. 그것은 커널이 inode에 대한 접근을 중재하는 방식의 표면적인 계층일 뿐이다. 운영 체제가 파일의 소유자, 그룹, 기타 사용자와 당신의 유효 사용자 ID(effective user ID)를 대조한다는 것을 이해하면, 숫자들이 이해되기 시작한다. 디렉터리 권한이 경로를 탐색하거나 내용을 나열할 수 있는지 여부를 제어한다는 것을 배우면, 파일을 읽을 수는 있지만 왜 그 파일에 도달할 수는 없는지 의아해하는 일이 사라진다. 디렉터리의 실행(execute) 권한은 프로그램을 실행하기 위한 것이 아니라, 내부의 inode에 접근할 수 있는 권한임을 깨닫게 된다. 갑자기 chmod는 암기할 필요가 없어진다. 맥락(context)이 필요할 뿐이다.
네트워크 기초도 nmap에 대해 똑같이 적용된다. 포트 스캔은 열린 문들의 목록이 아니라, 패킷으로 이루어진 대화다. TCP 3-way handshake를 파악하면, 왜 SYN 스캔에 raw socket 권한이 필요한지, 왜 닫힌 포트는 RST로 응답하고 filtered된 포트는 아무런 응답도 주지 않을 수 있는지 이해하게 된다. 플래그 조합을 외우는 것을 멈추고, 어떤 패킷을 보내고 있는지, 그리고 침묵이나 소음이 무엇을 의미하는지에 대해 추론하기 시작한다.
HTTP를 이해하면 Burp Suite와 같은 애플리케이션 계층 도구들도 이해되기 시작한다. 그것은 단지 당신과 웹 서버 사이에 위치한 프록시일 뿐이다. HTTP 메서드, 헤더, 상태 코드, 그리고 요청이 서버 측 로직과 어떻게 매핑되는지 이해하지 못한다면, Burp Suite는 버튼만 가득한 혼란스러운 대시보드에 불과하다. 요청이 어떻게 전달되고 서버가 어떻게 응답을 구성하는지 알게 되면, 도구의 사용법은 명확해진다. 당신은 Burp Suite를 배우는 것이 아니다. Burp Suite를 사용하여 HTTP를 조사하는 것이다.
기초를 다져라
이제 막 시작하는 단계라면, 치트 시트(cheatsheets)를 수집하고 싶은 욕구를 참아라. 결코 쓸모없어지지 않을 세 가지 영역에 집중하라.
Linux 기초를 위해서는 커널이 프로세스를 어떻게 스케줄링하는지, 셸이 명령어를 어떻게 파싱하는지, 그리고 환경 변수가 프로그램 동작에 어떤 영향을 미치는지 학습하라. stdin, stdout, stderr를 단순한 상식이 아니라 파이프(pipe)를 작동하게 만드는 배관(plumbing)으로 이해하라.
네트워크 프로토콜을 위해서는 서두르지 말고 TCP/IP 스택을 공부하라.
