Refactored functionality to independent library scripts.
These utility scripts implement repeatedly required generic functionality.
This commit is contained in:
parent
1c75314311
commit
f541c2ba1f
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ArrayUtilsVersion="1.0"
|
||||||
|
|
||||||
|
# Due to the fact we're passing arrays via indirection,
|
||||||
|
# we've got to mangle variable names used within array
|
||||||
|
# functions to prevent accidentally having a naming
|
||||||
|
# conflic with an array, for example, an array with the
|
||||||
|
# "choice" identifier in the input_choice function.
|
||||||
|
# Eventually, input_choice's "choice" variable will
|
||||||
|
# be indirectly expanded rather than the choice array.
|
||||||
|
function array_contains() {
|
||||||
|
local __array_contains__item
|
||||||
|
|
||||||
|
# An efficient way to pass arrays around in bash
|
||||||
|
# is to perform indirect expansion by using the
|
||||||
|
# expansion symbol, $, along with the indirection
|
||||||
|
# symbol, !, in curly braces, ${! }, resulting in:
|
||||||
|
# function call: array_contains array[@] "text"
|
||||||
|
# funct params: $1 = "array[@]" $2 = "text"
|
||||||
|
# indirect exp: ${!1} => ${array[@]} (replaced!)
|
||||||
|
for __array_contains__item in "${!1}"; do
|
||||||
|
[[ "$__array_contains__item" == "$2" ]] && return 0;
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1 # Not found
|
||||||
|
}
|
||||||
|
|
||||||
|
# FLUXSCRIPT END
|
|
@ -0,0 +1,62 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
HashUtilsVersion="1.0"
|
||||||
|
|
||||||
|
HashOutputDevice="/dev/stdout"
|
||||||
|
|
||||||
|
function hash_check_handshake() {
|
||||||
|
local handshakeVerifier=$1
|
||||||
|
local handshakePath=$2
|
||||||
|
local handshakeAPSSID=$3
|
||||||
|
local handshakeAPMAC=$4
|
||||||
|
|
||||||
|
local analysis
|
||||||
|
local hashData
|
||||||
|
|
||||||
|
echo "Verifier $handshakeVerifier, path $handshakePath, SSID $handshakeAPSSID, MAC $handshakeAPMAC" > $HashOutputDevice
|
||||||
|
|
||||||
|
case "$handshakeVerifier" in
|
||||||
|
"pyrit")
|
||||||
|
readarray analysis < <(pyrit -r "$handshakePath" analyze 2> $HashOutputDevice)
|
||||||
|
if [ "${#analysis[@]}" -eq 0 -o $? != 0 ]; then
|
||||||
|
echo "pyrit seems to be broken!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local hashMeta=$(echo "${analysis[@]}" | grep "AccessPoint ${handshakeAPMAC,,} ('$handshakeAPSSID')")
|
||||||
|
|
||||||
|
if [ "$hashMeta" ]; then
|
||||||
|
local hashID=$(echo "$hashMeta" | awk -F'[ #:]' '{print $3}')
|
||||||
|
hashData=$(echo "${analysis[@]}" | awk "\$0~/#$hashID: HMAC_[[:alnum:]]+_AES/{ print \$0 }")
|
||||||
|
fi;;
|
||||||
|
"aircrack-ng")
|
||||||
|
readarray analysis < <(aircrack-ng "$handshakePath" 2> $HashOutputDevice)
|
||||||
|
if [ "${#analysis[@]}" -eq 0 -o $? != 0 ]; then
|
||||||
|
echo "aircrack-ng seems to be broken!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
hashData=$(echo "${analysis[@]}" | grep -E "${handshakeAPMAC^^}\s+$handshakeAPSSID");;
|
||||||
|
*) echo "Invalid verifier, quitting!"; return 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$hashData" ]; then
|
||||||
|
echo "Handshake for $handshakeAPSSID ($handshakeAPMAC) is missing!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local hashResult
|
||||||
|
case "$handshakeVerifier" in
|
||||||
|
"pyrit") hashResult=$(echo "$hashData" | grep "good");;
|
||||||
|
"aircrack-ng") hashResult=$(echo "$hashData" | grep "(1 handshake)");;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$hashResult" ]; then
|
||||||
|
echo "Invalid hash for $handshakeAPSSID ($handshakeAPMAC)!"
|
||||||
|
HASHCheckHandshake="invalid"
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
echo "Valid hash for $handshakeAPSSID ($handshakeAPMAC)!"
|
||||||
|
HASHCheckHandshake="valid"
|
||||||
|
fi
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
IOUtilsVersion="1.0"
|
||||||
|
|
||||||
|
IOUtilsHeader="[x] ================================ [x]"
|
||||||
|
IOUtilsQueryMark="[-] "
|
||||||
|
IOUtilsPrompt="[$USER@$HOSTNAME]> "
|
||||||
|
|
||||||
|
if [ ! "$ArrayUtilsVersion" ]; then source lib/ArrayUtils.sh; fi
|
||||||
|
|
||||||
|
function io_input_choice() {
|
||||||
|
local __io_input_choice__choice
|
||||||
|
until [ ! -z "$__io_input_choice__choice" ]; do
|
||||||
|
echo -ne "$IOUtilsPrompt"
|
||||||
|
|
||||||
|
local __io_input_choice__input
|
||||||
|
read __io_input_choice__input
|
||||||
|
|
||||||
|
local __io_input_choice__choices
|
||||||
|
for __io_input_choice__choices in ${@}; do
|
||||||
|
array_contains $__io_input_choice__choices "$__io_input_choice__input"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
__io_input_choice__choice="$__io_input_choice__input"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
IOInputChoice=$__io_input_choice__choice
|
||||||
|
}
|
||||||
|
|
||||||
|
function io_input_enumerated_choice() {
|
||||||
|
local __io_input_enumerated_choice__choices=("${!1}")
|
||||||
|
local __io_input_enumerated_choice__indexes=($(seq ${#__io_input_numeric_choice__choices[@]}))
|
||||||
|
io_input_choice __io_input_enumerated_choice__indexes[@]
|
||||||
|
IOInputEnumeratedChoice=${__io_input_enumerated_choice__choices[$IOInputChoice]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# This function outputs formatted lines of fields.
|
||||||
|
# The function takes an output file (like stdout),
|
||||||
|
# a "printf format string," and a variable number
|
||||||
|
# of indirect-expansion passed arrays (reference).
|
||||||
|
# NOTICE: At least the first array must be passed!
|
||||||
|
# Example: /dev/stdout "%s is %s." name[@] mood[@]
|
||||||
|
function io_output_format_fields() {
|
||||||
|
# Determine the amount of arguments passed.
|
||||||
|
local __io_output_format_fields__argument_count=${#@}
|
||||||
|
|
||||||
|
# Load locally by indirect expansion, ${! ... },
|
||||||
|
# and mangle the variable number argument arrays.
|
||||||
|
local __io_output_format_fields__i
|
||||||
|
for ((__io_output_format_fields__i = 3; \
|
||||||
|
__io_output_format_fields__i <= __io_output_format_fields__argument_count; \
|
||||||
|
__io_output_format_fields__i++)); do
|
||||||
|
eval "local __io_output_format_fields__field$__io_output_format_fields__i=(\"\${!$__io_output_format_fields__i}\")"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Determine the amount of records/lines to print.
|
||||||
|
# Notice at least the first array must be passed.
|
||||||
|
local __io_output_format_fields__record_count=${#__io_output_format_fields__field3[@]}
|
||||||
|
|
||||||
|
for ((__io_output_format_fields__i = 0; \
|
||||||
|
__io_output_format_fields__i < __io_output_format_fields__record_count; \
|
||||||
|
__io_output_format_fields__i++)); do
|
||||||
|
local __io_output_format_fields__values="\"\${__io_output_format_fields__field"$( \
|
||||||
|
seq -s "[$__io_output_format_fields__i]}\" \"\${__io_output_format_fields__field" 3 $__io_output_format_fields__argument_count \
|
||||||
|
)"[$__io_output_format_fields__i]}\""
|
||||||
|
eval "printf \"$2\" $__io_output_format_fields__values > $1"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function io_query_format_fields() {
|
||||||
|
# Assure we've got required parameters.
|
||||||
|
if [ ${#@} -lt 2 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local __io_query_format_fields__argument_count=${#@}
|
||||||
|
|
||||||
|
local __io_query_format_fields__query="$1"
|
||||||
|
local __io_query_format_fields__format="$2"
|
||||||
|
|
||||||
|
# Load locally by indirect expansion, ${! ... },
|
||||||
|
# and mangle the variable number argument arrays.
|
||||||
|
local __io_query_format_fields__i
|
||||||
|
for ((__io_query_format_fields__i = 3; \
|
||||||
|
__io_query_format_fields__i <= __io_query_format_fields__argument_count; \
|
||||||
|
__io_query_format_fields__i++)); do
|
||||||
|
eval "local __io_query_format_fields__f$__io_query_format_fields__i=(\"\${!$__io_query_format_fields__i}\")"
|
||||||
|
done
|
||||||
|
|
||||||
|
local __io_query_format_fields__record_count=${#__io_query_format_fields__f3[@]}
|
||||||
|
local __io_query_format_fields__indexes=($(seq $__io_query_format_fields__record_count))
|
||||||
|
|
||||||
|
if [ ! -z "$1" ]; then
|
||||||
|
if [ "`type -t $(echo -e "$IOUtilsHeader" | grep -vE '\s')`" = "function" ]; then $IOUtilsHeader;
|
||||||
|
else echo -e "$IOUtilsHeader"; fi
|
||||||
|
|
||||||
|
echo -e "$__io_query_format_fields__query"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
io_output_format_fields /dev/stdout "$__io_query_format_fields__format" __io_query_format_fields__indexes[@] ${@:3}
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
io_input_choice __io_query_format_fields__indexes[@]
|
||||||
|
|
||||||
|
IOQueryFormatFields=()
|
||||||
|
for ((__io_query_format_fields__i = 3; \
|
||||||
|
__io_query_format_fields__i <= __io_query_format_fields__argument_count; \
|
||||||
|
__io_query_format_fields__i++)); do
|
||||||
|
eval "IOQueryFormatFields[${#IOQueryFormatFields[@]}]=\${__io_query_format_fields__f$__io_query_format_fields__i[IOInputChoice - 1]}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function io_query_choice() {
|
||||||
|
# Assure we've got required parameters.
|
||||||
|
if [ ${#@} -lt 2 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
__io_query_choice__query=$([ -z "$1" ] && echo -n "" || echo -ne "$FLUXIONVLine $1\n")
|
||||||
|
io_query_format_fields "$__io_query_choice__query" "\t$CRed[$CYel%d$CRed]$CClr %b\n" $2
|
||||||
|
|
||||||
|
IOQueryChoice="${IOQueryFormatFields[0]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function io_query_file() {
|
||||||
|
if [ ${#@} -lt 2 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local __io_query_file__options
|
||||||
|
|
||||||
|
# List a line per line and redirect output.
|
||||||
|
# readarray __io_query_file__options < $2
|
||||||
|
mapfile __io_query_file__options < $2
|
||||||
|
|
||||||
|
# Strip newline characters from array elements
|
||||||
|
__io_query_file__options=("${__io_query_file__options[@]/$'\n'}")
|
||||||
|
|
||||||
|
io_query_choice "$1" __io_query_file__options[@]
|
||||||
|
|
||||||
|
IOQueryFile=$IOQueryChoice
|
||||||
|
}
|
||||||
|
|
||||||
|
# FLUXSCRIPT END
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SandboxUtilsVersion="1.0"
|
||||||
|
|
||||||
|
SandboxWorkspacePath="/tmp/sandbox"
|
||||||
|
SandboxOutputDevice="/dev/stdout"
|
||||||
|
|
||||||
|
# After changing global identifiers in the main script,
|
||||||
|
# I forgot to update the identifiers here, leading to a
|
||||||
|
# horrific accident where the script ended and executed
|
||||||
|
# the command "rm -rf /*" ... yeah, fuck that...
|
||||||
|
# Spent an entire day retreiving all my shit back.
|
||||||
|
function sandbox_remove_workfile() {
|
||||||
|
# Check we've got the environment variables ready.
|
||||||
|
if [[ -z "$SandboxWorkspacePath" || -z "$SandboxOutputDevice" ]]; then
|
||||||
|
echo "The workspace path, or the output device is missing." > $SandboxOutputDevice
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check we're actually deleting a workfile.
|
||||||
|
if [[ "$1" != $SandboxWorkspacePath* ]]; then
|
||||||
|
echo "Stopped an attempt to delete non-workfiles." > $SandboxOutputDevice
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Attempt to remove iff it exists.
|
||||||
|
#if [ ! -e "$1" -a "$1" != *"/"*"*" ]; then
|
||||||
|
# echo "Stopped an attempt to delete non-existent files" > $SandboxOutputDevice
|
||||||
|
# return 3;
|
||||||
|
#fi
|
||||||
|
|
||||||
|
# Remove the target file (do NOT force it).
|
||||||
|
eval "rm -r $1 &> $SandboxOutputDevice"
|
||||||
|
}
|
||||||
|
|
||||||
|
# FLUXSCRIPT END
|
|
@ -0,0 +1,47 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VIGW="at0"
|
||||||
|
VIAP=$WIAccessPoint
|
||||||
|
|
||||||
|
#APServiceAuthenticationMethods=("hash" "wpa_supplicant")
|
||||||
|
#APServiceAuthenticationMethodsInfo=("(handshake, recommended)" "(connection, slow)")
|
||||||
|
|
||||||
|
# airbase-ng uses a monitor-mode virtual interface
|
||||||
|
# and creates a separate interface, atX, for dhcpd.
|
||||||
|
VIAPAddress="$VIGWNetwork.2"
|
||||||
|
|
||||||
|
VIAPRouteDelay=5
|
||||||
|
|
||||||
|
#APServiceConfPath="$DUMP_PATH/APService.conf"
|
||||||
|
|
||||||
|
function ap_stop() {
|
||||||
|
killall airbase-ng &> $FLUXIONOutputDevice
|
||||||
|
|
||||||
|
local FLUXIONAPService=$(ps a | grep -e "FLUXION AP Service" | awk '{print $1'})
|
||||||
|
if [ "$FLUXIONAPService" ]; then
|
||||||
|
kill $FLUXIONAPService &> $FLUXIONOutputDevice
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_reset() {
|
||||||
|
ap_stop
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_route() {
|
||||||
|
ifconfig $VIAP $VIAPAddress netmask 255.255.255.0
|
||||||
|
sysctl net.ipv6.conf.at0.disable_ipv6=1 &> $FLUXIONOutputDevice
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_prep() {
|
||||||
|
ap_stop
|
||||||
|
|
||||||
|
# Spoof virtual interface MAC address.
|
||||||
|
# This is done by airbase-ng automatically.
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_start() {
|
||||||
|
xterm $BOTTOMRIGHT -bg "#000000" -fg "#FFFFFF" -title "FLUXION AP Service [airbase-ng]" -e airbase-ng -P -e $APTargetSSID -c $APTargetChannel -a $APRogueMAC $VIAP &
|
||||||
|
sleep $VIAPRouteDelay; ap_route
|
||||||
|
}
|
||||||
|
|
||||||
|
# FLUXSCRIPT END
|
|
@ -0,0 +1,71 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
VIGW=$WIAccessPoint
|
||||||
|
VIAP=$WIAccessPoint
|
||||||
|
|
||||||
|
#APServiceAuthenticationMethods=("hash")
|
||||||
|
#APServiceAuthenticationMethodsInfo=("(handshake, recommended)")
|
||||||
|
|
||||||
|
# HostAPD sets the virtual interface mode
|
||||||
|
# to master, which is supported by dhcpd.
|
||||||
|
VIAPAddress=$VIGWAddress
|
||||||
|
|
||||||
|
VIAPRouteDelay=5
|
||||||
|
|
||||||
|
APServiceConfPath="$DUMP_PATH/APService.conf"
|
||||||
|
|
||||||
|
function ap_stop() {
|
||||||
|
killall hostapd &> $FLUXIONOutputDevice
|
||||||
|
|
||||||
|
local FLUXIONAPService=$(ps a | grep -e "FLUXION AP Service" | awk '{print $1'})
|
||||||
|
if [ "$FLUXIONAPService" ]; then
|
||||||
|
kill $FLUXIONAPService &> $FLUXIONOutputDevice
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_reset() {
|
||||||
|
ap_stop
|
||||||
|
|
||||||
|
# Reset MAC address to original.
|
||||||
|
ifconfig $VIAP down
|
||||||
|
sleep 0.4
|
||||||
|
|
||||||
|
macchanger -p $VIAP &> $FLUXIONOutputDevice
|
||||||
|
sleep 0.4
|
||||||
|
|
||||||
|
ifconfig $VIAP up
|
||||||
|
sleep 0.4
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_route() {
|
||||||
|
echo "No custom routes for hostapd" > $FLUXIONOutputDevice
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_prep() {
|
||||||
|
ap_stop
|
||||||
|
|
||||||
|
# Prepare the hostapd config file.
|
||||||
|
echo "\
|
||||||
|
interface=$VIAP
|
||||||
|
driver=nl80211
|
||||||
|
ssid=$APTargetSSID
|
||||||
|
channel=$APTargetChannel\
|
||||||
|
" > $APServiceConfPath
|
||||||
|
|
||||||
|
# Spoof virtual interface MAC address.
|
||||||
|
ifconfig $VIAP down
|
||||||
|
sleep 0.4
|
||||||
|
|
||||||
|
macchanger --mac=$APRogueMAC $VIAP &> $FLUXIONOutputDevice
|
||||||
|
sleep 0.4
|
||||||
|
|
||||||
|
ifconfig $VIAP up
|
||||||
|
sleep 0.4
|
||||||
|
}
|
||||||
|
|
||||||
|
function ap_start() {
|
||||||
|
xterm $HOLD $BOTTOMRIGHT -bg "#000000" -fg "#FFFFFF" -title "FLUXION AP Service [hostapd]" -e hostapd $APServiceConfPath &
|
||||||
|
sleep $VIAPRouteDelay; ap_route
|
||||||
|
}
|
||||||
|
|
||||||
|
# FLUXSCRIPT END
|
Loading…
Reference in New Issue