Hacks für eine WiFi-SD-Card

Bei einer SD-Karte mit WiFi hat man bisher ungeahnte Möglichkeiten, denn dort gibt es nicht nur Speicher. Bei einer Karte wie der Transcend WiFi-SD arbeitet ein Linux, was nicht nur die Peripherie für eine Funkschnittstelle bedient, sondern auch einige interessante Dienste bereitstellt. Manche von denen aktiviert man erst, wenn man etwas hinter die Kulissen schaut.

Oben genannte Karte bietet nicht nur einen eigenen Hotspot, sondern kann sich interessanterweise auch in ein bestehendes WLAN einwählen. Hat man also die Transcend mittels Android-App dazu grundlegend eingerichtet (WLAN-Zugangsdaten des eigenen Netzwerks), kann man weitere Einstellungen auch über dessen Weboberfläche vornehmen.

Auf der Karte laufen von Hause aus ein
– busybox-Linux
– ein Boa Webserver (als Single Task Webserver)

Ist sie einmal eingerichtet, kann man über

http://[ip der Karte]/cgi-bin/kcard_status.pl

ein Webinterface aufrufen, was quasi die Informationsseite der Karte ist. Zur Konfiguration über dieses Interface wird

http://[ip der Karte]/cgi-bin/tscmd?CMD=xxx

verwendet.

Um wirklich in das System einzugreifen, ist es möglich, eine „autorun.sh“ in das Wurzelverzeichnis des SD-Speichers zu stellen. Nachdem die SD-Karte stromlos gemacht wurde, werden beim nächsten Hochfahren dann die im Skript befindlichen Anweisungen abgearbeitet. So startet man mittels

tcpsvd -E 0 21 ftpd -w /mnt/sd

einen FTP-Dienst mit Schreibzugriff, so dass man nun in der Lage ist, vom Netzwerk aus Dateien auf die SD-Karte zu schieben. Das geht dann zum Beispiel mit einer Datei „test.txt“ in das Zielverzeichnis „temp“ wie folgt in Python:

ftp = ftplib.FTP(‚192.168.178.42‘, ‚admin‘, ‚admin‘)
ftp.cwd(„/temp“)
f = open(„/home/…/test.txt“, „r“)
ftp.storbinary(„STOR test.txt“, f)
f.close()

Die FTP-Zugangsdaten („admin“) sind die gleichen, wie über die Weboberfläche eingestellt. Und die IP-Adresse ist diejenige, mit welcher sich die Karte vorher im eigenen Netzwerk angemeldet hat. Sogar die Installation einer neuen busybox-Version ist möglich. Am einfachsten geht das mit folgenden Einträgen in der „autorun“:

cp /mnt/sd/busybox* /sbin/busybox
chmod a+x /sbin/busybox

Das neue Busybox platziert man vor dem Kopieren in einem Unterverzeichnis auf dem SD-Speicher und setzt noch entsprechende Rechte. Theoretisch kann man so zu einer früheren Version zurückkehren oder aber eben neue Systemfunktionen realisieren oder neue Anwendungen aufspielen. Etwas Vorsicht ist natürlich geboten. Mittels

rcS6

in der „autorun.sh“ erhält man außerdem Telnet. Bleiben wir bei unserer IP „192.168.178.42“ (somit muss ich nicht die nervigen „xxx“ schreiben), so kann man anschließend ganz simpel mittels

# telnet 192.168.178.42

zugreifen. Bekommt man dann eine Ausgabe wie:

Trying 192.168.178.42…
Connected to 192.168.178.42.
Escape character is ‚^]‘.

kann man ein paar nutzvolle Infos aus dem Filesystem ziehen. Wie zum Beispiel:

# cat /etc/version.txt
Product Name : KeyASIC WIFI-SD
Firmware Version : V147
Build Date : 19 FEB 2013
Revision : V147
WiFi Model : Atheros AR6003 11n
Linux Kernel : 2.6.32.28
Busybox : 1.18.5

# cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 421.06
Features : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : KeyASIC Ka2000 EVM
Revision : 0000
Serial : 0000000000000000

# cat /proc/meminfo
MemTotal: 29824 kB
MemFree: 15940 kB
Buffers: 16 kB
Cached: 10388 kB
SwapCached: 0 kB
Active: 3280 kB
Inactive: 7840 kB
Active(anon): 716 kB
Inactive(anon): 0 kB
Active(file): 2564 kB
Inactive(file): 7840 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 740 kB
Mapped: 796 kB
Shmem: 0 kB
Slab: 1224 kB
SReclaimable: 364 kB
SUnreclaim: 860 kB
KernelStack: 272 kB
PageTables: 120 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 29824 kB
Committed_AS: 6568 kB
VmallocTotal: 825344 kB
VmallocUsed: 324 kB
VmallocChunk: 824240 kB

# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00010000 „SPI NOR Flash Partition1“
mtd1: 00300000 00010000 „SPI: kernel“
mtd2: 00300000 00010000 „Ramdisk“

# busybox
BusyBox v1.18.5 (2013-02-25 15:18:08 CST) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.
Usage: busybox [function] [arguments]…
or: busybox –list[-full]
or: function [arguments]…
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
ash, bash, boa, boa_indexer, bootchartd, bunzip2, buzzer, bzcat, cat,
chmod, cmd_server, cp, date, df, dhcprelay, diff, dirname, dmesg, dnsd,
dnsdomainname, dumpleases, echo, egrep, env, fgrep, find, fs_info,
ftpd, ftpget, ftpput, gen_filelist, get_authfile, grep, hostname,
ifconfig, inetd, init, insmod, instant_setupd, instant_upload,
instant_upload_clean, iu_progressd, iwconfig, iwevent, iwlist, iwpriv,
kcard_app, kcard_cmd, kcard_startup, kill, linuxrc, ln, logger,
logread, ls, lsmod, macaddr, mkdir, mount, mv, nslookup, perl, ping,
pkill, ps, pwd, readahead, rm, rmdir, rmmod, route, sh, sleep, sync,
syslogd, tcpsvd, telnetd, thumbNail, thumbnail_video, touch, tscmd,
tslist, udhcpc, udhcpd, udpsvd, umount, unzip, wget,
wifi_connect_router, wifi_download, wifi_filelist, wifi_ftp_server,
wifi_ftp_upload, wifi_get_apconfig, wifi_get_config,
wifi_get_config_real, wifi_quick_send, wifi_set_config, wifi_upload,
xargs

Die Binaries der Karte sind übrigens im Format „ELF 32-bit LSB executable, ARM, version 1 (SYSV)“.

Früher war es überdies noch möglich, die Karte mittels eines Eintrags in der Weboberfläche zu überlisten, indem man mittels

http://192.168.178.42/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd%2FDCIM%2F..%2F..%2F

Zugriff auf die über dem User-Speicher liegenden Systemverzeichnisse erlangt hat (Es wurde die Absicherung der „..“-Pfade vergessen). Dabei erschien dann auch eine „normale“ Linux Filestruktur im Browser mit „bin“, „dev“, „etc“ usw… Das funktioniert in der aktuellen Firmware-Version leider nicht mehr.

Es gibt auch noch ein „wifi_upload“ und „uploadto“ im cgi-bin Verzeichnis. Wie man deren oder sonstige Funktionen ausnutzt, das bleibt dann nicht zuletzt eurer Recherche überlassen. Hier ist bestimmt noch Spielraum für die Community, denn diverse Veröffentlichungen zum Thema sind (noch) nicht so zahlreich.

Der nächste logische Schritt sollte nun sein, eigene Programme für unser SD-Card-Linux zu schreiben und die dafür notwendigen Binaries zu erzeugen. Dazu nutzen wir unter Ubuntu „Cross-Tool“, um eine diverse Toolchain und Config für eine „ARM/ucLibC“-Combo zu erhalten:

# ct-ng arm-unknown-linux-uclibcgnueabi

Nun kann der Build mittels

# ct-ng build

gestartet werden. Ein erstes „Hello World“-Programm bekommt man dann mit:

# ~/x-tools/arm-unknown-linux-uclibcgnueabi/bin/arm-unknown-linux-uclibcgnueabi-gcc -Os -s -DNDEBUG hello.c -o hello.out

Klar, dass die Karte etwas lange zum Booten braucht (etwa 20 Sekunden) und aufgrund der Platzverhältnisse und zusätzlichen Chips auch etwas warm wird. Das sollte man bei eigenen Anwendungen einfach beachten. Ansonsten ist das Ganze das kleinste embedded-System, was ich bisher untersucht habe. Und das wird sicherlich noch einige interessante Einsatzgebiete ergeben.

Derzeit genutzt wird so eine Karte bei uns zur Beschickung eines digitalen Bilderrahmens, welcher durch diverse Bilder auch Infos von den vernetzten Heimgeräten der Hausautomation weitergibt. Das entsprechende Projekt könnt ihr unter https://www.smartewelt.de/sw4/?q=homecontrol-anzeige nachlesen.

Viel Spaß beim Experimentieren!

Swen Hopfe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert