Monday, August 29, 2016

DEFCON 후기

KaisHack GoN의 데프콘 후기를 끄적여볼까 합니다.

KaisHack GoN은 KAIST GoN (학부 해킹 동아리) + KaisHack (대학원 해킹 동아리) 두 팀이 합쳐져서 만들어진 KAIST인의 KAIST인에 의한 KAIST인을 위한(?) 팀입니다.  KaisHack은 올해 처음 만들어졌는데, GoN 출신이 많았을 뿐더러 'KAIST 사람들끼리 모여서 같이 해킹대회에 나가보자!'라는 뜻으로 같이 DEFCON에 참여하게 되었습니다.

KaisHack GoN Label (데프콘 가면 팀마다 다 줌)
사실 팀웤을 맞춰보려고 Plaid CTF 때 처음 같이 대회를 했었는데, 시드를 따기는 커녕 한참 밑에 떨어졌습니다. (주르륵..)

Plaid CTF 랭킹
그래도 pctf를 하면서 든 생각이 어차피 DEFCON 에는 상위 8팀이 나가게 되는데, 사실 여기 랭킹에서도 볼 수 있듯이 이미 시드를 받은 팀들이 많아서 본선 갈 수 있겠다는 생각이 확신(?)이 들었었습니다.

데프콘 예선전 랭킹
캬~ 예선에서 5등이라니. 기분이 좋군요. 본선에 가게 되었습니다. 사실 이번 데프콘 본선은 Cyber Grand Challenge (CGC) 포맷에 맞춰서 진행이 되었기 때문에 준비가 많이 필요했습니다. 

CTF 시작 직전 입구에서
CGC는 미국 연구 기관인 DARPA에서 후원하는 대형 프로젝트 중 하나로 '취약점 분석/익스플로잇/패치까지 지금까지 사람이 해오던 것을 자동으로 기계가 해보자!'라고 하는 프로젝트입니다. 예선전은 이미 했었고, 상위 7팀이 본선을 진행하고, 그 우승팀의 CRS (우승팀의 AI라고 생각하면 됩니다)를 가져와서 데프콘 CTF 본선에서 사람들이랑 겨루는 시나리오 였는데요. 그렇기 때문에 데프콘 CTF 본선 역시 CGC 형식을 채택했습니다. 저희의 예상은 봇이 사람을 이기는 시나리오로 (그래야 DARPA가 기분이 좋으니..) 문제가 나오지 않겠나 했지만 다행히도 아니었습니다 ㅎㅎ... (역시 아직 사람이 짱짱인걸로...)

첫날 운영측 문제로 대회 시작이 늦춰져 잠깐 휴식
CGC 또한 기존의 데프콘 CTF 본선과 같이 Attack/Defense로 진행이 되는데요, 기계들이 대회를 하기 때문에 여러가지 조건들이 보다 명확하게 제시되어 있었습니다. 기존의 방식과 다른점이 더 많았고, 규칙들을 다 공부해서 준비를 철저히 하지 않으면 본선에서 아예 문제를 풀 수 조차 없는 구조였습니다. 특정API를 사용해야 하기 때문이죠... 전혀 새로운 방식들도 있고...

LegitBS 얼른 문제를 열어라
CGC 형식의 대회 준비를 위해 미리 공부를 하고 툴을 많이 준비했었어야 했는데, 그러지 못한 팀들은 대회장에서 엄청 고생을 했었죠. (K*s**c* G*N, D**K**R 등등) CGC는 시작하는 순간부터 사람들은 개입 안하는, 소위 말하는 엔터만 쳐놓으면 컴퓨터가 알아서 촵촵 해주는 그런 구조입니다. (영화에서 나오는 그런 일이 여기서 벌어짐!)

대회 끝나고 기념사진
하지만 데프콘은 사람이 참여하기 때문에 아쉽게도 그렇지는 않습니다. 각 팀별로 8명씩만 대회장에 앉을 자리가 마련되어 있고 (9명아님) 나머지는 호텔 방이나 아니면 바다 건너서 작업해도 상관이 없는 방식입니다. 사실 이 방식은 대회를 운영하는 팀 마음대로이기 때문에 언제든 바뀔 수 있습니다. 그래서 이번에는 대회장 안/밖에 있는 사람들이 서로 협력해서 문제를 풀어야 하는 환경이었죠. 그런 환경을 구축하기 위해서 나름 웹 인터페이스 구축을 하고 백엔드 서버 구축하고 한 우리 팀원들이 정말 수고했죠. (비록 대회 하면서 저를 비롯한 여러명이 빠진 기능 보충하느라 live coding show를 하기도 했지만..)

