Due to extras pulling in the modifications to the plymouth config file, we were getting prompted whether to overwrite it or not. There is a bug to fix plymouth but currently upstream needs help to work on it. Work around it for now.
387 lines
14 KiB
Bash
Executable File
387 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "This script must be run as root"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $# -eq 0 ]] ; then
|
|
echo "Please pass version number, e.g. $0 2.0"
|
|
exit 0
|
|
fi
|
|
|
|
basedir=`pwd`/kalitap-$1
|
|
|
|
# Custom hostname variable
|
|
hostname=${2:-kali}
|
|
# Custom image file name variable - MUST NOT include .img at the end.
|
|
imagename=${3:-kali-linux-$1-kalitap}
|
|
# Size of image in megabytes (Default is 7000=7GB)
|
|
size=7000
|
|
# Suite to use.
|
|
# Valid options are:
|
|
# kali-rolling, kali-dev, kali-bleeding-edge, kali-dev-only, kali-experimental, kali-last-snapshot
|
|
# A release is done against kali-last-snapshot, but if you're building your own, you'll probably want to build
|
|
# kali-rolling.
|
|
suite=kali-rolling
|
|
|
|
# Generate a random machine name to be used.
|
|
machine=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)
|
|
|
|
# Package installations for various sections.
|
|
# This will build a minimal XFCE Kali system with the top 10 tools.
|
|
# This is the section to edit if you would like to add more packages.
|
|
# See http://www.kali.org/news/kali-linux-metapackages/ for meta packages you
|
|
# can use. You can also install packages, using just the package name, but keep
|
|
# in mind that not all packages work on ARM! If you specify one of those, the
|
|
# script will throw an error, but will still continue on, and create an unusable
|
|
# image, keep that in mind.
|
|
|
|
arm="abootimg cgpt fake-hwclock ntpdate vboot-utils vboot-kernel-utils u-boot-tools"
|
|
base="apt-utils kali-defaults ifupdown initramfs-tools usbutils firmware-linux firmware-atheros firmware-libertas firmware-realtek"
|
|
desktop="kali-menu xfce4 network-manager network-manager-gnome ntpdate xserver-xorg-video-fbdev"
|
|
tools="passing-the-hash winexe aircrack-ng hydra john sqlmap wireshark libnfc-bin mfoc"
|
|
services="openssh-server apache2"
|
|
extras="firefox-esr wpasupplicant"
|
|
|
|
packages="${arm} ${base} ${services}"
|
|
architecture="armhf"
|
|
# If you have your own preferred mirrors, set them here.
|
|
# You may want to leave security.kali.org alone, but if you trust your local
|
|
# mirror, feel free to change this as well.
|
|
# After generating the rootfs, we set the sources.list to the default settings.
|
|
mirror=http.kali.org
|
|
|
|
# Set this to use an http proxy, like apt-cacher-ng, and uncomment further down
|
|
# to unset it.
|
|
#export http_proxy="http://localhost:3142/"
|
|
|
|
mkdir -p "${basedir}"
|
|
cd "${basedir}"
|
|
|
|
# create the rootfs - not much to modify here, except maybe throw in some more packages if you want.
|
|
debootstrap --foreign --keyring=/usr/share/keyrings/kali-archive-keyring.gpg --include=kali-archive-keyring --arch ${architecture} ${suite} kali-${architecture} http://${mirror}/kali
|
|
|
|
cp /usr/bin/qemu-arm-static kali-${architecture}/usr/bin/
|
|
|
|
LANG=C systemd-nspawn -M ${machine} -D kali-${architecture} /debootstrap/debootstrap --second-stage
|
|
|
|
mkdir -p kali-${architecture}/etc/apt/
|
|
cat << EOF > kali-${architecture}/etc/apt/sources.list
|
|
deb http://${mirror}/kali ${suite} main contrib non-free
|
|
EOF
|
|
|
|
echo "${hostname}" > kali-${architecture}/etc/hostname
|
|
|
|
cat << EOF > kali-${architecture}/etc/hosts
|
|
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
|
|
|
|
mkdir -p kali-${architecture}/etc/network/
|
|
cat << EOF > kali-${architecture}/etc/network/interfaces
|
|
auto lo
|
|
iface lo inet loopback
|
|
|
|
auto eth0
|
|
iface eth0 inet dhcp
|
|
|
|
iface usb0 inet static
|
|
address 192.168.7.2
|
|
netmask 255.255.255.0
|
|
network 192.168.7.0
|
|
gateway 192.168.7.1
|
|
EOF
|
|
|
|
cat << EOF > kali-${architecture}/etc/resolv.conf
|
|
nameserver 8.8.8.8
|
|
EOF
|
|
|
|
export MALLOC_CHECK_=0 # workaround for LP: #520465
|
|
export LC_ALL=C
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
#mount -t proc proc kali-${architecture}/proc
|
|
#mount -o bind /dev/ kali-${architecture}/dev/
|
|
#mount -o bind /dev/pts kali-${architecture}/dev/pts
|
|
|
|
cat << EOF > kali-${architecture}/debconf.set
|
|
console-common console-data/keymap/policy select Select keymap from full list
|
|
console-common console-data/keymap/full select en-latin1-nodeadkeys
|
|
EOF
|
|
|
|
mkdir -p kali-${architecture}/usr/lib/systemd/system/
|
|
cat << 'EOF' > kali-${architecture}/usr/lib/systemd/system/regenerate_ssh_host_keys.service
|
|
[Unit]
|
|
Description=Regenerate SSH host keys
|
|
Before=ssh.service
|
|
[Service]
|
|
Type=oneshot
|
|
ExecStartPre=-/bin/dd if=/dev/hwrng of=/dev/urandom count=1 bs=4096
|
|
ExecStartPre=-/bin/sh -c "/bin/rm -f -v /etc/ssh/ssh_host_*_key*"
|
|
ExecStart=/usr/bin/ssh-keygen -A -v
|
|
ExecStartPost=/bin/sh -c "for i in /etc/ssh/ssh_host_*_key*; do actualsize=$(wc -c <\"$i\") ;if [ $actualsize -eq 0 ]; then echo size is 0 bytes ; exit 1 ; fi ; done ; /bin/systemctl disable regenerate_ssh_host_keys"
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
chmod 644 kali-${architecture}/usr/lib/systemd/system/regenerate_ssh_host_keys.service
|
|
|
|
cat << EOF > kali-${architecture}/usr/lib/systemd/system/smi-hack.service
|
|
[Unit]
|
|
Description=shared-mime-info update hack
|
|
Before=regenerate_ssh_host_keys.service
|
|
[Service]
|
|
Type=oneshot
|
|
Environment=DEBIAN_FRONTEND=noninteractive
|
|
ExecStart=/bin/sh -c "rm -rf /etc/ssl/certs/*.pem && dpkg -i /root/ca-certificates_20190110_all.deb /root/fontconfig_2.13.1-2_armhf.deb /root/libgdk-pixbuf2.0-0_2.38.1+dfsg-1_armhf.deb"
|
|
ExecStart=/bin/sh -c "dpkg-reconfigure shared-mime-info"
|
|
ExecStart=/bin/sh -c "rm -f /root/*.deb"
|
|
ExecStartPost=/bin/systemctl disable smi-hack
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
chmod 644 kali-${architecture}/usr/lib/systemd/system/smi-hack.service
|
|
|
|
cat << EOF > kali-${architecture}/third-stage
|
|
#!/bin/bash
|
|
set -e
|
|
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
|
|
chmod 755 /usr/sbin/policy-rc.d
|
|
|
|
apt-get update
|
|
apt-get --yes --allow-change-held-packages install locales-all
|
|
|
|
debconf-set-selections /debconf.set
|
|
rm -f /debconf.set
|
|
apt-get update
|
|
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
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
# This looks weird, but we do it twice because every so often, there's a failure to download from the mirror
|
|
# So to workaround it, we attempt to install them twice.
|
|
apt-get --yes --allow-change-held-packages install ${packages} || apt-get --yes --fix-broken install
|
|
apt-get --yes --allow-change-held-packages install ${packages} || apt-get --yes --fix-broken install
|
|
apt-get --yes --allow-change-held-packages install ${desktop} ${extras} ${tools} || apt-get --yes --fix-broken install
|
|
apt-get --yes --allow-change-held-packages install ${desktop} ${extras} ${tools} || apt-get --yes --fix-broken install
|
|
apt-get --yes --allow-change-held-packages dist-upgrade
|
|
apt-get --yes --allow-change-held-packages autoremove
|
|
|
|
# Because copying in authorized_keys is hard for people to do, let's make the
|
|
# image insecure and enable root login with a password.
|
|
echo "Making the image insecure"
|
|
sed -i -e 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
|
|
|
|
# Regenerated the shared-mime-info database on the first boot
|
|
# since it fails to do so properly in a chroot.
|
|
systemctl enable smi-hack
|
|
|
|
# Generate SSH host keys on first run
|
|
systemctl enable regenerate_ssh_host_keys
|
|
systemctl enable ssh
|
|
|
|
# Copy bashrc
|
|
cp /etc/skel/.bashrc /root/.bashrc
|
|
|
|
cd /root
|
|
apt download ca-certificates
|
|
apt download libgdk-pixbuf2.0-0
|
|
apt download fontconfig
|
|
|
|
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
|
|
|
|
chmod 755 kali-${architecture}/third-stage
|
|
LANG=C systemd-nspawn -M ${machine} -D kali-${architecture} /third-stage
|
|
|
|
cat << EOF > kali-${architecture}/cleanup
|
|
#!/bin/bash
|
|
rm -rf /root/.bash_history
|
|
apt-get update
|
|
apt-get clean
|
|
rm -f /0
|
|
rm -f /hs_err*
|
|
rm -f cleanup
|
|
rm -f /usr/bin/qemu*
|
|
EOF
|
|
|
|
chmod 755 kali-${architecture}/cleanup
|
|
LANG=C systemd-nspawn -M ${machine} -D kali-${architecture} /cleanup
|
|
|
|
#umount kali-${architecture}/proc/sys/fs/binfmt_misc
|
|
#umount kali-${architecture}/dev/pts
|
|
#umount kali-${architecture}/dev/
|
|
#umount kali-${architecture}/proc
|
|
|
|
# Enable serial console on ttyO0
|
|
echo 'T1:12345:respawn:/sbin/agetty 115200 ttyO0 vt100' >> "${basedir}"/kali-${architecture}/etc/inittab
|
|
|
|
cat << EOF >> "${basedir}"/kali-${architecture}/etc/udev/links.conf
|
|
M ttyO0 c 5 1
|
|
EOF
|
|
|
|
cat << EOF >> "${basedir}"/kali-${architecture}/etc/securetty
|
|
ttyO0
|
|
EOF
|
|
|
|
cat << EOF > "${basedir}"/kali-${architecture}/etc/apt/sources.list
|
|
deb http://http.kali.org/kali kali-rolling main non-free contrib
|
|
deb-src http://http.kali.org/kali kali-rolling main non-free contrib
|
|
EOF
|
|
|
|
# Uncomment this if you use apt-cacher-ng or else git clones will fail.
|
|
#unset http_proxy
|
|
|
|
# Need to patch the kernel to support newer gcc, but that'll happen after 2018.3
|
|
cd "${basedir}"
|
|
git clone --depth 1 https://gitlab.com/kalilinux/packages/gcc-arm-linux-gnueabihf-4-7.git gcc-arm-linux-gnueabihf-4.7
|
|
|
|
# Get, compile and install kernel
|
|
git clone --depth 1 https://github.com/wawtechnologies/linux-kernel-3.14.51-catchwire-kalitap.git "${basedir}"/kali-${architecture}/usr/src/kernel
|
|
cd "${basedir}"/kali-${architecture}/usr/src/kernel
|
|
git rev-parse HEAD > "${basedir}"/kali-${architecture}/usr/src/kernel-at-commit
|
|
patch -p1 --no-backup-if-mismatch < "${basedir}"/../patches/kali-wifi-injection-3.14.patch
|
|
patch -p1 --no-backup-if-mismatch < "${basedir}"/../patches/0001-wireless-carl9170-Enable-sniffer-mode-promisc-flag-t.patch
|
|
touch .scmversion
|
|
export ARCH=arm
|
|
export CROSS_COMPILE="${basedir}"/gcc-arm-linux-gnueabihf-4.7/bin/arm-linux-gnueabihf-
|
|
cp "${basedir}"/../kernel-configs/kalitap.config .config
|
|
cp "${basedir}"/../kernel-configs/kalitap.config "${basedir}"/kali-${architecture}/usr/src/kalitap.config
|
|
make -j $(grep -c processor /proc/cpuinfo)
|
|
make catchwire.dtb catchwire-demac.dtb catchwire-switch.dtb
|
|
make INSTALL_MOD_PATH="${basedir}"/kali-${architecture}/ modules_install
|
|
cp arch/arm/boot/zImage "${basedir}"/kali-${architecture}/boot/
|
|
cp arch/arm/boot/dts/catchwire*.dtb "${basedir}"/kali-${architecture}/boot/
|
|
make mrproper
|
|
cp ../kalitap.config .config
|
|
cd "${basedir}"
|
|
|
|
cat << EOF > "${basedir}"/kali-${architecture}/etc/fstab
|
|
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
|
|
/dev/mmcblk0p1 /boot auto noauto 0 0
|
|
EOF
|
|
|
|
cd "${basedir}"
|
|
|
|
# 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
|
|
kernver=$(ls "${basedir}"/kali-${architecture}/lib/modules/)
|
|
cd "${basedir}"/kali-${architecture}/lib/modules/${kernver}
|
|
rm build
|
|
rm source
|
|
ln -s /usr/src/kernel build
|
|
ln -s /usr/src/kernel source
|
|
cd "${basedir}"
|
|
|
|
git clone https://github.com/wawtechnologies/utilities-catchwire-kalitap "${basedir}"/utilities
|
|
cd "${basedir}"/utilities
|
|
cp cpswutils/cpswaleget "${basedir}"/kali-${architecture}/usr/sbin
|
|
cp cpswutils/cpswaleset "${basedir}"/kali-${architecture}/usr/sbin
|
|
cp udp0srv/udp0srv "${basedir}"/kali-${architecture}/usr/sbin
|
|
cd "${basedir}"
|
|
|
|
#u-boot kalitap specific overrides:
|
|
cat << EOF > "${basedir}"/kali-${architecture}/boot/uEnv.txt
|
|
optargs="consoleblank=0 mem=1G rootwait fixrtc net.ifnames=0 rootwait"
|
|
kernel_file=zImage
|
|
initrd_file=initrd.img
|
|
loadaddr=0x82000000
|
|
initrd_addr=0x88080000
|
|
fdtaddr=0x88000000
|
|
fdtfile=catchwire.dtb
|
|
initrd_high=0xffffffff
|
|
fdt_high=0xffffffff
|
|
loadimage=load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
|
|
loadinitrd=load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}; setenv initrd_size \${filesize}
|
|
loadfdt=load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} \${fdtfile}
|
|
console=ttyO0,115200n8
|
|
mmcroot=/dev/mmcblk0p2
|
|
mmcrootfstype=ext4
|
|
mmcargs=setenv bootargs console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} \${optargs}
|
|
uenvcmd=run loadimage; run loadfdt; run mmcargs; bootz \${loadaddr} - \${fdtaddr}
|
|
EOF
|
|
|
|
# Need MLO/u-boot on the sdcard.
|
|
git clone https://github.com/wawtechnologies/u-boot-2014.04-catchwire-kalitap.git "${basedir}"/u-boot
|
|
cd "${basedir}"/u-boot
|
|
make ARCH=arm distclean
|
|
make ARCH=arm catchwire_config
|
|
make ARCH=arm
|
|
|
|
cp MLO "${basedir}"/kali-${architecture}/boot/
|
|
cp u-boot.img "${basedir}"/kali-${architecture}/boot/
|
|
|
|
cd "${basedir}"
|
|
|
|
sed -i -e 's/^#PermitRootLogin.*/PermitRootLogin yes/' "${basedir}"/kali-${architecture}/etc/ssh/sshd_config
|
|
|
|
# Create the disk and partition it
|
|
echo "Creating image file ${imagename}.img"
|
|
dd if=/dev/zero of="${basedir}"/${imagename}.img bs=1M count=${size}
|
|
parted ${imagename}.img --script -- mklabel msdos
|
|
parted ${imagename}.img --script -- mkpart primary fat32 2048s 264191s
|
|
parted ${imagename}.img --script -- mkpart primary ext4 264192s 100%
|
|
parted ${imagename}.img --script -- set 1 boot on
|
|
|
|
# Set the partition variables
|
|
loopdevice=`losetup -f --show "${basedir}"/${imagename}.img`
|
|
device=`kpartx -va ${loopdevice} | sed 's/.*\(loop[0-9]\+\)p.*/\1/g' | head -1`
|
|
sleep 5
|
|
device="/dev/mapper/${device}"
|
|
bootp=${device}p1
|
|
rootp=${device}p2
|
|
|
|
# Create file systems
|
|
mkfs.vfat -F 16 ${bootp}
|
|
mkfs.ext4 -O ^64bit -O ^flex_bg -O ^metadata_csum ${rootp}
|
|
|
|
# Create the dirs for the partitions and mount them
|
|
mkdir -p "${basedir}"/root
|
|
mount ${rootp} "${basedir}"/root
|
|
mkdir -p "${basedir}"/root/boot
|
|
mount ${bootp} "${basedir}"/root/boot
|
|
|
|
|
|
# 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
|
|
|
|
echo "Rsyncing rootfs into image file"
|
|
rsync -HPavz -q "${basedir}"/kali-${architecture}/ "${basedir}"/root/
|
|
|
|
# Unmount partitions
|
|
sync
|
|
umount ${bootp}
|
|
umount ${rootp}
|
|
kpartx -dv ${loopdevice}
|
|
losetup -d ${loopdevice}
|
|
|
|
# Don't pixz on 32bit, there isn't enough memory to compress the images.
|
|
MACHINE_TYPE=`uname -m`
|
|
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
|
|
echo "Compressing ${imagename}.img"
|
|
pixz "${basedir}"/${imagename}.img "${basedir}"/../${imagename}.img.xz
|
|
rm "${basedir}"/${imagename}.img
|
|
fi
|
|
|
|
# Clean up all the temporary build stuff and remove the directories.
|
|
# Comment this out to keep things around if you want to see what may have gone
|
|
# wrong.
|
|
echo "Removing temporary build files"
|
|
rm -rf "${basedir}"
|