Security
분석 일기 - 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..
[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 -..