보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

Webshell 분류 및 대응방안

2017.02.01

89,162

서비스사업본부 보안분석팀 김미희


1. 개요

2013년 해킹방지워크샵에서 발표된 『2013년 주요 침해사고 사례와 대응』에 따르면, 2010년부터 2013년까지 4년간 발생한 침해사고요인 중 상위요소로 Webshell(이하 웹쉘)이 지목되었다. 물론 이와 같은 수치는 2013년까지에 국한된 것이 아니라 현재까지도 침해사고의 상당부분을 차지하고 있다.

웹쉘을 이용한 공격은 PHP, JSP, ASP, ASP.NET등 SSS(Server Side Script, 이하 SSS)언어로 구성된 파일을 이용하여 공격자의 명령을 수행하게 하는 공격방식을 의미한다. 물론 WEB/WAS의 설정방식에 따라서 위에 언급된 확장자 이외에도 SSS언어로 구동될 수도 있다.

이번 호에서는 지속적인 침해사고 요인으로 언급되고 있는 웹쉘 파일의 특징에 대해서 분석해보고 특징에 따른 웹쉘을 이용한 공격의 대응방안에 대해서 알아보고자 한다.


2. Web Application Architecture

우선 웹쉘이 실행될 수 있는 Web Application 환경에 대해 알아야 한다. 웹쉘이 구동하기 위해서는 Web Application의 SSS와 CSS(Client Side Script, 이하 CSS)에 대한 이해가 필요하다.

[그림 1] Web Application Architecture에서 살펴보면, 홈페이지가 구동하기 위해서는 HTTP(HyperText Transfer Protocol)를 통해 WWW상에서 정보를 주고 받게 된다. Server-Side Program에 해당 하는 부분이 바로 PHP, JSP ASP, ASP.NET에 해당하는 SSS를 의미하게 되고, HTML등 Client-Side Program에 해당하는 부분이 CSS를 의미하게 된다.

SSS는 클라이언트가 파일을 HTTP로 요청하면 웹서버(스크립트 엔진)의 정보를 이용하여 DB서버에 접속하여 사용자에게 동적 데이터를 전송하는 것을 기본으로 하며, 최근에는 클라이언트에서 전송한 내용의 동적 데이터 생성 뿐만 아니라 세션을 통한 사용자 구분 및 사용자 별 서비스 제공 등 다양한 기능을 제공하고 있다.


[그림 1] Web Application Architecture

이때 서버에서 사용되는 Server-Side Program이 PHP, JSP, ASP, ASP.NET과 관련된 확장자를 통해서 서비스를 제공하게 되기 때문에 웹쉘이 구동하기 위해서는 해당 확장자의 파일을 사용해서 동작해야 한다.

스크립트 언어

파일 확장자

PHP

php, php3, php4, php5, phtml, inc 

JSP

jsp, jsf 

ASP

Asp, asa, cds, cer 등 

ASP.NET

aspx, asax, ascx, ashx, asmx, axd, config, cs, csproj, licx, rem, resources, resx, soap, vb, vbproj, vsdisco, webinfo 등 


[표 1] Webshell공격에 사용되는 확장자 목록


3. WEBSHELL의 발생원인

웹쉘이 서버에서 동작하기 위한 발생원인에 대해서는 파일업로드 기능의 사용여부로 분류할 수 있다. 파일업로드는 클라이언에 존재하는 파일을 서버에 업로드 하는 기능을 의미한다. 일반적으로 SmartEditor, DaumEditor, 전자정부프레임워크 등의 오픈소스 게시판을 이용하거나 자체 개발한 파일업로드 기능을 이용하여 웹쉘파일의 업로드를 시도하게 된다. 

물론 파일 업로드를 이용하여 웹쉘을 서버에 올리기 위한 방법으로는 SSS나 CSS에 존재하는 파일 확장자 필터링 우회, 이미지 파일 등 정상 확장자 파일 내에 공격코드를 삽입하는 정상 확장자를 이용한 우회 등으로 분류할 수 있다. 파일업로드 공격을 이용한 웹쉘의 업로드 공격방식에 대해서는 IGLOOSECURITY, 월보 2013년 8월, 9월호를 참고하기 바란다.

