Home 🚩제 1회 IxC CTF 운영 ν›„κΈ°πŸš©
Post
Cancel

🚩제 1회 IxC CTF 운영 ν›„κΈ°πŸš©

image

# 글을 μ‹œμž‘ν•˜λ©°


 아직 μ—°μ΄ˆμ΄μ§€λ§Œ λ²Œμ¨λΆ€ν„° 큰 이벀트 ν•˜λ‚˜κ°€ μ§€λ‚˜κ°”μŠ΅λ‹ˆλ‹€,, μ •λ³΄λ³΄μ•ˆμ„ κ³΅λΆ€ν•˜λŠ” μ‚¬λžŒμ΄λΌλ©΄ ν•œ 번쯀 듀어봀을 CTF λŒ€νšŒλ₯Ό 직접 κ°œμ΅œν•˜μ—¬ 문제 μ œμž‘λΆ€ν„° λŒ€νšŒ μš΄μ˜κΉŒμ§€ λͺ¨λ‘ 맑아 μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λŒ€νšŒλ₯Ό zeroλΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ§ˆμΉ˜κΈ°κΉŒμ§€ μ €μ—κ²ŒλŠ” 큰 업적이라고 μƒκ°ν•˜κΈ°λ„ ν•˜μ˜€κ³ , CTF μš΄μ˜μ„ ν•˜λ©° μ—¬λŸ¬ λΈ”λ‘œκ·Έμ™€ 글듀을 μ°Έκ³ ν•˜μ˜€μ§€λ§Œ μš΄μ˜μ— κ΄€ν•΄ μ™„μ „ν•˜κ²Œ μ •λ¦¬λ˜μ–΄ μžˆλŠ” 글은 λ§Žμ§€ μ•Šλ‹€κ³  μƒκ°ν•˜μ—¬ 저희와 같이 λ³΄μ•ˆμ„ κ³΅λΆ€ν•˜λŠ” λ™μ•„λ¦¬λ‚˜ μŠ€ν„°λ”” λ“±κ³Ό 우리 동아리λ₯Ό 이어 λ‚˜κ°ˆ μš΄μ˜μ§„ λΆ„λ“€μ—κ²Œ 이 글이 κ°€μ΄λ“œκ°€ λ˜μ—ˆμœΌλ©΄ ν•˜λŠ” λ°”λžŒμ— μ΄λ ‡κ²Œ 글을 μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


# IxC의 μ‹œμž‘


Β μ €λŠ” ν˜„μž¬ μ€‘μ•™λŒ€ν•™κ΅ μ†Œν”„νŠΈμ›¨μ–΄ν•™λΆ€ ν•™κ³Όμ—μ„œ μ •λ³΄λ³΄μ•ˆμ„ κ³΅λΆ€ν•˜λŠ” CAUtion의 회μž₯을 맑고 μžˆμŠ΅λ‹ˆλ‹€. μ§€λ‚œ 10월에 같은 학ꡐ μ‚°μ—…λ³΄μ•ˆν•™κ³Ό μ •λ³΄λ³΄μ•ˆ ν•™μˆ  동아리 ISANG 회μž₯λ‹˜κ³Ό 연락이 λ‹Ώμ•„ 쒋은 기회둜 두 동아리가 μ—°ν•©ν•˜μ—¬ CTFλ₯Ό κ°œμ΅œν•˜κΈ°λ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λŒ€νšŒλͺ…은 ISANG X CAUtion CTF, μ€„μ—¬μ„œ IxC CTF둜 μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λŒ€νšŒ 개졜의 의의 및 λͺ©ν‘œλŠ” λšœλ ·ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 각 λ™μ•„λ¦¬λ§ˆλ‹€ λ³΄μ•ˆ 곡뢀λ₯Ό 이제 막 μ‹œμž‘ν•œ 뢀원이 λŒ€λΆ€λΆ„μ„ 이루고 있고, 그렇기에 CTF κ²½ν—˜μ΄ μ—†λŠ” 뢀원이 λ§Žμ•˜μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ Newbieμ—κ²Œ CTF κ²½ν—˜μ„ μ œκ³΅ν•˜μ—¬ μ΄μ œκΉŒμ§€ 각자 κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ‘μš©ν•˜μ—¬ μ μš©ν•΄λ³΄κ³ , 재미λ₯Ό 뢙일 수 μžˆλ„λ‘ ν•˜λŠ” 것이 λŒ€νšŒμ˜ μ·¨μ§€μ˜€μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μˆ˜μ€€ 높은 λ¬Έμ œλ“€λ³΄λ‹€λŠ” μ‰¬μš΄ λ¬Έμ œλ“€μ„ μœ„μ£Όλ‘œ κ΅¬μ„±ν•˜κ³  CTFλΌλŠ” λŒ€νšŒμ˜ 진행 방식을 κ²½ν—˜ν•  수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

이번 λŒ€νšŒλŠ” μš΄μ˜μ§„ λͺ¨λ‘ CTF 운영 κ²½ν—˜μ΄ μ—†μ—ˆκ³ , 처음으둜 μ—°ν•©ν•˜μ—¬ μ§„ν–‰ν•˜λŠ” λŒ€νšŒμ΄κΈ° λ•Œλ¬Έμ— 운영이 λ―Έμˆ™ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜μ–΄ λŒ€νšŒ μ°Έκ°€μžλ₯Ό 외뢀인 λŒ€μ‹  각 동아리 λΆ€μ›μœΌλ‘œ ν•œμ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ•„λ§ˆ 이번 λŒ€νšŒλ₯Ό κ³„κΈ°λ‘œ μ—°ν•© CTFλ₯Ό μ—°λ‘€ ν–‰μ‚¬λ‘œ μ§„ν–‰ν•˜κ²Œ 될 것 같은데 μ΄ν›„μ—λŠ” 운영 μ‹€λ ₯을 갈고 닦아 더 λ°œμ „λœ λŒ€νšŒκ°€ λ˜μ—ˆμœΌλ©΄ ν•˜λŠ” λ°”λžŒμž…λ‹ˆλ‹€.


image

λŒ€νšŒ μš΄μ˜μ§„μ€ 각 λ™μ•„λ¦¬μ—μ„œ CTFλ₯Ό μš΄μ˜ν•˜κΈ° μœ„ν•œ 인원을 λͺ¨μ•„ 총 16λͺ…μœΌλ‘œ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μš΄μ˜μ§„μ€ 뢄야별 문제 μΆœμ œνŒ€, μ›Ή μ„œλ²„ μš΄μ˜νŒ€, ν™λ³΄νŒ€, Docker νŒ€μœΌλ‘œ νŒ€μ„ λ‚˜λˆ„μ–΄ μΉ΄μΉ΄μ˜€ν†‘ μ±„νŒ…λ°©, Discord, Notion을 μ΄μš©ν•˜μ—¬ ν˜‘μ—…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


# λŒ€νšŒ μ€€λΉ„


πŸ“Œ μ˜ˆμ‚° 및 지원

μš°μ„  λŒ€νšŒ 진행을 μœ„ν•΄μ„œ μ˜ˆμ‚°μ΄ λ“€μ–΄κ°€μ•Ό ν–ˆλ˜ 뢀뢄은 λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€.

  1. λŒ€νšŒ μ„œλ²„
  2. μƒκΈˆ 및 μƒν’ˆ
  3. 도메인

λ‹€ν–‰νžˆλ„ CAUtion은 NAVER D2λ‘œλΆ€ν„° 지원을 λ°›κ³  μžˆμ—ˆκ³  ISANG은 μ€‘μ•™λŒ€ν•™κ΅ LINC 3.0 μ‚¬μ—…λ‹¨μœΌλ‘œλΆ€ν„° 지원을 λ°›κ³  μžˆμ–΄ 지원과 λ”λΆˆμ–΄ 자치 μ˜ˆμ‚°μœΌλ‘œ λͺ¨λ‘ ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 넀이버 ν΄λΌμš°λ“œ ν”Œλž«νΌμ˜ μ„œλ²„μ™€ μ•½ 80λ§Œμ› μ–΄μΉ˜μ˜ μƒν’ˆμ„ 지원 λ°›μ•˜κ³  동아리 자치 μ˜ˆμ‚°μœΌλ‘œ 도메인을 κ΅¬μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 지원해주신 두 곳에 λͺ¨λ‘ μ§„μ‹¬μœΌλ‘œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€ ..πŸ˜‚

image


πŸ“Œ λŒ€νšŒ μ„œλ²„

λŒ€νšŒ μ„œλ²„λŠ” μ•žμ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ NAVER D2λ‘œλΆ€ν„° 지원을 λ°›μ•˜κ³ , 넀이버 ν΄λΌμš°λ“œ ν”Œλž«νΌμ—μ„œ μ œκ³΅ν•˜λŠ” [Standard] 4vCPU, 16GB Mem, 50GB Disk [g2] μ‚¬μ–‘μ˜ ν΄λΌμš°λ“œ μ„œλ²„λ₯Ό μ΄μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

image

ν΄λΌμš°λ“œ μ„œλ²„λŠ” λŒ€νšŒ 후에도 CAUtionμ—μ„œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, μš΄μ˜μ§„μ˜ μ„œλ²„ μ œμ–΄λ₯Ό μœ„ν•΄ μ „μš© μ‚¬μš©μžλ₯Ό λ§Œλ“€μ–΄ ssh둜 μ ‘κ·Όν•¨μœΌλ‘œμ¨ μ„œλ²„λ₯Ό μ œμ–΄ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


πŸ“Œ 홍보

image

홍보도 λΉ μ Έμ„œλŠ” μ•ˆλ˜λŠ” λŒ€νšŒ μ€€λΉ„μ‚¬ν•­μ΄μ—ˆκ³  홍보 방법, 홍보 λŒ€μƒ, 홍보 λͺ©μ  λ“±λ“± μ—¬λŸ¬ 이야기가 μžˆμ§€λ§Œ λŒ€νšŒμ˜ 성격에 영ν–₯을 λ°›κΈ° λ•Œλ¬Έμ— μƒλž΅ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.


