2020 사이버 포카전 Retrospective

mspaint로 만듬.

올해도 역시 사이버 이공계 학생 교류전의 해킹 분야 문제 출제 / 운영을 LeaveCat에서 진행을 했다. 포항에서 하면 카-포전 대전에서 하면 포-카전이라고 하는데 코로나 19 여파로 인해 모든게 다 온라인으로 진행되면서 갖게 된 새로운 명칭이다. 바쁜 업무 + 며칠전 부터 있던 몸살 기운으로 문제 출제를 아예 못하게 될 줄 알았지만 운이 좋게도 대회 당일 조금 몸이 괜찮아져서 몇 문제를 낼 수 있게 되었다. 그 중 한 문제는 며칠전 공개된 CVE-2020-1472 (NetLogon aka ZeroLogon) 를 오마주 해서 출제하게 되었다. 대회 중간에 야식 이벤트를 진행했는데 의도치 않게 테트리스 고인물을 만나는 신기한 경험도 했다.

작년 문제는 github을 통해 모두 archiving 해 아래 링크에서 만나볼 수 있다. 올해 문제는 어떻게 할지 아직 모름.

https://github.com/LeaveCat/poka-sciencewar-2019


우리가 운영하기 시작한 첫 해와 두번째 해는 빙고 컨셉의 대회 운영 사이트를 만들어 문제를 해결할 경우 빙고판을 채워넣고 빙고!를 만들면 추가 점수를 획득할 수 있는 방식을 사용했다. 해가 지나갈수록 팀원 대부분이 취업을 하거나 고등교육을 받으러 떠나 개발할 시간이 충분하지 않았기 때문에 CTFd를 사용했다. 작년까지만 해도 vultr / digital ocean을 사용해 한 사람이 모두 dockerizing 된 문제들을 deploy하는 방식이었다. 올해는 팀원 중 한 사람의 aws 계정에 iam (ec2 full access)를 만들고 해당 계정에서 문제를 관리하는 방식을 사용하려고 했지만, 역-시나 대부분이 다른 서버에 deploy 하는 바람에 관리가 조금 힘들었다. 아직 해커들은 클라우드에 친숙하지 않나보다.. 😭

올해 Mic Check, Real Hacker, 0ero Trust Login (0TL) 총 3가지의 문제를 출제했다. 앞에 2개는 어렵지 않게 만들 수 있고 푸는 입장에서도 쉽게 풀 수 있는 문제다. 마지막 0TL 문제는 CVE-2020-1472를 오마주한 문제이다.

Mic Check는 이번 코드게이트 본선에 출제되었던 Mic Check에서 감명 받아 만든 문제이다. CRC32 결과를 주고 flag를 찾아내라는 문제였다. 당연히 4byte 이상일 것이라고 생각한 우리는 4byte 부터 brute-force를 하였지만 답은 안나왔고 결국 MIC, 3글자가 정답이었다. ㅎ.ㅎ MIC 대신 m1c를 사용하였고 flag format을 알려주어 9자리지만 3자리만 brute-force하면 되는 재밌는 문제를 만들었다. shasum 결과까지 제공해 쉽게 풀 수 있도록 하였다.

-C0deG4te-

Real Hacker는 말그대로 진정한 해커가 되자는 의미에서, 공책에 flag를 적은 후 종이를 구긴 다음 찢어서 사진을 찍었다. 작년에는 flag가 중간에 적힌 소설을 프린트한 후 파쇄기에 넣은 결과물을 오프라인에서 제공해주었다. 올해는 온라인으로 진행되어 전달해줄 수 없어 사진으로 제공했다. 정답 풀이는 사진 편집 프로그램을 적절히 사용해.. flag를 조합하면 된다. (실제로 몇천 장의 종이를 파쇄기에 집어넣은 후 결과를 복구하는 대회도 있다.) 잘 복구가 되지 않는 부분은 local 환경에서 brute-force할 수 있게 flag의 hash도 제공했다.

0TL은 Microsoft의 DC 서버에서 발견된 CVSS Score 10점 만점짜리인 CVE-2020-1472의 취약점을 재활용 했다. Root Cuase는 크립토 취약점인데 난이도도 높지 않고 취약점 자체가 cool해서 문제로 바로 만들면 좋겠다는 생각이 들어 제작했다. 해당 CVE에 대한 자세한 설명은 https://www.secura.com/blog/zero-logon 에서 확인할 수 있다. CVE를 토대로 출제된 문제에서 사용하는 Key Exchange Algorithm은 아래와 같다. 원래는 Client에서 IV를 선택할 수 있어 취약점을 손쉽게 트리거할 수 있지만 대회 문제다 보니 의도치 않게 풀리는 것을 방지하기 위해 Server에서 Random IV를 반환해주고 해당 IV를 모두 \x00 * 16로 초기화 할 수 있는 취약점을 넣어두었다.

Key Exchange Algorithm

CFB16을 간단하게 설명하자면 아래와 같다. feed back operation인데 iv와 plain을 합친 후 첫 16바이트 data[:16] 의 ecb encryption의 결과 값의 첫 바이트와 data[16]을 xor한 후 다시 data[1:17]을 ecb encryption 한 후 data[17]과 xor을 반복적으로 해 총 16바이트가 모두 xor 된 다음 결과를 반환한다. (Microsoft는 CFB8을 사용한다.)

cfb16 operation

이 때 발생할 수 있는 취약점은 만약 IV가 모두 \x00고 Plain 또한 모두 \x00일 경우 1/256의 확률로 계속해서 aes_ecb(\x00 * 16)을 하는 경우가 생길 수 있다. (특정 key에 따라 \x00 * 16의 암호화 된 결과의 첫 바이트가 다시 \x00이 반환된다면..) IV를 모두 \x00로 만들기 위해 취약점을 2가지 만들어 두었다. 하나는 session key를 만드는 함수에서 인자로 받은 iv를 strncpy를 이용해 복사하기 때문에 첫 바이트가 \x00라면 realIv는 모두 \x00가 된다. 이를 이용해 결과 값도 모두 \x00가 되는 경우를 만들 수 있다. 하지만 서버에서 IV를 랜덤하게 만들어 반환하기 때문에 Random IV의 첫 바이트가 \x00가 되는 확률과 ecb encrypt된 결과의 첫 바이트가 \x00이 되는 확률을 곱해야 하기 때문에 매우 많은 brute-force하 필요하다. 서버를 대상으로 하는 공격이라 문제를 solve하는데 너무 많은 시간이 들 것 같아서 추가적인 취약점을 만들어뒀다.

IV를 생성한 후 username을 입력 받는데 스택 프레임을 보면 username 뒤에 iv가 있어 “admin” + “\x00” * 11을 입력으로 주게 되면 off-by-one으로 인해 IV의 첫 바이트가 \x00로 덮이게 된다. 이를 통해 2바이트의 확률을 1바이트로 줄일 수 있게 된다.

/*
-0000000000000208 username        xmmword ?
-00000000000001F8 iv              xmmword ?
*/

// function: main

/*
lea     r12, [rsp+2E8h+username]
call    sub_1190
lea     rsi, aUsername  ; "username >> "
mov     edi, 1
xor     eax, eax
call    printf
mov     rsi, r12
lea     rdi, a16s       ; "%16s"
xor     eax, eax
call    scanf
*/

// function: make Session Key
strncpy_0(&realIv, iv, 16LL);

아쉽게도 이를 해결한 KAIST는 서버에 2바이트 brute-force하는 방식으로 문제를 해결했다. 중간에 Rate-Limit을 추가하려고 했으나 졸려서 그냥 잤다. ㅋ

서버 아파요 ㅜㅜㅜ
자고 일어났더니 풀려있어 기분이 좋았다 ㅎ.ㅎ

Solver는 https://gist.github.com/junorouse/831e5b8774104922705972d80d676ee4 여기에 올려두었다.


총 4번의 운영을 통해 배운점도 많고 어린 나이에 대회를 운영해 볼 수 있는 경험을 주었다는 것은 매우 행운이었다. 이제는 이런 경험을 성장하고 있는 다른 팀들도 겪어볼 수 있게 이제는 다른 팀에게 운영을 넘겨줄 때가 되지 않았나 싶다. (Dreamhack ?)

이미지: 사람 6명, 임준오님 포함, 웃고 있음, 서 있는 사람들
이랬던 사람들이,ㅡ,

아르테미스

작년 10월, 버스 기다리다 교보문고에 들렸다. “달에 사는 수학 천재의 기발한 범죄 프로젝트”라고 써져있는 책 한권이 내 눈길을 끌었고 구매했다. 아무래도 소설이다 보니 우선순위에서 미루어져 있다가, 일이 많아져 가볍게 읽을 수 있는 책을 찾다 요 며칠 읽게되었다.

