김승현

[Dreamhack : Web] command-injection-1 본문

Web/Dreamhack : Web

[Dreamhack : Web] command-injection-1

kshind 2023. 2. 22. 22:15

문제

특정 host에 ping 패킷을 보내는 서비슨데 거기에 command injection을 이용해서 플래그를 얻으라는 것 같다.

 

 

풀이

메뉴에는 Home, Ping이 있고 Welcom this sis ping playground!가 출력되어 있다. Ping을 들어가보자.

우리 호스트에 핑을 보내보자는 것 같다. 일단 저기 적혀있는 8.8.8.8을 넣어보자.

핑을 보냈다는 말인 것 같다. 이번엔 8.8.8.8과 command injection을 같이 해보자.

정해진 양식이 있는 것 같다. 이젠 소스코드로 가보자!

 

코드 초반부

subprocess를 import 하는데 쉘 명령 등 다른 프로세스를 실행하고 출력 결과를 가져올 수 있게 해주는 라이브러리이다.

그리고 FLASK를 가져오고 APP = FLASK(__name__)를 통해 플라스크 객체를 생성한다.

flag 라이브러리는 처음 봐요.....

 

@app.route("/") == host3.dreamhack.games/

flask의 render_template 함수로 index.html을 우리 화면에 보여준다.

 

@APP.route('/ping', methods=['GET', 'POST'])

전체 ping 코드

만약 메소드가 POST였다면 

host변수에 사이트에서 전달받은 host를 저장

cmd변수에 ping -c 3 [host변수] 를 저장함

output변수에 서브 프로세스를 실행하고 그 결과를 가져와서 출력할 내용을 저장한다는 거다.

출력할 내용은 /bin/bash에서 -c 옵션을 사용하고 cmd 변수에 저장된 명령어를 사용하는 내용이다.

그러니까 그냥 사이트의 ping 명령어가 정상작동 되면 ping 명령어가 나온 작동되고 나온 출력값들을 화면에 보여주고

TimeoutExpired 에러가 발생하면 Timeout!을 출력하고

CalledProcessError가 발생하면 an erro roccurred while execuing the command, -> [cmd변수]가 출력되는 내용이다.

 

코드 젤 아래에 있는 부분

이건 그냥 코드가 실행될 때 host가 0.0.0.0:8000으로 실행된다는 내용이다.

 

우리가 exploit을 하기 위해 집중해서 봐야 될 부분은 /ping을 라우트한 코드 중 cmd 변수이다.

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

cmd 변수를 위의 코드와 같이 저장하는데 {host}는 우리가 ping엔드포인트에 8.8.8.8을 적었던 그 칸에 입력한 내용이다.

여기에 command injection을 활용하면 될 것 같다! host에 "8.8.8.8; cat flag.py" 이렇게 입력하면 될 것 같다.

cmd = f'ping -c 3 ""8.8.8.8; cat flag.py""'

이런 식으로 저장되기 때문에 command injection이 될 것 같다.

근데 그렇게 입력을 해보니까 요청한 형식을 일치하라고 한다...

입력한 값에는 문제가 없는 것 같아서 개발자도구 - Elements로 사이트의 코드를 확인 해봤다.

그랬더니 입력하는 칸의 코드에서 영어와 숫자만 입력할 수 있게 적혀있는 걸 확인하고 지우고 다시 입력해봤다.

 

 

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

[Dreamhack : Web] file-download-1  (0) 2023.02.23
[Dreamhack : Web] image-storage  (0) 2023.02.23
[Dreamhack : Web] mango  (0) 2023.02.22
[Dreamhack : Web ] simple_sqli  (0) 2023.02.22
[Dreamhack : Web] csrf-2  (0) 2023.02.22