πŸ“Œ CTFd

CTFλŠ” 자체 ν”Œλž«νΌμ„ μ œμž‘ν•˜λŠ” 것도 λ°©λ²•μ΄κ² μ§€λ§Œ κ°€μž₯ 유λͺ…ν•œ ν”Œλž«νΌμΈ CTFd μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ‚΄λΆ€μ μœΌλ‘œ λ‹€μ–‘ν•œ κΈ°λŠ₯κ³Ό μœ μš©ν•œ κΈ°λŠ₯이 이미 κ΅¬μΆ•λ˜μ–΄ μžˆκΈ°μ— CTFdλ₯Ό μ΄μš©ν•˜λŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€. ~ CTFd Docs


1) Deployment

μ—¬κΈ°μ„œλŠ” CTFdλ₯Ό κ΅¬μΆ•ν•˜λŠ” 방법을 μ„€λͺ…λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. μ €ν¬λŠ” dockerλ₯Ό μ΄μš©ν•˜μ—¬ CTFd μ‚¬μ΄νŠΈλ₯Ό κ΅¬λ™ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  1. CTFd github 클둠
    1
    
     git clone https://github.com/CTFd/CTFd.git
    
  2. CTFd/docker-compose.yml λ₯Ό μ•Œλ§žκ²Œ μˆ˜μ •
    λ‹€λ₯Έ λΈ”λ‘œκ·Έ λ“±μ—μ„œλŠ” SECRET_KEY ν•„λ“œλ₯Ό μΆ”κ°€ν•˜κ³  μž„μ˜μ˜ 값을 μ„€μ •ν•˜λΌκ³  ν•˜μ˜€λŠ”λ°, 없어도 싀행이 되긴 ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€..?
  3. docker-composeλ₯Ό μ΄μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ 생성
    1
    
     sudo docker-compose up
    

    μ €λŠ” 처음 μ‹€ν–‰ν•  λ•Œ μ—¬λŸ¬ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. pip, openssl λ“±λ“±.. ν•΄λ‹Ή 였λ₯˜λ“€μ„ 고친 후에 정상 λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. (보톡 μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šκ±°λ‚˜ 버전 였λ₯˜μ˜€μŠ΅λ‹ˆλ‹€..)

  4. μ •μƒμ μœΌλ‘œ μ‚¬μ΄νŠΈμ— 접속이 κ°€λŠ₯ν•˜λ©΄ dockerλ₯Ό λ°±κ·ΈλΌμš΄λ“œλ‘œ μ‹€ν–‰
    1
    
     sudo docker-compose up -d
    

주어진 docker-compose.yml μ—μ„œ 이미 volumesλ₯Ό κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ²„κ°€ κΊΌμ Έ docker μ»¨ν…Œμ΄λ„ˆκ°€ down λ˜μ–΄λ„ λ‹€μ‹œ μ»¨ν…Œμ΄λ„ˆ 생성 μ‹œμ— μ €μž₯된 DBμ—μ„œ 정보λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.

ν˜Ήμ€ CTFd λ‚΄λΆ€μ—μ„œ 자체 λ°±μ—… μ‹œμŠ€ν…œμ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ•„λž˜μ—μ„œ λ‹€μ‹œ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.


2) Settings

CTFd μ»¨ν…Œμ΄λ„ˆκ°€ μƒμ„±λœ 이후에 CTFdμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ μ„ΈνŒ…μ„ 마치면 λŒ€νšŒ μ‚¬μ΄νŠΈκ°€ λ™μž‘ν•©λ‹ˆλ‹€. 주둜 μ‚¬μš©ν•˜μ˜€λ˜ κΈ°λŠ₯을 μ•„λž˜μ— μ •λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.


  • Pages

    • HTMLκ³Ό Markdown μ–Έμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό μ œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Media Libraryμ—μ„œ 이미지 등을 μ—…λ‘œλ“œν•˜λ©΄ 파일 μœ„μΉ˜λ₯Ό 받을 수 있고 본문에 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ•„λž˜ μ΄λ―Έμ§€λŠ” 저희가 μ œμž‘ν•œ λŒ€νšŒ index νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. image


  • Notification

    • λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ μ•Œλ¦Όμ„ 보낼 수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. μ•Œλ¦Όμ˜ μœ ν˜•λ„ μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ•„λž˜ μ΄λ―Έμ§€λŠ” IxC λŒ€νšŒ 쀑간에 μ•ˆλ‚΄ν•  사항을 Notification으둜 μ „μ†‘ν•œ λͺ¨μŠ΅μž…λ‹ˆλ‹€. image


  • Configuration

    • Appearance: CTF λŒ€νšŒλͺ…, μ„€λͺ… μ„€μ • κ°€λŠ₯
    • Theme: Logo, Icon, Header, Footer 등을 μ„€μ • κ°€λŠ₯.
    1
    2
    3
    4
    5
    
    <style>
        :not(i) {
            font-family: 'LINESeedKR-Bd' !important;
        }
    </style>
    

    Tip. μœ„μ™€ 같은 μ½”λ“œλ₯Ό Header에 μ‚½μž…ν•˜λ©΄ μ‚¬μ΄νŠΈ 전체 글꼴을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • Custom Fields : λŒ€νšŒ μ‚¬μ΄νŠΈ κ°€μž… μ‹œ μ°Έμ—¬μžμ˜ μΆ”κ°€ 정보λ₯Ό μž…λ ₯ 받을 수 μžˆλ„λ‘ μ„€μ • κ°€λŠ₯. IxCλŠ” 동아리 λΆ€μ›λ§Œ μ°Έμ—¬ν•  수 μžˆμ—ˆκΈ°μ— 이름, ν•™λ²ˆ, μ†Œμ†μ„ μž…λ ₯ 받도둝 ν•˜μ—¬ κ²€μ¦ν•˜μ˜€μŠ΅λ‹ˆλ‹€. image

    • Backup : CTFd의 ν˜„μž¬ μƒνƒœλ₯Ό μ €μž₯ν•œ zipνŒŒμΌμ„ μΆ”μΆœν•˜κ³ , μ €μž₯된 zipνŒŒμΌμ„ import ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Dockerμ—μ„œ λ³Όλ₯¨μ„ μ„€μ •ν•΄μ£Όμ–΄ 별닀λ₯Έ 백업이 ν•„μš” μ—†μ—ˆμ§€λ§Œ ν˜Ήμ‹œ λͺ¨λ₯Ό μ‚¬νƒœλ₯Ό λŒ€λΉ„ν•˜μ—¬ λŒ€νšŒ κΈ°κ°„ λ™μ•ˆ 주기적으둜 백업을 ν•˜μ—¬ λ…Έμ…˜μ— μ €μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€. image


