정보보안(구버전)/DVWA 2019. 3. 10. 12:01

DVWA - 08. Remote Execution Shellshock 공격 패턴 분석 및 스노트 룰 설정

 

 

본 내용은 DVWA를 이용한 OWASP Top10 취약점 진단 및 웹-해킹 내용이 아니라, Snort를 이용한 DVWA 취약점 및 공격 패턴을 진단하는 실습 환경입니다.

 

 

1. Using Known Vulnerable Components

 

 - OWASP Top10 A9 - 알려진 취약점이 있는 구성 요소 사용

 - 슈퍼유저 권한으로 운영되는 취약한 라이브러리/프레임워크, 기타 SW 모듈로 인한 데이터 유실 및 서버 권한 획득이

   가능한 취약점이다.

 

 

 

2. Shellshock Vulnerability(CGI)

 

 - Bash Shell : 사용자가 CLI 기반에서 명령어를 입력하면 운영체제가 이에 대응하는 동작하게 하는 명령어 해석기이다.

 - Bash Shell Bug : Bash로 해당 명령을 실행했을때, 그에 대응하는 결과 뿐만 아니라, 다른 결과까지 실행되는 버그이다.

 - Bash Shell Bug 관련 기사

 

http://www.edaily.co.kr/news/NewsRead.edy?SCD=JE41&newsid=01387446606224712&DCD=A00504&OutLnkChk=Y

