Archiv des Autors: hermann

Universal USB Boot Stick based on Ventoy

Running non ISO Linux from flash drive

While testing Ventoy and its option for customization I was wondering whether storing and starting the different images on the USB Stick is realy the most effective way.
Havinf different Images in place for fast installations is great. And the oportunity ofjust copying them to the flash drive without any further hazel is nearly perfect for daily purposes.

But on the other hand I there are three other use cases for Live Systems

  • Preinstalled Toolset for Work
  • Hacking
  • Images for System Rescue

For those use cases a more efficient way for booting and storing Data on the same flash drive makes more sense.

Mounting ISO and extract necessary files

Mounting an ISO is quiet easy. Either open it wiith graphical UI of the OS of your choice or (on *nix) mount ist as a loop device.

mkdir /tmp/loop
sudo mount -o loop /path/to/some.iso /tmp/loop

Now extract the vmlinuz, initrd.gz and the root filesystem. Based on Damm Small Linux 2024 this looks like this.

tree /Volumes/dsl-2024.rc7/
/Volumes/dsl-2024.rc7/
├── antiX
│   ├── initrd.gz
│   ├── initrd.gz.md5
│   ├── linuxfs
│   ├── linuxfs.info
│   ├── linuxfs.md5
│   ├── random-seed
│   ├── vmlinuz
│   ├── vmlinuz.md5
│   └── vmlinuz1.md5
├── boot
│   ├── isolinux
│   │   ├── README
│   │   ├── boot.cat
│   │   ├── chain.c32
│   │   ├── console.def.gfx
│   │   ├── console.def.orig
│   │   ├── console.men.orig
│   │   ├── gfx-cpio
│   │   ├── gfxboot.c32
│   │   ├── gfxsave.cfg
│   │   ├── isolinux.bin
│   │   ├── isolinux.cat
│   │   ├── isolinux.cfg
│   │   ├── ldlinux.c32
│   │   ├── libcom32.c32
│   │   ├── libmenu.c32
│   │   ├── libutil.c32
│   │   ├── menu.c32
│   │   ├── readme.msg
│   │   └── version
│   └── memtest
├── cdrom.ico
└── version

4 directories, 31 files

Checking the /boot/isolinux/isolinux.cfg gives us a brief overview abot the needs.

...
#    MENU LABEL antiX-23-runit_386-base (26 August 2023)
LABEL live
    MENU LABEL DSL 2024, hacked from antiX 23
    KERNEL /antiX/vmlinuz
    APPEND quiet splasht disable=lxF
    INITRD /antiX/initrd.gz
...

To avoid missing something we copy the complete directory antiX. Problem is, that the filesystem is withn the Image linuxfs, which is mounted in an overlay configuration stored in initrd.gz.

On the the flash drive we create a directory to store our non ISO based systems (in my case /linux). Within this directory we create as subdirectories for Damm Small Linux (dsl) in which we copy all the files from the antiX directory.

Changing the reference to the filesystem within initrd.gz

To update the reference we have to extract the data from the initrd.

mkdir /tmp/temp-initrd
cd /tmp/temp-initrd
gzip -dc /[path to flash drive]/linux/dsl/initrd.gz | cpio --extract --make-directories

Now we can edit the path to the init file in the root of our temporary directory and update the default path to linuxfs.

vi init

...
    DEFAULT_SQFILE=/antiX/linuxfs    (change to:/linux/dsl/linuxfs)
...

/linuxfs

After saving those change it is time to recreate the initrd.gz. The following pipe of commands finds every content in the current directory pipes it to cpio for creating a new initrd which pipes the output to gzip for compressing and storing it back to our target directory on the flash drive.

find . | cpio --create --format=newc | gzip > /[path to flash drive]/linux/dsl/initrd.gz

Creating a custom grub2 menu

Since we not have an image here the necessary item in grub2 will not automatically be created. Therefor we use the custom menu plugin from ventoy and define custom class for our entries.

If not existing we create a ventoy directory in the root of the flash drive. That’s the common directory for config and themes in Ventoy.

mkdir -p /[path to flash drive]/ventoy

Next we create a file named ventoy_grub.cfg to store our custom menu configuration.

vi /[path to flash drive]/ventoy/ventoy_grub.cfg

with the following content