πŸ“Œ DNS

DNSλŠ” λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


  1. κ°€λΉ„μ•„μ—μ„œ 도메인 κ΅¬μž… image

  2. 넀이버 ν΄λΌμš°λ“œ - Global DNS에 κ°€λΉ„μ•„μ—μ„œ λ“±λ‘ν•œ 도메인 등둝. λ ˆμ½”λ“œ κ°’μœΌλ‘œλŠ” μ„œλ²„μ˜ IP μ£Όμ†Œλ₯Ό λ„£μ–΄μ€λ‹ˆλ‹€. image

  3. λ„€μž„ μ„œλ²„ 확인

    넀이버 ν΄λΌμš°λ“œμ—μ„œλŠ” λ‹€μŒ 두 개λ₯Ό λ„€μž„μ„œλ²„λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€. ns1-1.ns-ncloud.com / ns1-2.ns-ncloud.com

  4. κ°€λΉ„μ•„ 도메인 관리 νƒ­μ—μ„œ λ„€μž„ μ„œλ²„ 등둝 image

  5. λ„λ©”μΈμœΌλ‘œ 접속 κ°€λŠ₯


Tip. IxCμ—μ„œλŠ” λ‹€μŒκ³Ό 같이 별칭(μ„œλΈŒ 도메인)을 μ„€μ •ν•˜μ—¬ λ¬Έμ œλ³„λ‘œ 직관적인 도메인을 μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ex) web.isangxcaution.xyz:1234 image


πŸ“Œ 문제 μ œμž‘

image

문제 μ œμž‘μ€ 첫 회의 λ•Œ λΆ„μ•Όλ³„λ‘œ μΆœμ œν•  문제 수λ₯Ό μ •ν•˜κ³  각 λΆ„μ•Όλ³„λ‘œ νšŒμ˜ν•˜μ—¬ 문제λ₯Ό μΆœμ œν•˜μ˜€μŠ΅λ‹ˆλ‹€. 처음 λͺ©ν‘œν•œ 좜제 문제 μˆ˜λŠ” 33κ°œμ˜€μœΌλ‚˜ μ—΄μ • λ„˜μΉ˜λŠ” μš΄μ˜μ§„ λΆ„λ“€κ»˜μ„œ 단 7λͺ…μ˜ μš΄μ˜μ§„μ΄ 총 44개의 문제λ₯Ό μ œμž‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€..πŸ‘ λ¬Έμ œκ°€ λ‹€ λ§Œλ“€μ–΄μ§€κ³  λ‚˜μ„œλŠ” λ¬Έμ œκ°€ λ§Žλ‹€κ³  μƒκ°ν•˜μ˜€μœΌλ‚˜ λ§ˆμ°¬κ°€μ§€λ‘œ 열정적인 μ°Έκ°€μžλΆ„λ“€κ»˜μ„œ 2개의 문제λ₯Ό 남기고 λͺ¨λ‘ ν‘Έμ…¨μŠ΅λ‹ˆλ‹€..πŸ™Š


1) Deployment

