사이버 침해사고에서 공격자가 서버를 장악한 이후 사용하는 대표적인 원격 제어 방식 중 하나가 **리버스 셸(Reverse Shell)**이다.
리버스 셸은 공격 대상 서버가 공격자 시스템으로 직접 연결을 생성하는 방식으로, 서버에서 외부로 나가는 통신이 허용된 환경에서 악용될 수 있다.
이번 글에서는 정보보안기사 실기시험에 등장하는 리버스 셸 침해사고 시나리오를 바탕으로 공격 원리부터 Linux 계정 분석, Cron을 이용한 지속성 유지, 네트워크 연결 및 프로세스 분석까지 알아본다.
특히 실제 침해사고 조사에서 어떤 로그를 확인해야 하고, 각각의 기록이 무엇을 의미하는지 중점적으로 살펴보자.
1. 리버스 셸(Reverse Shell)이란?
리버스 셸은 공격 대상 시스템이 공격자의 시스템으로 연결을 시작하고, 해당 연결을 통해 공격자가 원격 명령을 실행할 수 있도록 하는 방식이다.
일반적인 원격 접속에서는 관리자가 서버로 접속하지만, 리버스 셸에서는 연결 방향이 반대가 된다.
1.1 리버스 셸의 동작 원리
일반적인 원격 접속은 다음과 같은 구조다.
관리자 PC → 대상 서버 → 원격 접속 및 명령 실행
반면 리버스 셸은 다음과 같다.
침해된 서버 → 공격자 시스템 → 원격 명령 실행
여기서 중요한 점은 연결을 시작하는 주체가 대상 서버라는 것이다.
공격자는 자신의 시스템에서 연결을 기다리고, 침해된 서버가 해당 시스템으로 연결을 생성한다.
연결이 성립하면 공격자는 네트워크를 통해 대상 서버의 셸과 상호작용할 수 있다.
1.2 리버스 셸이 위험한 이유
기업 네트워크에서는 일반적으로 외부에서 내부로 들어오는 트래픽을 엄격하게 제한한다.
하지만 내부 서버에서 외부로 나가는 트래픽은 상대적으로 넓게 허용하는 경우가 있다.
이러한 환경에서 공격자가 내부 서버를 이미 장악했다면, 외부 연결을 생성하는 리버스 셸을 이용해 원격 제어를 시도할 수 있다.
다만 리버스 셸이 모든 방화벽을 우회하는 것은 아니다.
외부 통신 제한, 애플리케이션 제어, IPS, EDR 등의 보안정책에 따라 탐지되거나 차단될 수 있다.
2. Bind Shell과 Reverse Shell의 차이
원격 셸을 이해하려면 Bind Shell과 Reverse Shell의 차이를 알아야 한다.
| 구분 | Bind Shell | Reverse Shell |
|---|---|---|
| 연결 방향 | 공격자 → 대상 서버 | 대상 서버 → 공격자 |
| 연결 대기 시스템 | 대상 서버 | 공격자 시스템 |
| 주요 특징 | 공격자가 서버에 직접 접속 | 서버가 공격자에게 연결 |
| 관련 방화벽 정책 | Inbound | Outbound |
| 주요 위험 | 원격 명령 실행 | 원격 명령 실행 |
2.1 Bind Shell
Bind Shell은 대상 서버에서 특정 포트의 연결을 기다리고, 공격자가 해당 포트로 접속하는 방식이다.
예를 들어 대상 서버의 특정 포트가 외부에 개방되어 있다면 공격자가 해당 포트로 연결할 수 있다.
그러나 방화벽에서 외부 접근을 차단하고 있다면 연결이 제한될 수 있다.
2.2 Reverse Shell
Reverse Shell은 공격자 시스템에서 연결을 기다리고, 대상 서버가 공격자 시스템으로 연결하는 방식이다.
따라서 외부에서 내부로 들어오는 연결이 제한된 환경에서도 내부 서버의 외부 통신이 허용되어 있다면 연결이 가능할 수 있다.
정보보안기사 실기 핵심
Bind Shell은 공격자가 대상 서버에 접속하는 방식이고, Reverse Shell은 대상 서버가 공격자에게 접속하는 방식이다.
3. 리버스 셸 침해사고 시나리오
정보보안기사 실기 교재에서는 다음과 같은 네트워크 환경을 가정한다.
| 구분 | IP 주소 | 역할 |
|---|---|---|
| 외부 공격자 | 10.10.10.10 | 원격 제어를 위한 연결 대기 |
| 웹 서버 | 192.168.56.100 | 침해 대상 Fedora Linux 서버 |
| 내부 침입자 | 192.168.56.40 | 최초 침입에 사용된 내부 시스템 |
3.1 방화벽 정책
대상 네트워크의 방화벽은 다음과 같이 설정되어 있다.
| 통신 방향 | 서비스 | 정책 |
|---|---|---|
| Inbound | HTTP 80/TCP | 허용 |
| Inbound | 그 외 서비스 | 차단 |
| Outbound | 모든 서비스 | 허용 |
이러한 환경에서는 외부 공격자가 내부 웹 서버의 임의 포트로 직접 접속하기 어렵다.
하지만 웹 서버가 외부로 연결하는 것은 허용되어 있기 때문에, 공격자가 서버를 장악한 이후 리버스 셸 연결을 시도할 수 있다.
3.2 공격 진행 과정
① 내부 시스템을 통한 초기 침입
공격자는 내부 시스템을 이용하여 웹 서버의 Telnet 서비스에 접근한다.
이후 무차별 대입 또는 사전 공격을 통해 root 계정의 비밀번호를 알아내고 로그인한다.
② 관리자 권한 계정 생성
공격자는 확보한 root 권한을 이용하여 새로운 사용자 계정을 생성한다.
계정 이름은 일반 사용자처럼 보이지만, 실제 사용자 식별번호는 최고 관리자 권한에 해당하도록 설정한다.
③ 지속적인 접근 경로 확보
공격자는 Netcat과 Cron을 악용하여 대상 서버가 정해진 시간에 외부 시스템으로 연결하도록 설정한다.
④ 원격 명령 실행
대상 서버와 공격자 시스템 사이에 연결이 성립하면 공격자는 해당 연결을 통해 서버의 셸에 접근하고 명령을 실행한다.
이 과정은 침해사고에서 나타나는 초기 접근 → 권한 확보 → 지속성 유지 → 원격 제어의 흐름을 보여준다.
4. Netcat을 이용한 리버스 셸의 동작 원리
4.1 Netcat이란?
Netcat은 TCP 및 UDP 기반 네트워크 통신을 수행할 수 있는 도구다.
네트워크 연결 테스트, 포트 점검, 데이터 송수신 등 정상적인 시스템 관리 목적으로 활용된다.
하지만 공격자가 이를 셸 프로세스와 결합하면 원격 명령 실행 통로로 악용할 수 있다.
4.2 Netcat의 주요 기능
Netcat은 네트워크 연결을 기다리는 Listener와 연결을 생성하는 Connector 역할을 수행할 수 있다.
리버스 셸 환경에서는 일반적으로 다음과 같이 동작한다.
공격자 시스템
외부에서 들어오는 연결 요청을 기다린다.
대상 서버
공격자 시스템의 IP 주소와 포트로 연결을 시도한다.
연결 성립
대상 서버의 셸 입출력이 네트워크 연결과 결합되면 원격 명령 실행이 가능해진다.
4.3 Linux 파일 디스크립터와 리버스 셸
Linux에서는 프로세스의 입력과 출력을 파일 디스크립터(File Descriptor)로 관리한다.
대표적인 파일 디스크립터는 다음과 같다.
| 번호 | 이름 | 역할 |
|---|---|---|
| 0 | stdin | 표준 입력 |
| 1 | stdout | 표준 출력 |
| 2 | stderr | 표준 오류 |
일반적인 터미널 환경에서는 사용자가 키보드로 명령을 입력하고 화면에서 실행 결과를 확인한다.
리버스 셸에서는 이러한 입출력이 네트워크 소켓과 연결될 수 있다.
따라서 네트워크를 통해 전달된 입력이 셸에 전달되고, 실행 결과가 다시 네트워크를 통해 전송되는 구조가 만들어진다.
이 과정에서 등장하는 주요 개념은 다음과 같다.
Socket
네트워크 통신을 위한 연결 지점이다.
dup
파일 디스크립터를 복제하는 데 사용하는 기능이다.
exec
현재 프로세스의 실행 이미지를 다른 프로그램으로 교체하는 기능이다.
이러한 기능들이 결합되면 네트워크 연결을 통해 셸과 상호작용할 수 있다.
5. Linux 리버스 셸 침해사고 분석
리버스 셸 공격이 발생했는지 확인하기 위해서는 단순히 네트워크 연결만 살펴보는 것이 아니라 인증 로그, 계정 정보, 예약 작업, 실행 프로세스를 종합적으로 분석해야 한다.
5.1 Linux 인증 로그 분석
Linux에서는 인증 관련 로그를 통해 사용자의 로그인 시도와 인증 성공 여부를 확인할 수 있다.
교재의 Fedora Linux 환경에서는 인증 로그를 통해 반복적인 root 계정 로그인 실패와 이후 성공한 로그인 기록을 확인한다.
특히 특정 IP에서 로그인 실패가 반복된 뒤 성공 기록이 나타났다면 무차별 대입 공격 가능성을 조사해야 한다.
다만 정상적인 사용자의 비밀번호 입력 오류도 비슷한 기록을 남길 수 있으므로, 접속 IP와 작업 이력 등을 함께 확인해야 한다.
5.2 특권 계정 생성 흔적 분석
공격자는 최초 침입 이후에도 시스템에 접근할 수 있도록 별도의 계정을 생성할 수 있다.
교재에서는 일반 사용자처럼 보이는 계정에 UID 0이 부여된 사례를 설명한다.
Linux에서 UID 0은 최고 관리자 권한을 의미한다.
따라서 계정 이름이 root가 아니더라도 UID가 0이라면 관리자 수준의 권한을 가질 수 있다.
침해사고 분석에서는 계정명뿐 아니라 UID와 GID, 계정 생성 이력 등을 함께 확인해야 한다.
5.3 Cron을 이용한 지속성 유지 분석
Cron은 Linux에서 특정 시간에 프로그램이나 명령을 자동 실행하도록 설정하는 기능이다.
정상적인 시스템 관리에서는 백업이나 점검 작업에 활용되지만, 공격자가 악용하면 악성 프로그램이나 외부 연결을 주기적으로 실행할 수 있다.
교재에서는 매일 오전 2시 30분에 외부 시스템으로 연결을 시도하는 예약 작업이 발견된 사례를 설명한다.
이러한 작업은 공격자가 서버에 지속적으로 접근하기 위한 수단으로 악용될 수 있다.
5.4 네트워크 연결 및 프로세스 분석
리버스 셸이 실제로 연결되어 있는지 확인하려면 네트워크 연결 상태와 실행 프로세스를 분석해야 한다.
특히 다음 항목을 함께 확인하는 것이 중요하다.
- 외부 연결 목적지 IP 및 포트
- TCP 연결 상태
- 연결을 사용하는 프로세스
- 프로세스의 실행 계정
- 비정상적인 예약 작업 존재 여부
교재에서는 외부 시스템과 연결된 Bash 프로세스를 확인하여 리버스 셸 연결 여부를 분석한다.
여기서 ESTABLISHED는 TCP 연결이 성립한 상태를 의미한다.
정상적인 네트워크 통신에서도 나타나는 상태이므로 ESTABLISHED만으로 악성 연결이라고 판단해서는 안 된다.
하지만 승인되지 않은 외부 IP와의 연결, 의심스러운 셸 프로세스, 비정상적인 예약 작업이 함께 발견된다면 침해 가능성을 조사해야 한다.
5.5 Linux 침해사고 분석 명령어 및 로그 예시
앞서 설명한 인증 로그, 특권 계정, Cron 예약 작업, 네트워크 연결 분석 방법을 하나의 이미지로 정리했다.

