Last time, we dipped our toes into the waters of the Kobo Clara HD's USB interface. As it turns out, there is a lot more we can do with this simple interface. The Clara HD runs Linux, and we can easily gain root telnet access to the device over WiFi.

The firmware upgrade process

In order to do so, we will leverage the Clara HD's firmware upgrade process. The upgrade process works by downloading a firmware upgrade to .kobo/KoboRoot.tgz in the internal storage. Upon a reboot, if this file exists, it will be extracted over the root filesystem, replacing existing files with replacements from the tgz file.

Obtaining the OEM firmware

We need, then, to obtain a copy of the firmware to start with. If you imaged the internal microSD card as in part 1, you may be able to simply mount and access the image. The easier way, however, is to download the firmware patch directly from Kobo.

On the Clara HD, select Settings from the menu, then Device information and note the Software version, then download the corresponding firmware patch from the above link. The Clara HD is a Mark 7 device, so choose that link.

(It may also be possible to obtain a firmware patch by performing a factory reset, as outlined on MobileRead.com)

After obtaining the relevant zip file, open it to obtain the KoboRoot.tgz file. Extract this tgz file somewhere safe. I'll suppose it's extracted to $KOBOROOT.

Bootstrapping: Obtaining /etc/inittab

/etc/inittab is the main file that we will be patching to introduce our custom code. However, in previous versions of the Kobo firmware, this file was not present, and so needed to be extracted from the device.

Check $KOBOROOT to see if the etc/inittab file is present. If it is, skip to ‘Enabling telnet’. Otherwise, continue with this section.

The $KOBOROOT/etc/init.d/rcS file contains commands that are run every time the Clara HD boots (and is in fact responsible for launching the main Kobo ‘Nickel’ interface), so we will edit this file to add a line:

/usr/local/Kobo/hindenburg &
cp /etc/inittab /mnt/onboard # add this line
LIBC_FATAL_STDERR_=1 /usr/local/Kobo/nickel -platform kobo -skipFontLoad &
[ $PLATFORM != freescale ] && rm -rf /dev/mmcblk1* && udevadm trigger &
insmod /drivers/$PLATFORM/misc/lowmem.ko &

(Warning: Be careful when editing the rcS file. As this is responsible for starting the main interface, an error in this script may brick your device and require you to manually reimage the microSD card.)

This will cause the device to copy the inittab to the internal storage accessible over USB (mounted on the Clara HD at /mnt/onboard).

We can create a custom KoboRoot.tgz file by running in a command prompt, from $KOBOROOT:

tar czf KoboRoot.tgz etc/init.d/rcS

Now connect the Clara HD to the computer, and copy this new KoboRoot.tgz file to the .kobo folder on the Clara HD.

Eject the Clara HD and remove the USB cable, and after a moment, the Clara HD will automatically reboot and show the Updating screen. Kobo is now overwriting the /etc/init.d/rcS file with our custom version.

Updating screen

If all goes well, the Clara HD should reboot into the main interface. Connect the Clara HD to the computer again, and an inittab file should now be visible. Copy this file to $KOBOROOT/etc/inittab.

We should now return to $KOBOROOT/etc/init.d/rcS and remove the line we added earlier.

Example /etc/inittab

If for whatever reason you are unable to source your own copy, this is the /etc/inittab file from my Clara HD. Use at your own risk!

# This is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty -L ttymxc0 115200 vt100
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init

Enabling telnet

Now we are ready to enable telnet. At the end of $KOBOROOT/etc/inittab, add the following two lines:

::sysinit:/bin/sh /opt/afterinit.sh
::respawn:/usr/sbin/inetd -f /opt/inetd.conf

(Warning: At the time of writing, MobileRead.com suggests using respawn for the first line. This is wrong and will cause the script to loop infinitely!)

The first line will cause the Clara HD to execute the /opt/afterinit.sh file after booting. The second line will cause the Clara HD to start the inetd daemon, which we will shortly configure to run telnet.

The /opt directory does not exist by default on the Kobo, so this is a convenient location to store our custom files where they will not be overwritten by firmware updates. (If /etc/inittab is not present in firmware updates, this also means our changes will persist across updates.)

Create the $KOBOROOT/opt directory, then create $KOBOROOT/opt/afterinit.sh with the following contents:

mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

This will enable the use of pseudoterminals, required for telnet.

Now copy $KOBOROOT/etc/inetd.conf to $KOBOROOT/opt/inetd.conf and add the following line:

23 stream tcp nowait root /bin/busybox telnetd -i

This will tell inetd to start the telnet server.

Now generate a new KoboRoot.tgz with these patches by running:

tar czf KoboRoot.tgz etc/init.d/rcS etc/inittab opt

Repeat the earlier process to flash this new KoboRoot.tgz.

Connecting to telnet

If all goes well, once the Clara HD reboots, you should now be able to telnet into the Clara HD. On the Clara HD, select Settings from the menu, then Device information, and note the IP address. For example, 192.168.0.3.

On your computer, connected to the same WiFi network, run e.g.:

telnet 192.168.0.3

Hopefully, you will be granted with something like:

Trying 192.168.0.3...
Connected to 192.168.0.3.
Escape character is '^]'.

(none) login:

Log in as root. No password should be required.

(none) login: root
[root@(none) ~]# uname -a
Linux (none) 4.1.15-00075-gf2498a4 #26 SMP PREEMPT Tue Apr 17 15:45:49 CST 2018 armv7l GNU/Linux
[root@(none) ~]#

Tada!

Securing logins

Running an unsecured telnet server on a device with root access with no password required is a terrible idea, so until we better secure the network, you may like to change the root password. Simply run passwd and set a new password.

Note that (at least on my device), there was a separate admin account with password admin. Because the home directory for this account was invalid, logging in with these credentials also dropped you to a root shell. The password for this account can be changed by running passwd admin and also setting a new password.

What next

Part 4.1: Telnet over USB