writeup

ASIS 2019 Final – Trust Zone

서버에 접속하면, 먼저 링크가 하나 주어집니다. 접속하면 문서 내용이 표시되는데, 특별한 내용은 없습니다.인자의 URL 부분을 퍼징해 보면 앞의 http://66.172.33.59/ 와 끝의 .doc 에 static 한 비교를 수행하고 있다는 것을 알 수 있습니다.어느 한 부분이라도 만족하지 못하면, Security Error 를 반환합니다. http://66.172.33.59/.doc 을 URL 에 넣어 확인해 보면이 처럼 디렉토리 리스팅이 되는 것을 확인할 수 있습니다. 정리해보면, 내부 웹 서버 구조는 위와 같습니다. 이 중에 /doc_app/doc.php 파일이 수상해 보입니다.인자로 파일 이름을

Seccon 2019 – SPA

Vue로 구성된 XSS 문제입니다.소스는 긴 편이지만, 취약한 부분이 보이지 않았기에문제에서 사용하는 jQuery 함수에 대해 검색해 보았고, 정답을 찾을 수 있었습니다. jQuery의 getJSON 함수는 인자로 전달되는 url에서 callback 파라미터가 ? 으로 지정되어 있을 때, ?을 jQuery34107409498085120296_1571575807022 와 같은 랜덤 문자열으로 치환하여 전송합니다.이는 jsonp 에 대응하기 위해서 존재하는 부분인데, 이러한 상황에서 jQuery 는 가져온 문자열을 스크립트로 해석하여 실행합니다.hash 를 통해, 서버에 전달되는 url을 조작하는 것이 가능하므로, 서버에 임의의 스크립트를 업로드 한 후

Seccon 2019 – fileserver

플래그를 랜덤 이름의 디렉토리에 보관하고 있습니다.본 문제를 해결하기 위해서는, 먼저 %00을 이용하여 /tmp/flags/ 디렉토리를 리스팅해 폴더명을 확인하고, 정규식을 사용해 파일을 읽으면 됩니다. Index /tmp/flags Ruby의 Dir.glob 함수에서는, 인자로 전달된 문자열에 널 바이트가 포함되어 있으면, 널바이트를 포함하여 이전 문자를 모두 무시합니다.따라서 위와 같은 url을 호출하면 앞의 . 이 무시되므로, /tmp/flags 폴더를 리스팅 할 수 있게 됩니다. Read Flag Ruby의 Dir.glob 함수에서 [ 문자열은 문자열셋 매칭에 사용되는 메타 문자이지만, 중괄호 안에서 단독으로

Hitcon 2019 – bounty-pl33z

hitcon 2019 에서 출제된 xss 문제로 알려진 풀이는 두가지입니다. Intended Solution 오렌지가 공개한 의도된 풀이로 –> 문자를 사용해 해결하는 방법입니다.다만 –> 를 문자열 직후에 넣는다면, — 가 postfix 연산자로 해석되어 Invalid left-hand side expression in postfix operation 오류를 발생시키므로 crlf 등을 통해 개행 처리를 해 주어야 합니다.일반적인 화이트 스페이스는 필터링 되어 있지만, \u2028, \u2029 등을 통해 대체할 수 있습니다. 이외에 자바스크립트 상에서 공백으로 해석될 수 있는 문자들은 다음과 같습니다. 9

PwnThyBytes CTF – Baby sql is not baby anymore

PHP의 session.upload_progress 에 관한 문제입니다.기본 상태에서 활성화 되어있는 session.upload_progress 옵션은, session_start 함수의 실행 없이 $_SESSION 변수가 설정될 수 있도록 합니다. 문제의 index.php 에서는 내부 변수들에 대해 필터링 과정을 거친 후, templates 폴더 내부의 스크립트를 참조하는 방식으로 구성됩니다. /templates/login.php 페이지 등은 최상단에서 isset($_SESSION) 구문으로 하여금, 페이지의 직접 참조를 방지하고 있습니다.index.php 페이지를 통해 참조될 때에는 session_start 로 인해 $_SESSION 가 설정된다는 점을 이용한 것입니다. multipart/form-data 형식으로 session.upload_progress.name 와 동일한 이름의 파라미터를 추가해

BSides Delhi CTF – Eval Me

LD_PRELOAD + Imagick ffmpeg 을 통한 disable_functions bypass 문제입니다.자유롭게 PHP 코드 실행이 가능한 상태입니다. 대부분 필수 함수들이 필터링 되어 있지만putenv 사용이 가능하므로 LD_PRELOAD 에 모듈 탑재가 가능하고copy 함수를 사용해 컴파일된 모듈 파일을 복사할 수 있습니다. 위 코드를 통해 서버로 모듈을 업로드 하고 명령을 실행할 수 있습니다. file 함수를 사용해 결과를 확인할 수 있었습니다. 익스플로잇에 사용한 모듈의 소스코드는 다음과 같습니다.

Lord of SQL Injection(LOS) Complete Solution

The Lord of the SQLI : The Fellowship of the SQLI, 2019 https://los.rubiya.kr/ 정도원(rubiya) 님이 운영하시는 LOS 워게임의 문제 풀이입니다. 1. gremlin 최소한의 필터링만 적용된 기본형의 문제입니다.싱글쿼트를 넣어주는 것으로 간단하게 우회할 수 있습니다. 2. cobolt 이전 문항과 거의 다르지 않습니다.싱글쿼트을 삽입하고 뒷부분을 한 줄 주석으로 처리해 주면 우회가 가능합니다. 3. goblin 쿼트가 필터링 되어있어 통상적인 방법으로는 문자열을 삽입할 수 없지만mysql 에서는 문자열을 16진수 형태의 hex 코드로 대체할 수 있습니다. 4.

angstromCTF – Madlibbin

python format string injection 문제이다. 강조된 문장에서 볼 수 있듯 args 변수에 request.args 를 대입하여 format 메소드의 인자로 이용하는데 request.args 부분은 조작이 불가능하지만, 대상 문자열은 마음대로 사용자의 입력대로 들어가므로 이를 이용해서, os.environ 을 읽어내면 해결되는 문제이다! 다만 format 함수의 대상이 되는 문자열의 중괄호 안에서 메소드 호출은 불가능하므로 메소드를 사용하지 않고 문제를 해결할 수 있어야 한다. os 모듈의 environ 속성에 환경변수가 저장되어있으니 이를 참조해 주자.

angstromCTF – DOM Validator

XSS 필터링 문제인데, <head> 태그에서 자바스크립트로 문서 내용을 해싱하여 비교 검증하는 특이한 방식을 사용했다. 시도하다 보니 필터링 로직이 복잡하여 짜여 있다는 것을 알게 되었는데, 본래 복잡해질수록 허점도 생기는 법 아니겠는가.. 여러가지 페이로드를 확인해보니 결국 먹히는 것이 나왔다. (3시간 정도 걸렸다)

angstromCTF – no sequel 2

이전 문제와 동일하다. 하지만 인증 우회에 그쳤던 것과 다르게, 이젠 실제 비밀번호를 요구한다. 정규식 쿼리를 이용하면 간단한데 길이를 먼저 확인하고 브루트 포싱을 해보면 금방 답이 나온다.