CTFλŠ” ν•΄ν‚Ήλ°©μ–΄λŒ€νšŒμ˜ 일반적인 진행 λ°©μ‹μœΌλ‘œ, νŠΉμ • μ„œλΉ„μŠ€λ‚˜ ν”„λ‘œκ·Έλž¨μ„ λŒ€μƒμœΌλ‘œ 취약점을 μ°Ύμ•„λ‚΄μ–΄ μˆ¨κ²¨μ§„ ν”Œλž˜κ·Έ(Flag) νŒŒμΌμ„ μ°Ύμ•„λ‚΄λŠ” λŒ€νšŒμž…λ‹ˆλ‹€. λŒ€νšŒμ˜ νŠΉμ„±μƒ ν”Œλž˜κ·Έλ₯Ό ν¬ν•¨ν•œ μ·¨μ•½ν•œ μ„œλΉ„μŠ€λ₯Ό κ΅¬λ™ν•˜λŠ” μ„œλ²„κ°€ ν•„μš”ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 문제 nκ°œμ— λŒ€ν•΄ μ„œλ²„ n개λ₯Ό μš΄μ˜ν•  수 μ—†μœΌλ―€λ‘œ 가상 ν™˜κ²½μ„ κ΅¬μΆ•ν•˜μ—¬ ν•΄λ‹Ή ν™˜κ²½μ„ λŒ€νšŒ μ°Έμ—¬μžκ°€ 접속할 수 μžˆλ„λ‘ ν•΄μ•Όν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•œ 졜적의 μ„ νƒμ§€λŠ” Dockerλ₯Ό μ΄μš©ν•˜μ—¬ 문제 μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

IxCμ—μ„œλŠ” Dockerλ₯Ό μ΄μš©ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ 총 27λ¬Έμ œμ˜€κ³ , λ§Žμ€ 문제λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ docker-compose 을 μ΄μš©ν•˜μ—¬ μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆ(문제 μ„œλ²„)λ₯Ό κ΄€λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. IxCμ—μ„œ μ§„ν–‰ν•œ Docker 관리 방법에 λŒ€ν•΄μ„œ μ΄μ•ΌκΈ°ν•˜κ² μŠ΅λ‹ˆλ‹€.


  • 문제 ν•˜λ‚˜λ‹Ή Dockerfile ν•˜λ‚˜μ™€ docker-compose.yml νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ κ΄€λ¦¬ν•©λ‹ˆλ‹€. μ΄λŠ” κ°œλ³„ 문제λ₯Ό μˆ˜μ •ν•΄μ•Όν•  λ•Œ μ»¨ν…Œμ΄λ„ˆμ˜ μž¬μ‹œμž‘ 등을 μœ„ν•¨μž…λ‹ˆλ‹€.
  • 각 λΆ„μ•Όλ³„λ‘œ 문제 디렉토리λ₯Ό λ§Œλ“€κ³ , 내뢀에 Dockerfileκ³Ό docker-compose.yml이 ν¬ν•¨λ˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ꡬ쑰의 μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    .(category directory)
    β”‚
    β”œβ”€β”€ challenge1
    β”‚   β”œβ”€β”€ docker-compose.yml
    β”‚   β”œβ”€β”€ Dockerfile
    β”‚   └── index.html
    β”œβ”€β”€ challenge2
    β”‚   β”œβ”€β”€ app.py
    β”‚   β”œβ”€β”€ docker-compose.yml
    β”‚   β”œβ”€β”€ Dockerfile
    β”‚   β”œβ”€β”€ flag.txt
    β”‚   └── templates
    β”‚       └── index.html
    ...
    
    
  • docker-compose.yml μ˜ˆμ‹œ
    1
    2
    3
    4
    5
    6
    7
    8
    
    version: '3'
    
    services:
      web-challenge1:
        build: .
        image: "challenge1"
        ports:
          - "10100:80"
    
    • version: compose 파일의 λ²„μ „μœΌλ‘œ 버전별 νŠΉμ§•μ€ 곡식 λ¬Έμ„œ μ°Έκ³ .
    • service: μ„œλΉ„μŠ€ λͺ©λ‘μ„ μž‘μ„±. 문제 이미지(ex. web-challenge1) 이외에도 μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€κ°€ μžˆμ„ 경우 μΆ”κ°€.
    • build: Dockerfile이 μœ„μΉ˜ν•œ 경둜 μž‘μ„±.
    • image: 이미지 이름 μ„€μ •.
    • ports: {host port}:{container port} μˆœμ„œλ‘œ μž‘μ„±. μ˜ˆμ‹œμ—μ„œλŠ” 10100 포트둜 μ ‘μ†μ‹œ μ»¨ν…Œμ΄λ„ˆμ˜ 80번 ν¬νŠΈμ™€ λ§€ν•‘ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. web.isangxcaution.xyz:10100κ³Ό 같은 hostname으둜 접속할 수 μžˆμŠ΅λ‹ˆλ‹€.


    Docker λ„€νŠΈμ›Œν¬ ν’€(Network Pool) 였λ₯˜

    1
    2
    
    Creating network "{challenge_name}" with the default driver
    ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
    

    IxC λŒ€νšŒ μ€€λΉ„ 쀑 문제 μ»¨ν…Œμ΄λ„ˆ 생성 μ‹œ μœ„μ™€ 같은 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ§ˆμ£Όν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄λŠ” dockerμ—μ„œ κ΄€λ¦¬ν•˜λŠ” λ„€νŠΈμ›Œν¬ 풀이 가득 μ°¨ 더 이상 λ„€νŠΈμ›Œν¬λ₯Ό 생성할 수 μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 문제 1κ°œλ‹Ή λ„€νŠΈμ›Œν¬ 1개λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ 각 λ¬Έμ œλ³„ μ»¨ν…Œμ΄λ„ˆκ°€ λ™μΌν•œ λ„€νŠΈμ›Œν¬μ— μ‘΄μž¬ν•΄λ„ λ˜λŠ” 문제끼리 같은 λ„€νŠΈμ›Œν¬μ— μœ„μΉ˜ν•˜λ„λ‘ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    1
    2
    3
    4
    
    networks:
      default:
        external:
          name: ixc_net
    

    μœ„μ˜ μ½”λ“œλ₯Ό 같은 λ„€νŠΈμ›Œν¬μ— μœ„μΉ˜ν•  문제의 compose νŒŒμΌμ— μΆ”κ°€ν•˜λ©΄ 같은 λ„€νŠΈμ›Œν¬μ—μ„œ μ»¨ν…Œμ΄λ„ˆκ°€ λ™μž‘ν•˜κ²Œ 되고 μž„μ‹œμ μœΌλ‘œ 문제λ₯Ό ν•΄μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    Solved by smart_kang

  • Dockerfile, compose 파일, 문제 파일 등이 μ€€λΉ„λ˜λ©΄ μ•„λž˜ λͺ…령을 μ΄μš©ν•˜μ—¬ containerλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    1
    2
    3
    4
    5
    
    # ν•΄λ‹Ή 디렉토리 λ‚΄μ—μ„œ μ‹€ν–‰
    sudo docker-compose up -d --build
    
    # μ ˆλŒ€κ²½λ‘œλ₯Ό λͺ…μ‹œ
    sudo docker-compose -f {compose_file_path} up -d --build
    
  • ν•˜λ‚˜μ˜ 문제λ₯Ό μˆ˜μ •ν•œ λ’€μ—λŠ” μˆ˜μ • 사항을 λ°˜μ˜ν•˜μ—¬ 이미지λ₯Ό λ‹€μ‹œ buildν•˜κ³  μ»¨ν…Œμ΄λ„ˆλ₯Ό μž¬λΆ€νŒ…ν•©λ‹ˆλ‹€.
    1
    2
    3
    4
    5
    
    # μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ DOWN
    sudo docker-compose down
    
    # 이미λ₯Ό buildν•  사항이 μžˆλ‹€λ©΄ buildν•˜κ³ (--build) containerλ₯Ό λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰(-d)
    sudo docker-compose up -d --build
    
  • μ„œλ²„λ₯Ό μž¬λΆ€νŒ…ν•˜κ±°λ‚˜, Docker에 λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μ„ κ²½μš°μ— λͺ¨λ“  문제의 compose νŒŒμΌμ„ 일일히 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ™μž‘μ‹œν‚€λŠ” 것은 λΉ„νš¨μœ¨μ μ΄λΌκ³  μƒκ°ν•˜μ—¬ λ‹€μŒκ³Ό 같이 scriptλ₯Ό μ œμž‘ν•˜μ—¬ μ‹€ν–‰ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    image