영화 마션의 원작 소설을 쓴 엔디 위어가 새롭게 내놓은 먼 미래에 달 나라에서 일어나는 범죄 프로젝트 소설이다. 여기까지만 들어도 오션스 시리즈가 생각난다. 비행기에서 오션스 시리즈를 처음 접하고 진짜 재밌는 영화라고 생각했다. 그래서인지 술술 읽혔다.

뭐, 돈 때문에 산소 공급 체계를 부수는 범죄를 계획하고 수행하는 과정 중 범죄 조직에 연루되어 고난을 겪다 결국 성공하는 그런 내용이다. 시시한 주제일지 몰라도 “달에서” 일어난다는 점이 흥미로웠다.

인류를 지구가 아닌 다른 곳에서 살게 한다는 건 아마 모든 사람의 희망이자 꿈일거다. 몇 달전 스페이스x 팰콘 해비가 랜딩하는거 보고 머지않아 현실이 될 수 있을 것 같았다. 준비되었을 때 떠날 수 있게 열심히 일하러 가야겠다.

2019년 첫 글, 폐관 수련 후기

2018년 12월 26일 부터 2019년 01월 12일 까지 나는 베트남에서 폐관수련을 했다. 숙소에서 공부와 업무를 동시에 진행하면서 느낀점을 써보려고 한다.

왜 베트남이었는가? — 위 글에도 나와있지만 처음 선택지는 뉴질랜드였다. 하지만 예산과의 타협과 11월에 좋은 추억도 있어 베트남으로 선택하게 되었다. (맥북 빼면 시체인 디지털 노마드)

