본문 바로가기

웹해킹

드림핵 command-injection-1 롸업

<문제>

특정 Host에 ping 패킷을 보내는 서비스입니다.
Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다.

 

@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')

ping 링크에서 cmd를 실행시키는데 여기서 flag.py 파일을 읽어오도록 command injection을 해야 할 것 같다.

 

ping 페이지에서 여러 가지를 입력해보았는데 필터링이 걸려있는 것 같다.

1.1.1.1 이런 식으로 주소 형식으로 쓰지 않으면 필터링 되었고

1.1.1.1; cat flag.py 

1.1.1.1 || cat flag.py 이런식으로 여러 시도를 했지만 전부 안되었다.

필터링에 안 걸리면서 cat을 실행할 수 있는 인젝션 방법이 없나 한참 고민을 했는데 어떤 식으로 필터링이 동작하는지 알 수가 없으니 어떻게 풀라는건가 싶었다. 그런데 필터링 매커니즘이 분명 동작 코드에서는 보이지 않기 때문에 그냥 html 프론트엔드에서 자체적으로 필터링 하는 것 같다는 생각이 들었다.

그래서 f12를 누르고 입력창 부분의 코드를 보니

이런 식으로 [A-Za-z0-9.]{5,20}같이 뭔가 문자열 필터링 같이 생긴 pattern 속성이 보였다.

그래서 이걸 지우고 1.1.1.1; cat flag.py 를 했더니

안된다....

결과를 보니 ping -c 3 "1.1.1.1; cat flag.py" 이런식으로 ""로 입력값이 묶여있어서 안됐던 것이다.

1.1.1.1" ; cat flag.py" 이렇게 했더니

flag가 잘 나온다!

'웹해킹' 카테고리의 다른 글

드림핵 image-storage 롸업  (0) 2023.11.05
ServerSide: File Vulnerability  (0) 2023.11.04
ServerSide: Command Injection  (0) 2023.11.04
드림핵 Mango 롸업  (0) 2023.11.04
드림핵 simple_sqli 롸업  (0) 2023.11.04