2020-09-30 12:20 (수)
포항공대 PLUS, 데프콘 CTF 2011 참가 후기
상태바
포항공대 PLUS, 데프콘 CTF 2011 참가 후기
  • 길민권
  • 승인 2011.08.18 14:11
이 기사를 공유합니다

PLUS팀, 세계 해킹대회 데프콘 CTF 본선에 참가해 8위 차지
포항공대 PLUS팀이 세계적 해킹대회인 데프콘 CTF 본선에 참가해 8위를 차지했다. 본선에서 순위는 중요하지 않다. 본선에 올라간 것만 해도 세계적 명성을 얻은 것이기 때문이다. 그래서 데프콘 현장 모습을 잘 전해준 이 글을 게재하게 됐다. 이 내용은 포항공대 PLUS의 공식 블로그에 게재된 내용이며 이번 대회에 팀장으로 참가한 07학번 차명훈과 작성자 10학번 김영우 학생에게 게재를 허락받고 올린다.  
이번 데프콘 2011 CTF에 참가한 포항공대 학생은 차명훈, 채동주, 장한휘, 김준성, 최영일, 박병진, 이지용, 김영우, 이거성, 현종환, 이병영, 송종혁, 송재혁 등 총 13명이다. 모두 포항공과대학교 컴퓨터공학과 학생들이며 앞에 10명은 학부생, 뒤 3명은 대학원생이다. <편집자 주>

 
 
PLUS는 이번 DEFCON CTF에  이스트소프트사의 스폰서쉽을 받아 참가하였습니다.
후기에 앞서 대회에 참가할 수 있도록 도움을 주신 이스트소프트사에 감사드립니다.
이 후기는 대회의 경험을 공유하기 위하여 10학번 김영우 학생이 작성하였습니다.

 

08. 03. 13:15 _ @ 인천공항



 
늦지 않게 공항에 도착했습니다. 제 시간에 도착했더니, 역시 아무도 오지 않았군요. 다 모이려면 적어도 한두 시간은 기다려야 할 듯합니다. 기다리는 동안 심심하니 이번에 DEFCON에 참가하는 PLUS 멤버들의 소개나 해볼까요?
 
이번 DEFCON에는 총 13명의 PLUS 사람들이 참여를 합니다. 그 중에서 3명은 대학원생이고요, 3명은 작년에 플러스에 갓 들어온 뉴비랍니다. 경력으로 따지면 1년차의 뉴비부터 7~8년이나 해온 선배님들까지, 다양한 멤버가 참여합니다. 저처럼 이번 DEFCON이 처음인 사람도 있고요, 세 번째로 DEFCON에 참여하는 선배님도 있습니다.
 
08. 04. 21:00 @ 대회유형. – 1


 
우리가 나간 대회의 공식이름은 DEFCON CTF입니다.
 
CTF(Capture the flag)란 우리말로 하자면 깃발뺏기죠. 상대편 진영에서 깃발을 뺏어서 가져오면 승리하는 게임입니다.  DEFCON CTF의 규칙도 이런 CTF의 의미와 맥이 통합니다. 상대편 서버에서 파일에 기록되어있는 Key를 가져오고, 상대 서버에 자신의 Key를 기록하면 점수가 주어지는 방식이지요.
 
대부분의 CTF경기는, 서버가 주어지고 그 서버에서 실행되고 있는 몇 개의 데몬(프로그램)의 실행파일(바이너리)이 주어집니다. 흔히 바이너리는 ELF포맷인 경우가 많고 서버환경은 Linux나 FreeBSD, Solaris 등이 주어집니다.
 
DEFCON CTF의 경우 지난 몇년동안 FreeBSD 환경이었습니다. (FreeBSD는 유닉스와 비슷한 운영체제입니다.) 지난 몇 년간 운영체제 외의 다른 조건도 큰 변동은 없었다고 합니다. C로 작성된 바이너리가 가장 많지만 C++로 작성된 바이너리나 인터프리터를 포함하여 자바나 파이썬 바이트코드 등도 심심치 않게 주어집니다.
 
이렇게 새로운 유형이 나타나면 당황스러우면서도 재미가 있습니다. 어차피 우리 팀만 준비를 못한 것이 아니라 다른 팀도 준비를 못해서 당황 하는 건 마찬가지일 테니까요. 그러면서 농담 삼아 나오는 이야기가 요즘은 스마트폰이 대세이니 ARM(스마트폰 기기의 기반 프로세서)위의 안드로이드 서버를 출제할지도 모른다는 것입니다. 뭐 어떤 환경이든 못 내겠어요?
 
이렇게 말하면서도 웬만하면 그냥 나오던 환경대로 나왔으면 하지요. 그래도 예상치 못한 상황에 맞닥뜨리는 건 피하고 싶을 테니까요.
 
08. 05. 10:00 _ @ 참가팀

 
아침에 데프콘 장소로 이동하니 DEFCON에 참여하는 다른 팀들이 하나씩 보이는군요.  대회에 참여한 팀은 총 12팀. 일본에서 출전한 Sutegoma2, CMU 학생이자, Codegate2011의 우승팀인 PPP, 예선 1위였던 Routards, 그 외에도 많은 팀들이 그 모습을 드러내었습니다. 다들 제대로 준비를 해 왔더군요. 노트북은 기본이고 데스크탑도 종종 보였어요. 심지어 어떤 팀은 큼지막한 서버랙을 가지고 오기도 했더군요. 다들 너무 쟁쟁해 보여서 저희 팀의 준비가 모자란 건 아닌지 위축이 되네요. 사실 저희도 어디 내놔도 모자랄 건 없는데 말이에요.
 
DEFCON 본선에서는 각 팀 당 8명을 기준으로 합니다만 공식적으로 인원제한 같은 건 없습니다. 대회장안에 들어올 수 있는 인원은 8명이고 1등팀에게 시상되는 black badge는 8명에게만 지급되지만 보통의 경우 참여인원은 8명이 상인 경우가 많습니다. PLUS도 올해는 13명이 참여하고, GON과 연합했던 작년에는 16명이나 되었다고 하네요. 다른 팀들을 살펴보아도 8명을 맞추어서 대회에 온 팀도 있지만 8명이 넘는 팀이 적지 않습니다. European Nopsled Team 같은 경우에는 전체 팀원이 거의 40명이나 된다는 이야기도 있습니다.
 
08. 05. 11:00 _ @ 대회시작

 
대부분의 해킹대회는 그다지 친절하지 않습니다. 세세한 규칙까지 다 알려주고 그렇게 진행하지는 않는다는 말이죠. DEFCON의 경우는 더 그렇습니다. 서버를 주는 것도 그냥 대놓고 컴퓨터를 준다거나 서버 아이피를 알려주지 않습니다. 그냥 서버와 연결되어있는 랜선 하나를 주어지고 알아서 서버를 찾으라는 식이지요. 뭐 어쩔 도리가 있어요? 그냥 알아서 우리 서버 주소를 알아낼 수 밖에요.
 
데몬의 바이너리도 슬쩍 주더군요. 갑자기 무슨 장난감을 주는 거에요.. 기념품인가 싶었는데 잠시 후에 다른 팀들이 분주해지기 시작하는 거에요. ‘응? 다들 왜 그러지?’ 하고 생각하는데 누구 한 명이 갑자기 장난감을 열어봤어요. 사실은 장난감이 아니라 USB메모리였던거죠. 그리고 대회는 그 순간부터 시작됩니다. 화려한 연설이나 카운트 다운, 개회선언 따위 없이 바이너리 파일이 든 USB가 대회의 시작을 알리는 거죠.
 
08. 05. 12:00 _ @ 전쟁?


 
CTF와 같은 방식의 대회를 두고 wargame이라는 이름을 쓰기도 합니다. 전쟁(War) 이라는 것도 흔히 착각하는 것과는 달리 하루아침에 끝나는 게 아니라 긴 시간에 걸쳐 끊임없이 전개됩니다. CTF도 역시도 다른 대회처럼 한두 시간 만에 끝나는 게 아니라 50시간이 넘는 긴 시간 동안 진행됩니다. 그 시간 동안 해야 하는 일도 적지 않습니다. 바이너리를 분석하는 것뿐만 아니라, 혹시나 우리서버에 문제가 생기지 않도록 관리하고 데몬의 서비스가 잘 작동하는 지를 확인해야 합니다. 이미 취약점이 알려져서 완성된 exploit이 있다면 그 exploit을 주기적으로 작동하도록 자동화시키고 잘 작동하고 있는지 관리를 해야 합니다. 할 일이 한두 개가 아니기 때문에 주먹구구식으로 이런 일들을 하다가는 문제도 못 풀고 관리도 못하게 될 것이 뻔합니다. 그래서 각각이 하나씩의 역할을 맡아서 하기로 했습니다. 노라키형이 네트워크를 관리하시고요 거성형이 데몬에 대한 정보를 관리합니다. Exploit 관리는 명훈이형이 하시고요. 이렇게 각자가 계속 해야 할 일이 있다 보니, 대회시간이 길다고 하더라도 그 중간에 여유롭게 식당에 가서 밥을 먹는다거나 할 시간은 없는 거죠.
 
