<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog of eddy14 &#187; Computersicherheit</title>
	<atom:link href="http://41yd.de/blog/category/computersicherheit/feed/" rel="self" type="application/rss+xml" />
	<link>http://41yd.de/blog</link>
	<description>&#34;I am the master of this computer, for me the gates will open&#34; -c0mrade</description>
	<lastBuildDate>Mon, 02 Aug 2010 00:43:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Löcher im Sieb</title>
		<link>http://41yd.de/blog/2010/07/15/loecher-im-sieb/</link>
		<comments>http://41yd.de/blog/2010/07/15/loecher-im-sieb/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 22:51:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=474</guid>
		<description><![CDATA[Lange ist es her, dass ich mich mit PHP Scripten beschäftigt habe. Aber gestern hatte ich Grund dazu.
Wenn ich nicht gerade dabei bin für die Prüfungen zu lernen, oder mich mit logischen Fehlschlüssen beschäftige, bin ich seit gestern zusätzlich am Reversen von Zend Optimizer. Ich will wissen, wie der Schutz (unter anderem die Verschlüsselung) funktioniert. [...]]]></description>
			<content:encoded><![CDATA[<p>Lange ist es her, dass ich mich mit PHP Scripten beschäftigt habe. Aber gestern hatte ich Grund dazu.</p>
<p>Wenn ich nicht gerade dabei bin für die Prüfungen zu lernen, oder mich mit <a title="http://www.logicalfallacies.info/" href="http://www.logicalfallacies.info/" target="_blank">logischen Fehlschlüssen</a> beschäftige, bin ich seit gestern zusätzlich am Reversen von <a title="http://www.zend.com/de/products/guard/" href="http://www.zend.com/de/products/guard/" target="_blank">Zend Optimizer</a>. Ich will wissen, wie der Schutz (unter anderem die Verschlüsselung) funktioniert. (Anmerkung: Der Schutz von Zend Guard bewirkt, dass man die PHP Dateien nicht mehr einfach einsehen kann, da diese durch ein unbekanntes Verfahren geschützt, verschlüsselt und komprimiert sind. Der Zend Optimizer kann diese verkrüppelten Dateien ausführen). Zum Analysieren der Software brauchte ich eine Beispieldatei, welches mit Zend Guard geschützt ist. Ich nahm <a title="http://www.schulfilterplus.de/" href="http://www.schulfilterplus.de/" target="_blank">Schulfilter Plus</a>. Obwohl ich eigentlich den Zend Optimizer selbst analysieren wollte, und nicht die Beispiel Datei, zog etwas merkwürdiges meine Aufmerksamkeit auf sich. Wenn ich Schulfilter Plus im Browser ausführte, erreichte mich eine Fehlermeldung:</p>
<blockquote><p>Call to <em>undefined</em> function: <em>mcrypt_get_iv_size</em>()</p>
</blockquote>
<p>Anscheinend hatte dieses Stück Software eine Anwendung für <a title="http://www.php.net/manual/de/intro.mcrypt.php" href="http://www.php.net/manual/de/intro.mcrypt.php" target="_blank">Verschlüsselung</a> gefunden. Ist das nicht toll? Diese, eigentlich ungewollte, Entdeckung bescherte mir ein paar Stunden Spaß. Dem wäre nicht so, wenn die PHP Datei lesbaren Code beinhaltet hätte; da wäre alles sofort ersichtlich. Der Zend Guard machte es spannend!</p>
<p>Die Fehlermeldung tauchte nur auf, weil ich mcrypt nicht installiert hatte. (Normalerweise installiert man Schulfilter Plus mit einer .iso Datei, welches Apache, PHP, libmcrypt und alles drum und dran mitinstalliert. Die Installation ist in der VM immer abgestürzt, deswegen habe ich die PHP Dateien in eine bestehende Apache Installation kopiert. Und da hat nunmal mcrypt gefehlt! Welch ein Glück.)</p>
<p>Mcrypt ist einigen PHP Entwicklern bekannt: es bietet uns einfache Schnittstellen um gängige Verschlüsselungsalgorithmen (u.a. DES, AES, Blowfish,&#8230;) anzuwenden. Normalerweise hätte ich mir gedacht: Wow, da legt jemand sehr großen Wert auf Datensicherheit! Und ich hätte mich gefreut. Aber kurz zuvor hatte mir Lemming von einem sehr peinlichen Bug in der Schulfilter Plus Software erzählt, sodass ich nun bereit war alles mögliche von den Entwicklern zu erwarten. Wofür wurde hier die Verschlüsselung verwendet? Um die tatsächliche Wirkung zu entfalten, nämlich Daten sicher aufzubewahren, oder doch nur, um gewisse Daten und Vorgehensweisen zu verbergen/verschleiern?</p>
<p>Und da ich dieses Posting verfasse, könnt ihr euch denken, dass es letzteres war. Ich habe mir kurz nach diesen Gedanken mcrypt installiert. Für Windows ist es eine einfache DLL Datei. Diese exportiert alle benötigten Funktionen, damit der PHP Interpreter sie nutzen kann.</p>
<p>Nun könnte ich theoretisch folgendes machen: Da libmcrypt selbst open-source ist, könnte ich mir den Code besorgen, vor jeden Aufruf einer Funktion ein printf machen, neu compilen, und mir ausgeben lassen welche Funktion mit welchen Argumenten aufgerufen wird. Nun lass ich die Schulfilter Software laufen; so hätte ich eine nette Ausgabe, und wüsste, welcher Key verwendet wird, welcher Algorithmus etc. (das gleiche kann ich theoretisch auch mit dem PHP-Interpreter machen, um Zend Guard zu umgehen, dazu aber irgendwann in einem späteren Posting mehr).</p>
<p>Aber ich wollte es mir nicht so einfach machen. Ich hatte Lust auf Assembler. Also blieb ich weiterhin in meinem Debugger OllyDbg.</p>
<p>Ich lud mir php-cgi.exe in den Debugger, und führte es aus, bis alle wichtigen Bibliotheken geladen waren. Nun wechselte ich die Ansicht auf mcrypt, und ließ mir die angebotenen Funktionen ausgeben:</p>
<p><a href="http://41yd.de/blog/wp-content/libmcrypt-view.png"><img class="aligncenter size-medium wp-image-475" title="libmcrypt-view" src="http://41yd.de/blog/wp-content/libmcrypt-view-300x129.png" alt="" width="300" height="129" /></a>Wie man sieht, habe ich schnell ein paar Breakpoints gesetzt. Das wichtigste hier ist mcrypt_enc_get_iv_size. Dort müsste ich ja anhalten wenn ich die Software ausführe (denn aus der Fehlermeldung kann ich darauf schließen, dass diese Funktion aufgerufen wird).</p>
<p>Allerdings gibt es noch andere sehr schöne Funktionsnamen wie z.b. mcrypt_set_key. Diese Funktion wird sehr wahrscheinlich aufgerufen, wenn das Passwort für Ver-/Entschlüsselung gesetzt werden soll. Wenn ich nur einmal auf dieser Funktion breake, müsste ich die Möglichkeit haben die Parameter einzusehen. Dann bräuchte ich nur noch den Namen des Algorithmus um die Verschlüsselung nachzubauen.</p>
<p>Ich trace ein bisschen im Code rum; da ich Zend Optimizer noch nicht genug analysiert habe, ist das alles schwer nachzuvollziehen. Aber irgendwann sehe ich dann folgendes im Stack:</p>
<blockquote><p>0012F834   01858FA0  ASCII &#8220;rijndael-128&#8243;<br />
0012F838   00000000<br />
0012F83C   0182A228  ASCII &#8220;ecb&#8221;</p>
</blockquote>
<p>Na das sieht doch sehr nach <a title="http://de.wikipedia.org/wiki/Advanced_Encryption_Standard" href="http://de.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank">Rijndael</a> aus, im ECB modus. Also gehe ich zurück zu den exportierten Funktionen, und setze überall breakpoints, die was mit Rijndael zu tun haben:</p>
<p><a href="http://41yd.de/blog/wp-content/rijndael.png"><img class="aligncenter size-full wp-image-477" title="rijndael" src="http://41yd.de/blog/wp-content/rijndael.png" alt="" width="482" height="100" /></a>Nun sollte ich immer benachrichtigt werden, wenn die Software etwas mit diesen Funktionen anstellt. Und das tut sie wirklich: &#8220;Breakpoint at libmcryp.rijndael_128_LTX__mcrypt_set_key&#8221;. Irgendwo müssen die Parameter für diese Funktion rumliegen, und ich bin optimistisch dass es der Key sein wird! Tada:</p>
<p style="text-align: center;"><a title="http://41yd.de/blog/wp-content/rijndael-key.PNG" href="http://41yd.de/blog/wp-content/rijndael-key.PNG" target="_blank"><img class="aligncenter" title="Key für die Verschlüsselung" src="http://41yd.de/blog/wp-content/rijndael-key.PNG" alt="" width="300" height="129" /></a></p>
<p><a href="http://41yd.de/blog/wp-content/key1.png"><img class="aligncenter size-full wp-image-479" title="key" src="http://41yd.de/blog/wp-content/key1.png" alt="" width="448" height="32" /></a>Ausgeschrieben: &#8220;<strong>fhslJefRe12jadf45HSDd54kad4fk2dA</strong>&#8220;. Das ist der Schlüssel für die Verschlüsselung. Es gilt noch herauszufinden, ob es immer der selbe ist (davon kann man sich überzeugen indem man die Daten von verschiedenen Ausführungen, und Installationen von Schulfilter Plus in den Debugger schmeisst). Um es vorweg zu nehmen: ja, es ist immer der selbe Schlüssel.</p>
<p>Irgendwann komme ich in die decrypt Prozedur, und sehe, wie Daten entschlüsselt werden. Live! Das ist ein sehr schöner Augenblick &lt;3</p>
<p>Ich weiß also nun, dass Rijndael-128 verwendet wird, mit dem oben genannten Schlüssel. Nun muss ich gucken, für welche verschlüsselten Daten es überhaupt gebraucht wird. Ich suche in der Ordnerstruktur der Software nach irgendwelchen Dateien die verschlüsselt aussehen. Und tatsächlich: Im Unterordner &#8220;xml&#8221; befindet sich eine Datei mit dem Namen &#8220;systemusers.xml&#8221;. Der Name ist vielversprechend.</p>
<p>Haben die Entwickler etwa alle User-Daten in dieser Datei gespeichert? Das wäre sehr gefährlich, denn die XML Dateien sind für jedermann zugänglich! (Wieso zum Teufel programmiert irgendjemand so etwas? Ich könnte ausrasten). Nur die (wie wir noch sehen werden: unsichere) Anwendung von Verschlüsselung hält uns davon ab, die Daten einzusehen.</p>
<p>Ich schreibe eine kleines Python Script, welches das Verschlüsselungsverfahren anwendet, um die Daten zu entschlüsseln: Und tatsächlich, ich sehe am Ende die XML Datei. Erschreckender Fund darin:</p>
<blockquote><p><span style="font-size: small;"> &lt;user xml:id=&#8221;user1&#8243; role=&#8221;role1&#8243; added_by=&#8221;cockpit&#8221;&gt;<br />
&lt;name&gt;tfkadmin&lt;/name&gt;<br />
&lt;password&gt;263aa25bd34cc2fbe24b70ba46e41fe0&lt;/password&gt;<br />
&lt;dn/&gt;<br />
&lt;/user&gt;</span></p>
</blockquote>
<p>Es sind die Login Daten für den Administrator. Das Passwort ist einfaches MD5. Und sowas kann jeder von jedem Server runterladen, welches diese Software einsetzt? Mir ist es schleierhaft, wieso die Entwickler sowas tun. Entweder sie wissen es nicht besser, oder sie halten sich einen eigenen Zugang offen (böse Vorwürfe meinerseits!). Vieles in der Software ist auf diese Weise (mit dem gleichen festen Schlüssel) verschlüsselt. Auch die Backup-Datei (Nebenbei angemerkt: Die Backup-Datei ist eigentlich nur eine PHP Datei, mit verschlüsselten Strings. Sehr schlampig&#8230;). Die ganze Sicherheit geht zugrunde, wenn jemand diesen privaten Schlüssel der Entwickler hat (der Schlüssel wird jedem Kunden in der Software mitgeliefert!). Die gehen echt ein großes Risiko ein. Das sind echte Kerle mit Eiern in der Hose, sage ich euch!</p>
<p>Ich hoffe es wird so langsam jedem klar, dass eine Tarnung (wie durch den Zend Guard) nicht sehr viel bringt, wenn man vor dem Erforscher des Systems etwas verheimlichen will. Ich gehe sogar soweit zu behaupten, dass die unsichere Programmierarbeit bekannt war; ich denke, dass mit dieser Verschleierung versucht wurde, sich einen eigenen Zugang offen zu halten. Ich denke nicht, dass die Leute versucht haben ihr geistiges Eigentum zu schützen. Jeder der den Code einsehen könnte, würde es strikt ablehnen, so ein Scheunentor auf seinem Server zu installieren. Wieviele gravierende Bugs und Geheimnisse findet man erst, wenn man die Scripte einsehen könnte?</p>
<p>In der oben genannten systemusers.xml ist ein weiterer User aufgelistet. Der Benutzername ist &#8220;tfksupport&#8221; und das Passwort ist anscheinend nur den Entwicklern bekannt. Dieser User ist auch auf invisible gesetzt, sodass man ihn (sogar als Administrator) nicht verwalten kann. Auch wenn dieser User in dem Handbuch Erwähnung findet, und es tatsächlich für den Support zu sein scheint, macht das einen stutzig. Man will doch trotzdem die volle Kontrolle über die Maschine haben!</p>
<p>Der Vorteil eines PHP Codes ist es ja, dass es auf einem (entfernten) Server läuft. So lange man also den Server nicht hacked (durch eine Sicherheitslücke etc.), hätte man theoretisch keine Möglichkeit, irgendwelche Daten zu kopieren, manipulieren etc. Aber die Entwickler haben sich echt komisch angestellt; sie stellen die Daten frei zugänglich ins Netz, und versuchen den Inhalt zu verschleiern, anstatt einfach den Zugriff zu den Daten zu verweigern. (Siehe: <a title="http://de.wikipedia.org/wiki/Security_through_obscurity" href="http://de.wikipedia.org/wiki/Security_through_obscurity" target="_blank">Security through Obscurity</a>)</p>
<blockquote><p>(20:36:48) eddy14: das ist echt so lächerlich von denen, sowas verstecken zu wollen<br />
(20:37:07) lemming: evtl arbeiten die mit <a title="http://41yd.de/blog/2010/04/18/otrkey-breaker/" href="http://41yd.de/blog/2010/04/18/otrkey-breaker/" target="_blank">otr</a> zusammen ^^<br />
(20:37:12) eddy14: haha</p>
</blockquote>
<p>Wie gefährlich so eine Burka für Software ist, sieht man an <a title="http://tfk-foundation.de/jugendschutz/index.php?action=musterlandbayern" href="http://tfk-foundation.de/jugendschutz/index.php?action=musterlandbayern" target="_blank">dieser Äußerung</a>: &#8220;Nachdem in Bayern bereits <strong>1500 von 5500 Schulen</strong> mit dem Jugendschutzpaket der TIME for kids Foundation einen wirksamen Schulfilter einsetzen, soll nun Bayern zum Musterland für Kinder- und Jugendschutz im Internet werden.&#8221;. Schützt die Kinder, aber bitte richtig!</p>
<p>Anfangs wollte ich die Entwickler über diesen Missstand informieren, bevor ich diesen Beitrag veröffentliche. Aber ich denke, diese Leute haben sehr fahrlässig gehandelt. Sehr viele Schulen verwenden diese Software. <em>With great power comes great responsibility</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2010/07/15/loecher-im-sieb/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>OTRKEY-Breaker</title>
		<link>http://41yd.de/blog/2010/04/18/otrkey-breaker/</link>
		<comments>http://41yd.de/blog/2010/04/18/otrkey-breaker/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 01:18:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=394</guid>
		<description><![CDATA[eddy14@toFoo:~/workspace/coding/OTRKEY-Breaker$ ./otrkey-breaker ../Der_Wilde_von_Montana_10.04.08_01-15_ard_80_TVOON_DE.mpg.avi.otrkey eddyX@hotmail.de xxxx
OTRKEY-Breaker by eddy14 (v0.3)
Opening OTRKEY-File &#8230; OK
Reading magic header &#8230; OK
Decrypting OTRKEY-Header &#8230; OK
Generating bigKey &#8230; OK
Building encrypted HTTP-Link &#8230; OK
Getting key from server &#8230; OK
Decrypting response &#8230; OK
Final Step: Decrypting OTRKEY-File &#8230;
100%
Finished. Enjoy your decrypted file!
Wuhuu! Ich saß nun seit einigen Wochen (in der letzten Woche ziemlich intensiv) an diesem [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>eddy14@toFoo:~/workspace/coding/OTRKEY-Breaker$ ./otrkey-breaker ../Der_Wilde_von_Montana_10.04.08_01-15_ard_80_TVOON_DE.mpg.avi.otrkey eddyX@hotmail.de xxxx<br />
OTRKEY-Breaker by eddy14 (v0.3)<br />
Opening OTRKEY-File &#8230; OK<br />
Reading magic header &#8230; OK<br />
Decrypting OTRKEY-Header &#8230; OK<br />
Generating bigKey &#8230; OK<br />
Building encrypted HTTP-Link &#8230; OK<br />
Getting key from server &#8230; OK<br />
Decrypting response &#8230; OK<br />
Final Step: Decrypting OTRKEY-File &#8230;<br />
100%<br />
Finished. Enjoy your decrypted file!</p></blockquote>
<p>Wuhuu! Ich saß nun seit einigen Wochen (in der letzten Woche ziemlich intensiv) an diesem Dateiformat. Es nennt sich OTRKEY und wird für die (bekannte) Webseite <a title="http://www.onlinetvrecorder.com/" href="http://anonym.to/?http://www.onlinetvrecorder.com/" target="_blank">www.onlinetvrecorder.com</a> verwendet (es handelt sich <strong>nicht</strong> um <a title="http://www.cypherpunks.ca/otr/" href="http://www.cypherpunks.ca/otr/" target="_blank">Off-the-Record Messaging</a>). Die Programmierung des Dekoders war nicht einfach fuer mich, da ich gewoehnlich nicht in C++ programmiere. Das Dateiformat ist nicht ganz so trivial, allerdings auch nicht äußerst kompliziert. Aber es hat Spaß gemacht und mich mit Freude erfüllt.</p>
<p>Die obige Ausgabe ist die meines OTRKEY-Breakers. Dieser kann OTRKEY-Dateien entschlüsseln. Aber anders als der Name vermuten lässt, bricht dieser rein garnichts, sondern tut genau das selbe was die restlichen (proprietären) OTRKEY-Dekoder auch tun. Ich habe mich dazu entschlossen, den Decrypter <strong>nicht</strong> destruktiv zu programmieren. Ich würde damit wohl Piraterie unterstützen, und ich habe keine Lust auf rechtlichen Ärger. Dataillierte Erklärung darüber, wie man die Sicherheitsbarriere umgehen könnte, um alle OTRKEY-Dateien zu entschlüsseln, ohne die Berechtigung dazu zu haben, folgt weiter unten. Soweit ich weiß, wird in nächster Zeit sowieso ein offizieller open source Dekoder von onlinetvrecorder folgen. Ich weiß allerdings nicht ganz so recht, wie sie auf diese Art ihre Pseudosicherheit noch aufrecht erhalten wollen. Anscheinend gab es schon damals im Jahre 2005 inoffizielle Dekoder, und vermutlich sogar Opensource Programme von <a href="http://anonym.to/?http://www.hboeck.de/archives/296-Reverse-engineering-onlinetvrecorder.html" target="_blank">anderen</a>, die es <a title="http://www.otrforum.com/showthread.php/20057-Decodierungsverfahren-ver%F6ffentlichen" href="http://anonym.to/?http://www.otrforum.com/showthread.php/20057-Decodierungsverfahren-ver%F6ffentlichen" target="_blank">reversed zu haben scheinen</a>. Ich weiß nicht inwieweit sich das System seitdem verändert hat. Ich will nochmal ausdrücklich <strong>betonen</strong>, dass ich hiermit niemandem schaden möchte. Genau deswegen beinhaltet mein Dekoder auch keine böswillige Funktionalität.</p>
<p>Also. Was sind eigentlich OTRKEY Dateien? Das sind verschlüsselte Video-Dateien. Der onlinetvrecorder Dienst bietet seinen Nutzern an, die im TV laufenden Programme aufnehmen zu lassen. Allerdings ist es aufgrund der Urheberrechte nicht möglich, einfach die Sendungen auf der Webseite anzubieten, sodass sie jeder runterladen könnte. Vielmehr wird ein bestimmtes Gesetz ausgenutzt. Demnach dürfen Privataufnahmen angefertigt werden, und man darf sich Sendungen von jemandem <strong>aufnehmen lassen</strong>. Das alles beruht darauf, dass der Benutzer dem Service bescheid geben muss, dass er die Sendung haben will. Demnach hat er ihn also gebeten, eine Kopie anzufertigen, was nun legal ist (mehr oder weniger; darüber wird anscheinend noch gestritten). Nun werden also die Videos verschlüsselt. Und nur authorisierte Nutzer (die, welche diese Aufnahme in Auftrag gegeben haben) können es entschlüsseln.</p>
<p>Nun folgt wieder eine technische Beschreibung darüber, wie ich vorgegangen bin, um die Spezifikation dieses Dateiformates offen zulegen. Wer das nicht mag, kann nach ganz unten scrollen, um meinen Open Source Klon des Dekoders herunterzuladen. Ich hoffe, nach einigen Verbesserungen können die OpenSource Tools dort draußen, die sonst die proprietären Linux Binarys des offiziellen Dekoders verwendet haben, auf meinen zurückgreiffen.</p>
<p>Als ich mir vorerst nur Gedanken über das Dateiformat machte, hatte ich im Kopf nur soetwas:</p>
<p><a href="http://41yd.de/blog/wp-content/magie.png"><img class="aligncenter size-full wp-image-407" title="magie" src="http://41yd.de/blog/wp-content/magie.png" alt="" width="276" height="301" /></a></p>
<p>Aber das ist nicht wirklich hilfreich. Diese Magie musste ich also nun mit Wissen ersetzen. Also ran an die Arbeit! Ich mache mir Gedanken, wie solch ein System ablaufen könnte. Da fallen mir zwei Möglichkeiten ein. Die erste setzt auf <a title="http://de.wikipedia.org/wiki/Security_through_obscurity" href="http://de.wikipedia.org/wiki/Security_through_obscurity" target="_blank">Security-by-Obscurity</a>. Die zweite ist tatsächlich sicher (und tut nicht nur so!).</p>
<p>Also, wir haben zunächst einen Server. Der gehört dem onlinetvrecorder Dienst. Dieser wird dazu verwendet, um zu schauen, ob unser Benutzeraccount authorisiert ist. Das läuft alles auf dem Server ab. Also solange wir nicht den Server hacken (was wir nicht vor haben) ist das Verfahren absolut sicher. Nun haben wir also diese verschlüsselte Datei auf unserer Festplatte. Die Datei kann man auf vielen Mirror-Seiten kostenlos (und legal) herunterladen. Denn mit dem verschlüsselten Müll kann man nichts anfangen. Erst wenn es entschlüsselt wurde.</p>
<p>Das Problem ist nun, dass die Videodatei bei jedem Benutzer den gleichen Inhalt hat. Ergo: Es gibt <strong>ein</strong> Passwort zum entschlüsseln für diese Datei, egal welcher Benutzer es entschlüsseln will. Und genau dieses Passwort wird uns vom Server übermittelt. Jeder Benutzer der diese Datei entschlüsseln will, bekommt also das selbe Passwort! Es müsste nun jemand das Passwort herausfinden, und könnte es frei ins Internet stellen, und jeder könnte die verschlüsselte Datei entschlüsseln, ohne authorisiert zu sein (denn dann braucht man den Server ja nicht mehr, um das Passwort abzuholen; wir haben ihn ja bereits!).</p>
<p>Ich würde also bis zu dem Punkt, wo wir das Passwort vom Server bekommen, exakt das gleiche machen wie der normale Dekoder. Aber nachdem ich das Passwort habe, würde ich es meinem eigenen Server zusenden, und dieser speichert es in einer Datenbank. Nun kann jeder Benutzer das Passwort von meinem Server abfragen (der natürlich keinerlei Authentifizierung durchführen würde) und wirklich jeder könnte die Videodatei entschlüsseln. Ergo: gebrochen! Und genau das ist bei OTRKEY möglich. Der einzige Nachteil wäre, dass mindestens eine Person die Berechtigung haben müsste, diese Datei zu entschlüsseln. Und alte Aufnahmen (und sehr alte OTRKEY Dateien) wird wohl niemand mehr entschlüsseln, d.h. es wird auch weiterhin nicht möglich sein.</p>
<p>Wie könnte man dieses Sicherheitsloch beseitigen? Indem man für jeden User die Datei individuell verschlüsselt. Im Prinzip &#8220;On-the-Run&#8221; während er die Videodatei herunterlädt. Das würde aber heißen, dass entweder jedem Mirrordienst die unentschlüsselten Videodateien zugespielt werden müssten (die es wiederum verschlüsselt dem Benutzer geben), was sicherlich ein großes Sicherheitsrisiko darstellt. Oder aber, nur die offiziellen Server werden betrieben (Nachteil: sehr großer Traffic auf dem Server; kostet nicht gerade wenig). Oder aber, man verschlüsselt erst garnicht (wieso auch?) und lässt alle Benutzer vom offiziellen Server runterladen (der auch die Authentifizierung durchführen kann). Ich glaube, letzteres wird sogar in der Form angeboten. Es ist eventuell auch möglich, den Mirrorbetreibern eine Art Authentifizierungsmöglichkeit anzubieten, womit diese den User als &#8220;zulässig&#8221; identifizieren können, um ihm dann die unentschlüsselte Datei anzubieten. Was mir so spontan einfällt, wäre die Generierung eines einzigartigen Schlüssels, für jede Aufnahme eines Users. Der Mirrorbetreiber fragt nun vor dem Download diesen Schlüssel ab, und teilt den Schlüssel dem offiziellen OTRKEY-Server mit, welcher dann sein &#8220;OKAY&#8221;-Signal zurück sendet. So weiß der Mirrordienst, dass der User die Datei runterladen darf. Oder aber, man könnte ein spezielles Userpasswort generieren, der nur für Mirroranbieter benutzt wird, welche dann mit diesen Daten den User authentifizieren können, um den Download anbieten zu können.</p>
<p>Die Frage wäre am Ende wieder die der Legalität. Alles was ich sagen kann ist: das jetzige System bietet keinerlei Sicherheit, außer der Verheimlichung gegenüber dem User, was auf seinem Rechner gerade passiert. Das ist im prinzip so, als würde man eine sehr sichere Tür bauen (= Verschlüsselungsalgorithmus) dann aber den Schlüssel unter die Blumenvase vor der Tür tun (= Security by Obscurity). Oder: man verschenkt an jede Person ein Buch, in der Hoffnung dass alle Analphabeten sind, beschwert sich dann aber, wenn jemand doch darin lesen, und Informationen entnehmen kann.</p>
<p>Nun gilt es <a title="http://41yd.de/blog/reverse-engineering/" href="http://41yd.de/blog/reverse-engineering/" target="_blank">wie immer</a> herauszufinden, welcher Algorithmus im Dekoder verwendet wird, und wie die Datei generell gehandhabt wird (Schlüsselgenerierung etc.). Dazu benutze ich einen Debugger/Disassembler Namens OllyDbg. Ich trace also gemütlich durch die Datei, und versuche spannende Stellen in der Datei zu markieren (bereits das hat mich mehrere Tage gekostet).</p>
<p><a href="http://41yd.de/blog/wp-content/otr1.png"><img class="aligncenter size-medium wp-image-400" title="otr1" src="http://41yd.de/blog/wp-content/otr1-300x168.png" alt="" width="300" height="168" /></a>Wie man sieht, ist das Bild noch vom 23. Februar. Ich war da gemütlich am tracen, um den Programmablauf zu verstehen.</p>
<p>Irgendwann werden die ersten 10 Bytes der Datei ausgelesen:</p>
<p><a href="http://41yd.de/blog/wp-content/magic.png"><img class="aligncenter size-medium wp-image-404" title="magic" src="http://41yd.de/blog/wp-content/magic-300x168.png" alt="" width="300" height="168" /></a>Es ist unübersehbar &#8220;OTRKEYFILE&#8221;. Es scheint ein Wert zu sein, um das Dateiformat zu identifizieren (das ist üblich; die meisten Betriebssysteme erkennen anhand von solchen Mustern den Typ der Datei, und nicht durch die Dateiendung).</p>
<p>Ich habe einen Breakpoint an den Punkt gesetzt, andem der OpenFileDialog aufkam. Denn genau danach, würde die Datei geöffnet, und der Inhalt bearbeitet werden. Und so kam es auch. Nach kurzer Zeit erblickte ich einen String, und zwar in dieser Form:</p>
<p>http://www.onlinetvrecorder.com/webrecording/isuser.php?email=[1]&amp;pass=[2]</p>
<p>Wobei [1] meine email-Adresse war, und [2] der MD5-Hash von meinem Passwort. Und der Name der PHP-Datei &#8220;isuser.php&#8221; lässt darauf schließen, dass geprüft wird, ob wir uns mit diesen Daten korrekt einloggen können. Das interessante an diesem String ist, dass es hier einen MD5-String verwenden. Ich breake also einige CALLs vor diesem String, und versuche herauszufinden, welche der CALLs die generierung des MD5-Hashs durchführt. Gesagt getan, und schon habe ich einen schönen Breakpoint dort sitzen, und werde jedes mal benachrichtigt, wenn ein MD5-Hash generiert wird. Das ist sehr hilfreich. Denn Hashs werden sehr häufig als Schlüssel für Verschlüsselungsalgorithmen benutzt.</p>
<p>Und wenn man diese Webseite mit seinen eigenen Daten mal selbst aufruft, sieht man, dass es nur ein &#8220;yes&#8221; oder &#8220;no&#8221; zurückgibt. Genau das wird auch im Programm abgefragt, und jenachdem führt das Programm dann fort, oder meldet einen Fehler.</p>
<p><a href="http://41yd.de/blog/wp-content/yesno.png"><img class="aligncenter size-full wp-image-401" title="yesno" src="http://41yd.de/blog/wp-content/yesno.png" alt="" width="692" height="264" /></a></p>
<p>Irgendwann später fällt mir auf, dass hier der MD5 Hash von &#8220;Windows&#8221; sowie von &#8220;00:00:00:00:00:00&#8243; generiert wird. Ich hatte schonmal <a title="http://41yd.de/blog/2010/02/12/darwintag/" href="http://41yd.de/blog/2010/02/12/darwintag/" target="_blank">in einem Post erwähnt</a>, dass dieses Programm insgeheim die MAC-Adresse sowie das Betriebssystem (und die lokale IP) überträgt. Gott weiß warum. Hier wurde es aber durch diese beiden konstanten Hashs ersetzt. Anscheinend brauchen die diese Daten doch nicht mehr.</p>
<p>An einem Punkt merke ich dann, wie die nächsten 0&#215;100 Bytes der Datei eingelesen werden. Und nach einigen CALLs, wurde es durch einen schönen String ersetzt. Hat etwa eine Entschlüsselung stattgefunden? Bin mir ziemlich sicher, dass es passiert ist! Jetzt wirds heiß. Einige Breakpoints setzen, und laaaangsam durchhangeln. Und siehe da, ich sehe etwas, was tatsächlich brauchbar aussieht:</p>
<p><a href="http://41yd.de/blog/wp-content/blowfish-initialize.png"><img class="aligncenter size-medium wp-image-402" title="blowfish-initialize" src="http://41yd.de/blog/wp-content/blowfish-initialize-300x168.png" alt="" width="300" height="168" /></a></p>
<p>Allein aus diesem Stück Code, konnte ich nun den Algorithmus ausfindig machen. Wie ich das gemacht habe? Ganz einfach: Ich bin dem Code bis zum ersten memcpy gefolgt. Nun habe ich mir angeschaut, was dort genau kopiert wird:</p>
<p><a href="http://41yd.de/blog/wp-content/Pi.png"><img class="aligncenter size-full wp-image-408" title="Pi" src="http://41yd.de/blog/wp-content/Pi.png" alt="" width="452" height="84" /></a>Diese Werte sehen sehr sauber aus, und nicht nach binärem Bullshit. Das könnte wieder etwas generiertes vom Programm sein (und wie ein Physiker, wollen wir natürlich das Elementare finden, das, woraus das Höhere hier entstanden ist). Allerdings machen wir es uns einfach, und schauen erstmal, ob es einen bekannten Algorithmus gibt, der diese Daten verwendet. Also nehmen wir die ersten 4 Bytes &#8220;243F6A88&#8243; (beachtet das Little-Endian-System!) und googlen danach. Achtung: das folgende ist <strong>keine Google-Werbung</strong>! Es ist ein Bild:</p>
<p><a href="http://41yd.de/blog/wp-content/pi-google.png"><img class="aligncenter size-full wp-image-409" title="pi-google" src="http://41yd.de/blog/wp-content/pi-google.png" alt="" width="593" height="248" /></a>Es ist hier ziemlich viel die Rede von <a title="http://de.wikipedia.org/wiki/Blowfish" href="http://de.wikipedia.org/wiki/Blowfish" target="_blank">Blowfish</a>. Und zufälligerweise, ist das ein Verschlüsselungsalgorithmus! Unter der Annahme, dass dieser Wert von keinem anderen Algorithmus verwendet wird, behaupte ich: OTRKEY verwendet Blowfish! Anscheinend tut dieser Assembler-Code nicht viel, als diese Werte in den Arbeitsspeicher zu legen, um sie später zu verwenden. Im zweiten memcpy wird ein weiterer Wert kopiert. Diesmal mache ich das gleiche mit den ersten 4 Bytes, und finde heraus, dass es auch zu Blowfish gehört. Bei diesen beiden Werten handelt es sich um die P- sowie S-Box von Blowfish. Ich weiß nun, dass nach der Initialisierung eine Ver- oder Entschlüsselung folgen muss. Und ich finde einen weiteren CALL dessen Adresse sehr nah an dem Initialisierungs-CALL liegt (eine Möglichkeit, die Zusammengehörigkeit von CALLs zu identifizieren). Und zwar das hier:</p>
<p><a href="http://41yd.de/blog/wp-content/generate_subkeys1.png"><img class="aligncenter size-full wp-image-410" title="generate_subkeys1" src="http://41yd.de/blog/wp-content/generate_subkeys1.png" alt="" width="548" height="364" /></a>Es ruft die Initialisierungsfunktion auf (ich weiß nicht, wieso er das noch einmal tut). Das sieht schonmal spannend aus. Unten sieht man eine Schleife, die gerade anfängt. Etwas weiter unten geht der CALL weiter:</p>
<p><a href="http://41yd.de/blog/wp-content/generate_subkeys2.png"><img class="aligncenter size-full wp-image-411" title="generate_subkeys2" src="http://41yd.de/blog/wp-content/generate_subkeys2.png" alt="" width="510" height="354" /></a>Sehr roh und primitiv sieht das alles aus. Da kriege ich echt Herzklopfen dabei! Jedenfalls sieht das nach einer Menge Arbeit aus, und das ist total genial. Denn das zeigt uns, dass hier irgendwas mit Daten getan wird. Anscheinend werden die geXORed usw. Hier sieht man oben, dass die erste Schleife aufhört, und eine neue beginnt. Weiter unten läuft der CALL so ab:</p>
<p><a href="http://41yd.de/blog/wp-content/generate_subkeys3.png"><img class="aligncenter size-full wp-image-412" title="generate_subkeys3" src="http://41yd.de/blog/wp-content/generate_subkeys3.png" alt="" width="532" height="353" /></a>Wichtig hierbei ist, dass hier wiederum die letzte Schleife aufhört, dann aber zwei Schleifen anfangen, die ineinander sind. So etwas wie while() { while() { } }  oder for() { for() { } } &#8230; ihr versteht schon!</p>
<p>Nun haben wir ein Muster, nach dem wir in Blowfish-SourceCodes suchen können. Und zwar diesen:</p>
<blockquote><p>Schleife {</p>
<p>}</p>
<p>Schleife {</p>
<p>}</p>
<p>Schleife {</p>
<p style="text-align: left;">Schleife {</p>
<p style="text-align: left;">}</p>
<p>}</p></blockquote>
<p>Auf der Webseite des Blowfish Entwicklers Bruce Schneier finden wir <a title="http://www.schneier.com/blowfish-download.html" href="http://www.schneier.com/blowfish-download.html" target="_blank">einige SourceCodes</a> zu Blowfish. Ich durchforste mal eines, und ich finde folgendes:</p>
<p><a href="http://41yd.de/blog/wp-content/gen_subkeys_code.png"><img class="aligncenter size-full wp-image-413" title="gen_subkeys_code" src="http://41yd.de/blog/wp-content/gen_subkeys_code.png" alt="" width="348" height="586" /></a>Na, passt es nicht unserem Muster? Nun wissen wir sogar schon den Namen unseres Calls: Gen_Subkeys. Das deutet darauf hin, dass hier die Subkeys generiert werden. Eine gänzlich normale Vorgehensweise in Blowfish. Wikipedia sagt &#8220;Aus diesen Schlüsselbits werden vor Beginn der Ver- oder Entschlüsselung Teilschlüssel, so genannte Rundenschlüssel P<sub>1</sub> bis P<sub>18</sub>, und die Einträge in den S-Boxen von aufsummiert 4168 Bit erzeugt.&#8221;. Das scheint hier zu geschehen. Nun haben wir schon die Initialisierung und die generierung der Subkeys gefunden zu haben. Aber wenn ich Wikipedia richtig verstehe, wird für Gen_Subkeys bereits der Schlüssel für die Ver-/Entschlüsselung referenziert. Also schaue ich mal in den Registern nach, und versuche zu verstehen, wann der Code den Key anspricht. Und ich werde fündig:</p>
<p><a href="http://41yd.de/blog/wp-content/key.png"><img class="aligncenter size-full wp-image-414" title="key" src="http://41yd.de/blog/wp-content/key.png" alt="" width="448" height="43" /></a>Das rot markierte sieht sehr schön nach einem Key aus. Der rest wiederholt sich merkwürdig, deswegen habe ich es Orange markiert, da ich mir nicht sicher bin, ob dieser noch zum Key gehört. Ich könnte nun im Stack (oder in den Registern) suchen, ob dort die Länge des Keys mitgegeben ist. So könnte ich herausfinden, welche Werte genau zum Key gehören. Der Rest könnte nur Müll sein, oder aber auch ein Initialization Vector für (beispielsweise) den <a title="http://de.wikipedia.org/wiki/Cipher_Block_Chaining_Mode" href="http://de.wikipedia.org/wiki/Cipher_Block_Chaining_Mode" target="_blank">CBC-Modus</a>. Jedenfalls werden wir herausfinden, dass der Rot markierte Bereich tatsächlich unser Key ist, und der Rest unbrauchbar. Hier nochmal der Key ausgeschrieben: <strong>EF3AB29CD19F0CAC5759C7ABD12CC92BA3FE0AFEBF960D63FEBD0F45</strong></p>
<p>Hey! Ich weiß nun sogar den Key. Ist das nicht toll? Ich weiß zwar nicht, woher der Key kommt, aber das stört im moment nicht. Darum kümmere ich mich später. Wir vermuten also: Blowfish ist der Verschlüsselungsalgorithmus, und wir haben den Key gefunden!</p>
<p>Nun, das sieht doch ganz gut aus! Viel sicherer werden wir uns etwas später, bei der Entschlüsselung von Daten. Ich weiß ja, wie bereits erwähnt, dass nach einer Initialisierung (und dann dem Gen_Subkeys) eine Ver- oder Entschlüsselung folgen wird (sonst macht die Initialisierung ja keinen Sinn). Also taste ich mich immer mehr voran. Und irgendwann bin ich tatsächlich in einer Crypt-Routine. Das vermute ich, weil es nach &#8220;rohem&#8221; Code aussieht, mit viel XORen und auslesen von Werten. Und (sehr wichtig!) der CALL befindet sich in der Nähe der Initialisierung und Gen_Subkeys Funktion.</p>
<p>Nun ist Achtsamkeit geboten, denn aus der Ver-/Entschlüsselungsfunktion können wir sehr viele Informationen gewinnen um den Algorithmus herauszufinden.</p>
<p><a href="http://41yd.de/blog/wp-content/decrypt.png"><img class="aligncenter size-medium wp-image-403" title="decrypt" src="http://41yd.de/blog/wp-content/decrypt-300x168.png" alt="" width="300" height="168" /></a>Wenn man sich meine rot markierten Stellen anschaut, dann sieht man, dass hier 2 mal 4 Bytes ausgelesen werden. Nun schaut euch oben nochmal <a title="http://41yd.de/blog/wp-content/magic.png" href="http://41yd.de/blog/wp-content/magic.png" target="_blank">das Bild</a> mit dem &#8220;OTRKEYFILE&#8221; header an. Die darauffolgenden Bytes sind 0&#215;1D158EC9. Das ist auch der Wert im EBX Register! Es werden also momentan die ersten 4 Bytes der OTRKEY Datei entschlüsselt. Dabei wurde noch garkeine Abfrage an den Server gesendet, um den Key zu enthalten. Hm, was passiert hier?</p>
<p>Wenn man sich nun durch die ganze Schleife hangelt, merkt man, dass die ersten 8 Bytes der Datei entschlüsselt wurden. Das kann ich einfach daran erkennen, dass die 8 Bytes plötzlich mit sinnvollen Daten ersetzt wurden:</p>
<div id="attachment_415" class="wp-caption aligncenter" style="width: 461px"><a href="http://41yd.de/blog/wp-content/decrypt_vorher.png"><img class="size-full wp-image-415" title="decrypt_vorher" src="http://41yd.de/blog/wp-content/decrypt_vorher.png" alt="" width="451" height="112" /></a><p class="wp-caption-text">Vor der Entschlüsselung</p></div>
<div id="attachment_416" class="wp-caption aligncenter" style="width: 460px"><a href="http://41yd.de/blog/wp-content/decrypt_nachher.png"><img class="size-full wp-image-416" title="decrypt_nachher" src="http://41yd.de/blog/wp-content/decrypt_nachher.png" alt="" width="450" height="109" /></a><p class="wp-caption-text">Nach der Entschlüsselung</p></div>
<p>Merkt ihr den kleinen aber feinen Unterschied? Es sind die ersten 8 Bytes betroffen. Der binäre Mist wurde zu &#8220;&amp;FN=Geis&#8221;. Das sieht doch toll aus, der Anfang eines Strings!</p>
<p>Also, pro Schleifendurchlauf  werden jeweils 8 Bytes entschlüsselt. Das sagt uns schonmal, dass es ein Blockcipher ist (da es die Daten blockweise entschlüsselt) und zwar in der Größe von 64 Bit (= 8 Bit * 8 Bytes). Wenn man nun nach &#8220;block cipher 64 bit&#8221; googled, stoßt man auf (unter anderem) <a title="http://de.wikipedia.org/wiki/Data_Encryption_Standard" href="http://de.wikipedia.org/wiki/Data_Encryption_Standard" target="_blank">DES</a> und Blowfish. Beide mit einer Blockgröße von 64 Bit. <a title="http://twitter.com/eddy14/status/9062926153" href="http://twitter.com/eddy14/status/9062926153" target="_blank">Hier sieht man</a>, dass meine Vermutung DES war, da ich damals noch nicht die Gen_Subkey CALLs etc. gefunden hatte. Allerdings hat DES nur eine Key-Länge von 56 Bit. Das heißt, wenn der Schlüssel länger ist, wird unsere Vermutung wieder auf Blowfish fallen. Wenn wir uns die Gen_Subkeys Funktion von oben anschauen, hatten wir schon einmal einen Key ermittelt. Dieser war 28 Bytes lang. Das entspricht 224 Bit (8Bit * 28 Bytes). Das ist weitaus mehr, als DES und Triple-DES vertragen kann. Blowfish kann allerdings bis zu 448 Bits benutzen (448 Bit / 8 Bit = 56 Bytes). Mehr als genug! Und schon wieder ist es Blowfish! Langsam aber sicher sollten wir akzeptieren, dass es Blowfish ist. <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nun mache ich den Test, der meine Vermutung bestätigen soll. Ich wähle den gleichen Ciphertext, den gleichen Algorithmus, und den gleichen Key. Schnell ist etwas in Python geschrieben. Und das Ergebnis der Entschlüsselung: irrsinnig verfickter Scheiss, es kommt kein richtiges Ergebnis raus! Wieso? Ich habe doch alles richtig gemacht! Ich probiere es mit weiteren Keys (die Orange markierten) usw. Nichts hilft!</p>
<p>Meine Motivation ist fast schon auf dem Nullpunkt, nach so vielen Tagen des Reverse Engineering. Ich bin mir schon fast sicher, dass an dem Blowfish Algorithmus rumgespielt wurde, damit es nicht mehr rekonstruierbar ist. Aber nicht jeder Programmierer kann einen Verschlüsselungsalgorithmus so umschreiben, dass die Entschlüsselung noch funktioniert (und wie man später sieht, müsste man dafür auch etwas in PHP schreiben etc.). Das heißt für mich: sehr viel Arbeit. Denn ich muss die Decrypt-Routine Schritt für Schritt durchgehen, und mit meinem Decrypt vergleichen, um herauszufinden, wo etwas verändert wurde. Das erste und einfachste, was mir dazu einfällt ist, die S-Box und/oder P-Box zu verändern. Das würde das Ergebnis der Ver/Entschlüsselung verändern, aber dennoch funktionieren! Das wäre auch ziemlich schwer zu finden, denn man müsste die gesamte S-Box mit dem Original vergleichen (einige Programme tun das bei MD5 Hashs die sie für die Generierung von Seriennummern benutzen). Egal was es ist, es sollte mir auffallen, wenn ich den Code langsam durchgehe.</p>
<p>Also schreibe ich eine Blowfish library in C++ so um, dass es mir immer ausgibt, welche Werte gerade ausgelesen und geXORed werden etc. Irgendwann  (nach seeeeehr langem debuggen) finde ich endlich den Fehler:</p>
<p><a href="http://41yd.de/blog/wp-content/Bildschirmfoto-blowfish-bug.png"><img class="aligncenter size-medium wp-image-418" title="Bildschirmfoto-blowfish-bug" src="http://41yd.de/blog/wp-content/Bildschirmfoto-blowfish-bug-300x126.png" alt="" width="300" height="126" /></a>Vergleicht mal Grün mit Grün, und Rot mit Rot. Es fällt auf, dass die Grünen übereinstimmen, aber die Roten nicht! Und wenn man genau hinschaut, dann ist der rote Wert einfach nur in einem anderen Byte-Order, und zwar Rückwärts! aus &#8220;0xE8397A7B&#8221; wurde &#8220;0&#215;7B7A39E8&#8243;. Da ist also das Problem! Vermutlich gibt es einen Implementierungsfehler was die Big- und Little-Endian Systeme angeht!</p>
<p>Was ich nun gemacht habe ist, einfach den Wert in meiner Blowfish Library reversed, um zu schauen, ob die Entschlüsselung dann korrekt läuft. Und das tat sie! YEAH! Wegen diesem kleinen Problem, ging die komplette Entschlüsselung nicht. Und, was das lustige an dieser Tatsache ist: ich musste bei meiner Library bewusst einen Bug einbauen, damit es funktioniert!</p>
<p>So, nun bin ich mir sicher: es ist Blowfish! Und ich weiß von oben noch den Key für die Entschlüsselung. Das ist das Ergebnis der Entschlüsselung für eine zufällige OTRKEY Datei:</p>
<blockquote><p>&amp;FN=Geist_und_Gehirn_10.01.22_22-45_bralpha_15_TVOON_DE.mpg.avi&amp;FH=8C8E880D8B10E502D8D10B50D62988040C629AA5AA588122&amp;OH=7D81885BAB50E88922562162CFA0AA672B506D84EAA32F98&amp;Sw=FALSE&amp;SZ=129542018&amp;H=42C0209272A87222907A8A60D070E240&amp;PD=23AD2A0B0A157E3066B[cut]</p></blockquote>
<p>Das Ende habe ich rausgeschnitten, weil es zu lang war. Nundenn. Das sieht nach brauchbaren Informationen aus. Eventuell ist eines davon ein Key, den wir dem Server übergeben müssen. So stellt er sicher, dass wir überhaupt eine Entschlüsselung führen dürfen (neben der Kontrolle der Userdaten natürlich). Denn nur ihr offizieller Dekoder scheint ja diesen OTRKEY-Header entschlüsseln zu können (und ich!).</p>
<p>Was ich aber immernoch nicht weiß ist, woher das Programm den Key für die Entschlüsselung her hatte. Da kein Server vorher kontaktiert wurde, ist es möglich, dass der Key entweder aus dem Dateinamen, oder einem bestimmten Bereich der Datei gehashst/generiert wird. Oder der Key ist ein fester wert für jede Datei.</p>
<p>Nach einiger Analyse finde ich eine komische Funktion, die eine Art selbst geschriebene dekodierung durchführt. Es entsteht dabei der Key als Resultat! Als ich nachschaue, woher der Ciphertext herkommt, finde ich mich in der exe-Datei wieder:</p>
<p><a href="http://41yd.de/blog/wp-content/otrkey_key.png"><img class="aligncenter size-medium wp-image-420" title="otrkey_key" src="http://41yd.de/blog/wp-content/otrkey_key-300x163.png" alt="" width="300" height="163" /></a></p>
<p>Dieser Wert wird aus der .exe ausgelesen, und dann dekodiert, damit unser Key entsteht! Das ist wirklich gut durchdacht. Hätten die nämlich den Key einfach im Klartext in der .exe gelassen, hätte so gut wie jeder Idiot den Schlüssel finden können (obwohl es dennoch nicht einfach ist, den Algorithmus zu finden etc.). So wird sichergestellt, dass es nur nach blödsinnigen Daten aussieht.</p>
<p>Es ist also <strong>ein</strong> fester Wert, der für <strong>jede</strong> Datei verwendet wird. Mit diesem konstanten Key kann man den Header von jeder Datei entschlüsseln.</p>
<p>Das wäre geschafft! Wir haben aber nach so viel Arbeit noch nicht einmal begonnen die eigentliche Video-Datei zu entschlüsseln!</p>
<p>Nach einem Stück des Codes gelangen wir zu einer weiteren HTTP-Anfrage. Ich lasse sie laufen, und lasse Wireshark mitsniffen. So sehe ich, was gesendet wird. Es ist ein Link wie folgender:</p>
<blockquote><p>/quelle_neu1.php?code=K3LMBS+ONd/ZmbUUfrQHacUrFAaPta2PsghPJ9qIDpOEaMOu</p>
<p>/BFOc2rFp6YSmM+PUpdaen2HH45uQ+xTkqoejKUAqefktbOTBOlLqYGLfIdv+vn/uIyQ09eX70HdsSEPp</p>
<p>Ai8qU3dzUIyrj/SDgTEZlToeaBPZhPr04L0ZONliqKvNKNWwgcV4A0+Vwalgfpl/JnFF2JkIulRRMXlSoP9</p>
<p>piJdyWXiomVwNFu/JbaLHy7CKAdLTjJRjGdhhr[cut]&amp;AA=blabla@lol.de&amp;ZZ=20100122</p></blockquote>
<p>Anscheinend ist es verschlüsselt. Und base64 kodiert. Raffiniert! Sonst könnte jeder mitlesen, und die Anfrage nachbauen. Es werden aber noch zusätzlich meine email-Adresse, sowie das Datum übermittelt (hier war es tatsächlich der Januar). Wofür die Server diese wohl braucht? Und wieso werden die im Klartext versendet? Vielleicht braucht der Server diese, um den Key zu generieren, für die Entschlüsselung des Codes.</p>
<p>Jetzt ist es eigentlich nicht mehr viel Arbeit, die CALLs zu finden, wo die Verschlüsselung der Daten stattfindet. Nach einer Weile weiß ich, was genau passiert. Es wird ein String generiert, der wie folgt aussieht:</p>
<p>&amp;A=meine@email.de&amp;P=meinpassword&amp;FN=Tagesschau_10.04.08_01-05_ard_10_TVOON_DE.mpg.avi&amp;OH=6FAC320BA6002D83EA300498262162BEA5D8D62BD8540750&amp;M=528C8E6CD4A3C6598999A0E9DF15AD32&amp;OS=AEA23489CE3AA9B6406EBB28E0CDA430&amp;LN=EN&amp;VN=0.4.1132&amp;IR=TRUE&amp;IK=aFzW1tL7nP9vXd8yUfB5kLoSyATQ&amp;D=62A85C99224731[cut]</p>
<p>Es wird meine Email-Adresse, mein Passwort, der Dateiname vom OTRKEY-File sowie einige andere Daten gesendet.Der IK-Wert &#8220;<strong>aFzW1tL7nP9vXd8yUfB5kLoSyATQ</strong>&#8221; ist ein konstanter Wert der immer mitgesendet wird (und vermutlich zur validierung der Anfrage dient). FN ist der Dateiname. OH ist der Dateihash. M ist der Hash der MAC-Adresse. OS ist der Hash des Betriebssystems. VN ist die Version des Programmes. Alles nach D sind zufällige Daten um dem Padding gerecht zu werden.</p>
<p>Um aus diesem Klartext nun einen verschlüsselten Text zu erzeugen, wird ein Schlüssel generiert. Für die Generierung dieses Schlüssels benötigt man das Datum, sowie Email und Passwort! In Python würde man die Generierung so ausdrücken:</p>
<p><a href="http://41yd.de/blog/wp-content/bigKey.png"><img class="aligncenter size-medium wp-image-421" title="bigKey" src="http://41yd.de/blog/wp-content/bigKey-300x234.png" alt="" width="300" height="234" /></a>Es wird also ein Teil des Email-Hahs, ein Teil des Passwort-Hashs sowie das Datum benutzt! Genau desswegen müssen wir Email und Datum im Klartext mitsenden (obwohl sie das Datum eigentlich auch selbst auslesen könnten). Aus der Email-Adresse wird dann in der User-Datenbank das Passwort-Hash abgefragt, und damit der Key generiert.</p>
<p>Und dann wird der HTTP-String mit dem Blowfish-Algorithmus im CBC-Modus verschlüsselt (der IV wird zufällig generiert, aber nicht migesendet. Das resultiert in einer korrumpierten Ausgabe, wobei allerdings nur die ersten 8 Bytes betroffen sind. Diese wurden allerdings auch zufällig drangehangen, von daher, ist es ziemlich egal)! Der Server antwortet dann entweder mit einer Fehlermeldung, oder einem base64 kodierten Wert. Dieser Wert wird dann wieder mit dem gleichen Schlüssel wie bei der Verschlüsselung im CBC Modus entschlüsselt. Und somit haben wir vom Server folgenden String empfangen:</p>
<blockquote><p>&amp;IB=cGkQx8p3mO1wYf6zWsA9rLiTubZq&amp;HP=<strong>B5507180E1303191585E20FF71EC4A8D7DCC54DC31F38147B8397BF2</strong>&amp;P=meinPasswort&amp;A=meine@email.de&amp;SW=TRUE&amp;IS=http://www.onlinetvrecorder.com/thanku.php?code=JkE9ZWRkeTE0MUBobmTE4[cut]&amp;DW=FALSE&amp;SB=TRUE&amp;D=33FE1DDCA7863117226C7[cut]</p></blockquote>
<p>Das ist alles so gut wie unwichtig, außer der Wert hinter &#8220;HP=&#8221;, denn das ist unser endgültiger Key, um die OTRKEY Datei zu entschlüsseln, und die Videodatei zu erschaffen! Dieser muss nur noch im ECB Modus auf die Datei angewandt werden, und wir sind fertig.</p>
<p><a href="http://41yd.de/blog/wp-content/working.png"><img class="aligncenter size-full wp-image-422" title="working" src="http://41yd.de/blog/wp-content/working.png" alt="" width="536" height="270" /></a>Und ich kann mich am Video erfreuen:</p>
<p><a href="http://41yd.de/blog/wp-content/itsworking.png"><img class="aligncenter size-medium wp-image-423" title="itsworking" src="http://41yd.de/blog/wp-content/itsworking-300x168.png" alt="" width="300" height="168" /></a></p>
<p>Hurra! Es hat tatsächlich Spaß gemacht, aber es hat mich total ausgesaugt. Ich bin ausgebrannt. Ich habe die letzten Wochen die FH geschwänzt, weil mir dieses Programm nicht aus dem Kopf ging. Ich konnte Nachts nicht ruhig schlafen, weil es da anscheinend ein Geheimnis gab, dem ich nicht nachgehen konnte. Wie dem auch sei; hier ist mein Open Source Dekoder für OTRKEY Dateien:</p>
<p style="text-align: center;"><a title="http://41yd.de/blog/wp-content/otrkey-breaker.tar.gz" href="http://41yd.de/blog/wp-content/otrkey-breaker.tar.gz" target="_blank">DOWNLOAD</a></p>
<p style="text-align: left;">Der Code von mir ist Public Domain. Der Blowfish-Algorithmus ist unter der MPL (ich werde versuchen einen anderen Algorithmus zu finden, der eine bessere Lizenz hat).</p>
<p style="text-align: left;">Erwartet nicht zu viel. Es kann momentan nur primitiv OTRKEY-Dateien entschlüsseln. Aufruf ist einfach: &#8220;./otrkey-breaker dateiname.otrkey deine@email.de deinPassword&#8221;. Es gilt natürlich wie immer, dass jeder das Programm verändern kann, wie er mag.</p>
<p style="text-align: left;">Wie oben bereits erwähnt, habe ich bewusst <strong>keine</strong> Möglichkeiten eingebaut, um illegal die Dateien zu entschlüsseln.</p>
<p style="text-align: left;">Für Linux-User: Ich habe gerade keine Lust auf eine Makefile. Aber compilen könnt ihr es ganz einfach mit &#8220;g++ *.cpp -o otrkey-breaker&#8221; in dem Ordner nach dem entpacken. Oder einfach Code::Blocks benutzen.</p>
<p style="text-align: left;">Nochmal das ganze kurz <strong>zusammengefasst</strong>: Es wird der <strong>Blowfish</strong> Algorithmus verwendet. Der Key wird vom Server abgeholt. Es wird jeweils ein <strong>konstanter</strong>, sowie ein <strong>generierter Key</strong> verwendet, um die Header-Entschlüsselung sowie URL-Abfragen durchzuführen. Es wird sowohl der <strong>ECB</strong> wie auch der <strong>CBC Modus</strong> verwendet, wobei bei letzterem der IV zwar <strong>zufällig generiert</strong>, aber nicht mitgesendet wird. Die Anfragen behielten früher <strong>persönliche Daten</strong> (in Form von Hashs), wie MAC-Adresse, lokale IP-Adresse, Betriebssystem und sogar (eine Art?) Seriennummer der Festplatte. Das macht der Standard-Dekoder. Allerdings sendet der Easy-Dekoder diese Daten nicht mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2010/04/18/otrkey-breaker/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Salzwasser Sauger</title>
		<link>http://41yd.de/blog/2010/01/17/salzwasser-sauger/</link>
		<comments>http://41yd.de/blog/2010/01/17/salzwasser-sauger/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 14:42:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=334</guid>
		<description><![CDATA[Düm Di Dum Düm, trararara DIIING. Ich wollte schon immer einen eigenen Introsong haben! Wer komponiert eines für mich? *liebschau*

Mir war gestern langweilig, also nahm ich ein Programm ausseinander! Ich wusste, dass meine Motivation nicht sehr stark war, deswegen wollte ich heute nur ein einfaches Programm operieren. Ich weiß leider nicht mehr von wem der [...]]]></description>
			<content:encoded><![CDATA[<p><em>Düm Di Dum Düm, trararara DIIING. Ich wollte schon immer einen eigenen Introsong haben! Wer komponiert eines für mich? *liebschau*<br />
</em></p>
<p>Mir war gestern langweilig, also nahm ich ein Programm ausseinander! Ich wusste, dass meine Motivation nicht sehr stark war, deswegen wollte ich heute nur ein einfaches Programm operieren. Ich weiß leider nicht mehr von wem der Tipp kam, aber mir fiel eine gewisse Warez Seite ein, die ihre Angebote auf FTP-Server hochluden. Dafür wird ein eigens konstruierter Leecher verwendet. Auf der Webseite (die übrigens genauso hässlich ist wie das Programm) lädt man sich eine verschlüsselte &#8220;Mirror-File&#8221; herunter, die nur ein paar KB groß ist. Mit dem Leecher kann dieser nun geöffnet werden.</p>
<div id="attachment_336" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/saltwater.png"><img class="size-medium wp-image-336" title="Saltwater - Leecher" src="http://41yd.de/blog/wp-content/saltwater-300x225.png" alt="Saltwater - Leecher" width="300" height="225" /></a><p class="wp-caption-text">Saltwater - Leecher</p></div>
<p>Wisst ihr nun, was ich mit hässlich meinte?</p>
<p>Die verschlüsselten Dateien haben die Endung &#8220;.swl&#8221;, deswegen rede ich hier von SWL-Dateien. Wie jeder Reverser weiß, wird zuerst das Programm auf die übliche Art benutzt. Wir klicken unten auf &#8220;Open&#8221;, es öffnet sich ein Dialogfenster und wir wählen unsere SWL-Datei aus. Nun lädt das Programm diese Datei, und zeigt uns den Inhalt an, sodass wir mit einem Druck auf &#8220;Download&#8221; das Herunterladen starten können.</p>
<p>So weit, so gut. Ich knackse kurz meine Finger, feuchte meine Lippen an, hole tief Luft, schaue auf die Uhr, merke mir die Zeit, gehe kurz auf die Toilette, hol mir von der Küche eine Tüte Erdnussflips und freue mich auf den Abend.</p>
<p>Als aller erstes will ich schauen, ob das Programm gepackt ist. Dafür verwende ich PEiD. Den entdeckten Packer lasse ich mir durch ein Stück Software automatisch entfernen, denn mir fehlt echt die Lust auf manual unpacking (und das Einlesen in das Thema erst!).</p>
<p>Nun kann ich es ganz bequem in meinen Debugger OllyDbg laden und anfangen. Ich mache mir natürlich Gedanken, wie ich am besten vorgehen soll, um das Geheimnis des Dateiformates zu befreien. Ich werde hier mal die übliche Vorgehensweise von mir schildern:</p>
<blockquote>
<ol>
<li>Dateiformat in einem Hexeditor ansehen um eine ungefähre Idee davon zu kriegen, wie die Datei strukturiert sein könnte.</li>
<li>Herausfinden, an welcher Codestelle der Dateiinhalt eingelesen wird</li>
<li>Herausfinden an welchem Punkt der komplette Inhalt entschlüsselt wurde</li>
<li>Zwischen diesen beiden Stellen an interessant aussehenden Stellen Breakpoints setzen</li>
<li>Etwas im Code tracen (während der Ausführung) um ein Gefühl dafür zu bekommen, was (ungefähr) geschieht</li>
<li>Nach Mustern im Code suchen, die mir Aufschluss darüber geben, WIE entschlüsselt wird (Algorithmus, Schlüssel, etc.)</li>
<li>Wichtige CALLs dokumentieren und benennen um ein besseres Verständnis für den Codeablauf zu haben. Alles was nach einem Schlüssel aussieht, in einer Text-Datei vormerken.</li>
<li>Vermutung aufstellen, und bestätigen durch eine Scriptsprache freier Wahl. Beispielsweise Rijndael im ECB Modus auf die Datei anwenden, und schauen ob das Resultat gut aussieht.</li>
<li>Wenn das allgemeine Verständnis für die Verschlüsslung da ist, einen Decrypter schreiben.</li>
</ol>
</blockquote>
<p>Der erste Schritt ist sehr einfach und ziemlich interessant! In einem Fall war es mir sogar mal möglich, allein durch das Ansehen des Dateiformates im Hexeditor herauszufinden wie es verschlüsselt wurde (ein einfacher XOR mit dem ersten Byte der Datei). Aber hier siehts nicht so aus:</p>
<div id="attachment_337" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/hxd.png"><img class="size-medium wp-image-337" title="HxD" src="http://41yd.de/blog/wp-content/hxd-300x128.png" alt="" width="300" height="128" /></a><p class="wp-caption-text">HxD zeigt uns den Inhalt der Datei</p></div>
<p>Fast die vollständige Datei sieht verkrüppelt aus. Sieht nach Verschlüsselung aus (wer hätte das gedacht?). Allerdings befindet sich am Ende eine Webadresse und eine lange Zahl. Die sehen ziemlich wichtig aus! Eventuell ist es der Schlüssel (oder der Schlüssel wird damit generiert, oder es wird an die Seite versendet und dieser gibt uns den Key, oder es ist ein IV, oder oder oder &#8230;.). Wir müssen unbedingt solche Vermutungen aufstellen, damit uns später in dem Flut von Assemblercode Muster auffallen. Wenn wir die Webadresse aufrufen, wird uns eingeredet, es wäre ein 404. Schade, vermutlich wird diese Zahl per POST gesendet, oder so ähnlich.</p>
<p>Mehr ist aus dem alleinigen Ansehen des Dateiinhalt nicht zu entnehmen. Also gehen wir zu Schritt 2 über. Wir müssen herausfinden, an welcher Codestelle die Datei geöffnet wird. So wissen wir die ungefähre Stelle von der Entschlüsselung. Nun, betrachten wir noch einmal, was passiert wenn wir auf &#8220;Open&#8221; drücken. Es erscheint ein ein Öffnen-Dialog. Wieso versuchen wir nicht genau an dieser Stelle das Programm zu stoppen? Dieser Öffnen-Dialog scheint so ziemlich einzigartig zu sein.</p>
<p>Viele Windowsprogrammierer kennen bereits die API <a title="http://msdn.microsoft.com/en-us/library/ms646927%28VS.85%29.aspx" href="http://msdn.microsoft.com/en-us/library/ms646927%28VS.85%29.aspx" target="_blank">GetOpenFileName</a>. Damit erstellt man dieses schöne Öffnendialog-Fenster das vielen Windows-Usern bekannt ist. Genau dort will ich ansetzen. Also tippe ich unten in die Commandbar von OllyDbg &#8220;bp GetOpenFileNameA&#8221;. Jetzt kann ich mir sicher sein, dass ich genau dann breake, wenn das Programm die Datei auswählt. Ich lass das Programm laufen, und genau so kommt es!</p>
<p>Schritt 3 ist nicht unbedingt Notwendig, aber dennoch hilfreich. Nach dem Öffnen der Datei zeigt das Programm eine MessageBox. Aha! Dort können wir auch breaken. &#8220;bp MessageBoxA&#8221;. Halleluja!</p>
<p>In Schritt 4 sollen wir nun interessante Stellen suchen. Dafür bediene ich mich der String-Suchfunktion von Ollydbg. Ich scrolle etwas rum, und finde süße Dinge wie &#8220;TDCP_twofish&#8221;. Das sieht nach der <a title="http://www.cityinthesky.co.uk/cryptography.html" href="http://www.cityinthesky.co.uk/cryptography.html" target="_blank">DCPCrypt</a> Bibliothek für Delphi aus. Und &#8220;twofish&#8221; ist der Name des Algorithmus! Und von &#8220;SHA1&#8243; ist auch die Rede. Eine Hashfunktion, auch schön! Also breake ich an den Stellen, wo diese Strings referenziert werden.</p>
<p>In Schritt 5 und Schritt 6 kann man Stundenlang verweilen. Es macht Spaß zu sehen, wie der Entwickler das Programm entworfen und programmiert hat. Man versteht langsam, wieso er jenes und anderes getan hat. Wenn man verfolgt, was mit den Strings passiert die eingelesen werden, dann erlangt man ziemlich schnell Erfolge. Einer meiner Tricks, um zu verfolgen was mit dem Dateiinhalt geschieht, ist es den Anfang der Datei so zu ändern, dass daraus ein String entsteht (ansonsten wäre es ein binärer Inhalt). Beispielsweise ändere ich die ersten Bytes zu &#8220;INHALT&#8221; und füge ein 00-Byte hinzu. Nun wird mir Ollydbg immer diesen String anzeigen, wenn irgendwo der Dateiinhalt referenziert wird. Ich trace also gemütlich durch den Code und knabbere ein paar Snacks.</p>
<p>Nach einiger Zeit bringe ich in Erfahrung, dass anscheinend ein Hash von etwas gebildet wird. Der Hash ist 20 Bytes lang. MD5 kann es nicht sein, denn dieses hätte eine Länge von 16 Bytes. Aus Erfahrung weiß ich, dass es sich bei 20 Bytes eigentlich immer um SHA handelt. Aus den Strings entnehme ich folgende (für viele merkwürdig erscheinende) Zeile:</p>
<blockquote><p>ASCII &#8220;abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq&#8221;</p></blockquote>
<p>Wenn man nach dem String googlet, wird man zahlreiche Indizien dafür finden, dass diese merkwürdige Anreihung von Buchstaben etwas mit SHA zu tun hat. Da kann ich euch aufklären: Viele der kryptografischen Bibliotheken verwenden einen sogenannten &#8220;SelfTest&#8221; um sich selbst auf Funktionalität zu testen. Dabei wird der Hash von einem bekannten String erstellt, und mit der (vorgefertigten) richtigen Lösung verglichen. Sind beide gleich, funktioniert die Bibliothek. Und um SHA zu testen, wird (unter anderem) der oben genannte String verwendet. Ich setze also einen Breakpoint in den CALL wo dieser String gelinkt ist, in guter Hoffnung, dass die Library sich bei der initialisierung automatisch selbst testet.</p>
<p>Da ich weiß, dass hier DCPCrypt verwendet wird, bediene ich mich einer sehr guten Methode, um alle wichtigen CALLs zu benennen. Somit wären wir also im siebten Schritt. Ich suche nach Mustern im Code! Zuerst lade ich mir die aktuellste Version dieser Kryptobibliothek herunter. Ich sehe mir die Datei DCPsha1.pas an, um nach einem einfach aussehenden Muster zu suchen. Ich finde die folgende Codezeile:</p>
<blockquote><p>class function TDCP_sha1.GetHashSize: integer;<br />
begin<br />
Result:= 160;<br />
end;</p></blockquote>
<p>Das sieht doch sehr schön aus! Eine kurze Funktion, die auch noch mit einer ungewöhnlichen Zahl arbeitet. Diese Funktion gibt die Hashgröße in Bits an, aber das braucht uns eigentlich nicht interessieren (160 Bits / 8 ergibt 20 Bytes, die Größe unseres Hashes!). Nun wollen wir uns überlegen, wie wohl diese obige Funktion in Assembler aussehen könnte. Wenn wir absolut keinen Plan davon hätten, könnten wir uns die Delphi IDE installieren und ein Beispielprogramm mit dieser Library kompilieren (mit zusätzlichen Debuginformationen) und uns dann im Debugger das Resultat anschauen.</p>
<p>Ich kann mir aber bereits denken, wie es in Assembler aussieht. Und zwar so:</p>
<blockquote><p>mov eax, 0A0<br />
ret</p></blockquote>
<p>So ungefähr. Also suche ich einfach in Olly nach dieser ersten Zeile. Rechtsklick-&gt;Search for-&gt;command-&gt;&#8221;mov eax, 0A0&#8243;. Olly wird fündig!</p>
<div id="attachment_338" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/olly3.png"><img class="size-medium wp-image-338" title="GetHashSize" src="http://41yd.de/blog/wp-content/olly3-300x126.png" alt="" width="300" height="126" /></a><p class="wp-caption-text">Die aller erste Zeile zeigt meinen Fund (die Funktion &quot;GetHashSize&quot;)</p></div>
<p>Weiter unten sieht man noch einen Teil des SelfTest-Strings. Wir sind also tatsächlich im Code von SHA. Wir drücken nun die Doppelpunkt-Taste auf der Tastatur, und benennen diesen CALL mit &#8220;TDCP_sha1.GetHashSize&#8221;. Der ein oder andere wird sich nun fragen &#8220;Wieso wollen wir unbedingt diese Codestelle wissen?&#8221;. Der Grund ist einfach: Die restlichen Funktionen der SHA-Klasse müssen (eigentlich) in der gleichen Reihenfolge wie im Code hier zu finden sein! Im Sourcecode von DCPCrypt folgt nun &#8220;TDCP_sha1.SelfTest&#8221;. Und &#8220;oh Wunder!&#8221;, in OllyDBG sehen wir auch direkt nach der GetHashSize Funktion den SelfTest String. Es stimmt also!</p>
<p>Wir machen einen Rechtsklick auf GetHashSize. Find Refernces to-&gt;Selected Command. Von den Resultaten wählen wir das Unmarkierte. Wir finden uns an so einer Stelle wieder:</p>
<div id="attachment_340" class="wp-caption aligncenter" style="width: 377px"><a href="http://41yd.de/blog/wp-content/olly4.png"><img class="size-full wp-image-340" title="Auflistung aller Funktionen" src="http://41yd.de/blog/wp-content/olly4.png" alt="" width="367" height="221" /></a><p class="wp-caption-text">Eine Auflistung aller Methoden, die diese Klasse bietet</p></div>
<p>Das sieht leer und düster aus. Aber da wir bereits eine dieser Stellen auf unsere GetHashSize-Methode zurückführen können, haben wir eine Ahnung wie wir den Rest der Funktionen benennen können. Wir wählen den nächsten &#8220;dd dump.*****&#8221; in der Liste, klicken Enter und hüpfen zum nächsten CALL. Es ist der SelfTest. Also benennen wir diesen. Dann gehen wir zum nächsten dd-Eintrag und bennen ihn mit &#8220;Init&#8221;. Denn dieser wäre die nächste Methode im Source-Code gewesen. Am Ende erhalten wir eine wunderbar dokumentierte Liste:</p>
<div id="attachment_341" class="wp-caption aligncenter" style="width: 211px"><a href="http://41yd.de/blog/wp-content/olly5.png"><img class="size-full wp-image-341" title="TDCP_sha1" src="http://41yd.de/blog/wp-content/olly5.png" alt="" width="201" height="92" /></a><p class="wp-caption-text">Methoden, die nun nicht mehr anonym sind! Sie wurden alle mit den richtigen Namen beschmückt.</p></div>
<p>An wichtigen Stellen setze ich hier ein Breakpoint. &#8220;Init&#8221;, &#8220;Update&#8221; und &#8220;Final&#8221;. So kann ich verfolgen, aus welchem String ein Hash erzeugt wird.</p>
<p>Ich lasse das Programm nun laufen, wähle meine verschlüsselte SWL-Datei und breake bei einem der Methoden. Ich kann den Registern entnehmen, welche Daten/Parameter/Argumente der Methode mitgegeben wurden. So entnehme ich ihm die Information, dass aus dem folgenden String ein SHA1-Hash gebildet wird:</p>
<blockquote><p>0&#215;010203 + &#8220;PWsaltwaterPW&#8221; + 0&#215;030201</p></blockquote>
<p>Es scheint ein konstanter Wert zu sein. Ein Passwort, dass in die EXE eingebrannt wurde. Vermutlich wird der Hash als Key für die Verschlüsselung verwendet. Der Hash der sich ergibt, ist also immer konstant folgender Wert: <strong>EB EA FB E3 B6 7F 8E 98 19 EE C8 AC 7C 7A 1C CF 3A FB 4D BA</strong></p>
<p>Das ist cool! Ich muss den Schlüssel also nicht selbst berechnen! (Trotzdem irgendwie langweilig und monoton &#8230;.). Ich schreibe mir diesen Key also auf, damit es mir nicht verloren geht, und ich die ganze Suche von vorne starten muss.</p>
<p>Plötzlich fällt mir nach einigen Minute auf, dass ich die SWL-Datei nicht mehr öffnen kann. Das Programm teilt mir mit, dass die Zeit abgelaufen sei! Wie bitte? Die Webseite des Leechers sagt mir folgendes:</p>
<blockquote><p><strong>Achtung:</strong><br />
SWL-Dateien können nur innerhalb von 60 Minuten nach Empfang geöffnet werden. Es spielt aber keine Rolle, wie lange sie dann geöffnet bleiben.</p></blockquote>
<p>Aha! Da wir gerade eben herausgefunden haben, dass das Programm einen konstanten Key verwendet, kann ich mir sicher sein, dass nicht der Server uns einen temporären Key liefert, zum entschlüsseln dieser Datei. Es ist also der Leecher selbst, der Clientseitig entscheidet, dass wir die Datei nicht mehr verwenden dürfen. Und genau dafür war wohl die URL und die Nummer am Ende der SWL-Datei. Ich patche also kurz die Codestelle, sodass ich alle SWL-Dateien unendlich lange verwenden kann. Das wäre schonmal aus der Welt!</p>
<p>Wenn wir uns an die String-Funde von gerade erinnern: Es war die Rede von <a title="http://de.wikipedia.org/wiki/Twofish" href="http://de.wikipedia.org/wiki/Twofish" target="_blank">Twofish</a>! Also lassen wir unsere Vermutung von dem Krypto-ANALyzer in PEiD bestätigen. Und dieser ist genau unserer Meinung: Es wird der Twofish-Algorithmus verwendet. Wir gehen genauso vor, wie gerade. Wir suchen nach Mustern. Ich öffne ein paar SourceCodes von DCPCrypt, und suche nach schönen Zeilen, die einzigartig sind.</p>
<blockquote><p>class function TDCP_blockcipher64.GetBlockSize: integer;<br />
begin<br />
Result:= 64;<br />
end;</p></blockquote>
<p>Also suche ich nach:</p>
<blockquote><p>mov eax, 080<br />
retn</p></blockquote>
<p>und ich lande genau an der richtigen Codestelle. Nun gehe ich genauso vor, wie bei SHA1. Und am Ende habe ich so einiges dokumentiert:</p>
<div id="attachment_342" class="wp-caption aligncenter" style="width: 283px"><a href="http://41yd.de/blog/wp-content/olly6.png"><img class="size-full wp-image-342" title="TDCP_blockcipher" src="http://41yd.de/blog/wp-content/olly6.png" alt="" width="273" height="200" /></a><p class="wp-caption-text">Die Methoden der Verschlüsselung wurden revealed!</p></div>
<p>Ich breake natürlich an allen interessanten Stellen (so gut wie allen oben genannten). Und ich finde heraus, dass DecryptCBC aufgerufen wird. Somit weiß ich mit sehr hoher Wahrscheinlichkeit dass der CBC-Modus benutzt wird. Nachdem ich bei &#8220;Init&#8221; und &#8220;InitStr&#8221; breake (leider auf dem Bild nicht zu sehen), sehe ich im EDX Register den Schlüssel. Und, wie hätte man es sonst erwartet, ist es der Hash den wir oben berechnet hatten!</p>
<p>Schritt 8 =&gt; Unsere Vermutung ist also, dass der Dateiinhalt per Twofish entschlüsselt wird. Und der Key ist der konstante Hash, den wir oben herausgefunden hatten. Nun holen wir uns irgendeine Scriptsprache, für die es eine fertige Twofish-Bibliothek gibt. Leider hat es das weder Python (jedenfalls keine funktionierende) noch Ruby. Aber PHP hat mcrypt. Also greiffe ich auf PHP! Ich hatte keine Lust auf PHP, und die Einarbeitung in MCrypt, also habe ich mir schnell von den Beispielcodes etwas zusammenkopiert. Den Decrypter braucht ja sowieso niemand.</p>
<p>Ich finde nur noch kurz heraus, wie die Daten im Plaintext strukturiert sind, damit man sie auslesen kann (alle Daten sind per 0&#215;01 voneinander getrennt. Ganz easy!) und es entsteht (Schritt 9) ein Decrypter:</p>
<p style="text-align: center;">
<div id="attachment_343" class="wp-caption aligncenter" style="width: 242px"><a href="http://41yd.de/blog/wp-content/decrypted.png"><img class="size-full wp-image-343" title="decrypted" src="http://41yd.de/blog/wp-content/decrypted.png" alt="" width="232" height="454" /></a><p class="wp-caption-text">Entschlüsselt, und sortiert ausgegebener Inhalt der SWL-Datei</p></div>
<p style="text-align: center;"><em>Schachmatt! SWL wurde geknackt! <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
</em></p>
<p style="text-align: center;"><a title="http://41yd.de/blog/swl.php.txt" href="http://41yd.de/blog/swl.php.txt" target="_blank"><strong>Download</strong></a><em><br />
</em></p>
<p>Ein Teil dieses Blogeintrages wurde auf der Toilette verfasst. Normale Menschen lesen Zeitung auf dem Klo. Geeks bloggen. Vermutlich einer der Gründe wieso ich so viel Scheisse auf dem Blog produziere (Ah, ich liebe Wortspiele!)</p>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2010/01/17/salzwasser-sauger/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Code makers and breakers (SFT geknackt)</title>
		<link>http://41yd.de/blog/2009/07/10/code-makers-and-breakers/</link>
		<comments>http://41yd.de/blog/2009/07/10/code-makers-and-breakers/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 10:25:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=213</guid>
		<description><![CDATA[Nun, wie soll ich anfangen? Soll ich wieder berichten, dass mir langweilig war? Nee, das kommt in jedem Blogpost vor (verdammt, jetzt habe ich es doch getan!).
Als ich gerade damit beschäftigt war die Software von der Firma, bei der ich zurzeit Praktikum mache, etwas sicherer vor Crackern zu machen, fiel mir auf, dass ich nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Nun, wie soll ich anfangen? Soll ich wieder berichten, dass mir langweilig war? Nee, das kommt in jedem Blogpost vor (verdammt, jetzt habe ich es doch getan!).</p>
<p>Als ich gerade damit beschäftigt war die Software von der Firma, bei der ich zurzeit Praktikum mache, etwas sicherer vor Crackern zu machen, fiel mir auf, dass ich nicht so viel Ahnung davon habe. Hm,  Software sicherer machen &#8230; hm das kann ich nicht so gut &#8230; aber die Sicherheit zu brechen, das macht Spaß!</p>
<p>Software sichern &#8230; hm &#8230; Ich mein, &#8220;sichern&#8221; im typischen Sinne kann man es ja nicht einmal. Es liegt in der Natur der Sache, dass ein ausführbares Programm analysierbar bleibt. Nur wie kann man es so erschweren, dass jeder Reverser die Lust verliert?</p>
<p>Auf der Suche nach der Antwort lud ich mir ein paar CrackMe&#8217;s runter, um unter dem Vorwand von &#8220;Anti Debugging Technik erlernen&#8221; etwas bei der Arbeit cracken zu können <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Acht Stunden und unzählige fertige CrackMe&#8217;s später fuhr ich nach Hause &#8230; ich war immernoch hungrig nach mehr &#8230; mehr hardcore Assembler &#8230; mehr Geheimnisse entlüften &#8230; mehr Glückgsgefühle &#8230; mehr davon. Ich kramte auf meinem USB-Stick rum, und fand eine alte version des <a title="http://www.sft-loader.de/" href="http://www.sft-loader.de/" target="_blank">SFT-Loaders</a> (&#8220;SFT Loader 2006&#8243;). Nach meinem letzten <a title="http://41yd.de/blog/2008/11/15/dlc-geknackt/" href="http://41yd.de/blog/2008/11/15/dlc-geknackt/" target="_blank">Beitrag über DLC</a>, und <a title="http://41yd.de/blog/2008/01/10/rsdf-reverse-engineering/" href="http://41yd.de/blog/2008/01/10/rsdf-reverse-engineering/" target="_blank">über RSDF</a>, dachte ich mir, es wäre doch praktisch meine Kenntnisse im Gebiet der Analyse von unbekannten Formaten auszuweiten. Diese SFT Dateien bieten einige Warez-Seiten an. Kennt das überhaupt noch jemand? <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Einige wenige Seiten scheinen das noch anzubieten. Wie auch immer, meinen Spaß hatte ich jedenfalls damit <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>In der SFT Datei sind (verschlüsselt) Host, Username, Passwort, Dateinamen und einige Optionen hinterlegt. Sodass dieses Programm es entschlüsseln, und dann von den FTP-Servern die Dateien herunterladen kann. Das wollte ich unbedingt mal analysieren, sollte doch sicher spaßig werden?</p>
<div id="attachment_214" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/sft-loader-2006.jpg"><img class="size-medium wp-image-214" title="sft-loader-2006" src="http://41yd.de/blog/wp-content/sft-loader-2006-300x225.jpg" alt="sft-loader-2006" width="300" height="225" /></a><p class="wp-caption-text">SFT Loader 2006</p></div>
<p>Gesagt getan. In einer Woche (á 8 Stunden) und noch etwas mehr, war ich fertig. Man, hat das lange gedauert. Ich habe mit einem Aufwand von 1-2 Tagen gerechnet, aber eine Codestelle im Programm hat meinen Kopf gefickt (ja, ich benutze sonst nie diesen Ausdruck, aber dieses Dateiformat hats echt verdient!). Beim reversen wurde mir immer wieder mal schwindelig und ich hielt meinen Kopf fest, damit sich meine Umgebung nicht mehr so merkwürdig bewegt! (und das ist kein Witz!) <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Nun, das SFT Format ist viel cooler als DLC &#8230; nein, nicht sicherer. Sondern etwas komplexer &#8230; also spaßiger zu reversen <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Wer nichts über die Struktur des Formats lernen möchte, der möge das hier überspringen und an das Ende des Artikels springen &#8230; dort findet ihr einen SFT Decrypter <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (Ja, ihr könnt mich hassen, dass ich das tue &#8230;)</p>
<p>Als aller erstes sollte klar werden, es ist wieder <a title="http://de.wikipedia.org/wiki/Security_through_obscurity" href="http://de.wikipedia.org/wiki/Security_through_obscurity" target="_blank">Security-by-Obscurity</a>. Es gibt keinen Weg daran vorbei, wenn man versucht, auf dem Rechner des Users Daten zu verarbeiten, von dem der Nutzer aber nichts wissen soll. Der SFT-Loader MUSS zwangsweise irgendwann die Daten entschlüsseln. Was ich nun mache ist es, zu analysieren wie dieses Programm es genau macht. Wie generiert es sich seinen Schlüssel? Welche Algorithmen werden verwendet? In welcher Stelle der Datei befinden sich die Daten? Dazu bedient man sich des <a title="http://de.wikipedia.org/wiki/Reverse_Engineering" href="http://de.wikipedia.org/wiki/Reverse_Engineering" target="_blank">Reverse Engineering.</a></p>
<p><a title="http://de.wikipedia.org/wiki/Kerckhoffs%E2%80%99_Prinzip" href="http://de.wikipedia.org/wiki/Kerckhoffs%E2%80%99_Prinzip" target="_blank">Kerckhoffs Prinzip</a> besagt, dass die Sicherheit eines Verschlüsselungsverfahrens auf die Geheimhaltung des Schlüssels beruhen muss, nicht auf die des Algorithmus. In unserem Fall muss jedoch das Programm das Passwort ja wissen, um den Inhalt zu entschlüsseln. Irgendwoher muss es das Passwort ja kriegen. Sei es, indem es sich das selbst generiert (siehe weiter unten) oder ob es einen hardcoded key verwendet. Die Sicherheit ist die selbe, solange ich alles rekonstruieren kann.</p>
<p>Nun, zurück zum Dateiformat: jede SFT Datei hat einen Header. Die ist immer 0&#215;40 (=&gt; 64) Bytes lang. Sie fängt (immer?) mit &#8220;A&#8221; an, gefolgt von einem 0xFF Byte, und dann &#8220;2SFT04&#8243;. Es sollte klar sein, wofür &#8220;SFT&#8221; steht. Die &#8220;2&#8243; ist mir noch nicht ganz klar. Die &#8220;04&#8243; allerdings steht für die Dateiversion. Soweit ich weiß, ist dies die aktuellste Version des Formats. (Jedenfalls war es das 2006)</p>
<div id="attachment_215" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/header.jpg"><img class="size-medium wp-image-215" title="SFT Header" src="http://41yd.de/blog/wp-content/header-300x47.jpg" alt="SFT Header" width="300" height="47" /></a><p class="wp-caption-text">SFT Header</p></div>
<p>Danach folgen weitere 0xFFs bis die 0&#215;40 Bytes voll sind. Nun ist der Header fertig, und der eigentliche Content folgt. Dieser ist mit zlib komprimiert. Einfach dekomprimieren (am einfachsten mit einem <a title="http://www.python.org/doc/2.5.2/lib/module-zlib.html" href="http://www.python.org/doc/2.5.2/lib/module-zlib.html" target="_blank">Python script</a>) und schon hat man den dekomprimierten Inhalt. Dieser ist allerdings noch verschlüsselt. Der Algorithmus für die Verschlüsselung ist RC4. Wobei wie immer die Sicherheit des Algorithmus ziemlich egal ist, solange der Schlüssel irgendwo abgespeichert ist.<br />
Der Schlüssel für RC4 ergibt sich aus dem SHA1 Wert des Headers. Dafür schneidet man den ersten Byte (also das &#8220;A&#8221;) des Headers heraus, fügt ans Ende zwei 0xFF hinzu und hasht es dann mit SHA1. Das Resultat ist unser Key. Gewöhnlicher Weise ist es immer die selbe:</p>
<blockquote><p>7CBEB0CF896EC8DE4F54A2850E6C73B38E95EA06</p></blockquote>
<p>Mit diesem Key entschlüsseln wir den Dateiinhalt. Und es erscheint uns der serialisierte (aber entschlüsselte) Inhalt der Datei.</p>
<div id="attachment_216" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/decrypted.jpg"><img class="size-medium wp-image-216" title="Entschlüsselter Inhalt" src="http://41yd.de/blog/wp-content/decrypted-300x80.jpg" alt="Entschlüsselter Inhalt" width="300" height="80" /></a><p class="wp-caption-text">Entschlüsselter Inhalt</p></div>
<p>Von hier an ist es nicht mehr viel. Man kann einfach den Inhalt splitten, und die einzelnen Werte auslesen. Die einzelnen Base64-Strings die dort zu finden sind, sind entweder mit dem SHA512 Hash von &#8220;SFT Loader Reloaded&#8221; oder &#8220;callstackapi&#8221;, (mit dem RC4 Algorithmus) zu entschlüsseln. Hierbei hatte ich ein paar Probleme, da meine python library einen Fehler drin hatte (man, ich musste den verdammten RC4 Algorithmus fast nachbauen um den Fehler zu finden &#8230; der Programmierer hat vergessen beim crypten i und j wieder auf 0 zu setzen, siehe <a title="http://en.wikipedia.org/wiki/RC4#The_pseudo-random_generation_algorithm_.28PRGA.29" href="http://en.wikipedia.org/wiki/RC4#The_pseudo-random_generation_algorithm_.28PRGA.29" target="_blank">The Pseudo-Random Generation Algorithm</a>)</p>
<p>Nach einigem rumprobieren und surfen fand ich heraus, dass der Programmierer eine nicht-standardisierte Verschlüsselung verwendet, die nirgendwo dokumentiert ist. Das wäre natürlich der total Krampf im Arsch (ja, ich weiß dass es falsch übersetzt ist) den ganzen Algorithmus auch noch zu reversen. Aber glücklicherweise fand ich <a title="http://www.delphipraxis.net/post353886.html&amp;sid=af3f95a77f9d4bc04eec45a2c0084082#353886" href="http://www.delphipraxis.net/post353886.html&amp;sid=af3f95a77f9d4bc04eec45a2c0084082#353886" target="_blank">diese Komponente</a>, welches wohl dieses Verfahren überhaupt erfunden hat. Sie nennt sich RCx und ist ein selbstprogrammierter Algorithmus, angelehnt an <a title="http://de.wikipedia.org/wiki/RC5" href="http://de.wikipedia.org/wiki/RC5" target="_blank">RC5</a>. Also entweder wollte ich ein Delphi Programm schreiben (und diese Komponente verwenden), Strings entschlüsseln und an mein Programm pipen lassen, oder den ganzen Algorithmus selbst implementieren. Ersteres fiel weg, da ich keinem User aufzwingen möchte, Wine zu installieren. Also baute ich den Algorithmus nach. Nach rund 92 Zeilen Code, und 2 Tage debugging (Python hat wohl kein &#8220;Byte&#8221; als Dateityp, das war wie ein Tritt in die Weichteile) war meine kleine RCx Klasse fertig. Damit kann man wahrlich die einzelnen Werte endgültig entschlüsseln.</p>
<p>Vorerst knöpft man sich das &#8220;Header&#8221; Element vor (siehe Bild oben). Aus diesem ergibt sich ein String wie folgt:</p>
<blockquote><p>SFT0#2#D7D05C8DEED489B6C6981D9A6E8D79315C8F2D41A7AC229B385C2A2B73A7959C65F07C7D7CE4F1D6CA7A79E0C2A4847E5587079ACF</p></blockquote>
<p>SFT am Anfang zeigt uns wieder, dass es korrekt entschlüsselt wurde (mit dem erwähnten RCx Algorithmus). Die &#8220;0&#8243; direkt danach gibt an, ob ein Passwort notwendig ist (in diesem Fall also nicht). Ich weiß nicht genau wofür die nachfolgende &#8220;2&#8243; ist (Maximale Threads oder so ?) aber alles nach dem letzten &#8220;#&#8221; ist der Wert, den es zu entschlüsseln gilt. Dafür wurde ein (selbstentwickeltes?) XOR und Salt-System genutzt. Der Salt-Wert ist &#8220;callstackapi&#8221;. Hierdran wird einfach das eingegebene Passwort angehangen, oder ggf. nichts angehangen. Den XOR-Algorithmus kann man wie folgt beschreiben:</p>
<blockquote><p>def YurryXOR(key):<br />
raw_key = hashlib.sha512(key).digest()<br />
raw_key = raw_key[:(len(raw_key)/2)]<br />
result = []<br />
key = key*10<br />
for i in range(0, len(raw_key)):<br />
result.append(chr(ord(raw_key[i]) ^ ord(key[i])))<br />
return &#8221;.join(result)</p></blockquote>
<p>Kleine Erklärung: Der key ist das erwähnte callstackapi+password. Daraus wird ein SHA512 Wert generiert. Die letzte Hälfte wird rausgelöscht. Nun wird der nicht-gehashte Key mit dem gehashten geXORed. Und das Ergebnis ist unser Key.</p>
<blockquote><p>de5a015215664d925bf3e9f97477caee4ef7a44f6a3d0ee08bf70f1f326e41c7</p></blockquote>
<p>Sowas in der Art (btw, ich benutze für diese Demonstration <a title="http://www.sft-loader.de/sft-downloads/download-sft-testdownload/" href="http://www.sft-loader.de/sft-downloads/download-sft-testdownload/" target="_blank">diese Testdatei</a>).</p>
<p>Das ist unser Yurry-Key (die habe ich nach meinem Schatz benannt. Haiiii schatziii &lt;3 <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Mit dieser kann man ganz schmutzige Sachen machen (nein, nicht mit meinem Schatz du Perverser! Ich meine den Key!). Haben wir diesen erstmal, stehen uns alle Wege offen. Diesen Key können wir an unser Header-Element anwenden, und somit erhalten wir einen Wert, der exakt so aussieht wie das hier:</p>
<blockquote><p>{1F945Z9B-3ZA9-4Q13-A5DB-KDKDKFLDSHGVFBV}</p></blockquote>
<p>(Anfangs sind noch 20 zufällige Bytes, die angehanden wurden. Das ist wohl so eine Eigenschaft vom Algorithmus. Die kann man gefahrlos rauslöschen).</p>
<p>Das sieht aus wie eine Seriennummer, ist es aber nicht. Dieser Wert wird nur verwendet, um zu schauen ob der User das richtige Passwort eingegeben hat.</p>
<p>Mit dem gleichen Algorithmus und dem gleichen Key, ist es nun möglich alle anderen Elemente zu entschlüsseln (Host, Username, Passwort etc.)</p>
<div id="attachment_217" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/sft-decrypter.jpg"><img class="size-medium wp-image-217" title="sft-decrypter" src="http://41yd.de/blog/wp-content/sft-decrypter-300x150.jpg" alt="sft-decrypter" width="300" height="150" /></a><p class="wp-caption-text">sft-decrypter</p></div>
<p>Das wars auch schon. Man kann noch durch alle Dateinamen gehen, wenn man möchte. Ich denke, das werde ich bei Gelegenheit mal machen, und dem PyLoad Projekt ein SFT-Plugin schenken (auch wenn dies kein Dateiformat für One-Click-Hoster ist).</p>
<p>Nachdem letztens schon wieder ein <a title="http://www.wired.com/threatlevel/2009/07/hacker/" href="http://www.wired.com/threatlevel/2009/07/hacker/" target="_blank">Hacker Selbstmord begangen</a> hat, ist mir der Fall <a title="http://de.wikipedia.org/wiki/Tron_%28Hacker%29" href="http://de.wikipedia.org/wiki/Tron_%28Hacker%29" target="_blank">Tron</a> (ein Hacker der Verschlüsselungen geknackt hatte) wieder eingefallen. Um exakter zu sein, dass was er den Polizisten bei einer Hausdurchsuchung mal sagte: &#8220;Man kann das Anwenden<br />
von mathematischen Formeln doch nicht unter Strafe stellen?!&#8221; (aus dem Buch &#8220;Tron &#8211; Tod eines Hackers&#8221;).</p>
<p>Ich schreibe später eventuell ein Reverse Engineering Paper hierdrüber, da dieses Target ziemlich lehrreich war!</p>
<p>Ein letztes noch: Es ging hier natürlich wiedermal nicht um das Endresultat, sondern um den Weg. Denn an Username&amp;Passwort der SFT Datei, käme man auch durch <a title="http://www.denktfrei.de/?p=32" href="http://www.denktfrei.de/?p=32" target="_blank">Sniffer</a>, Proxies oder ein paar Spielereien mit der Hosts-Datei. Wie J. J. Abrams bereits einmal sagte, es geht nicht um das Ende (die Auflösung des Ganzen). Sondern die Zeit, die man damit verbringt <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (Gemeint war die Serie Lost, aber passt auch hierzu!).</p>
<p>Verschließt eure Augen nicht vor der Wahrheit! Speichert eure sensiblen Daten nicht in einem undurchsichtigen proprietären Dateiformat. Das ist wie mit WEP. Indem nun jeder Witzbold in ein WEP-Netzwerk einbrechen kann, hat man den Leuten die Augen geöffnet: Verwendet nicht WEP! Und viele (wenn auch bei weitem nicht jeder) haben die Gefahr erkannt. Indem man aber nun einfach sturr und blind bleibt, und meint, weil WEP gebrochen wurde, wäre die ganze Sicherheit um WEP kaputt, irrt sich. Es war schon immer unsicher, nur wurde diesmal einfach nur bewiesen, dass es so ist. Und wer meint ich hätte mit diesen frei zugänglichen Informationen irgendetwas kaputt gemacht, ist naiv. Ich habe nur Informationen veröffentlicht, die jeder SFT User auf dem Rechner hat. Nur hat es wohl keiner vorher einer Analyse unterzogen. Wie dem auch sei:</p>
<p style="text-align: center; font-size: 1.5em;"><strong><a title="http://41yd.de/blog/wp-content/code/sft.tar.gz" href="http://41yd.de/blog/wp-content/code/sft.tar.gz" target="_blank">DOWNLOAD: SFT-DECRYPTER</a></strong></p>
<p style="text-align: center; font-size: 1.5em;"><strong>oder: <a title="http://41yd.de/blog/wp-content/SFT-Decrypter_GUI_1.4_Beta.rar" href="http://41yd.de/blog/wp-content/SFT-Decrypter_GUI_1.4_Beta.rar" target="_blank">SFT-DECRYPTER + GUI</a> (benötigt Java) von Seji<br />
</strong></p>
<p style="text-align: center;"><strong>//edit 17.07.09 &gt;&gt;&gt; kleines Update. Bugfixxes und ein paar Feature-Requests (Ordner und Dateiname anzeigen) wurden realisiert. Es werden nicht alle Dateinamen und Ordner angezeigt, sondern nur die ersten, habe gerade keine Lust das noch einzubauen. Dennoch viel Spaß <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2009/07/10/code-makers-and-breakers/feed/</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
		<item>
		<title>Real-Life</title>
		<link>http://41yd.de/blog/2009/06/24/real-life/</link>
		<comments>http://41yd.de/blog/2009/06/24/real-life/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 18:39:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=189</guid>
		<description><![CDATA[Momentan mache ich Praktikum bei einer Firma, die unter anderem Software entwickelt. Bei meinem Vorstellungsgespräch erwähnte ich meine persönliche Webseite (eine Seite unter meinem echten Namen) woraufhin diese sich dort umgesehen haben. Was war wohl auf meiner persönlichen Webseite? Na klar, das Thema Computersicherheit kam nicht zu kurz. Also bat mich meine Ansprechperson in der [...]]]></description>
			<content:encoded><![CDATA[<p>Momentan mache ich Praktikum bei einer Firma, die unter anderem Software entwickelt. Bei meinem Vorstellungsgespräch erwähnte ich meine persönliche Webseite (eine Seite unter meinem echten Namen) woraufhin diese sich dort umgesehen haben. Was war wohl auf meiner persönlichen Webseite? Na klar, das Thema Computersicherheit kam nicht zu kurz. Also bat mich meine Ansprechperson in der Firma direkt am ersten Tag, ihre Software (die btw seit über 10 Jahren entwickelt wird, respekt!) etwas sicherer vor Reverse Engineerer zu machen. Alles klar, das dürfte spaßig werden!</p>
<p>Nundenn, da ich generell interessiert bin, an allem was mit Sicherheit und Einbruch zu tun hat (hey, ich bin Ausländer, das liegt mir im Blut <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ) dachte ich mir, ich könnte in den Pausen ja mal bisschen gucken, wie die Firma strukturiert ist. Netzwerktechnisch und auch sonst.</p>
<p>Am ersten Tag bekam ich eine Karte, die nötig ist um die Türen öffnen können. Die Firma hat tausende von Mitarbeitern, da ist natürlich klar, dass professionelle Sicherheitssysteme eingesetzt werden. <strong>*edit*</strong> Die Kommentare hatten mal wieder Recht. Es war nur eine stinklangweilige RFID Karte <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Habe gerade den Shop gefunden, wo die exakt die selben Karten anbieten.</p>
<p>Nundenn. Ich war amüsiert davon. Meine 8-Stunden Schicht war zuende, also mache ich mich in Richtung Bahnhof (der an einem Flughafen liegt). Da ich noch ein paar Minuten warten kann, gehe ich in ein Wartezimmer.</p>
<p style="text-align: center;"><a href="http://41yd.de/blog/wp-content/hni_0020.jpg"><img class="size-medium wp-image-191 aligncenter" title="Wartezimmer" src="http://41yd.de/blog/wp-content/hni_0020-300x225.jpg" alt="Wartezimmer" /></a></p>
<p>(Das Foto wurde btw mit meiner DSi aufgenommen. Ich liebe das Teil &lt;3 Habe es immer mit um Pi zu hören &#8230; jaja meckert nur &#8230; pi for president!)</p>
<p>Jedenfalls denke ich mir, total gelangweilt, &#8220;Hm, was könnte man hier so schönes machen&#8221;. Ok, ich bin an einem Flughafen, ich bin Ausländer, und habe einen Koffer dabei <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Spaß beiseite &#8230; das einzig coole waren die Bewegungssensoren, die die Türen automatisch öffnen &#8230; langweilig *gähn* Dann gibts da noch diese Fernseher. Alles öde. Ich wollte mich gelangweilt an einen Platz hinsetzen und sehe das:</p>
<p style="text-align: center;"><a href="http://41yd.de/blog/wp-content/hni_00211.jpg"><img class="size-medium wp-image-200 aligncenter" title="Fernseher" src="http://41yd.de/blog/wp-content/hni_00211-300x225.jpg" alt="Fernseher" /></a></p>
<p>Also frage ich mich wie von der Stille und der Langweile betäubt, woher der Fernseher die aktuellen Daten bekommt (wann der Flug ist etc.). Oben sind die Wände &#8220;offen&#8221;, sodass man alle Kabeln sieht. Bei näherer Betrachtung des Fernsehers sehe ich folgendes:</p>
<p style="text-align: center;"><a href="http://41yd.de/blog/wp-content/hni_00221.jpg"><img class="size-medium wp-image-201 aligncenter" title="Fernseher aus der Nähe" src="http://41yd.de/blog/wp-content/hni_00221-300x225.jpg" alt="Fernseher aus der Nähe" /></a></p>
<p>Oh cool. Da sehe ich Kabeln. Mal näher daran gehen, oder? Dürfte cool sein zu sehen, wohin es führt.</p>
<p style="text-align: center;"><a href="http://41yd.de/blog/wp-content/hni_0023.jpg"><img class="size-medium wp-image-194 aligncenter" title="Kabel" src="http://41yd.de/blog/wp-content/hni_0023-300x225.jpg" alt="Kabel" /></a></p>
<p>Moment &#8230; ist das etwa &#8230; ist das? Nee oder ? Schauen wir uns das mal etwas näher an:</p>
<p style="text-align: center;"><a href="http://41yd.de/blog/wp-content/hni_0024.jpg"><img class="size-medium wp-image-195 aligncenter" title="Kabel2" src="http://41yd.de/blog/wp-content/hni_0024-300x225.jpg" alt="Kabel2" /></a></p>
<p>Das sieht doch echt aus wie ein LAN Kabel oO Was macht ein LAN Kabel am Fernseher? Und wieso ist es so &#8220;offen&#8221; und frei verlegt? Mal näher schauen</p>
<div id="attachment_197" class="wp-caption alignright" style="width: 310px"><a href="http://41yd.de/blog/wp-content/hni_0028.jpg"><img class="size-medium wp-image-197 " title="LAN Nah" src="http://41yd.de/blog/wp-content/hni_0028-300x225.jpg" alt="LAN Nah" width="300" height="225" /></a><p class="wp-caption-text">LAN Nah</p></div>
<div id="attachment_196" class="wp-caption alignleft" style="width: 310px"><a href="http://41yd.de/blog/wp-content/hni_0027.jpg"><img class="size-medium wp-image-196 " title="LAN" src="http://41yd.de/blog/wp-content/hni_0027-300x225.jpg" alt="LAN" width="300" height="225" /></a><p class="wp-caption-text">LAN</p></div>
<p>(btw, sorry für die schlechte Qualität &#8230; DSi halt <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )</p>
<p>OK, erfreuliche Nachrichten. Es ist sehr wahrscheinlich ein Ethernet Anschluss. Und noch besser: Eins ist noch frei <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Hallo Internet am Flughafen, ich komme&#8230;</p>
<p>Wenn ich mich da dranstöpsel, kann ich sehr wahrscheinlich auf das interne Netzwerk zugreiffen. Oder schlimmstenfalls nur die Ausgabe des Fernsehers manipulieren. ODER einfach so einen transportablen WLAN Router dort anstöpseln, merkt sicher sowieso keiner. So könnte ich von aussen aus, in das interne Netzwerk zugreiffen <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ich dachte mir, wäre cool zu wissen wo genau das Kabel angeschlossen ist. Man siehts nicht richtig, aber ich habe mir den Arsch aufgerissen um das Bild hier zu machen:</p>
<div id="attachment_198" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/hni_0034.jpg"><img class="size-medium wp-image-198 " title="Hinten" src="http://41yd.de/blog/wp-content/hni_0034-300x225.jpg" alt="Hinten" width="300" height="225" /></a><p class="wp-caption-text">Hinten</p></div>
<p>Während ich versuche auf dem Sitzplatz zu stehen und die Fotos zu machen, höre ich den Aufzug neben mir aufgehen, und ein Typ aus der Flughafen Security steigt aus. Ich setze mich reflexartig hin. Er schaut mich stechend an, während er raus an die Luft geht, kein Wort sagt, und seine Zigarette anzündet. Dabei schaut er öfter mal rüber. So verdächtigend. Ich bin extra noch sicher gegangen, dass mich keine Kameras beobachten. Aber ich bin gestern schon aufgefallen, als ich total auffällig Fotos von der Sicherheitskamera gemacht habe &#8230; keine 2 Minuten, und ein Securitytyp stand sehr kritisch neben mir <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Danach gings ab nach Hause. Und wie es sich für einen Mann gehört, hat meine Pussy auf mich im Bett gewartet:</p>
<div id="attachment_199" class="wp-caption aligncenter" style="width: 310px"><a href="http://41yd.de/blog/wp-content/hni_0084.jpg"><img class="size-medium wp-image-199 " title="catz &lt;3" src="http://41yd.de/blog/wp-content/hni_0084-300x225.jpg" alt="catz &lt;3" width="300" height="225" /></a><p class="wp-caption-text">(das war eindeutig zweideutig <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p></div>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2009/06/24/real-life/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Phrack #66</title>
		<link>http://41yd.de/blog/2009/06/11/phrack-66/</link>
		<comments>http://41yd.de/blog/2009/06/11/phrack-66/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 18:52:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computersicherheit]]></category>

		<guid isPermaLink="false">http://41yd.de/blog/?p=187</guid>
		<description><![CDATA[
Kill the underground, you won't kill the Hacker culture.

Die neue Phrack ist raus  
http://phrack.org/issues.html?issue=66
Viel Spaß beim Lesen
]]></description>
			<content:encoded><![CDATA[<blockquote>
<pre>Kill the underground, you won't kill the Hacker culture.</pre>
</blockquote>
<p>Die neue Phrack ist raus <img src='http://41yd.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a title="http://phrack.org/issues.html?issue=66" href="http://phrack.org/issues.html?issue=66" target="_blank">http://phrack.org/issues.html?issue=66</a></p>
<p>Viel Spaß beim Lesen</p>
]]></content:encoded>
			<wfw:commentRss>http://41yd.de/blog/2009/06/11/phrack-66/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
