eselect-metasploit: ugh, I hate myself

This commit is contained in:
Rick Farina (Zero_Chaos) 2020-09-10 14:57:21 -04:00
parent d1a7a37b95
commit 6d758768cd
No known key found for this signature in database
GPG key ID: A29433C0AA431DDC
7 changed files with 322 additions and 0 deletions

View file

@ -0,0 +1,41 @@
# Copyright 1999-2020 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=7
inherit multilib
DESCRIPTION="eselect module for metasploit"
HOMEPAGE="http://www.pentoo.ch/"
SRC_URI=""
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~arm ~x86"
IUSE=""
DEPEND="!<net-analyzer/metasploit-4.6"
RDEPEND="${DEPEND}
app-admin/eselect"
S=${WORKDIR}
src_install() {
#force to use the outdated bundled version of metasm
doenvd "${FILESDIR}"/91metasploit
newinitd "${FILESDIR}"/msfrpcd.initd msfrpcd
newconfd "${FILESDIR}"/msfrpcd.confd msfrpcd
insinto /usr/share/eselect/modules
newins "${FILESDIR}/metasploit.eselect-0.13" metasploit.eselect
newbin "${FILESDIR}"/msfloader-${PV} msfloader
}
pkg_postinst() {
"${EROOT}"/usr/bin/eselect metasploit set --use-old 1
elog "To switch between installed slots, execute as root:"
elog " # eselect metasploit set [slot number]"
}

View file

@ -0,0 +1,8 @@
MSF_DATABASE_CONFIG=/usr/lib/metasploit/config/database.yml
# needed because MSF ships an old version of metasm
# which isn't compatible with the new one
MSF_LOCAL_LIB="/usr/lib/metasploit/lib/metasm"
# needed because MSF doesn't know where it is since the alzheimer's
MSF_ROOT=/usr/lib/metasploit

View file

@ -0,0 +1,207 @@
# -*-eselect-*- vim: ft=eselect
# Copyright 2005-2020 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2 or later
# $
DESCRIPTION="Control which metaploit version is active"
MAINTAINER="zerochaos@pentoo.ch"
###WARNING: don't even think of using this insanity for a reference (but it works,mostly)
#base idea from kernel.eselect, get_libdir from php.eselect with --use-old from opencl.eselect
#all modified randomly until it worked, entropy is wonderful
###/WARNING
inherit multilib
get_libdir() {
local dir
if has lib64 $(list_libdirs); then
echo lib64
return
fi
echo lib
}
MSFPATH="/usr/$(get_libdir)/metasploit"
# find a list of metasploit symlink targets and sort them
find_targets() {
local f
for f in "${EROOT}${MSFPATH}"[[:digit:]]*; do
[[ -d ${f} ]] && basename "${f}"
done | LC_ALL=C sort
}
# remove the metasploit symlink
remove_symlink() {
for i in $(qlist metasploit | grep $(canonicalise "${EROOT}${MSFPATH}")/msf)
do
if [ -L /usr/bin/$(echo ${i} | awk -F'/' '{print $5}') ]; then
unlink /usr/bin/$(echo ${i} | awk -F'/' '{print $5}') || die -q "failed to unlink ${i}"
fi
done
if [ -L ${EROOT}${MSFPATH} ]; then
unlink "${EROOT}${MSFPATH}" || die -q "failed to unlink ${EROOT}${MSFPATH}"
elif [ -e ${EROOT}${MSFPATH} ]; then
die -q "${EROOT}${MSFPATH} exists but is not a symlink"
fi
}
# set the metasploit symlink
set_symlink() {
local target=$1
if is_number "${target}"; then
local targets=( $(find_targets) )
target=${targets[target-1]}
fi
if [[ -z ${target} ]]; then
die -q "Target \"$1\" doesn't appear to be valid!"
elif [[ -d ${EROOT}/usr/$(get_libdir)/${target} ]]; then
ln -s "${target}" "${EROOT}${MSFPATH}"
for i in $(qlist metasploit | grep /usr/$(get_libdir)/${target}/msf)
do
ln -s /usr/bin/msfloader /usr/bin/$(echo ${i} | awk -F'/' '{print $5}')
done
#this elif looks like it is trying to support setting by slot only,
#but that isn't supported by the rest of the script... fix or remove?
elif [[ -d ${EROOT}${MSFPATH}${target} ]]; then
ln -s "metasploit${target}" "${EROOT}${MSFPATH}"
for i in $(qlist metasploit | grep /usr/$(get_libdir)/${target}/msf)
do
ln -s /usr/bin/msfloader /usr/bin/$(echo ${i} | awk -F'/' '{print $5}')
done
else
die -q "Target \"$1\" doesn't appear to be valid!"
fi
}
# wrapper to safely set the symlink
set_symlink_safe() {
if [[ -L ${EROOT}${MSFPATH} ]]; then
# existing symlink
remove_symlink || die -q "Couldn't remove existing symlink"
set_symlink "$1" || die -q "Couldn't set a new symlink"
#um, why is there an env-update here?
env-update
elif [[ -e ${EROOT}${MSFPATH} ]]; then
# we have something strange
die -q "${EROOT}${MSFPATH} exists but is not a symlink"
else
set_symlink "$1" || die -q "Couldn't set a new symlink"
fi
}
### show action ###
describe_show() {
echo "Show the current metasploit symlink"
}
do_show() {
write_list_start "Current metasploit symlink:"
if [[ -L ${EROOT}${MSFPATH} ]]; then
local metasploit=$(canonicalise "${EROOT}${MSFPATH}")
write_kv_list_entry "${metasploit%/}" ""
else
write_kv_list_entry "(unset)" ""
fi
}
### list action ###
describe_list() {
echo "List available metasploit symlink targets"
}
do_list() {
local i targets=( $(find_targets) )
write_list_start "Available metasploit symlink targets:"
for (( i = 0; i < ${#targets[@]}; i++ )); do
[[ ${targets[i]} = \
$(basename "$(canonicalise "${EROOT}${MSFPATH}")") ]] \
&& targets[i]=$(highlight_marker "${targets[i]}")
done
write_numbered_list -m "(none found)" "${targets[@]}"
}
### set action ###
describe_set() {
echo "Set a new metasploit symlink target"
}
describe_set_parameters() {
echo "<target>"
}
describe_set_options() {
echo "<target> : Target name or number (from 'list' action)"
echo "--use-old : If an implementation is already set, use that one instead"
}
do_set() {
local action="error"
local current=$(basename "$(canonicalise "${EROOT}${MSFPATH}")")
local available=( $(find_targets) )
local new
local opt
while [[ ${#@} -gt 0 ]] ; do
opt=$1
shift
case ${opt} in
--use-old)
if [[ -n "${current}" ]] && has "${current}" "${available[@]}"; then
action="old-implementation"
fi
;;
metasploit*)
if [[ "${action}" != "old-implementation" ]] ; then
action="set-implementation"
fi
if has ${opt} ${available[@]}; then
new="${opt}"
else
echo "You need to emerge ${opt} before you try to eselect it"
fi
;;
*)
if [[ "${action}" != "old-implementation" ]] ; then
action="set-implementation"
fi
if is_number ${opt} ; then
#targets=( $(get_implementations) )
new=${available[opt - 1]}
if [[ -z ${new} ]] ; then
die -q "Unrecognized option: ${opt}"
fi
else
die -q "Unrecognized option: ${opt}"
fi
;;
esac
done
case ${action} in
old-implementation)
set_symlink_safe ${current}
return $?
;;
set-implementation)
if [[ -n ${new} ]] ; then
set_symlink_safe ${new}
return $?
else
die -q "Please specify an implementation to set"
fi
;;
*)
die -q "Invalid usage of set action."
;;
esac
}

View file

@ -0,0 +1,18 @@
#!/bin/sh
#todo:
#add in optional auto starting/stopping of postgres
#read the desired version of ruby from the eselected version of msf
header="$(head -n1 /usr/lib/metasploit/msfconsole)"
ruby="${header:2}"
#ensure Gemfile.lock is up to date
if ! BUNDLE_GEMFILE=/usr/lib/metasploit/Gemfile ${ruby} -S bundle check > /dev/null 2>&1; then
echo "Something went wrong, please open a bug for metasploit on https://github.com/pentoo/pentoo-overlay/issues"
exit 1
fi
#ready to go
BUNDLE_GEMFILE=/usr/lib/metasploit/Gemfile ${ruby} -S bundle exec /usr/lib/metasploit/$(basename $0) "$@"
#profit

View file

@ -0,0 +1,16 @@
# Config file for /etc/init.d/metasploit
# Bind to the following IP instead of the loopback address
IPADDR=127.0.0.1
# Bind to the following TCP port instead of default 55555
PORT=55553
# Use the following username instead of msf
USER="msf"
# Use the following password instead of msf
PASS="secure"
# All options
MSF_OPTS="-U $USER -P $PASS -S -a $IPADDR -p $PORT"

View file

@ -0,0 +1,22 @@
#!/sbin/openrc-run
# Copyright 1999-2020 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
VERSION=
PIDFILE=/var/run/msfrpcd${VERSION}.pid
start() {
ebegin "Starting msfrpcd"
start-stop-daemon --start --quiet --background \
--exec /usr/bin/msfrpcd \
--pidfile ${PIDFILE} \
--make-pidfile -- -f ${MSF_OPTS}
eend $?
}
stop() {
ebegin "Stopping msfrpcd"
start-stop-daemon --stop --quiet -s 9 --pidfile ${PIDFILE}
eend $?
}

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer>
<email>zerochaos@gentoo.org</email>
<name>Rick Farina</name>
</maintainer>
<longdescription lang="en">
</longdescription>
</pkgmetadata>