DEF CON CTF 2021 후기

대학을 졸업한 이후 ctf를 잘 안하다가 어쩌다보니 올해 3월쯤부터 Super Guessor팀에 들어가게 되었고, 이미 팀이 Perfect Blue랑 연합해서 Hitcon ctf 2020을 우승했기 때문에 본선 진출권을 확보해둔 상태였습니다.

 

작년에는 코로나로 인해 데프콘이 완전하게 온라인으로 진행되었고, 올해에는 오프라인 행사를 진행하지만 굳이 행사장에 오지 않고 온라인으로 참여해도 상관이 없었습니다. 실제로 16개의 팀 중에 현장에 참여하지 않은 팀들도 여럿 있었습니다.

 

저희의 경우, 일부 팀원은 대회장에 갔습니다만 저는 백신도 맞지 않았고 코로나도 좀 무섭고 돌아온 후 2주 격리도 부담되어서 그냥 얌전히 집에 있었습니다.

 

대회는 현지 시간 기준으로 오전 10시부터 시작해 첫날 8시간 공방 후 종료, 둘째 날 8시간 공방 후 종료, 셋째 날 4시간 공방 후 종료되는 일정으로 총 52시간 동안 진행되었습니다. 문제는 이걸 한국 시간으로 바꾸면

 

Day 1 토요일 오전 2시 - 오전 10시

Day 2 일요일 오전 2시 - 오전 10시

Day 3 월요일 오전 2시 - 오전 6시

 

가 되어서 상당히 시간대가 별로였습니다. 어차피 대회가 시작하고 나서야 잠을 거의 안자니(48시간 넘는 대회에서 아예 안자는건 이젠 나이가 들어서 그런가 힘들더라구여) 그렇다쳐도 대회 시작시간이 오전이나 오후쯤이면 전날 푹 잔 상태로 시작을 할 수 있는데 새벽에 시작해버리면 그것도 애매해서.. 그래서 금요일에 좀 애매하게 낮잠을 자다가 깨서 대회를 시작했습니다.

 

그냥 주어진 문제만 풀면 되는 jeopardy 방식과 다르게 attack / defense 방식에서는 프록시, 패킷 분석, 찾아낸 익스플로잇을 각 tick마다 보내서 플래그를 얻어내고 그 플래그를 자동으로 인증하는 서비스 등 미리 준비를 해야할 것이 많습니다. 이런 부분들을 이미 팀에서 잘 준비해두어서 굉장히 편하게 대회에 참여할 수 있었습니다.

 

작년과 2년 전에 비해 포너블, 리버싱을 포함한 cs 지식이 늘긴 했지만 그렇다고 데프콘 본선 문제에 비빌 정도의 능력을 가진건 아니니 이번 대회에서는 어떤걸 할 수 있을지 걱정반 기대반으로 대회에 임했습니다.

 

그런데 시작하자마자 주최측에서 좀 사고를 쳤습니다. 원래 대회에서는 문제를 순차적으로 공개하는데 실수로 attack & defense의 모든 문제가 보여지도록 했습니다,,,,

이렇게 대혼란인 상황 속에서도 대회는 일단 계속 진행이 되었고, 첫날 나온 KoH 문제 zero-is-you에서 노가다를 열심히 했습니다. 문제 이름에서 유추할 수 있듯 baba is you에서 영감을 받은 퍼즐 게임이었는데, win에 닿으면 그 레벨을 깨는게 아니라 무려 /bin/sh 쉘코드를 실행시키게끔 유도를 해야하는 문제였습니다.

 

총 15개의 스테이지가 있었고 스테이지를 많이 깰수록, 해결한 스테이지의 수가 같다면 그전 스테이지들에서의 move 횟수 합이 적을수록 순위가 올라가는 방식이었습니다. 팀에서 해결한 단계에서의 이동 경로는 'LURRLSRDRRL...' 이런 텍스트 파일로 제공이 되었어서 저는 pyautogui 모듈를 이용해 해당 텍스트 파일대로 이동을 수행하게 키보드 입력을 하는 프로그램을 만들고 그 과정을 영상으로 찍었습니다. 그리고 그 영상을 참고하면서 이동 횟수를 조금씩 줄여나갔습니다.

 

https://www.youtube.com/watch?v=s9wDxyBQ3JY 