2) Validation

문제λ₯Ό μ œμž‘ν•œ ν›„ ν•΄λ‹Ή 문제의 μ•ˆμ „μ„±μ„ κ²€μ¦ν•˜λŠ” 것은 ν•„μˆ˜λΌκ³  μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 문제λ₯Ό κ²€μ¦ν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œλŠ” 1) μš΄μ˜μ§„ μ„œλ‘œμ˜ 문제λ₯Ό 풀어보고 ν”Όλ“œλ°± 2) μΆœμ œκ°€ 직접 본인의 Write-Up μž‘μ„± 두 가지λ₯Ό μ±„νƒν–ˆμŠ΅λ‹ˆλ‹€.

image

μœ„μ™€ 같이 μš΄μ˜μ§„ μ„œλ‘œμ˜ 문제λ₯Ό 풀어보고 μœ„μ™€ 같이 ν”Όλ“œλ°±μ„ λ‚¨κ²¨λ‘μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ“Œ μΆ”κ°€λ‘œ

1) CTFd-First-Blood-Discord-Bot

λŒ€νšŒ 쀑 μž„μ˜μ˜ 문제λ₯Ό 처음으둜 ν’€μ—ˆμ„ 경우 λ””μŠ€μ½”λ“œμ— 곡지λ₯Ό ν•˜λŠ” 봇을 μš΄μ˜μ§„ λΆ„ ν•œ λΆ„κ»˜μ„œ λ„μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€(By neko_hat). ν•΄λ‹Ή λ΄‡μ˜ λ ˆν¬μ§€ν† λ¦¬μ—μ„œ μžμ„Έν•œ μ‚¬μš©λ²•μ„ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

image

2) λŒ€νšŒ κΈ°κ°„ μš΄μ˜μ§„ 상주

