Security
[pwnable] - glibc 2.24 이상 버전에서 _IO_FILE vtable check bypss
[pwnable] - glibc 2.24 이상 버전에서 _IO_FILE vtable check bypss
2020.10.07`glib 2.24` 이상 버전 부터 `_IO_validate_vtable()` 로 `vtable`을 검사한다. 이 때문에 `vtable` 값을 공격자가 원하는 함수의 주소로 overwrite 할 수가 없다. 하지만 `glibc 2.27` 버전까지 이를 bypass 할 수 있는 방법이 있는데, `_IO_str_overflow()` 함수와 `_IO_str_finish()` 함수를 이용한 bypass 공격 방법이 있다. 아래 설명하는 내용은 `glibc 2.29` 버전에 패치 되었다. _IO_validate_vtable() 이 함수는 `glibc 2.24` 이상 버전에서 생긴 함수로, `vtable` 값를 검사한다. 검사 방법은, `_libc_IO_vtables` 의 섹션 크기를 계산한 후 파일 함수가 호출..
[pwnable] - _IO_FILE structure and vtable overwrite
[pwnable] - _IO_FILE structure and vtable overwrite
2020.10.02_IO_FILE 리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체입니다. 이 구조체는 `fopen()`, `fwrite()`, `fclose()` 등 파일 스트림을 사용하는 함수가 호출되었을때 할당 됩니다. `_IO_FILE`의 구조체는 다음과 같습니다. struct _IO_FILE { int _flags;/* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr;/* Current read pointer */ char *_IO_read_end;/* End of get area. */ char..
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..
python으로 사이트에 있는 url crawler tool 개발
python으로 사이트에 있는 url crawler tool 개발
2020.03.30소스코드는 github에서 볼수 있습니다. Lactea98/URL-crawler URL crawler. Contribute to Lactea98/URL-crawler development by creating an account on GitHub. github.com 사용자가 입력한 URL에 요청을 보내어 URL 만 파싱하여 결과를 html로 출력합니다. 개발 목적은 취약한 URL 이 있는지 분석을 위해 개발 되었습니다. # Used module 사용된 모듈은 아래와 같습니다. requests bs4 argparse fake_useragent json urlparse # How to use 실행 방법은 아래와 같이 명령어를 입력하면 Crawler 를 시작합니다. python3 urlcrawler.py -..
python 으로 http request smuggling tool 만들기
python 으로 http request smuggling tool 만들기
2020.03.30소스 코드는 github 에서 볼 수 있으니 참고 바란다. 모든 기능은 완성되지 않았지만, 사용하는데 문제는 없을 것이다. Lactea98/smuggler.py HTTP request smuggling tools. Contribute to Lactea98/smuggler.py development by creating an account on GitHub. github.com http request smuggling 도구를 만들기 위해 어떻게 하면 취약함을 알 수 있는가를 portswigger 에서 공부했다. 또한 이미 짱짱해커들이 만들어 놓은 payload 를 참고해서 나만의 툴을 개발하게 되었다. Module 이 툴을 사용하기 위해 아래의 모듈이 필요하다. import requests import a..
Paypal에서 발견된 HTTP Request Smuggling - 실습 환경 구축
Paypal에서 발견된 HTTP Request Smuggling - 실습 환경 구축
2020.03.22요즘 http request smuggling 공격에 대해 몇일간 공부 중이다. 몇달 전에 이 공격을 처음 접하게 되면서 이 공격에 대해 매우 흥미를 느꼈다. http request smuggling 공격에 대해 portswigger 라는 홈페이지에서 자료를 통해 공부를 했고 실습 환경을 만들어 공부 해보면 어떻까 라는 생각을 해서 이렇게 글로 정리를 해본다. 이 실습 환경 만든다고 개고생 했다.. 삽질한 것을 바탕으로 아래 글에 나와 있는데로 진행할 경우 성공할 것이라고 생각한다. 필자가 참고한 사이트는 아래 Reference에 있으니 참고 하길 바란다. # 1. Setting Practice Environment HTTP request smuggling 공격 환경을 만들기 위해서는 사용자와 메인 서버..
[pwn] - pwntools 로 PIE base 구하기
[pwn] - pwntools 로 PIE base 구하기
2020.02.23바이너리에 PIE가 걸려 있다면, 디버깅 할때 주소가 랜덤으로 바뀌어 breakpoint를 걸 수 가 없다. 하지만 PIE base를 구할 수 있다면, 주소가 랜덤으로 바뀌어도 breakpoint를 걸 수 있다. 바로 아래 코드가 중요하다. pie_base = p.libs()["바이너리 절대 경로"] 간단한 예를 보면 다음과 같다. from pwn import * context.terminal = ['tmux', 'splitw', '-h'] context.log_level = 'debug' p = process("./challenge") e = ELF("./challenge",checksec=False) pie_base = p.libs()["/home/ubuntu/environment/ctf/pwnabl..
[pwn] - environ 변수로 stack leak 하기
[pwn] - environ 변수로 stack leak 하기
2020.02.23environ 변수를 이용해 stack leak 를 하는 방법이다. 이 공격을 하기 위해 다음과 같은 가정이 필요하다. libc base 주소를 알고 있다. 임의의 주소를 leak 할 수 있다. gdb-peda$ p 0x00007ffff79e4000 + 0x861a5c8 $2 = 0x7fffffffe5c8 gdb-peda$ p environ $3 = (char **) 0x7fffffffe5c8 gdb-peda$ x/gx $rsp 0x7fffffffe4d8: 0x00007ffff7a05b97 gdb-peda$ p 0x7fffffffe5c8 - 0x7fffffffe4d8 $4 = 0xf0 gdb-peda$ libc base address: 0x00007ffff79e4000 environ offset: 0x8..
64bits 인자 값 전달 방식 순서
64bits 인자 값 전달 방식 순서
2020.01.28[Linux - ELF] Parameter 1 - rdi Parameter 2 - rsi Parameter 3 - rdx Parameter 4 - rcx Parameter 5 - r8 Parameter 6 - r9 Parameter 7 - (%rsp) Parameter 8 - 0x8(%rsp) system call - %rax
[Find user defined functions] elf에 사용자 정의 함수 찾기
[Find user defined functions] elf에 사용자 정의 함수 찾기
2019.12.27CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데, 어떤 사용자 정의 함수들이 있는지 알기 위해서 objdump 명령어를 사용하는 경우가 있다. objdump 명령어를 이용하면 간략하게 볼 수 없기 때문에 이를 간략하게 보기위해 c로 만들어 보았다. #include #include char *str_replace(char *orig, char *rep, char *with) { char *result; // the return string char *ins; // the next insert point char *tmp; // varies int len_rep; // length of rep (the string to remove) int len_with; // length of with (..
[PHP] How To Prevent SQL injection attack via secure code
[PHP] How To Prevent SQL injection attack via secure code
2019.12.08php언어를 통해 SQL injection 공격을 막기 위해 안전한 코드를 짜야한다. 우선 mysqli 함수를 통해 DB에 접근하기 위한 코드는 아래와 같다. 위 코드를 db.php 파일이라고 정의하고, 이 파일을 include 하여 사용한다. mysqli의 PDO는 prepare라는 함수를 가지고 있다. 이것을 이용하여 안전하게 DB에 접근하여 값을 가져오거나 등등의 작업을 할 수 있다. INSERT 아래 예제는 user라는 테이블에 id와 pw를 Insert 하는 과정을 나타낸 것이다. 우선 $mysqli 변수를 쓰기 위해 db.php 파일을 include 하고 prepare 함수를 사용한다. 만약 prepare 함수에서 query에 에러 발생 시 $mysqli->error를 통해 에러를 출력한다. ..
[PHP] password_hash와 password_verify로 패스워드 안전하게 관리하기
[PHP] password_hash와 password_verify로 패스워드 안전하게 관리하기
2019.12.08DB에 패스워드를 안전하게 저장하기 위해서는 단방향 해시 함수를 사용하게 된다. 이유는 DB가 외부로 유출 되었을 때, 패스워드의 평문을 알아내기 어렵게 하기 위해서 이다. php에서 사용자의 패스워드를 해시 해주는 password_hash() 함수와, 사용자가 입력한 패스워드랑 해시된 패스워드를 비교해주는 password_verify() 함수가 있다. password_hash() password_hash()는 2개의 인자가 필요하다. 첫번재 인자는 해시할 패스워드, 두번째는 암호 알고리즘이다. Return 값은 해시 과정에서 에러 발생 시 false, 성공하면 문자열의 해시 값을 준다. password_hash ( string $password , int $algo [, array $options ] ..