1. W3Challs - My Little Pony CEH (Reversing, 6pts)
오늘은 어제보다는 쉬운 문제로 들고 왔다. 다만 이 문제는 이전까지 풀었던 문제들과는 달리 PE 파일이 아닌 어도비 플래시 파일이라는 점이 특이사항이다. 사실 플래시를 다뤄본 적은 없었고, 애초에 올해부터는 보안 지원도 종료된 사실상 죽은 소프트웨어라고 생각하고 있어서 굳이 손을 대지 않았지만… 그냥 경험 삼아서 가볍게(?) 풀어봐도 괜찮겠다 싶어서 풀어보기로 했다!
메인 PC에서 실행시키기엔 뭔가 찜찜해서.. 평소 분석 용도로 사용하는 VM에서 실행해보았다. 당연히 악성 파일은 아니고, 그냥 평범해보이는 마이 리틀 포니 플래시 게임 비스무리한게 나온다. 이 플래시에서는 아래 [그림 2]와 같은 식으로 프랑스어로 쓰인 여러 문제가 나오고, 마지막에는 [그림 3]과 같이 ‘You failed!’라는 메시지를 출력한다. 아마 주어진 문제들을 모두 맞출 때 플래그가 출력되는 형태일 듯 하다.
그렇다면 마이 리틀 포니를 잘 아는 사람에게 물어봐 주어진 문제들을 풀 수도 있겠지만, 주변에 그런 사람은 없고.. 나 역시 그런 사람은 아니다. 그러니 그나마 할 줄 아는 리버싱으로 풀어보기로 했다.
이제 실행흐름을 알아보았으니 본격적으로 분석에 들어갈 차례다. 그런데… 문제 파일을 다운로드하는 링크가 보이지 않는다. W3Challs 페이지에서는 단지 웹에서 플래시를 보여줄 뿐, 해당 파일 자체를 제공하고 있지는 않았다. 그래서 어떻게 파일을 구해야하나 생각하던 중, 이 화면의 소스코드 내 플래시 파일과 관련된 부분이 있을 것이라 생각하여 브라우저의 개발자 도구를 열고 ‘swf’를 키워드로 검색해봤더니..
예상대로 코드 안에 해당 플래시 파일의 주소가 담겨져있었고, 해당 주소를 통해 swf 파일을 다운로드할 수 있었다. 그럼 이제 분석을 하면 되는데, 알다시피 이 파일은 PE 파일이 아닌 Flash 파일이므로 별도의 분석툴을 사용해야 한다. 개인적으로 플래시 분석 도구를 잘 알지는 못해서, 그냥 내가 애용하고 있는 Flare VM에서 설치해준 FFdec이라는 도구를 사용하였다.
[그림 5]에서 좌측을 보면, 다양한 폴더들이 존재하는데 해당 폴더들의 이름에 맞는 리소스들이 들어있음을 알 수 있었다. 혹시나 해서 맨 위부터 차례대로 모든 폴더들을 다 살펴봤지만, 플래그라고 할만한 부분은 역시 보이지 않았다. 다만 폴더들 중 맨 마지막에 있는 scripts 폴더에서 이 파일의 소스코드를 확인할 수 있었는데 이를 분석하면 플래그를 얻을 수 있을 것이다.
이 프로그램에서도 문자열 검색 기능이 있어서 아까 결과 화면에서 보았던 ‘You failed’를 키워드로 검색해보았다. 그랬더니, ‘q_3’ 파일에서 해당 문자열이 잡혔는데 이 파일이 갖고 있는 코드를 좀 더 살펴본 결과 플래그를 얻는 방법을 정확히 알 수 있었다.
요약하자면, 예상대로 모든 문제를 맞춰야 플래그가 출력되는 방식이며 아래 [그림 6]에서 보이듯 소스코드를 통해 모든 문제의 정답을 쉽게 확인할 수 있다.
이런 식으로 20문제의 정답이 모두 공개되어있다. 문제 수가 꽤나 많아서 다소 귀찮긴 했지만 그래도 전혀 어렵지 않게 정답을 얻을 수 있었다. 모든 답을 다 구했으면 이제 문제를 풀어 플래그를 얻으면 된다. 모든 문제를 맞추면 아래 [그림 7]과 같이 플래그를 얻을 수 있다.
참고로 플래그는 모든 답안을 문제 순서대로 쭉 나열한 모습이었다. 그래서 굳이 문제를 다시 풀 것 없이 답을 구했으면 바로 플래그를 만들 수 있다. 아무튼 그렇게 얻은 플래그를 입력하면 6점을 얻을 수 있다!
난이도는 상당히 쉬운 문제였지만 그래도 나름 재미있었고, 플래시에 대해 좀 더 잘 알게 된 것 같다.
2. W3Challs - Wi-Fail (Misc, 12pts)
한 문제만 풀고 가기에는 뭔가 좀 아쉬워서 이번에는 네트워크 분석 문제를 풀어보기로 했다. 문제 이름으로도 알 수 있는 무선 네트워크(802.11) 패킷을 분석하는 문제이며, [그림 1]을 통해 보다 자세한 설명을 볼 수 있다.
문제 설명을 요약하자면, 주어진 패킷을 분석해 테러리스트의 계정 정보를 얻고, 위 [그림 2]에 보이는 Face_de_Book에 해당 계정으로 로그인하여 플래그를 얻는 것이 목표이다. 설명에 있는 링크를 누르면 두 개의 패킷이 들어있는 압축파일을 받을 수 있다. 10년도 더 된 문제라 그런지 패킷 확장자가 pcap이 아닌 cap이다… 아무튼 그중 첫 번째 패킷(epreuve10-1.cap)을 WireShark로 열면 아래 [그림 3]와 같은 모습을 볼 수 있다.
우선 위 [그림 4]에서도 볼 수 있듯 데이터가 담긴 패킷들은 모두 암호화되어 있는 것을 확인하였다. 그렇다면 암호화 알고리즘이 무엇인지가 중요한데, 아래 [그림 5]와 같이 헤더에서 WEP Parameter를 볼 수 있었다. WEP 알고리즘으로 패킷을 암호화했다는 의미이니 쉽게 복호화를 할 수 있을 것으로 보인다.
복호화를 위해 칼리 리눅스에 있는 Aircrack-ng를 사용하였다. 그러면 아래 [그림 6], [그림 7]과 같이 곧바로 키를 얻을 수 있다. 그런데 곧바로 풀린 첫번째 패킷(10-1)과 달리 두번째 패킷(10-2)은 풀리지가 않았는데 아마 첫번째 패킷에 관련 단서가 있을 듯 하다.
그렇게 얻은 키를 WireShark로 돌아가서 [그림 7]과 같이 입력해주면 [그림 8]과 같이 복호화 된 패킷들을 확인할 수 있다.
딱 봐도 뭔가 알록달록한 것이 복호화가 잘 된 것 같다. 이제 패킷을 볼 수 있으니 분석하는 일만 남았다. 우선 이 패킷에서는 두 번째 패킷의 암호든, 테러리스트 계정 암호든 최소 둘 중 하나는 담겨있을 것이다. 그래서 ‘password’를 키워드로 하여 Packet details 검색을 했더니 아래와 같은 결과를 얻을 수 있었다.
파란색으로 드래그된 부분이 검색에 걸린 부분이다. 해당 코드는 어떤 사이트의 login.php에 포함된 부분이었는데, 해당 사이트의 url이 문제에 제시된 Face_de_Book의 그것과는 달라서 처음에는 별거 아닌 줄 알았다. 그래서 다른 단서들을 찾는다고 삽질을 좀 하다가 별 소득이 없어서 다시 여기로 돌아오게 되었다. 이번에는 검색어를 바꾸어서 해당 login.php에서의 password의 이름인 ‘pass’로 검색해보았다. 그런데…
놀랍게도 POST로 계정정보를 보낸 패킷이 들어있었다. 혹시나 해서 Face_de_Book에 가서 로그인을 했는데…
보란듯이 로그인에 성공하였다. 어이가 없었지만 그래도 문제를 풀었으니 됐다. 로그인에 성공한 뒤 Home으로 가면 아래 [그림 12]와 같이 플래그를 얻을 수 있다. 그렇게 얻은 플래그를 W3Challs에 가서 입력하면 12점을 얻을 수 있다.
여담으로…
- 대체 왜 패킷에는 문제에서 제시한 url이 아닌 엉뚱한 url이 들어있었는가
- 문제를 어렵게 만들기 위한 페이크일 수도 있지만, 아마 문제가 나온지 오래되었다보니 도중에 도메인 변경이 있었던 것으로 추정된다.
- 두번째 패킷에는 무엇이 있는가
- 두번째 패킷은 Aircrack-ng로 풀리지는 않았지만, 결과적으로 첫번째 패킷과 같은 암호를 사용하였다.
- 그래서 첫번째 패킷을 복호화하면 자연스럽게 두번째 패킷도 복호화가 되는 것을 확인할 수 있다.
- 두번째 패킷에서도 마찬가지로 admin의 계정정보를 확인할 수 있으며, 그 외 특이한 점은 없었다.