νƒ€μž„ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄ λŒ€νšŒ κΈ°κ°„λ™μ•ˆ μš΄μ˜μ§„μ΄ μ§ˆμ˜μ‘λ‹΅κ³Ό μ„œλ²„λ₯Ό 관리할 수 μžˆλ„λ‘ 상주 인원을 κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 상주 인원은 μš΄μ˜μ§„ λ””μŠ€μ½”λ“œ μŒμ„± 채널에 μ ‘μ†ν•˜μ—¬ λΉ λ₯΄κ²Œ ν”Όλ“œλ°±μ„ μ£Όκ³  받도둝 μ‘°μΉ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


# λŒ€νšŒ μ‹œμž‘

λŒ€νšŒλŠ” κ±±μ •κ³ΌλŠ” 달리 λ¬΄μ‚¬νžˆ μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ‹¬κ°ν•œ 문제 였λ₯˜λ„ μ—†μ—ˆκ³  쀑간에 μ„œλ²„κ°€ κΊΌμ§€κ±°λ‚˜ νŠΈλž˜ν”½μ΄ λͺ°λ¦¬λŠ” ν˜„μƒλ„ λ‚˜νƒ€λ‚˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

image

4개의 νŠΉλ³„ λ¬Έμ œλ„ μ€€λΉ„ν•˜μ—¬ 일정 μ‹œκ°„μ— κ³΅κ°œν•˜μ˜€κ³  4개의 λ³΄λ„ˆμŠ€ 문제λ₯Ό μ€€λΉ„ν•˜μ—¬ λŒ€νšŒμ— 재미λ₯Ό λ”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λŒ€νšŒκ°€ 끝날 μ―€μ—λŠ” 문제 ν’€μ΄μž μˆ˜κ°€ 적은 λ¬Έμ œλ“€μ— λŒ€ν•œ 힌트λ₯Ό κ³΅κ°œν•˜κΈ°λ„ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


# λŒ€νšŒλ₯Ό 마치며


λŒ€νšŒλŠ” λ‚˜λ¦„ μ„±κ³΅μ μœΌλ‘œ 마치게 λ˜μ—ˆκ³ , λŒ€νšŒ 마무리 단계λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


πŸ“Œ μˆ˜μƒμž Write-Up μ·¨ν•©

λŒ€νšŒ μˆ˜μƒμž 쀑 1λ“±μ—μ„œ 5λ“±κΉŒμ§€ ν’€μ΄ν•œ λ¬Έμ œμ— λŒ€ν•œ Write-Up을 μ œμΆœν•΄μ•Ό ν•˜λŠ” κ·œμΉ™μ΄ μžˆμ–΄ 주어진 κΈ°κ°„κΉŒμ§€ 제좜 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

πŸ“Œ Write-Up 곡개

문제 좜제자의 Write-Upκ³Ό 1λ“±μ—μ„œ 5λ“±κΉŒμ§€μ˜ μˆ˜μƒμžμ˜ Write-Up을 Github λ ˆν¬μ§€ν† λ¦¬μ— μ •λ¦¬ν•˜μ—¬ κ³΅κ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ“Œ μƒν’ˆ μˆ˜μ—¬

μˆ˜μƒμž λͺ…단을 μ •λ¦¬ν•˜μ—¬ μƒν’ˆμ„ μˆ˜μ—¬ν•˜κΈ° μœ„ν•œ 절차λ₯Ό μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ°©ν•™ 기간인 κ΄€κ³„λ‘œ κ°œκ°•ν•œ 첫 주에 μ˜€ν”„λΌμΈμœΌλ‘œ μƒν’ˆμ„ λ°°λΆ€ν•˜μ˜€κ³  μ˜€ν”„λΌμΈ 수령이 μ–΄λ €μš΄ λΆ„λ“€μ—κ²ŒλŠ” 착뢈 νƒλ°°λ‘œ λ°°λΆ€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ“Œ κ²°κ³Ό 보고 μΉ΄λ“œ λ‰΄μŠ€

μ°Έκ°€μž λΆ„λ“€κ³Ό 각 동아리에 λŒ€νšŒ κ²°κ³Όλ₯Ό κ³΅μœ ν•˜κΈ° μœ„ν•΄ μˆ˜μƒμž λͺ©λ‘κ³Ό λŒ€νšŒ 톡계, 지원사 감사 인사λ₯Ό ν¬ν•¨ν•˜μ—¬ μΉ΄λ“œ λ‰΄μŠ€ ν˜•μ‹μœΌλ‘œ μ œμž‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


μ΄λ ‡κ²Œ λŒ€νšŒλŠ” 별 문제 없이 λ§ˆλ¬΄λ¦¬κ°€ λ˜μ—ˆμœΌλ‚˜, 개인적으둜 μ•„μ‰¬μ› λ˜ 점 λͺ‡ 가지가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

