본문 바로가기

Dreamhack

[Dreamhack_web 문제 풀이_command-injection-1]

command-injection-1 문제를 풀기 위해서는, 이전과 같이 서버 생성하기 버튼을 클릭하고 문제 파일을 다운로드합니다.

생성된 서버에 들어가면 해당과 같은 화면이 나타납니다. 

상단에 있는 ping 버튼을 클릭해 보았더니, 해당 화면이 나타난다는 것을 확인할 수 있었습니다.

그래서 해당 칸에 8.8.8.8을 입력해 보았더니, 

해당과 같은 화면이 핑 결과로 나타났습니다. 

이러한 결과를 통해  host에 입력한 ip로 ping 명령어를 실행한다는 것을 알 수 있었습니다. 

위의 화면은 8.8.8.8로 ping 명령이 실행된 과정을 그대로 출력한 것입니다.  

 

이러한 사실을 이용해서 우리가 얻고자 하는 flag를 얻을 수 있는 ping 명령을 입력하기 위해서는, 

다운로드한 코드를 살펴보도록 하겠습니다. 

 

 

코드 부분 중에서 ping() 함수 부분에 주목하여 살펴보았습니다. 16번째 줄의 ping 함수 부분을 살펴보니, 'host'라는 값을 받아와서 변수 host에 저장하고 그 값으로 ping을 쏜다는 사실을 알 수 있었습니다. 그리하여  이러한 사실을 바탕으로도 /ping 화면에서 봤던 입력창이 host 일 것이라고 판단할 수 있었고, 확인해 보았습니다. 

 

 

F12 키를 눌러 개발자 도구 화면을 통하여 코드를 살펴본 결과, <input> 태그 안에 name이 "host"인 것을 확인할 수 있었습니다. 그렇기에 shell 명령어를 이용하여, injection을 시도해 flag를 찾고자 하였습니다.

 

 

우리가 코드에서 살펴본 ping 함수의 값, cmd = f'ping -c 3 "";ls"' 의 명령어를 입력하여 ;라는 메타문자와 ls라는 쉘 명령어로 파일들을 들여다보는 injection을 시도했지만 실패하였습니다. 

실패하였다고 뜨며 , 요청한 형식과 일치시키라는 화면이 제시되었음을 알 수 있었습니다.

그렇기에 요청하는 형식이 무엇인지 찾기 위하여 다시 개발자 도구 화면에 들어가 보았습니다. 

 

우리가 아까 보았던 /ping 페이지의 개발자도구 patter = 코드에서 그 답을 찾을 수 있었습니다. 

pattern="[A-Za-z0-9.]{5,20}"의 의미를 해석해 보면, 곧 알파벳 대소문자와 점(.)을 이용한 5~20글자만 받는다는 뜻이기 때문입니다. 그렇기에 해당 부분을 지우고 ping을 요청해야 우리가 원하는 flag를 찾을 수 있다는 사실을 알 수 있었습니다.

 

또한 flag.py 내용을 화면에 출력하기 위해서는 Cat 명령어를 활용하여야 한다는 사실 또한 파악할 수 있었습니다.

이러한 내용들을 바탕으로,  

 

1)

 

<pattern= 해당 필터링 부분을 지우고, 

 

2)  cat 명령어를 이용하여 실행한 결과, 

여기서 명령어를 실행할 때에는 메타문자 && 을 이용해주었다.

 

위에서 언급한 것처럼, 우리는 해당 문제를 풀 때 Command Injection을 이용하는데, 

Command Injection 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점을 뜻한다. 

 

해당 취약점을 이용할 때 명령어에 쓰이는 메타문자는 총 3가지의 종류가 있다.

첫 번째로는, 메타문자 && : (명령어 연속 실행) 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어 실행되는 문자이다.

두 번째로는, 메타문자 || : (명령어 연속 실행) 앞 명령어에 에러가 발생해야 뒷 명령어 실행되는 문자이다. 

세 번째로는 메타문자 ; : (명령어 구분자) 앞 명령어의 에러 유무와 관계없이 뒷 명령어 실행되는 문자이다.

이 세가지의 문자 중에 첫 번째로는  메타문자 && 을 이용해보았다. 

 

메타문자 && 을 이용해본 결과, 

 

 

우리가 찾고자 하는 flag를 찾을 수 있습니다.

 

또한 

개발자도구 F12 버튼을 누르고, 위에서 언급한 <pattern => 해당 부분의 필터링을 지운 후, 8.8.8.8";cat "flag.py 을

입력하여 ping을 시도하였더니 위와 같이 Flag를 얻을 수 있다는 사실을 알 수 있습니다. 

 

해당 flag를 문제 창에 입력하면 

 

 

 

문제 풀이 완-료!