PR_CVE-2014-6271(Shell Shock)

 

 

 

작성일: 2014년 10월 27일

작성자: juwon1405

E-mail: hotyougo@naver.com

Proprietary & Confidential






01. 개요

1. CVE-2014-6271 취약점 정보, 관련조사, 취약한 대상 등에 대해 알아본다.

2. 취약점 발현 시나리오(웹 서비스대상)에 대해 알아 보고 실제 공격을 통해 원리를 이해한다.

3. 취약점 대응방안과, 작성하며 느낀 점에 대하여 이야기 해 본다.

 

 

02. 본론

1. CVE-2014-6271(Shell Shock) 취약점 정보

  • CVE-2014-6271 / CVE-2014-7169: Remote code execution through bash

    9월 24일, GNU Bash 원격코드 인젝션 ZeroDay 취약점이 공개 되었다.

     

  • 해당 취약점은 GNU Bash의 환경변수를 통한 코드 인젝션 가능 취약점이다.

    Bash의 환경 변수에 함수정의를 이용해서 원하는 코드를 추가 할 수 있고, 다음 Bash가 사용될 때 추가된 코드가 실행되는 취약점.

    CGI의 경우, HTTP Request 헤더가 환경변수에 저장이 되는 특성을 이용하여 원격 코드 인젝션이 가능하다.

     

  • Bash는 Shell 변수뿐만 아니라 Shell 함수도 다른 Bash 인스턴스로 Exporting 하는 것이 가능하다.

그렇게 하기 위해, Environment 를 통해 새롭게 추가된 함수정의(definition)를 전파하기 위해 함수 이름으로

환경변수를 만들고 그 변수 안에 '() { 로 시작하는 함수 내용을 정의한다.

 

 

  • 그런데, 취약한 버전의 Bash구현의 경우, 다음과 같이 함수정의 뒤에 임의의 명령을 추가하면 Bash 프로세스에서 해당 환경변수를

    Import 할 때 끝에 추가된 명령까지 같이 실행하게 된다.

     

     

  • 취약한 GNU Bash를 확인할 수 있는 방법은 다음과 같다.

    터미널에서 env x='() { :;}; echo vulnerable' bash -c "echo this a test" 명령어를 입력 하였을 때에,

    취약한 경우 다음과 같이 vulnerable 과 this is a test 가 표시된다.

     

    취약하지 않은 경우 다음과 같이 this is a test 만 표시된다.

     

    ※테스트 환경 : CentOS release 4.4 / GNU bash , version 3.00.15(1)-release (i686-redhat-linux-gnu)

     

  • 위와 같은 취약점(CVE-2014-6271)은 리눅스, 레드햇, GNU에서 패치 적용되었지만 문제를 완벽히 해결하지 못하였다.

    Bash는 여전히 우회를 통한 취약점(CVE-2014-7169)을 가지고 있다. 이 취약점은 다음과 같은 명령어로 테스트해 볼 수 있다.

    터미널에서 env X='() { (a)=>\' sh -c "echo date"; cat echo 명령어를 입력 하였을 때에,

    취약한 경우 다음과 같이 echo 파일 생성된다.

    실제 생성 파일명을 결정하는 부분은 "echo date" 이고, 취약한 경우 "echo" 라는 파일생성과 날짜정보 출력.

    뒤에 cat echo 부분은 취약점이 성공한 결과 확인을 위해 생성된 파일명 echo 파일을 읽는 추가코드.

     

    취약하지 않은 경우 다음과 같이 echo라는 파일이 생성되지 않는다.

 

 

 

 

 

1-1. 취약점 위험성

  • 해당 취약점은 CVSS (Common Vulnerability Scoreing System)에서 10점(HIGH)을 받은 만큼

    위험도가 상당히 높은 취약점이다.

▲[그림 1-1] CVSS 평가표

 

※CVSS(Common Vulnerability Scoring System) 이란,

