아파치 스트럿츠 (Apache Struts2)는 자바 기반의 웹 어플리케이션을 개발하는데 사용되는 오픈 소스 MVC(Model-View-Controller) 프레임워크이다.


2017년 3월 6일경 Nike Zheng이 아파치 스트럿츠에서 원격 코드 실행(RCE, Remote Code Execution)이 가능한 제로데이 취약점(Zero-Day)을 발견했다. 


취약점 분석 결과를 요약하면 자카르타(Jakarta) 플러그인이 파일 업로드를 처리할 때 발생된다. 

 

공격자는 HTTP 요청 헤더(Request Header)의 Content-Type 필드 값을 OGNL(Object Graph Navigation Language) 표현식으로 변조하여 요청하면 자카르타 플러그인이 예외가 발생되어 원격 코드 실행이 가능하다.


공식 홈페이지


취약점 정보

아파치 스트럿츠 취약점은 CVE(Common Vulnerabilities and Exposure) 번호 'CVE-2017-5638', 아파치 스트럿츠 보안 이슈 'S2-045'로 명명됐다. 


취약점의 위험도는 공통 취약점 평가 체계(CVSS, Common Vulnerability Scoring System)의 기본 점수(Base Score) 10점 만점 중에 10점으로 가장 위험한 취약점으로 평가됐다.


공통 취약점 평가 체계 상세   


기본 점수 6개 항목에서 접근 경로 '네트워크', 접근 복잡성 '낮음', 기밀성 '높음', 무결성 '높음', 가용성 '높음'으로 판단되어 10점으로 선정됐다.


공통 취약점 평가 체계 


2017년 3월 20일 CVE-2017-5638, S2-045 취약점과 유사한 원격 코드 실행이 가능한 S2-046 취약점이 발견됐다. 이 취약점은 S2-045 취약점과 유사하지만 공격 방법이 다르다.


HTTP 요청 헤더의 Content-Length 필드 값을 최대 업로드 가능한 용량보다 더 큰 용량으로 변조한다. 


또한, Content-Disposition 필드 값을 OGNL 표현식으로 변조하여 요청하면 자카르타 플러그인이 예외가 발생되어 원격 코드 실행이 가능하다.


S2-046 취약점 


취약한 대상

영향을 받는 버전의 범위가 넓어 아파치 스트럿츠를 사용하는 모든 시스템에 위험이 노출되어 있다. 2.3.32와 2.5.10.1 버전을 사용하는 시스템은 취약점에 영향을 받지 않는다.


구분 제품명 버전
취약한 대상 Apache Struts 2.3.5 ~ 2.3.31
2.5 ~ 2.5.10
권고 대상 Apache Struts 2.3.32
2.5.10.1

뉴스 사례

아파치 스트럿츠 취약점이 발견된 직후 중국 해커들은 대한민국 웹 사이트를 공격하려고 자동화 공격 프로그램 및 웹 사이트 정보를 공유하기 시작했다. 


해커들은 2017년 3월 7일 대한민국에서 개최되는 국제대회 웹 사이트뿐만 아니라 패션브랜드, 교육 웹 사이트 등을 공격 후 총동원령이 내려진 상태이다. 또한, 롯데 계열사, 정부기관, 정부관련 소프트웨어 개발 기업, 그룹웨어 서버, 커뮤니티, 공동주택 웹 사이트 등이 공격을 당했다. 


한 사례로 지난 3월 13일경 캐나다 국세청, 캐나다 통계청 웹 사이트에서 취약점을 이용한 공격이 발생했다. 캐나다 정부는 침해사고 발생을 해결하려고 웹 사이트를 폐쇄했다.


취약점으로 발생하는 사례  


환경 구축

취약한 웹 어플리케이션 서버(WAS, Web Application Server) 환경이 구축되어 있는 웹고트(WebGoat), 아파치 스트럿츠 등을 웹 서버에 설치한다. 


아파치 스트럿츠 취약점을 이용한 공격은 칼리 리눅스(Kali Linux) 운영체제에서 진행한다.


구분 웹 서버 공격자
운영체제 Windows 7 SP1 Kali Linux 2016.01
아이피 주소 10.10.0.10 10.10.0.4
도구 jdk-7u45-windows-i586
Apache Struts 2.3.20
 WebGoat-5.4
