metasploit-framework安装教程
前言🩷
本文主要是介绍安装教程以及解决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()
- 感谢你赐予我前进的力量