Dreamhack

Command Injection

kchabin 2022. 8. 19. 01:43

시스템 함수 이용 = 이미 설치된 소프트웨어들을 쉽게 이용할 수 있다.

함수의 인자를 쉘의 명령어로 전달 - 치명적인 취약점

 

Command Injection 취약점 = 명령어를 실행해주는 함수를 잘못 사용해서 발생

명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생.

시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다.

 

파이썬 웹 애플리케이션에서 입력한 임의 IP에  ping을 전송하고 싶다면 

os.system("ping[user-input]") #임의 IP ping 전송
os.system("cat [user-input]") #임의 파일을 읽고자 할 때

이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다.

-> 리눅스 쉘 프로그램이 지원하는 다양한 메타 문자 때문에.

 

메타              문자설명                                                                    Example

`` 명령어 치환
``안에 들어있는 명령어를 실행한 결과로 치환됩니다.
$ echo `echo theori` 
theori
$() 명령어 치환
$()안에 들어있는 명령어를 실행한 결과로 치환됩니다. 이 문자는 위와 다르게 중복 사용이 가능합니다. (echo $(echo $(echo theori)))
$ echo $(echo theori) 
theori
&& 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행합니다. (Logical And)
$ echo hello && echo theori 
hello
theori
|| 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행합니다. (Logical Or)
$ cat / || echo theori
cat: /: Is a directory
theori
; 명령어 구분자
한 줄에 여러 명령어를 사용하고 싶을 때 사용합니다. ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행합니다.
$ echo hello ; echo theori
hello
theori
| 파이프
앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다.
echo id | /bin/sh
uid=1001(theori)

gid=1001(theori)

groups=1001(theori)
#!/usr/bin/env python3
import subprocess

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)


@APP.route('/')
def index():
    return render_template('index.html')


@APP.route('/ping', methods=['GET', 'POST'])
def ping():
    if request.method == 'POST':
        host = request.form.get('host')
        cmd = f'ping -c 3 "{host}"'
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('ping_result.html', data=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('ping_result.html', data='Timeout !')
        except subprocess.CalledProcessError:
            return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')

    return render_template('ping.html')


if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8000)

cmd = f 'ping -c 3 "{host}" '

입력값 필터링 처리를 개발자도구를 통해 지워준다. 

pattern 부분만 지워줘야 한다. 안 그러면 입력창이 사라진다.

8.8.8.8 ";ls"를 입력했더니 파일 명이 좌라락 나온다. 그냥 zip 파일에는 flag.py가 안보이더니 ping을 날리니까 보인다.

pattern 안 지워주면 이런다.

"| cat"flag.py 입력했더니 저렇게 나왔다.

"; cat "flag.py 입력했을 때 위처럼 나온다.

 

"| cat "flag.py 입력 시.

 

&&를 입력해도 플래그가 나온다. 

'Dreamhack' 카테고리의 다른 글

파일 취약점 함께 실습  (0) 2022.08.24
File Vulnarability  (0) 2022.08.24
암호학 - 해시  (0) 2022.08.12
No SQL Injection 실습  (0) 2022.08.11
SQL Injection(2)  (0) 2022.08.11