본문 바로가기

Web

웹쉘 (WebShell)

. 정의

웹쉘은 공격자가 원격에서 웹서버에 명령을 수행할 수 있도록 작성한 웹스크립트(asp, php, jsp, cgi ) 파일이다이때 zip, jpg, doc와 같은 데이터 파일종류 이외에 악의적으로 제작된 스크립트 파일인 웹쉘을 업로드하여 웹 서버를 해킹하는 사고가 빈번하고 있다. 이와 같이 서버 명령을 실행할 수 있는 웹쉘을 이용하여 웹서버에 명령을 실행해 관리자 권한을 획득한 후 웹 페이지 소스코드 열람, 서버내 자료 유출, 백도어 프로그램 설치 등의 다양한 공격이 가능하다. 최근에는 파일 업로드뿐만 아니라 SQL Injection과 같은 웹 취약점을 공격한 후 지속적으로 피해 시스템을 관리할 목적으로 웹쉘을 생성하거나, 아주 일부분만을 피해시스템에 업로드하는 등 그 유형이 나날이 발전하고 있다.




. 웹쉘의 위험성

많은 피해 웹서버 중 웹쉘이 발견되는 웹 서버는 약 90% 정도이다. 이것은 공격자들이 취약점을 공격 한 후 웹쉘을 업로드 하여 시스템을 통제하기가  수월 하다 보니 사용 빈도가 높은 것을 확인할 수 있다.


웹 취약점을 통해 피해시스템에 접근한 공격자는 방화벽에서 접근을 허용하는 HTTP (TCP 80)서비스를 통해 피해 시스템을 제어 하므로 웹쉘을 차단하기가 쉽지 않다. 또한 일반적인 서버관리자들은 해킹여부를 확인하기 힘들고, 피해를 인지하더라도 관리자들이 주로 사용하는 백신 프로그램에서 웹쉘 탐지가 안되는 경우가 빈번히 발생하며, 탐지가 된다고해도 공격자들은 스크립트 웹쉘들을 빈번히 변경시켜 사용하기 때문에 백신들로서는 탐지하기가 쉽지 않아 웹쉘을 찾기가 쉽지 않다. 관리자들이 해킹 피해를 인지하고 시스템을 재설치 하더라도 이전에 웹쉘이 업로드 되어 있는 소스 그대로 새롭게 설치한 시스템에 복사하여, 사용하기 때문에 지속적으로 웹쉘을 관리하는 공격자에게 피해를 입게 된다.



. 웹쉘 동향

① 인증된 공격자만 사용가능 하도록 패스워드를 입력 받거나, 특정 세션 값으로 세팅해야만 기능 들을 사용할 수 있는 웹쉘들이 많다.

② ASP Eval, Execute메소드 등은 원격에 있는 공격자로부터 웹쉘 실행코드를 전달 받아 실행 하는데 많이 이용되고 있다. 이같은 Eval, Execute 코드는 정상적인 스크립트 파일에도 삽입이 가능해 웹쉘 탐지가 더욱 어려워 지고 있다.

     - 참고 -

     Eval 메소드 : string(문자열 저장)을 자바스크립트 코드로 변환해 주는 메소드

     Execute 메소드 : 질의어, SQL 문장, 프로시저 등을 실행시켜 주는 메소드

③ 최근 각 백신사, 관리자들에 의해 웹쉘 탐지가 늘어 공격자들은 여러 기능을 하는 웹쉘 코드를 각 기능별로 웹쉘들을 분리하여 사용하고 있다. 그 중 파일 생성 기능, DB쿼리 기능을 하는 웹쉘 파일들이 빈번하게 발견되고 있다.

④ ASP 스크립트의 경우 웹 소스를 보호하기 위해 인코딩하는 Script Encoder를 제공하고 있다. 이러한 인코더를 악용하여 웹쉘을 인코딩하고 백신 탐지를 우회하고 있다.

⑤ 공격자들은 웹쉘이 업로드 되어 있는 피해 시스템 웹쉘 URL을 관리하기 위해 관리프로그램들을 사용하고 있다. 중국 해커들은 다음과 같은 관리 프로그램을 개발하여 자신들이 장악했던 피해 사이트들을 체계적으로 관리하고 있다.




탐지 방안

1) 웹쉘 시그니처를 이용한 파일 검색

① 시그니처

웹쉘은 시스템 명령어를 수행하거나 파일을 조작하기 위해 관련된 오브젝트, Wscript.Shell, Shell.Application등을 주로 사용하게 된다. 하지만 이러한 오브젝트는 정상적인 스크립트 코드에서는 사용하지 않는 것들로 웹쉘 탐지를 위한 시그니처로 지정하여 웹쉘을 탐지하는데 이용할 수 있다. 이렇게 시그니처로 지정 할 만한 문자열들을 찾아본 결과 다음 과 같다.

Wscript.Shell, Shell.Application과 같은 시스템에 접근할 수 있는 오브젝트나 메소드

인코딩된 파일에 삽입된 헤더 문자열 VBScript.Encode

중국어 간체 gb2312 (웹쉘이 중국에서 제작된 것이므로 본 키워드가 포함되 어 있으나 이는 중국어로 제작된 정상적인 파일에도 포함되고 있으므로 유의해야 함)

시스템 명령어에 필요한 문자열 cmd.exe