"취약점 공동 평가 시스템" 이며 취약점을 DB로 관리하고, 취약점 마다 점수를 매겨, 위험도를 마련하고 있다.

 

  • 현 시점 해외에서도 Bash 취약점 때문에 소란이 일고 있다. Trend Micro는 지금 하트블리드 보다 여러 면에서 더 심각한 것으로 속속 드러나고 있는 '전염병'이라고 표현했다. 이미 5억 개에 달하는 웹 서버와 인터넷에 연결된 기기들이 감염되어 있다는 결과와 함께였다.

     

  • 공격에 성공한다면 공격자는 Linux 및 Unix 기반의 시스템에 대한 제어 권한을 갖게 된다. 그렇기 때문에 전문가들은 공격 벡터가 어마어마하게 클 수밖에 없을 것이라고 예상 중이다. (예상 벡터: 맥 OSX, Android, OpenBSD, DHCP Client, SSH Server, CGI나 Apache를 사용하는 Web Server, 가정용 Router(공유기), BitCoin Core, Embeded System 등 전부)

     

     

  • 이번 취약점의 가장 큰 위험성은 사용방법의 난이도에 문제가 있다는 지적이 있다. SQL Injection 과는 다르게 WebShell 업로드에 성공한 결과처럼 공격자입장에서는 취약한 사이트를 찾고, PoC에 공개된 Exploit을 활용하여 하고자 하는 명령어만 입력하는 되는 것이다.

    따라서 평소에 조금이라도 해킹에 관심이 있었다면, 해당 취약점을 통해 다수의 공격자가 발생할 우려가 있다고 판단된다.

     

  • 무선랜 공유기는 사용자들의 기기가 접속신호를 보내면 자동으로 IP를 배정해 주는 DHCP서비스를 제공한다. 공유기 혹은 이와 연결된 DHCP Server가 해킹될 가능성도 배제할 수 없다.

 

 

 

1-2. 취약점 관련 조사

  • Bash는 자유소프트웨어 진영인 그누(GNU) 프로젝트가 개발한 프로그램(Shell)으로 출시 25년이 되었다.

    Shell은 리눅스는 물론 유닉스가 기반인 맥 OS X등 운영체제(OS)에서 기본 설정으로 활용되고 있다.

  • 이 Shell은 윈도우 CMD를 입력하면 뜨는 도스(DOS)창과 유사한 기능을 한다.

    명령어를 입력하면 네트워크가 제대로 작동하고 있는 지를 확인하는 Ping 테스트, IP주소 확인, 해당 Server내 파일 검색,

    및 실행 등 기능으로 무한히 활용할 수 있다.

  • Bash는 오래 사용된 만큼 많은 Server관리자들에게 가장 인기 있는 Shell이며, Web Server에 대한 설정을 변경, 분석, 복구, 업그레이드 등 Command 기능을 수행 할 수 있다.
  • Bash Shell 공통게이트웨이인터페이스(CGI)로 프로그래밍을 할 때 주로 사용되는 것으로 리눅스 Server의 경우 별다른 설정을 하지 않았다면 기본적으로 이 Shell을 사용하고 있다.
  • CGI는 Web Server와 외부 프로그램 사이에 정보를 주고 받기 위한 표준화된 프로그래밍 방식이다. 현재 대부분 웹사이트가 자바 스크립트를 기반으로 작성됐기 때문에 주로 과거에 만들어진 웹사이트 등이 CGI를 활용하고 있다.

     

     

    1-3. 취약한 대상

  • 해당 취약점이 존재하는 Bash software 의 Version은 아래의 URL Link를 통해 확인 가능하다.

    NVD: http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271

     

  • 해당 취약점이 존재하는 Products 의 Version은 아래의 URL Link를 통해 확인 가능하다.

    OSVDB: http://osvdb.org/show/osvdb/112004

 

03. 실습 및 구현

