OS injection
시스템 명령어를 쿼리문에 주입하여 취약한 변수를 통해 서버 운영체제에 접근하는 공격
웹 (애플리케이션)이 구동 중인 서버의 운영체제상에서 임의의 명령을 실행하도록 하는 웹 취약점
-OS command injection 또는 shell injection이라고도 함
-OS(operating system) 운영체제: 사용자의 하드웨어, 시스템 리소스를 제어하고 프로그램에 대한 일반적인 서비스를 지원하는 시스템 소프트웨어( 사용자 -> 응용프로그램 -> 운영체제 -> 하드웨어 )
-OS는 수많은 application이 잘 동작할 수 있도록 자원(리소스)를 할당하고 관리, 하드웨어와 소프트웨어를 하나로 묶어주는 역할
-웹페이지에 시스템 명령어를 주입하여 쉘을 획득하는 공격
-OS 명령 인젝션을 통해 실행되는 명령은 루트나 관리자 권한의 계정이 아니라 웹 애플리케이션을 구동하는 계정의 권한으로 명령이 실행됨 그래서 공격자가 권한 상승이나 다른 취약점과 연계할 수 있다면 더 많은 권한을 획득할 수 있음.
-shell_exec, eval, system 함수(셸 함수라고도 부름)를 사용하여 발생되는 취약점(php, java, python 등 대부분의 개발 언어들은 셸과 연동되는 내장함수를 제공하고 있음)
-셸 함수를 활용해 시스템 셸로 운영체제 명령을 전달하고 실행 결과를 얻을 수 있게 됨
-php에서 사용하면 위험하다고 알려져 있는 shell_exec()함수가 있다.
-php란 Hypertext Preprocessor으로 C언어를 기반으로 만들어진 서버 측에서 실행되는 서버 사이드 스크립트 언어, 동적 웹 페이지를 쉽고 빠르게 만들 수 있도록 해주는것이 목적이다.
조건
웹 애플리케이션을 구동 중인 계정에 시스템 명령을 실행할 수 있는 권한이 있어야 함.
시스템 셸로 전달되는 명령에 사용자로부터 입력받은 데이터를 포함해야 한다.
사용자 데이터는 이스케이프 또는 삭제 처리없이 정상적인 셸 명령어로 인식되어야 한다.
메타문자
|
기 능
|
사용 예
|
cmd1 | cmd2
|
왼쪽 명령의 결과를 오른쪽 명령의 입력으로 전달합니다.
|
$ whoami | grep 'b'
bbc |
cmd1 && cmd2
|
왼쪽 명령을 성공적으로 실행하면 오른쪽 명령을 실행합니다.
|
$ whoami && pwd
bbc /home/bbc |
cmd1 || cmd2
|
왼쪽 명령의 실행에 실패하면 오른쪽 명령을 실행합니다.
|
$ whoareyou || pwd
whoareyou: 명령을 찾을 수 없습니다. /home/bbc |
cmd1 ; cmd2
|
한 줄에 여러 명령을 사용할 때 각각의 명령을 구분하기 위해 사용됩니다. (리눅스/유닉스 전용)
|
$ whoami; pwd
bbc /home/bbc |
`cmd`
|
백틱(`) 사이의 명령을 실행한 결과를 반환합니다. (리눅스/유닉스 전용)
|
$ echo `whoami`
bbc |
$(cmd)
|
$() 안의 명령을 실행한 결과를 반환합니다. (리눅스/유닉스 전용)
|
$ echo $(whoami)
bbc |
cmd > /your_file
|
왼쪽 명령의 결과를 오른쪽 파일에 기록합니다. (리눅스/유닉스 전용)
|
$ whoami > /path/to/file/whoami.txt
|
/your_file < cmd
|
오른쪽 명령의 결과를 왼쪽 파일에 기록합니다. (리눅스/유닉스 전용)
|
$ /path/to/file/whoami.txt < whoami
|
os 명령 인젝션에 사용되는 메타문자들
-> 세미콜론(;) 외에도 다른 메타 문자들도 각 기능에 맞게 구성하면 임의의 명령 주입 가능
-> wget을 통해 웹셸과 같은 다른 악성 파일을 서버에 다운로드하여 후속 공격을 하거나 조직 내 다른 시스
템으로 공격을 확장할 수 있다.
os 명령 인젝션의 유형
직접 명령 인젝션(direct command injection)
위 예시처럼(ex.php) 사용자가 입력한 데이터가 os 명령의 인자로 직접 포함되는 경우
간접 명령 인젝션(indirect xommand injection)
파일이나 환경변수를 통해 웹 애플리케이션의 시스템 셸로 os명령이 전달되는 경우
보통 윈도우 시스템에서 나타나며 forfiles, pcalua, pcalua.exe 등과 같이 CMD를 사용하지 않고 명령을 호출할 수 있도록 지원하는 유틸리티를 통해 가능
블라인드 명령 인젝션(blind command injection)
직접 명령 인젝션과 같이 사용자의 입력 데이터가 os명령에 포함되어 시스템 셸로 전달되지만 http 응답 메시지에 명령의 실행 결과가 표시되지 않는 경우이다.
주입된 명령의 실행 결과를 육안으로 확인할 수 없는 특징으로 인해 '시간 지연', '출력 리다이렉팅', '대역외 기술' 과 같은 블라인드 명령 인젝션 기술이 주로 사용됨
os 명령 인젝션 테스트하는 방법
Step 1. 셸 명령을 호출하는 기능 식별
웹 애플리케이션의 모든 기능을 사용하면서 셸 명령을 호출하는 기능을 찾는다. 대표적인 예로 GET 파라미터값으로 파일 이름이 사용되는 진입점(엔드포인트) 등이 있다. 아래는 명령 인젝션 취약점이 존재할 수 있는 일반적인 파라미터 이름들임.
cmd
exec command execute ping query jump code reg do func arg option load process step read function req feature exe module payload run |
GET 파라미터가 아닌 폼 데이터, 쿠키나 HTTP 헤더를 통해서도 셸 명령으로 데이터가 전달될 수 있으므로 사용자 데이터가 전달될 수 있는 모든 입력 가능한 소스를 고려하기
step2 운영체제(os)식별
리눅스 계열과 윈도우 계열의 커맨드라인 명령이 차이가 있으니 서버의 운영체제를 식별하는 것이 중요
Step 3. 테스트 문자열을 통한 응답 관찰
셸 명령을 호출하는 것으로 판단되는 곳(진입점)을 찾았다면 OS 명령 인젝션에 사용되는 셸 메타문자들과 기본 명령어들이 어떻게 처리되는지 확인해야 한다. 아래와 같은 간단한 테스트 문자열을 사용할 수 있다
abc;echo%20commandi;
|
만약 위 요청에 대한 응답으로 commandi 라는 문자열이 HTTP 응답에 출력된다면 OS 명령 인젝션에 취약하다고 판단할 수 있다. 하지만 대부분의 웹 애플리케이션은 다양한 응답을 보여준다. 웹 애플리케이션이 사용자 입력 유효성을 검사하는 방법과 오류를 처리하는 방법에 따라 응답을 주거나 안 줄 수도 있다. 개발자에 의해 의도된 명백한 입력 유효성 검사 오류 메시지가 아닌 이상 잠재적으로 취약하다고 봐야 한다. 계속해서 테스트 문자열을 수정하고 웹 애플리케이션의 응답을 관찰해가며 테스트해야한다.
fuzzdb에서 테스트 문자열로 사용할 수 있는 다양한 템플릿 모음을 확인할 수 있다
Step 4. 개념증명(PoC)을 위한 실제 명령 사용
실제 공격에 사용될 수 있는 명령을 사용해 OS 명령 인젝션이 동작되는지 확인. 유의할 점은 rm, del, rmdir 등 시스템에 손상을 줄 수 있는 명령은 절대로 사용하지 만다. 사용할 수 있는 명령은 whoami 또는 id와 같은 시스템에 무해한 명령이 있음
abc;whoami;
|
whoami 명령의 결과가 응답에 반환된다면 OS 명령 인젝션에 취약함을 나타낸다
blind os injection
사용자 입력 데이터가 웹 서버의 시스템 셸로 전달되어 실행되지만 기본적인 명령 인젝션과는 달리 명령의 실행 결과가 HTTP 응답 메세지에 출력되지 않는 경우에 사용할 수 있는 os 명령 인젝션의 일종
-> 주입된 명령이 제대로 성공이 되었는지 판단할 수 없어서 성공적인 실행 여부를 판단하기 위해 사용되는 기법이 있음
시간 지연
sleep명령(리눅스/유닉스만 해당 ) 또는 ping과 같은 명령을 사용하여 의도적으로 http 응답 시간을 지연시키는 방법
만일 운영체제가 리눅스/유닉스 계열이라면 다음과 같이 셸 메타문자와 조합된 SLEEP 명령을 이용할 수 있다.
& sleep 10 &
|
위의 명령이 성공적으로 실행된다면 10초간 HTTP 응답 지연을 발생 앰퍼샌드(&) 문자 대신 다른 셸 메타문자를 사용해도 상관없음
ping: 대상 컴퓨터를 향해 일정 크기의 패킷을 보낸 후, 대상 컴퓨터가 이에 대한 응답 메세지를 보내며 이를 수신하여 대상 컴퓨터 동작 여부 혹은 네트워크 상태를 파악하는 것(도메인 ip를 확인할 때 많이 사용)
- 리눅스/유닉스의 경우: -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 프록시 도구 사용하거나 웹 브라우저 개발자 도구에서 확인할 수 있음. 개발자 도구의 네트워크 탭에서 브라우저 통신 기록을 확인하면 됨.
출력 리다이렉팅
명령의 실행 결과를 웹루트 또는 그 하위의 경로에 파일로 생성(리다이렉팅)하고 해당 파일의 url을 통해 파일을 조회하여 주입된 임의의 명령이 실행되었는지 판단할 수 있는 기술.
단 웹 서버를 구동하는 계정에 리다이렉팅할 디렉토리에 대한 읽기와 쓰기 권한이 있어야 함.
-> 리눅스, 아파치 환경에서 구동 중인 웹 애플리케이션을 예로 들면 아래 같은 명령 주입 가능
echo 'commandi' > /var/www/html/myoutput.txt &
|
위의 명령이 정상적으로 실행된다면 출력 리다이렉션 메타문자인 > 를 기준으로 왼쪽의 명령인 echo 'commandi' 의 실행 결과가 웹루트 디렉토리(/var/www/html/)에 myoutput.txt 라는 파일로 생성될 것이다. https://www.example.com/myoutput.txt 를 방문하여 commandi 라는 문자열이 응답으로 출력된다면 명령 인젝션 공격에 취약하다고 볼 수 있다.
3. 대역 외(out-of-band) 채널
대역 외(out-of-band,oob) 채널을 이용한 기술은 취약한 서버를 공격자 또는 테스터가 제어할 수 있는 외부의 서버와 통신을 하도록 유도하고 통신 기록을 확인함으로써 주입된 임의의 명령이 실행되었는지 확인할 수 있는 기술
참고
DNS란(도메인 이름 시스템)
사람이 읽을 수 있는 도메인 이름(www.naver.com)을 머신이 읽을 수 있는 IP주소(예: 192.0.2.44) 로 변환한다.
-DNS를 운영하는 서버를 Name Server(네임서버)라고 한다.
-도메인 이름과 ip주소를 서로 변환하는 역할
-Forward Zone(도메인 이름 -> IP): 도메인을 구성하는 호스트에 대한 정보를 기록
-Reserve Zone(IP -> 도메인 이름): DNS 서버 자기 자신에 대한 정보를 기록한다.
-포트는 일반적으로 UDP 53번 포트를 사용한다.(다만, 패킷의 크기가 512bit 초과하거나 특수한 경우 TCP 53번 포트를 사용한다)
-nslookup 이 명령어로 dns 정보 조회를 할 수 있다.
(도메인을 통해 ip주소 조회) -> ex) $ nslookup google.com)
-여기서 ns는 nameserver
Shell 정의
- Shell은 애플리케이션 즉, 프로그램의 일종이다.(명령어 해석기)
-쉽게 말해 SERVER의 검정 바탕의 글자만 있는 텍스트 모드나 윈도의의 터미널처럼 명령어를 입력하는 환경
- Shell은 누군가가 코드로 짠 프로그램이다.
- Shell의 목적은 운영체제(OS) 서비스들을 사람과 소통할 수 있게 한다.
- Shell 로 이름이 된 이유는 말 그대로 껍질, 운영체제를 둘러싼 가장 바깥쪽 레이어 (outermost layer)이기 때문이다.
- Shell 프로그래밍 한다라는 의미는 운영체제와 소통하기 위한 언어를 작성한다라는 뜻이다.
- 즉, Shell 프로그래밍을 하기 위해선 운영체제를 이해해야한다.
- Shell 프로그래밍한다 = 운영체제를 컨트롤한다. 웹프로래밍을 한다 = 웹페이지를 컨트롤한다.
-커널과 사용자 간의 다리 역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행
하는 역할을 함
-사용자와 커널 사이에서 명령을 해석해 전달하는 명령어 해석기 기능이 있음
-셸은 자체 내에 프로그래밍 기능이 있어 프로그램을 작성할 수 있음
OS 명령
리눅스
whoami 현재 사용자의 이름
uname -a 운영체제
ifconfig 네트워크 구성
netstat -an 네트워크 연결
ps -ef 실행 중인 프로세스
윈도우
whoami 현재 사용자의 이름
ver 운영체제
ipconfig /all 네트워크 구성
netstat -an 네트워크 연결
tasklist 실행 중인 프로세스
window 유닉스 모두 적용 : &, &&, |, | |
유닉스만 적용: ;, 줄바꿈(0x0a 또는 \n), `, $
'Web 필기' 카테고리의 다른 글
파일 다운로드 취약점 (0) | 2023.03.30 |
---|---|
Linux WIldCard (0) | 2023.03.18 |