보안정보
전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.
SHELLING을 이용한 OS Command Injection
2019.09.03
10,143
1. 개요
2. OS Command Injection 공격
SHELLING은 기존 Burp Suite의 scanner와 intruder 기능에 다수의 페이로드를 조합할 수 있는 기능을 덧붙인 플러그인이다. SHELLING의 목적은 사용자가 수동적으로 찾을 수 없는 우회패턴을 제공하고 기존의 기능과 함께 탐지할 수 없던 페이지에 대해서 취약점을 판단할 수 있는 것이다. 이러한 기능은 OS Command Injection 취약점 탐지에 유용하다.
OS Command Injection은 웹 어플리케이션을 통해 URL의 파라미터에 운영체제(OS) 명령을 실행하는 취약점이다. 취약점을 악용하여 시스템 내부의 데이터를 탈취하거나 서버를 장악하여 손상을 입힐 수 있다. 운영체제의 명령을 실행할 경우 실행되는 시스템에 의해서 내부데이터가 출력되거나 임의의 명령을 실행 할 수 있다. SHELLING은 기존 Burp Suite의 scanner와 intruder 기능에 다수의 페이로드를 조합할 수 있는 기능을 덧붙인 플러그인이다. SHELLING의 목적은 사용자가 수동적으로 찾을 수 없는 우회패턴을 제공하고 기존의 기능과 함께 탐지 할 수 없던 페이지에 대해서 취약점을 판단할 수 있는 것이다. 이러한 기능은 OS Command Injection 취약점 탐지에 유용하다. 다음은 SHELLING 플러그인에 대해 사용해보기 전 OS Command Injection에 대해 간단히 알아보자.
시스템의 경로를 입력하면 디렉터리의 파일 목록을 출력하는 PHP 스크립트가 존재한다. URL 파라미터에 경로를 기입할 경우 PHP 스크립트에 의해 파일의 목록을 출력한다.
[그림 2] 취약한 PHP 스크립트 구문 (1)
[그림 2]의 PHP 스크립트에 의하면 ‘shell_exec()’ 함수에 의해 디렉터리 내의 파일 목록이 출력되고 있는 것을 확인할 수 있다. 그러나, 파일 목록 출력이 아닌 다른 시스템 명령을 입력할 것이므로 명령 구분자(;)를 이용한다.
[그림 3] 시스템 명령어에 의해 출력되는 서버 내부정보
위의 요청과 같이 명령 구분자(;) 이후 임의의 OS 명령어 (ifconfig)를 입력할 경우 반환 값에 의해 내부 데이터 탈취 및 실행 할 수 있다.
그러나 다수의 파라미터가 존재할 경우 사용자 입장에서 취약점이 발현할 수 있는 파라미터를 수동으로 유추하기에 어려움이 뒤따른다. 또한, 시스템의 조건이나 사용되는 스크립트의 형태에 따라 사용하는 구문이 달라진다. 사용자는 취약점을 판단할 때 아래와 같은 문제점에서 우회패턴을 유추해야 한다.
1) 소스코드 구문의 Syntax 문제
서버 스크립트를 제작할 때, 시스템 명령함수를 사용할 경우 특수문자에 대한 검증 로직을 추가적으로 구현하게 된다. 또한, 스크립트 내에 삽입되는 명령어의 위치에 따라 명령어가 실행되지 않을 수도 있어 구문 우회를 유추해야 한다. [그림 4]의 코드는 입력 값이 /tmp/users.txt에 기록되는 구문이다.
[그림 4] 취약한 PHP 스크립트 구문 (2)
위의 코드와 같이 입력할 경우 중괄호의 싱글쿼테이션으로 인해 입력되는 값이 시스템 명령이 아닌 echo 문으로 출력하게 되고 /tmp/users.txt 파일에 기록되며 원하는 시스템 명령을 수행 할 수 없다.
중괄호의 쿼테이션 구문을 벗어나기 위해 로 기입하여 명령 구분자를 이용해 시스템 명령을 실행 시킨다.
[그림 5] 입력하는 시스템 명령어를 통해 출력되는 시스템 내부 정보
2) OS 별 명령어 조건
사용되는 서버의 OS에 따라 시스템 명령어가 실행되지 않을 수 도 있다. 사용자는 다른 취약점을 통하여 OS를 유추하거나 UNIX와 WINDOWS에서 비슷한 명령을 통해 유추해야 한다.
명령어 의미 | UNIX | WINDOWS |
현재 사용자 이름 | whoami | whoami |
사용 운영체제 | uname -a | ver |
사용 운영체제 | ifconfig | ipconfig |
네트워크 상태 체크 | ping | ping |
출력 | echo | echo |
[표 1] OS 별 주요 사용 명령어
3) 응답 값이 출력되지 않을 경우
입력 값에 대한 결과를 출력하지 않는 페이지 일 경우 공격할 수 있는 명령어가 제한적이거나 다른 취약점과 연계하여 파악해야 한다. 서버에 트래픽과 관련된 명령(ping)을 주거나 서버에 존재하는 다른 취약점을 파악한 뒤 연계하여 취약점을 발현 시킬 수 있다.
대다수의 사용자는 서버 스크립트 단의 내용을 확인할 수 없어 다양한 패턴을 입력함으로써 여러 시행착오를 거쳐야 한다. 또한 패턴조합이나 다양한 페이로드 구성을 하는 것을 수동으로 해야 하며 실질적으로 취약점 확인에 시간이 소요된다.
3. SHELLING을 이용한 OS command injection
앞에서 수동으로 취약점을 진단할 경우 여러 문제점을 제기할 수 있었다. 이를 최대한 자동화 하여 사용할 수 있는 SHELLING을 이용해보도록 하자. SHELLING은 Burp Suite 플러그인으로 Extender → Bapp Store에서 ‘Command injection Attacker’로 설치할 수 있다. (Professional 버전 권장)
[그림 6] Burp Suite Plugin 설치
SHELLING은 기존의 burp suite의 scanner와 intruder, Burp Collaborator 기능을 함께 사용한다. Burp suite의 scanner 기능은 자동과 수동으로 웹 어플리케이션의 취약점을 파악하는 기능을 하고 intruder는 파라미터에 제작된 다수의 페이로드를 삽입할 수 있는 기능을 하게 된다. 또한, Burp Collaborator 기능은 응답값을 알 수 없는 페이지에 대하여 보낸 요청을 대신 응답 받아 취약점을 탐지할 수 있도록 하여 SHELLING의 자동모드에서 요긴하게 사용된다.
1) 자동모드
SHELLING은 자동모드와 수동모드를 제공한다. 특히 자동모드에 특화되어 용이하게 사용할 수 있다. 자동 모드에서는 명령어를 맘대로 할 수 없으며 반드시 Burp Collaborator를 사용한다.
[그림 7] SHELLING 자동모드 사용
자동모드 설정 시 DNS 피드백 채널을 설정할 경우, Burp에서 제공하는 Burp Collaborator를 통해 결과 값을 확인할 수 있다. Burp Collaborator란, 응답 값이 화면을 통해 보여지지 않는 페이지를 테스트 하고자 할 때 외부에 연결할 수 있는 코드를 넣어 반응을 통해 취약점을 확인하는 Burp의 서비스 중 하나이다. 주로 DNS의 상호작용을 통해 확인할 수 있다. SHELLING의 자동모드도 아래의 예시와 같이 공격 값에 의한 응답 값을 Burp suite에 반환하여 공격의 성공 여부를 확인할 수 있다.
[그림 8] Burp Collaborator와 SHELLING의 흐름도
자동모드는 Burp Suite의 기존 Scanner나 Intruder와 결합하여 취약점을 탐지한다. 자동모드는 Burp Suite의 기존 Scanner나 Intruder와 결합하여 취약점을 탐지한다. scanner를 통해 취약점을 파악할 경우 기존의 burp suite의 scan과 유사하다. burp suite를 통해 프록시를 잡은 뒤 원하는 호스트 페이지 요청이나 응답 값에 scan 동작을 요청하면 자동으로 취약점을 확인할 수 있다.
[intruder]를 통해 확인할 경우 burp suite의 [intruder] 탭을 이용한다. SHELLING의 페이로드 집합을 통해 다량의 파라미터에 패턴을 기입할 수 있다. 또한 매칭되는 페이로드가 발생할 경우 로그를 SHELLING의 차별화된 로그를 출력시켜 사용자가 해당 플러그인을 통해 공격이 성공 여부를 알 수 있다.
[그림 9] scan 시작
Scan을 동작시키기 위해 해당 페이지 요청이나 응답 값에 마우스 오른쪽 버튼을 눌러 ‘Do an active scan’ 버튼을 클릭한다.
[그림 10] scanner 기능을 통한 취약점 확인
Intruder 기능을 통해 확인 하고자 할 경우 payload 설정에 SHELLING의 페이로드로 지정하여 준다. 설정 뒤 오른쪽 상단의 ‘start attack’ 버튼을 누른다.
[그림 11] Payload 지정
[그림 12] 공격 시도
[SHELLING] 탭 → [Advanced] 탭으로 이동한다. Match 되는 로그를 확인하기 위해 Verbose extension output 버튼을 눌러 로그 기능을 활성화 할 수 있다.
[그림 13] 패턴 로그 확인 기능 활성화
[그림 14] 취약점 확인
설정된 Payload로 취약점을 찾은 것을 확인할 수 있다. 취약점을 확인하기 위해서는 [그림 14]와 같이 [Target] 탭에서 ISSUE 부분을 통해 확인할 수 있다.
2) 수동점검
수동점검을 할 경우 내포된 Payload를 사용자가 조작할 수 있다. SHELLING은 다양한 구문 조합을 제공한다. 200여 개의 구문과 명령어에서 사용자가 구성하고자 하는 조합에 따라 공격 Payload를 구성할 수 있다. 또한, OS 별로 구별하여 구성하거나 Windows나 UNIX 모두를 겨냥한 공격구문을 만들 수 있다.
[그림 15] Payload 조합
구문 조합 뿐 아니라 정규 표현식에 따른 허점이 존재할 경우 해당 조합을 통해 공격이 가능하다. Burp suite을 사용할 수 없는 환경에서 직접 페이로드를 삽입하여 취약점을 확인할 수 있도록 [Save the payload] 탭을 통해 외부로 페이로드를 추출할 수 있다. 또한, Byte generator는 추가적으로 payload를 조합할 때, 바이트의 범위를 제한된 범위 내에서 조합할 수 있도록 한다.
4. SHELLING 플러그인의 이점
기존의 Burp Suite 기능인 intruder와 scanner를 이용하여 취약점을 찾아낼 수 있다. 그러나 SHEELING의 이점은 높은 탐지율과 이전에 탐지하지 못했던 것에 대해 탐지할 수 있다는 것이다. [그림 16]과 같이 Burp Suite의 scanner와 SHELLING을 이용하여 동시에 SCAN 할 경우 탐지 갯수에서 많은 차이를 보였다. 기본 SCAN으로 할 경우와 플러그인을 이용할 경우 사용되어지는 페이로드의 차이가 있어 탐지율이 더욱 높은 것으로 보인다.
또한, 응답 값을 알 수 없는 페이지에 대해 취약점을 탐지할 수 있다. SHEELING은 Burp collaborator를 이용할 수 있으므로 수동으로 파악할 수 없는 취약점을 파악할 수 있다.
[그림 16] Burp suite의 Scan과 SHELLLING의 SCNNER 기능의 비교 / 출처 : SHELLING - a comprehensive OS command injection payload generator
5. 결과
지금까지 OS Command Injection취약점과 이를 탐지할 수 있는 Burp Suite 플러그인인 SHEELING에 대해 설명하였다. SHELLING은 다양한 페이로드의 집합과 Burp suite의 주요기능을 더해 시너지 효과를 낼 수 있는 플러그인이다. 또한, 그 동안 탐지하지 못했던 응답 출력 값이 없는 페이지에 대해 취약점을 파악할 수 있어 웹 어플리케이션서 더욱 높은 진단율을 기대하고 있다. 주요 취약점을 발현하는 시스템 함수의 사용을 지양하고 있는 추세지만, 패치 되지 않는 시스템은 언제든지 취약점을 발현시킬 수 있으므로 모의해킹 진단자는 다양한 방식으로 많은 취약점을 탐지할 수 있도록 해야 한다.
6. 출처
[1] SHELLING - a comprehensive OS command injection payload generator
https://github.com/ewilded/shelling
[2] What is OS command injection
https://portswigger.net/web-security/os-command-injection
[3] Burp Collaborator
https://portswigger.net/burp/documentation/collaborator
[4] PHP Weathermap 취약점을 통해 배포된 리눅스 서버를 타깃으로 한 가상화폐 채굴기