eclipse-jee-kepler-SR1-win32
-

 

JDK(Java Development Kiit) 설치를 완료하면 시스템에 자동으로 환경 변수가 등록되지 않으므로 시스템 속성에서 환경 변수를 등록한다


환경 변수


환경 변수 등록
1. 바탕화면의 컴퓨터 > 속성 > 시스템 속성 > 고급 > 환경 변수
2. 시스템 변수(S) > 새로 만들기(W) > 변수 이름 : JAVA_HOME, 변수 값 : C:\Program Files\Java\jdk1.7.0_45 > 확인
3. 시스템 변수(S) > Path > 편집 > %JAVA_HOME%; > 확인
4. 바탕화면의 시작 > 실행 > cmd > java -version

struts-2.3.20-apps.zip 파일을 압축 해제하면 struts-2.3.20 디렉토리가 생성된다. 해당 디렉토리 내부로 들어가면 app 디렉토리에 war 파일 형식의 아파치 스트럿츠 패키지가 존재한다.


아파치 스트럿츠 파일 목록


WebGoat-5.4-OWASP_Standard_Win32.zip 파일을 압축 해제하면 WebGoat-5.4 디렉토리가 생성된다. struts2-blank.war 파일을 WebGoat-5.4\tomcat\webapps 디렉토리에 복사한다.


webapps 디렉토리 목록


WebGoat-5.4\tomcat\conf\tomcat-users.xml 파일을 열어 37 ~ 41행을 추가한다.


이는 톰캣(Tomcat) 관리자의 계정 및 권한을 설정하는 것으로 관리자 웹 페이지에 접근 시 해당 파일에 설정한 계정을 입력하면 된다.


톰캣 관리자 권한 추가


<tomcat-users>
      <role rolename="manager-gui"/>
      <role rolename="manager-script"/>
      <role rolename="manager-jmx"/>
      <role rolename="manager-status"/>
      <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
  
      <role rolename="webgoat_basic"/>
      <role rolename="webgoat_admin"/>
      <role rolename="webgoat_user"/>
      <role rolename="tomcat"/>
      <user password="webgoat" roles="webgoat_admin" username="webgoat"/>
      <user password="basic" roles="webgoat_user,webgoat_basic" username="basic"/>
      <user password="tomcat" roles="tomcat" username="tomcat"/>
      <user password="guest" roles="webgoat_user" username="guest"/>
</tomcat-users>

WebGoat-5.4\tomcat\bin\startup.bat 파일을 더블 클릭하여 톰캣을 실행한다. 톰캣이 실행되면 자동으로 webapps 디렉토리 존재하는 war 파일을 해제하고, 구동된다.


톰캣 실행


웹 브라우저를 열고 주소창에 http://localhost:8080을 입력하면 톰캣 웹 페이지에 접속된다.


우측 상단의 Manager App을 클릭해서 tomcat-users.xml 파일에 설정한 계정(admin, admin)을 입력하면 톰캣 관리자 웹 페이지에 접속된다.


톰캣 웹 페이지


어플리케이션 목록을 보면 하단에 /struts2-blank 웹 어플리케이션이 추가되어 있다. 실제로 아파치 스트럿츠가 정상적으로 동작하는지 확인하려면 /struts2-blank 링크를 클릭하면 된다.


톰캣 관리자 웹 페이지


링크를 클릭하면 정상적으로 아파치 스트럿츠가 실행된다. 주소창에서 확장자가 action인것은 아파치 스트럿츠의 기본 확장자로 struts.properties 파일에서 확장자를 변경할 수 있다.


처리되는 과정을 살펴보면 namespace가 'example'로 명시되어 있는 곳으로 진입하고, action name이 'HelloWorld'로 명시되어 있는 곳으로 진입해서 그 안에 정의된 HelloWorld.jsp를 실행한다.


아파치 스트럿츠 실행


▶ CVE-2017-12617 취약점 분석 (Apache Tomcat)

▶ APM 연동 (CentOS, Apache, Tomcat, PHP, MySQL)

▶ CVE-2014-6332 취약점 분석 (Internet Explorer)

▶ WordPress AutoSuggest 0.24 취약점 분석

▶ CVE-2012-1823 취약점 분석 (PHP-CGI)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유