Skip to content

Instantly share code, notes, and snippets.

@brccabral
Created November 28, 2022 21:18
Show Gist options
  • Save brccabral/2ce73d45fe1a16895a1356b632865707 to your computer and use it in GitHub Desktop.
Save brccabral/2ce73d45fe1a16895a1356b632865707 to your computer and use it in GitHub Desktop.
Kali Android

Install Kali Nethunter on Android

Instructions from https://www.youtube.com/watch?v=0cKW6CMlbZ4 and https://www.youtube.com/watch?v=KxOGyuGq0Ts

  1. Install F-Droid
  1. Install Termux from F-Droid
  1. Update Termux
  • apt update && apt upgrade -y
  1. Set up Termux storage
  • termux-setup-storage
  1. Install wget on Termux
  • pkg install wget -y
  1. Download Kali Nethunter installer script
  • wget -O install-nethunter-termux https://offs.ec/2MceZWr
  1. Give execute permission to downloaded script
  • chmod +x install-nethunter-termux
  1. Run the script. It will download 1.8GB kalifs-arm64-full.tar.xz, install Kali and run basic set-up commands
  • ./install-nethunter-termux
  1. Open Kali Nethunter OS
  • nethunter or nethunter -r to open as root, or using shortcut nh or nh -r
  1. Do a full upgrade
  • sudo apt full-upgrade
  1. Set Kex password (VNC server)
  • kex passwd
  1. Start Kex VNC server
  • kex &
  1. Install a VNC client on phone
  1. Connect
  • localhost:5901

Start SSH

On phone's Termux start ssh server (on bash)

sshd

The default port is 8022

Start phone VNC (no Kali)

  1. Download droidVNC-NG
  1. On first start it will ask for permissions, Accessibility, File Access, Screen capture, allow them

List opened operts

cat /proc/net/tcp

0: 0100007F:235A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 10148 0 31463 1 0000000000000000 100 0 0 10 0

0100007F in hexadecimal is the local IP 127.0.0.1 and 235A in hexadecimal is the port 9050

