前言🩷

本文主要是介绍安装教程以及解决metasploit-framework Please run msfdb as a non-root user 初始化postgres问题。

环境❤️

  • CentOS

  • Ubuntu

安装🧡

  • 使用一键安装脚本(要翻墙或者使用末尾我提供的Github的DNS解析脚本)

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

安装postgreSQL数据库💚

docker

  • 有docker的话直接

 docker pull postgres:latest
  • 启动postgres

docker run --name some-postgres -e POSTGRES_PASSWORD=msf_dev --restart=always -p 3000:5432 -d postgres

主机方式安装

  • 自己发挥

初始化数据库(全程使用“postgres”操作)🩵

1、命令行模式下root用户登不了postgres,但是可以用 postgres用户登陆

  • 切换到postgres用户

1、su postgres

2、进入shell 执行 psql

  • 新建用户 CREATE USER msf_dev WITH PASSWORD 'msf_dev';

  • 新建数据库 CREATE DATABASE msf-dev;

3、初始化msf的db

  • 进入msfconsole

  • 输入 db_connect 可以看到许多种连接方式

Examples:
	  db_connect user@metasploit3
	  db_connect user:pass@192.168.0.2/metasploit3
	  db_connect user:pass@192.168.0.2:1500/metasploit3
	  db_connect -y [path/to/database.yml]
  • 连接postgres db_connect msf_dev:msf_dev@127.0.0.1:3000/msf_dev

  • 输入 db_status 查看连接状态

msf6 > db_status
[*] Connected to msf_dev. Connection type: postgresql.
  • 初始化数据表

msfdb init

持久化连接(全程使用“root”操作)💜

1、切换为root用户

su root

2、将postgres 用户下的数据库配置复制到msf上

cp /home/postgres/.msf4/database.yml /opt/metasploit-framework/embedded/framework/config/database.yml

3、进入msfconsole控制台进行测试,出现以下字样就是成功

思考❤️‍🔥

为什么不能全程使用root用户操作?

答:因为postgre是独立于root用户外的应用,这也是这个数据库为了安全所设计的,且postgre安装后会自动创建一个权限较低的postgres用户。

为什么msf不支持root用户下自动数据库连接?

答:因为msf数据库配置文件数据库连接的密码是加密的,而root用户下,不能使用msfdb指令进行初始化连接数据库,导致没法自动化初始化到配置文件里,得需要非root用户进行连接后,将产生的数据库连接信息复制到当前应用下即可正常使用。

为什么Kali啥都不用干就可以,其他的不行?

答:因为Kali是高度封装的Debian系统,其他系统没有针对相关工具进行配置和优化,所以没有可比性。

附件(changeHosts.py)❤️‍🩹

  • 该代码用于自动生成hosts文件,解析github相关URL的IP地址,解决国内机子无法正常访问github相关的接口

import datetime
import time
from functools import wraps
import requests


def timer(func):
    @wraps(func)  # 修正 docstring
    def wrap(*args, **kwargs):
        st = time.time()
        result = func(*args, **kwargs)
        et = time.time()
        duration = et - st
        print(f'耗时{duration}秒')
        return result

    return wrap


class Rewrite:
    target_file = '/etc/hosts'
    spliter = '=====以下是GitHub Hosts====='

    api = 'https://gitlab.com/ineo6/hosts/-/raw/master/next-hosts'
    headers = {
        # 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
        # 'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'cache-control': 'no-cache',
        'dnt': '1',
        'pragma': 'no-cache',
        'referer': 'https://ineo6.github.io/hosts/',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
    }

    @classmethod
    @timer
    def run(cls):
        r = requests.get(
            url=cls.api,
            headers=cls.headers
        )
        hosts_text = r.text
        origin_text = cls.r()
        # print(origin_text)
        cls.deal(origin_text, hosts_text)
        print(f'{cls.target_file}已更新')

    @classmethod
    def r(cls):
        with open(cls.target_file, 'r', encoding='utf-8') as f:
            origin_text = f.read()
            return origin_text

    @classmethod
    def w(cls, text):
        # print(text)
        with open(cls.target_file, 'w', encoding='utf-8') as f:
            f.write(text)

    @classmethod
    def deal(cls, origin_text, hosts_text):
        if cls.spliter in origin_text:
            origin_text = origin_text.split(cls.spliter)[0]

        # 去除原始文本末尾的空行
        origin_text = origin_text.rstrip()

        flag = f'=====更新时间:{cls.now_time()}====='
        text = f'{origin_text}\n{cls.spliter}\n{flag}\n{hosts_text}'
        cls.w(text)
    # @classmethod
    # def deal(cls, origin_text, hosts_text):
    #     if cls.spliter in origin_text:
    #         origin_text = origin_text.split(cls.spliter)[0]
    #     flag = f'=====更新时间:{cls.now_time()}====='
    #     text = f'{origin_text}\n{cls.spliter}\n{flag}\n{hosts_text}'
    #     cls.w(text)

    @staticmethod
    def now_time():
        # 返回值是 字符串类型
        now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")  # 当前时刻
        return now_time


if __name__ == '__main__':
    Rewrite.run()