AIRBUS | NETWORK50 [WRITEUP]

– For this challenge, a .pcap file was given :

    $ file CHALLENGE.pcap
    CHALLENGE.pcap: tcpdump capture file (little-endian)

– Since I discovered scapy, which is a python library, I use it with Wireshark or
tshark or tcpdump. So, let’s have a look at this capture using scapy :

    In [1]: from scapy.all import *
    In [2]: pk = rdpcap("CHALLENGE.pcap")
    In [3]: pk
    Out[3]: <CHALLENGE.pcap: TCP:51 UDP:0 ICMP:0 Other:0>
    In [4]: pk.show()
        Out [4]:
        0000 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp S
        0001 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 SA
        0002 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp A
        0003 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 PA / Raw
        0004 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp A
        0005 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp PA / Raw
        0006 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 A
        0007 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 PA / Raw
        // ... snip ... //
    In [5]: pk.sessions()
    Out [5]:
        {'TCP 127.0.0.1:21 > 127.0.0.1:55025': ,
        'TCP 127.0.0.1:35806 > 127.0.0.1:56538': ,
        'TCP 127.0.0.1:42192 > 127.0.0.1:59876': ,
        'TCP 127.0.0.1:55025 > 127.0.0.1:21': ,
        'TCP 127.0.0.1:56538 > 127.0.0.1:35806': ,
        'TCP 127.0.0.1:59876 > 127.0.0.1:42192': }
    In [6]: len(pk.sessions)
    Out [6]: 6
    

So, the capture constained 51 TCP packets and 6 sessions.
We can see easily that’s a FTP stream between the same IP, localhost (lol?).
With tshark, it’s easy to view this too :

$ tshark -r CHALLENGE.pcap
    1   0.000000   127.0.0.1 -> 127.0.0.1  TCP 55025 > ftp [SYN]
    2   0.000027   127.0.0.1 -> 127.0.0.1  TCP ftp > 55025 [SYN, ACK]
    3   0.000051   127.0.0.1 -> 127.0.0.1  TCP 55025 > ftp [ACK]
    4   0.000815   127.0.0.1 -> 127.0.0.1  FTP Response: 220 pyftpdlib 1.4.1 ready
    5   0.000934   127.0.0.1 -> 127.0.0.1  TCP 55025 > ftp [ACK]
    6   2.793029   127.0.0.1 -> 127.0.0.1  FTP Request: USER user
	// ... snip ... //

– After that, I looked at the capture in hexraw, and I noticed 2 « RETR ».
FYI, RETR means « RETRieve », that means the ftp client ask a copy of the file.

–> A « RETR » on a file nammed « TOP_SECRET »

    0023 11:08:07.758456 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp PA / Raw
    0000   52 45 54 52 20 54 4F 50  5F 53 45 43 52 45 54 0D   RETR TOP_SECRET.
    0010   0A                                                 .
    0024 11:08:07.758972 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 PA / Raw
    0000   31 32 35 20 44 61 74 61  20 63 6F 6E 6E 65 63 74   125 Data connect
    0010   69 6F 6E 20 61 6C 72 65  61 64 79 20 6F 70 65 6E   ion already open
    0020   2E 20 54 72 61 6E 73 66  65 72 20 73 74 61 72 74   . Transfer start
    0030   69 6E 67 2E 0D 0A                                  ing...
    0025 11:08:07.759136 Ether / IP / TCP 127.0.0.1:56538 > 127.0.0.1:35806 PA/Raw
    0000   04 03 30 5B 41 33 59 5F  31 33 AA 62 12 0D 23 A3   ..0[A3Y_13.b..#.
    0010   77 D6 44 5F 31 33 2E 37  54 48 39 5F 57 33 2D 32   w.D_13.7TH9_W3-2
    0020   41 1C 40 52 26 2B 00 2B  1E 67 50 5F 32 B1 65 05   A.@R&+.+.gP_2.e.
    0030   00 CA 65 6D 1F 46 21 54  31 32 37 DF 57 48 33 5B   ..em.F!T127.WH3[
    0040   A3 30 59 5F 65 5B 56 17  20 27 58 3A 25 13 30 2C   .0Y_e[V. 'X:%.0,
    0050   11 09 13 76 0B 00 46 38  2E 6C 2A 3A 52 41 00 43   ...v..F8.l*:RA.C
    0060   5E 18 78 5E 49 2D 5A 55  31 33 33 37 54 D1 66 19   ^.x^I-ZU1337T.f.
    0070   0E 23 A5 63 D4 2E 33 37  54 55 33 5F 4B 39 59 47   .#.c..37TU3_K9YG
    0080   31 33 33 37 54 49 33 5F  4B 87 D8 5F 31 33 33 43   1337TI3_K.._133C
    0090   39 38 1C 2C 2E 41 3A 6C  45 66 67 32 54 4B B1 09   98.,.A:lEfg2TK..
    00a0   79 67 2C 27 3A 33 32 33  BC 4B 33 5F 4F DB 5A 5F   yg,':323.K3_O.Z_
    00b0   31 63 78 32 52 48 33 5F  4B 32 59 5E 31 63 33 37   1cx2RH3_K2Y^1c37
    00c0   54 29 33 5F 4B 33 59                               T)3_K3Y

This file is unreadable, as if it was encrypted … ; )

–> Another « RETR » command used on another file called « KEY »

    0037 11:08:13.154887 Ether / IP / TCP 127.0.0.1:55025 > 127.0.0.1:ftp PA / Raw
    0000   52 45 54 52 20 4B 45 59  0D 0A                     RETR KEY..
    0038 11:08:13.155385 Ether / IP / TCP 127.0.0.1:ftp > 127.0.0.1:55025 PA / Raw
    0000   31 32 35 20 44 61 74 61  20 63 6F 6E 6E 65 63 74   125 Data connect
    0010   69 6F 6E 20 61 6C 72 65  61 64 79 20 6F 70 65 6E   ion already open
    0020   2E 20 54 72 61 6E 73 66  65 72 20 73 74 61 72 74   . Transfer start
    0030   69 6E 67 2E 0D 0A                                  ing...
    0039 11:08:13.155548 Ether / IP / TCP 127.0.0.1:59876 > 127.0.0.1:42192 PA/Raw
    0000   54 48 33 5F 4B 33 59 5F  31 33 33 37 0A            TH3_K3Y_1337.

This file constained « TH3_K3Y_1337 », but it was not the flag (too easy …)

– Hum… A file called « TOP SECRET » and another called « KEY ». That’s sound good.
If you are good observers, I hope you noticed that the key « TH3_K3Y_1337 » is reflected on the file « TOP_SECRET ».
Look at the offset 0080 (1337TI3_K) or the offset 00c0 (T)3_K3Y). It’s look like NULL BYTE (0x00) was here.