기념사진 2
다시 돌아와서 대회 방식을 설명하자면, 기존의 attack/defense 형식과 같이 라운드마다 대회가 진행됩니다. 각 팀들은 라운드별 공격/방어 점수를 합산해서 최종 점수를 획득하게 되는 구조입니다.

------

공격

각 팀들은 취약점을 분석해서 PoV (Proof of Vulnerability)라는 익스를 짜고 중앙 서버에 특정 API를 이용해서 업로드를 합니다. 그러면 매 라운드별로 PoV를 중앙 서버에서 각 팀들의 바이너리에 테스트를 해서 취약점이 제대로 작동을 한다면 공격 점수를 줍니다.

PoV는 두가지 형태가 있는데요, 아래와 같습니다.

type 1 - EIP 외 특정 레지스터 값을 지정된 값으로 바꿔야함
type 2 - 특정 메모리 주소의 값 4 byte를 읽어야함

취약점을 찾는다고 해도 PoV를 만들지 못하면 의미가 없고, PoV를 만든다고 해도 서버에 업로드를 하지 못하면 의미가 없겠죠? ㅎㅎ

------

방어

패치또한 비슷한 방식으로 진행됩니다. 각 팀들은 취약점을 분석하고 그 부분을 패치한 바이너리를 중앙 서버에 업로드합니다. 여기가 조금 복잡한데요, 패치 바이너리를 업로드하면 그 바로 다음 라운드에서는 바이너리가 제 역할을 못하고 죽어있습니다. 그렇기 때문에 availability (service rate)가 0이 되죠. 그리고 이때 다른 팀들에게 패치한 바이너리가 공개됩니다. (중앙 서버 인터페이스에서 다운로드 받을 수 있음!) 그리고 바로 그 다음 라운드에 패치된 바이너리가 정상 작동하기 시작합니다.

따라서 바이너리 패치를 하게 되면 한라운드동안 availability 점수를 받지 못하게 됩니다. 그런데 라운드 마다 합산되는 점수에서 availability 점수가 곱해지는 구조이기 때문에 점수에 아주 큰 영향을 끼치게 됩니다. (x * 0 = 0, 그냥 0 이라는..) 따라서 패치는 엄청난 패널티가 뒤따르기 때문에 조심해서 패치를 해야하는 것이죠. 1등하던 DEFKOR가 밑으로 떨어진 것도 둘째날에 패치를 잘못했기 때문이었다고 합니다.

패치된 바이너리는 모든 팀에게 공개가 되기 때문에 다른 팀들이 그 바이너리를 받아서 자기네 패치로 올릴 수도 있고, 그렇기 때문에 이런저런 재미난 일을 할 수 있습니다. 한 예로 PPP는 자기 바이너리 안에 백도어를 심어놓고 그것을 다른팀들이 받아서 사용할 때 엄청 점수를 많이 얻었죠. (둘째날에 꿀빤 PPP)

패치 바이너리 이외에도 IDS rule을 설정할 수 있는데, 사실 요놈은 거의 건드린 적이 없었습니다. 패널티도 바이너리 패치랑 같고, 룰 설정도 snort rule형식으로 설정해야 하는데, 잘못하다간 Poller (availability 체크하는 중앙 서버의 데몬) 한테 점수가 까질 수 있기 때문이죠.

전반적으로 바이너리 패치에서 준비가 많이 부족했다고 느꼈는데, 잘하는 팀들은 general 패치 및 이런저런 패치 인터페이스를 다 만들어왔더라구요. 우리는 빈 공간 찾고 거기에 원하는 코드 쓰는거만 만들었었는데, 백도어 심는거도 사실은 생각 했었는데 과연 될까 의심하다가 제대로 하지 못해서 아쉽긴 하네요 ㅠㅠ
------

네트워크 분석

