🔒Security
[분석 일기] docs 정독으로 Grav CMS에서 RCE 취약점 찾은 썰
[분석 일기] docs 정독으로 Grav CMS에서 RCE 취약점 찾은 썰
2024.01.121. Grav CMS Grav CMS는 php로 개발된 CMS 입니다. Grav is a Fast, Simple, and Flexible, file-based Web-platform. GitHub - getgrav/grav: Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony - GitHub - getgrav/grav: Modern, Crazy Fast, Ri..
ctf 문제를 통해 CSP bypass 정리하기
ctf 문제를 통해 CSP bypass 정리하기
2023.03.131. 업로드 기능을 활용한 bypass 서버에 다음과 같이 CSP가 적용되어 있다고 가정해 봅시다. `script-src` 지시자에는 `self` 와 랜덤한 `nonce` 값이 설정되어 있습니다. 즉, `` 와 같은 payload는 `nonce` 값이 없기 때문에 실행이 되지 않습니다.
SSRF bypass using DNS Rebinding
SSRF bypass using DNS Rebinding
2023.01.041. 들어가기에 앞서 일반적으로 SSRF 공격을 막기 위해 개발자들은 다음과 같은 로직을 구현합니다. 차단할 IP 범위 도메인 이름 확인 (이상한 문자열로 우회하는 공격..) DNS를 이용한 IP 확인 위 과정을 통과하게 되면 사용자가 입력한 URL로 접속하게 됩니다. 이러한 상황을 간단한 코드로 나타내면 다음과 같습니다. const dns = require("dns/promises"); const axios = require("axios"); async function request(url){ const check_domain_name = is_domain_name(url); const check_dns = await dns.resolve4(url); const check_ip = is_blacklis..
nodejs unicode
nodejs unicode
2022.10.061. Intro 기본적인 ASCII 범위를 벗어나 전세계 언어를 표현하기 위해 unicode를 많이 사용합니다. 이로 인해 ASCII로 표현이 불가능 했던 문자를 unicode로 표현이 가능해졌습니다. 이로 인해 예상치 못한 버그가 발생하곤 합니다. 이에 대해 설명하고자 합니다. 2. Compare unicode 사용자는 unicode를 통해 다양한 문자를 입력할 수 있습니다. 서버는 사용자가 입력한 값을 처리하는 과정을 거치겠죠. 예를들어, 사용자가 unicode K 를 입력했다고 가정합시다. 이 값과 ASCII 에서 소문자 k 와 비교하면 당연히 `false`가 출력 되겠죠. "K" == "k" false 하지만, unicode K를 toLowerCase() 함수를 이용하여 소문자로 바꾼 뒤, ASC..
[분석일기] - php switch case
[분석일기] - php switch case
2022.09.061. Intro 얼마전 cake CTF 2022 대회가 있었는데, 일 때문에 주말에는 쉬고 싶어서 참가는 안했네요,,, 암튼 이후 writeup을 봤는데 신기해서 기록하고자 합니다. 2. switch case if else 구문이 지저분한 사람들이 switch case 구문을 좋아하더라구요. 아래처럼 switch case 구문이 있다고 가정해 봅시다. POST방식으로 `user` 정보를 받고 이를 json으로 파싱하고 있습니다. 이후 if 문으로 입력 값을 검증하고 있습니다. 최종적으로는 `user->name` 변수의 값이 admin 이어야 하지만, if문에서 admin 문자열을 필터링 하고 있습니다. 어떻게 하면 이를 bypass 할 수 있을까요? 정답은 switch case 구문에 있습니다. 공식 d..
[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078)
[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078)
2022.07.21🚪 Intro 2022년 4월달에 nodejs 의 모듈인 EJS에서 RCE 취약점이 발견되었습니다. 맨 아래 Reference 에 있는 링크를 참고하여 어떻게 EJS에서 RCE가 가능한지를 분석해 봤습니다. 취약한 EJS 버전은 `3.1.6` 이하 버전입니다. 해당 취약점은 `3.1.7`에서 패치 되었습니다. 💡Analysis 환경 세팅을 위해 아래와 같은 명령어로 취약한 EJS 버전을 설치해 줍니다. npm install ejs@3.1.6 이후 간단한 코드를 작성하여 서버를 시작해 줍니다. // index.js const express = require("express"); const app = express(); app.set("view engine", "ejs") app.get("/", (req, ..
Node.js querystring 함수 분석과 bug 설명
Node.js querystring 함수 분석과 bug 설명
2022.07.09🚪 Intro 작년 Line 2021 CTF 웹 문제를 풀다가 기록하고 싶어 작성하려고 합니다. 바로 Node.js 에서 built-in 모듈인 `querystring` 입니다. 현재는 deprecated 된 모듈입니다. 💡 About querystring module Node.js 공식 문서에 설명된 `querystring`에 대한 설명은 다음과 같습니다. 기본으로 URL의 query string을 파싱하는데 사용됩니다. 사용방법은 공식문서에 다음과 같이 설명하고 있습니다. `parse()` 함수의 첫번째 인자에 URL의 query string 값을 넘겨줘야 하며, 나머지 인자들은 기본 값으로 설정 됩니다. 예를들어, 아래 사진처럼 `parse()` 함수의 첫번째 인자에 foo=1&abc=2 라는 값을..
분석 일기 - file upload 취약점
분석 일기 - file upload 취약점
2022.05.12🚪 Intro 취약점 및 CVE 획득을 위해 분석하고 있는 프로젝트가 있습니다. file upload를 통한 webshell 획득 과정을 정리하고자 합니다. 💡 Analysis 분석하려는 웹 사이트에는 업로드 기능이 존재 합니다. 다만 ico, webp, svg 확장자만 업로드 할 수 있습니다. 그런데 아래 코드를 보면서 의문점이 생기더라구요. 보통 파일 업로드 관련 기능을 만들 때, 확장자 검증은 .(dot) 을 기준으로 문자열을 나누어 맨 마지막 값을 확장자로 판단 합니다. 이렇게 추출된 확장자로 업로드 할 파일을 필터링 하게 되죠. 하지만, 위 코드는 `strpos()` 함수를 사용하여 업로드 파일의 확장자를 검사하고 있습니다. 이 함수는 문자열의 위치를 int 로 리턴합니다. 예를 들면, 아래와 ..
분석 일기 - php dynamic variable
분석 일기 - php dynamic variable
2022.04.03🚪 Intro 취약점을 찾기 위해 분석하고 있는 오픈소스 웹 서비스가 있습니다. 며칠 동안 삽질을 통해 발견한 취약점(?)을 기록 및 정리하고자 합니다. 💡 Analysis 해당 취약점은 웹 관리자만 접근 가능하며, php dynamic variable 을 통해 다른 변수의 값을 overwrite 하여 Stored XSS를 동작 시킬 수 있습니다. 관리자 페이지에는 아래 사진처럼 어떤 범위를 지정해 줄 수 있습니다. 하지만, 해당 소스 코드를 분석해 본 결과, 숫자 여부를 확인하지 않고 있었습니다. 위 사진에서 100 이라는 값은 아래 사진 56번째 줄인 `$mb_id1_to` 변수에 저장되어 있습니다. 각각의 값을 `$ma_last_option` 변수에 이어 붙이는 것을 볼 수 있습니다. 최종적으로 `..
Foobar CTF 2022 writeup
Foobar CTF 2022 writeup
2022.03.06# Warmup (pwn) 해당 문제는 FSB 를 통해 canary 값과 PIE 값을 leak 한 뒤, ROP로 shell을 획득하는 문제이다. from pwn import * context.log_level = "debug" p = remote("chall.nitdgplug.org","30091") e = ELF("./chall2") l = ELF("./libc.so.6") payload = "AAAAAAAA%20$p%23$p" p.sendlineafter("Can you help find the Canary ?", payload) p.recvline() data = p.recvline().strip()[8:] PIE = int(data[:14], 16) canary = int(data[14:], 16..
nodejs express routing case sensitive options
nodejs express routing case sensitive options
2022.03.06최근 CTF에서 nodejs express 문제가 나왔다. express에서 routing 기능이 있는데, 선택 옵션을 추가할 수 있다는 걸 처음 알았다. express Docs 내용 중, 아래 사진을 보면, Router에 대한 설명을 적어놓았다. 표에서 속성에 `caseSensitive` 라는 옵션이 있고, 만약 추가하지 않는다면 기본값으로 `대소문자를 구문하지 않고, /Foo와 /foo는 같은 경로로 해석한다.` 라고 되어 있다. 그래서 테스트를 위해 다음과 같이 코드를 작성했다. /* app.js */ const express = require("express"); const app = express(); const port = 39012; const test_router = require("./r..
java URL class를 이용한 내부 파일 읽기
java URL class를 이용한 내부 파일 읽기
2022.03.02올해 codegate 2022 웹 문제 중에서 java에 `URL class`를 이용한 SSRF 문제가 나왔다. 아래 코드는 `URL class`를 이용하여 외부 사이트에 요청 및 응답 값을 출력하는 코드 이다. import java.net.URL; import java.net.MalformedURLException; import java.io.InputStreamReader; import java.io.BufferedReader; public class test{ public static void main(String[] args){ String url = "https://lactea.kr"; String result = ""; try { BufferedReader in = new BufferedRea..
format string 을 이용한 php sprintf 버그
format string 을 이용한 php sprintf 버그
2022.02.04오랜만에 CTF에 참가하여 WEB 문제 중, php의 `sprintf()` 함수를 이용한 문제가 있었다. 아래 코드를 보면, SQL `addslashes()` 함수 때문에 SQLI 가 불가능한 것처럼 보이지만, `sprintf()` 함수에서 format string을 이용하면 이를 bypass 할 수 있다. 이를 설명하기 위해 글을 계속 읽어보자. # The John has 500 dollar. 위 코드의 서식 문자를 아래 코드처럼 인자의 순서를 지정할 수 있다. (이는 C언어에서 Format String Bug를 이용한 explit 할 때도 사용된다.) # The John has 500 dollar. 위 예제에서는 코드에 전혀 문제가 없다. 하지만 `sprintf()` 함수를 다음과 같은 사례로 2번 ..
Log4j 취약점(CVE-2021-44228) Log4Shell 발생 원인 및 실습
Log4j 취약점(CVE-2021-44228) Log4Shell 발생 원인 및 실습
2021.12.241. 기초 지식 1.1 Directory Service(DS) 여기서 말하는 Directory는 데이터, 프린터, 컴퓨터, 사용자 정보 등 데이터가 저장된 용기라고 보면 된다. Directory Service는 네트워크 서비스의 일종으로 네트워크 자원(사용자 계정, 프린트 정보, 컴퓨터 정보 등)에 접근하여 관리를 용이하게 하도록 하는 서비스를 말한다. 1.2 Active Directory AD(Active Directory)는 Microsoft에서 개발한 디렉토리 서비스 이다. AD는 다양한 표준화된 프로토콜을 사용하여 다양한 네트워크 관련 서비스를 제공한다. 회사 직원들의 계정 정보(ID, Password)와 컴퓨터에 대한 정보, 그리고 회사에서 강제하고자 하는 정책들(패스워드를 최소 8자리에 30일..
[CVE-2021-39350] wordpress FV flowplayer 분석
[CVE-2021-39350] wordpress FV flowplayer 분석
2021.10.10FV Flowplayer 비디오 플레이어 WordPress's most reliable, easy to use and feature-rich video player. Supports responsive design, HTML5, playlists, ads, stats, Vimeo and YouTube … ko.wordpress.org CVE-2021-39350는 wordpress의 플러그인 중 FV flowplayer에서 발생한 `Reflected XSS` 취약점이다. 취약한 버전은 `7.5.0.727` ~ `7.5.2.727` 이고, 패치 버전은 `7.5.3.727` 이다. FV flowplayer 의 패치 버전 commit 을 보면 다음과 같다. [https://github.com/foliovisio..
frida를 이용한 후킹 예제
frida를 이용한 후킹 예제
2021.07.30`Frida Install` Frida를 설치하기 위해 아래 명령어를 입력해 준다. pip3 install frida pip3 install frida-tools `Frida, Hello world` Frida 설치가 끝나면, Frida를 이용해서 Hello world를 출력해보자. Hello world를 출력하는 방법은 여러가지 방법이 있다. `첫번째` 방법은, 작업 폴더에 notepad.js 파일을 생성한 뒤, 아래 코드를 작성해준다. frida를 실행하기 위해서 타겟 프로그램을 실행해야 한다. 필자는 notepad를 실행한 뒤, 아래 명령어를 입력하면 `[사진 1]` 처럼 출력되는 것을 볼 수 있다. // notepad.js console.log("Hello world"); frida -l .\no..
한글 2020 문서 암호화 과정 분석
한글 2020 문서 암호화 과정 분석
2021.07.23이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[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 ] ..
[bof] - RTL Chaining 공격 기법
[bof] - RTL Chaining 공격 기법
2019.09.29Return to Libc Chaining 0x01 What is it? RTL 공격에서 RET 주소를 변조하여 하나의 공유 라이브러리 함수를 호출 했다면, RTL Chaining 공격 기법은 RTL 공격 기법을 응용하여 여러개의 공유 라이브러리 함수를 호출 할 수 있다. 0x02 Prior knowledge 이 공격 기법을 처음 보고 이해하기는 힘들 수도 있다. (필자가 그랬다…ㅇㅇ) 이 글을 이해하기 위해서는 호출된 함수가 인자를 가져오는 방법과 Return to libc 공격 기법을 이미 숙지 했다라는 기준으로 설명을 하겠다. (모른다면 링크 클릭) Return to Libc 아래와 같은 코드가 있다고 가정하자. read 함수에서 buf 변수 크기 이상으로 값을 받고 있다. 여기서 bof가 발생하는..