STAGE 7 : Command Injection

 

Command Injection

 

> ServerSide : Command Injection

Command Injection

- Injection (인젝션) : 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법

- Command Injection : 시스템 명령어에 대한 인젝션; 취약점이 발생하는 원인은 단순하지만, 매우 치명적인 공격으로 이어질 수 있음. 개발자는 이용자의 입력을 반드시 검사해야 하며, 되도록 system 함수의 사용을 자제해야 한다.

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

  • 파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 IP에 ping을 전송하고 싶으면 os.system("ping [user-input]")
  • 파이썬으로 개발된 웹 애플리케이션에서 입력한 임의 파일을 읽고 싶다면 os.system("cat [user-input]")

- 위와 같이, 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수 있는데 이는 리눅스 셸 프로그램이 지원하는 다양한 메타 문자 때문이다. 

- && ; | 등을 사용하면 여러개의 명령어를 연속으로 실행시킬 수 있는데 공격자는 이를 이용해 명령어를 실행하여 셸을 획득한다.

 

 

Command Injection 실습

@app.route('/ping')
def ping():
	ip = request.args.get('ip')
	return os.system(f'ping -c 3 {ip}')

- Command Injection이 발생하는 예제 코드

- URL 쿼리를 통해 전달되는 ip값을 ping 명령어의 인자로 전달

 

$ ping -c 3 1.1.1.1; id
$ ping -c 3 1.1.1.1 && id
$ ping -c 3 1.1.1.1 | id

- id 명령어를 실행하기 위해서는 메타문자를 사용해야 한다.

 

 

 

[혼자실습]
Command Injection
#!/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)

ping -c 3 "{host}" 에서 {host}는 내가 입력해준 값이 들어간다.

 

ping 페이지 Host 입력칸에 8.8.8.8을 입력해주었더니 아래와 같은 결과가 나왔다.

 

 

아래와 같이 입력값을 주려하는데 "요청한 형식과 일치시키세요."라는 문구가 계속해서 떴다.

 

코드를 살펴보았는데 pattern이 지정되어 있었다.

 

이를 우회하기 위해 burp suite를 사용하기로 했다.

이와 같이 입력하였더니 아래와 같이 ls명령어가 잘 수행되었다. 

flag.py가 있다는 것을 확인했으므로 이를 cat 명령어로 읽어주기로 하였다.

 

burp suite를 이용해 cat 명령어를 사용해주었고 아래와 같이 flag를 획득할 수 있었다.

 

'Web Hacking > Dreamhack' 카테고리의 다른 글

[Dreamhack] Web Hacking STAGE 9  (0) 2022.08.24
[Dreamhack] Web Hacking STAGE 8  (0) 2022.08.18
[Dreamhack] Web Hacking STAGE 6  (0) 2022.08.02
[Dreamhack] Web Hacking STAGE 5  (0) 2022.07.25
[Dreamhack] Web Hacking STAGE 4  (0) 2022.07.19

+ Recent posts