Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
1N3
GitHub Repository: 1N3/Sn1per
Path: blob/master/sniper
2935 views
#!/bin/bash
# + -- --=[Sn1per Community Edition by @xer0dayz
# + -- --=[https://sn1persecurity.com
# 

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root"
   exit 1
fi

VER="9.2"
INSTALL_DIR="/usr/share/sniper"
LOOT_DIR="$INSTALL_DIR/loot/$TARGET"
SNIPER_PRO=$INSTALL_DIR/pro.sh

# INIT POSTGRESQL
service postgresql start 2> /dev/null

# LOAD DEFAULT SNIPER CONFIGURATION FILE
dos2unix $INSTALL_DIR/sniper.conf 2> /dev/null > /dev/null
source $INSTALL_DIR/sniper.conf
echo -e "$OKBLUE[*]$RESET Loaded configuration file from $INSTALL_DIR/sniper.conf $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"

if [[ -f /root/.sniper.conf ]]; then
  # LOAD USER SN1PER CONFIGURATION FILE
  dos2unix /root/.sniper.conf 2> /dev/null > /dev/null
  source /root/.sniper.conf
  echo -e "$OKBLUE[*]$RESET Loaded configuration file from /root/.sniper.conf $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"

  if [[ -f /root/.sniper_api_keys.conf ]]; then
    # LOAD USER API KEYS (PERSISTENT CONFIG)
    dos2unix /root/.sniper_api_keys.conf 2> /dev/null > /dev/null
    source /root/.sniper_api_keys.conf
    echo -e "$OKBLUE[*]$RESET Loaded API keys from /root/.sniper_api_keys.conf $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
  fi

else
  # IF NO USER CONFIG PRESENT, CREATE IT FROM THE DEFAULT TEMPLATE
  cp $INSTALL_DIR/sniper.conf /root/.sniper.conf 2> /dev/null
  dos2unix /root/.sniper.conf 2> /dev/null > /dev/null
  source /root/.sniper.conf
  echo -e "$OKBLUE[*]$RESET Loaded configuration file from /root/.sniper.conf $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
fi

