

처음 접속하게 되면 환영 문구가 출력되고, 상단에 Ping 탭을 볼 수 있다.

해당 탭으로 이동해보면 특정 호스트에게 Ping을 보낼 수 있는 쉘을 확인할 수 있다.

8.8.8.8을 입력 해보면 ping 명령어의 결과를 그대로 출력해주는 것을 볼 수 있다. 이 경우 뒤에 추가 명령어를 붙여 다른 명령어의 결과 값을 가져오는 것도 가능할 수 있다. 테스트를 위해 && 연산자로 ls 명령어를 이어 붙여 전송해보자.
8.8.8.8" && "ls

그런데 입력하려고 하면, "요청한 형식과 일치시키세요"라는 문구가 뜨며 전송이 되지 않는다. 개발자 도구를 열고 해당 폼의 소스코드를 확인한다.

pattern은 정규 표현식 설정 속성으로, 설정된 범위 외의 값은 입력 불가능하다. 이를 더블클릭해 제거한 후 다시 전송.

명령어가 성공적으로 실행되었고, 디렉토리 안에 flag.py가 있는 것을 볼 수 있다. 이를 cat 명령어로 읽어보자.
8.8.8.8" && "cat flay.py

이상하게 cat 혹은 ls 뒤에 인자를 붙이면 에러가 발생한다. 테스트를 위해 전체 명령어를 띄어쓰기 하지 않고 입력해본다.
8.8.8.8";"ls

띄어쓰기를 하지 않아도 실행이 잘 된다. 이번엔 각 문자들을 ""로 감싸서 입력.
8.8.8.8"; "cat""flag.py

에러가 발생했다. 띄어쓰기는 구분을 하는 것 같다.
이번엔 "cat"과 "flag.py를 띄워서 입력.
8.8.8.8"; "cat" "flag.py

명령어가 성공적으로 실행되었고, flag를 획득했다. ;(세미콜론)은 ""(쌍따옴표)로 안감싸도 되는 것으로 보아 각 문자들이 ""로 감싸져야 인식이 되는 구조인 것 같다.
어떤 식을 동작하는 건지 알아보기 위해 소스코드를 확인해봤다.

코드는 단순했다. ping -c 3 "{host}"로 입력 값을 쌍 따옴표 사이에 입력하는 방식이 다였다. 내가 몰랐던 점은 쌍 따옴표가 쉘에서 어떤 식으로 동작하는지였다.
쉘에서는 기본적으로 공백을 구분자로 명령어나 인자들을 구분한다. 여기서 쌍따옴표의 역할은 쉘이 문자열 내의 공백이나 특수 문자를 하나의 단위로 취급할 수 있도록 만들어주는 것. 따라서 "ls -a"로 입력하게 되면 쉘은 ls에 -a 옵션을 사용한 것이 아니라 "ls -a"라는 명령어를 찾게된다. 이를 실제로 쉘에 입력해보면

"ls -a"라는 명령어를 찾을 수 없다고 나온다.
이를 토대로 더 확실한 답을 내보면
ping -c 3 "{host}"일 때 host의 값으로 8.8.8.8"; cat "flag.py를 입력하는 것이다. 그럼 최종 명령어는 아래처럼 된다.
ping -c 3 "8.8.8.8"; cat "flag.py"
이렇게만 해도 자동으로 앞 뒤에 붙는 쌍따옴표가 닫히고 각 명령어와 인자가 공백으로 구분되기 때문에 에러 없이 flag 값을 얻을 수 있다.
