gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/bundle config mirror.https://rubygems.org https://gems.ruby-china.org
本文将着重讲述如何搭建 Metasploit Framework 的开发环境以便于贡献者可以高效迅速地进行贡献。
如果你只是想对 Metasploit Framework 进行授权的合法的渗透测试,我们建议直接下载商业版本安装包或者 开源版本安装包,因为我们已经在这些包中为您解决了所有的依赖问题。商业版本安装包还包括可选的可以更新到 Metasploit Pro 的部分并且会每周更新两次,而开源版本则会在每天晚上进行更新。
如果你正在使用 Kali Linux,Metasploit 已经预先安装好了。可以参考这个指南,该指南提供了如何使用提供好的 Metasploit-Framework 软件包以及配置数据库。
如果你想参与开发或者对 Metasploit 进行贡献,那么本文很适合你,继续读下去吧!本文应该可以让你使用任何基于 Debian 的 Linux 操作系统进行工作。
那么废话少说,开始吧!
前提
你已经有了一个基于 Debian 的 Linux 环境
你有一个非 Root 的用户,本文中我们使用
msfdev
这个用户你有一个 GitHub 账号,并且关联了一个 SSH 密钥 到你的 GitHub 账号。
安装基础开发软件包
sudo apt-get -y install \ autoconf \ bison \ build-essential \ curl \ git-core \ libapr1 \ libaprutil1 \ libcurl4-openssl-dev \ libgmp3-dev \ libpcap-dev \ libpq-dev \ libreadline6-dev \ libsqlite3-dev \ libssl-dev \ libsvn1 \ libtool \ libxml2 \ libxml2-dev \ libxslt-dev \ libyaml-dev \ locate \ ncurses-dev \ openssl \ postgresql \ postgresql-contrib \ wget \ xsel \ zlib1g \ zlib1g-dev
请注意:目前我们还没有安装 Ruby,但是我们将会在后续步骤中进行安装。
Fork 并克隆 Metasploit-Framework 仓库
你可以参考这篇 GitHub 提供的关于 forking 的指南,但是其实你只需要点击仓库主页右上角的 “Fork” 按钮就可以完成 Fork 操作了。
克隆
一旦你已经在 GitHub 上 Fork 了该仓库,现在就可以将该仓库拉取到本地的开发机了。
同样,你也可以参考 GitHub 提供的这篇关于 cloning 的指南
mkdir -p $HOME/gitcd $HOME/git git clone git@github.com:YOUR_USERNAME_FOR_GITHUB/metasploit-frameworkcd metasploit-framework
设置 Git 仓库的 Upstream
首先,如果你打算使用最新的上游(upstream)来更新您的本地克隆,那么您需要跟踪(track)它
在 metasploit-framework
Checkout 的目录中,运行如下命令:
git remote add upstream git@github.com:rapid7/metasploit-framework.git git fetch upstream git checkout -b upstream-master --track upstream/master
现在你已经有了一个指向了 upstream 的分支(也就是 GitHub 上的 rapid7/Metasploit-Framework
这个仓库),与你自己 Fork 得到的仓库不同(指向 origin/master
的源 master
分支) 。
你或许会发现,拥有 upstream-master
和 master
两个不同的分支是非常方便的(尤其是当你是一个 Metasploit committer 的时候,因为这会将避免你意外地将代码直接推送到 rapid7/master
分支上)
安装 RVM(译者注:Ruby Version Manager)
大部分的 Linux 发行版并不会提供可预测频率的最新版本的 Ruby,因此我们使用 RVM (Ruby Version Manager)进行 Ruby 版本的管理,你可以参考官网获取相关信息,看起来很不错。当然也有些人比较青睐 rbenv,你也可以参考 rbenv 教程。
但是你就得自己保证你有合适版本的 Ruby。因为大部分和 Commiters 使用 RVM,所有本篇教程中,我们也会就 RVM 进行接下来的操作。
首先,你需要为获取 RVM 发行版的签名文件
curl -sSL https://rvm.io/mpapis.asc | gpg --import -
然后,安装 RVM:
curl -L https://get.rvm.io | bash -s stable
上面的命令是直接使用管道将所有的命令定向到了 Bash 中,但是这可能会引起一些比较 当上面的操作都成功完成后,就可以修复你的终端(Terminal)来使用 RVM 版的 Ruby 了 最后,安装 Gnome Terminal 真是个混蛋,默认情况下它并没有将你的 Shell 作为 Login shell,所以没有对 tweak 进行配置的话, RVM 将无法正常工作。如下: Navigate to Edit > Profiles > Highlight Default > Edit > Title and Command 选中如下复选框: [√] Run command as a login shell. 看起来应该像下图这样,具体可能根据不同的 Gnome 版本有微小差异: image.png 最后,你就可以运行在 .ruby-version 这个文件中指定的特定的 Ruby 版本了。 如果你发现当前正在运行的 Ruby 版本仍然不是在 Metasploit 依赖许多 gems(Ruby 库)。因为你正在使用 RVM,因此你可以直接在本地安装它们而不用考虑与 Debian 打包好的 Gems 产生冲突,感谢 Bundler 的黑科技。 先进入你的 Checkout 的根目录,然后运行: 一两分钟后,你就可以开始你的 Metasploit 之旅了,在你的 Checkout 目录,输入: 沐浴在 Metasploit 启动带来的光辉中吧!(译者注:原文 And bask in the glory that is a functioning source checkout) 唉,我们似乎还没有成功配置数据库来使用这些狂暴的 Hacking,要解决?简单! Kali Linux 已经自带了 PostgreSQL,所以我们可以直接使用。在 Ubuntu 和其他基于 Debian 的发行版上,所有的配置应该都是类似的,并且可以很好的工作。我们假设使用别的发行版的人已经安装好了 在 Kali Linux 上,PostgreSQL(或者其他需要监听端口的服务)默认情况下不会开启。这是一个很好的安全资源防御措施,但是如果你想要让他们随时运行的话(译者注:开机启动),你也可以运行以下命令: 然后,切换到 Postgres 用户来执行一些小型数据库的运维工作来修复默认编码错误(该有用的信息由 提供) 还是在 postgres 这个用户的权限下: 现在切换到你自己的用户,按照如下模板创建文件 当你下次启动 我们使用 rspec 来进行大部分的框架测试。首先要确保下面的命令可以正常工作: 上述命令运行完成后,你应该会看到总共运行了超过 9000 个测试用例,其中大部分被标记为绿色,很少一部分为黄色,不会出现红色的错误结果。 如果你想要在命令行上轻松访问上游(upstream)的 Pull Requests,那么您需要添加相关的 fetch reference 到 这将会添加所有相关的引用到你所有的 Git Remotes 中,包括你自己的。 GitHub 提供了一种 更简单的方法 上面所做的一切可以让你查看别人的 Pull Request(PR),并进行修改,然后发布到你自己的 Fork 的某一个分支上。这反过来会让你帮助其他人的PR进行修复或补充。 请绝对 不要 直接直接提交代码到 Master 分支。请将你所有的改动放置在一个新的分支,然后对分支进行合并。这样的做法可以很容易就能保持代码同步,并且你的本地修改永远也不会丢失。 再简单不过了。 这可以让 Pull Requests 与 Master 分支保持同步。除非你遇到合并冲突,否则不需要经常这样做。 对 rapid7/master 进行强制 Push 是绝对不可以的。但是可以在别的正在开发的分支,重写一些历史并不会构成联邦犯罪。 为了对任何你正在编写的新模块进行检查,你需要在 Commit 之前,以及 Merge 之后进行 HOOK 以使用我们的代码检查工具 最后,如果你想为 Metasploit 做贡献的话(译者注:事实上所有开源项目都应该这样做),你至少需要按照如下命令配置你的名字与邮箱: 注意你的邮箱地址必须和你的 GitHub 注册的邮箱相互匹配。 我们热爱对 Commits 进行签名,主要是因为我们 害怕另一种选择(译者注:原文 we're terrified of the alternative)。关于如何签名的详细信息可以在此获取。请注意姓名和邮件地址必须完全匹配上签名密钥上的信息。我们鼓励贡献者签名自己的 Commits,因为 Metasploit 的 Committers 在 合并 Pull Request(译者注:Land Pull Request) 的时候也需要进行签名。 如果不再配置一些有用的让生活变得更美好的别名的话,那么配置开发环境就不能算完成。 作为一个开发者,你可能会一不小心使用到已经安装过的 Metasploit 如果你既想使用开发版的 Metasploit 也想使用安装包,那么使用两个不同的用户可能是一个更好的选择(译者注:感觉这样很麻烦,还不如使用 下面的脚本可以很容易让你知道你目前所在的位置/环境(译者注:例如 Ruby 版本,Git 仓库的分支等),你可以将如下脚本放在 与传统 Shell 别名很相似,Git 自己本身也有别名功能,既可以在 source ~/.rvm/scripts/rvm
cd ~/git/metasploit-framework
rvm --install $(cat .ruby-version)
bundler
这个 gem 包来获取其他所有需要的的 gem 包:gem install bundler
为 Gnome Terminal 配置使用 RVM
ruby -v
.ruby-version
这个文件里面定义的版本的话,你或许需要重启你的终端。如果你初始安装的 RVM 不具备如下功能的话,那么请确保你已经将 rvm 添加到了你的 Termianl 的启动脚本中。echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> .bashrc
安装打包组件 Gems
cd ~/git/metasploit-framework/
bundle install
./msfconsole
第一次运行的时候,将会顺便创建一个 ~/.msf4
的目录 msfdev@lys:~/git/metasploit-framework$ ./msfconsole
[*] Starting the Metasploit Framework console.../ _---------.
.' ####### ;."
.---,. ;@ @@`; .---,..
." @@@@@'.,'@@ @@@@@',.'@@@@ ".
'-.@@@@@@@@@@@@@ @@@@@@@@@@@@@ @; `.@@@@@@@@@@@@ @@@@@@@@@@@@@@ .'
"--'.@@@ -.@ @ ,'- .'--"
".@' ; @ @ `. ;'
|@@@@ @@@ @ .
' @@@ @@ @@ , `.@@@@ @@ .
',@@ @ ; _____________
( 3 C ) /|___ / Metasploit! \
;@'. __*__,." \|--- \_____________/
'(.,...."/
=[ metasploit v5.0.0-dev-26bf96b ]
+ -- --=[ 1744 exploits - 1001 auxiliary - 302 post ]
+ -- --=[ 536 payloads - 40 encoders - 10 nops ]
+ -- --=[ ** This is Metasploit 5 development branch ** ]
msf > ls ~/.msf4
[*] exec: ls ~/.msf4
history
local
logos
logs
loot
modules
plugins
msf > exit
配置 PostgreSQL
PostgreSQL
,TLDR 也确保数据库能在系统启动时启动。启动数据库
TLDR(以 msfdev 用户的身份运行)
echo 'YOUR_PASSWORD_FOR_KALI' | sudo -kS update-rc.d postgresql enable &&echo 'YOUR_PASSWORD_FOR_KALI' | sudo -S service postgresql start &&
cat <<EOF> $HOME/pg-utf8.sql
update pg_database set datallowconn = TRUE where datname = 'template0';
\c template0
update pg_database set datistemplate = FALSE where datname = 'template1';
drop database template1;
create database template1 with template = template0 encoding = 'UTF8';
update pg_database set datistemplate = TRUE where datname = 'template1';
\c template1
update pg_database set datallowconn = FALSE where datname = 'template0';
\q
EOF
sudo -u postgres psql -f $HOME/pg-utf8.sql &&
sudo -u postgres createuser msfdev -dRS &&
sudo -u postgres psql -c \ "ALTER USER msfdev with ENCRYPTED PASSWORD 'YOUR_PASSWORD_FOR_PGSQL';" &&
sudo -u postgres createdb --owner msfdev msf_dev_db &&
sudo -u postgres createdb --owner msfdev msf_test_db &&
cat <<EOF> $HOME/.msf4/database.yml# Development Databasedevelopment: &pgsql
adapter: postgresql
database: msf_dev_db
username: msfdev
password: YOUR_PASSWORD_FOR_PGSQL
host: localhost
port: 5432
pool: 5
timeout: 5# Production database -- same as devproduction: &production
<<: *pgsql# Test database -- not the same, since it gets dropped all the timetest:
<<: *pgsql
database: msf_test_db
EOF
update-rc.d postgresql enable
sudo -sE su postgres
psql
update pg_database set datallowconn = TRUE where datname = 'template0';
\c template0
update pg_database set datistemplate = FALSE where datname = 'template1';
drop database template1;
create database template1 with template = template0 encoding = 'UTF8';
update pg_database set datistemplate = TRUE where datname = 'template1';
\c template1
update pg_database set datallowconn = FALSE where datname = 'template0';
\q
创建一个数据库用户
msfdev
createuser msfdev -dPRS # Come up with another great passwordcreatedb --owner msfdev msf_dev_db # Create the development databasecreatedb --owner msfdev msf_test_db # Create the test databaseexit # Become msfdev again
创建 database.yml
$HOME/.msf4/database.yml
:# Development Databasedevelopment: &pgsql
adapter: postgresql
database: msf_dev_db
username: msfdev
password: YOUR_PASSWORD_FOR_PGSQL
host: localhost
port: 5432
pool: 5
timeout: 5# Production database -- same as devproduction: &production
<<: *pgsql# Test database -- not the same, since it gets dropped all the timetest:
<<: *pgsql
database: msf_test_db
./msfconsole
,一个用于开发的数据库将会被创建,可以使用以下命令检查:./msfconsole -qx "db_status; exit"
运行规格说明
rake spec
配置 Git
TLDR(以 msfdev 用户的身份运行)
cd $HOME/git/metasploit-framework &&
git remote add upstream git@github.com:rapid7/metasploit-framework.git &&
git fetch upstream &&
git checkout -b upstream-master --track upstream/master &&
ruby tools/dev/add_pr_fetch.rb &&
ln -sf ../../tools/dev/pre-commit-hook.rb .git/hooks/pre-commit &&
ln -sf ../../tools/dev/pre-commit-hook.rb .git/hooks/post-merge &&
git config --global user.name "YOUR_USERNAME_FOR_REAL_LIFE" &&
git config --global user.email "YOUR_USERNAME_FOR_EMAIL" &&
git config --global github.user "YOUR_USERNAME_FOR_GITHUB"
配置 Pull Ref
.git/config
中。可以通过以下方式轻松完成:tools/dev/add_pr_fetch.rb
现在你就可以按照如下命令来进行操作了:git checkout fixes-to-pr-1234 upstream/pr/1234
git push origin
保持同步
同步到 upstream/master
git checkout master
git fetch upstream
git push origin
而且当你最终解决合并冲突之后,你可能会想使用 --force
参数来将本地修改重新同步到分支,因为你的提交历史将会在 rebase 之后变得不同。Msftidy 工具
msftity.rb
进行检查,所以按照如下命令配置 Git HOOK:cd $HOME/git/metasploit-framework
ln -sf ../../tools/dev/pre-commit-hook.rb .git/hooks/pre-commit
ln -sf ../../tools/dev/pre-commit-hook.rb .git/hooks/post-merge
配置你的身份
git config --global user.name "YOUR_USERNAME_FOR_REAL_LIFE"git config --global user.email "YOUR_USERNAME_FOR_EMAIL"git config --global github.user "YOUR_USERNAME_FOR_GITHUB"
对 Commits 签名
有用的别名
覆盖已经安装过的
msfconsole
msfconsole
,由于 RVM 会处理不同的 Ruby 版本和 gemsets 包的原因,可能会出现一些非预期的问题,所以你可以配置一下 Shell 的别名:echo 'alias msfconsole="pushd $HOME/git/metasploit-framework && ./msfconsole && popd"' >> ~/.bash_aliases
./msfconsole
和 msfconsole
来的方便)修改命令提示符使其支持显示 Ruby/Gemset/Branch
~/.bash_aliases
function git-current-branch {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'}export PS1="[ruby-\$(~/.rvm/bin/rvm-prompt v p g)]\$(git-current-branch)\n$PS1"
Git 命令别名
$HOME/.gitconfig
中被配置,也可以在 repo-name/.git/config
中被配置。
如下为一些很有用的别名配置:[alias]# 一个简单,带颜色的单行日志格式化命令,并且会显示当前是否签名的状态。nicelog = log --pretty=format:'%Cred%h%Creset -%Creset %s %Cgreen(%cr) %C(bold blue)<%aE>%Creset [%G?]'# 快捷方式:# 在 merge 和 commit 的时候自动签名,并且编辑 commit messagem = merge -S --no-ff --edit
c = commit -S --edit# 为快速运行 Git Blame 设置快捷方式,并且忽略空白字符的修改#(译者注:git blame 命令本身是在开发中出现问题的时候,用来定位某一个文件被谁修改了,这也是为啥叫 blame,当然也可以查看谁修复了 BUG 进行表扬。) b= blame -w# 快速创建一个临时分支,因为 Git Stash 命令太吓人了(译者注:估计是大部分人不太会用)temp = !"git branch -D temp; git checkout -b temp"# 在命令行中打开浏览器并创建一个 Pull Request,其中第一个参数为用户名,第二个参数为分支名。# 感谢 @kernelsmith 对命令的修正!pr-url =!"xdg-open https://github.com/$(git config github.user)/$(basename $(git rev-parse --show-toplevel))/pull/new/$1:$2...$(git branch-current) #"
作者:王一航
链接:https://www.jianshu.com/p/326e1034a7e4
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章