나라를 정하고나서 일정을 계획해야 했다. 나는 같이가는 형과 함께 현대카드 트래블 팩토리에서 책도 보고 프리비아 상담도 받았다. (https://haggish00.blog.me/220933421469) 압구정 로데오 쪽에 있는데 여행 책이 엄청 많고! 무엇보다도 바로 일정이나 비행기등을 상담받을 수 있어서 매우 만족했다.

그렇게 계획된 일정은?
12월 26일 ~ 12월 03일 하노이
12월 04일 ~ 12월 05일 한국 (회사 워크샵 덕분에 한국에 왔었다 잠깐.)
12월 05일 ~ 12월 07일 다낭
12월 08일 ~ 12월 17일 나트랑

계획할 때 나트랑이 그렇게 좋다는 말과 한달 날씨 예보를 보고 우기를 피해 잡다보니 일정을 길게 잡았다. 하지만 비는 그렇게 많이 오지 않았고 다낭이 더 좋았기에 아쉬움이 남는다. ㅜㅡㅜ

비용?

항공 비용은 현대카드 프리비아 여행을 통해 예약하였는데 발권 수수료를 제외하고 75,4900원+ 502,100원 = 1,257,000원이 들었다.
숙소 비용은 알아보니 현지 부동산에 가면 조금 더 싸게 구할 수 있다고 봤는데 사람 대하기 힘든 우리에겐 매우 험난한 작업이었다. 리스크를 줄이기 위해 그냥 돈을 더 내고 에어비엔비+호텔 예약 사이트를 이용하기로 했다. 122,408원 + 81,065원 + 125,212원 = 328,685원이 들었다. 1인당 비용인걸 감안해도 저렴하다고 생각한다.
그 외에 유심사고 보험들고 먹고 놀고 했던 비용은 합쳐서 대략 1,000,000원 정도 들었다고 생각한다. 아 아니다 환전도 했으니 300,000원 더하면 될 듯.
총합: 1,257,000원 + 328,685원 + 1,000,000원 + 300,000원 = 2,885,685원이 들었다고 할 수 있다.

목적 및 결과?
이번 수련의 목적은 v8을 완벽히 분석해서 취약점 찾자! 였다. 취약점을 못 찾은게 너무 한이 되지만 내부 동작 구조를 파싱부터 컴파일까지 어느 정도는 숙지할 수 있게 된 것 같다. 예상치 못한 업무가 01월 07일부터 시작되어서 대략 10일정도 집중할 수 있었다. 지금 생각해보니 10일 동안 한 것치고는 많은 성과가 나온 것 같아 기분이 매우 매우 좋다.
원래 계획은 코워킹 스페이스를 적극적으로 이용하려고 했는데 여행 아니면 집 밖 잘 안나가는 해커의 습성과 편안한 침대 덕분에 집에서 더 많이 했던 것 같다 ㅋㅋ. 하노이에서 한번 가본 코워킹 스페이스(moon-work)는 나름 괜찮았다. 점심 배달 서비스도 있어서 굳이 나가지 않아도 돈만 내면 뭐든 시켜줬다.

음식?
숙소비를 나름 최대한 줄였기 때문에 맛있는 것을 먹는데에 돈을 많이 썼다.

같이간 형은 인천에서 양주 사서 마치 알코올 홀릭처럼 마셨다 ㅋㅋ
쌀국수도 많이 먹었다.

저렴한 물가 덕분에 한국에선 10만원이 넘는 파인 다이닝 레스토랑 혹은 3-dish 코스요리등을 3-5만원 정도 선에서 먹을 수 있던 점이 가장 마음에 들었다.

요런거라 던지…

사진은 많아 여기에 다 올릴 수 없는게 참 아쉽다. ㅜㅜ

뉴이어 파티

우리 일정 중 새해가 포함되어 있어 뉴이어 파티를 가보았다. 인-싸들만 가는 파티라 10만원이라는 거금을 내고 들어갔다 ㅜㅜ 술 2개와 플래터가 포함되어있는 가격이었다. 사람들과 어올려 카운트 다운을 하니 나름 좋은 경험이었다. (ㅎㅁㅎ)

아저씨 포스로 사진 찍었다 ㅋㅋㅋ

 여행?
원래 여러가지 여행지를 정했는데 일하고 공부하느라 호이안 밖에 가지 못했다. 지금까지도 이어지고 있는 기관지염도 한몫했다. (나트랑 바다에서 수영하려고 수영복 챙겨왔는데 한번도 못했다 ㅜ)
호이안은 정말이지 한국 사람으로 넘쳐났다. 이쁜 거리와 좋은 야경때문에 사람이 많은 것 같았다. 반세오도 호이안에서 먹었다. 베트남 음식들은 라이스페이퍼에 싸먹는 음식이 엄청 많은데 난 귀찮았다.. 그래서 그냥 대충 슥슥해서 한입에 넣어버렸다.

고양이 머리띠도 사봤다 ㅎ.ㅎ

 마무리
여러가지 재미난 에피소드와 맛있는 음식이 더 많지만 더 이상 쓰기 귀찮으니,, 이만 마무리를 하도록 하겠다. 같이간 형님의 인스타그램에 우리가 먹었던 음식이며 그랩을 이용해 오토바이를 탔던 것들 이 남아있으니 궁금하면 들어가서 확인해보길 바란다. ㅎㅁㅎ (https://www.instagram.com/dohyeon.routine/) 마지막으로 같이 갔던 도현장에게 이 글을 바칩니다.

흐므흐흐ㅡㅁ흐ㅡ


새해 맞이 폐관 수련

중2병 걸린 제목 같지만, 어쨌든 계획하고 있다. 한국은 너무 추우니 따뜻한 나라에 박혀 소스코드를 보면서 버그 찾고,, 근본이 되는 압도적인 힘을 공부/정리하고 오려고 한다.

원래 처음 선택지는 뉴질랜드였다. 남반구에 있으니 뭐, 우리나라 겨울일 때 따뜻하다는 것은 누구나 아는 사실일테고. 좋은 공기는 덤. 폐관 수련 장소로 선택되지 못한 이유는 돈과 인터넷이었다.
금액적으로 너무나 비싼 숙소값 (물론 버그를 찾으면 땜빵할 수 있겠지만..). 적정선을 맞춰 숙소를 알아보니 인터넷이 안될 것만 같은.. 그런 곳들만 나왔다. ㅜㅡㅜ

결국 베트남을 골랐다. 11월에 CTF하러 하노이에 잠깐 다녀왔었는데 맛있는 음식도 많고 날씨는 덥지도 않고 선선하니 괜찮았었다. 다만 문제되는게 있다면 공기가 매우 좋지 못하다는 것이다 ㅜ. 이게 어떻게 작용할지는 모르겠지만 하노이만 있는 것은 아니니 상관 없을 것 같다.

[하노이 –> 다낭 (호이안) –> 나트랑] 일주일 씩 이동하면서 숙소/코워킹 스페이스에 박혀 공부하는게 일정이다. 각 주마다 목표치를 정해두고 해야할 것 같은데. 슬슬 정해야 겠다.

으아악 30세 은퇴 가능한거신가!?