파일업로드 기능을 이용하지 않고 서버에 웹쉘을 생성하기 위한 방법은 취약점이 있다. Apache Struts2 원격 임의코드 실행 취약점(CVE-2013-2251, CVE-2016-3081, CVE-2016-4438 등 다수)을 이용하여 파일을 생성하는 방식이 대표적인 사례로 볼 수 있다.

구분

상세 구분

사례 예시

파일 업로드 사용여부

확장자 우회

파일 확장자 우회

1) 서버(Server Side Script) 우회

2) CSS(Client Side Script) 우회

취약점

정상 확장자(JPG, PNG등)를 이용한 우회

Hiding Webshell Backdoor Code in Image Files

WEB/WAS

IIS File Parsing Bypass Attack
​Apache Struts2 원격 임의코드 실행 취약점 (CVE-2013-2251, CVE-2016-3081, CVE-2016-4438 등 다수) 

Application (OS, DBMS 등)

Java 0-day Vulnerability
RFI(Remote File Inclusion) Vulnerability
SQL Injection Vulnerability
RFI(Remote File Inclusion) Vulnerability​

Editor

SmartEditor 2.3.3 : 이미지 파일 확장자 미체크
SmartEditor 2.8.2.1 : 파일업로드 취약점
SmartEditor 2.8.2.1 : 파일업로드 취약점 ​

 


[표 4-2] Webshell공격의 발생원인


4. WEBSHELL의 종류

웹쉘은 파일 형태 및 파일 타입 등에 따라서 종류를 분류할 수 있다. 가장 대표적인 분류는 웹쉘을 단독파일로 사용하는 경우와 기존파일에 웹쉘에 사용되는 공격구문이 추가되는 형태로 볼 수 있다.

웹쉘파일은 파일업로드나 취약점을 이용하여 서버에 업로드 하기 때문에 일반적으로 단독파일로 사용하는 경우가 대부분이나 해킹 등의 침해사고로 인하여 기본의 소소코드 내에 웹쉘에 사용되는 공격구문이 삽입되는 경우도 있다.
 

구분

상세 구분

예시

단독파일

Text

단일

한줄웹쉘
Single-line Webshell
One-line Webshell
일구화목마(后门木马)​

ASP : <% eval request(“cmd”) %>
PHP :
JSP : <% ​

