'사라지기엔 너무 아쉬운 자료들...'에 해당되는 글 1건

https://teamcrak.tistory.com/380?category=180158

 

Shellshock 분석 및 테스트

Shellshock 분석 및 테스트 maz3 (maz3@a3security.com) CrazyPure (jschoi@a3security.com) Shellshock 취약점은 리눅스를 포함한 유닉스 계열 운영체제에서 사용되는 명령어 실행 툴인 bash로부터 발생하는 취약..

teamcrak.tistory.com

 

 

 

https://www.krcert.or.kr/filedownload.do?attach_file_seq=869&attach_file_id=EpF869.pdf

불러오는 중입니다...

 

20141112_GNU_Bash_원격코드실행_취약점_이슈분석_및_대응방안_보고서.pdf
0.85MB

https://m.blog.naver.com/renucs/220144713558

 

Bash 취약점(CVE-2014-6271) 원리 및 공격기법의 이해

올 해 Heart Bleed 이후 가장 파급력이 크다는 bash 쉘쇼크(Shell shock) 취약점으로 인해 며칠 간 보안...

blog.naver.com

 

1. bash 취약점 확인 방법

bash 취약점은 간단하게 확인 할 수 있습니다. 프롬프트 상에서 

 env x='() { :;}; echo vulnerable' bash -c "echo test"

​명령을 실행하는 것 만으로도 확인이 가능합니다. 

 

<그림 1> 환경변수 x='() {:;}' 이 후 명령이 수행 사례 

 

 

환경변수 설정을 하는 env 를 통해 환경변수 x = (함수명) {수행코드}; 라고 환경변수를 등록하는 ; ② 까지는 정상적인 동작이나, 그 이후에 삽입되어 있는 echo vulnerable' bash -c "echo test" ③의 명령어는 무시되거나 오류를 발생해야 하지만 실제로는 수행이되어 화면상에    

vulnerable 
test

를 출력하는 것을 알 수 있습니다.

전형적인 입력값 유효성 검증이 정상적으로 수행되지 않은 버그 이며 이를 통해 다양한 공격이 가능합니다.

 

2. bash를 통한 공격

bash 취약점이 보고 되고 몇몇분들이 콘솔이나 ssh 같은 터미널 접속만 차단되면 크게 문제가 없지 않느냐는 이야기를 했습니다. 하지만 콘솔 환경이 아니더라도 bash 수행이 가능한 몇 가지 환경이 있는데 가장 알기쉬운 웹서비스 요청 환경을 가정하여 공격 시나리오를 만들어 보도록 하겠습니다.

 

1) CGI 요청을 통한 bash 수행

 

웹 서버에 bash를 이용한 CGI 실행 설정이 되어 있는 경우, 사용자가 해당 cgi 페이지를 요청하면 웹서버에서 요청 결과를 bash 에 전달하고 수행 결과를 받아 사용자에게 응답을 해주는 동작 구조를 가지고 있습니다.

즉, 브라우저 요청 패킷에 bash 취약점 코드를 삽입하여 전송하면 해당 코드가 bash에서 실행이 가능합니다.

 

2) 일단 테스트 환경에서 Apache에 cgi 실행이 가능하도록 설정을 한 후 테스트를 위한 간단한 cgi 코드를 작성합니다.

 

 

사용자에게 ShellShock Test 라는 문장을 화면에 출력해주는 간단한 코드 입니다.

테스트 삼아 해당 페이지를 호출해 볼까요?

 

 

의도한 대로 잘 출력 되는것을 확인 할 수 있습니다.

 

3) 요청 헤더에 bash 취약점을 이용한 명령어 삽입

HTTP요청 헤더에 쉘코드를 삽입하는 방법은 여러가지가 있습니다. curl 같은 웹페이지 요청 유틸을 사용 할 수도 있고 파이썬 같은 스크립트 언어로 간단하게 구현 할 수 도 있습니다.

본 포스팅에서는 가장 손쉽게 요청 메세지를 조작 할 수 있도록 프록시를 사용하겠습니다.

 

우선 테스트로 만들어 둔 cgi 페이지를 정상적으로 요청 할 경우 패킷 입니다.

별 특이 사항은 눈에 띄지 않습니다. (프록시는 Burp Suit 가 수고해 주셨습니다.)



다음은 HTTP 요청의 헤더부분 중 사용자 브라우저 정보를 담고 있는 User-Agent 부분에 bash 명령어를 삽입합니다.(Cookie, Referrer 등 다른 헤더값 이라도 상관없습니다.)

 

 

() { :;}; echo bashtest>/tmp/test 라는 명령어를 헤더에 삽입하여 "bashtest" 라는 문자를 /tmp 디렉토리에 test라는 파일을 생성하여 기록하도록 합니다.

 

해당 요청 조작이 완료되면 패킷을 전송합니다. 그 결과는. . 

 



브라우저에 500코드 내부 오류가 발생했다는 메세지를 출력해 줍니다.

일단 전송은 정상적으로 된 듯 하니 실제로 해당 명령이 정상적으로 수행되었는지 확인해 보겠습니다.

 

4) 결과 확인

 

 

/tmp 디렉토리에 test 라는 파일이 생성된 것을 확인 할 수 있고, test 파일의 내용을 보니 브라우저로 요청했던 bashtest 라는 문자열이 저장되어 있는 것을 볼 수 있습니다.

 

실제 테스트에 사용한 명령은 PoC코드라 단순하게 파일 생성 기능만 수행했으나, wget 으로 특정 악성코드를 다운로드 받아 실행하거나 서버내부의 환경설정 파일을 읽어온다던가 리버스커넥션을 통한  백도어를 만드는 것도 가능합니다. 즉, 원격으로 모든 명령어 실행이 가능하다는 것 입니다.

 

3. 대응 방법

가장 간단한 방법은 bash 패치를 수행하면 됩니다.

 yum -y update bash (레드헷 계열 기준) 

yum 이나 atp-get 을 사용 할 수 없는 환경이라면 직접 재 컴파일이 필요하지만, bash 같은 쉘 프로그램을 직접 컴파일 하기에는 아무래도 부담 스럽겠죠;

 두번째 방법은 임시 조치지만 SNORT 같은 N-IDS 에서 HTTP HEADER 값에 () {  라는 문자열이 포함되어 있는지 Rule 을 세팅하여 탐지하는 방법이 있습니다.(일반적인 경우라면 http 헤더값에 () { 이 들어 갈 일이 없겠죠)

 

 

<패치 후 에는 더이상 vulnerable 출력 명령이 수행되지 않습니다>

블로그 이미지

wtdsoul

,