#!/bin/bash

# Usage:       ./make_kali-usb-stick_persistent [ kali.iso ]
#                or
#              bash make_kali-usb-stick_persistent [ kali.iso ]
# Description: Writes a kali.iso to an usb stick (optional) and
#                adds persistence to it step by step.
# Author:      Patrick Neumann (patrick@neumannsland.de)
# Platform:    Kali Linux (tested: 2022.2) or
#              Debian GNU/Linux (tested: 9.5)
# Version:     1.03
# Date:        22.06.2022
# Link:        https://git.neumannsland.de/casualscripter/shell-scripting
# License:     GPL3
# Warranty:    This program is distributed WITHOUT ANY WARRANTY

# check for root
if [[ 0 -ne "$( /usr/bin/id --user )" ]] ; then
  printf "you need to be root - EXIT!\n"
  exit 2
fi

# usage function
usage () {
  printf "Usage:\n"
  printf "  $0 [ <kali-linux-*.iso ]\n"
  printf "  (If an iso file is given it will be written to the usb stick first.)\n"
  exit 1
}

# onle zero or one args are supported
if [ "${#}" -gt 1 ]; then
  usage
fi

# list of external usb storage devices
printf "List of external usb storage devices:\n"
readonly USBSTORDEVS="$( ls -l /sys/dev/block | grep -E ".*usb.*[^[:digit:]]$" | awk '{ print $NF; }')"
for usbstordev in ${USBSTORDEVS} ; do
  dev="${usbstordev##*/}"
  dir="/sys/dev/block/${usbstordev%/*/*}"
  vendor="$( cat "${dir}/vendor" )"
  model="$( cat "${dir}/model" )"
  printf "${dev} = ${vendor} ${model}\n"
done

# select external usb storage device
printf "\nPlease select an external usb storage device:\n"

select USBSTICK in $( ls -l /sys/dev/block | grep -E ".*usb.*[^[:digit:]]$" | awk -F "/" '{ print $NF; }' ) ; do
  if [ -n "${USBSTICK}" ] ; then break ; fi
done
# all block devices should be writable by root!?
USBSTICK="/dev/${USBSTICK}"

# if iso file is given
if [ "${#}" -eq 1 ]; then
  if ! [ -e "${1}" ] ; then
    printf "iso file does not exist - EXIT!\n"
    exit 3
  fi
  if ! [ -f "${1}" ] ; then
    printf "iso file is not a regular file - EXIT!\n"
    exit 4
  fi
  # all files are readable by root!?

  ISOFILE="${1}"

  dd if="${ISOFILE}" of="${USBSTICK}" conv=fsync bs=4M status=progress
fi

#check if persistence is already there.
if blkid "${USBSTICK}"3 | grep -F persistence &> /dev/null ; then
  printf "There is already a persistence on the choosen usb stick - EXIT!\n"
  exit 5
fi

# add 3rd partition to the end of the usb stick
fdisk "${USBSTICK}" <<< $( printf "n\np\n\n\n\nw" )

# format 3rd partition with ext3 and label "persistence"
mkfs.ext3 -L persistence "${USBSTICK}"3

# place "config" in filesystem of 3rd partition
mkdir -p /mnt/persistence
mount "${USBSTICK}"3 /mnt/persistence
echo "/ union" > /mnt/persistence/persistence.conf
umount "${USBSTICK}"3
rmdir /mnt/persistence

exit 0