일부는 이렇게 최적화에 집중하고 일부는 단계를 깨는데 집중했습니다. 둘 다 잘 굴러간 덕분에 계속 1, 2, 3등 안에 머물면서 이 문제에서 점수를 낭낭하게 챙길 수 있었습니다.

 

From https://scoreboard.ooo/services.html

 

zero-is-you 문제는 Day 1이 종료될 때 같이 retire됐고, 어째 A/D쪽 문제에서는 딱히 제 능력으로 할 수 있는게 없었습니다. 특히 작년에는 문제가 되게 다양했던 것 같았는데 이번에는 A/D 7문제 중에서 5문제가 ooows라는 이름의, VM을 가지고 뭔가 잘 이해가 안가는 무언가를 하는 문제였어서 더욱 좀 방향성을 잃었습니다.

 

Day2에 다른 KoH 문제로 www라는게 나왔습니다. 마치 metasploit2 마냥 온갖 취약점이 범벅이 되어있는 VM을 하나씩 받아서 공방을 하는 문제였는데, 문제 설명이 graffiti 어쩌구하면서 좀 많이 난해하게 되어있어서 맨 처음에 무엇을 해야하는지를 알아차리는데 좀 오래 걸렸고, 이해한 뒤 서비스에 들어가서 프로세스를 확인해보니 이미 다른 팀이 심어놓은 루트 권한 백도어가 돌아가고 있는 개판 5분전 상황이었습니다. nmap으로 다른 팀들의 ip를 찾고 열려있는 포트 목록을 확인하고, 중간에 apache2랑 웹 취약점으로 어째저쨰 해보려고 했는데 잘 안되어서 이 문제에서는 점수를 거의 얻지 못했습니다.

 

Day 2가 종료된 직후 Day3에 Shooow-your-shell이라는 이름의 쉘코드 관련 KoH 문제가 나올거란걸 알려주었습니다. 문제를 확인해보니 간단하게 설명하면 특정 바이트를 사용할 수 없다거나, 길이 제한이 있는 상황에서 x86_64 / aarch64 / risc-v64 중 어느 하나에서 정상적으로 돌아가는 쉘코드를 제출해야 하는 문제였습니다. 문제를 보고 2년 전에 나온 Bitflip Conjecture (http://www.secmem.org/blog/2019/08/19/Shellcoding-and-Bitflip-Conjecture/) 문제랑 비슷한 것 같다는 생각을 했고, 뭔가 다양한 cpu 환경에서의 쉘코드를 볼 필요가 있을 것 같아 저는 맨 처음에 risc-v64를 보다가 너무 난해해서 때려치고 aarch64에서의 쉘코드를 들여다보고 사용한 바이트의 종류를 가능한 줄인 쉘코드를 준비해뒀습니다.

 

서비스에는 현재 상위권에 있는 다른 팀들의 쉘코드들을 볼 수 있는 기능도 있었는데, Day 3이 시작되고나서 다른 팀이 제출한 쉘코드를 보니 굉장히 당황스러웠었습니다.

 

698973이라는 쉘코드를 보고 이게 뭔가 싶었는데, 결과가 저장되는 history.txt 파일 자체를 조작할 수가 있었습니다. 결론적으로 aarch64 / risc-v64를 들여다본게 큰 의미가 없었고 마찬가지로 저는 또다시 방향성을 잃고 말았습니다,,,

 

그렇게 대회는 끝이 났고, 저희는 6위를 기록했습니다. 상위 팀 4개가 attack & defense 점수를 엄청 챙겨갔지만 저희도 패킷 분석을 통해 익스플로잇을 알아내거나, 분석을 통해 패치를 진행하거나 하는 방식을 통해 그럭저럭 점수를 잘 쌓을 수 있었습니다. zero-is-you도 도움이 좀 된 것 같습니다.

 

돌이켜보니 zero-is-you 말고는 딱히 뭔가를 한건 없네요. www 문제가 제일 아쉽습니다. 그래도 거의 말 그대로 아무것도 못했던 작년, 제작년이랑 비교를 해보면 올해는 한 1/100 정도는 기여를 했으니 여러 방면으로 조금은 성장한 것 같기도 하고,,, 그리고 무엇보다 재밌었고, 여러가지로 느낄 수 있는게 많았습니다.

 

내년에는 운영진이 OOO에서 다른 팀으로 넘어갑니다. 어디에서 운영을 담당할지 모르겠지만 내년에도 좋은 성과가 있으면 좋겠습니다..!

  Comments