#!/data/data/com.termux/files/usr/bin/bash -e
VERSION=2020011601
BASE_URL=https://kali.download/nethunter-images/current/rootfs
USERNAME=kali
function unsupported_arch() {
printf "${red}"
echo "[*] Unsupported Architecture\n\n"
printf "${reset}"
exit
}
function ask() {
# http://djm.me/ask
while true; do
if [ "${2:-}" = "Y" ]; then
prompt="Y/n"
default=Y
elif [ "${2:-}" = "N" ]; then
prompt="y/N"
default=N
else
prompt="y/n"
default=
fi
# Ask the question
printf "${light_cyan}\n[?] "
read -p "$1 [$prompt] " REPLY
# Default?
if [ -z "$REPLY" ]; then
REPLY=$default
fi
printf "${reset}"
# Check if the reply is valid
case "$REPLY" in
Y*|y*) return 0 ;;
N*|n*) return 1 ;;
esac
done
}
function get_arch() {
printf "${blue}[*] Checking device architecture ..."
case $(getprop ro.product.cpu.abi) in
arm64-v8a)
SYS_ARCH=arm64
;;
armeabi|armeabi-v7a)
SYS_ARCH=armhf
;;
*)
unsupported_arch
;;
esac
}
function set_strings() {
CHROOT=kali-${SYS_ARCH}
IMAGE_NAME=kalifs-${SYS_ARCH}-full.tar.xz
SHA_NAME=kalifs-${SYS_ARCH}-full.sha512sum
}
function prepare_fs() {
unset KEEP_CHROOT
if [ -d ${CHROOT} ]; then
if ask "Existing rootfs directory found. Delete and create a new one?" "N"; then
rm -rf ${CHROOT}
else
KEEP_CHROOT=1
fi
fi
}
function cleanup() {
if [ -f ${IMAGE_NAME} ]; then
if ask "Delete downloaded rootfs file?" "N"; then
if [ -f ${IMAGE_NAME} ]; then
rm -f ${IMAGE_NAME}
fi
if [ -f ${SHA_NAME} ]; then
rm -f ${SHA_NAME}
fi
fi
fi
}
function check_dependencies() {
printf "${blue}\n[*] Checking package dependencies...${reset}\n"
## Workaround for termux-app issue #1283 (https://github.com/termux/termux-app/issues/1283)
##apt update -y &> /dev/null
apt-get update -y &> /dev/null || apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" dist-upgrade -y &> /dev/null
for i in proot tar axel; do
if [ -e $PREFIX/bin/$i ]; then
echo " $i is OK"
else
printf "Installing ${i}...\n"
apt install -y $i || {
printf "${red}ERROR: Failed to install packages.\n Exiting.\n${reset}"
exit
}
fi
done
apt upgrade -y
}
function get_url() {
ROOTFS_URL="${BASE_URL}/${IMAGE_NAME}"
SHA_URL="${BASE_URL}/${SHA_NAME}"
}
function get_rootfs() {
unset KEEP_IMAGE
if [ -f ${IMAGE_NAME} ]; then
if ask "Existing image file found. Delete and download a new one?" "N"; then
rm -f ${IMAGE_NAME}
else
printf "${yellow}[!] Using existing rootfs archive${reset}\n"
KEEP_IMAGE=1
return
fi
fi
printf "${blue}[*] Downloading rootfs...${reset}\n\n"
get_url
wget ${EXTRA_ARGS} --continue "${ROOTFS_URL}"
}
function get_sha() {
if [ -z $KEEP_IMAGE ]; then
printf "\n${blue}[*] Getting SHA ... ${reset}\n\n"
get_url
if [ -f ${SHA_NAME} ]; then
rm -f ${SHA_NAME}
fi
wget ${EXTRA_ARGS} --continue "${SHA_URL}"
fi
}
function verify_sha() {
if [ -z $KEEP_IMAGE ]; then
printf "\n${blue}[*] Verifying integrity of rootfs...${reset}\n\n"
sha512sum -c $SHA_NAME || {
printf "${red} Rootfs corrupted. Please run this installer again or download the file manually\n${reset}"
exit 1
}
fi
}
function extract_rootfs() {
if [ -z $KEEP_CHROOT ]; then
printf "\n${blue}[*] Extracting rootfs... ${reset}\n\n"
proot --link2symlink tar -xf $IMAGE_NAME 2> /dev/null || :
else
printf "${yellow}[!] Using existing rootfs directory${reset}\n"
fi
}
function create_launcher() {
NH_LAUNCHER=${PREFIX}/bin/nethunter
NH_SHORTCUT=${PREFIX}/bin/nh
cat > $NH_LAUNCHER <<- EOF
#!/data/data/com.termux/files/usr/bin/bash -e
cd \${HOME}
## termux-exec sets LD_PRELOAD so let's unset it before continuing
unset LD_PRELOAD
## Workaround for Libreoffice, also needs to bind a fake /proc/version
if [ ! -f $CHROOT/root/.version ]; then
touch $CHROOT/root/.version
fi
## Default user is "kali"
user="$USERNAME"
home="/home/\$user"
start="sudo -u kali /bin/bash"
## NH can be launched as root with the "-r" cmd attribute
## Also check if user kali exists, if not start as root
if grep -q "kali" ${CHROOT}/etc/passwd; then
KALIUSR="1";
else
KALIUSR="0";
fi
if [[ \$KALIUSR == "0" || ("\$#" != "0" && ("\$1" == "-r" || "\$1" == "-R")) ]];then
user="root"
home="/\$user"
start="/bin/bash --login"
if [[ "\$#" != "0" && ("\$1" == "-r" || "\$1" == "-R") ]];then
shift
fi
fi
cmdline="proot \\
--link2symlink \\
-0 \\
-r $CHROOT \\
-b /dev \\
-b /proc \\
-b $CHROOT\$home:/dev/shm \\
-w \$home \\
/usr/bin/env -i \\
HOME=\$home \\
PATH=/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \\
TERM=\$TERM \\
LANG=C.UTF-8 \\
\$start"
cmd="\$@"
if [ "\$#" == "0" ];then
exec \$cmdline
else
\$cmdline -c "\$cmd"
fi
EOF
chmod 700 $NH_LAUNCHER
if [ -L ${NH_SHORTCUT} ]; then
rm -f ${NH_SHORTCUT}
fi
if [ ! -f ${NH_SHORTCUT} ]; then
ln -s ${NH_LAUNCHER} ${NH_SHORTCUT} >/dev/null
fi
}
function create_kex_launcher() {
KEX_LAUNCHER=${CHROOT}/usr/bin/kex
cat > $KEX_LAUNCHER <<- EOF
#!/bin/bash
function start-kex() {
if [ ! -f ~/.vnc/passwd ]; then
passwd-kex
fi
USR=\$(whoami)
if [ \$USR == "root" ]; then
SCREEN=":2"
else
SCREEN=":1"
fi
export HOME=\${HOME}; export USER=\${USR}; LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgcc_s.so.1 nohup vncserver \$SCREEN >/dev/null 2>&1 </dev/null
starting_kex=1
return 0
}
function stop-kex() {
vncserver -kill :1 | sed s/"Xtigervnc"/"NetHunter KeX"/
vncserver -kill :2 | sed s/"Xtigervnc"/"NetHunter KeX"/
return $?
}
function passwd-kex() {
vncpasswd
return $?
}
function status-kex() {
sessions=\$(vncserver -list | sed s/"TigerVNC"/"NetHunter KeX"/)
if [[ \$sessions == *"590"* ]]; then
printf "\n\${sessions}\n"
printf "\nYou can use the KeX client to connect to any of these displays.\n\n"
else
if [ ! -z \$starting_kex ]; then
printf '\nError starting the KeX server.\nPlease try "nethunter kex kill" or restart your termux session and try again.\n\n'
fi
fi
return 0
}
function kill-kex() {
pkill Xtigervnc
return \$?
}
case \$1 in
start)
start-kex
;;
stop)
stop-kex
;;
status)
status-kex
;;
passwd)
passwd-kex
;;
kill)
kill-kex
;;
*)
stop-kex
start-kex
status-kex
;;
esac
EOF
chmod 700 $KEX_LAUNCHER
}
function fix_profile_bash() {
## Prevent attempt to create links in read only filesystem
if [ -f ${CHROOT}/root/.bash_profile ]; then
sed -i '/if/,/fi/d' "${CHROOT}/root/.bash_profile"
fi
}
function fix_sudo() {
## fix sudo & su on start
chmod +s $CHROOT/usr/bin/sudo
chmod +s $CHROOT/usr/bin/su
echo "kali ALL=(ALL:ALL) ALL" > $CHROOT/etc/sudoers.d/kali
# https://bugzilla.redhat.com/show_bug.cgi?id=1773148
echo "Set disable_coredump false" > $CHROOT/etc/sudo.conf
}
function fix_uid() {
## Change kali uid and gid to match that of the termux user
USRID=$(id -u)
GRPID=$(id -g)
nh -r usermod -u $USRID kali 2>/dev/null
nh -r groupmod -g $GRPID kali 2>/dev/null
}
function print_banner() {
clear
printf "${blue}##################################################\n"
printf "${blue}## ##\n"
printf "${blue}## 88 a8P db 88 88 ##\n"
printf "${blue}## 88 .88' d88b 88 88 ##\n"
printf "${blue}## 88 88' d8''8b 88 88 ##\n"
printf "${blue}## 88 d88 d8' '8b 88 88 ##\n"
printf "${blue}## 8888'88. d8YaaaaY8b 88 88 ##\n"
printf "${blue}## 88P Y8b d8''''''''8b 88 88 ##\n"
printf "${blue}## 88 '88. d8' '8b 88 88 ##\n"
printf "${blue}## 88 Y8b d8' '8b 888888888 88 ##\n"
printf "${blue}## ##\n"
printf "${blue}#### ############# NetHunter ####################${reset}\n\n"
}
##################################
## Main ##
# Add some colours
red='\033[1;31m'
green='\033[1;32m'
yellow='\033[1;33m'
blue='\033[1;34m'
light_cyan='\033[1;96m'
reset='\033[0m'
EXTRA_ARGS=""
if [[ ! -z $1 ]]; then
EXTRA_ARGS=$1
if [[ $EXTRA_ARGS != "--no-check-certificate" ]]; then
EXTRA_ARGS=""
fi
fi
cd $HOME
print_banner
get_arch
set_strings
prepare_fs
check_dependencies
get_rootfs
get_sha
verify_sha
extract_rootfs
create_launcher
cleanup
printf "\n${blue}[*] Configuring NetHunter for Termux ...\n"
fix_profile_bash
fix_sudo
create_kex_launcher
fix_uid
print_banner
printf "${green}[=] Kali NetHunter for Termux installed successfully${reset}\n\n"
printf "${green}[+] To start Kali NetHunter, type:${reset}\n"
printf "${green}[+] nethunter # To start NetHunter CLI${reset}\n"
printf "${green}[+] nethunter kex passwd # To set the KeX password${reset}\n"
printf "${green}[+] nethunter kex & # To start NetHunter GUI${reset}\n"
printf "${green}[+] nethunter kex stop # To stop NetHunter GUI${reset}\n"
#printf "${green}[+] nethunter kex <command> # Run command in NetHunter env${reset}\n"
printf "${green}[+] nethunter -r # To run NetHunter as root${reset}\n"
#printf "${green}[+] nethunter -r kex passwd # To set the KeX password for root${reset}\n"
#printf "${green}[+] nethunter kex & # To start NetHunter GUI as root${reset}\n"
#printf "${green}[+] nethunter kex stop # To stop NetHunter GUI root session${reset}\n"
#printf "${green}[+] nethunter -r kex kill # To stop all NetHunter GUI sessions${reset}\n"
#printf "${green}[+] nethunter -r kex <command> # Run command in NetHunter env as root${reset}\n"
printf "${green}[+] nh # Shortcut for nethunter${reset}\n\n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment