기본 콘텐츠로 건너뛰기

[CVE-2017-5638] Apache Struts2 취약점 분석 정보

 Apache Struts2 취약점(CVE-2017-5638)은 원격 코드 실행 취약점입니다. HTTP Request 헤더의 Content-Type 값을 변조하여 원격 코드실행을 가능하게 합니다. 취약점에 대한 설명을 찾아보면 Content-Type 헤더 필드에 OGNL 표현식을 삽입할 경우 Struts2의 Jakarta 플러그인 오류 처리 과정에서 임의의 코드가 실행될 수 있음을 알 수 있습니다.

 본 문서에서는 Struts 2.3.31 버전을 대상으로 취약점을 분석해 보았습니다. 



공격 코드 동작 확인

 공격 코드를 사용해서 “dir” 명령을 전달하면 다음과 같이 취약한 서버의 파일 목록을 확인할 수 있습니다.

[취약한 서버의 파일 목록을 확인]

 취약한 서버로 전달되는 패킷입니다. Content-Type 항목에 OGNL 표현식으로 작성된 공격코드가 포함되어 있습니다.

[취약한 서버로 전달되는 패킷]



공격 코드 확인

[공격 코드 확인]

 서버에 전달되는 매개 변수 중에 #nike='multipart / form-data'는 공격코드 실행의 토대를 마련합니다.


 #cmd 매개 변수에는 도스 명령어가 지정됩니다. 그리고 취약한 서버의 운영체제를 확인한 뒤에 유형별 공격 명령을 완성합니다.


 마지막으로 공격 명령을 실행합니다.




서버 취약 코드 확인

 서버는 request 요청이 넘어오면 FilterDispatcher Class의 doFilter 메서드를 사용해서 필터 작업을 수행합니다. 그 과정에서 prepareDispatcherAndWrapRequest를 호출하게 됩니다.

[FilterDispatcher.doFilter]

 prepareDispatcherAndWrapRequest는 Request Wrapping 메서드입니다. 해당 메서드는 내부적으로 dispatcher.wrapRequst를 호출합니다.

[FilterDispatcher.prepareDispatcherAndWrapRequest]

 dispatcher.wrapRequst는 다양한 방식으로 전송된 요청에 대한 Wrapping을 수행하는 메서드입니다. Struts2 원격코드실행 취약점(CVE-2017-5638)의 경우 content_type을 'multipart/form-data'로 설정하고 전송하기 때문에 MultiPartRequestWrapper를 호출하게 됩니다.

[dispatcher.wrapRequst]

 MultiPartRequestWrapper.java는 multipart request에 대한 구문을 분석하고 Wrapping 합니다. 이로 인해 구문 분석 메서드인 JakartaMultiPartRequest.parse가 실행됩니다.

[MultiPartRequestWrapper.java]

 구문 처리 과정에서 Content-Type 헤더의 형식을 식별하지 못하므로 예외가 발생하게 되고 JakartaMultiPartRequest.buildErrorMessage가 실행됩니다.

[JakartaMultiPartRequest.parse]

 JakartaMultiPartRequest.buildErrorMessage 내에 존재하는 LocalizedTextUtil.findText는 OGNL 표현식을 실행합니다.

[JakartaMultiPartRequest.buildErrorMessage]

 LocalizedTextUtil.findText의 정의를 살펴보겠습니다. $ {...} 내의 모든 것은 OGNL 표현식으로 간주하고 처리한다고 되어 있습니다. 그 결과 공격코드가 실행되는 것입니다.

\
[LocalizedTextUtil.findText의 정의]

 Struts 2 Core 2.3.4 API에 대한 정의를 간략하게 소개해 놓았습니다. 

※ FilterDispatcher Class

 Master filter for Struts that handles four distinct responsibilities:

- Executing actions
- Cleaning up the ActionContext (see note)
- Serving static content
- Kicking off XWork's interceptor chain for the request lifecycle