menuentry "Damm Small Linux" --class=custom {
    echo "Loading Kernel ..."
    linux (hd0,msdos1)/linux/dsl/vmlinuz root=(hd0,msdos1)/linux/dsl/linuxfs
    echo "Loading Initrd ..."
    initrd (hd0,msdos1)/linux/dsl/initrd.gz
}
menuentry '<-- Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
    echo 'Return ...'
}

After saving this we are ready for booting our customized Ventoy flash drive. After booting into the Ventoy grub2 menu we have to call our custom menu with [F6] and kann boot directly without beeing limited by the ISOs in boot time or errors caused by failed file sources.

To be done:

  • Creating a directory or a partition on flash drive to store data and system state

[TOC]

Inter Container Communication

Problem

Running services in container enrironments often leads to the need enabling access from one conteiner to another. This is quiet easy, if we are runnung all containers in the same docker net. If the containers running in different networks, we have to access the other container by connecting the exposed port on the host.
Since we are running in a container localhost is refering to the container itself. In the first it seems simple to connect to IP or hostname of the host in its LAN, but this is not very flexible. If the host gets another IP oder the container moves to another system, the config allways has to be adopted.

Possible Solution

While instancing the container, we create an entry in the docker internal address solution to refere to the host.

docker run -d \
  --restart: always \
  --add-host host.docker.internal:host-gateway \
  alpine:latest

Or within
“`docker-compose.yaml“` …

...
services:
  my_host:
    restart: always
    image: alpine:latest
    extra_hosts:
      - host.docker.internal:host-gateway
...

Pentesting Lab

Using Images from vulnhub.com in KVM (LibVirt) to create a Lab

Since most images on vulnhub are based on VMWare or VirtualBox, we have to convert the images into a proper format.

For now we will focus on VirtualBox Images (OVA) and convert them to qcow2 for Qemu.

Download an Image

As an example I will use the Breach 1 Image from https://www.vulnhub.com/entry/breach-1,152/ and download it.

wget https://download.vulnhub.com/breach/Breach-1.0.zip

As you can read in the description, this is a 7zip archive. So we have du decompress it and install 7z before.

# using Debian based system
sudo apt install p7zip-full
7z x Breach-1.0.zip

OVA is a Tarball

One thing to know is that an OVA is a Tarball. So let’s extract the Tarball.

tar -xvf 'Breach 1.0.ova'
Breach 1.0.ovf
Breach 1.0.mf
Breach_1.0-disk1.vmdk
Breach_1.0-file1.iso
Breach_1.0-file2.iso

Converting the disk (usually the vmdk file) into qcow2

# look for a disk image
ls -alh
total 5.7G
drwxr-xr-x 4 root root 4.0K Jun  5 21:16  .
drwx--x--x 4 root root 4.0K Jun  5 20:41  ..
-rw-r--r-- 1   64   64 1.4G Jun 13  2016  Breach_1.0-disk1.vmdk
-rw-r--r-- 1   64   64  32M Jun 13  2016  Breach_1.0-file1.iso
-rw-r--r-- 1   64   64 579M Jun 13  2016  Breach_1.0-file2.iso
-rw-r--r-- 1   64   64  271 Jun 13  2016 'Breach 1.0.mf'
-rw-r--r-- 1   64   64 7.5K Jun 13  2016 'Breach 1.0.ovf'
-rw-r--r-- 1 root root 1.9G Jun 14  2016  Breach-1.0.zip
-rw-r--r-- 1 root root 2.0G Jun 13  2016  breach.ova

# now we can convert the virtual machine disk image (vmdk) to create our qcow2 image
qemu-img convert -O qcow2 Breach_1.0-disk1.vmdk breach.qcow2

Now we can use breach.qcow2 as disk for out virtual machine.

Mounting the disk to the host to make changes the filesystem

This comes handy, if the image uses a fixed network setup, that does not fit your needs.

In the first we need to load kernel modules. Only necessary once.

sudo modprobe nbd max_part=8

Now we have to connect the image an mount the proper partition.

# connect the image to the device
sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/VM.qcow2

# check the partitions to find the root partition
fdisk /dev/nbd0 -l
Disk /dev/nbd0: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000312f0

Device      Boot    Start      End  Sectors  Size Id Type
/dev/nbd0p1 *        2048 39845887 39843840   19G 83 Linux
/dev/nbd0p2      39847934 41940991  2093058 1022M  5 Extended
/dev/nbd0p5      39847936 41940991  2093056 1022M 82 Linux swap / Solaris