정상적인 스크립트에서 흔히 사용되지 않는 eval, execute 함수 등

 cmd\.exe  

  Wscript.Shell

 Shell\.Application

 execute *\( ? *session

 execute *\( ? *request

 eval *\( ? *request

 Webshell

 Lake2

 Hack520

 VBScript\.Encode

 Gb2312

 lcxMarcos

 .run.*>

 \.exec *\(

 marcos


 findstr 명령어를 활용한 탐지 방법

findstr 명령어는 지정된 파일들에서 찾고자 하는 특정 문자열들을 검색할 수 있도록 도와준다. 위에서 정의된 시그니처들을 파일(ex :abc.sig)로 지정하하고, 사이트 홈 디렉토리에서 아래와 같이 실행한다.


findstr /i/r/s /g :abc.sig *.asp 또는 *.php 


i : 대소문자 구분없이 검색

g : 지정된 파일에서 검색 문자열을 받음

r : 정규 표현식 사용

s : 모든 하위디렉터리 검색


최근 공격자들이 웹쉘 확장자를 .cer, .asa, .cdx, .hta로 변경하여 파일을 업로드 하는 경우가 있다. (파일 업로드 우회 공격) 반드시 검사 확장자를 asp php 뿐만 아니라 스크립트로 실행되도록 지정된 .asa, .cer등도 반드시 함께 검색 하도록 해야 한다.


2) 웹쉘 로그 시그니처를 이용한 웹 로그 검색

① 시그니처

최근 대부분의 웹쉘들은 POST 방식으로 관련 데이터들을 전송하기 때문에 웹로그에서 웹쉘이 실행된 흔적을 찾기가 쉽지 않다. 하지만 많은 웹쉘들은 실행할 메뉴들을 GET 방식으로 전달하여 이러한 로그들을 대상으로 시그니처를 추출 할 수 있다.


다음은 인터넷침해사고대응지원센터(www.krcert.or.kr)에서 피해시스템에서 수집된 웹쉘을 테스트하여, 웹쉘 실행여부를 확인할 수 있는 시그니처를 추출하였다.


Action=MainMenu

Action=Show1File

Action=EditFile

Action=DbManager

Action=getTerminalInfo

Action=ServerInfo

Action=Servu

Action=kmuma

Action=kmuma&act=scan

Action=Cplgm&M=2

Action=plgm

Action=PageAddToMdb >

Action=ReadREG

Action=ScanPort

Action=Cmd1Shell

Action=UpFile

(pageName|id|list|action|act)=ServiceList

(pageName|id|list|action|act)=ServiceList
(pageName|id|list|action|act)=infoAboutSrv
(pageName|id|list|action|act)=objOnSrv
(pageName|id|list|action|act)=userList
(pageName|id|list|action|act)=WsCmdRun
(pageName|id|list|action|act)=SaCmdRun
(pageName|id|list|action|act)=SaCmdRun&theAct
(pageName|id|list|action|act)=FsoFileExplorer
(pageName|id|list|action|act)=FsoFileExplorer&theAct
(pageName|id|list|action|act)=FsoFileExplorer&thePath
pageName=MsDataBase
pageName=MsDataBase&theAct=showTables
pageName=TxtSearcher
pageName=OtherTools
act=scan
Action=mainwin
action=listtb
action=listvw
action=searchfile
action=xpcmdshell
(action|act)=cmdshell
action=mainmenu
action=showfile
action=editfile
action=course
action=serverinfo
action=upfile
action=dbmanager
ex=edit&pth=
PageName=PageUpload&theAct
PageName=PageWebProxy&url=
productName=HigroupASPAdmin
PageWebProxy
aCTiON=cMd
aCTiON=ClonETiMe&SrC=
aCTiON=SqLrOotKIt
aCTiON=Reg
aCTiON=DAtA
aCTiON=Goto&SrC=C:\
aCTiON=uPFIlE&SrC=
aCTiON=NEw&SrC=
act=info
act=filemanage
act=edit&src=
act=del&src=
act=rename&src=
DirName=
Type=.*FileName=.*\
Type=.*ok=dir
FsoFileExplorer
WsCmdRun
SaCmdRun
MsDataBase
HigroupASPAdmin
=cmd
ClonETiMe
SqLrOotKIt

위의 탐지 방법에서 제공한 시그니쳐들은 오탐이 발생할 수 있으므로 반드시 웹쉘인지 철저히 확인 후, 삭제해야 한다.



Ⅴ.예방 대책

1) 웹 서버의 파일 업로드 취약점 제거

- 파일 업로드가 불필요한 게시판의 경우는 업로드의 기능을 완전히 제거하고, 필요한 경우에는 파일의 확장자를 체크한다. 업로드를 제한하는 asp, chi, php, jsp 등의 확장자를 막는 방법으로 구현하는 것보다 허용하는 확장자 즉, txt, hwp, doc, pdf 등의 업로드 가능한 파일 확장자만 올릴 수 있도록 체크하는 것이 바람직하다. 그 이유는 특정 확장자만 막는 경우에는 우회해서 올릴 수 있는 방법들이 존재하기 때문이다. 또한 Php, Asp, jSp 등의 대소문자 혼용 및 .txt.asp등의 2중 확장자의 형태도 필터링 해야 한다.


2) 파일 업로드 폴더의 실행 제한

웹서버의 파일 업로드 전용 폴더를 만들고 전용 폴더의 스크립트 파일 실행을 제한하여 해당 폴더내에 있는 파일이 실행되지 않도록 해야 한다.


윈도우 서버의 경우 [설정]-[제어판]-[관리도구]-[인터넷서비스관리자] 에서 마우스 오른쪽 버튼을 클릭하여 [등록정보] [디렉토리]를 선택해 실행권한을 없음으로 설정한다.


리눅스의 경우 httpd.comf와 같은 웹서버 설정 파일에서 변경한다.


3) SQL Injection 방지

웹쉘 공격은 파일 업로드 취약점 뿐만 아니라 SQL Injection을 이용해서도 가능 하므로 DB쿼리문에 삽입하여 사용하는 모든 경우에 이러한 필터를 적용하여 단 한 개의 페이지에서라도 SQL Injection의 허점이 존재하지 않도록 주의해야 한다.