– Quizz : Which encryption make this ?
KEY (operator) 0x00 –> KEY
It’s the XOR.

– To finish, I extracted the « TOP_SECRET » file, I XORed using the « TH3_K3Y_1337 » :

    IN[7]: pk[25].load
    OUT[7]:
    "\x04\x030[A3Y_13\xaab\x12\r#\xa3w\xd6D_13.7TH9_W3-2A\x1c@R&+\x00+\x1egP_2
    \xb1e\x05\x00\xcaem\x1fF!T127\xdfWH3[\xa30Y_e[V\x17 'X:%\x130,\x11\t\x13v\x0b
    \x00F8.l*:RA\x00C^\x18x^I-ZU1337T\xd1f\x19\x0e#\xa5c\xd4.37TU3_K9YG1337TI3_K
    \x87\xd8_133C98\x1c,.A:lEfg2TK\xb1\tyg,':323\xbcK3_O\xdbZ_1cx2RH3_K2Y^1c37T)3
    _K3Y"

    IN[8]: pk[39].load
    OUT[8]: 'TH3_K3Y_1337\n'     # <-- < BE CAREFUL TO THIS NEWLINE !

    IN[9]: pk[39].load.rstrip()
    OUT[9]: 'TH3_K3Y_1337'

    IN[10]: ''.join(chr(ord(a) ^ ord(b)) for a, b in \
                                           zip(pk[25].load, pk[39].load.rstrip()))
    OUT[10]: 'PK\x03\x04\n\x00\x00\x00\x00\x00\x99U'

W00t ! If you are used to the header of files, you must recognize the header of a zip archive.

– At last, I put the archive into a file and unziped it :

    IN[11]: ''.join(chr(ord(a) ^ ord(b)) for a, b in \
                           zip(pk[25].load, itertools.cycle(pk[39].load.rstrip())))
    OUT[11]:
   'PK\x03\x04\n\x00\x00\x00\x00\x00\x99UFE\x10\xfc<\xe5\x1d\x00\x00\x00\x1d\x00
   \x00\x00\n\x00\x1c\x00tmp/serc3tUT\t\x00\x03\x82V2T\x82V2Tux\x0b\x00\x01\x04\xe8
   \x03\x00\x00\x04\xe8\x03\x00\x00The token is : A_Huge_secr3t\nPK\x01\x02\x1e\x03
   \n\x00\x00\x00\x00\x00\x99UFE\x10\xfc<\xe5\x1d\x00\x00\x00\x1d\x00\x00\x00\n
   \x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb4\x81\x00\x00\x00\x00tmp/serc3tUT
   \x05\x00\x03\x82V2Tux\x0b\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05
   \x06\x00\x00\x00\x00\x01\x00\x01\x00P\x00\x00\x00a\x00\x00\x00\x00\x00'
       # So, I know, I can read the file,  and so the flag. But to do the challenge
       # entirely, I have put the archive into a file.
    IN[12]: f.write(''.join(chr(ord(a) ^ ord(b)) for a, b in \
                          zip(pk[25].load, itertools.cycle(pk[39].load.rstrip()))))
    IN[13]: f.close()
- To extract the .zip, use the "unzip" command :
 $ unzip archive.zip
<pre>Archive: archive.zip
    extracting: tmp/serc3t
$ cat tmp/serc3t
The token is : A_Huge_secr3t

Pwned \o/
Flag : A_Huge_secr3t

Enjoy !
Notfound (Boris P.)

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s