그림. Linux 리버스 셸 침해사고 분석을 위한 명령어 및 로그 예시
이미지에 포함된 주요 학습 내용은 다음과 같다.
| 분석 영역 | 확인 목적 |
|---|---|
| 인증 로그 | 비정상적인 로그인 시도 및 성공 여부 |
| 특권 계정 | UID 0 계정 생성 여부 |
| Cron | 비정상적인 예약 작업 등록 여부 |
| 네트워크 | 외부 연결 및 의심스러운 프로세스 확인 |
※ 이미지의 로그와 IP 주소는 학습을 위한 예시이며, 실제 침해사고 로그와 구분해야 한다.
6. 리버스 셸 침해사고 대응 방법
리버스 셸 침해가 의심된다면 공격 흔적을 보존하면서 추가 피해를 방지하는 것이 중요하다.
6.1 의심스러운 외부 연결 확인
서버에서 승인되지 않은 외부 IP로 연결이 발생하는지 확인한다.
특히 웹 서버에서 평소 사용하지 않는 외부 목적지로 지속적인 TCP 연결이 발생한다면 조사할 필요가 있다.
6.2 비정상적인 계정 확인
Linux 계정 정보를 점검하여 불필요한 관리자 권한 계정이 생성되었는지 확인한다.
UID 0을 가진 계정이 여러 개 존재한다면 생성 목적과 승인 여부를 확인해야 한다.
6.3 예약 작업 확인
Cron 설정과 관련 스크립트를 점검하여 승인되지 않은 작업이 등록되어 있는지 확인한다.
특히 외부 연결을 생성하거나 셸을 실행하는 작업이 반복적으로 실행되는지 조사해야 한다.
6.4 보안장비 로그 분석
기업 환경에서는 방화벽, IPS, EDR 등의 보안 로그를 함께 분석할 수 있다.
방화벽에서는 외부 연결 목적지와 세션 정보를 확인하고, IPS에서는 관련 공격 패턴이 탐지되었는지 확인한다.
EDR에서는 셸 프로세스 실행, 비정상적인 자식 프로세스 생성 등의 행위를 분석할 수 있다.
다만 이러한 보안장비가 모든 리버스 셸 공격을 탐지하거나 차단할 수 있는 것은 아니다.
6.5 침해 범위 확인 및 복구
침해가 확인되면 조직의 사고 대응 절차에 따라 시스템을 격리하고 증거를 보존해야 한다.
이후 계정 탈취 여부, 추가 악성 프로그램, 다른 시스템으로의 확산 가능성을 조사한다.
필요한 경우 신뢰할 수 있는 백업이나 시스템 이미지로 복구하고 재발 방지 대책을 적용한다.
7. 정보보안기사 실기 핵심 정리
| 핵심 개념 | 시험 핵심 |
|---|---|
| Reverse Shell | 대상 서버가 공격자 시스템으로 연결 |
| Bind Shell | 공격자가 대상 서버로 연결 |
| Netcat | TCP·UDP 통신 및 네트워크 진단 도구 |
| UID 0 | Linux 최고 관리자 권한 |
| Cron | 예약 작업 실행 기능 |
| Bash History | 명령어 실행 기록 |
| 인증 로그 | 로그인 성공 및 실패 기록 |
| ESTABLISHED | TCP 연결이 성립한 상태 |
| PID | 프로세스 식별번호 |
7.1 예상 실기 문제
문제 1. Reverse Shell과 Bind Shell의 차이점을 설명하시오.
정답
Bind Shell은 대상 서버가 연결을 기다리고 공격자가 접속하는 방식이며, Reverse Shell은 대상 서버가 공격자 시스템으로 연결을 시작하는 방식이다.
문제 2. Linux에서 UID 0이 의미하는 것은 무엇인가?
정답
UID 0은 최고 관리자 권한을 의미하며, 해당 UID를 가진 계정은 root와 동일한 수준의 권한을 행사할 수 있다.
문제 3. 공격자가 Cron을 악용하는 목적은 무엇인가?
정답
악성 프로그램 실행이나 외부 연결을 주기적으로 수행하여 시스템에 대한 지속적인 접근을 유지하기 위해서다.
문제 4. 침해사고 분석에서 ESTABLISHED 상태의 의미는 무엇인가?
정답
TCP 연결이 정상적으로 성립한 상태를 의미한다. 다만 연결이 성립했다는 사실만으로 악성 여부를 판단할 수는 없다.
문제 5. 리버스 셸 침해 여부를 확인하기 위해 분석해야 할 항목을 서술하시오.
정답
인증 로그, 계정 권한, 예약 작업, 외부 네트워크 연결, 실행 프로세스 등을 종합적으로 분석해야 한다.
8. 마무리
리버스 셸은 공격 대상 시스템이 공격자에게 연결을 시작한다는 점에서 일반적인 원격 접속이나 Bind Shell과 차이가 있다.
이번 침해사고 시나리오에서는 공격자가 내부 시스템을 통해 웹 서버에 접근하고, 관리자 권한을 확보한 뒤, 비정상적인 계정과 예약 작업을 이용해 지속적인 원격 접근 경로를 유지하는 과정을 살펴보았다.
실제 침해사고 분석에서도 하나의 로그만으로 공격 여부를 판단하기보다는 인증 기록, 계정 정보, 예약 작업, 네트워크 연결, 실행 프로세스를 함께 분석하는 것이 중요하다.
정보보안기사 실기시험을 준비할 때도 명령어를 단순히 암기하기보다는 각 명령어가 무엇을 확인하기 위한 것인지, 로그에서 어떤 흔적을 발견할 수 있는지 이해하는 것이 효과적이다.
