ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2020 사이버 공격 방어 대회(CCE) 예선 참가 후기 & 간단한 writeup
    문제 풀이 2020. 10. 3. 18:08

    www.cstec.kr/cce2020/

     

    2020 사이버 공격방어 대회

    2020 사이버공격방어대회 운영본부, Tel: 070-7688-3129, E-mail: cce@nsr.re.kr © Copyright 2020 사이버 공격방어대회 All Rights Reserved

    www.cstec.kr

    병특을 시작한 지 벌써 2년이라는 시간이 흘렀다. 그러면서 대전에 있는 학교에도 안가게 되고 동아리 친구들과도 연락이 뜸해지고 그런 상태였다.

    어쨌든 최근에는 갑자기 ctf를 다시 참여하고 싶다는 생각이 들던 차였는데, 마침 동아리 톡에서 위의 대회 나가면 좋을 거 같은데 사람이 부족하다고 하는 것이었다. 나는 동아리 기준에서 보면 이미 동아리원도 아니고 늙고 병든 한 사람에 불과했지만 염치 불구하고 한번 나가보기로 했다. 나랑 같이 나갔던 친구들아 고마워~~ 그리고 Shout out to Kaist GoN and GoatskiN~~ 워 참고로 Goatskin은 Kaist gon의 anagram이다. 호고곡

     

    대회 자체는 9월 26일 오전 9시 - 24시까지 총 15시간동안 진행을 했다. 문제 풀이 방식(jeopardy) 이었다. 같이 나간 친구들 3명과는 discord로 대화를 하면서 각자의 집에서 언택트하게 대회를 진행했다. 벌써 1주일이 지나서 그런지 scoreboard, challenges 페이지는 열리지도 않는다. 

     

    동아리에서 2팀이 나갔는데 우리팀은 아쉽게 15등인가를 했다. 내가 문제를 좀만 더 풀었으면 본선 진출을 할 수 있었을 것 같은데 참 아쉬웠다. 나머지 팀이 몇등했는지는 비밀임

     

    내가 풀었던 문제들은 간단히 아래와 같다.

    + misc에 simple patch 문제를 풀었다. 그 문제는 약간 nc(netcat) 환경을 처음 접한 사람들(+ very simple format string bug?)을 위한 문제였던 것 같아서 딱히 풀이는 안써도 될 것 같다.

     

    늙고 병든 사람 답게 100점 따리 문제를 많이 푼것을 알 수 있다. 아 keyboard 문제는 내가 안풀었다 그러고보니.. 근데 머 풀이에 근접하기는 했으니 써봐도 괜찮을 것 같다. 그리고 simple memory는 가볍게 풀 수 있었는데, 본선 진출하려고 되도 않는 1000점짜리 문제들(socks 같은거) 잡고 있다가 그거도 못풀고 이것도 못푸는 안타까운 상황이 벌어졌다.

    문제는 쉬웠지만 유익했고 재미있었다. 누가 출제자인가? 그들은 전설이다.

     

    나머지 친구들은 각자의 분야에서 엄청난 두각을 드러내며 pwn. web. crypto등의 문제를 풀었다. 대회 중에도 그렇고 항상 내 주변엔 멋진 친구들과 사람들이 많아서 참 많이 배우는 것 같다. 오랜만에 옛날로 돌아간 기분이었다.

     

    이제 간단히 문제 풀이를 해보아야겠다.

     

    simple carv

    Description: Find the secret!(아마 대충 이런 내용임)

    궁금한 건 내가 첨부파일을 올려도 되는지? 가 있다. 요청하시면 제공은 할 수 있을 것 같다.

    첨부파일은 disk.img 파일이었는데, 이 img 파일을 mount 해서 내부의 pdf 파일을 읽으면 되는 매우 간단한 문제였다.

    나는 맥 환경이었어서, ext4fuse disk.img 를 통해 mount 하고 secret.pdf를 읽었다.

     

    sharkme

    사람들이 packet 분석하는 문제를 낼때 주로 아기상어 밈? 을 많이 쓰는 것 같은데 나는 그게 뭔지는 잘 모르겠다.

    어쨌든 첨부파일이 pcap 인것을 보니 간단히 wireshark를 통해서 packet을 분석하는 문제인 것 같다.

    wireshark 에서 필터를 tcp.port == 80 || udp.port == 80 를 걸고 확인해보니,
    141.164.54.79 ftp 서버에 접속해 cce2020.docx를 저장한 기록이 남는다. 해당 파일 내용도 데이터 형태로 pcap 내부에 남아있어서, 해당 파일을 dump 해서 봤더니 flag가 있었다.

    cce2020{baby-shark-doodoodoodoo-wire-shark-doodoodoodoo} 아기상어....두두두두? 

     

    simple packet

    간단한 pcap 파일과 server.py, client.py 파일을 주었다.

    def do_xor(data):
        key = b"\x10\x07\x19"
        return bytearray([data[i] ^ key[i%3] for i in range(len(data))])
    
    def win():
        with open('flag.txt', 'r') as f:
            return f.read()
    
    class MyTCPHandler(socketserver.BaseRequestHandler):
        def handle(self):
            s = self.request
            data = s.recv(1024)
            ddata = do_xor(data)
            print(b'from client : ', ddata)
            if ddata == b'Hell, World':
                s.send(do_xor(win().encode()))
            s.close()
    

    이게 server.py 인데, 클라에서 'Hell, World'를 보내면 flag를 xor encrypt 해서 클라로 보내주는 것을 확인할 수 있다.

    아마 338번 패킷인 것 같은데, 이 패킷의 데이터를 xor encrypt 다시 해주면 flag를 확인할 수 있다.

     

    web log

    50mb 가 넘어가는 웹 로그들을 던져주었다. 어딜 봐야할지 모르겠어서 혹시 flag, key 등으로 검색하면 뭔가 나오지 않을까해서 검색을 해보았다. flag로 검색을 해보니 if(ascii(substr((select flag from flag),5,1))=36 같이 blind sql injection을 하고 있는 게 보였다. flag의 각 글자를 가져오고 있는데, 각 글자별로 가장 마지막 ascii code를 가져오는 코드를 짜서 flag를 뽑았다.

    flag = ''
    file = open('sql.log', 'r')
    for i in range(34):
    	# XXX(banana): 첫글자만 1을 빼준다.
    	flag_chr = 32
    	for line in file:
    		if "if(ascii(substr((select flag from flag),%d,1"%(i+1) in line:
    			flag_chr += 1
    		else:
    			break
    	flag += chr(flag_chr)
    print(flag)

     

    keyboord 

    keyboard packet을 던져주었다. 이런 패킷은 처음보는데, 뭔가 키보드 input을 누르고 이게 전달되는 과정을 반복하는 것처럼 보였다. 처음에는 데이터가 ascii code로 전달되는 줄 알았는데 8 byte 씩 leftover data 라는 데이터가 전달이 되고 있었다.

    뭐라고 검색을 해야할 지 몰라서 keyboard leftover data 이런식으로 검색을 해보니 https://github.com/WangYihang/UsbKeyboardDataHacker 이런 깃헙 레포가 있었다. 아마 다른 ctf에 비슷하게 나온 문제인 것 같다. 그래서 keyboard input을 어쨌든 parsing 해보면 flag를 뽑아내는 c 코드 파일을 얻을 수 있어서 flag를 뽑으면 된다.

     

    webpacket

    엄청 큰 pcap 파일을 준다. 파일을 뒤지다보면 어느 qwerasdf company에 접속하는 것을 알 수 있는데 이 사이트가 websocket 통신을 사용한다. 특정 id/pw를 이용할 때 접속이 잘 되는 것을 packet을 확인해서 알 수가 있었고, 내가 실제로 해당 서버에 접속해 id/pw를 똑같이 입력해서 접속을 하면 flag가 나오더라

    fail이라고 나오기는 하는데, 실제로 데이터를 확인해보니 flag를 던져주는 것을 알 수 있었다. websocket의 기초에 대해 알 수 있었다~

     

    어쨌든 결론적으로 유익한 시간이었다. 나중에 또 ctf를 참가해보면 좋을 것 같다. 오늘의 글은 여기서 끝~

    댓글

Designed by Tistory.