dreamhack 17

[Dreamhack] Mongoboard

ObjectID란? ObjectID는 몽고디비의 data type 중 하나로, 주로 PK의 데이터 타입으로 사용된다. 몽고디비의 모든 도큐먼트는 _id 필드를 가진다. _id는 어떤 타입이여도 상관없지만 컬렉션 내에서 unique해야 한다. _id의 디폴트 타입은 ObjectID 타입이며, ObjectID를 개발자가 입력하지 않았다면 MongoDB 드라이버가 만들어준다. rdb에서처럼 auto_increment하는 키를 pk로 사용하지않는 이유는 몽고디비가 분산 환경에서 사용되기 때문이다. (샤딩된 환경에서 고유 식별자로 사용) ObjectID는 위 그림과 같이 12바이트이며, 시간+랜덤 값+count의 조합이다. count도 랜덤 값으로 서로 다른 시스템에서 충돌되지 않는 ObjecdtID를 생성하지 ..

dreamhack 2024.02.08

[Dreamhack] amocafe

페이지에 접속하면 귀여운 고양이가 제일 좋아하는 메뉴가 "1_c_3_c_0__ff_3e" 라고 한다. @app.route('/', methods=['GET', 'POST']) def index(): menu_str = '' org = FLAG[10:29] # 입력값(org)은 19자리이다. org = int(org) # 입력값(org)은 정수이다. st = ['' for i in range(16)] # 알고리즘 결과값인 16자리 문자열 '1_c_3_c_0__ff_3e'가 들어갈 함수 초기화 for i in range (0, 16): res = (org >> (4 * i)) & 0xf if 0 < res < 12: if ~res & 0xf == 0x4: st[16-i-1] = '_' else: st[16-..

dreamhack 2024.02.07

[Dreamhack] proxy-1

RAW 소켓이란? 어느 특정한 프로토콜 용의 전송 계층 포맷팅 없이 인터넷 프로토콜 패킷을 직접적으로 주고 받게 해주는 소켓 RAW 소켓의 정의를 읽어봐도 무슨 소리인지 이해가 가지 않는다. RAW 소켓은 헤더 정보를 프로그래머가 직접 제어할 수 있게 해준다고 하는데 아래 그림을 보고 나니 어떤 느낌인지 알 것 같다. #!/usr/bin/python3 from flask import Flask, request, render_template, make_response, redirect, url_for import socket app = Flask(__name__) try: FLAG = open('./flag.txt', 'r').read() except: FLAG = '[**FLAG**]' @app.rout..

dreamhack 2024.02.02

[Dreamhack] Command Injection Advanced

문제 페이지에서는 사용자가 입력한 url에서 데이터를 다운로드할 수 있는 온라인 도구를 제공한다. 가져온 데이터는 cache 폴더에 저장되고 화면에도 표시된다. 아래 코드에서 중요하게 봐야할 것은 escapeshellcmd 함수이다. escapeshellcmd 함수는 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 문자 앞에 '\(백슬러시)'를 삽입하는데 '-' 문자는 escape 되지 않는다.(앞에 '\'가 붙지 않는다) 명령어 옵션을 이용한 공격이 가능하다는 건데 curl 명령어에서는 -o 옵션으로 임의의 디렉토리에 파일을 생성할 수 있다. Online Curl Request URL 익스플로잇 순서는 다음과 같다. 1. 커맨드 인젝션 "-o" 옵션을 사용해서 임의 위치에 파일을 생성할 수 있는지 확인..

dreamhack 2024.02.02

[Dreamhack] sql injection bypass WAF

SQL 인젝션 문제이고 WAF를 우회하여 공격을 성공해야한다. keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/'] def check_WAF(data): for keyword in keywords: if keyword in data: return True return False @app.route('/', methods=['POST', 'GET']) def index(): uid = request.args.get('uid') if uid: if check_WAF(uid): return 'your request has been blocked by WAF.' cur = mysql.connection.cursor() cur.ex..

dreamhack 2024.02.01

[Dreamhack] error based sql injection

error를 이용해서 sql 인젝션 공격을 해야하는 문제이다. 문제 페이지에 접속해보면 어떤 식으로 SQL 구문이 입력되는지 적혀있다. 간단히 싱글쿼터 하나를 입력해서 위와 같은 에러를 확인할 수 있는데 여기서 MariaDB를 사용하는 것을 확인 할 수 있다. 이를 토대로 MariaDB와 Mysql에서 사용하는 'extractvalue()'와 'updatexml()' 함수를 활용했다. 1. extractvalue(xml_target, xpath_expr) 2. updatexml(xml_target, xpath_expr, new_value) 여기서 중요한건 두 번째 인수인 'xpath_expr'이다. 나머지는 null, 아무숫자, rand() 등 아무거나 써도 된다. xpath_expr이라는 두 번째 인수..

dreamhack 2024.02.01

[Dreamhack] Carve Party

문제에서 제공해준 html 파일을 열어보니 왠 호박하나가 있다. 이걸 10000번 클릭하면 플래그를 얻을 수 있다고 한다. click the pumpkin to make a jack-o-lantern! 10000 more clicks to go! 코드를 살짝 보니 클릭할 때마다 counter가 1씩 올라가고 10000 < counter 가 참이면 플래그를 준다고 한다. 개발자도구를 켜서 counter = 10000 을 입력하고 클릭했더니 일단 플래그는 아닌 것 같은 문자가 출력된다. 코드를 다시 자세히보니 마지막 부분에 '#jack-target' 을 클릭하면 counter가 1 올라가고 counter가 10000보다 작고 100으로 나눴을때 0이 나오면(=클릭 100번마다) pumpkin에 있는 배열과 ..

dreamhack 2024.01.18