아주대 사이버보안학과의 날을 맞아 11월 27일 토요일 12:00 부터 23:59까지 12시간동안 후이즈 & 해머 CTF가 개최되었다.
난 포렌식 5문제와 미스크 한 문제를 출제 및 대회 운영 및 관리를 담당하였다.
문제를 제작할 때 항상 참신하고 재밌는 문제를 만들려고는 하는데 쉽지가 않다. 요즘 학교 과제하느라 CTF도 열심히 안하고 포렌식 공부도 거의 안해서 머리 속에 새로운 지식이 없다. 정체된 상황에 올해 대회 문제출제를 두 번 하면서 아이디어가 거의 바닥나 버렸다. 여기서 문제를 더 뽑아내려고 하다보니 문제 퀄리티가 개인적으로 아쉽다.
앞으로도 문제 출제하려면 공부해야겠다..
Official Write up
원래 출제자 롸업 안썼는데 이번 대회에서는 문제풀이 세미나가 없어서 작성하게 됐다.
문제만들면서 플래그 값 설정하는 것도 하나의 재미라고 느끼는데, 이번에는 그냥 문제명이랑 소금 섞어서 md5 해시값을 플래그 값으로 설정했다. 밀린 과제하면서 문제 만들려다보니 시간을 조금이라도 줄이려..
문제 난이도는 사보 학생들만 참여하고 대회 시간이 12시간으로 짧은 것을 고려하여 전체적으로 쉽지만 다양하게 (스테가노, 멀티미디어, 네트워크, 메모리, 디스크) 출제했다.
Forensic
사보의 기묘한 모험 - 436 points, 7 solvers
Whois&HaMer.png 이미지 파일 하나가 주어진다.
해당 파일을 헥스 에디터로 열어서 보면, PNG 푸터 시그니쳐 뒤에 데이터가 존재함을 알 수 있다.
binwalk 명령어를 사용하면 PNG + ZIP + PNG 구조로 이루어진 것을 확인할 수 있다.
가운데 ZIP 파일 영역을 따로 추출(헥스에디터로 직접 뽑아내기, Winhex 기능 사용하기,foremost 사용하기, 다양하다)해서 압축을 풀면 flag.7z 파일이 있으며
flag.7z 파일의 압축을 풀면 flag.txt를 얻을 수 있다.
flag.txt의 내용을 base64 디코딩하면 플래그를 획득할 수 있다.
ASCTF{5B75794CE6A122D57EDAABFE80CD09F1}
그날 본 사진의 크기를 우리는 아직 모른다. - 484 points, 4 solvers
i_found.png 이미지 파일 하나가 주어진다. 이미지 뷰어로 열어보면 아무것도 보이지 않는다.
왜냐하면 사진 크기가 1 * 1로 설정되어 있기 때문이다.
그런데 사진 크기가 1 * 1 가 정상일리 없다.
tweakpng.exe로 열어보면 IHDR 청크의 CRC값이 올바르지 않다고 한다.
따라서 사진의 크기 값이 강제로 수정되었으며, 올바른 크기값을 찾아야한다는 것을 알 수 있다.
IHDR 청크의 구조는 아래와 같다.
데이터 무결성을 검증하기 위한 CRC 값이 포함되어 있는데, 주어진 파일의 CRC 값이 정상이라고 가정할 경우 이 CRC 값을 사용해서 brute force로 원본 크기 값을 찾아낼 수 있다.
주어진 파일의 IHDR CRC 값은 0x770f8fb2 이다.
width 값과 height 값을 0부터 2999까지 브포하는 파이썬 코드 쓱 짜서 돌려주면
금방 나온다.
나온 값으로 수정해주면
플래그를 획득할 수 있다.
ASCTF{9B7ECCDFD7DE68131D92660B786B9725}
포렌식 문제에 페이크 플래그밖에 없는 뉴비포렌서로 환생해버렸다 - 472 points, 5 solvers
ASCTF.pcap 파일 하나가 주어진다.
Wireshark로 열어보면 802.11 패킷들을 확인할 수 있다.
패킷을 살펴보면 누군가에 의한 대량의 Deauthentication 패킷이 발생하였고 이후 HonHaiPr_05:b6:c7의 EAPOL 패킷이 캡쳐된 것을 확인할 수 있다. EAPOL 패킷이 캡쳐되었으므로 이후 데이터 패킷들을 복호화할 수 있다.
aircrack-ng와 rockyou.txt로 사전 공격을 해주면 패스워드 12356789를 얻을 수 있다.
다시 wireshark로 돌아와서 Edit > Preferences > Protocols > IEEE 802.11
이렇게 키를 추가해주면 된다.
복호화된 패킷들에서 http 필털르 걸어주면
flag.zip파일을 다운받은 것을 확인할 수 있는데, flag.zip 파일에서 플래그를 찾을 수 있다.
ASCTF{6746EAC315DADFED3A6CF3F4F8BBE5E2}
메모리 덤프입니디만, 문제라도? - 500 points, 1 solvers
리눅스 메모리 덤프 문제 처음 만들어보는데 만들 때 삽질 많이 했던 문제다. 어떤 삽질들을 했는지는 스터디에 오시면 들으실 수 있..
리눅스 메모리 포렌식 특성상 문제 풀이보다 환경 구성이 더 오래걸리는 문제다.
먼저 mem.lime이 주어진다.
보통 메모리 덤프파일이 주어지면, 프로필을 확인하기 위해 volatility의 imageinfo 플러그인을 사용하려고 하겠지만
절대 나오지 않는다.
프로필을 알아내려면 strings와 grep 명령어를 사용해서 알아내야 한다.
우분투 18.04에 커널은 linux version 5.4.0-42-generic임을 알 수 있다.
$ apt-get install dwarfdump
$ apt-get install build-essential
$ cd volatility/tools/linux
$ make
$ head module.dwarf (module.dwarf 파일이 생성되었는지 확인)
$ sudo zip volatility/volatility/plugins/overlays/linux/Ubuntu1204.zip volatility/tools/linux/module.dwarf /boot/System.map-5.4.0-24-generic
vol.py --info에서 프로필에서 확인 가능하면 성공
분석할 준비가 끝났다.
linux_bash 플러그인을 사용해보면 터미널에 입력한 내용을 확인할 수 있는데,
asctf라는 파일을 실행한 것을 확인할 수 있으며
pslist로도 pid 2743에서 확인할 수 있다.
asctf 파일을 추출하는 방법은 여기서는 두가지가 있는데, linux_dump_map을 사용하는 것과 linux_find_file을 사용하는 것이다.
linux_dump_map을 사용하기 위해서 먼저 linux_proc_maps를 통해 start 주소값을 얻어서
linux_dump_map으로 추출할 수 있다.
linux_find_file 을 사용하기 위해서는 정확한 파일 경로를 알아야 한다. 윈도우의 filescan이 있었으면 좋겠지만..
다시 linux_bash화면으로 돌아가보면, 앞에 cd .. cd home cd mandu를 통해 현재 디렉토리 위치가 /home/mandu/ 임을 확인할 수 있다.
따라서 asctf라는 파일은 /home/mandu/asctf 에 위치함을 알 수 있다.
Inode 값을 획득할 수 있고 이 값을 사용해서 다시 linux_find_file을 사용하면 파일을 추출할 수 있다,
이렇게 추출한 asctf파일을 실행해주면 base64 문자열을 획득할 수 있으며 실행결과에 나와있듯이 base64 디코딩 2번 시도해주면 플래그를 얻을 수 있다.
ASCTF{5818F673E8A6EA7BE5524722407090D5_2743}
헥스에디터로 열어서 ASCTF 검색하면 바로 찾을 수 있다.
('ASCTF{' 랑 flag 검색하는거는 막았지만 ASCTF는 못 막았다..)
문제 다시 만들기엔 시간이 없어서 pid값을 플래그에 추가해서 인증하는 것으로 수정했다.
(플래그를 출력하는 프로세스의 pid를 찾으라는 내용이 문제 풀이 방향에 힌트를 주는 것 같지만.. 언인텐으로 간단히 풀리는 것 보단 낫다.)
[대회 종료 후] 예상대로 출력하는 플래그는 많이들 찾으셨지만 pid값은 제대로 찾지 못하셨다.
그런데 문제가 대회 종료 30분 전까지 안풀렸고, 볼라티리티로 잘 안된다는 문의까지 들어와서 파일 잘 못 올라갔나 하고 식은땀 줄줄 흘리며 체크섬 확인했다. (문제 만들때 삽질을 많이해서 다른 버전의 파일이 올라갔을 가능성이 1%정도 있었다.) 다행히 파일은 풀리는걸로 제대로 올라갔었다.
다운로드 폴더에서는 dream.zip파일을 찾을 수 있으며 그 안에는 아주 수상해보이는 ps1파일, bat 파일을 찾을 수 있다.
(롸업 쓰면서 든 생각인데, zip 파일에 암호 걸어서 패스워드를 웹상의 파일 다운로드 경로에 같이 둬서 크롬 방문 기록을 반드시 확인하게 할 걸 그랬다.)
readme에서는 dream_installer.bat를 실행하라고 한다.
dream_installer.bat 은 파워쉘로 dream.ps1을 실행한다.
dream.ps1은 http://35.212.225.5/asctf/hello.pyc 를 임시폴더에 다운받아와 실행한다.
임시폴더에서 hello.pyc를 찾을 수 있다.
hello.pyc는 uncompyle6로 디컴파일 할 수 있다.
간단하다. 단순 xor이다.
important.enc = important.hwp xor key 이므로 바탕화면에서 찾았던 important.enc를 important.hwp로 이름을 바꾼뒤에 hello.pyc를 실행하면 복호화된 important.enc를 얻을 수 있으며 다시 이름을 .hwp로 바꿔서 열어주면 플래그를 획득할 수 있다.
ASCTF{E95312D231A4784B78E631FD91468DBB}
Misc & Crypto
사보 스파이 - 493 points, 3 solvers
에니그마랑 난수방송 합친 문제
책상 1 폴더에서 에니그마 모델명을 확인할 수 있으며 '글자가 적혀있는 종이.pdf'에서 암호문을 얻을 수 있다.