# create a directory as a mount point
mkdir /tmp/mnt

# mount the first partition
sudo mount /dev/nbd0p1 /tmp/mnt/

# finaly reverse it to clean up and to unblock the image
umount /tmp/mnt && rmdir /tmp/mnt
qemu-nbd --disconnect /dev/nbd0

MacBook Pro Middle 2009 – ReCover

Womit Anfangen?

Als erstes muss mal klar sein, dass man entweder eine funktionierende Recovery-Partition (beim Booten [CMD]+[R] drücken) oder ein externes Installationsmedium benötigt. Eine Installation mit einer Recovery aus dem Netz (beim Booten [ALT]+[CMD]+[C] drücken) ist mit der alten HW leider nicht möglich.

Meine Odyssee beginnt somit mit einer alten Installations-CD von Snow Leopard. Diese ist in ein passendes Laufwerk einzulegen und dann muss man von dieser Booten (beim Booten [C] drücken).
Ich hatte das Problem, dass das eingebaute optische Laufwerk scheinbar einen Defekt hatte, was wohl eher zur Regel gehört bei Geräten dieser Generation.

Nach der Grundinstallation

Nun gilt es als aller erstes mal alle Updates einzuspielen um überhaupt an den Mac App Store zu gelangen. Dazu benötigt es eines Klicks auf den Apfel oben links und dann ein Klick auf Softwareaktualisierung … . Dieses ist solange zu wiederholen, bis keine weiteren Aktualisierungen mehr gefunden werden können.

Herunterladen von Lion

Leider gibt es keine mir bekannte einfache Art ein Installationsmedion zu erstellen vor Lion. Alle Versuche direkt in eine neue Version zu Aktualisieren sind bei mir mit Fehlern quitiert worden. Aus diesem Grund habe ich den (Um-)Weg über Lion genommen und dieses aus dem Bereich Käufe meines App Store heruntergeladen und installiert.

Herunterladen aktuellerer MacOS Versionen

Nun mit Lion können neuere Versionen von MacOS geladen werden und USB-Installationsmedien erstellt werden.

sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/SNOWLEO/ --applicationpath /Applications/Install\ OS\ X\ El\ Capitan.app

Windows 10 USB-Installationsstick erstellen unter Mac OS

Herunterladen des aktuellen ISO Image von Microsoft

Microsoft bietet für Ihr Haueigenes OS ISO-Images zum Download an.
Link zum Download

Installieren eines kleinen Tools um erforerliche Dateien auf eine FAT32 kompatible größe zu reduzieren/teilen

Mit Homebrew (vorausgesetzt) installiert man wimlib.

brew install wimlib

Erstellen des USB-Stick in folgenden Schritten

  1. USB-Stick anschließen und die Command Line (Terminal) öffnen

Finder -> Programme -> Dienstprogramme -> Terminal.app

# Herausfinden was der Stick ist
diskutil list
# mit MBR und FAT formatieren
diskutil eraseDisk MS-DOS "WIN10" MBR /dev/diskx

Hier ist exemplarisch die “diskx” gewählt worden um Copy&Paste Fehler zu vermeiden. Es jedoch ist extrem wichtig die richtige “disk” zu ermitteln, da ansonsten Daten unwiederbringlich gelöscht werden können. Die Größe liefert hier gute Anhaltspunkte. Im Zweifel kann man alle externen Laufwerke und Netzlaufwerke entfernen, wodurch sich die Anzahl der Disks entsprechend reduziert.

Nun müssen wir noch das ISO-Image einbinden. Entweder man öffnet das ISO, wodurch es automatisch als gerät eingebunden wird oder man macht es direkt in der Command Line mit folgendem Befehl

hdiutil mount ~/Downloads/Win10_[Version]_[Sprach]_x64.iso

Anschließend können wir endlich die erforderlichen Dateinen in 2 Schritten koppieren. Der erste Schritt synchronisiert die Daten von A nach B und der zweite Schritt Teilt eine für das FAT-Format zu große Datei in zwei Dateien auf.

