2020/08
python flask debugger pin, find and exploit
python flask debugger pin, find and exploit
2020.08.29어떤 CTF에서 python flask 관련 문제가 나왔는데, flask의 debugger pin을 Leak해서 exploit 하는 문제 였다. flask debugger pin은 뭐길래 exploit이 가능한지 알아보자. What is Flask debugger PIN debugger PIN은 개발환경에서 에러가 났을때 쉽게 대화형 debug 모드로 접근 가능하다. 이때 접근 하기 위해서는 PIN 코드가 필요한데 이것이 debugger PIN이다. 코드로 예를 들어 보겠다. 아래 코드에서 마지막 줄을 보면 `debug=True` 라고 되어 있는데, 이렇게 설정이 되어 있으면 debugger PIN을 볼 수 있다. from flask import Flask app = Flask(__name__) @app..
[Google CTF 2020] log-me-in write up
[Google CTF 2020] log-me-in write up
2020.08.27google ctf web 문제의 log me in 이다. 해당 문제 write up은 다른 사람의 롸업을 보고 작성한 것이다. 문제 페이지에 접속하면 아래와 같은 페이지가 나온다. 이번 문제는 코드를 올려 줬는데, 문제의 코드는 아래와 같다. /** * @fileoverview Description of this file. */ const mysql = require('mysql'); const express = require('express'); const cookieSession = require('cookie-session'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); const..
[Google CTF 2020] pasteurize write up
[Google CTF 2020] pasteurize write up
2020.08.27Google CTF 2020 문제중 web 문제 `pasteurize` 이다. 해당 write up은 외국인의 풀이를 바탕으로 작성되었다. 문제 사이트에 접속하면 입력과 제출을 할 수 있는 기능이 있다. 개발자 모드로 보면 `/source` 링크가 있는데 해당 링크로 들어가면 `nodejs`로 코딩된 코드를 볼 수 있다. 아래는 문제의 코드이다. const express = require('express'); const bodyParser = require('body-parser'); const utils = require('./utils'); const Recaptcha = require('express-recaptcha').RecaptchaV3; const uuidv4 = require('uuid')..
[hackerone] - 너무 많이 늦은 버그 바운티 제보
[hackerone] - 너무 많이 늦은 버그 바운티 제보
2020.08.17Title Internal Ports Scanning and IPs Scanning via SSRF Weakness SSRF 이번에 제보한 보고서는 SSRF 취약점 이다. SSRF 공격으로 내부 IP 또는 Port를 스캔 할 수 있다. 해당 사이트는 이미지를 업로드 하거나, 이미지 URL를 입력하여 서버가 그 이미지를 가져오는 기능이 있다. 혹시나 하는 마음에 http://127.0.0.1 라고 입력했는데 아래와 같은 결과가 출력 되었다. [127.0.0.1]: Image could not be downloaded (curl error: 56; Received HTTP code 503 from proxy after CONNECT) Error 내용을 보면 127.0.0.1에 요청을 보냈는데, 503 을 받..
[pwnable.xyz] door write up
[pwnable.xyz] door write up
2020.08.10Analytic 이번 문제는 `main()` 함수와 `win()` 함수 2개만 있다. `main()` 함수를 보면 사용자가 입력한 값을 write 하는 것만 있다. int main(){ setup() puts("Door To Other RealmS") int32_t var_14 = 0 int32_t var_10 = 0 *door = rand():0.d while (true) print_menu() uint64_t rax_2 = zx.q(read_int32():0.d) if (rax_2:0.d != 2) if (rax_2:0.d s> 2) if (rax_2:0.d != 3) if (rax_2:0.d == 4) return 0 // rax_2 == 3 else if (*door == 0) continue e..
[pwnable.xyz] child write up
[pwnable.xyz] child write up
2020.08.09Analytic checksec으로 검사 해보니 처음보는 것이 있는데 `fortify: enabled` 이다. 이건 처음봐서 뭔지 모르겠다... 문제 푸는데는 지장 없는듯..? `create_child()` 함수를 보면 18세 이하만 조건을 통과 할 수 있는데, 조건을 통과하면 `child`의 구조체가 만들어진다. void create_child(){ __printf_chk(1, "Age: ") int64_t rax_1 = read_int32() uint64_t rax_7 if (rax_1:0.d u> 0x12) rax_7 = puts("Not a child.") else void* rax_2 = malloc(0x20) *(rax_2 + 0x18) = sx.q(rax_1:0.d) *(rax_2 + 8) ..
Universe Blog
Universe Blog
2020.08.09https://github.com/Universe1122 Universe1122 - Overview [Patchstack Alliance] [TeamH4C]. Universe1122 has 37 repositories available. Follow their code on GitHub. github.com https://twilight-princess-750.notion.site/Who-am-I-047259a12251420a95244c0472f64535
[pwnable.xyz] car shop write up
[pwnable.xyz] car shop write up
2020.08.09Analytic `Full RELRO` 이기 때문에 GOT overwrite를 할 수 없다. `buy()` 함수를 보면 사용자가 선택한 자동차가 메모리 공간에 저장된다. 이때의 메모리 구조를 보면 아래와 같다. `0x603260` ~ `0x6032af`: 사용자가 `buy()` 함수를 호출하면 `car`라는 구조체의 chunk가 만들어짐 `0x603260`: 자동차 이름을 저장한 주소 `0x603268`: 자동차 이름의 크기 `0x603270`: 다음 청크(`car`)의 주소 `0x603278`: 이전 청크(`car`)의 주소 `0x603290`: 자동차의 이름 gdb-peda$ x/10gx 0x603260 0x603260: 0x0000000000603290 0x0000000000000003 0x6032..
[pwnable.xyz] words write up
[pwnable.xyz] words write up
2020.08.08Analytic 아래 사진은 사용자 정의 함수 목록이다. fill_letters(), fill_numbers(), fill_handles(), fill_words() 함수들은 특별한 기능은 없고 사용자 선택에 따라 문장을 만들어 출력하는 함수 이다. 하지만 fill_handles() 함수를 제외한 나머지 함수들은 만들어진 문장으로 초기화 하여 생성하지만, fill_handles() 함수는 로직 에러로 초기화를 하지 않고 문장을 추가한다. 코드로 자세히 설명하자면, 사용자가 select1 값이 2가 아니고 select2 값이 6이상이면 문장을 초기화 하지 않는다. 이 로직 에러로 문장을 계속 추가 할 수 있게 된다. 문장이 저장되는 메모리 공간은 아래와 같다. 문장이 저장되는 시작 부분은 변수 a인 0x6..
[pwnable.xyz] notebook write up
[pwnable.xyz] notebook write up
2020.08.07바이너리 파일을 분석하여 c로 나타내면 아래와 같다. void make_note(){ printf("size: "); int size = read_int(); void* addr = malloc(0x38); *(addr + 0x30) = malloc(size); *(addr + 0x8) = size; *addr = &get_size(); printf("Title: "); readline(addr + 0xc, 0x1f, 0xa); printf("Note: ") readline(*(addr + 0x30), size, 0xa); *data_602300 = addr; } void edit_note(){ int addr = *data_602300; if(addr != 0){ addr = *(*data_602300..
[pwnable.xyz] nin write up
[pwnable.xyz] nin write up
2020.08.07이번 문제는 UAF 관련 문제이다. 해당 바이너리에는 아래와 같은 보안 장치가 설정되어 있다. 바이너리를 c코드로 변환하면 아래와 같다. void hash_gift(arg1, arg2){ int result1 = 0; int result2 = 0; int count = 0; while(true){ if(count >= int(arg2/2)) break; result1 = result1 + *(arg1 + count); count++; } for(int i = int(arg2)/2; i 0x2; eax = eax >> 0x1f; edx = edx - eax; eax = edx; eax = eax 사용자가 입력한 값 (크기: 사용자가 입력한 길이에 따라 다름) 0x603280 ==> invite_reznor..
[pwnable.xyz] note v2 write up
[pwnable.xyz] note v2 write up
2020.08.05해당 바이너리에는 아래와 같은 보안 기법이 적용되어 있다. 또한 아래 사진처럼 여러개의 사용자 정의 함수들의 존재하는 것을 볼 수 있다. 사용자 정의 함수들 중 아래 make_note() 함수를 보자. 기본적으로 0x28 만큼 공간을 할당하고, 사용자로 부터 크기를 입력받아 공간을 할당한다. 만약 *(addr + 0x20) 에 값이 들어가 있으면 공간을 할당 하지 않는다. void make_note(){ if(count
InCTF2020 - coins write up
InCTF2020 - coins write up
2020.08.02MISC 분야의 문제이다. nc로 접속하면 아래와 같이 문제가 출력이 된다. 문제만 봐도 한눈에 이해가 간다. python으로 4자리를 찾는 코드를 작성하면 아래와 같다. string 패키지로 문자열을 나열한 다음 for문 4개를 이용해 알맞은 4자리 값을 찾은 후 sendline() 함수로 값을 보낸다. from pwn import * import string import hashlib context.log_level = "debug" p = remote("34.74.30.191", "1337") line = p.recvline().replace("\n", "") line = line.split(" ") length = len(line[0][line[0].find("(")+1 : line[0].find..