summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pages/hackabike.md352
1 files changed, 352 insertions, 0 deletions
diff --git a/pages/hackabike.md b/pages/hackabike.md
new file mode 100644
index 00000000..47036744
--- /dev/null
+++ b/pages/hackabike.md
@@ -0,0 +1,352 @@
1title: hackabike
2date: 2009-11-02 01:04:00
3updated: 2009-11-02 01:10:40
4author: admin
5tags:
6
7Schon immer mal nachts ohne Transportmöglichkeit in einem fremden Bezirk aufgewacht? "Mal schnell" ein Fahrrad benötigt? In Berlin und anderen Großstädten Deutschlands bietet Die Deutsche Bahn mit dem Call-A-Bike Service Abhilfe.
8
9<!-- TEASER_END -->
10
11**Kurzeinführung in das CallABike System**Als Kunde ruft man die
12CallABike-Zentrale und gibt per DTMF-Wahl die vierstellige Radnummer
13durch. Von der Zentrale erhält man dann den vierstelligen Code, mit dem
14man das CallABike-Fahrad öffnen kann. Zur Sicherheit wird man nach dem
15Anruf von der Zentrale zurückgerufen. Die letzten vier Ziffern des
16Rückrufes enthalten nochmal den Code - annehmen muss man den Anruf
17deswegen nicht.\
18\
19Jetzt läuft die Uhr und der Kunde muss pro Minute 6 Cent bezahlen (mit
20Bahncard nur 4 Cent). Wenn der Kunde das CallABike einfach mal schnell
21abstellen will (z.B. für einen kurzen Einkauf), kann man das CallABike
22abschließen und im Display auf ‘Nicht Abgeben’ tippen. Es ist sozusagen
23kurz geparkt. Danach kann man das CallABike mit dem gleichen Code wie
24beim ersten Mal öffnen. Das kann man so oft wiederholen, wie man möchte.
25Die Zeit, die man bezahlen muss, läuft natürlich weiter.\
26\
27Wenn der Kunde das CallABike dann endgültig abgeben will, muss er beim
28Schließen auf ‘Abgeben’ tippen; das CallABike gibt einem dann den
29Rückgabecode. Mit diesem Code kann man gegenüber der Zentrale
30‘beweisen’, dass man das CallABike wirklich wieder abgeschlossen hat.
31Man ruft jetzt einfach wieder die Zentrale an und gibt den Rückgabecode
32durch. Danach muss man noch die Straßenecke auf Band sprechen, an der
33man das CallABike abgestellt hat. Die Mietzeit wird damit dann auch
34beendet.\
35\
36Es ist auch möglich, zwei Räder mit einem Anruf auszuleihen oder
37abzugeben. Wenn der Kunde in seiner Nähe kein CallABike-Rad findet, kann
38er auch die Zentrale anrufen und fragen, wo das nächste CallABike- Rad
39steht. Ein Servicemitarbeiter der Bahn schaut dann in der Datenbank nach
40und gibt den Standort des nächstgelegenen CallABike-Rads durch.\
41[Offizielle CallABike Webseite](http://www.callabike.de/i_fahrrad.html)\
42\
43..."Es gibt natürlich auch andere Zeitgenossen, die haben, schon aus
44sportiven Gründen, allerlei versucht, um die Standfestigkeit der
45Hardware oder das elektronische Prinzip der eingebauten Mikrochips und
46Prozessoren zu ergründen. Sie rückten dem Schloss mit Schraubenziehern
47und gängigen Imbusschlüsseln zu Leibe. Sie versuchten ihr Glück mit
48Brechstange, Vorschlaghammer, sogar mit der Motorflex. Oder, ganz Smart,
49mit Laptop, mit Dechiffrierprogrammen, auch mit Fangfragen an das
50Wartungspersonal. Doch vergebens! Wieder lächelt Reth, der einst erste
51Ausflüge auf einem grünen Puky-Rad unternahm, sich heutzutage aber als
52“postmoderner Urbaniker”, denn als “Fahrradfreak” versteht. Er lächelt
53und sagt: “Erst diese Technik macht uns zum weltweit einzigen
54stationsunabhängigen Stadtradsystem. Der Code ist nicht zu knacken und
55darauf sind wir richtig stolz.”... Kurzer Auszug eines Interviews mit
56einem Call A Bike Techniker im Magazin Mobil der Deutschen Bahn
57
58## Artikel:
59
60Im November 2003 wurde uns ein CallABike ‘zugetragen’, das nicht richtig
61abgeschlossen wurde. Dieses musste erstmal als Testobjekt herhalten. Die
62meisten dachten, dass in dem Schlosskasten GPS oder sonstiger Funk
63enthalten sei, nach dem öffnen war hiervon jedoch nix zu sehen. Um die
64Schrauben der Schlosskästen zu öffnen, benötigt man nur ein Torx TR
65(Tamper Resistant). In dem Kasten ohne Display ist die Stromversorgung
66durch Batterien sichergestellt (3x 1.5V Mono). Die beiden Kästen sind
67durch eine Art Bügel miteinander verbunden. In diesem Bügel befindet
68sich ein sechspoliges Kabel für den Strom und zwei Spulen. Damit kann
69geprüft werden, ob das Schloss wirklich geschlossen ist, oder einfach
70kein oder nur irgendein anderer Bolzen zum Verschließen genommen wurde.\
71\
72Der Kasten mit dem Display enthält den Exzentermotor zum öffnen des
73Schlosses, zwei Taster (Mikroschalter) und ein kapazitives 5x2-Touchpad.
74Die Hauptlogik sitzt unter dem Display. Sie ist nochmal durch eine
75Metallplatte abgesichert, welche nur die Kabel zum Display/Touchpad
76durchlässt. Damit wird der Motor und der Verschlussmechanismus vor einer
77Attacke durchs Display geschützt.\
78\
79Die gesamte Platine ist mit schwarzem Silikon übergossen, das man
80erstmal runterkratzen muss. Das geht prima mit einer Mess-Spitze. Außer
81einer streichholzschachtelgroßen Platine (Rückseite Datenschleuder 82),
82auf der ein [Atmel
83AT90S8535](http://www.atmel.com/dyn/products/product_card.asp?family_id=607&family_name=AVR+8%2DBit+RISC+&part_id=2000)
84(8-Bit-Risc-Prozessor, 4x8-IO-Pins, 8KB Flash, 512-Bytes-EEProm und
85512-Bytes-RAM) \[1\], ein paar LEDs (rot, grün und IR) und IR-Receiver
86aufgebracht sind, enthält der Kasten noch ein paar andere elektrische
87Bauteile (Motor, Schalter und ein Beeper). Es ist auch ein
88Neigungssensor vorhanden, aber im Code wird er nicht benutzt. Daher
89bestand keine Gefahr, uns zu orten. Es wurden ein paar Bilder von der
90Aktion gemacht, aber dann lag die Technik erstmal zwei Monate einsam in
91einer Kiste, weil wir es nicht geschafft haben, das CallABike zu booten.
92Es dauerte eine Weile, bis wir merkten, dass das System nach dem Booten
93durch ein Infrarot-Signal aktiviert werden muss. Das war mehr oder
94weniger Zufall.\
95\
96Wenn man eine normale Glühlampe benutzt, um besser sehen zu koennen,
97piepte die Elektronik gelegentlich scheinbar unmotiviert. Wie sich
98später herausstellte, reichte der durch die Glühlampe emittierte
99IR-Anteil aus, um den IR-Receiver zu triggern und den Bootvorgang
100fortzusetzen. Beim Booten testet sich das System selbst, und der Empfang
101eines Infrarot Signals gehört eben dazu. Im Zuge fortschreitender
102Professionalisierung™ wurde in der Folgezeit die Glühlampe durch ein
103Infrarot-Photon-Micro-Light ersetzt. Bei unserer weiteren Analyse des
104Systems begannen wir damit, alle Anschlüsse des Atmel durchzumessen, um
105uns einen ungefähren Schaltplan zu erstellen (siehe Bild). Die
106Datenblätter für den Atmel und das verwendete Display haben wir uns aus
107dem Web besorgt.\
108\
109Im Januar hatte einer der Beteiligten dann endlich eine Idee, wie weiter
110vorzugehen sei. Auf der Platine war uns eine unbenutzte 6-polige
111Steckerleiste aufgefallen, und wie sich herausstellte, handelt es sich
112dabei um den ISP-Connector (In System Programming) des Atmel. Daran
113schlossen wir dann ein Atmel-Developer-Board
114[STK500](http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2735)
115an. Zum Auslesen wurde hauptsächlich das freie
116[UISP](http://savannah.nongnu.org/projects/uisp/) (“Uisp is a tool for
117AVR microcontrollers which can interface to many hardware in-system
118programmers”) benutzt. Die auf dem Atmel vorhandenen
119„Intellectual-Property“-Bits waren in einem undefinierten Zustand,
120deswegen konnten wir das Flash des Atmels mit der 8KB großen Firmware
121auslesen.\
122\
123In den nächsten Wochen waren mehrere Hacker damit beschäftigt, den
124ausgelesenen Assemblercode zu verstehen und zu dokumentieren. Dazu
125verwendeten wir AVR-Studio und [Ida
126Pro](http://www.datarescue.com/idabase/). Den Scramble Code (zum
127berechnen der Ausleih- und Abgabecodes) fanden wir relativ schnell, da
128sich dort eine Menge rotate-und-shift-Befehle befanden. Den
129Initialisierungscode erkannten wir wieder, da wir wussten, dass der
130Motor sich beim Einschalten zweimal herumdreht. So konnten wir das
131gelernte immer wieder an unserem Prototyp auf Richtigkeit überprüfen.\
132\
133Die Ausleih- und Abgabecodes werden durch einen Scrambler generiert, der
134mit einem 16Bit-Counter des CallABikes und einem Zustandswert aufgerufen
135wird. Ein gerader Counterwert erzeugt Ausleihcodes und ein ungerader
136erzeugt die Abgabecodes. Der Scrambler nutzt den Counter und das
137Zustandsbyte, um ein Offset auf ein 1024 Bit großes Feld zu errechnen.
138Dieses Feld ist ein für jedes CallABike eindeutiger binärer String, der
139als der (wahrscheinlich) eindeutige Key des CallABikes bezeichnet werden
140könnte. Von diesem Offset aus werden dann 4x4 Bit genutzt, die die vier
141Ziffern für die Ausleih- und Abgabecodes repräsentieren. Die 16 Bit des
142Counters werden aber schlecht genutzt, denn schon nach 1024 Iterationen
143wiederholen sich die Ausleih- und Abgabecodes. Das bedeutet auch, dass
144es nur 512 Ausleihcodes je CallABike gibt, da es nur 512 gerade Offsets
145gibt die auf den Key (1024 Bit) zeigen können. CallABikes, die wir
146geöffnet haben und die wir wegen der Lockbits nicht auslesen konnten,
147haben wir mit einem Script 511 mal resetten lassen (bei einem Reset
148erhöht sich der Counter immer um zwei). Damit haben wir den
149ursprünglichen Zustand wiederhergestellt, und das CallABike war wieder
150‘in sync’ mit der Zentrale.\
151\
152Wer sich das Display mal genauer angeschaut hat, wird festgestellt
153haben, dass der Zeichensatz ein proportionaler ist. Dazu gibt es im Code
154eine Tabelle, in der die Länge des Zeichens und die Position im Flash
155gespeichert sind. Ein ‘i’ und ein ‘!’ belegen nur ein Byte, wogegen z.B.
156ein ‘w’ sieben Bytes belegt. Die großen Logos und das Zahleneingabefeld
157liegen als 400 Byte große Bitmaps vor. Die lange schwarze Linie im
158CallABike-Logo zeigt die Stärke der Spule im Schloss an. Das haben wir
159nur durch das Code-Auditing herausgefunden.\
160\
161Unser erstes Ziel war es, den aus unserem Disassembler erhaltenen
162Sourcecode so anzupassen, dass nach dem Assemblieren mit dem Commandline
163Tool [Avra](http://avra.sourceforge.net/) (“Assembler for the Atmel AVR
164microcontrollers”) ein EXAKT identisches Binary herauskam. Auf der
165Grundlage dieses Referenzcodes konnten wir dann endlich änderungen
166vornehmen.\
167\
168Nachdem wir uns diese Grundlage geschaffen hatten, konnten wir das
169CallABike mit unserem eigenen Code flashen. Da wir keine Vulnerabilities
170oder Backdoors fanden (jedes CallABike hat einen eigenen Key, der im
171EEPROM gespeichert ist), mit denen man ein CallABike exploiten könnte,
172ohne es aufzuschrauben, kamen wir auf die Idee, uns eine eigene Backdoor
173in den Code zu programmieren. Hört sich eigentlich ganz leicht an, ist
174es aber nicht. Erstmal mussten wir den Code der BAHN optimieren, um uns
175den entsprechenden Platz zu schaffen. Schließlich sollte ja auch noch
176ein Logo mit 400 Bytes von uns in das 8KB große Flash. Den Datenmüll,
177den man über unserem HackABike Logo sehen kann, ist der Backdoor Code.
178Das sparte nochmal ca. 150 Bytes. Außerdem wollten wir nicht, dass man
179mit dem Backdoor Code normalen Kunden, die das Rad nur geparkt
180(verschlossen, aber nicht abgegeben) haben, das ausgeliehene HackABike
181wegschnappen konnte. Das erforderte noch ein paar Zeilen mehr im Code.
182Auch kann man mit unserem Backdoor Code das HackABike nicht ‘parken’, da
183ja der öffner nichts bezahlen muss und deswegen nicht motiviert ist,
184sich weiter um das Rad zu kümmern, und es aber auch niemand anders
185aufmachen könnte. Um das HackABike auch auf größere Entfernung noch von
186seinen unbehandelten Verwandten unterscheiden zu können, haben wir ihm
187eine leicht veränderte Blink-Sequenz beigebracht.\
188\
189Im Verlauf der weiteren Analyse des Codes ist uns aufgefallen, dass das
190CallABike im Abgabecode integriert Statusinformationen an die Zentrale
191durchgeben kann. Je nachdem, in welchem technischen Zustand sich das
192CallABike befindet, kann es unterschiedliche Rückgabecodes - abhängig
193vom bereits erwähnten Zustandsbyte - angeben. Das CallABike kann z.B.
194melden, dass die Batterie nicht mehr lange hält, oder der Motor für das
195Schloss nicht mehr in der richtigen Stellung ist. Wenn man z.B. den
196Schließknopf sieben mal ohne eingeführten Bolzen drückt, liefert der
197Scrambler einen entsprechenden Rückgabecode, der gültig ist, diesen
198Zustand aber für die Zentrale erkennbar anzeigt. Von diesen Codes gibt
199es 52 (eine Matrix aus 4x13).\
200\
201Die Backdoor erlaubt, das HackABike mit einem von uns festgelegten
202Ausleihcode einfach zu öffnen. Wenn man das HackABike dann wieder
203abgibt, ist es ganz normal wieder ausleihbar. Es steht auch wieder der
204Ausleihcode des vorherigen Kunden im Display. Die Zentrale merkt von
205diesem eingeschobenen Ausleihvorgang nichts - außer, dass es an einem
206anderem Ort steht, als es in der Datenbank vermerkt ist. Wenn es dann
207aber wieder normal ausgeliehen und abgestellt wird, ist auch in der
208Zentrale alles wieder in Ordnung.\
209\
210Um ein CallABike in ein HackABike zu verwandeln, mussten wir sechs
211Schrauben auf der Innenseite des Schlosskastens mit dem Display öffnen
212und das Kabel des STK500 an den ISP-Anschluss der Platine stecken.
213Danach haben wir ein Script gestartet, dass das Flash und den EEPROM
214Bereich ausliest. Das EEPROM wird danach mit zurückgesetztem Counter und
215dem Flash mit unserer Backdoor wieder zurückgeschrieben. Damit niemand
216unsere Backdoor auslesen kann, haben wir natürlich noch die Lockbits
217gesetzt. Ein geschulter Hacker brauchte ca. 12 Minuten, um zwei
218CallABikes parallel in HackABikes zu verwandeln. Insgesamt wurden knappe
21910% der in Berlin verteilten CallABikes in ein HackABike umgebaut indem
220ihnen eine neue firmware verpasst wurde. Da UISP das Setzen der Lockbits
221nicht korrekt unterstützte, mussten wir das erstmal einbauen. Dazu haben
222wir den Output von AVR-Studio mit einem serial sniffer mitgelesen und
223uns die entsprechenden Kommandos für das STK500 rausgesucht und in UISP
224eingebaut.\
225\
226Abschließend ist festzustellen, dass das technische Design des CallABike
227in unseren Augen sehr gut ist. Jedes CallABike hat vermutlich einen
228eigenen 1024 Bit Key, der benötigt wird, um die Abgabe- und Ausleihcodes
229berechnen zu können. Dazu muss vermutlich das CallABike geöffnet und
230ausgelesen werden. Es wurde nur versäumt, die Lockbits zu setzen, um die
231Firmware vor dem Auslesen zu schützen. Unsere Attacke ist von den
232verbrauchten Mannstunden wohl mehr Wert als ein paar Dutzend CallABikes.
233
234 EEPROM Content:
235
236 0x0000 - 0x0001 unused
237 0x0002 lock_sensor_calibration
238 0x0003 - 0x0019 unused
239 0x001A - 0x001B 16bit counter (scrambler)
240 0x001C unused
241 0x001D - 0x001F CallABike Number
242 0x0020 - 0x009F 128 Byte Random (Key)
243 0x00A0 - 0x00A2 first three bytes of key again
244 0x00A3 - 0x00AF unused
245 0x00B0 - 0x01FF textmessages for display
246
247
248 bikecounter: 0x015E
249 EEPROM belongs to bike 3856
250
251 Counter 0x0162: 3042 9843 5360 <-- rentcode
252
253 -00- -01- -02- -03- -04- -05- -06- -07- -08- -09- -10- -11- -12- -13-
254 00: 8584 7572 6970 4597 9119 4285 2144 0277 3197 0072 5545 6487 6341 9664
255 01: 5244 2345 5463 6065 9493 2971 9352 5402 5519 4579 8355 9533 9245 4926
256 10: 6615 7508 8159 7355 8125 3632 2920 4348 0484 7784 0084 6154 8905 6742
257 11: 6234 7953 4741 7386 8181 2930 6280 8658 6805 5432 4092 7161 2070 8554
258
259 Counter 0x0164: 7240 7043 9766 <-- rentcode
260
261 -00- -01- -02- -03- -04- -05- -06- -07- -08- -09- -10- -11- -12- -13-
262 00: 1542 5463 4821 7206 8181 5293 5100 8370 7662 7831 6561 1071 9350 7554
263 01: 8480 7640 5094 4420 7470 5025 6472 0596 9260 5499 4274 0341 7092 7363
264 10: 6369 3545 6991 9042 0121 7702 7931 5600 6755 8264 9063 9596 6918 8761
265 11: 4254 0960 8294 7529 9793 4954 5455 9345 0183 3995 4992 5949 4392 9538
266
267 Here you see the open and close pins of the bike 3856 with
268 the counter at 0x0162
269 At first the Customer gets the open pin 3042. When the customer
270 closes the lock and everything is ok he gets the return code 8584.
271 When for example the battery (-01-) is exhausted he gets the return code
272 7572.
273
274
275 The following commands are possible via infrared:
276 0x5B read bikenumber
277 0xCE calibrate coil
278 0xC5 read RAM from 0x00AD
279
280 after transmit of the first 32 bytes of the key
281 0xCA enable watchdog (reboot)
282 0xC8 write and read the key of the EEPROM
283 0xCD write and read other parts of the EEPROM
284
285
286 //Code zum Generieren der Abgabe/Ausleihcodes bei gegebenem Key aus dem eeprom
287
288 unsigned char g_key[4];
289
290 void scrambler(uchar param, long counter)
291 {
292 long bitoffset;
293 uchar r21 = param, r28 = 1;
294 short r27_26 = counter, short r31_30;
295 r28 <<= r27_26 & 7;
296 r27_26 += r21;
297 r27_26 &= 0x3ff;
298 r31_30 = r27_26;
299 r27_26 <<= 5;
300 r27_26 -= r31_30;
301 r27_26 &= 0x3ff;
302 r27_26 += r28;
303 r27_26 &= 0x3ff;
304 bitoffset = r27_26 & 7;
305 r27_26 >>= 3;
306 r27_26 += 0x20;
307 r27_26 &= 0xff;
308 fillkey(r27_26,bitoffset);
309 }
310
311 void fillkey(long address, long bitoffset)
312 {
313 uchar r16;
314 long fullkey;
315 fullkey = eeprom[address++] << 16;
316 fullkey += eeprom[address++] << 8;
317 fullkey += eeprom[address++];
318 fullkey >>= bitoffset;
319 r16 = fullkey & 0xf;
320 if(r16 >= 10) r16 -= 10;
321 g_key[3] = r16;
322 r16 = (fullkey >> 4 ) & 0xf;
323 if(r16 >= 10) r16 -= 6;
324 g_key[2] = r16;
325 r16 = (fullkey >> 8 ) & 0xf;
326 if(r16 >= 10) r16 -= 10;
327 g_key[1] = r16;
328 r16 = (fullkey >> 12) & 0xf;
329 if(r16 >= 10) r16 -= 6;
330 g_key[0] = r16;
331 }
332
333 //Fürs CallABike mit der Nummer 2883 z.B.:
334 unsigned char eeprom[ ] =
335 {
336 0x5A,0xD5,0xAD,0x6B,0xFD,0xD7,0x34,0x78,
337 0xB3,0x03,0x22,0x13,0x61,0x23,0xAD,0xFE,
338 0x51,0x6E,0xAA,0xA2,0xD4,0xB7,0xBA,0xC0,
339 0x78,0x9A,0x84,0x55,0x2A,0xB9,0x6E,0xBC,
340 0x33,0x15,0x2C,0x97,0x33,0x98,0x4B,0x78,
341 0x43,0xE5,0x20,0xD5,0x1C,0x1C,0x75,0x12,
342 0x2A,0x91,0x17,0xFC,0x0C,0x61,0x31,0x31,
343 0x50,0x6D,0xFD,0x5C,0xC5,0x60,0x8D,0xE0,
344 0x0A,0xF2,0x85,0xF1,0x3B,0xA3,0xBD,0x74,
345 0xF3,0xD4,0x9E,0xBB,0x45,0x95,0x69,0x24,
346 0x79,0x36,0x9A,0xA6,0x66,0x96,0xFB,0xE8,
347 0x5D,0x38,0x34,0x28,0xC0,0x51,0x3B,0x18,
348 0x46,0xCA,0xD9,0xE3,0xD7,0xC8,0x86,0x01,
349 0x11,0x60,0xF2,0xF0,0xA4,0xA4,0xEF,0x16,
350 0x3E,0xBE,0xB9,0x1F,0xA8,0xF9,0x61,0x0B,
351 0xD6,0x7F,0x75,0xE7,0xF4,0x31,0x3F,0x6B
352 };