DreamHack - command-injection-1

2024. 5. 31. 16:30·DreamHack

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제화면

 

 

 

문제화면에 보면 Ping을 보낼 수 있게 Host 란 IP를 입력하는 칸이 있다.

 

8.8.8.8 그대로 넣어 한번 실험해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실행

 

Ping 명령어로 잘 먹히는 거 같다.

 

시퀀스 번호를 보여주는 형식을 보아하니 Linux 운영 체제인걸 알 수 있다.

 

윈도 cmd에서는 byte 크기를 보여준다.

 

코드를 한번 확인해 보자.

 

 

 

 

Code_read

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)
import subprocess

 

 

중요한 부분을 보면...

 

 

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

 

 

이 부분이 submit 했을 때 실행되는 거 같다.

 

문제 이름이 injection 이니까 injection 해보자.

 

개인적인 문제 해결 방식으로 생각하는 것은 ping 명령어와 함께 내가 injection 할 명령어를 같이 넣어주는 방법으로 할 생각이다.

 

값을 받는 "{host}" 안에 넣을 명령어를 생각하면 된다.

 

그러면 먼저 ping 보내기 위해 8.8.8.8" 넣어준다면 cmd 변수는 값을 'ping -c 3 "8.8.8.8""' 이런 상태로 받아들이게 된다.

리눅스 명령어를 넣고 뒷부분은 주석처리 한다면 먹힐 거 같다.

 

코드를 읽어서 문제풀이에 대한 방법을 얻을 수가 있다.

 

 

 

 

 

 

 

 

 

 

문제풀이 방법

injection을 하려면 싱글쿼터(') , 더블쿼터(")를 써야 하는데...

 

 

넣어보니까 요청한 형식과 일치시키라고 한다.

 

input tag를 자세히 보면

 

 

<input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required="">

 

 

pattern 속성 값을 보면 '[A-Za-z0-9.]{5,20}로 사용자가 입력할 수 있는 값의 형식을 제한하는 기능이 있다. 

(이 값만 쓰세요 ~)

 

정규표현식을 이용해서 대문자 알파벳, 소문자 알파벳 0~9까지의 숫자 마침표 '.' 쓸 수 있게 만들었다.

 

그러면 우회하려면 그냥 개발자 도구에서 elements에서 pattern 속성을 지워주도록 하자 

 

그러면 아무 값이나 넣어도 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

해결

 

 

 

 

Ping 명령어와 따로 넣은 명령어가 같이 들어가서 플래그 값을 얻을 수가 있다.

 

 

'DreamHack' 카테고리의 다른 글

DreamHack - simple-phparse  (0) 2024.07.28
DreamHack - simple-ssti  (0) 2024.05.17
DreamHack - image-storage  (0) 2024.05.17
DreamHack - baby-sqlite  (0) 2024.04.30
Dreamhack - Csrf2 (수정)  (0) 2024.04.05
'DreamHack' 카테고리의 다른 글
  • DreamHack - simple-phparse
  • DreamHack - simple-ssti
  • DreamHack - image-storage
  • DreamHack - baby-sqlite
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • 모의해킹 (8)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
        • CTF (22)
      • Android_security (5)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    Dreamhack
    난독화
    php
    안드로이드
    워게임
    CTF
    drozer
    정보보안기사
    Android
    리눅스 워게임
    cookies
    php wrapper
    webhacking.kr
    webhacking
    wargame
    overthewire
    insecurebankv2
    Linux
    Cookie
    url encode
    리눅스
    bandit18
    bandit
    bandit17
    Linux wargame
    union
    sql injection
    bandit20
    lfi
    bandit30
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
DreamHack - command-injection-1
상단으로

티스토리툴바