CTF-Challenge #2

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    CTF-Challenge #2

    Hey Leute,

    neuer Monat, neues Glück, eine neue Aufgabe (besser gesagt 3). Der Schwierigkeitsgrad ist nun etwas höher und somit gibt es auch Süßigkeiten im Wert von 40 Euro an denjenigen, der mir als erstes das korrekte Flag per PM zusendet.

    Auf dieser Seite spaceyhome.ddns.net:3000/ gibt es alle Informationen, die zum lösen der Challenge notwendig sind. Sollten irgendwo Fehler auftreten, bitte hier posten.

    Happy Hacking!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Und diesmal heißt der Gewinner @Gonger96 Wirklich meinen allergrößten Respekt...! Das Paket mit Süssigkeiten geht morgen Mittag/Nachmittag raus...! Vielen Dank fürs Mitmachen und evtl. bis nächsten Monat mit einer neuen Challenge....!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Task 1 und 2 waren mir klar, aber wie ging es eigentlich weiter? Falls das denn erzählt hier wird (alternativ gerne als private Nachricht). Mit welcher Methode man sendet, glaube ich zu wissen. Aber das mit confirm und Antwort? Ich glaub ich bin zuwenig in der Netzwerksparte ...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Auflösung kommt morgen oder übermorgen. Im Moment ist noch Aktivität. Sobald keiner mehr connected schalt ich ab... Gonger hat mit Abstand gewonnen....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    hier noch eine Kleinigkeit, die ich gestern Nacht gemacht hab. Gibt keine Preise hierfür, aber evtl. zum Zeitvertreib. Schwierigkeitsgrad: easy....

    spaceyhome.ddns.net:3000/theConsole.html
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Die Lösung....

    Task1

    Die Aufgabenstellung sagt, man soll sich die 2 verlinkten Dateien herunterladen und diese zusammen basteln. Weiter wird der Hinweis gegeben, dass sich hier mehrere Dateien in einer befinden. Soll meinen, dass ein Archiv als Ergebnis rauskommt. Zusammengebastelt wird folgendermaßen. In der ersten Textdatei befinden sich alle möglichen Zahlen, in der zweiten nur Zahlen zwischen 1 und 3. Denkt man ein bisschen darüber nach, so mag man zu dem Schluss kommen, dass die Zahlen in text2.txt wohl die Längen darstellen, die von text1.txt gelesen werden müssen, um letztendlich die Bytes für das Archiv zu erhalten. Die erste Zahl in text2.txt hat den Wert 2, somit liest man 2 Zeichen aus der text1.txt, wandelt dies in ein Byte und packt es in eine Liste. Die 2. Zahl aus text2.txt ist ebenfalls 2, somit liest man ab Stelle 3 in der text1.txt abermals 2 Zeichen... usw. usw.....

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. string file1 = File.ReadAllText("text1.txt");
    4. string file2 = File.ReadAllText("text2.txt");
    5. List<byte> result = new List<byte>();
    6. int c = 0;
    7. for (int i = 0; i < file2.Length; i++)
    8. {
    9. int value = int.Parse(file2[i].ToString());
    10. byte byteValue = byte.Parse(file1.Substring(c, value));
    11. result.Add(byteValue);
    12. c += value;
    13. }
    14. File.WriteAllBytes("file.zip", result.ToArray());
    15. }


    Das Ergebnis ist ein .zip-Archiv, welches man öffnen kann... Darin befinden sich folgende Dateien: SxExtensions.dll, SxExtensions.xml, SxExtensions.pdb und sourceCode.txt

    Leute, die sich mit .NET auskennen, haben hier einen Vorteil. Sie müssen nur die .dll einbinden. Für den Rest ist der sourceCode dabei.

    Task2

    Hier liest man, dass man sich mit dem Server verbinden soll, der einem eine Grußnachricht mit der Länge 184 Byte sendet, danach ist man auf sich selbst gestellt und man muss rausfinden, wie der Server arbeitet.

    Lösungsweg:

    Zuerst kümmert man sich um die WelcomeMessage, in etwa so....

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    4. byte[] buffer = new byte[184];
    5. int r = 0;
    6. s.Connect("spaceyhome.ddns.net", 18891);
    7. r = s.Receive(buffer, SocketFlags.None);
    8. if (r > 0)
    9. {
    10. Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, r));
    11. }
    12. else
    13. {
    14. return;
    15. }
    16. s.Close();
    17. Console.ReadLine();
    18. }


    Die WelcomeMessage gibt ein paar Hinweise:

    This is a packet server. Pls stick to the protocol. Only Packets are allowed. Every packet requires a confirmPacket. The server will confirm every packet u sent as well.... Have fun!!!

    Erstens sind nur Packets erlaubt. Wer sich die .dll aus Task1 angesehen hat, findet dort die entsprechende Klasse. Zweitens verlangt der Server ein Bestätigungspaket für jedes gesendete Paket und umgekehrt. Jedes Paket an den Server wird vom Server ebenfalls bestätigt. Spätestens jetzt ist der Punkt gekommen, wo man sich mit der Packet-Klasse (SourceCode oder ObjectBrowser) auseinandersetzen muss. Irgendwann stößt man dann auf dieses Enum:

    C#-Quellcode

    1. public enum PacketTypes
    2. {
    3. /// <summary>
    4. /// Payload contains plain text.
    5. /// </summary>
    6. Text = 0,
    7. /// <summary>
    8. /// Payload contains file-information.
    9. /// </summary>
    10. AnnounceFile = 1,
    11. /// <summary>
    12. /// Payload contains file bytes.
    13. /// </summary>
    14. File = 2,
    15. /// <summary>
    16. /// Payload contains a system message as text.
    17. /// </summary>
    18. System = 3,
    19. /// <summary>
    20. /// Payload contains a service message as text.
    21. /// </summary>
    22. Service = 4,
    23. /// <summary>
    24. /// Paylood contains user information as text.
    25. /// </summary>
    26. UserLogon = 5,
    27. /// <summary>
    28. /// Payload contains the sequence number u want to request.
    29. /// </summary>
    30. RequestSequcence = 6,
    31. /// <summary>
    32. /// Payload contains information about the stored sequences.
    33. /// </summary>
    34. GetServerInformation = 7,
    35. /// <summary>
    36. /// Payload contains user information.
    37. /// </summary>
    38. Logoff = 8,
    39. /// <summary>
    40. /// Payload contains a random string. Send this to confirm the reception of a packet.
    41. /// </summary>
    42. ConfirmPacket = 9,
    43. /// <summary>
    44. /// The payload contains the flag.
    45. /// </summary>
    46. FlagSubmit = 10
    47. }


    Ins Auge stechen sollte GetServerInformation. Contains information about the stored sequences. Immer zu beachten ist das Senden und Empfangen des confirmPacktes.

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    4. byte[] buffer = new byte[184];
    5. int r = 0;
    6. //WelcomeMessage
    7. s.Connect("spaceyhome.ddns.net", 18891);
    8. r = s.Receive(buffer, SocketFlags.None);
    9. if (r == 0)
    10. {
    11. s.Close();
    12. return;
    13. }
    14. Packet p = Packet.CreatePackets(PacketTypes.GetServerInformation, "")[0];
    15. Packet response = null;
    16. if (p.SendPacket(s))
    17. {
    18. while (true)
    19. {
    20. response = Packet.ReceivePacket(s);
    21. if (response != null && response.PacketType == PacketTypes.ConfirmPacket)
    22. {
    23. Console.WriteLine(response.ToString()); //Kann man sich ausgeben lass oder nicht.
    24. continue;
    25. }
    26. else
    27. {
    28. Packet confirm = Packet.CreatePackets(PacketTypes.ConfirmPacket, "")[0];
    29. if (!confirm.SendPacket(s))
    30. {
    31. break;
    32. }
    33. }
    34. Console.WriteLine(response.ToString());
    35. }
    36. }
    37. s.Close();
    38. Console.ReadLine();
    39. }


    Nachdem man die Kommunikation einigermaßen verstanden hat, bekommt man durch Senden von RequestServerInformation das zurückgeliefert:

    PacketType: System, Sequence: 2281405234 1/1, PayloadLength: 109, PayloadText: Stored sequences: 4043078796, 3217517613, 369094476, 240610595, 914613625, 1815385280, 3585028756, 3744240620

    Wenn man das Enum aufmerksam durchgelesen hat, hat man auch dies gefunden: RequestSequence Wohl eine Möglichkeit, eine bestimmte Sequenz vom Server anzufordern....

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    4. byte[] buffer = new byte[184];
    5. int r = 0;
    6. //WelcomeMessage
    7. s.Connect("spaceyhome.ddns.net", 18891);
    8. r = s.Receive(buffer, SocketFlags.None);
    9. if (r == 0)
    10. {
    11. s.Close();
    12. return;
    13. }
    14. Packet p = Packet.CreatePackets(PacketTypes.RequestSequcence, "3744240620")[0];
    15. Packet confirmPacket = null;
    16. List<Packet> filePackets = new List<Packet>();
    17. Packet response = null;
    18. if (p.SendPacket(s))
    19. {
    20. while (true)
    21. {
    22. response = Packet.ReceivePacket(s);
    23. confirmPacket = Packet.CreatePackets(PacketTypes.ConfirmPacket, "")[0];
    24. if(response == null)
    25. {
    26. break;
    27. }
    28. if (response.PacketType == PacketTypes.ConfirmPacket)
    29. {
    30. Console.WriteLine(response.ToString()); //Kann man sich ausgeben lass oder nicht.
    31. continue;
    32. }
    33. else if (response.PacketType == PacketTypes.AnnounceFile)
    34. {
    35. filePackets = new List<Packet>();
    36. filePackets.Add(response);
    37. }
    38. else if (response.PacketType == PacketTypes.File)
    39. {
    40. filePackets.Add(response);
    41. if (response.SequenceNumber == response.SequenceSize)
    42. {
    43. List<byte> fileBytes = new List<byte>();
    44. string filename = filePackets[0].GetPayloadAsText();
    45. for (int i = 1; i < filePackets.Count; i++)
    46. {
    47. fileBytes.AddRange(filePackets[i].GetPayload());
    48. }
    49. File.WriteAllBytes(filename, fileBytes.ToArray());
    50. }
    51. }
    52. Console.WriteLine(response.ToString());
    53. if (!confirmPacket.SendPacket(s))
    54. {
    55. break;
    56. }
    57. }
    58. }
    59. s.Close();
    60. Console.ReadLine();
    61. }


    Dies macht man nun mit allen 8 Sequences, die auf dem Server vorhanden sind. Hilfreich ist es auch, wenn man in der Packet-Klasse die Packet.Receive() und .Send() Funktionen gesehen hat. Merken muss man außerdem, dass ein beginnender FileTransfer immer mit einem AnnounceFile-Packet begonnen wird. Die Payload beinhalted in diesem Fall den Dateinamen. Man empfängt nun solange FilePackets, bis die SequenceNumber gleich der SequenceSize ist. Danach schreibt man die empfangenen Bytes in eine Datei und benennt sie entsprechend. Resultat sind dann 8 Dateien....

    f1.txt
    f2.txt
    f3.txt
    f4.txt









    Task3

    Die Aufgabe hier besteht darin, die 4 Bilder richtig zusammenzufügen und vor allem die Farbtiefe beizubehalten. Hier hilft Paint.NET oder ein anderes Bildbearbeitungsprogramm. Die Textdateien enthalten durch Komma getrennte Zahlen. Dies sind Koordinaten (x, y). Fügt man diese zusammen erhält man das:

    50,100,181,250,47,19,100,151,101,153,102,199,117,196,36,19,56,93,114,266,159,230,198,14,102,16,4,280,116,23,137,249,88,44,12,112,99,99,86,23,115,122,136,263,166,64,189,189,133,145,78,178,93,289

    Das korrekte Bild sieht so aus:



    Die Aufgabenstellung gibt den Hinweis - start up and left. Sollte meinen, dass man die Koordinaten aus den Textdateien erst nach y und dann nach x sortiert. Offensichtlich war der Hinweis auf die Farbe grün. Man liest einfach den grün-Wert an den entsprechend sortierten Koordinaten und bastelt sich daraus einen String:

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. string[] coordinates = "50,100,181,250,47,19,100,151,101,153,102,199,117,196,36,19,56,93,114,266,159,230,198,14,102,16,4,280,116,23,137,249,88,44,12,112,99,99,86,23,115,122,,136,263,166,64,189,189,133,145,78,178,93,289"
    4. .Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    5. List<Point> points = new List<Point>();
    6. Bitmap image = new Bitmap("result.png");
    7. List<byte> result = new List<byte>();
    8. for (int i = 0; i < coordinates.Length; i += 2)
    9. {
    10. int x = int.Parse(coordinates[i]);
    11. int y = int.Parse(coordinates[i + 1]);
    12. points.Add(new Point(x, y));
    13. }
    14. points = points.OrderBy(x => x.Y).ThenBy(x => x.X).ToList();
    15. for (int i = 0; i < points.Count; i++)
    16. {
    17. result.Add(image.GetPixel(points[i].X, points[i].Y).G);
    18. }
    19. Console.WriteLine(Encoding.UTF8.GetString(result.ToArray()));
    20. Console.ReadLine();
    21. }


    FLAG=DownTheRabbitHoleUWent

    Dieses Flag ist aber falsch. Letztendlich muss man dieses Flag noch an den Packet-Server senden.... Zu verwenden ist hier ein Packet vom Typ FlagSubmit, damit das richtige Flag zurückkommt.

    C#-Quellcode

    1. Packet p = Packet.CreatePackets(PacketTypes.FlagSubmit, "FLAG=DownTheRabbitHoleUWent")[0];




    Puh, das war schon Einiges. Diese Challenge wurde auch noch an anderer Stelle gepostet. Geschätzt haben sich ca. 150 Leute daran probiert. @Gonger96 war der einzige, der es geschafft hat. Die Aktivität hat nun auch nachgelassen und ich werd den Server heute abschalten.

    Danke nochmal an Alle fürs Mitmachen, mir hat es Spass gemacht, einfach zuzusehen!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()

    So, über 7kg an Süssigkeiten sind eben an @Gonger96 rausgegangen... Lass es Dir schmecken!!!
    Bilder
    • IMG_20190805_210036.jpg

      8,26 MB, 4.032×3.024, 146 mal angesehen
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o