첫 μ§Έ, λŒ€νšŒ μ€€λΉ„λ₯Ό μ‹œμž‘ν•œ 기간이 ν•™κΈ° 쀑이닀 λ³΄λ‹ˆ 기말고사 κΈ°κ°„κ³Ό 학ꡐ 과제 ν”„λ‘œμ νŠΈ 진행 기간을 ν”Όν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ°”μœ 일정 μ€‘μ—μ„œλ„ λŒ€νšŒλ₯Ό μ€€λΉ„ν•΄μ•Ό ν–ˆκ³ , λͺ¨λ“  학ꡐ 일정이 λλ‚œ ν›„μ—λŠ” 연말 μ—°μ΄ˆ μ‹œμ¦Œμ— 16λͺ…μ˜ μš΄μ˜μ§„μ˜ 일정을 λ§žμΆ”κΈ°λž€ 쉽지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ•Œλ¬Έμ— λŒ€νšŒ μ€€λΉ„μ—λ§Œ μ˜¨μ „νžˆ μ§‘μ€‘ν•˜κΈ°μ—λŠ” μ–΄λ €μ› κ³ , μžμ—°μŠ€λ ˆ μš΄μ˜μ§„ λ‚΄μ—μ„œ κΈ°νšν•œ λ‚΄μš©λ“€μ„ λͺ¨λ‘ μ„±κ³΅μ μœΌλ‘œ μ§„ν–‰ν•˜μ§€ λͺ»ν•˜κ²Œ 된 점이 μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€πŸ˜₯

λ‘˜ μ§Έ, λŒ€νšŒ μ‚¬μ΄νŠΈμ— SSL μΈμ¦μ„œλ₯Ό λ°œκΈ‰ λ°›μ•„ μ μš©ν•  κ³„νšμ΄ μžˆμ—ˆμœΌλ‚˜ μš°μ„  μˆœμœ„μ—μ„œ λ°€λ €λ‚˜κ²Œ λ˜μ—ˆκ³  일정 문제둜 μ§„ν–‰ν•˜μ§€ λͺ»ν•˜μ˜€λ˜ 점이 μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€.


개인적으둜 처음 직접 μ§„ν–‰ν•΄λ³΄λŠ” λŒ€νšŒμ˜€κ³ , λ™μ•„λ¦¬μ˜ 회μž₯μœΌλ‘œμ„œ λΆ€μ›λ“€μ—κ²Œ 쒋은 κ²½ν—˜μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ κ³„νšν•œ λŒ€νšŒλ₯Ό 별 문제 없이 마치고 μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ˜ˆμ‚°κ³Ό μ„œλ²„ 등을 지원 받은 μƒνƒœμ—μ„œ λŒ€νšŒλ₯Ό μ„±κ³΅μ μœΌλ‘œ λ§ˆμ³μ•Ό ν•œλ‹€λŠ” 뢀담감이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, ν•¨κ»˜ λŒ€νšŒλ₯Ό μš΄μ˜ν•˜λŠ” μš΄μ˜μ§„ λΆ„λ“€μ˜ 참여와 λŠ₯λ ₯ 덕뢄에 별 νƒˆ 없이 λŒ€νšŒλ₯Ό 마칠 수 μžˆμ—ˆκ³ , λŒ€νšŒ μ°Έμ—¬μœ¨μ΄ μ €μ‘°ν•  κ²ƒλ§Œ κ°™μ•˜μ§€λ§Œ 각 λ™μ•„λ¦¬μ—μ„œ λ§Žμ€ λΆ„λ“€κ»˜μ„œ μ°Έμ—¬ν•΄μ£Όμ…”μ„œ 문제λ₯Ό μ—΄μ‹¬νžˆ ν‘ΈλŠ” λͺ¨μŠ΅μ—μ„œ λ³΄λžŒμ„ λŠκΌˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ λŒ€νšŒ μš΄μ˜μ„ μœ„ν•΄ μ΄λ ‡κ²Œ μ›Ή μ„œλ²„λ„ 직접 ꡬ좕해보고, λ¬Έμ œλ„ λ§Œλ“€μ–΄λ³΄κ³ , ν‰μ†Œ κ³΅λΆ€ν•˜κ³  μ‹Άμ—ˆλ˜ λ‚΄μš©λ“€μ„ 곡뢀할 수 μžˆμ–΄ 즐거웠고 제 μžμ‹ μ΄ ν•œμΈ΅ μ„±μž₯ν•œλ“―ν•œ λŠλ‚Œμ΄ λ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλ„ μ‹œμž‘λ„ 전에 두렀움을 κ°€μ§€κΈ°λ³΄λ‹€λŠ” μš°μ„  λΆ€λ”ͺν˜€ λ΄μ•Όκ² λ‹€λŠ” 닀짐을 ν•˜κ²Œ 된 κ·€ν•œ κ²½ν—˜μ΄μ—ˆμŠ΅λ‹ˆλ‹€.


κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κΆκΈˆν•œ μ μ΄λ‚˜ ν”Όλ“œλ°±μ΄ μžˆμœΌμ‹œλ‹€λ©΄ λŒ“κΈ€ λ‚¨κ²¨μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ ☺

[Wargame] Webhacking.kr Write-Ups

[Wargame] Over The Wire - Bandit