http://www.ddaily.co.kr/news/article.html?no=122932

 

 

 - exploit-db 사이트(https://www.exploit-db.com/)를 이용하여 Bash Shell Bug 관련된 내용을 찾아보도록 한다.

 

 

 

 

바로가기 : https://www.exploit-db.com/exploits/34765

Exploit Database Note:
The following is an excerpt from: https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/
 
Like “real” programming languages, Bash has functions, though in a somewhat limited implementation, and it is possible to put these bash functions into environment variables. This flaw is triggered when extra code is added to the end of these function definitions (inside the enivronment variable). Something like:
 
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 vulnerable
 this is a test

 
The patch used to fix this flaw, ensures that no code is allowed after the end of a bash function. So if you run the above example with the patched version of bash, you should get an output similar to:
 
 $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 bash: warning: x: ignoring function definition attempt
 bash: error importing function definition for `x'
 this is a test

 

 

 

env x='() { :;}; 명령어는 함수를 이용한 환경변수 설정의 기본 형식이다. 만약, 명령어 끝나는 ; 뒤에 명령어는 오류가 발생하거나, 실행되지 않는게 원칙이다. 취약점이 있는 경우에는 echo vulnerable의  환경 변수를 이용하여 "echo this is a test" 를 실행하게 된다. 이때 { :;}; 에서 ':'는 참을 의미하기 때문에 무조건 함수가 실행된다.

 

다음과 같이 테스트를 실시한다.

 

 

root@kim-virtual-machine:/home/kim# env x='() { :;}; echo cisco' bash -c "echo this is a test"
cisco
this is a test

 

root@kim-virtual-machine:/home/kim# env x='() { :;}; cat /etc/passwd' bash -c "echo this is a test"
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync

~ 중간 생략 ~


 

 - 함수 선언 뒤에 임의의 명령어를 삽입했을 경우, 유효성 검증 단계 없이 명령어를 실행한다.

 - Bash Shell Bug 취약점을 갖고 있는 대표적인 버전은 다음과 같다.

 

bash-4.2.45-5.el7_0.2    
bash-4.1.2-15.el6_5.1
bash-4.1.2-15.el6_5.1.sjis.1
bash-4.1.2-9.el6_2.1    
bash-4.1.2-15.el6_4.1    
bash-3.2-33.el5.1   
bash-3.2-33.el5_11.1.sjis.1   
bash-3.2-24.el5_6.1   

bash-3.2-32.el5_9.1
bash-3.2-32.el5_9.2   
bash-3.0-27.el4.2

 

 

 - 현재 Bash 버전을 확인한다.

root@kim-virtual-machine:/home/kim# dpkg -l bash
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-f/Unpacked/Failed-cfg/Half-inst/t-aWait/T-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  bash           3.2-0ubuntu16  The GNU Bourne Again SHell

 

 

 

3. Using Known Vulnerable Components - Shellshock Vulnerability(CGI)

 

 - CGI가 발생하는 필드에 쉘 쇼크 코드를 입력하여 리버스 쉘을 획득하거나 다른 명령을 실행할 수 있다.

 

 

 

4. Remote Execution Shellshock 공격 패턴 분석

 

8-0. Remote Execution Shellshock.log

8-1. Remote Execution Shellshock 공격 패턴.txt

 

 

 

5. Snort 룰 설정

 

8-2. Remote Execution Shellshock 스노트 설정.txt

 

root@kim-virtual-machine:~# cd /etc/nsm/rules
root@kim-virtual-machine:/etc/nsm/rules#
root@kim-virtual-machine:/etc/nsm/rules# vi local.rules

# 8. Remote Execution Shellshock
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"8. Remote Execution Shellshock Header"; priority:1; flow:established,to_server; content:"|28 29 20 7b|"; http_header; sid:3000081; rev:1;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"8. Remote Execution Shellshock URI"; priority:1; flow:established,to_server; content:"|28 29 20 7b|"; http_uri; pcre:"/[=?&\x2f]\s*?\x28\x29\x20\x7b/U"; sid:3000082; rev:1;) 
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"8. Remote Execution Shellshock"; priority:1; flow:established,to_server; content:"HTTP/1."; pcre:"/^[^\r\n]*?HTTP\/1(?:(?!\r?\n\r?\n)[\x20-\x7e\s]){1,500}\n[\x20-\x7e]{1,100}\x3a[\x20-\x7e]{0,500}\x28\x29\x20\x7b/s"; content:"|28 29 20 7b|"; fast_pattern:only; sid:3000083; rev:1;)

 

:wq!

 

 

인코딩 내용

 문자열

 ASCII 16진수

 (

 28

 )

 29

 공백

 20

 {

 7b

 \

 5c

 ~

 7e

 /

 2f

 

 

pcre 내용

 pcre

내용 

 [=?&\x2f]\s*?\x28\x29\x20\x7b

=() {

= () {

=    () {
?() {

? () {

?   () {

 [=?&\x2f]

 =, ?, &, /

 \s

 화이트 스페이스(스페이스, Tab)

 *?

 게으른 수량자

 \x28\x29\x20\x7b

 () { 

 

 

pcre 내용-1

 pcre

 ^[^\r\n]*?HTTP\/1(?:(?!\r?\n\r?\n)[\x20-\x7e\s]){1,500}\n[\x20-\x7e]{1,100}\x3a

 [\x20-\x7e]{0,500}\x28\x29\x20\x7b

 내용

 HTTP/1~aaa

 aaa: () {

 HTTP/1~aaa

 aaa: aaa () {

 HTTP/1~aaa
 aaa:aaa() {
 HTTP/1~aaa
 aaa:aaa () {

 

 

pcre 내용-2

 pcre

 내용

 ^[^\r\n]*?HTTP\/1

 HTTP/1

aaaHTTP/1

aaa HTTP/1

aaa   HTTP/1

 ^[^\r\n]

 문자열 시작이 개행 문자를 제외한 나머지

 *?

 게으른 수량자

 HTTP\/1

 HTTP/1

 

 

pcre 내용-3

 pcre

내용 

 ^[^\r\n]*?HTTP\/1(?:(?!\r?\n\r?\n)[\x20-\x7e\s]){1,500}

HTTP/1~aaa

HTTP/1 ~aaa

HTTP/1~ aaa

HTTP/1 ~ aaa

aaaHTTP/1 ~ aaa

aaa HTTP/1 ~ aaa

aaa   HTTP/1 ~ aaa

 ?:

 뒤에 있는 것들'(?!\r?\n\r?\n)[\x20-\x7e\s]'을 그룹화 실시, 이때 ?는 수량자 X

 ?!

 부정 전치탐색, 앞에 'HTTP/1'이 있고, 뒤에 '\r?\n\r?\n'이 없을 경우만 매칭

 HTTP\/1(?!\r?\n\r?\n)

 즉, HTTP/1 다음에 개행(줄바꿈,엔터)가 없어야 매칭됨

 \x20

 공백

 \x7e

 ~

 \s

 화이트 스페이스(스페이스, Tab)

 [\x20-\x7e\s]

 공백부터 ~ 까지(모든 문자열) 공백orTab

 {1,500} 

 문자 개수가 1개에서 500개 수량자, 앞에 그룹에 적용됨

 HTTP\/1(?:(?!\r?\n\r?\n)[\x20-\x7e\s]){1,500}

 HTTP/1 뒤에 개행이 없으며, 모든 문자열/공백이 1글자에서 500글자까지 매칭

 

 

pcre 내용-4

 pcre

내용 

 \n[\x20-\x7e]{1,100}\x3a

 개행(줄바꿈,엔터)가 있으며, 모든 문자열/공백이 1글자에서 100글자까지 매칭하며, 뒤에 :

 

aaa:

   aaa   :

 \n

 개행 문자, 줄바꿈

 [\x20-\x7e]

 공백부터 ~ 까지(모든 문자열)

 {1,100}

 문자 개수가 1개에서 100개까지

 \x3a

 :

 

 

pcre 내용-5

 pcre

내용 

 [\x20-\x7e]{0,500}\x28\x29\x20\x7b

aaa ()공백{ aaa

 [\x20-\x7e]

 공백부터 ~ 까지(모든 문자열)

 {0,500}

 문자 개수가 0개에서 500개까지

 [\x20-\x7e]{0,500}

 모든 문자열/공백이 0글자에서 500글자까지 매칭

 \x28\x29\x20\x7b

 ()공백{

 

 

[참고] CRLF

 

라인피드(LF : Line Feed) : 현재 위치에서 바로 아래로 이동
캐리지리턴(CR: Carriage Return) : 커서의 위치를 앞으로 이동

 

 

root@kim-virtual-machine:/etc/nsm/rules# rule-update

 

 

'rule-update' 에러가 발생하면, 'local.rules' 파일을 수정한 이후 실시함

root@kim-virtual-machine:/etc/nsm/rules# nsm --sensor --restart --only-snort-alert 

 

 

 

6. DVWA 'Remote Execution Shellshock' 취약점 진단 실시

 

 

vulnerabilities 우클릭 -> 공격 -> 'Active Scan' 클릭

 

 

 

Policy 선택 -> 'Start Scan' 버튼 클릭

 

 

 

7. Snort 탐지 결과 확인 및 분석

 

 

Snort -> 'Show Packet Data' & 'Show Rule'를 체크하여 스노트 탐지 분석 실시

 

 

 

 

8. Snort 룰 삭제 또는 주석 처리 실시

 

 

[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)

 

DVWA - 08. Remote Execution Shellshock 공격 패턴 분석 및 스노트 룰 설정   https://youtu.be/XHIEarG_voM

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q