1. 취약점 발현 시나리오

  • 이 취약점의 발현 시나리오는 다음과 같다.

    출처: MITRE의 CVE(Common Vulnerabilities and Exposures)

  1. Open SSH의 Force Command 기능을 우회하는데 사용할 수 있다.

    Force Command 는 SSH로 접근하는 사용자가 제한된 명령어만 실행하도록 만든다.

    하지만 이 취약점으로 허가되지 않은 명령을 실행할 수 있다.

    Force Command를 사용하더라도 사용자 계정을 알아야 하므로 제한적인 상황에서 사용 가능하다.

    (공격방법 참조 Link: http://forensic.n0fate.com/?p=1256)

     

  2. Apache Web Server가 mod_cgi, mod_cgid 모듈을 사용하는 경우,

    CGI 스크립트를 이용하여 bash 명령어를 실행하거나, 서브 쉘(subshell)을 띄울 수 있다.

    C, Python, Perl로 구현된 CGI의 경우에도 시스템 명령어를 사용하는 경우(system, open) 공격이 가능하다.

    (공격방법 참조 Link: http://hacksum.net/uncategorized/cve-2014-6271-gnu-bash-%EC%9B%90%EA%B2%A9%EC%BD%94%EB%93%9C-%EC%9D%B8%EC%A0%9D%EC%85%98-%EC%B7%A8%EC%95%BD%EC%A0%90/)

     

  3. DHCP 클라이언트가 악의적인 DHCP 서버로부터 획득한 값을 쉘 스크립트로 실행할 수 있다. 이 명령어는 루트 권한으로 실행된다.

    (공격방법 참조 Link: https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/)

     

  4. 그 외에 권한을 가지는 데몬에서 Shell 스크립트를 실행할 수 있는 경우,

    이 취약점을 이용하여 데몬의 권한으로 임의의 명령을 실행할 수 있다.

 

 

 


2. 취약점 구현 및 실습

 

2-1.     EXPLOIT-DB Code 활용 테스트 (공격 대상: 발현 시나리오 2. 웹 서비스)

  • 아래의 URL에서 다운로드 받아서 활용 테스트를 할 수 있다.
  • 이번 활용 테스트에서 MSF Console을 사용, 2번째파일 bashcgi.rb를 exploit 폴더에 위치 시킨다.

     

  • MSF Console을 활용하여 bashcgi 모듈에서 적절한 옵션값을 설정한다. ( ls –al )

     

  • 공격 후, WireShark를 활용하여 실제로 어떤 식으로 패킷이 전송되며 어떤 응답이 오는지 확인한다.

    Exploit 명령으로 공격을 실행하면, Server 측에서 200응답(요청 성공)이 수신된다.

     

    요청한 패킷을 보면 User-Agent 헤더가 Bash의 환경변수로 저장되게끔 변조된 것을 확인 할 수 있다.

    수신한 패킷을 보면 hello.txt, nit.cgi, nit.sh, test.sh 파일들이 확인된다.

     

  • 다음은 위와 같은 방법으로 몇 가지 명령어를 변경해서 더 테스트를 진행한다.

    Netstat 명령어 옵션으로 설정 후 공격 결과

    Cat /etc/passwd 명령어 옵션으로 설정 후 공격 결과

     

    Netcat의 Reverse 연결 요청 옵션 설정 후 공격 결과

  • 위 테스트 결과와 같이, 취약점을 이용해서 임의의 코드 실행이 가능하다.

    해당 테스트 공격 시연에서는 Bash로 짜여진 CGI를 사용하였으나, 이 외에도 다음과 같은 경우에도 공격은 성공한다.

     

    • Bash로 짜여진 CGI페이지 외 스크립트 페이지 ( nit.sh )
    • C, Python,PHP으로 짜여진 CGI 는 system/popen(os.system/os.popen, system/exec) 을 사용하는 경우.
    • Perl 로 짜여진 CGI는 Bash Shell을 통해 open/system 함수를 사용하는 경우.

       

또한, 위 공격에서 User-Agent Herder를 변조하여 Bash 환경 변수를 사용하였으나,

이 외에도 환경변수에 저장되는 헤더들은 모두 공격에 활용이 가능하다.

  • HTTP_USER_AGENT
  • HTTP_HOST
  • ACCEPT_LANGUAGE
  • ACCEPT_ENCODING
  • CACHE_CONTROL




04. 결론

1. 취약점 대응방안

 

  1. 마지막으로 기존 bash 명령어에 실행 권한을 제거한다.

     

  • Homebrew 활용
  1. Homebrew에는 이 취약점이 패치 된 bash가 등록되어 있다. 간단하게 두 명령어로 패치를 진행할 수 있다.

     

       

     

2. 취약점 대응 탐지(Snort Rule)정책

Zero Day 취약점은 무한정 패치를 기다릴 수도 없고, 연관 공격이 발생할 우려가 있어, 보안 업무에 있어서 해당 취약점 공격을 탐지하는 패턴(Rule)과 정책을 적용 시켜서 주의 깊게 모니터링 및 차단대응을 해야 한다.

공격 테스트시 캡처한 pcap 파일을 HEX-Editor를 활용하여 드래그 한 모습이다.

일반적인 통신에서는 발생하지 않고, 해당 취약점 공격에서 발생하는 HEX값을 이용하여 정책을 설정한다.

 

 

※Snort Rule 참고: http://kthan.tistory.com/136, http://neospring_.blog.me/50176482644

 

 

위 사진처럼 상위 3개와, ping, nc, wget, curl 을 활용하여 4개의 정책을 생성한다.

  1. alert tcp any any -> any any (msg:" Bash_code_injection_ping"; content:"|28 29 20 7b|"; content:"|48 6f 73 74 3a 20|"; content:"|55 73 65 72 2d 41 67 65 6e 74 3a 20|"; content:"|70 69 6E 67|"; nocase; )
  2. alert tcp any any -> any any (msg:"Bash_code_injection_nc"; content:"|28 29 20 7b|"; content:"|48 6f 73 74 3a 20|"; content:"|55 73 65 72 2d 41 67 65 6e 74 3a 20|"; content:"|6E 63|"; nocase;)
  3. alert tcp any any -> any any (msg:"Bash_code_injection_wget"; content:"|28 29 20 7b|"; content:"|48 6f 73 74 3a 20|"; content:"|55 73 65 72 2d 41 67 65 6e 74 3a 20|"; content:"|77 67 65 74|"; nocase;)
  4. alert tcp any any -> any any (msg:"Bash_code_injection_curl"; content:"|28 29 20 7b|"; content:"|48 6f 73 74 3a 20|"; content:"|55 73 65 72 2d 41 67 65 6e 74 3a 20|"; content:"|63 75 72 6C|"; nocase;)

 

 

 

3. 해당취약점을 조사하며 느낀 점

  • 항상 대단히 크게 이슈가 되는 취약점 들의 공통점은 Open Source로 정리된다.

    Open Source의 장점은 무수히 많지만, 최근 하트블리드(OpenSSL)취약점이나, 이번 쉘쇼크(GNU Bash)취약점 같은 경우 일반적으로 상용 제품 안에서만 사용되는 것이 아니라, 모든 IOT기기를 아우른다. 이번 보고서에 특정 제품을 테스트한 기록은 담지 않았으나, 카페, 학교, 집 에서 흔히 쓰는 IP-Txxx 의 공유기 또한 해당 취약점이 존재한다. 이 뿐만 아니라 IP-TV 모바일 기기 등 이제는 실생활에서 쓰이는 IOT기기가 점점 많아질수록 모듈 단의 취약점의 리스크 는 상상외로 심각하다.

     

    또한 OSX와 리눅스 사건들을 보면 윈도우가 제일 취약 하다는 편견도 깨게 된 셈이다.

    IOT시대에 이르러 이제 리눅스, OSX의 안정성이 더 부각되어야 된다고 생각한다.

     

    마지막으로 우리는, 오픈소스 커뮤니티의 마인드가 가진 고질적인 문제 "내가 아니라면 누군가 하겠지" 라고 생각하는 수동적인 태도를 버리고, 내가 먼저 보안 조치를 하면 어떨까, 사물인터넷(IOT)세상에서 우리는 정말 안전한가 에 대한 경각심을 키워야 한다고 생각한다.

     

      

     

     

05. 참고문헌

 

[1]보안뉴스: http://www.boannews.com/media/view.asp?idx=43170

[2] hacksum: http://hacksum.net/vuln/cve-2014-6271-gnu-bash-%EC%9B%90%EA%B2%A9%EC%BD%94%EB%93%9C-%EC%9D%B8%EC%A0%9D%EC%85%98-%EC%B7%A8%EC%95%BD%EC%A0%90/

[3] NVD: http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169

[4] OSVDB: http://osvdb.org/show/osvdb/112004

[5] CVE: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169

[6] Exploit-DB: http://www.exploit-db.com/exploits/34766/    

[7] Sec.Blog: https://securityblog.redhat.com/2014/09/26/frequently-asked-questions-about-the-shellshock-bash-flaws

[8] TrustedSec: https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/

[9] n0fate: http://forensic.n0fate.com/?p=1256

[10] Seclists: http://seclists.org/oss-sec/2014/q3/690

 

+ Recent posts