Kali Linux の live-build による custom iso

# 概要
Kali Linuxをpersistenceを用いたLiveUSBにして使っています。
以下の２つを改善したくてcustom isoを作りました。

- 新しくisoを書き込みLiveUSBにした際のアップデートが面倒
- ブート画面でのビープ音を消したり勝手にpersistenceでログインしてほしい

# 環境
## LiveUSBの作成
macOS
(ddがあるmacやlinuxだと簡単です。windowsでもできます。)
## live-build
Kali Linux(LiveUSBでもVirtualBoxでもデュアルブートでも普通のインストールされたものでもなんでもいい)
今回はLiveUSBでします。

# LiveUSBの作成
custom isoを作るためにKaliの環境がいるため、まずは公式が配布しているisoを使ってLiveUSBを作ります。

はじめにKaliの公式からisoファイルをダウンロードしてください。
[Kali公式ダウンロードページ](https://www.kali.org/downloads/)

次は空のusbにisoファイルを書き込みます。isoファイルがだいたい2.8GBとかなのでそれ以上あればよいです。
ただpersistenceを使うことを考えると16か32は欲しいです。

macOSの場合
`diskutil list`でusbのpathを調べる。
だいたい/dev/disk1です。このpathを間違えると大変なことになります。
`diskutil unmountdisk /dev/diskN`します。Nにはさっき調べたのをいれます。
`sudo dd if=/path/to/iso of=dev/diskN bs=1m`で書き込みます。
/path/to/isoはだいたい~/Download/kaliほにゃららだと思います。
`diskutil eject /dev/diskN`で取り出します。

これでLiveUSBの完成です。
どのPCでもいいのでLiveUSBをさしてboot menuを開いて起動してください。
後で述べますがMacBookだとwifi設定するのにネットワークに繋げる必要があるというループに陥るため、USBテザリングできるスマホかアダプタつけて有線で繋げられる環境が要ります。

LiveUSBが起動できたら、初めは一番上のliveで起動します。

## persistence設定
ただのliveでもlive-buildは可能ですが、ただのliveはシステム設定もユーザ設定も保存されないため作業が困難です。
そのためpersistence設定をします。
まず`gparted`でpersistence領域の設定をします。（kaliはrootでログインされるのでsudoはいらないです)
gpartedがなかなか開かない時はLiveUSB以外のHDDやSSDまで読み込んでいる場合が考えられます。
`fdisk -l`でLiveUSBのpathを調べて`gparted /dev/sdb`とかするとLiveUSBだけ開く。

gparted上の右上のところでLiveUSBの方を開く。kaliのOS領域と謎のFAT32領域があってその後にunallocatedの領域があると思います。そこを選択し、新しいパーテーションを作ってください。
ファイルシステムはex4で、ラベルはpersistenceとしてください。

次に

```
mkdir -p /mnt/usb
mount /dev/sdb3 /mnt/usb
echo "/ union" > /mnt/usb/persistence.conf
umount /dev/sdb3
```
とします。/dev/sdb3のところはさっき作ったpersistence領域にしてください。（手順通りならこのままでOK）

これでpersistence設定は完了しました。
再起動しlive(persistence)を選んでください。

# live-build
まず`apt update`してください。
その際にupgradeすべきパッケージがたくさんあると言われますが、ここで`apt upgrade`するととても時間がかかります。ここでしなくても後でisoをbuildする際にしてくれるので大丈夫です。どうせbuildするのにも時間かかるのでまとめてした方がいいです。

```
apt install git live-build cdebootstrap
git clone git://git.kali.org/live-build-config.git build
cd build
```
あとはupdateされたkaliのisoが欲しいだけなら、そこで

```
./build.sh --distribution kali-rolling --variant gnome --verbose
```
とすればできます。（ブート設定もしたい人は後でするのでしないでください。）
だいたいbuildには２時間くらいかかります。

## ブート設定
続いて２つ目の改善したい点のブート画面でビープ音を消すのとpersistenceに勝手に入るというところに取り掛かります。
今現在のブートの設定は

```
/lib/live/mount/persistence/sdb1/isolinux/
```
にあります。isolinux.cfgが最初に読み込まれるファイルで、その中でstdmenu.cfgとmenu.cfgを呼び出し、menu.cfg内でlive.cfgとinstall.cfgを呼び出しています。
これらのファイルは変更できないため、custom isoで変更する必要があります。