열심히 문제를 풀고 시스템을 관리할 저희 팀을 위해서 제가 점심식사를 나르러 갔습니다. 햄버거 열세 개를 박스에 넣고 열심히 나르고 있으니 옆에 있던 사람이 물어보네요. 어디 전쟁(war)이라도 났냐고, 먹여 살려야 할 군대(army) 라도 있냐고요. 참 정확한 지적이네요. CTF도 wargame이라고 하니 전쟁이라고도 할 수 있겠네요.
 
08. 05. 17:00 _ @ 대회유형 2 ( ipv6 )

대회 유형이 지난 몇 년 동안 대충 비슷했다고 했었지요? 그래도 혹시나 이번엔 조금이라도 바뀔지도 모른다고 생각은 했었어요. 운영체제가 FreeBSD 대신 리눅스나 다른 OS일수도 있다고 생각은 했었죠. 그런데 어쩌나요, 생각하지 못했던 상황입니다. 다른 운영체제 정도까지는 생각을 했었는데요, 저희를 맞이한 건 다른 네트워크 환경입니다. 우리가 보통 생각하는 ipv4 ( 192.168.0.1 등의) 이 아니라 ipv6 환경이 제시된 거죠. 사실 ipv6라고 해킹의 패러다임이 바뀌거나 하지는 않습니다만, 네트워크를 통해서 작업하고, 우리서버를 보호하고 상대를 찾아 공격해야 할 입장에서는 곤란한 문제가 하나 더 생긴 겁니다. 사실 다들 ipv6가 뭔지는 압니다만, 평소에 그런 환경을 접할 일이 있어야지요. 인터넷에서 실제로 활용되는 ipv6는 소수에 불가하고 소규모 네트워크에서 굳이 ipv6를 사용할 필요는 없으니 실질적인 ipv6 환경엔 처음 접하는 것이죠.
 
하지만 저희 PLUS에게 ipv6 정도에 막힐 수는 없죠. 하나씩 정보를 찾고 세팅을 해 나갑니다. 사실 ipv6를 설계할 때부터 ipv4와 최대한 호환이 되도록 설계를 했기에 대부분 환경은 어느 정도 호환이 됩니다. 다만 문제는 저희가 만들어온 툴이나 준비한 자동화된 네트워크 환경이 문제이죠. 호환성 같은 건 그다지 생각을 하지 않고 만들었기에 잘 작동하지 않는 게 많습니다.
 
이렇게 첫째 날은 환경의 세팅에서부터 정신 없이 지나갑니다.
 
08. 05. 18:00 _ @ 취약점 분석 1

 
데몬의 바이너리가 주어진 이후 각자가 한 개씩의 바이너리리 파일을 맡아서 분석을 시작했습니다. 데몬이 주어진지도 벌썬 6시간이 넘어서 어느 정도는 분석이 된 상황입니다. 대회장 안쪽과 연락을 해보니 forgetu, tomato는 벌써 대충 풀렸다고 하는군요. 안에서는 세팅하랴, 문제풀랴 정신이 없을텐데 참 대단한 선배님들입니다. VPN설정에 실패해서 안쪽과 잘 연락이 되지 않는 것이 좀 답답하군요. 같이 문제를 풀면 좀 더 잘 풀 수도 있을 것 같은데 말입니다. 밖에서도 각자 하나씩 바이너리를 분석하고 있습니다. 저는 Gold 를 분석하고 있고, 병진이와 영일이는 bunny를 분석하고 있습니다. 동주형은 cleaner를, 한휘형은 war를 분석하고 있습니다.
 
병진이는 bunny의 취약점을 대충 찾은 것 같습니다. 하지만 그러면서도 bunny를 푸는 건 말도 안 된다는 소리를 계속 하네요. 대충 이야기를 들어보니 접속 자체가 불가능하다고 합니다. Bunny 는 접속을 위한 포트가 고정되어 있는것이 아니라 계속 바뀌는데 바뀌는 포트에 규칙성이 있는 것이 아니라 그냥 랜덤으로 바뀐다고 하는군요. 그래서 지금 영일이는 접속조차 못해서 답답해하고 있습니다.
 
저는 gold의 취약점으로 보이는 루틴을 대충 찾은 것 같습니다. 하지만 잘 찾아놓고도 제 분석에 의심이 드는 것이, 제가 찾은 루틴은 상식적인 프로그램의 실행으로는 절대 실행이 되지 않는 루틴입니다. 저 루틴이 실행되기만 한다면 취약점은 더 볼 것도 없습니다만, 프로그램은 저 루틴으로는 절 때 진행하지 않아요.
 
08. 05. 18:00 _ @ 점수.

 
점수를 얻는 방법은 두 가지입니다. 상대편의 키를 읽어와서 인증서버에 보내주면 점수를 얻게 되고요, 상대편의 키가 적힌 파일에 우리의 키를 덮어써도 점수를 얻게 됩니다. 점수판을 보니 초반부터 빠르게 점수획득에 성공하는 팀도 있는 반면에 아직 아에 점수를 얻지 못하는 팀도 있네요. 저희 PLUS는 5위를 달리고 있습니다.
 
08. 05. 22:00 _ @ 서버 정지.

 
밤이 되고 대회장이 닫히면 DEFCON CTF 서버의 연결도 닫힙니다. 밤에는 푹 쉬라는 주최측의 배려라고 생각할 수도 있겠지만, 서버가 닫혀도 저희는 쉴 수가 없어요. 이제 서버 관리를 하지 않아도 되니 바이너리 분석과 Exploit 제작에 힘을 쏟아야죠.
 
안쪽의 이야기를 들어보니 대략 5위정도로 첫째 날을 마감한 것 같습니다. 대회장 안에 있던 사람들은 다들 지쳐 보입니다. 뭐 어쩌겠습니까? 남은 시간 동안 쉬지 않고 분석을 해야죠.
 
08. 06. 02:00 _ @ 취약점 분석 2


 
다시 바이너리 분석 현황을 정리해봅니다. Bunny는 이미 풀렸다는 군요. 포트가 랜덤인데 어떻게 접속을 하냐고 물어보니 깔끔하게 대답해 주시는 군요. “시드가 시간인데 시간을 알 수 있으니 상관없잖아?” 음… 그렇게 쉽게 정리가 되나요?
 
허무해진 병진이는 대신에 rotary 문제를 풀기로 합니다. Rotary 문제도 적지 않게 특이하군요. 전혀 다른 루틴 3가지가 하나의 프로그램에 들어있고 20분마다 돌아가면서 다른 루틴을 실행합니다. 겉만 하나의 프로그램이지 사실상 20분마다 돌아가면서 세 ‘개의 다른 프로그램이 실행되는 것과 다를 게 없네요. 이건 취약점을 세 개를 각각 찾고 각각 exploit을 만들어야 하나요…? 막막하군요.
 
Pisa 를 풀던 지용이형이 갑자기 피보나치 수의 합으로 임의의 자연수를 표현할 수 있냐고 물어봅니다. 아니 해킹문제 풀다가 갑자기 왠 수학문제? Pisa는 내부적으로 어떤 문자열을 받아서 인코딩을 하는데 그 방식이 피보나치 수를 더해서 인코딩을 한다고 합니다. 그래서 인코딩 된 스트링으로 포맷스트링 공격을 할 수 있다고하네요. 다만 그 방법이 좀 복잡하네요. Pisa도 대충은 감이 잡힌 것 같은데 조금만 있으면 풀릴 듯 하네요.
 
Cleaner를 풀던 동주형도 어느 정도 진전이 된 모양입니다. Cleaner도 역시 내부적으로 문자열에 대해서 인코딩을 수행한다고 하는데요, 그 알고리즘만 잘 이해하면 풀 수 있을 것 같다고 합니다.
 
밤사이에 빨리 풀어서 내일 아침에는 치고 올라가기를 기대해봅니다. 
 
08. 07. 13:00 _ @ 기발한 풀이

 
이틀간 데몬을 분석하면서도 몇 개의 바이너리는 아직도 도대체 무슨 기능을 하는 건지도 분석을 못한 데몬이 몇 개 있었습니다. Finch와 bowser라는 바이너리는 다른 데몬과는 다르게 실행시켜도 서비스로 돌아가는 것도 아니고 그저 뭐에 쓰는 건지 정체를 알 수 없는 데몬이었습니다. 이 바이너리의 비밀은 마지막 날에 가서야 밝혀졌습니다.
 
CTF장의 중간에는 가로 2m, 폭 1m쯤 되는 투명한 상자가 있었는데요. 그 상자에 안에는 원격 조종 장난감 자동차 같은 것들이 여럿 놓여져 있었습니다. CTF 가 한창인 동안 이따금씩 사람들이 그 주위에 몰려 들어서 그 장난감 같은 것을 조종하고 뒤집으려고 노력하려는 것을 보았었어요. 저희 들은 그것도 어떤 DEFCON 행사중의 하나이겠지 라고 생각하면서 거기에는 신경을 쓰지 않고 저희 할 일만 열심히 하려고 있었어요. 그런데 사실은 finch라는 바이너리 파일이 바로 거기에 있는 장난감 자동차를 조정하는 프로그램이었습니다. 다른 DEFCON 행사라고 생각했던 것이 사실은 CTF의 일부였던 거죠. 세상에나……. 어떤 팀은 PC에서 조종하는 게 아니라 이에 조이스틱을 가져와서 그 명령을 직접 프로그래밍 한 다음에 조이스틱으로 직접 조정을 하더군요. 상황을 알아차린 저희 팀이 늦게나마 참여해보려고 했는데 이미 너무 늦었더군요. 남들은 저렇게 열심히 finch를 하고 있었는데 저희는 마지막 날까지 몰랐다니요. 참 눈치가 없었습니다. 뭐 영어를 잘 못해서 그런 것도 있겠지만요, 참 아쉬운 실수가 아닐 수 없습니다.
 
이제야 Bowser도 대략적으로 어떤 일을 하는 바이너리인지 분석이 되고 있어요. 그 바이너리도 참 창의적인 해법을 요구하더군요. 이제 막 대회가 끝나가려고 하니 아쉬움이 많이 남아요.
 
08. 07. 13:40 _ @ 대회 막바지.

 
대회의 끝이 거의 다가왔습니다. 다들 끝까지 최선을 다합니다. 대회가 몇 분 남지 않아서 지금 새로 문제를 풀어서 점수를 얻기 시작한다고 해도 결과에 큰 변동은 없을 것이라는 사실을 다들 잘 알고 있을 겁니다. 그렇지만 모두들 지금이 가장 중요한 순간인 것처럼 열심히 풀고 있습니다. War의 exploit script를 작성하는 지용이형, cleaner를 푸는 동주형, bowser를 푸는 병진이와 준성이형, 늦었지만 finch를 어떻게라도 두들겨 보는 명훈이형, 다들 마지막까지 최선을 다합니다.
 
08. 07. 14:00 ~ _ @ 대회종료 
2시정각, 대회종료가 선언되었습니다. 추가 시간 연장 같은 건 없었네요. 마지막 날에는 score board를 보여주지 않은 덕에 1등이 누구인지 저희 팀이 몇 등을 했는지는 알 수 없습니다. 다만 어제의 성적과 오늘의 진행으로 볼 때, 상위권에 들기는 어려울 것 같다는 예상을 해봅니다.
 
저녁 7시에 있었던 시상식에서 우승팀이 발표되었습니다. European Nopsled Team 이 우승을 차지했습니다. 나머지 팀들의 순위는 나중에 공지된다고 합니다.
 
저희는 대회에 최선을 다했고 결국 대회는 끝이 났습니다. 성적은 조금 아쉽지만 최선을 다했다는 것에 만족해야겠습니다. 내년에는 본선에 20개 팀이 참여한다고 합니다. 내년에는 기필코 우승을 할 수 있도록 해야겠습니다.



 
PS. 최종순위가 발표되었습니다. 플러스는 8위를 기록했네요.

 [포항공과대학교 컴퓨터공학과 김영우 ywkim10@postech.ac.kr]