Allereerst een gelukkig 2015! Laatst ben ik maar weer eens even gezellig verder gegaan met het "hacken" van mijn Kobo Mini en dit is zoals je al kan lezen aan de titel een vervolg op deel 2 en vandaag ga ik het hebben over remote toegang tot de Kobo Mini.
In mijn vorige blogpost over het hacken van de Kobo Mini heb een complete backup van mijn microSD kaart gemaakt doormiddel van het Linux / UNIX commando "dd". Maar aangezien er sinds de vorige keer en deze keer wel een paar maanden tussen zit, heb ik voor de zekerheid nog even een extra backup gemaakt van de microSD kaart want in die tijd heb ik mijn Kobo wel gebruikt als eReader. Dus backup maken en gaan met die banaan.
Ik ga als eerst wat vertellen over het software systeem wat er op de Kobo draait. Zoals al te vinden was op het internet draait er Linux op deze eReader. Om precies te zijn is dit Linux 2.6.35.3 met een BusyBox 1.22.0 als userland tools. BusyBox levert overigens wel meer als alleen wat basic userland tools.
Busybox levert ook een System V init systeem, een udev achtig systeem genaamd mdev en een inetd implementatie. Al met al leuk speelgoed om mee te gaan spelen.
Daarnaast zijn er ook nog wat standaard UNIX tools aanwezig zoals wpa_supplicant die de connectiviteit met WiFi netwerken voor zijn rekening nemen.
De Kobo Mini start standaard op in een rcS modus. Dit betekent dat de Kobo altijd(!) opstart in Single-User mode en zal altijd uitvoeren wat er opgegeven word in het shell script wat staat in /etc/init.d/rcS. Dit gedrag staat netjes in /etc/inittab
/etc/inittab
# 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
En dan zal je je afvragen wat word er precies uitgevoerd bij single-user mode. Er word als eerst wat tests gedaan om welke hardware het precies gaat want blijkbaar draaien alle Kobo's ongeveer dezelfde software. Op basis daarvan word bijvoorbeeld een bepaalde firmware image ingeladen voor de WiFi module en andere hardware-specifieke zaken afgehandeld. Vervolgens worden er wat sysfs en tmpfs directories aangemaakt en gemount. Daarnaast is /etc/init.d/rcS ook verantwoordelijk voor het laten zien van het bootlogo. Maar uiteindelijk zal /etc/init.d/rcS dan de nodige applicatie opstarten die het echt een eReader maakt. Dit is een closed-source applicatie genaamd "nickel".
Nickel is niks meer dan 1 gigantisch binary blob die de eReader al zijn functionaliteit geeft. Dit begint bij het laten zien van ePub bestanden t/m de Webkit gebasseerde webbrowser en de sudoku. In tegenstelling tot wat ik vermoede in deel 1 van deze blogserie, draait er geen X.org of een X compatible server op de Kobo. MIsschien dat die toevallig verwerkt zit in de Nickel binary durf ik eigenlijk op dit moment niet zeggen.
Om terug te komen op het onderwerp van remote access. Gelukkig levert BusyBox zelf een aantal tools mee om remote access te regelen. BusyBox levert 2 tools mee bij hun distrubutie namelijk een telnet server (telnetd genaamd) en een FTP server (ftpd genaamd). Maar voor dat we de telnet of FTP server kunnen inschakelen moeten we als eerst maar eens zorgen dat we een inetd server hebben draaien. Dit kunnen doen door de volgende regel toe te voegen aan "/etc/inittab"
/etc/inittab
::respawn:/usr/sbin/inetd -f /etc/inetd.conf
Waardoor het eind resultaat alsvolgt er uit komt te zien.
Daarna gaan we maar eens regelen dat de FTP en de Telnet services opgestart gaan worden door inetd. Dit kunnen we door de volgende regels toe te voegen aan "/etc/inetd.conf"
/etc/inetd.conf
23 stream tcp nowait root /bin/busybox telnetd -i
21 stream tcp nowait root /bin/busybox ftpd -w -S
Dan komt het eind resultaat voor /etc/inetd.conf uit op :
Maar voor dat ftpd en telnetd volledig zullen gaan werken hebben we nog wel wat pseudoterminals nodig. Die pseudoterminals kunnen we aanmaken door een directory genaamd "pts" aan te maken in /dev, daar een devpts mount aan te mounten en dit moet aangemaakt worden tijdens het bootproces want /dev is een directory die elke keer bij boot gevuld word met alle devices en dat doen we door de volgende 2 regels toe te voegen in "/etc/init.d/rcS"
/dev/init.d/rcS
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
Ik doe dit bewust net na dat /dev gemount is zodat ik zeker weet dat telnetd en ftpd de pseudoterminals tot hun beschikking hebben zodra ze opgestart zijn. Daarna kunnen we microSD kaart terug plaatsen in de Kobo Mini, verbinding maken met WiFi met de Kobo Mini en dan kunnen we via telnet gaan inloggen. Standaard is er geen root wachtwoord ingesteld trouwens
YES! We zijn binnen. Mooi, dat is in de pocket. Laten we nu eens kijken of FTP werkt.
Vette shit! Dat werkt ook. Dat vraagt om een victorie dansje!
Maar voor dat we verder gaan dansen, laten we eerst een paar dingen op orde hebben. Voor de veiligheid laten we de root user een andere password geven. Dit doen we door het commando "passwd".
Mooi, de root user heeft nu een password. Nu kunnen we kijken of we een SSH server aan de gang kunnen krijgen.
Helaasch heeft BusyBox geen implementatie van een SSH server inzich, dus zullen we die zelf maar ergens vandaan moeten halen. Nu is dit een embedded device met ook nou niet zo heel veel opslag capaciteit dus OpenSSH is eigenlijk wel te groot en te log voor de Kobo Mini.
De beste kandidaat voor het invullen van deze taak is Dropbear[1]. Dropbear is een heel erg kleine SSH server implementatie(~110 Kb) en werkt op een heel scala aan UNIX'en. Mooi, top, geweldig... Alleen 1 ding.. Shit.. Ik moet hem zelf compileren want er is geen binary beschikbaar voor een ARM processor. Toen was gelijk de eerste vraag "is er een C compiler geïnstalleerd op de Kobo?". Nee, die was er ook niet. Dan zal ik maar gaan cross compilen.
Dan moeten we eerst maar een geschikte toolchain vinden. Ehhh.. Mijn eerste ingeving was de website van CodeSourcery en Linaro te gaan kijken. Ja ehmmm... welke versie moet ik nou precies hebben ? HardFloat, SoftFloat ? GCC 4.2, GCC 4.6.1, GCC 4.9.0 ?!?! Voor dat ik me in meters hoge documentatie ga storten, besloot ik toch maar even te gaan googlen. En toen vond ik het! De heilige graal! Kobo heeft alle GPL code online gezet op GitHub. [2] Great. Zit er toevallig ook nog wat tools bij om te compilen ? Ja! Great. Dan kan ik los!
Zo gezegd zo gedaan. Even een git clone gedaan van alle sources die Kobo heeft vrijgegeven. Toolchain uitgepakt en geïnstalleerd op mijn machine en dan is het compilen geblazen. Uit ervaringen uit het verleden, wist ik dat cross compilen vrij lang kan duren. Dus ik zet het compile proces aan en nog voor dat ik opgestaan ben uit mijn bureaustoel om koffie te gaan zetten is het compilen klaar!
Voor het gemak heb ik mijn binaries beschikbaar gemaakt en je hier downloaden. Deze kan je gewoon uitpakken in / en dan heb je al 70% van al het werk gedaan. Nu nog even Dropbear configureren en dan is het klaar en dan hebben we ook nog eens SSH toegang.
Allereerst moeten we in /etc/ even een directory aangemaken genaamd "dropbear". Dropbear slaat daar namelijk zijn RSA en DDS (aka DSA) keys in op. Vervolgens openen we deze directory en gaan we met "dropbearkey" de 2 nodige keys genereren.
cd /etc/dropbear
dropbearkey -t rsa -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key
Mooi, keys zijn gegeneerd nu. Dan is het alleen nog maar even zorgen dat inetd dropbear opstart.
/etc/inetd.conf
22 stream tcp nowait root /usr/local/sbin/dropbear dropbear -i
Check! Nu kunnen we de machine rebooten (of inetd opnieuw starten) en dan zou dropbear netjes opstarten en kunnen we via SSH remote inloggen op de Kobo.
Echter moeten we nog 1 kleine fix toepassen en dan zijn we klaar! Als we namelijk over telnet inloggen met de root user krijgen we een andere $PATH dan dat als we via SSH inloggen. Dropbear haalt zijn $PATH uit /etc/profile dus die zullen we even moeten aanpassen om te zorgen dat zowel telnet en SSH dezelfde $PATH meekrijgen.
/etc/profile
PATH=$PATH:/sbin:/bin:/usr/sbin:/usr/bin
En klaar is Klara! We hebben nu SSH, FTP en Telnet toegang tot de Kobo. Ik durf echter niet met zekerheid te zeggen of het ook werkt op andere Kobo eReaders. Een bekende van mij heeft de Kobo Aura en na wat Googlen kwamen we er achter dat er in de Kobo Mini en de Kobo Aura dezelfde processor zit alleen de processor in de Kobo Mini is geklokt op 800 Mhz en die in de Kobo Aura is geklokt op 1 Ghz.
Dan nu maar eens Python gaan compileren!
1. https://matt.ucc.asn.au/dropbear/dropbear.html
2. https://github.com/kobolabs/Kobo-Reader