# Synchen aller Daten ausgenommen der zu großen Datei
rsync -vha --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_[key layout]_DV9/* /Volumes/WIN10

# Aufteilen der zu Großen Datei in kleinere und speichern auf dem USB-Stick
wimlib-imagex split /Volumes/CCCOMA_X64FRE_[key layout]_DV9/sources/install.wim /Volumes/WIN10/sources/install.swm 3800

Fertig zur Installation

Jetzt ist der Stick soweit fertig. Um sicher zu sein, dass alle Daten auf den Stick geschrieben sind sollte dieser ausgehängt werden und um ganz sicher zu sein, weisen wir das OS vorher noch an alle daten zu schreiben, die ggf. noch im RAM gepuffert sind.

# Puffer im RAM aus Speicher schreiben
sync

# USB-Speicherstick aushängen
diskutil umountDisk /dev/diskx

Wiedererhstellung N1T1(DD1)

Eines vor weg:

Es gab von der N1T1 verschiedene Versionen mit unterschiedlichen Softwarestacks. Grundsätzliche ist der Funktionsumfang der Box gegenüber anderen NAS stark eingeschränkt. Dennoch genügt die Box den Standardanwendungen eines NAS und hat zusätzlich sich noch ein DVD-Laufwer. Auch wenn man es vermutlich nie braucht. Das das “nie braucht” trifft auch auf die meisten Features anderer Produkte zu also denn.

Nun zur Wiederherstellung:

Die Box wurde mit einer Wiederherstellungs-DVD ausgeliefert und wenn man diese nicht mehr oder nie hatte, dann kann man sich ein DVD-Image bei LG herunterladen. Dieses wird vermutlich bei Boxen, die nie ein Update des U-Boot (sowas ähnliches wie ein BIOS) erfahren haben auch noch funktioniere.
Hat man jedoch gewissenhaft seine Updates eingespielt und die Box immer auf einem aktuellen Stand zu halten und ggf. auch nur um die neue GUI zu bekommen, dann wird man feststellen, dass genau diese DVD zur Wiederherstellung garnicht mehr funktioniert 🙁

Warum ist das eigentlich so? Neben dieser Box hat LG noch weitere NAS auf den Markt gebracht, die kein DVD-Laufwerk besitzen und anscheinend hat LG irgendwann beschlossen den Wiederherstellungsprozess zu vereinheitlichen. Leider hat LG es bis heute versäumt dies auch mal ordentlich zu dokumentieren. Von anderen Kunden habe ich erfahren, dass selbst anrufe bei der Hotline gezeigt haben, dass bei LG selber dieses Wissen um Wiederherstellungsprozesse der Box nicht klar sind. 🙁

Was ist denn dann die Lösung:

Im einfachsten Fall lädt man sich das ZIP-Archiv N1T1-dg.zip von der LG eigenen Webseite runter und folgt den Instruktionen in dem enthaltenen Textdokument. WICHTIG: Man sollte den N1T1-Finder aus diese Archiv verwenden und keinen anderen. Dann läuft alles ganz einfach … SOLANGE man Windows zuhause einsetzt :-/

Und was mache ich ohne Windows?

Ohne Windows hat man folgende Optionen:
1. Man besorgt sich eine Windows Rechner. // Ja, nee, ist klar 🙁 //
2. Man installiert Windows auf einem virtuellen System // VirtualBox, VMWare, … //
3. Man nimmt sich den Prozess vor und guckt was da eigentlich passiert. An diesem Punkt kann man sich Fragen: Lohnt sich das denn noch?
Antwort: Jain. Wenn man die Leistungen der Box mit den Kosten für einen gleichwertigen Ersatz ins Verhältnis setzt, dann kauft man vermutlich besser bei Ebay eine gebrauchte Synology für ca. 30-35€. Freut sich, dass man noch Updates bekommt und der Funktionsumfang der Box einem (viel) mehr bietet.
ABER wo bleibt da die Genugtuung? Wo ist der Sieg? Kann ich vielleicht etwas lernen was mich an anderer Stelle weiter bringt?
Will ich wirklich einfach so aufgeben und ein Stück HW, dass noch funktionieren kann dem Schrott anvertrauen?
Wenn die Antwort auf die letzte Frage JA lautet, dann faßt euch ein Herz und schreibt mich an um meine Adresse für den Versand in Erfahrung zu bringen 😉

Wenn der Wunsch eines Sieges über die Vernunft triumphiert, dann findet Ihr hier weitere nötige Informationen:
* N1T1 :: JTAG, bzw. FTDI
* N1T1 :: U-Boot unter der Lupe / manuelles Booten
* N1T1 :: alternative Firmware (Tantalus)
* N1T1 mit aktuellem Linux