OS 커맨드 인젝션

취약한 변수를 이용하여 시스템 명령어를 주입하고 운영체제에 접근하는 공격이다.
이를 이용하여 보통 웹 페이지에서 서버의 시스템 셸을 호출할 때 관리자가 의도한 명령어가 아닌 다른명령어를 주입하여 시스템의 정보를 얻어낸다.
실습을 통해 알아보도록 하자.


    OS 커맨드 인젝션 실습

Bee-Box에서 이동하는 방법은 이제부터 생략하겠다. 

첫 실행하면 위와 같이 뜬다.
간략하게 DNS lookup의 역할을 설명하자면, 도메인을 입력하면 매칭되는 IP를 보여주는 역할을 한다.


저기서 Lookup 버튼을 눌러보면

위와 같이 리눅스에서 DNS Lookup의 결과가 출력되게 된다.



추가적으로 GET방식으로 데이터를 전송하지도 않고, Burpsuite를 통해 POST 방식인 것을 알 수 있다.



그렇다면 이번에는 리눅스 시스템 명령어인 ls -l을 입력해보자.

위와 같이 입력하고 Lookup버튼을 누르면 상당한 시간이 걸리고


위와 같은 결과가 뜬다


왜냐하면 입력칸에 입력하는 문구는 
lookup 명령어로써 인자의 역할을 하기 때문이다.
nslookup을 예로 들어 내가 저기에 ls -l을 입력했다는 것은


"nslookup ls -l"이 입력이 된걸로 인식하게 된다.
ls -l은 도메인이 아니기 때문에 오류를 뿜는 것이다.


그렇다면 생각을 더해봐서, nslookup도 하나의 시스템 명령어이고, 결국 저기에 넣는 것은 어쨋든 시스템 명령어를 통해 실행되지 않는가?
그러면 저 입력칸에 시스템 명령어를 악의적으로 삽입한다면 내가 원하는 결과를 뽑을 수 있을 듯 하다.



리눅스상에서 명령어를 여러개 입력할 때 세미콜론(;)이 있다.
이를 이용하여 이번에는 ;ls -l을 입력해 보았다.

Wow...


그렇다면 현재 경로는 ?

경로도 바로 표시해준다.
만약 이를 악용하여 해커가 웹 시스템을 쥐었다폈다한다면...? 생각만해도 끔찍할 것이다.



    보안방법

난이도 중(Medium),상(High)로 설정해놓고 똑같이 실행하면 당연히 안 될 것이다.
Bee-Box서버로 가서 commandi.php 소스코드를 열람해보자.

위 스크린샷이 필터링을 하는 부분이고, 중과 상 난이도가 각각 commandi_check_1, commandi_check_2함수를 사용한다.
마찬가지로 필터링 함수들이 담겨진 소스코드 functions_external.php를 보도록 하자

위와 같은 필터링 함수들이 보인다.

우선 중 난이도에는 str_replace함수를 통해 기본적인 문자를 필터링 하는 것이 보였다.
str_replace 함수란 세번째 인자가 가리키는 변수내의 내용중에 첫번째 인자를 두번째 인자값으로 바꿔다시 저장하는 것이라고 보면 된다.

상 난이도에서는 escapeshellcmd라는 함수를 쓰는데 이 함수의 역할은 세미콜론(;)을 포함한 쉘 명령어로 보이는 문구들을 죄다 회피처리를 시켜주는 역할을 한다.
회피하는 특수 문자들로는 #,&,;,',|,*,?,~,<,>,^,(,),[,],{,},$,\,\x00,\xFF 등 너무너무 많다.


+ Recent posts