IMPORTANT: this filter must be mapped to all requests. Unless you know exactly what you are doing, always map to this URL pattern: /*


※ Method

∙ doFilter: Process an action or handle a request a static resource. The filter tries to match the request to an action mapping.

∙ prepareDispatcherAndWrapRequest: Wrap and return the given request, if needed, so as to to transparently handle multipart data as a wrapped class around the given request.

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

※ dispatcher Class

A utility class the actual dispatcher delegates most of its tasks to. Each instance of the primary dispatcher holds an instance of this dispatcher to be shared for all requests.


※ Method

∙ wrapRequest: Wrap and return the given request or return the original request object. This method transparently handles multipart data as a wrapped class around the given request.

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

※ MultiPartRequestWrapper Class

Parse a multipart request and provide a wrapper around the request.

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

※ JakartaMultiPartRequest Class

Multipart form data request adapter for Jakarta Commons Fileupload package.


※ Method

∙ parse: Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's multipart classes (see class description).




해결 방안

 취약점이 패치된 버전으로 업데이트 수행
  - Apache Struts 2.3.32
  - Apache Struts 2.5.10.1

 Content-Type에 엄격한 필터링 적용 및 ognl 표현식 사용 금지

 commons-fileupload-x.x.x.jar 파일 삭제 (임시조치_삭제 시 업로드 기능 사용 불가)

댓글

이 블로그의 인기 게시물

SSH 크랙 , 보안 :: 메두사(Medusa) [소개, 사용법 ] [패스워드 크래킹]

외부에서 서버를 관리하기 위해서는 Telnet 과 같은 원격 쉘을 이용하게 됩니다. 이런 원격 쉘은 시스템에 직접 접근할수 있기 떄문에 특별한 관리와 보안이 필요합니다. 그래서 나온것이 SSH 바로 보안 쉘 입니다. 기본적으로 이동하는 패킷이 암호화 처리 되기 떄문에 TELNET보다는 매우 안전하다고 볼수 있습니다. 오늘은 이 SSH를 크랙하는 방법과 대책에 대해서 약간 알아보겠습니다. 이번에 소개할 툴은 메두사 입니다. 메두사는 Broute Force  공격에 사용되는 툴입니다. 설치 데비안계열 ( 데비안 , Ubuntu , 쿠분투 주분투 등등) 에서는 apt-get install medusa 로 간단하게 설치 할 수 있습니다. 메두사로 SSH서버를 크랙하는 방법에 대해 알아보겠습니다. 메두사의 메뉴얼입니다. 구조는 간단합니다. 상대 SSH서버를 확인한 후에 메두사로 무차별 대입공격을 시도합니다. 물론 상대 시스템에는 로그가 남을수 있겠지요.  일단 실험에 쓰일 노트북(공격자) 데스크탑(피해자) 입니다. 공격자 OS : Debian Net : wlan0 IP   : 192.168.0.26 피해자 OS : BackTrack4 Net : eth0 IP   : 192.168.0.3 ssh :  OpenSSh ( SSH1) 실험에 쓰일 피해자(backTrack)입니다.  현재 SSH서버를 가동하고 아무작업없이 대기중입니다. 공격자는 포트스캐너와 각종 툴들을 이용해 정보를 수집후  피해자가 SSH서버를 이용한다는것과 OpenSSH(SSH1)을 사용한다는 것을 알아냇다는 전제하에  시작하겠습니다. 공격자는 메두사 툴을 이용해 BruteForce공격을 시작합니다. medusa -h 192.168.0.3 -u root -P /home/noon/NOON/pass.txt -M ssh 사용된 옵션을 살펴 보자면 -h   :   호스트 주소입니다.  고로    타켓 주소 -u   :   크랙할 유저의 이름입니다.     유저 목록을 파일로 만들어서 사용할

OllyDbg 64bit 실행방법

OllyDbg 1.1 은 기본적으로 64bit 환경을 지원하지 못합니다. 책의 디버깅 실습은 거의 대부분 OllyDbg 를 이용해서 진행됩니다.  그러나 OllyDbg 1.1 은 64bit 환경을 지원하지 못합니다.  <그림 1. Windows 7 64bit 에서 OllyDbg 1.1 실행시 예외 발생> 64bit OS 에서 "2장 Hello World 리버싱" 실습 예제 파일 HelloWorld.exe 를 OllyDbg 1.1 로 실행시키면 <그림 1>과 같이 예외가 발생하면서 ntdll.dll 모듈 영역의 코드에서 멈춰버립니다. (이것은 OllyDbg 1.1 의 버그입니다.) 64bit 환경에서 OllyDbg 사용할 수 있는 2 가지 방법 #1. 64bit OS + OllyDbg 2.0 OllyDbg 2.0 버전에서는 64bit에서 정상 실행 되지 않는 버그가 수정되었습니다. 다운로드 링크 :  http://www.ollydbg.de/odbg200.zip * 참고 최신 버전 OllyDbg 2.01 beta 2 는 실행 과정에 약간의 문제가 있습니다. 문제가 해결될 때까지는 OllyDbg 2.0 을 사용해 주시기 바랍니다. 위 링크에서 파일을 다운받아 압축을 해제한 후 실행하면 <그림 2> 와 같은 화면이 나타납니다. <그림 2 - Windows 7 64bit 에서 OllyDbg 2.0 으로 HelloWorld.exe 를 띄운 화면> <그림 2>의 화면을 책의  <그림 2.3>  처럼 보이게 하려면 다음과 같이 작업해 주시면 됩니다. 1) 내부의 CPU 윈도우를 최대화 시킵니다. 2) Code/Register/Dump/Stack Window 의 폰트를 변경합니다.    (각각의 창에서 마우스 우측 메뉴 - Appearance - Font - System f

인터넷 웹페이지 디버깅 피들러(fiddler) 사용법

인터넷 디벌깅 툴 피들러 입니다. 개발자들은 인터넷 디버깅 툴을 많이 사용하고 있는데요 인터넷 익스플러워 , 사파리 구글크롬등 디버깅 툴은 내장되어 있습니다.  하지만 원하는 값을 얻기 어렵거나 사용하기 어려운 점도 있습니다. 그래서 사용하기도 간편하고 필요한 기능도 많도 원하는 값을 쉽게 확인 할수 있는 디버깅 툴을 소개 해드리려 합니다. 알고 계시는 분도 많겠지만 피들러 (fiddler) 라는 툴입니다.  피들러에 대하 알아보도록 하겠습니다.  피들러(Fiddler) 설치 피들러 설치를 하기 위해 아래 사이트에 접속합니다.   http://www.telerik.com/fiddler 사이트에 접속하시면 FreeDownload 버튼이 보입니다. 클릭을 해서 피들러 설치를 진행합니다. ▶ 피들러는 닷넷 프레임워크를 사용하는데요 window 7 이상 제품군이시면  Fiddler for NET4을 선택하시고 미만이면 .net2를 선택 하세요  이제 Download Fiddler를 선택합니다.  ▶ 피들러 설치 진행화면이 나옵니다. I Agree를 클릭합니다.    ▶ 설치할 폴더를 선택 후 Install을 클릭합니다.    ▶ 설치가 완료되면 Close 를 클릭합니다.    ▶ 설치가 완료되면 브라우저를 새로 실행 하시고 도구> Fiddler를 선택합니다. 도구메뉴가 안보이시면 Alt를 누르시면 보입니다.    ▶ 우측에도 피들러 메뉴가 있습니다.  도구를 클릭 후 피들러를 클릭합니다.   ▶ 실행이 되면 아래와 같은 화면이 나오는데요  좌측 하든을 보시면 Capturing 가 보입니다. 캡쳐를 진행하는 중이구요 키보드중 F12키를 누르면 캡쳐 중지 다시 F12키를 누르면 캡쳐가 진행됩니다.  원하는 부