先ほど落としたbuildの中の`kali-config/common/includes.binary/isolinux`に自ら作ったcfgファイルを置くことでcustom isoに独自のブート設定が適用できます。
今回は以下の３つの点を変えたものを置きました。

- defaultのプロンプトを変える
- timeoutを設定し勝手に入る
- install関係の項目はなくす

他にも変えたい部分がある場合は現在のブート設定のcfgファイルを見ながら好きなように変えてください。

### kali-config/common/includes.binary/isolinux/isolinux.cfg
ここではdefaultとtimeoutを変えました。

```
include menu.cfg
ui vesamenu.c32
default live-persistence
prompt 0
timeout 3
```
### kali-config/common/includes.binary/isolinux/menu.cfg
ここではinclude install.cfgを消しました。

```
menu hshift 0
menu width 82
 
menu title Boot menu
include stdmenu.cfg
include live.cfg
 
menu clear
```

### kali-config/common/includes.binary/isolinux/live.cfg
これは変えてないです。使わない項目は消していいかな。

```
label live-amd64
    menu label ^Live (amd64)
    menu default
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live components splash username=root hostname=kali
 
label live-amd64-failsafe
    menu label ^Live (amd64 failsafe)
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live components username=root hostname=kali memtest noapic noapm nodma nomce nolapic nomodeset nosmp nosplash vga=normal
 
label live-forensic
    menu label Live (^forensic mode)
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live noconfig=sudo username=root hostname=kali noswap noautomount
 
label live-persistence
    menu label ^Live USB Persistence              (check kali.org/prst)
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live noconfig=sudo username=root hostname=kali persistence
 
label live-encrypted-persistence
    menu label ^Live USB Encrypted Persistence    (check kali.org/prst)
    linux /live/vmlinuz
    initrd /live/initrd.img
    append boot=live persistent=cryptsetup persistence-encryption=luks noconfig=sudo username=root hostname=kali persistence
```

### kali-config/common/includes.binary/isolinux/stdmenu.cfg
これは初めから置いてあるので書き換えるだけでいいです。
install関連の項目をなくした分だけ`menu row`を10から6に変えました。

```
menu background     splash.png
menu color title        * #FFFFFFFF *
menu color border       * #00000000 #00000000 none
menu color sel          * #ffffffff #76a1d0ff *
menu color hotsel       1;7;37;40 #ffffffff #76a1d0ff *
menu color tabmsg       * #ffffffff #00000000 *
menu color help         37;40 #ffdddd00 #00000000 none
menu vshift 10
menu hshift 4
menu width 70
menu margin 5
menu rows 6
menu helpmsgrow 15
# The command line must be at least one line from the bottom.
menu cmdlinerow 16
menu timeoutrow 16
menu tabmsgrow 18
menu tabmsg Press ENTER to boot or TAB to edit a menu entry
```

### MacBookでwifi設定に必要なものが組み込む
とりあえず最後にあるようにして１回wifi設定できれば、このようにして組み込めば今後はすぐにwifiが使えます。

kali-config/variant-gnome/package-lists/kali.list.chroot
のKali Applicationのところに


```
linux-headers-amd64
linux-image-amd64
linux-firmware
linux-firmware-free
broad-sta-dkms
```
を足せばいいです。
`linux-headers-amd64`は64bitの場合です。下のおまけで`apt install`したものです。
### 最後にbuild

```
./build.sh --distribution kali-rolling --variant gnome --verbose
```
だいたい２時間かかります。gnomeのところkdeに変えるとデスクトップ環境をkdeにできます。

# おまけ：Kali LinuxのMacBookでのwifi設定

```
apt install firmware-linux
apt install firmware-linux-free
apt install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') 
apt install linux-image-$(uname -r|sed 's,[^-]*-[^-]*-,,') 
apt install broadcom-sta-dkms
modprobe -r b44 b43 b43legacy ssb brcmsmac bcma
modprobe wl
```
でできます。
ただ`apt install`にネットワーク接続が必要なので、wifi以外でMacBookをネットワーク接続しないといけないです。
あとlinuxのkernelのversionが最新のものでないとうまくいかないことがあります。
KaliのLiveUSBではbootを変更できないためkernelの変更方法がわかりませんでした。
しかしcustom isoではkernelも最新のものが採用されるため、上で行った方法だとmacbookでもkaliでwifiをつなぐことができます。