DISTRO=$(cat /etc/*-release | grep DISTRIB_ID= | cut -d'=' -f2)

function help {
  logo
  local star
  printf -v star "$OKBLUE[*]$RESET"
  cat <<EOHELP

$star NORMAL MODE
 sniper -t <TARGET>

$star SPECIFY CUSTOM CONFIG FILE
 sniper -c /full/path/to/sniper.conf -t <TARGET> -m <MODE> -w <WORKSPACE>

$star NORMAL MODE + OSINT + RECON
 sniper -t <TARGET> -o -re

$star STEALTH MODE + OSINT + RECON
 sniper -t <TARGET> -m stealth -o -re

$star DISCOVER MODE
 sniper -t <CIDR> -m discover -w <WORSPACE_ALIAS>

$star SCAN ONLY SPECIFIC PORT
 sniper -t <TARGET> -m port -p <portnum>

$star FULLPORTONLY SCAN MODE
 sniper -t <TARGET> -fp

$star WEB MODE - PORT 80 + 443 ONLY!
 sniper -t <TARGET> -m web

$star HTTP WEB PORT MODE
 sniper -t <TARGET> -m webporthttp -p <port>

$star HTTPS WEB PORT MODE
 sniper -t <TARGET> -m webporthttps -p <port>

$star HTTP WEBSCAN MODE
 sniper -t <TARGET> -m webscan

$star ENABLE BRUTEFORCE
 sniper -t <TARGET> -b

$star AIRSTRIKE MODE
 sniper -f targets.txt -m airstrike

$star NUKE MODE WITH TARGET LIST, BRUTEFORCE ENABLED, FULLPORTSCAN ENABLED, OSINT ENABLED, RECON ENABLED, WORKSPACE & LOOT ENABLED
 sniper -f targets.txt -m nuke -w <WORKSPACE_ALIAS>

$star MASS PORT SCAN MODE
 sniper -f targets.txt -m massportscan -w <WORKSPACE_ALIAS>

$star MASS WEB SCAN MODE
 sniper -f targets.txt -m massweb -w <WORKSPACE_ALIAS>

$star MASS WEBSCAN SCAN MODE
 sniper -f targets.txt -m masswebscan -w <WORKSPACE_ALIAS>

$star MASS VULN SCAN MODE
 sniper -f targets.txt -m massvulnscan -w <WORKSPACE_ALIAS>

$star PORT SCAN MODE
 sniper -t <TARGET> -m port -p <PORT_NUM>

$star LIST WORKSPACES
 sniper --list

$star DELETE WORKSPACE
 sniper -w <WORKSPACE_ALIAS> -d

$star DELETE HOST FROM WORKSPACE
 sniper -w <WORKSPACE_ALIAS> -t <TARGET> -dh

$star DELETE TASKS FROM WORKSPACE
 sniper -w <WORKSPACE_ALIAS> -t <TARGET> -dt

$star GET SNIPER SCAN STATUS
 sniper --status

$star LOOT REIMPORT FUNCTION
 sniper -w <WORKSPACE_ALIAS> --reimport

$star LOOT REIMPORTALL FUNCTION
 sniper -w <WORKSPACE_ALIAS> --reimportall

$star LOOT REIMPORT FUNCTION
 sniper -w <WORKSPACE_ALIAS> --reload

$star LOOT EXPORT FUNCTION
 sniper -w <WORKSPACE_ALIAS> --export

$star SCHEDULED SCANS
 sniper -w <WORKSPACE_ALIAS> -s daily|weekly|monthly

$star USE A CUSTOM CONFIG
 sniper -c /path/to/sniper.conf -t <TARGET> -w <WORKSPACE_ALIAS>

$star UPDATE SNIPER
 sniper -u|--update


EOHELP
  exit
}

function logo {
  echo -e "$OKRED                ____               $RESET"
  echo -e "$OKRED    _________  /  _/___  ___  _____$RESET"
  echo -e "$OKRED   / ___/ __ \ / // __ \/ _ \/ ___/$RESET"
  echo -e "$OKRED  (__  ) / / // // /_/ /  __/ /    $RESET"
  echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/     $RESET"
  echo -e "$OKRED               /_/                 $RESET"
  echo ""
  echo -e "$OKORANGE + -- --=[ https://sn1persecurity.com$RESET"
  echo -e "$OKORANGE + -- --=[ Sn1per v$VER by @xer0dayz$RESET"
  echo ""
}

function sniper_status {
  watch -n 1 -c 'ps -ef | egrep "sniper|slurp|hydra|ruby|python|dirsearch|amass|nmap|metasploit|curl|wget|nikto" && echo "NETWORK CONNECTIONS..." && netstat -an | egrep "TIME_WAIT|EST"'
}

# CHECK FOR UPDATES
function check_update {
  if [[ "$ENABLE_AUTO_UPDATES" == "1" ]] && [[ "$ONLINE" == "1" ]]; then
    LATEST_VER=$(curl --connect-timeout 5 -s https://api.github.com/repos/1N3/Sn1per/tags | grep -Po '"name":.*?[^\\]",'| head -1 | cut -c11-13)
    if [[ "$LATEST_VER" != "$VER" ]]; then
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE] sniper v$LATEST_VER is available to download... To update, type$OKRED \"sniper -u\" $RESET"
    fi
  fi
  touch /tmp/update-check.txt 2> /dev/null
}

# APPLY UPDATES
function update {
  logo
  echo -e "$OKBLUE[*]$RESET Checking for updates...$OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
  if [[ "$ONLINE" == "0" ]]; then
    echo "You will need to download the latest release manually at https://github.com/1N3/Sn1per/"
  else
    LATEST_VER=$(curl --connect-timeout 5 -s https://api.github.com/repos/1N3/Sn1per/tags | grep -Po '"name":.*?[^\\]",'| head -1 | cut -c11-13)
    if [[ "$LATEST_VER" != "$VER" ]]; then
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE] Sn1per $LATEST_VER is available to download...Do you want to update? (y or n)$RESET"
      read ans
      if [[ "$ans" = "y" ]]; then
        rm -Rf /tmp/Sn1per/ 2>/dev/null
        git clone https://github.com/1N3/Sn1per /tmp/Sn1per/
        cd /tmp/Sn1per/
        chmod +rx install.sh
        bash install.sh
        rm -Rf /tmp/Sn1per/ 2>/dev/null
        exit
      fi
    fi
  fi
}

if [[ "$UPDATE" = "1" ]]; then
  update
  exit
fi

# CHECK IF ONLINE
function check_online {
  ONLINE=$(curl --connect-timeout 3 --insecure -s "https://sn1persecurity.com/community/updates.txt?$VER&mid=$(cat /etc/machine-id)" 2> /dev/null)
  if [[ -z "$ONLINE" ]]; then
    ONLINE=$(curl --connect-timeout 3 -s https://api.github.com/repos/1N3/Sn1per/tags | grep -Po '"name":.*?[^\\]",'| head -1 | cut -c11-13)
    if [[ -z "$ONLINE" ]]; then
      ONLINE="0"
      echo -e "$OKBLUE[*]$RESET Checking for active internet connection $OKBLUE[$RESET${OKRED}FAIL${RESET}$OKBLUE]"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET sniper is running in offline mode.$RESET"
    else
      ONLINE="1"
      echo -e "$OKBLUE[*]$RESET Checking for active internet connection $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
    fi
  else
    ONLINE="1"
    echo -e "$OKBLUE[*]$RESET Checking for active internet connection $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
  fi
}

# COMMAND LINE SWITCHES
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -h|--help)
    help
    shift # past argument
    ;;
    -c|--config)
    CONFIG="$2"
    echo -e "$OKBLUE[*]$RESET Creating backup of existing config to /root/.sniper.conf.bak...$OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
    cp -f /root/.sniper.conf /root/.sniper.conf.bak
    echo -e "$OKBLUE[*]$RESET Copying $CONFIG to /root/.sniper.conf...$OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
    cp -f $CONFIG /root/.sniper.conf 2> /dev/null
    dos2unix /root/.sniper.conf 2> /dev/null > /dev/null
    source /root/.sniper.conf
    sleep 1
    shift
    shift
    ;;
    -t)
    TARGET="$2"
    shift # past argument
    shift # past argument
    ;;
    -b)
    AUTO_BRUTE="1"
    shift # past argument
    ;;
    -fp|--fullportscan)
    FULLNMAPSCAN="1"
    shift # past argument
    ;;
    -o|--osint)
    OSINT="1"
    shift # past argument
    ;;
    -re|--recon)
    RECON="1"
    shift # past argument
    ;;
    -m)
    MODE="$2"
    shift # past argument
    shift # past argument
    ;;
    -p)
    PORT="$2"
    shift # past argument
    shift # past argument
    ;;
    -f|--file)
    FILE="$(realpath $2)"
    shift # past argument
    shift # past argument
    ;;
    -ri|--reimport)
    REIMPORT="1"
    shift # past argument
    ;;
    -ria|--reimportall)
    REIMPORT_ALL="1"
    shift # past argument
    ;;
    -rl|--reload)
    RELOAD="1"
    shift # past argument
    ;;
    -n|--noreport)
    REPORT="0"
    shift # past argument
    ;;
    -nl|--noloot)
    LOOT="0"
    NOLOOT="1"
    shift # past argument
    ;;
    -w)
    WORKSPACE="$(echo $2 | tr / -)"
    WORKSPACE_DIR="$INSTALL_DIR/loot/workspace/$WORKSPACE"
    shift # past argument
    shift # past argument
    ;;
    -s|--schedule)
    if [[ -z "$WORKSPACE" ]]; then
      echo "You need to set a workspace via the -w switch to schedule a scan task."
      exit
    fi
    SCHEDULE_ARG="$2"
    if [[ "$SCHEDULE_ARG" = "daily" ]] || [[ "$SCHEDULE_ARG" = "weekly" ]] || [[ "$SCHEDULE_ARG" = "monthly" ]]; then
      SCHEDULE_TASK="$WORKSPACE_DIR/scans/scheduled/$SCHEDULE_ARG.sh"
      vim $SCHEDULE_TASK
      cat $WORKSPACE_DIR/scans/scheduled/*.sh 2> /dev/null
      exit
    else
      echo "You need to specify either daily, weekly or monthly for the scheduled scan argument."
      exit
    fi
    shift # past argument
    shift # past argument
    ;;
    -d|--delete)
    logo
    echo "Are you sure you want to remove the following workspace? (Hit Ctrl+C to exit): /usr/share/sniper/loot/workspace/$WORKSPACE/"
    read ANS
    rm -Rf /usr/share/sniper/loot/workspace/$WORKSPACE/
    echo "Workspace /usr/share/sniper/loot/workspace/$WORKSPACE/ was removed."
    sniper -w default --reimport
    exit
    shift # past argument
    ;;
    -dh|--delete-host)
    echo "Removing $TARGET from $WORKSPACE"
    sed -i "/$TARGET/d" $WORKSPACE_DIR/domains/* $WORKSPACE_DIR/reports/host-table-report.csv
    egrep -R "$TARGET" $WORKSPACE_DIR/domains/* $WORKSPACE_DIR/reports/host-table-report.csv
    rm -f $WORKSPACE_DIR/screenshots/$TARGET*.jpg 2> /dev/null
    rm -f $WORKSPACE_DIR/nmap/dns-$TARGET.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/nmap/ports-$TARGET.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/web/title-*-$TARGET.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/web/headers-*-$TARGET.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/vulnerabilities/sc0pe-$TARGET-*.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/vulnerabilities/vulnerability-report-$TARGET.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/vulnerabilities/vulnerability-risk-$TARGET.txt 2> /dev/null
    #sniper --reimportall -w $WORKSPACE
    exit
    shift # past argument
    ;;
    -dt|--delete-task)
    echo "Removing all running $TARGET tasks from $WORKSPACE"
    rm -vf $WORKSPACE_DIR/scans/running_$TARGET_*.txt
    ls -lh $LOOT_DIR/scans/running_*.txt 2> /dev/null | wc -l 2> /dev/null > $WORKSPACE_DIR/scans/tasks-running.txt 2> /dev/null
    ps -ef | egrep "$TARGET|sniper"
    ps -ef | egrep "sniper" | awk '{print $2}' | xargs -i sudo kill -9 {} 
    exit
    shift # past argument
    ;;
    --list)
    logo
    ls -l $INSTALL_DIR/loot/workspace/
    echo ""
    echo "cd /usr/share/sniper/loot/workspace/"
    WORKSPACE_REPORT=$LOOT_DIR/sniper-report.html
    if [[ -f $WORKSPACE_REPORT ]]; then
      echo -e "$OKORANGE + -- --=[ Loading Sn1per Professional...$RESET"
      $BROWSER $INSTALL_DIR/loot/workspace/sniper-report.html 2> /dev/null > /dev/null &
    else
      echo -e "$OKORANGE + -- --=[ Loading workspaces...$RESET"
      $BROWSER $INSTALL_DIR/loot/workspace/ 2> /dev/null > /dev/null &
    fi
    exit
    shift
    ;;
    --export)
    if [[ -z "$WORKSPACE" ]]; then
      echo "You need to set a workspace via the -w switch to export a workspace."
      exit
    fi
    echo "Archiving $WORKSPACE to $INSTALL_DIR/loot/$WORKSPACE.tar"
    cd $INSTALL_DIR/loot/workspace/ && tar -cvf ../$WORKSPACE.tar $WORKSPACE 
    cp -Rf $WORKSPACE ${WORKSPACE}_`date +"%Y-%m-%d"`
    echo "Done!"
    exit
    shift
    ;;
    -s|--status)
    sniper_status
    exit
    shift
    ;;
    -u|--update)
    UPDATE="1"
    update
    exit
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    echo "Unknown scan option $POSITIONAL...refer to the help menu for usage details."
    exit
    shift # past argument
    ;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters

if [[ ! -z "$TARGET" ]] && [[ -z "$WORKSPACE" ]]; then
  WORKSPACE=$(echo "$TARGET")
fi

if [[ -z "$TARGET" ]] && [[ -z "$WORKSPACE" ]]; then
  logo
  echo "You need to specify a target or workspace to use. Type sniper --help for command usage."
  exit
fi

cd $INSTALL_DIR

function init {
  if [[ ! -z $WORKSPACE_DIR ]]; then
    LOOT_DIR=$WORKSPACE_DIR
  fi
  echo -e "$OKBLUE[*]$RESET Saving loot to $LOOT_DIR $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
  mkdir -p $LOOT_DIR 2> /dev/nul
  mkdir $LOOT_DIR/domains 2> /dev/null
  mkdir $LOOT_DIR/ips 2> /dev/null
  mkdir $LOOT_DIR/screenshots 2> /dev/null
  mkdir $LOOT_DIR/nmap 2> /dev/null
  mkdir $LOOT_DIR/reports 2> /dev/null
  mkdir $LOOT_DIR/output 2> /dev/null
  mkdir $LOOT_DIR/osint 2> /dev/null
  mkdir $LOOT_DIR/credentials 2> /dev/null
  mkdir $LOOT_DIR/web 2> /dev/null
  mkdir $LOOT_DIR/vulnerabilities 2> /dev/null
  mkdir $LOOT_DIR/notes 2> /dev/null
  mkdir -p $LOOT_DIR/scans/scheduled/ 2> /dev/null
  touch $LOOT_DIR/scans/scheduled/daily.sh 2> /dev/null
  touch $LOOT_DIR/scans/scheduled/weekly.sh 2> /dev/null
  touch $LOOT_DIR/scans/scheduled/monthly.sh 2> /dev/null
  touch $LOOT_DIR/scans/notifications.txt 2> /dev/null
  touch $LOOT_DIR/scans/notifications_new.txt 2> /dev/null
  chmod 777 -Rf $INSTALL_DIR 2> /dev/null
  chown root $INSTALL_DIR/sniper 2> /dev/null
  chmod 4777 $INSTALL_DIR/sniper 2> /dev/null
  TARGET="$(echo $TARGET | sed 's/https:\/\///g' | sed 's/http:\/\///g')"
  rm -f /tmp/out_of_scope 2> /dev/null
  for key in "${OUT_OF_SCOPE[@]}"; do echo $TARGET | egrep ${key} >> /tmp/out_of_scope 2> /dev/null; done;
  OUT_OF_SCOPE_NUM=$(wc -l /tmp/out_of_scope 2> /dev/null | awk '{print $1}' 2> /dev/null)
  if [[ $OUT_OF_SCOPE_NUM > 0 ]]; then
    echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE] $TARGET is out of scope. Skipping! $RESET"
    exit
  else
    echo -e "$OKBLUE[*]$RESET Scanning $TARGET $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
    echo "$TARGET" >> $LOOT_DIR/domains/targets.txt 2> /dev/null
  fi
  service postgresql start 2> /dev/null > /dev/null
  msfdb start 2> /dev/null > /dev/null
  chown root /run/user/1000/gdm/Xauthority 2> /dev/null
  LAST_USER=$(last | head -n 1 | awk '{print $1}')
  sudo cp -a /home/$LAST_USER/.Xauthority /root/.Xauthority 2> /dev/null
  sudo cp -a /root/.Xauthority /root/.Xauthority.bak 2> /dev/null
  sudo cp -a /home/$USER/.Xauthority /root/.Xauthority 2> /dev/null
  sudo cp -a /home/kali/.Xauthority /root/.Xauthority 2> /dev/null
  sudo chown root: /root/.Xauthority 2> /dev/null
  XAUTHORITY=/root/.Xauthority
  UPDATED_TARGETS=$LOOT_DIR/scans/updated.txt
  if [[ "$AUTO_BRUTE" == "1" ]]; then
    echo "$TARGET AUTO_BRUTE `date +"%Y-%m-%d %H:%M"`" 2> /dev/null >> $LOOT_DIR/scans/tasks.txt
    touch $LOOT_DIR/scans/$TARGET-AUTO_BRUTE.txt 2> /dev/null
  fi
  if [[ "$FULLNMAPSCAN" == "1" ]]; then
    echo "$TARGET fullnmapscan `date +"%Y-%m-%d %H:%M"`" 2> /dev/null >> $LOOT_DIR/scans/tasks.txt
    touch $LOOT_DIR/scans/$TARGET-fullnmapscan.txt 2> /dev/null
  fi
  if [[ "$OSINT" == "1" ]]; then
    echo "$TARGET osint `date +"%Y-%m-%d %H:%M"`" 2> /dev/null >> $LOOT_DIR/scans/tasks.txt
    touch $LOOT_DIR/scans/$TARGET-osint.txt 2> /dev/null
  fi
  if [[ "$RECON" == "1" ]]; then
    echo "$TARGET recon `date +"%Y-%m-%d %H:%M"`" 2> /dev/null >> $LOOT_DIR/scans/tasks.txt
    touch $LOOT_DIR/scans/$TARGET-recon.txt 2> /dev/null
  fi
}

function loot {
  if [[ ! $LOOT == "0" ]]; then
    echo -e "$OKRED                ____               $RESET"
    echo -e "$OKRED    _________  /  _/___  ___  _____$RESET"
    echo -e "$OKRED   / ___/ __ \ / // __ \/ _ \/ ___/$RESET"
    echo -e "$OKRED  (__  ) / / // // /_/ /  __/ /    $RESET"
    echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/     $RESET"
    echo -e "$OKRED               /_/                 $RESET"
    echo ""
    if [[ ! -z $WORKSPACE_DIR ]]; then
      LOOT_DIR=$WORKSPACE_DIR
    fi
    rm -f $INSTALL_DIR/stash.sqlite 2> /dev/null
    rm -f $INSTALL_DIR/hydra.restore 2> /dev/null
    rm -f /tmp/update-check.txt 2> /dev/null
    ls -lh $LOOT_DIR/scans/running_*.txt 2> /dev/null | wc -l 2> /dev/null > $LOOT_DIR/scans/tasks-running.txt 2> /dev/null
    echo -e "$OKBLUE[*]$RESET Opening loot directory $LOOT_DIR $OKBLUE[$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET"
    cd $LOOT_DIR
    if [[ "$METASPLOIT_IMPORT" == "1" ]]; then
      echo -e "$OKORANGE + -- --=[ Starting Metasploit service...$RESET"
      /etc/init.d/metasploit start 2> /dev/null > /dev/null
      msfdb start
      echo -e "$OKORANGE + -- --=[ Importing NMap XML files into Metasploit...$RESET"
      msfconsole -x "workspace -a $WORKSPACE; workspace $WORKSPACE; db_import $LOOT_DIR/nmap/nmap*.xml; hosts; services; exit;" | tee $LOOT_DIR/notes/msf-$WORKSPACE.txt
    fi
    echo -e "$OKORANGE + -- --=[ Generating reports...$RESET"
    cd $LOOT_DIR/output 2> /dev/null
    echo -en "$OKGREEN[$OKBLUE"
    for a in `ls sniper-*.txt 2>/dev/null`;
    do
      echo "$a" 2> /dev/null | aha 2> /dev/null > $LOOT_DIR/reports/$a.html 2> /dev/null
      cat "$a" 2> /dev/null | aha 2> /dev/null >> $LOOT_DIR/reports/$a.html 2> /dev/null
      echo -n '|'
    done
    echo -en "$OKGREEN]$RESET"
    echo ""
    cd ..
    chmod 777 -Rf $LOOT_DIR
    echo -e "$OKORANGE + -- --=[ Sorting all files...$RESET"
    cat $LOOT_DIR/scans/notifications_new.txt 2> /dev/null >> $LOOT_DIR/scans/notifications.txt 2> /dev/null
    sort -u $LOOT_DIR/domains/*-full.txt 2> /dev/null > $LOOT_DIR/domains/domains-all-presorted.txt 2> /dev/null
    sed -E "s/^\.//g" $LOOT_DIR/domains/domains-all-presorted.txt 2> /dev/null | sed -E "s/^\*\.//g" |  tr '[:upper:]' '[:lower:]' | sort -u > $LOOT_DIR/domains/domains-all-presorted2.txt 2> /dev/null
    sort -u $LOOT_DIR/domains/targets.txt 2> /dev/null > $LOOT_DIR/domains/targets-all-presorted.txt 2> /dev/null
    sed -E "s/^\.//g" $LOOT_DIR/domains/targets-all-presorted.txt 2> /dev/null | sed -E "s/^\*\.//g" |  tr '[:upper:]' '[:lower:]' | sort -u > $LOOT_DIR/domains/targets-all-sorted.txt 2> /dev/null
    sort -u $LOOT_DIR/ips/ips-all-unsorted.txt 2> /dev/null > $LOOT_DIR/ips/ips-all-sorted.txt 2> /dev/null
    sed -i -E 's/address//g' $LOOT_DIR/ips/ips-all-sorted.txt 2> /dev/null
    sort -u $LOOT_DIR/domains/domains-all-presorted2.txt $LOOT_DIR/domains/targets-all-sorted.txt 2> /dev/null > $LOOT_DIR/domains/domains-all-sorted.txt 2> /dev/null
    diff $LOOT_DIR/domains/targets-all-sorted.txt $LOOT_DIR/domains/domains-all-sorted.txt 2> /dev/null | grep \> | awk '{print $2}' > $LOOT_DIR/domains/targets-all-unscanned.txt
    rm -f $LOOT_DIR/domains/targets-all-presorted.txt $LOOT_DIR/domains/targets-all-presorted2.txt 2> /dev/null
    rm -f $LOOT_DIR/domains/domains-all-presorted.txt $LOOT_DIR/domains/domains-all-presorted2.txt 2> /dev/null
    sort -u $LOOT_DIR/nmap/openports-unsorted.txt 2> /dev/null > $LOOT_DIR/nmap/openports-sorted.txt 2> /dev/null
    sort -u $LOOT_DIR/nmap/livehosts-unsorted.txt 2> /dev/null > $LOOT_DIR/nmap/livehosts-sorted.txt 2> /dev/null
    find $LOOT_DIR/web/ -type f -size -1c -exec rm -f {} \;
    cd $LOOT_DIR/web/ && rm -f webhosts-all-sorted-* 2> /dev/null
    cd $LOOT_DIR/domains/ && rm -f domains-all-sorted-* 2> /dev/null
    cd $LOOT_DIR/nmap/ && rm -f openports-all-sorted-* 2> /dev/null
    cd $LOOT_DIR/nmap/ && rm -f livehosts-all-sorted-* 2> /dev/null
    cd $LOOT_DIR/web/ 2> /dev/null
    egrep -Hi 'HTTP/1.' headers-* 2> /dev/null | cut -d':' -f1 | sed "s/headers\-http\(\|s\)\-//g" | sed "s/\.txt//g" | cut -d \- -f1 | sort -u 2> /dev/null > $LOOT_DIR/web/webhosts-sorted.txt 2> /dev/null
    split -d -l $MAX_HOSTS -e $LOOT_DIR/web/webhosts-sorted.txt webhosts-all-sorted- 2> /dev/null
    cd $LOOT_DIR/domains/ 2> /dev/null
    split -d -l $MAX_HOSTS -e  $LOOT_DIR/domains/domains-all-sorted.txt domains-all-sorted- 2> /dev/null
    cd $LOOT_DIR/nmap/ 2> /dev/null
    split -d -l $MAX_HOSTS -e $LOOT_DIR/nmap/openports-sorted.txt openports-all-sorted- 2> /dev/null
    split -d -l $MAX_HOSTS -e $LOOT_DIR/nmap/livehosts-sorted.txt livehosts-all-sorted- 2> /dev/null
    echo -e "$OKORANGE + -- --=[ Removing blank screenshots and files...$RESET"
    chmod 777 -Rf $LOOT_DIR 2> /dev/null
    cd $LOOT_DIR/screenshots/
    find $LOOT_DIR/screenshots/ -type f -size -9000c -exec rm -f {} \;
    find $LOOT_DIR/nmap/ -type f -size -1c -exec rm -f {} \;
    find $LOOT_DIR/ips/ -type f -size -1c -exec rm -f {} \;
    find $LOOT_DIR/osint/ -type f -size -1c -exec rm -f {} \;
    find $LOOT_DIR/vulnerabilities/ -type f -size -1c -exec rm -f {} \;
    cd $LOOT_DIR
    if [[ -f $SNIPER_PRO ]]; then
      wc -l $LOOT_DIR/scans/notifications.txt 2> /dev/null | awk '{print $1}' > $LOOT_DIR/scans/notifications_total.txt 2> /dev/null
      wc -l $LOOT_DIR/scans/notifications_new.txt 2> /dev/null | awk '{print $1}' > $LOOT_DIR/scans/notifications_new_total.txt 2> /dev/null
      cat $LOOT_DIR/scans/tasks-running.txt 2> /dev/null > $LOOT_DIR/scans/tasks-running_total.txt 2> /dev/null
      wc -l $LOOT_DIR/scans/tasks.txt 2> /dev/null | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/tasks_total.txt 2> /dev/null 
      wc -l $LOOT_DIR/scans/scheduled/*.sh 2> /dev/null | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/scheduled_tasks_total.txt 2> /dev/null 
      grep "Host\ status" $LOOT_DIR/scans/notifications.txt 2> /dev/null | wc -l | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/host_status_changes_total.txt 2> /dev/null 
      grep "Port\ change" $LOOT_DIR/scans/notifications.txt 2> /dev/null | wc -l | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/port_changes_total.txt 2> /dev/null 
      wc -l $LOOT_DIR/domains/domains_new-*.txt 2> /dev/null | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/domain_changes_total.txt 2> /dev/null 
      cat $LOOT_DIR/web/dirsearch-new-*.txt $LOOT_DIR/web/spider-new-*.txt 2> /dev/null | wc -l | awk '{print $1}' 2> /dev/null > $LOOT_DIR/scans/url_changes_total.txt 2> /dev/null
      if [[ -f "$LOOT_DIR/notes/notepad.html" ]]; then
        echo -n "" 2>/dev/null
      else
        cp "$INSTALL_DIR/pro/notepad.html" "$LOOT_DIR/notes/notepad.html" 2>/dev/null
        PRE_NAME=$(echo $WORKSPACE | sed "s/\./-/g")
        sed -i "s/notepad/notepad-$PRE_NAME/g" "$LOOT_DIR/notes/notepad.html" 2> /dev/null
      fi
      if [[ "$SN1PER_AUTOLOAD" = "1" ]] && [[ ! -f "$INSTALL_DIR/pro/settings.php" ]]; then
          echo -e "$OKORANGE + -- --=[ Loading Sn1per Professional...$RESET"
          source $INSTALL_DIR/pro.sh
          sudo $LAST_USER -c $BROWSER $LOOT_DIR/sniper-report.html 2> /dev/null > /dev/null &
      else
        echo -e "$OKORANGE + -- --=[ Generating Sn1per Professional reports...$RESET"
        source $INSTALL_DIR/pro.sh
      fi
    else
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET ⚡ Upgrade to Sn1per Professional and unlock a world of powerful benefits! 🚀 $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 💡 Don't miss out on important updates by using the Community version. $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 🔝 The latest Professional version ( ${OKRED}10.8 ${RESET}) offers unparalleled features, including: $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET     💻 Sleek Web UI $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET     🛠️ Extensive add-ons $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET     🔄 Seamless integrations $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 🤝 Experience priority support, continuous updates, and enhanced capabilities tailored for professionals like you. $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 💰 Maximize your investment and achieve exceptional results with Sn1per Professional. $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 🔍 Learn more about the differences between the versions at: ${OKBLUE}https://sn1persecurity.com/wordpress/sn1per-community-vs-professional-whats-the-difference/ $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET  $RESET"
      echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE]$RESET 🛒 Purchase your Sn1per Professional license now at: ${OKBLUE}https://sn1persecurity.com/ $RESET"
      sudo $LAST_USER -c $BROWSER https://sn1persecurity.com 2> /dev/null > /dev/null &
    fi
    rm -f $UPDATED_TARGETS 2> /dev/null
    touch $UPDATED_TARGETS 2> /dev/null
    echo -e "$OKORANGE + -- --=[ Done!$RESET"
  fi
}

if [[ "$REIMPORT" = "1" ]]; then
  if [[ ! -z "$WORKSPACE_DIR" ]]; then
    LOOT="1"
    loot
    exit
  fi
fi

if [[ "$REIMPORT_ALL" = "1" ]]; then
  if [[ ! -z "$WORKSPACE_DIR" ]]; then
    touch $WORKSPACE_DIR/domains/targets.txt $WORKSPACE_DIR/domains/targets-all-sorted.txt $WORKSPACE_DIR/domains/domains-all-sorted.txt
    cat $WORKSPACE_DIR/domains/targets.txt $WORKSPACE_DIR/domains/targets-all-sorted.txt $WORKSPACE_DIR/domains/domains-all-sorted.txt | sort -u > $WORKSPACE_DIR/scans/updated.txt
    rm -f $WORKSPACE_DIR/nmap/openports-unsorted.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/nmap/openports-sorted.txt 2> /dev/null
    rm -f $WORKSPACE_DIR/reports/host-table-report.csv 2> /dev/null
    LOOT="1"
    loot
    exit
  fi
fi

if [[ "$RELOAD" = "1" ]]; then
  if [[ ! -z "$WORKSPACE_DIR" ]]; then
    $BROWSER $WORKSPACE_DIR/sniper-report.html 2> /dev/null > /dev/null &
    exit
  fi
fi

if [[ ${TARGET:0:1} =~ $REGEX ]];
then
  SCAN_TYPE="IP"
else
  SCAN_TYPE="DOMAIN"
fi

# INITILIZE
init

if [[ ! -f /tmp/update-check.txt ]]; then
  # CHECK CONNECTION STATUS
  check_online
fi

if [[ ! -f /tmp/update-check.txt ]]; then
  # CHECK FOR UPDATES
  check_update
fi

# CHECK FOR BLACKARCH LINUX
if grep -q BlackArch /etc/issue; then
  DISTRO='blackarch'
  echo "Detected BlackArch GNU/Linux"
  INSTALL_DIR=$(pwd)
  echo "Setting current path to $INSTALL_DIR"
fi

source modes/discover.sh
source modes/flyover.sh
source modes/vulnscan.sh
source modes/fullportonly.sh
source modes/web.sh
source modes/webporthttp.sh
source modes/webporthttps.sh
source modes/webscan.sh
source modes/massweb.sh
source modes/masswebscan.sh
source modes/massvulnscan.sh
source modes/massportscan.sh
source modes/stealth.sh
source modes/airstrike.sh
source modes/nuke.sh
source modes/normal.sh

rm -f /tmp/update-check.txt 2> /dev/null

exit 0