같은 보안 진로 준비하는 언니가 팀 출전 제안해주셔서 학과 동기, 선배들이랑 4명이서 팀을 꾸려서 [핵테온 세종 2025]에 참가하게 되었다! 3월 중순부터 매주 금요일마다 모여서 팀 회의하고.. Dreamhack 문제 풀이하고.. 첫 대회 출전이라 뭘 준비해야할지 모르겠어서 나름대로 다른 대회 참가자들 Writeup이나 대회 기출 문제들을 보면서 준비했었다
+) 살면서 Writeup이라는 말을 대회 준비하면서 처음 들어봤었다..ㅋㅋㅋㅋ
Writeup은 문서 기록을 남기는 것을 말하는데, 이런 대회에서는 문제 풀이과정을 정리한 문서를 Writeup이라고 하는 것 같다
※ 참고
24회 해킹캠프 참가 후기 및 CTF Writeup [Tistory]
대회 당일날 아침... 긴장되는 마음으로 아침 일찍 학교 근처 공유오피스로 모여서 대회 시작을 기다렸다. 사실 현실감 없어서 살짝 멍때리고 있었는데 딱 이 화면 보자마자 급긴장되어서 점점 쫄리기 시작했다; 그래도 대회 시간이 무려 9시간이니까 시간 여유 두고 풀면 충분히 풀 수 있다! 라는 마인드로 대기했다
대회는 Jeoperdy 방식으로 진행되어 웹 해킹, 리버싱, 포너블, 크립토, 포렌식 등의 다양한 종류의 문제가 출제되었다. 그리고 7개의 Tactic 형식으로 구성되어서 이전 Tactic에서 1문제라도 풀어야 다음 Tactic을 풀이할 수 있었다. Tactic은 간단하게 게임 스테이지라고 생각하면 될 것 같다. 첫번째 Tactic에서는 웹과 간단한 포너블 문제가 4문제 섞여있었다.
일단 첫번째 Tactic을 해결하는 게 우선이었기에 가장 쉬워보이는 Forgotten Past 문제부터 시도했다. 이 문제는 웹페이지에 숨겨진 플래그값을 찾는 문제였다.
플래그값이 숨겨진 파일이 어디 있는지 그 경로만 알아내면 금방 해결할 수 있는 문제였다. 언니가 웹에서는 /old_site, /flag 등등 숨겨진 경로에 파일을 숨기는 문제가 많다고 이것저것 경로를 대입해보다가 /robots.txt 경로를 입력했을 때, /old_site 라는 숨겨진 경로가 존재하고 그 하위에 login.html이라는 파일이 존재하는 것을 확인했다.
<script>
function checkLogin(id, pw) {
if (id === "admin" && pw === "letmein123") {
window.location.href = "a6b49f3b955fef1ee136033a83382e6c.html";
} else {
alert("Invalid credentials. Please try again.");
}
}
</script>
login.html
ID : admin, PW : letmein123 인 것을 확인했으므로 이 계정으로 로그인하면 위 화면처럼 플래그값을 알아낼 수 있다.
1번 문제를 해결하고 나니 Tactic 2가 열려서 그때부터는 개인플레이를 했다.
2번째로 풀이한 문제는 Frontdoor 1문제이다. 세션을 이용해서 로그인 계정을 찾아 플래그값을 확인하는 문제였는데... 선배 Writeup을 봐도 이건 어떻게 되는 건지 잘 모르겠다. 백엔드 개발자여서 옆에서 막 세션값 쿠키값 조작하고 네트워크 확인하고 그러는데 오늘 뭔가 사람이 달라보였음... 진짜 선배 없었으면 어떻게 풀었을라나......
그 사이에 나는 Tactic 2에 있는 리버싱 문제를 풀어봤다. 일단 I love reversing이 그럴싸하게 생겨서 이 문제부터 시도해봤다. 실행 파일의 코드를 분석해서 공격자가 임의로 추가한 값을 찾는 문제였다.
임의로 추가한 값이라면 뭔가 어색하게 값을 끼워놨을 것 같아서 서브루틴을 하나하나 다 뒤져가면서 값을 찾아봤다... 리버싱이 이렇게까지 노가다 작업이었나...? 라는 생각을 했다.. 그놈의 서브루틴은 대체 어떤 구조길래 재귀함수로 땅 파고 들어갈 것 마냥 파도파도 끝도 없이 계속 나왔다. 지금 생각해보면 처음 단추를 잘못 끼워서 삽질만 너무 한 것 같긴 하다. 뭔가 특징이 있었을텐데 일단 삽질해서 답 못 구해서 결국 포기...
메모장 켜놓고 답처럼 생긴 건 전부 정리해놓고 대입해봤는데 결국 못 찾고 끝났다 하하하...
Tactic 2의 Pyrus 문제도 건드려봤다. 일단 압축파일을 다운받았을 때 파일 확장자가 whl이라고 되어있어서 이게 뭐지 싶어서 인터넷부터 찾아봤다. 알아보니 파이썬 패키지 확장자여서 whl을 zip으로 바꾸고 일반 압축 파일 해제하듯이 압축 해제해주면 내부 파일이 나올 거라고 해서 일단 압축 해제부터 해봤다.
pyrus 폴더 안에는 _init_.py 파일이 있었다. .pyrus가 뭘까 생각해봤는데 pyrus 폴더 하위에 pyrus.cpython-310-x86_64-linux-gnu.so 파일이 있는 것으로 보아 이 파일 안에 뭔가가 숨겨진 것 같았다. 그래서 이 파일을 strings로 분석해봐야겠다고 생각했다.
17h5709f8e8b9644af6E
5DTORS17h88748080ef1ab188E
3run17h3fdfb984ed86b3c3E
뭔가 그럴싸하게 생긴 문자열이 나와서 이게 문제를 푸는 실마리가 될 것 같아서 ~.so 파일을 실행해서 뭔가를 해보려고 했는데 리눅스 환경에서 실행하는 것이 안 되어서 우선 보류했다.
그 다음으로 시도해본 문제는 Barcode문제.. barcode 유형 파일은 또 처음 본다. 대회 출전해서 처음보는 게 너무 많아서 진짜 인터넷 검색하느라 시간 다 쓴 것 같다 하하하
일단 이번 문제는 barcode 파일의 출력 결과로 flag.barcode 파일의 문자열이 출력되게끔 하는 입력 문자열을 찾는 문제였다. 그래서 악성 코드는 아닌 것 같아 그냥 내 호스트 PC에서 열어봤다.
flag.barcode 파일을 vscode로 열면 * 로 FLAG 문양을 만들어낸 문자열이 보인다. 문제에서도 그놈의 플래그가 계속 나왔는데 이젠 문제 내용에서도 플래그가 나오니까 이쯤되면 플래그로 뇌절하라는 건지 슬슬 약이 올랐음 아오;
뭔가 입력하면 * 를 아스키코드로 출력해주는 문자열 같은 게 있지 않을까 싶어서 IDA로 뜯어봤는데.. 그래프화가 안 된다고 해서 생짜로 코드 보려다가 패스.. strings 확인도 해봤는데 뭔가 소득이 없었다.
그래서 일단 임의로 해독코드를 만들어서 hex로 출력하는 코드를 실행해봤더니 뭔가 그럴싸하게 생긴 코드가 나오길래 혹시 답일까 싶어서 입력해봤지만 실패했다 ^!^ 진짜 눈물나네 뭘 시도해봐도 성공한 게 없음!!
그와중에 공지 새로 올라왔다길래 보니까 운영 서버 공격 행위(scan/fuzz)하지 말라고 올라온 게 너무 웃겼다. 이 밑에는 서버 스캐닝한 IP 블랙 리스트도 올라와있었다. nmap 같은 거 썼다가 블락 먹은 걸까 왜 서버를 공격한 건지 의문이었음 허허
근데 리버싱 실행하다가 뭔가 잘못된 건지 내 가상머신 하나가 박살나버렸다; 혹시 몰라서 미리 스냅샷 찍어뒀으니 망정이지; 근데 갑자기 얘가 박살나면서 리버싱할 머신이 없어져서 살짝 멘탈이 나갔다. 이때가 아마 대회 마무리까지 2시간 남았을 즈음이었다 하하
일단 급한대로 리버싱 포기하고 pyrus 문제로 다시 돌아가서 이거라도 해결해보자는 마음으로 pyrus만 계속 붙잡고 있었다.
>>> p = pyrus.Pyrus()
>>> print(dir(p))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'encode', 'get_input', 'get_output', 'get_secret', 'get_seed', 'set_input', 'set_seed']
어찌저찌 해서 kali linux에서 python3.10으로 얘를 실행시켜봤더니 Pyrus 클래스 객체 내부에 암호화하는데 사용하는 걸로 보였던 함수들이 다 있었다. 그래서 이 함수들 동작을 확인해보면서 출력됐던 문자열을 복호화하려고 이리저리 머리를 굴려봤지만... 결국은 대회 시간 종료되어서 강제 종료당했다 흑흑
이제 답처럼 생긴 걸 찾아도 답인지 확인해볼 수가 없다...ㅎㅎ
최종 스코어보드...!
문제 풀면서 너무 우울해져서 마치면 바로 집에나 갈까 했는데 중간중간 당충전했는데 5시쯤부터 진짜 배가 고프다 못해 위가 아플 정도로 배고파서 끝나자마자 바로 짐 싸들고 근처 고깃집으로 달려갔다 오랜만에 고기 먹었는데 진짜 꿀맛이었음 남의 살 최고 헤헤
다 먹고 치즈김치볶음밥도 먹었는데 이게 진짜 별미였다.. 진짜 여긴 된장찌개도 맛있고 볶음밥도 너무 맛있는 것 같다 다음에 또 와야지
고기 다 먹고는 후식으로 설빙을 먹었다 설빙도 오랜만에 먹어본 거 같은데 너무 맛있었다 그냥 머리 쓰다가 오니까 뭘 먹어도 다 너무 맛있었나봄 달달한 거 먹으면서 다같이 수다 떠니까 너무 재밌었다
첫 CTF 참가 후기 끝! 결과는 아쉬웠지만 그래도 우리팀 오늘 하루 너무너무 고생많았다 우리팀 최고❤👍
안녕하세요 세종시청 최선 주무관 입니다.
저희 핵테온 세종에 참여해 주셔서 대단히 감사합니다.
꼭 본선진출 아니여도 7월 10~11일에 무료
정보보호 콘퍼런스 및 CTF 문제풀이도 남아있으니 한번 놀러오세요
다시한번 핵테온 참여해 주셔서 정말 감사합니다.