2021-09-16 06:42:05 +01:00
#!/usr/bin/env bash
#
# Kali Linux ARM build-script for Raspberry Pi Zero W (P4wnP1 A.L.O.A.)
# https://gitlab.com/kalilinux/build-scripts/kali-arm
#
# This is a community script - you will need to generate your own image to use
# More information: https://www.kali.org/docs/arm/raspberry-pi-zero-w/
#
2021-06-25 13:18:39 -05:00
# This script is purposely different from the others due to its heavily customized nature.
2021-09-16 06:42:05 +01:00
#
# Stop on error
set -e
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
# Uncomment to activate debug
# debug=true
2018-06-22 18:30:52 -05:00
2020-07-22 21:29:57 -05:00
if [ " $debug " = true ] ; then
exec > >( tee -a -i " ${ 0 %.* } .log " ) 2>& 1
set -x
2017-10-01 19:24:26 -05:00
fi
2020-07-22 21:29:57 -05:00
# Architecture
architecture = ${ architecture :- "armel" }
# Generate a random machine name to be used.
machine = $( tr -cd 'A-Za-z0-9' < /dev/urandom | head -c16 ; echo )
2018-06-28 23:43:48 -05:00
# Custom hostname variable
2018-07-01 21:24:37 -05:00
hostname = ${ 2 :- kali }
2020-07-22 21:29:57 -05:00
# Custom image file name variable - MUST NOT include .img at the end.
imagename = ${ 3 :- kali -linux- $1 -rpi0w-p4wnp1 }
# Suite to use, valid options are:
2018-07-06 18:03:37 -05:00
# kali-rolling, kali-dev, kali-bleeding-edge, kali-dev-only, kali-experimental, kali-last-snapshot
2020-07-22 21:29:57 -05:00
suite = ${ suite :- "kali-rolling" }
# Free space rootfs in MiB
free_space = "300"
# /boot partition in MiB
bootsize = "128"
2020-07-26 14:38:21 -05:00
# Select compression, xz or none
compress = "xz"
# Choose filesystem format to format ( ext3 or ext4 )
fstype = "ext3"
2020-07-22 21:29:57 -05:00
# If you have your own preferred mirrors, set them here.
2020-08-10 16:55:26 +02:00
mirror = ${ mirror :- "http://http.kali.org/kali" }
2020-07-22 21:29:57 -05:00
# Gitlab url Kali repository
kaligit = "https://gitlab.com/kalilinux"
# Github raw url
githubraw = "https://raw.githubusercontent.com"
2018-06-28 23:43:48 -05:00
2020-07-22 21:29:57 -05:00
# Check EUID=0 you can run any binary as root.
if [ [ $EUID -ne 0 ] ] ; then
2020-07-27 18:47:11 -05:00
echo "This script must be run as root or have super user permissions"
echo " Use: sudo $0 ${ 1 :- 2 .0 } ${ 2 :- kali } "
2020-07-22 21:29:57 -05:00
exit 1
fi
# Pass version number
if [ [ $# -eq 0 ] ] ; then
echo " Please pass version number, e.g. $0 2.0, and (if you want) a hostname, default is kali "
exit 0
fi
# Check exist bsp directory.
if [ ! -e "bsp" ] ; then
echo "Error: missing bsp directory structure"
echo " Please clone the full repository ${ kaligit } /build-scripts/kali-arm "
exit 255
fi
# Current directory
current_dir = " $( pwd ) "
# Base directory
basedir = ${ current_dir } /rpi0w-p4wnp1-" $1 "
# Working directory
work_dir = " ${ basedir } /kali- ${ architecture } "
2018-06-28 18:25:05 -05:00
2020-07-22 21:29:57 -05:00
# Check directory build
if [ -e " ${ basedir } " ] ; then
echo " ${ basedir } directory exists, will not continue "
exit 1
elif [ [ ${ current_dir } = ~ [ [ :space:] ] ] ] ; then
echo "The directory " \" ${ current_dir } "\" contains whitespace. Not supported."
exit 1
else
echo " The basedir thinks it is: ${ basedir } "
mkdir -p ${ basedir }
fi
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
components = "main,contrib,non-free"
2018-12-07 03:26:39 +01:00
arm = "fake-hwclock ntpdate u-boot-tools"
tools = "aircrack-ng crunch cewl dnsrecon dnsutils ethtool exploitdb hydra medusa metasploit-framework ncrack nmap passing-the-hash proxychains recon-ng sqlmap tcpdump theharvester tor tshark usbutils whois windows-binaries winexe wpscan"
base = "apt-transport-https apt-utils console-setup e2fsprogs firmware-linux firmware-realtek firmware-atheros ifupdown initramfs-tools iw kali-defaults man-db mlocate netcat-traditional net-tools parted psmisc rfkill screen snmpd snmp tftp tmux unrar usbutils vim wget zerofree"
services = "apache2 atftpd openssh-server openvpn"
# haveged: assure enough entropy data for hostapd on startup
# avahi-daemon: allow mDNS resolution (apple bonjour) by remote hosts
# dhcpcd5: REQUIRED (P4wnP1 A.L.O.A. currently wraps this binary if a DHCP client is needed)
# dnsmasq: REQUIRED (P4wnP1 A.L.O.A. currently wraps this binary if a DHCP server is needed, currently not used for DNS)
# genisoimage: allow creation of CD-Rom iso images for CD-Rom USB gadget from existing folders on the fly
# iodine: allow DNS tunneling
# dosfstools: contains fatlabel (used to label FAT32 iamges for UMS)
# Note on Go: The golang package is version 1.10, so we are missing support for current gopherjs (webclient couldn't be build on Pi) and go modules (replacement for dep)
2019-11-07 19:34:58 -08:00
extras = "autossh avahi-daemon bash-completion bluez bluez-firmware dhcpcd5 dnsmasq dosfstools genisoimage golang haveged hostapd i2c-tools iodine policykit-1 python3-configobj python3-dev python3-pip python3-requests python3-smbus wpasupplicant"
2017-10-01 19:24:26 -05:00
2018-07-03 16:44:05 -05:00
packages = " ${ arm } ${ base } ${ services } ${ extras } "
2017-10-01 19:24:26 -05:00
# Check to ensure that the architecture is set to ARMEL since the RPi is the
# only board that is armel.
2018-07-01 21:24:37 -05:00
if [ [ ${ architecture } != "armel" ] ] ; then
echo "The Raspberry Pi cannot run Debian armhf binaries"
2017-10-01 19:24:26 -05:00
exit 0
fi
2020-07-22 21:29:57 -05:00
# Automatic configuration to use an http proxy, such as apt-cacher-ng.
# You can turn off automatic settings by uncommenting apt_cacher=off.
# apt_cacher=off
# By default the proxy settings are local, but you can define an external proxy.
# proxy_url="http://external.intranet.local"
apt_cacher = ${ apt_cacher :- " $( lsof -i :3142| cut -d ' ' -f3 | uniq | sed '/^\s*$/d' ) " }
if [ -n " $proxy_url " ] ; then
export http_proxy = $proxy_url
elif [ " $apt_cacher " = "apt-cacher-ng" ] ; then
if [ -z " $proxy_url " ] ; then
proxy_url = ${ proxy_url :- "http://127.0.0.1:3142/" }
export http_proxy = $proxy_url
fi
fi
2017-10-01 19:24:26 -05:00
2018-07-06 18:03:37 -05:00
# create the rootfs - not much to modify here, except maybe throw in some more packages if you want.
2020-07-22 21:29:57 -05:00
debootstrap --foreign --keyring= /usr/share/keyrings/kali-archive-keyring.gpg --include= kali-archive-keyring \
--components= ${ components } --include= ${ arm // /, } --arch ${ architecture } ${ suite } ${ work_dir } http://http.kali.org/kali
2017-10-01 19:24:26 -05:00
2021-09-06 17:09:20 -05:00
case ${ architecture } in
arm64)
qemu_bin = "/usr/bin/qemu-aarch64-static"
lib_arch = "aarch64-linux-gnu"
; ;
armhf)
qemu_bin = "/usr/bin/qemu-arm-static"
lib_arch = "arm-linux-gnueabihf"
; ;
armel)
qemu_bin = "/usr/bin/qemu-arm-static"
lib_arch = "arm-linux-gnueabi"
; ;
esac
nspawn_ver = $( systemd-nspawn --version | awk '{if(NR==1) print $2}' )
if [ [ $nspawn_ver -ge 245 ] ] ; then
extra_args = " --hostname= $hostname -q -P "
elif [ [ $nspawn_ver -ge 241 ] ] ; then
extra_args = " --hostname= $hostname -q "
else
extra_args = "-q"
fi
2020-07-22 21:29:57 -05:00
# systemd-nspawn enviroment
2021-06-25 09:08:16 -05:00
systemd-nspawn_exec( ) {
ENV = "RUNLEVEL=1,LANG=C,DEBIAN_FRONTEND=noninteractive,DEBCONF_NOWARNINGS=yes"
systemd-nspawn --bind-ro " $qemu_bin " $extra_args --capability= cap_setfcap -E $ENV -M " $machine " -D " $work_dir " " $@ "
2020-07-22 21:29:57 -05:00
}
2019-04-29 23:30:19 -05:00
2020-07-22 21:29:57 -05:00
# debootstrap second stage
systemd-nspawn_exec /debootstrap/debootstrap --second-stage
2018-06-28 23:43:48 -05:00
2020-07-22 21:29:57 -05:00
cat << EOF > ${ work_dir } /etc/apt/sources.list
deb ${ mirror } ${ suite } ${ components //,/ }
#deb-src ${mirror} ${suite} ${components//,/ }
2017-10-01 19:24:26 -05:00
EOF
# Set hostname
2020-07-22 21:29:57 -05:00
echo " ${ hostname } " > ${ work_dir } /etc/hostname
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
# So X doesn't complain, we add kali to hosts
cat << EOF > ${ work_dir } /etc/hosts
127.0.0.1 ${ hostname } localhost
2017-10-01 19:24:26 -05:00
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
2020-07-22 21:29:57 -05:00
# Disable IPv6
cat << EOF > ${ work_dir } /etc/modprobe.d/ipv6.conf
# Don't load ipv6 by default
alias net-pf-10 off
EOF
cat << EOF > ${ work_dir } /etc/network/interfaces
2017-10-01 19:24:26 -05:00
auto lo
iface lo inet loopback
2018-12-07 03:26:39 +01:00
2020-07-22 21:29:57 -05:00
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
2017-10-01 19:24:26 -05:00
EOF
2020-07-22 21:29:57 -05:00
# DNS server
echo "nameserver 8.8.8.8" > ${ work_dir } /etc/resolv.conf
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
# Copy directory bsp into build dir.
cp -rp bsp ${ work_dir }
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
export MALLOC_CHECK_ = 0 # workaround for LP: #520465
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
# Enable the use of http proxy in third-stage in case it is enabled.
if [ -n " $proxy_url " ] ; then
echo " Acquire::http { Proxy \" $proxy_url \" }; " > ${ work_dir } /etc/apt/apt.conf.d/66proxy
fi
2018-07-12 06:05:39 -05:00
2017-10-01 19:24:26 -05:00
2018-07-02 11:05:11 -05:00
# Copy a default config, with everything commented out so people find it when
# they go to add something when they are following instructions on a website.
2020-07-22 21:29:57 -05:00
cp " ${ basedir } " /../bsp/firmware/rpi/config.txt ${ work_dir } /boot/config.txt
2018-07-02 11:05:11 -05:00
2018-12-07 03:26:39 +01:00
# move P4wnP1 in (change to release blob when ready)
2021-06-25 09:08:16 -05:00
git clone -b 'master' --single-branch --depth 1 https://github.com/rogandawes/P4wnP1_aloa ${ work_dir } /root/P4wnP1
2018-12-07 03:26:39 +01:00
2021-06-25 09:08:16 -05:00
cat << EOF > ${ basedir } /kali-${ architecture } /third-stage
2017-10-01 19:24:26 -05:00
#!/bin/bash
2018-07-06 09:49:23 -05:00
set -e
2017-10-01 19:24:26 -05:00
dpkg-divert --add --local --divert /usr/sbin/invoke-rc.d.chroot --rename /usr/sbin/invoke-rc.d
cp /bin/true /usr/sbin/invoke-rc.d
echo -e "#!/bin/sh\nexit 101" > /usr/sbin/policy-rc.d
2018-06-22 20:38:19 -05:00
chmod 755 /usr/sbin/policy-rc.d
2017-10-01 19:24:26 -05:00
apt-get update
2018-06-19 19:53:27 -05:00
apt-get --yes --allow-change-held-packages install locales-all
2017-10-01 19:24:26 -05:00
apt-get update
2021-06-25 09:50:12 -05:00
export DEBIAN_FRONTEND = noninteractive
2017-10-01 19:24:26 -05:00
apt-get -y install git-core binutils ca-certificates initramfs-tools u-boot-tools
apt-get -y install locales console-common less nano git
echo "root:toor" | chpasswd
rm -f /etc/udev/rules.d/70-persistent-net.rules
2020-01-23 11:57:28 -06:00
apt-get --yes --allow-change-held-packages -o dpkg::options::= --force-confnew install ${ packages } || apt-get --yes --fix-broken install
apt-get --yes --allow-change-held-packages -o dpkg::options::= --force-confnew install ${ desktop } ${ tools } || apt-get --yes --fix-broken install
apt-get --yes --allow-change-held-packages -o dpkg::options::= --force-confnew dist-upgrade
apt-get --yes --allow-change-held-packages -o dpkg::options::= --force-confnew autoremove
2017-10-01 19:24:26 -05:00
# Because copying in authorized_keys is hard for people to do, let's make the
# image insecure and enable root login with a password.
2018-12-07 03:26:39 +01:00
echo "Allow root login..."
2017-10-01 19:24:26 -05:00
sed -i -e 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
2020-07-22 21:29:57 -05:00
# Create monitor mode start/remove
# The script returns an error code if the monitor interface couldn't be started
# Note: Removing this should be considered, as enabling the monitor interface once
# and using wpa_supplicant afterwards, crashs the WiFi firmware (even if the monitor
# interface is removed). Afterwards the 'brcmfmac' module has to be removed and
# loaded again (the driver push the firmware and restarts the fmac chip on init).
# Sometimes only a reboot works
install -m755 /bsp/scripts/monstart /usr/bin/
install -m755 /bsp/scripts/monstop /usr/bin/
install -m755 /bsp/scripts/rpi-resizerootfs /usr/sbin/
install -m644 /bsp/services/all/*.service /etc/systemd/system/
install -m644 /bsp/services/rpi/*.service /etc/systemd/system/
# Bluetooth enabling
install -m644 /bsp/bluetooth/rpi/50-bluetooth-hci-auto-poweron.rules /etc/udev/rules.d/
2019-05-07 12:59:11 -05:00
# Regenerated the shared-mime-info database on the first boot
# since it fails to do so properly in a chroot.
systemctl enable smi-hack
2018-06-21 14:22:32 -05:00
# Resize FS on first run (hopefully)
2020-06-16 13:17:43 -05:00
systemctl enable rpi-resizerootfs
2018-06-21 14:22:32 -05:00
# Generate SSH host keys on first run
2017-10-01 19:24:26 -05:00
systemctl enable regenerate_ssh_host_keys
2020-07-22 21:29:57 -05:00
# Enable sshd
2018-06-21 14:22:32 -05:00
systemctl enable ssh
2018-12-07 03:26:39 +01:00
# Install and hold pi-bluetooth deb package from re4son
2020-07-22 21:29:57 -05:00
dpkg --force-all -i /bsp/bluetooth/rpi/pi-bluetooth+re4son_2.2_all.deb
2018-12-07 03:26:39 +01:00
apt-mark hold pi-bluetooth+re4son
2017-10-01 19:24:26 -05:00
# systemd version 232 and above breaks execution of above bluetooth rule, let's fix that
sed -i 's/^RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6.*/RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6 AF_BLUETOOTH/' /lib/systemd/system/systemd-udevd.service
# Enable bluetooth
systemctl unmask bluetooth.service
systemctl enable bluetooth
2018-12-07 03:26:39 +01:00
systemctl enable hciuart
# dhcpcd is needed by P4wnP1, but started on demand
# installation of dhcpcd5 package enables a systemd unit starting dhcpcd for all
# interfaces, which results in conflicts with DHCP servers running on created
# bridge interface (especially for the bteth BNEP bridge). To avoid this we
# disable the service. If communication problems occur, although DHCP leases
# are handed out by dnsmasq, dhcpcd should be the first place to look
# (no interface should hava an APIPA addr assigned, unless the DHCP client
# was explcitely enabled by P4wnP1 for this interface)
systemctl disable dhcpcd
# enable fake-hwclock (P4wnP1 is intended to reboot/loose power frequently without getting NTP access in between)
# a clean shutdown/reboot is needed, as fake-hwclock service saves time on stop
systemctl enable fake-hwclock
2017-10-01 19:24:26 -05:00
2018-07-05 17:54:41 -05:00
# Create cmdline.txt file
mkdir -p /boot
2020-07-26 17:40:50 -05:00
echo " dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype= $fstype elevator=deadline fsck.repair=yes rootwait " > /boot/cmdline.txt
2018-07-05 17:54:41 -05:00
2018-12-07 03:26:39 +01:00
# Install P4wnP1 A.L.O.A.
cd /root/P4wnP1
make installkali
2018-07-01 22:23:47 -05:00
2018-12-07 03:26:39 +01:00
# add Designware DUAL role USB driver to loaded modules
2018-07-01 22:48:27 -05:00
echo "dwc2" | tee -a /etc/modules
2018-12-07 03:26:39 +01:00
# allow root login from tyyGS0 (serial device for USB gadget)
echo ttyGS0 >> /etc/securetty
# add minutely cronjob to update fake-hwclock
echo '* * * * * root /usr/sbin/fake-hwclock' >> /etc/crontab
2018-07-01 22:23:47 -05:00
2017-10-01 19:24:26 -05:00
# Turn off kernel dmesg showing up in console since rpi0 only uses console
echo "dmesg -D" > /etc/rc.local
echo "exit 0" >> /etc/rc.local
# Copy bashrc
2018-07-12 06:05:39 -05:00
cp /etc/skel/.bashrc /root/.bashrc
2017-10-01 19:24:26 -05:00
2019-05-10 17:18:34 -05:00
cd /root
2020-07-22 21:29:57 -05:00
apt download -o APT::Sandbox::User= root ca-certificates 2>/dev/null
2019-05-10 17:18:34 -05:00
2018-07-05 14:58:48 -05:00
# Fix startup time from 5 minutes to 15 secs on raise interface wlan0
sed -i 's/^TimeoutStartSec=5min/TimeoutStartSec=15/g' "/lib/systemd/system/networking.service"
2017-10-01 19:24:26 -05:00
rm -f /usr/sbin/policy-rc.d
rm -f /usr/sbin/invoke-rc.d
dpkg-divert --remove --rename /usr/sbin/invoke-rc.d
rm -f /third-stage
EOF
2021-06-25 09:08:16 -05:00
chmod 755 ${ basedir } /kali-${ architecture } /third-stage
LANG = C systemd-nspawn -M ${ machine } -D ${ basedir } /kali-${ architecture } /third-stage
2018-07-04 14:13:13 -05:00
if [ [ $? > 0 ] ] ; then
echo "Third stage failed"
exit 1
fi
2017-10-01 19:24:26 -05:00
2020-08-10 16:55:26 +02:00
# Clean system
2021-09-06 17:09:20 -05:00
systemd-nspawn_exec <<'EOF'
2017-10-01 19:24:26 -05:00
rm -f /0
2020-08-10 16:55:26 +02:00
rm -rf /bsp
fc-cache -frs
rm -rf /tmp/*
rm -rf /etc/*-
rm -rf /hs_err*
rm -rf /userland
rm -rf /opt/vc/src
2021-09-06 17:09:20 -05:00
rm -rf /third-stage
2020-08-10 16:55:26 +02:00
rm -f /etc/ssh/ssh_host_*
rm -rf /var/lib/dpkg/*-old
rm -rf /var/lib/apt/lists/*
rm -rf /var/cache/apt/*.bin
2021-09-06 17:09:20 -05:00
rm -rf /var/cache/debconf/*-old
2020-08-10 16:55:26 +02:00
rm -rf /var/cache/apt/archives/*
2021-09-06 17:09:20 -05:00
rm -rf /etc/apt/apt.conf.d/apt_opts
rm -rf /etc/apt/apt.conf.d/99_norecommends
2020-08-10 16:55:26 +02:00
for logs in $( find /var/log -type f) ; do > $logs ; done
history -c
2017-10-01 19:24:26 -05:00
EOF
2021-09-06 17:09:20 -05:00
# Newer systemd requires that /etc/machine-id exists but is empty.
rm -f " ${ work_dir } " /etc/machine-id || true
touch " ${ work_dir } " /etc/machine-id
rm -f " ${ work_dir } " /var/lib/dbus/machine-id || true
2021-06-25 09:08:16 -05:00
# Define DNS server after last running systemd-nspawn.
echo "nameserver 8.8.8.8" > ${ work_dir } /etc/resolv.conf
2017-10-01 19:24:26 -05:00
2020-08-10 16:55:26 +02:00
# Disable the use of http proxy in case it is enabled.
if [ -n " $proxy_url " ] ; then
unset http_proxy
rm -rf ${ work_dir } /etc/apt/apt.conf.d/66proxy
fi
# Mirror & suite replacement
if [ [ ! -z " ${ 4 } " || ! -z " ${ 5 } " ] ] ; then
mirror = ${ 4 }
suite = ${ 5 }
fi
2017-10-01 19:24:26 -05:00
# Enable login over serial
2020-07-22 21:29:57 -05:00
echo "T0:23:respawn:/sbin/agetty -L ttyAMA0 115200 vt100" >> ${ work_dir } /etc/inittab
2017-10-01 19:24:26 -05:00
2020-07-26 14:38:21 -05:00
# Define sources.list
2020-07-22 21:29:57 -05:00
cat << EOF > ${ work_dir } /etc/apt/sources.list
2020-07-26 14:38:21 -05:00
deb ${ mirror } ${ suite } ${ components //,/ }
#deb-src ${mirror} ${suite} ${components//,/ }
2017-10-01 19:24:26 -05:00
EOF
# Uncomment this if you use apt-cacher-ng otherwise git clones will fail.
#unset http_proxy
# Kernel section. If you want to use a custom kernel, or configuration, replace
# them in this section.
cd ${ TOPDIR }
# RPI Firmware
git clone --depth 1 https://github.com/raspberrypi/firmware.git rpi-firmware
2020-07-22 21:29:57 -05:00
cp -rf rpi-firmware/boot/* ${ work_dir } /boot/
2018-12-13 09:03:06 +01:00
# copy over Pi specific libs (video core) and binaries (dtoverlay,dtparam ...)
2020-07-22 21:29:57 -05:00
cp -rf rpi-firmware/opt/* ${ work_dir } /opt/
2017-10-01 19:24:26 -05:00
rm -rf rpi-firmware
2018-12-07 03:26:39 +01:00
# Build nexmon firmware outside the build system, if we can (use repository with driver and firmware for P4wnP1).
cd " ${ basedir } "
git clone https://github.com/mame82/nexmon_wifi_covert_channel.git -b p4wnp1 " ${ basedir } " /nexmon --depth 1
2017-10-01 19:24:26 -05:00
# Setup build
cd ${ TOPDIR }
2018-12-07 03:26:39 +01:00
# Re4son kernel 4.14.80 with P4wnP1 patches (dwc2 and brcmfmac)
2020-07-22 21:29:57 -05:00
git clone --depth 1 https://github.com/Re4son/re4son-raspberrypi-linux -b rpi-4.14.80-re4son-p4wnp1 ${ work_dir } /usr/src/kernel
2018-12-07 03:26:39 +01:00
2020-07-22 21:29:57 -05:00
cd ${ work_dir } /usr/src/kernel
2021-06-25 09:08:16 -05:00
# Remove redundant yyloc global declaration
patch -p1 --no-backup-if-mismatch < ${ basedir } /../patches/11647f99b4de6bc460e106e876f72fc7af3e54a6.patch
2018-12-07 03:26:39 +01:00
# Note: Compiling the kernel in /usr/src/kernel of the target file system is problematic, as the binaries of the compiling host architecture
# get deployed to the /usr/src/kernel/scripts subfolder (in this case linux-x64 binaries), which is symlinked to /usr/src/build later on.
2018-12-29 19:20:05 -06:00
# This would f.e. hinder rebuilding single modules, like nexmon's brcmfmac driver, on the Pi itself (online compilation).
2018-12-07 03:26:39 +01:00
# The cause:building of modules relies on the pre-built binaries in /usr/src/build folder. But the helper binaries are compiled with the
# HOST toolchain and not with the crosscompiler toolchain (f.e. /usr/src/kernel/script/basic/fixdep would end up as x64 binary, as this helper
# is not compiled with the CROSS toolchain). As those scripts are used druing module build, it wouldn't work to build on the pi, later on,
# without recompiling the helper binaries with the proper crosscompiler toolchain.
#
# To account for that, the 'script' subfolder could be rebuild on the target (online) by running `make scripts/` from /usr/src/kernel folder.
# Rebuilding the script, again, depends on additional tooling, like `bc` binary, which has to be installed.
#
# Currently the step of recompiling the kernel/scripts folder has to be done manually online, but it should be possible to do it after kernel
# build, by setting the host compiler (CC) to the gcc of the linaro-arm-linux-gnueabihf-raspbian-x64 toolchain (not only the CROSS_COMPILE).
# The problem is, that the used linaro toolchain builds for armhf (not a problem for kernel, as there're no dependencies on hf librearies),
# but the debian packages (and the provided gcc) are armel.
#
# To clean up this whole "armel" vs "armhf" mess, the kernel should be compiled with a armel toolchain (best choice would be the toolchain
# which is used to build the kali armel packages itself, which is hopefully available for linux-x64)
#
# For now this is left as manual step, as the normal user shouldn't have a need to recompile kernel parts on the Pi itself.
2017-10-01 19:24:26 -05:00
# Set default defconfig
export ARCH = arm
2018-12-07 03:26:39 +01:00
# use hard float with RPi cross compiler toolchain, as described here: https://www.raspberrypi.org/documentation/linux/kernel/building.md
2018-10-16 23:39:16 -05:00
export CROSS_COMPILE = arm-linux-gnueabi-
2017-10-01 19:24:26 -05:00
# Set default defconfig
2018-07-09 22:19:21 -05:00
make re4son_pi1_defconfig
2017-10-01 19:24:26 -05:00
# Build kernel
make -j $( grep -c processor /proc/cpuinfo)
# Make kernel modules
2020-07-22 21:29:57 -05:00
make modules_install INSTALL_MOD_PATH = ${ work_dir }
2017-10-01 19:24:26 -05:00
# Copy kernel to boot
2020-07-22 21:29:57 -05:00
perl scripts/mkknlimg --dtok arch/arm/boot/zImage ${ work_dir } /boot/kernel.img
cp arch/arm/boot/dts/*.dtb ${ work_dir } /boot/
cp arch/arm/boot/dts/overlays/*.dtb* ${ work_dir } /boot/overlays/
cp arch/arm/boot/dts/overlays/README ${ work_dir } /boot/overlays/
2017-10-01 19:24:26 -05:00
2018-07-16 02:44:42 -05:00
make mrproper
make re4son_pi1_defconfig
2018-11-26 10:14:07 -06:00
2017-10-01 19:24:26 -05:00
# Fix up the symlink for building external modules
# kernver is used so we don't need to keep track of what the current compiled
# version is
2020-07-22 21:29:57 -05:00
kernver = $( ls ${ work_dir } /lib/modules/)
cd ${ work_dir } /lib/modules/${ kernver }
2017-10-01 19:24:26 -05:00
rm build
rm source
ln -s /usr/src/kernel build
ln -s /usr/src/kernel source
2018-07-12 02:51:33 -05:00
cd " ${ basedir } "
2017-10-01 19:24:26 -05:00
2018-06-25 19:54:17 -05:00
# Copy a default config, with everything commented out so people find it when
# they go to add something when they are following instructions on a website.
2020-07-22 21:29:57 -05:00
cp " ${ basedir } " /../bsp/firmware/rpi/config.txt ${ work_dir } /boot/config.txt
2018-06-25 19:54:17 -05:00
2020-07-22 21:29:57 -05:00
cat << EOF >> ${ work_dir } /boot/config.txt
2017-10-01 19:24:26 -05:00
dtoverlay = dwc2
EOF
# systemd doesn't seem to be generating the fstab properly for some people, so
# let's create one.
2020-07-22 21:29:57 -05:00
cat << EOF > ${ work_dir } /etc/fstab
2017-10-01 19:24:26 -05:00
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
2020-07-26 17:40:50 -05:00
/dev/mmcblk0p2 / $fstype defaults,noatime 0 1
2017-10-01 19:24:26 -05:00
EOF
# rpi-wiggle
2020-07-22 21:29:57 -05:00
mkdir -p ${ work_dir } /root/scripts
wget https://raw.github.com/steev/rpiwiggle/master/rpi-wiggle -O ${ work_dir } /root/scripts/rpi-wiggle.sh
chmod 755 ${ work_dir } /root/scripts/rpi-wiggle.sh
2017-10-01 19:24:26 -05:00
2018-12-07 03:26:39 +01:00
# git clone of nexmon moved in front of kernel compilation, to have poper brcmfmac driver ready
2018-07-12 02:51:33 -05:00
cd " ${ basedir } " /nexmon
2018-12-07 03:26:39 +01:00
# Make sure we're not still using the armel cross compiler
unset CROSS_COMPILE
2018-07-09 22:19:21 -05:00
# Disable statistics
touch DISABLE_STATISTICS
source setup_env.sh
make
cd buildtools/isl-0.10
CC = $CCgcc
./configure
make
sed -i -e 's/all:.*/all: $(RAM_FILE)/g' ${ NEXMON_ROOT } /patches/bcm43430a1/7_45_41_46/nexmon/Makefile
cd ${ NEXMON_ROOT } /patches/bcm43430a1/7_45_41_46/nexmon
make clean
# We do this so we don't have to install the ancient isl version into /usr/local/lib on systems.
LD_LIBRARY_PATH = ${ NEXMON_ROOT } /buildtools/isl-0.10/.libs make ARCH = arm CC = ${ NEXMON_ROOT } /buildtools/gcc-arm-none-eabi-5_4-2016q2-linux-x86/bin/arm-none-eabi-
# RPi0w->3B firmware
2018-12-07 03:26:39 +01:00
# disable nexmon by default
2020-07-22 21:29:57 -05:00
mkdir -p ${ work_dir } /lib/firmware/brcm
cp ${ NEXMON_ROOT } /patches/bcm43430a1/7_45_41_46/nexmon/brcmfmac43430-sdio.bin ${ work_dir } /lib/firmware/brcm/brcmfmac43430-sdio.nexmon.bin
cp ${ NEXMON_ROOT } /patches/bcm43430a1/7_45_41_46/nexmon/brcmfmac43430-sdio.bin ${ work_dir } /lib/firmware/brcm/brcmfmac43430-sdio.bin
wget https://raw.githubusercontent.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43430-sdio.txt -O ${ work_dir } /lib/firmware/brcm/brcmfmac43430-sdio.txt
2018-07-09 22:19:21 -05:00
# Make a backup copy of the rpi firmware in case people don't want to use the nexmon firmware.
# The firmware used on the RPi is not the same firmware that is in the firmware-brcm package which is why we do this.
2020-07-22 21:29:57 -05:00
wget https://raw.githubusercontent.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43430-sdio.bin -O ${ work_dir } /lib/firmware/brcm/brcmfmac43430-sdio.rpi.bin
#cp ${work_dir}/lib/firmware/brcm/brcmfmac43430-sdio.rpi.bin ${work_dir}/lib/firmware/brcm/brcmfmac43430-sdio.bin
2018-12-07 03:26:39 +01:00
2020-07-22 21:29:57 -05:00
cp " ${ basedir } " /../bsp/firmware/rpi/BCM43430A1.hcd ${ work_dir } /lib/firmware/brcm/BCM43430A1.hcd
2017-10-01 19:24:26 -05:00
2018-07-12 02:51:33 -05:00
cd " ${ basedir } "
2017-10-01 19:24:26 -05:00
2020-07-22 21:29:57 -05:00
sed -i -e 's/^#PermitRootLogin.*/PermitRootLogin yes/' ${ work_dir } /etc/ssh/sshd_config
# Calculate the space to create the image.
2020-07-24 13:39:50 -05:00
root_size = $( du -s -B1 ${ work_dir } --exclude= ${ work_dir } /boot | cut -f1)
root_extra = $(( ${ root_size } / 1024 / 1000 * 5 * 1024 / 5 ))
raw_size = $(( $(( ${ free_space } * 1024 )) + ${ root_extra } + $(( ${ bootsize } * 1024 )) + 4096 ))
2017-10-01 19:24:26 -05:00
2018-06-28 23:43:48 -05:00
# Create the disk and partition it
2018-07-01 21:24:37 -05:00
echo " Creating image file ${ imagename } .img "
2020-07-26 14:38:21 -05:00
fallocate -l $( echo ${ raw_size } Ki | numfmt --from= iec-i --to= si) ${ current_dir } /${ imagename } .img
2020-07-27 03:09:02 -05:00
parted -s ${ current_dir } /${ imagename } .img mklabel msdos
2021-06-25 13:18:39 -05:00
parted -s ${ current_dir } /${ imagename } .img mkpart primary fat32 4MiB ${ bootsize } MiB
2020-07-27 03:09:02 -05:00
parted -s -a minimal ${ current_dir } /${ imagename } .img mkpart primary $fstype ${ bootsize } MiB 100%
2018-06-28 23:43:48 -05:00
# Set the partition variables
2020-07-27 03:09:02 -05:00
loopdevice = $( losetup --show -fP " ${ current_dir } / ${ imagename } .img " )
bootp = " ${ loopdevice } p1 "
rootp = " ${ loopdevice } p2 "
2018-06-28 23:43:48 -05:00
# Create file systems
2020-07-22 21:29:57 -05:00
mkfs.vfat -n BOOT -F 32 -v ${ bootp }
2020-07-26 14:38:21 -05:00
if [ [ $fstype = = ext4 ] ] ; then
features = "-O ^64bit,^metadata_csum"
elif [ [ $fstype = = ext3 ] ] ; then
features = "-O ^64bit"
fi
mkfs $features -t $fstype -L ROOTFS ${ rootp }
2018-06-28 23:43:48 -05:00
# Create the dirs for the partitions and mount them
2020-07-22 21:29:57 -05:00
mkdir -p ${ basedir } /root/
mount ${ rootp } ${ basedir } /root
mkdir -p ${ basedir } /root/boot
mount ${ bootp } ${ basedir } /root/boot
2018-06-28 23:43:48 -05:00
2018-07-02 12:17:40 -05:00
# We do this down here to get rid of the build system's resolv.conf after running through the build.
cat << EOF > kali-${ architecture } /etc/resolv.conf
nameserver 8.8.8.8
EOF
2018-07-05 17:54:41 -05:00
# Because of the p4wnp1 script, we set the hostname down here, instead of using the machine name.
# Set hostname
2020-07-22 21:29:57 -05:00
echo " ${ hostname } " > ${ work_dir } /etc/hostname
2018-07-05 17:54:41 -05:00
# So X doesn't complain, we add $hostname to hosts
2020-07-22 21:29:57 -05:00
cat << EOF > ${ work_dir } /etc/hosts
2018-07-05 17:54:41 -05:00
127.0.0.1 ${ hostname } localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
2018-06-28 23:43:48 -05:00
echo "Rsyncing rootfs into image file"
2020-07-22 21:29:57 -05:00
rsync -HPavz -q --exclude boot ${ work_dir } / ${ basedir } /root/
rsync -rtx -q ${ work_dir } /boot ${ basedir } /root
sync
2018-06-28 23:43:48 -05:00
2017-10-01 19:24:26 -05:00
# Unmount partitions
2018-07-01 21:24:37 -05:00
umount ${ bootp }
umount ${ rootp }
kpartx -dv ${ loopdevice }
losetup -d ${ loopdevice }
2017-10-01 19:24:26 -05:00
2020-07-26 14:38:21 -05:00
# Limite use cpu function
limit_cpu ( ) {
2020-07-22 21:29:57 -05:00
rand = $( tr -cd 'A-Za-z0-9' < /dev/urandom | head -c4 ; echo ) # Randowm name group
2020-07-26 14:38:21 -05:00
cgcreate -g cpu:/cpulimit-${ rand } # Name of group cpulimit
2020-07-22 21:29:57 -05:00
cgset -r cpu.shares= 800 cpulimit-${ rand } # Max 1024
cgset -r cpu.cfs_quota_us= 80000 cpulimit-${ rand } # Max 100000
2020-07-26 14:38:21 -05:00
# Retry command
local n = 1; local max = 5; local delay = 2
while true; do
cgexec -g cpu:cpulimit-${ rand } " $@ " && break || {
if [ [ $n -lt $max ] ] ; then
( ( n++) )
echo -e " \e[31m Command failed. Attempt $n / $max \033[0m "
sleep $delay ;
else
echo " The command has failed after $n attempts. "
break
fi
}
done
}
if [ $compress = xz ] ; then
if [ $( arch) = = 'x86_64' ] ; then
echo " Compressing ${ imagename } .img "
2020-07-27 18:47:11 -05:00
[ $( nproc) \< 3 ] || cpu_cores = 3 # cpu_cores = Number of cores to use
2021-06-25 13:18:39 -05:00
pixz -p ${ cpu_cores :- 2 } ${ current_dir } /${ imagename } .img # -p Nº cpu cores use
2020-07-26 14:38:21 -05:00
chmod 644 ${ current_dir } /${ imagename } .img.xz
fi
else
chmod 644 ${ current_dir } /${ imagename } .img
2017-10-01 19:24:26 -05:00
fi
2018-06-21 14:22:32 -05:00
# Clean up all the temporary build stuff and remove the directories.
2020-08-10 16:55:26 +02:00
# Comment this out to keep things around if you want to see what may have gone wrong.
2018-06-21 14:22:32 -05:00
echo "Cleaning up the temporary build files..."
2018-07-12 02:51:33 -05:00
rm -rf " ${ basedir } "