사실 이번 대회에서 가장 도움이 많이 된 것이 바로 패킷 분석입니다. 자기 서버에 날라오는 모든 패킷을 미러링해줘서 확인할 수 있었는데요, 기존의 TCP/IP 형식과 다른 CGC 형식을 사용합니다. CGC 형식의 패킷은 stdin/stdout만을 담고 있는데요, 이를 분석하면 다른 팀들의 PoV가 공격하는 시점의 패킷도 포함하기 때문에 취약점 찾고 PoV 만들고 패치하는 데에 도움이 많이 되었습니다. 요건 조만간 다른 포스팅으로 올리도록 하겠습니다.
------

대회는 첫째날은 오전 11시 ~ 오후 8시, 둘째날은 오전 9시 ~ 오후 8시, 셋째날은 오전 9시 ~ 오후 2시 이렇게 진행이 되었는데요, 시작하기 전 1시간은 준비시간으로 환경 설정을 할 수 있는 시간을 줍니다. (문제서버는 닫혀있음) 8시에 끝나면 장비를 다 싸들고 호텔방으로 올라가기 때문에 다시 환경설정을 해야하는 것이죠. 첫째날에 운영측에서 문제가 있어서 대회를 거의 3시가 되어서야 시작을 했는데, 운영측도 처음 하는 방식이다 보니 준비를 제대로 못한 것 같았습니다. (첫째날에 네트워크 설정 제대로 못한 팀들이 있었는데 바로 시작했으면 우리도 꿀빨았을듯.)

대회가 매일 오후 8시까지라고 해서 끝이 아니라 장비를 싸들고 호텔 방에 들어와서 밤새 분석/코딩/패치/잉여력발산 등을 해야하기 때문에 엄청난 체력이 필요합니다.

Live Coding Show / 바이너리 분석
하루 이틀 밤을 새다보면 뒤로 갈수록 점점 체력이 딸리는데, (우리 팀은 대회 참가자중 최고령(?) 을 포함하였음) 그래도 다들 체력이 대단하더군요. 밤새 분석하고 다음날 아침에 대회장가서 환경 셋업 하고 PoV 올리고 패치 올리고 다른 팀들거 다운받아서 분석하고 다시 올리고의 무한 반복...

밤샘은 역시 Rising Sun
둘째날의 스코어는 Vito가 공개를 했었는데, 우리팀이 5위였습니다. 점수는 없애고 순위만 보여주더라구요.

둘째날 마지막 순위
마지막날은 지금까지 해왔던 것처럼 아예 점수 공개를 하지 않았습니다. 순위가 왔다갔다 하는 팀들은 이때 죽을 맛이죠. PPP인게 거의 확정인 듯 했으나... ㅎㅎ;

어쨌든 대회가 끝나고 상위 팀들이랑 이런저런 얘기를 많이 했는데, 상당히 준비를 많이 했다고 들었습니다. 특히 PPP는 멤버 중에 CGC도 참여한 멤버도 있고, 툴 같은 것들도 많이 준비를 한 것 같았습니다. 막상 끝나고 나니 우리도 좀 더 준비를 많이 할 걸 하는 후회가 들었지만, 그래도 다같이 재미있게 대회를 즐겨서 정말 너무너무 좋았습니다 ㅎㅎ

KaisHack GoN 멤버 전부
LegitBS가 데프콘 기간 끝나고 바로 다음주에 최종 점수판을 공개한다고 했는데 아직까지 공개하지 않고 있어서 지금 트위터랑 메일로 물어본 상태입니다. (일해라 LegitBS) 빨리 순위를 알고싶네요. 우리끼리 우스갯소리로 하는 얘기지만 점수가 뒤바껴서 공개 못하는 거라고 ㅎㅎ...  예상으로 4등이나 5등 정도 하지 않을까 싶네요.

호텔 방에 냉장고가 없어서 직접 냉장고 만듬. 아 서럽다.
사실 이번 데프콘에 오면서 이런 저런 지원을 받았는데, 지원해주신 분들 덕분에 잘 대회를 즐기고 올 수 있었습니다. 3명은 작년 화이트햇 콘테스트 우승으로, 나머지는 KAIST 교수님들, KAIST 사이버보안연구센터에서 지원을 받았습니다. 또한 KISA, NAVER D2, BoB, 한국시스템보증에서 지원을 받았는데 정말 감사드립니다. 누구는 지원 엄청 많이 받았다는데!!!! 스위트룸에서 대회했다는데!!!!!! 빼애애애애액!!!

곧 패킷 분석편으로 돌아옵니다 ㅎㅎ

0 comments:

Post a Comment