Runtime.getRuntime().exec(request.getParameter(“cmd”)%>

 

다중

1개의 파일에
다중 공격구문이
존재하는 경우

ASP : ASPyder, Zehir Asp Shell, ASPXSpy, ASPX Shell
JSP : JspSpy, JspSpyWeb, jFolder, shack2, devilzShell, JSP File Browser, jshell, JspWebshell
JSP : JspSpy, JspSpyWeb, jFolder, shack2, devilzShell, JSP File Browser, jshell, JspWebshell​

기타

Multi Division  Webshell
(다중분할웹쉘) 

공격자가 전송하는 다중분할 피라미터를 웹서버에서 재조합하는 방식

Image

기타

Image Webshell

Image파일 마지막에 공격구문을 삽입하는 방법
Image파일 구조 내에 공격구문을 삽입하는 방법

내용추가

Text

다중

기존에 존재하는 소스코드에 Webshell이 삽입되어 있는 형태


 

 

[표 3] Webshell 분류


단독파일로 웹쉘이 사용되는 경우는 크게 Text형태와 Image형태의 파일로 분류할 수 있다. 

Text기반의 웹쉘 파일은 3가지로 분류할 수 있다. 단일 명령어로 구성된 한줄웹쉘(Single-line Webshell, One-line Webshell,  일구화목마로도 불림), 다중 명령어로 구성된 다중웹쉘,  공격명령을 분할해서 보내면 웹쉘파일 내에서 조합해서 사용하는 다중분할웹쉘로 분류된다.

한줄웹쉘의 경우에는 다중웹쉘과 다르게 공격명령을 수행할 수 있는 명령어 1개를 단독으로 사용하기 때문에 웹쉘을 구분할 수 있는 별도의 네이밍이 존재하지 않으나, 다중웹쉘의 경우 ASPXSpy나 b374k-shell, JspSpy와 같이 웹쉘에 시그니처를 통해서 웹쉘을 구분하는 네이밍이 존재하게 된다.

Image기반의 웹쉘의 경우에는 2가지로 분류할 수 있다. Image기반의 Webshell은 Image파일 마지막에 공격구문을 삽입하는 방식과 Image파일 속성에 공격구문을 추가하는 방식으로 분류된다. 

Image파일 마지막에 공격구문을 삽입하는 방식은 Image파일의 내용을 Editor에서 수정하거나 파일업로드 공격 시도 시에 Proxy Tool을 이용하여 변조가 가능하다. Image파일의 속성에 공격구문을 추가하는 방식으로 대표적인 방식은 PNG파일의 이미지 픽셀정보가 저장되는 IDAT chunk에 공격구문을 저장하는 방식이다.

PNG파일 속성 내에 공격코드를 삽입하는 방식에 대해서는 IGLOOSECURITY, 월보 2015년 8월호를 참고하기 바란다.


[그림 2] PNG파일을 이용한 PHP 공격코드 삽입 방법


5. Webshell의 탐지방안

웹쉘을 탐지하기 위해서는 크게 4가지 방안이 존재한다. 이 중에서 은 WEB/WAS마다 상이한 대응방안이 필요한 “Server(WEB/WAS)단의 대응방안”과 앞서 IGLOOSECURITY, 월보 2013년 8월, 9월호, 월보 2015년 8월호의 TechNote에서 다양한 사례를 통해 확인할 수 있었던 “Source Code단의 대응방안”을 제외하고, “WAF/IDS등 보안장비단의 탐지”와 “침해사고 흔적 분석”의 관점에서 탐지방안에 대해서 설명하고자 한다.


[그림 3] 웹쉘 탐지 및 대응방안


1) WAF/IDS 등 보안장비단의 탐지

보안장비를 통한 대응방안으로는 오픈소스 기반의 웹쉘에서 사용되는 공격방식을 이용하여 탐지가 가능하다. 

① 파일 확장자 탐지 : 파일업로드 기능을 이용하여 SSS에 공격코드가 존재하는 웹쉘파일을 업로드 시에 웹쉘의 확장자를 가지고 탐지하는 방식
② OS명령어 탐지 : 웹쉘 업로드 완료 시에 웹쉘파일을 이용하여 클라이언트에서 공격명령을 전송하여 전송된 결과를 확인하는 경우 전송되는 공격명령을 가지고 탐지하는 방식
③ 코드 실행함수 탐지 : 파일업로드 기능을 이용하여 SSS에 공격코드가 존재하는 웹쉘파일을 업로드 시에 웹쉘 파일내에 존재는 공격명령어 실행함수를 탐지하는 방식

가장 먼저 파일 확장자를 이용한 탐지방식은 Multipart를 이용한 파일업로드 공격방식의 사례로 설명할 수 있다. 먼저 Multipart를 이용하여 정상이미지 파일을 업로드 시에 Multipart내에 공격코드를 삽입한다.


[그림 4] Multipart를 이용한 파일업로드 공격방식의 일부


이와 같은 경우에는 [표 4]와 같은 snort를 이용하여 탐지가 가능하다.


 alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WebShell - Generic - PHP tags"; flow:established,to_server; content:"


[표 4] 파일확장자를 이용한 탐지방안

마지막으로는 OS명령어와 코드 실행함수를 통한 탐지방안이다. 이를 위해서는 우선 OS명령어 탐지방안을 위해서는 웹쉘에서 자주 사용되는 함수 목록에 대한 정리가 필요하다.

구분

사용 예

자주 사용되는 함수

JSP

Runtime.getRuntime().exec(“value”)

1. 시스템 명령을 실행하는 함수

system, passthru, shell_exec, exec, popen, proc_open

 

2. 코드 실행 및 암호화

eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

 

3. 파일 생성을 포함하는 함수

require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite

 

PHP

shell_exec($value)

passthru($value)

system($value)

exec($value)

popen($value)​

ASP

execute request(“value”)

eval request(“value”)

CreateObject("WSCRIPT.SHELL")

exec(“value”).stdout.readall

run(“value”)​

ASP.NET

ProcessStartInfo()

start(“value”)​


[표 5] 웹쉘에서 자주 사용되는 함수 목록


앞서 설명한 웹쉘에서 자주 사용되는 목록 중에서 ASP에서 자주 사용되는 한줄웹쉘의 사례를 통해서 설명하고자 한다. 우선 설명하는 환경은 IIS에서 ASP가 구동중인 환경의 사례이며, 파일업로드 또는 취약점을 이용하여 [표 6] ASP 한줄웹쉘을 서버에 업로드한다.


 <%eval(request(“cmd"))%>


[표 6] ASP 한줄웹쉘


ASP 한줄웹쉘을 이용하여 “ipconfig”명령어를 수행하기 위해서는 [표4-7] IPCONFIG 명령어를 수행하기 위한 공격 명령어의 BEFORE의 명령어를 한줄웹쉘의 cmd파라미터에 삽입하기 위해서 AFTER와 같이 한 줄의 공격명령어로 변환을 해준다.


 BEFORE

 <%

Set oS = Server.CreateObject("WSCRIPT.SHELL")

output = oS.exec("cmd.exe > /c " & request("command")).stdout.readall

response.write output

%>​

 AFTER

 response.write(Server.CreateObject("WSCRIPT.SHELL").("cmd.exe > /c [command]").stdout.readall

* [command]부분에 출력하고자 하는 명령어 삽입​


[표 7] IPCONFIG 명령어를 수행하기 위한 공격 명령어


위의 과정을 거치면 [표4-6] ASP 한줄웹쉘을 이용하여 IPCONFNIG명령의 결과를 확인하기 위해서는 [표1-8]과 같이 URL에 공격구문을 삽입하면 정상적으로 결과를 확인이 가능하다.

[표 8] ASP 한줄웹쉘을 이용한 공격명령어 실행 모습


위의 공격방식을 토대로 탐지패턴을 생성하면 다음과 같다.


 alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WebShell - Generic - ASP Wscript.Shell"; flow:established,to_server; content:"CreateObject(|22|Wscript.Shell|22|)"; nocase; pcre:"/^.{0,250}?x2e(run|exec)/Rsi";)


[표 9] OS명령어를 이용한 탐지방안


 alert tcp any any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WebShell - Generic - ASP eval request"; flow:established,to_server; content:"eval"; nocase; content:"request"; nocase; within:10; pcre:"/eval[x28s]{1,3}request[x28x2e]/i";)


[표 10] 코드 실행함수를 이용한 탐지방안


2) Webshell로 인한 침해사고 분석

마지막으로 웹쉘로 인해 침해가 발생된 경우 웹쉘의 특징에 따른 분석방안에 대해서 설명하고자 한다. 웹쉘로 인해 침해사고가 발생되면 웹쉘파일의 특징을 알게 되면 분석이 쉬워진다.

앞서 [표 3] Webshell 분류를 통해서 분류한 웹쉘 분류방식을 토대로 확장자제한 우회, 사이즈제한 우회, 명령어 수행탐지, 웹로그에서 공격명령어 기록여부 4가지에 대해서 분류해보았다.

확장자제한 우회는 파일업로드 기능을 이용하여 웹쉘을 업로드 하는 경우 SSS나 CSS에 첨부파일의 확장자 필터링 구문을 우회하는 기능을 의미한다. 사이즈제한 우회의 경우 이미지 등 문서에 비해서 상대적으로 파일 사이즈가 작은 파일만 업로드가 필요한 경우 파일 사이즈를 제한한 경우를 의미한다. (파일사이즈 제한 필터링 구문을 Proxy Tool등을 통해 우회하는 방식은 제외)

명령어 수행탐지의 경우 웹쉘업로드가 되었을 때 웹쉘을 이용하여 공격구문을 전송할 때 공격구문에 OS명령어 등이 존재하는 경우를 의미한다. 웹로그에서 공격명령어 기록여부는 OS명령어 등 공격자가 수행한 공격명령이 로그상에 존재하는 것으로, GET 파라미터를 통해서 전송되는 공격명령어에 대한 기록을 의미한다.

구분

상세 구분

확장자 제한 우회

사이즈 제한 우회

명령어 수행 탐지

웹로그에서 공격 명령어 기록 여부

1

한줄 웹쉘

Ⅹ 

○ 

○ 

○ 

2

1개의 파일에

다중 공격구문이

존재하는 경우​ 

Ⅹ 

△ 

△ 

Ⅹ 

3

Multi Division  Webshell

(다중분할웹쉘)​ 

Ⅹ 

△ 

△ 

Ⅹ 

4

Image Webshell 

○ 

○ 

○ 

○ 

5

기존에 존재하는 소스코드에 Webshell이 삽입되어 있는 형태 

○ 

○ 

△ 

○ 


[표 11] Webshell 분류별 탐지우회가능여부

웹쉘종류에 따라서 하나씩 살펴보면 다음과 같다. 이미지 웹쉘과 기존의 소스코드에 웹쉘코드를 삽입하는 경우를 제외하고는 확장자제한을 우회할 수 없다.  사이즈제한 우회의 경우에는 앞선 제약조건을 기준으로 보게되면 다중웹쉘, 다중분할웹쉘은 일반적인 이미지 사이즈보다 파일사이즈가 크기 때문에 사이즈제한에 탐지될 수 있다.

명령어 수행탐지과 웹로그 상에서 공격명령어 기록여부는 밀접한 관련이 있는데 한줄웹쉘과 이미지 웹쉘의 경우 공격명령어를 GET 메소르를 이용하여 [표 4-8] ASP 한줄웹쉘을 이용한 공격명령어 실행 모습같이 파라미터에 추가되어 실행되기 때문에 탐지가 가능하고 웹 로그에 공격구문이 기록되게 된다.

다만, 다중웹쉘, 다중분할웹쉘의 경우 공격명령어가 POST로 전송되거나 공격명령어가 분할되서 전송되기 때문에 명렁어 수행탐지나 웹 로그상에서 공격흔적을 발견하기가 어렵다.

구분

상세 구분

확장자 제한 우회

사이즈 제한 우회

명령어 수행 탐지

웹로그에서 공격 명령어 기록 여부

1

한줄 웹쉘

Ⅹ 

○ 

○ 

○ 

2

1개의 파일에

다중 공격구문이

존재하는 경우​ 

Ⅹ 

△ 

△ 

Ⅹ 

3

Multi Division  Webshell

(다중분할웹쉘)​ 

Ⅹ 

△ 

△ 

Ⅹ 

4

Image Webshell 

○ 

○ 

△​ 

Ⅹ​ 

5

기존에 존재하는 소스코드에 Webshell이 삽입되어 있는 형태 

○ 

○ 

△ 

○ 

 

[표 12] Webshell 분류별 탐지우회가능여부


6. 결론

지금까지 웹쉘에 사용되는 함수별 특징과 이를 이용한 대응방안에 대해서 살펴보았다. 웹쉘을 이용한 공격방식은 파일업로드 취약점 또는 WEB/WAS등의 취약점, Misconfiguration등을 이용하여 SSS에 공격명령어를 삽입하는 공격방식이다.

웹쉘은 웹쉘을 구성하는 파일의 형태 및 공격명령어 전송방식에 따라서도 탐지를 하기 위한 방식이 크게 달라지게 된다. 따라서 오픈소스 기반의 웹쉘파일들에 대한 분석과 그에 따른 적절한 탐지방안의 적용이 필요하다. 

이번 호에서 언급된 WAF/ IDS등 보안장비단의 탐지이나 웹쉘로 인한 침해사고 흔적 분석 이외에도 기본적으로 웹쉘탐지를 위해 수행되어야 하는 기본적인 사항들에 대해서 대응한다면 웹쉘로 인한 피해를 줄일 것으로 생각된다.


7. 참고자료

[1] 2013년 주요 침해사고 사례와 대응
[2] IGLOOSECURITY, 월보 2013년 8월, 9월호
[3] IGLOOSECURITY, 월보 2015년 8월호