우선 문제의 메인 페이지는 아래와 같은 화면으로 구성되어 있다.
현재 Home과 Ping 외의 별다른 카테고리는 없었고, Ping 카테고리에 접속하니 아래와 같은 페이지를 볼 수 있었다.
우선 호스트 Ping 주소를 입력하는 부분에 예시로 적혀있는 8.8.8.8을 넣고 Ping 버튼을 눌러 보았더니 ping 명령어가 작동되어 출력하는 것을 볼 수 있었다.
해당 부분에서는 플래그 값을 찾기 위한 추가 힌트를 발견할 수 없었고, 문제에서도 플래그는 flag.py에 있다고 하였으니 해당 파일을 확인해보자.
flag.py에서 중요한 부분은 아래 'ping'에 대해 정의하고 있는 부분인 것 같다.
코드는 다음과 같이 해석해볼 수 있다.
위 코드는 /ping 페이지에 GET Method로 접속 시에는 핑을 보낼 수 있는 템플릿을 리턴하고 있다. POST Method로 접속한 경우에는 host 파라미터를 받아와 host라는 변수에 지정하고, ping -c 3 {host} 명령어를 통해 입력한 값을 {host}에 대입함으로써 핑을 보낸다.
따라서, {host}에 해당하는 부분에는 flag.py 파일의 내용을 확인할 수 있는 cat 명령어를 사용하여 플래그 값을 볼 수 있을거라 유추할 수 있다.
하지만, 단순히 'cat flag.py'의 형식으로 cat 명령어만 사용하는 것이 아닌 command-injection 공격을 위한 메타문자를 추가적으로 활용하여 작성해주어야 한다. 이때, command-injection에서 사용할 수 있는 대표적인 메타문자인 &&, ||, ; 기호를 사용하여 만들 수 있을 것으로 보이지만, '&&'를 입력하게 되면 잘못된 명령어로 인식하여 오류가 발생하게 된다.
이 문제는 &&가 가진 특징으로 인해 발생하게 되는데, 그 특징들을 아래 간략하게 정리해두었다.
&& : 앞의 명령어가 성공하면 뒤에 있는 명령어도 실행
|| : 앞의 명령어가 오류가 발생하면 뒤의 명령어가 실행
; : 성공실패여부를 가리지 않고 무조건 실행
위 메타 문자의 특징을 보면 '&&'의 경우 앞의 명령어가 성공하면 뒤에 있는 명령어도 실행하게 된다. 하지만 여기서 앞에 명령어에 해당하는 부분은 'ping -c 3'에 해당하는 부분으로 우리가 플래그 값을 원하는 flag.py 만 실행되는 것이 아니기 때문에 오류가 발생한다.
따라서 &&로 문제를 해결하기 위해서는 & 하나만 작성하여 풀어줄 수 있다.
지난번에 해당 문제를 풀었을 때 풀이 자료가 남아있지 않아 어떤 문자로 해결했는지는 정확히 알 수 없으나, '&&'의 중복 사용으로 인해 해결되지 않는 문제는 해보지 않은 것 같아 해당 방식으로 풀이해보았다.
최종적으로 Host 부분에 '& cat flag.py'를 입력하니 아래와 같이 플래그 값을 얻을 수 있었다.
'CTF' 카테고리의 다른 글
[Webhacking.kr] old-44번 write-up (0) | 2023.11.22 |
---|---|
[Dreamhack] command-injection-1 write-up (0) | 2023.11.22 |
[Dreamhack] csrf-2 write-up (0) | 2023.11.15 |
[Dreamhack] csrf-1 write-up (0) | 2023.11.15 |
[Dreamhack] XSS Filtering Bypass write-up (0) | 2023.11.15 |