Category: Programming
Points: 500
Description:
Binary : http://binary.grayhash.com/bd24de5d345c0d1da274fcd7d9a2b244/file.xz
We recently intercepted some kind of encrypted traffic, can you help us recover the password?Update: Due to a crappy javascript programmer there’s one line of code missing, but I’m sure you can figure out which one
Write-up
The provided file is a compressed pcap file on a WEP-encrypted wireless network.
14:52:22.194582 WEP Encrypted 44us CF +QoS Data IV:ed006c Pad 0 KeyID 0
Let’s crack the key using aircrack-ng:
> aircrack-ng file.pcap
Opening file.pcap
Read 45169 packets.
   #  BSSID              ESSID                     Encryption
   1  00:26:66:55:97:D6  cgnetwork                 WEP (15477 IVs)
Choosing first network as target.
Opening file.pcap
Attack will be restarted every 5000 captured ivs.
Starting PTW attack with 15477 ivs.
                                                                                Aircrack-ng 1.2 rc1
                                                                [00:00:00] Tested 103 keys (got 15477 IVs)
   KB    depth   byte(vote)
    0    0/  1   A4(22784) 62(20992) A8(19968) B6(19968) 42(19456) 6E(19456) 91(19200) B7(19200) 26(18944) 9E(18944) 68(18944) E4(18688) 0E(18688) 74(18688)
    1    0/  1   3D(23040) 51(20736) 07(20480) 62(19968) 7B(19968) 1F(19712) B0(19712) BD(19456) 85(19200) 9D(19200) 80(19200) EC(18944) 13(18944) 98(18688)
    2    0/  1   F6(23808) E4(20992) D0(20736) 68(20224) 95(19712) 38(19456) 0C(19200) F7(18944) 45(18944) A8(18944) 4F(18944) C5(18688) CB(18688) BB(18688)
    3    1/ 10   F3(20480) D0(19968) C5(19968) 3E(19712) 52(19456) B2(19456) 09(19456) 20(19456) 43(19456) A0(19200) 8F(19200) B0(19200) 04(18944) 8D(18944)
    4    8/ 11   67(19456) 52(19456) F9(19456) 5C(19456) 20(19456) 45(18944) D3(18944) 95(18944) 85(18944) 9D(18688) 3A(18688) C8(18688) 40(18688) 1E(18432)
                         KEY FOUND! [ A4:3D:F6:F3:74 ]
    Decrypted correctly: 100%
Yes, that was easy, now we can decrypt the traffic:
> airdecap-ng -w A4:3D:F6:F3:74 file.pcap Total number of packets read 45169 Total number of WEP data packets 15477 Total number of WPA data packets 0 Number of plaintext data packets 0 Number of decrypted WEP packets 15477 Number of corrupted WEP packets 0 Number of decrypted WPA packets 0
Still don’t need wireshark, use foremost to extract the files:
> foremost -v file-dec.pcap Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus Audit File Foremost started at Mon Mar 16 16:24:49 2015 Invocation: foremost -v file-dec.pcap Output directory: /Users/Shared/dev/ctf/codegat/p500/output Configuration file: /usr/local/etc Processing: file-dec.pcap |------------------------------------------------------------------ File: file-dec.pcap Start: Mon Mar 16 16:24:49 2015 Length: Unknown Num Name (bs=512) Size File Offset Comment 0: 00000104.jpg 258 KB 53549 1: 00004538.jpg 87 KB 2323670 2: 00000406.gif 35 B 208185 (1 x 1) 3: 00001260.gif 35 B 645564 (1 x 1) 4: 00002450.gif 42 B 1254588 (1 x 1) 5: 00003653.gif 35 B 1870635 (1 x 1) 6: 00003719.gif 35 B 1904213 (1 x 1) 7: 00010456.gif 49 B 5353479 (1 x 1) 8: 00010876.gif 35 B 5568641 (1 x 1) 9: 00001639.htm 67 B 839396 10: 00024427.htm 1 KB 12506741 11: 00001765.png 283 B 904100 (44 x 44) 12: 00001831.png 166 B 937711 (12 x 12) 13: 00010214.png 67 B 5229704 (1 x 1) 14: 00010671.png 110 B 5464006 (1 x 400) 15: 00020736.png 425 B 10616910 (19 x 19) 16: 00024242.png 589 B 12412171 (19 x 19) *| Finish: Mon Mar 16 16:24:49 2015 17 FILES EXTRACTED jpg:= 2 gif:= 7 htm:= 2 png:= 6 ------------------------------------------------------------------
The secret is in this html:
<html>
<head>
    <title>Router - index</title>
    <link href="static/css/bootstrap.min.css" rel="stylesheet" media="screen">
    <link href="static/css/bootstrap-responsive.min.css" rel="stylesheet" media="screen">
    <link href="static/css/blah.css" rel="stylesheet">
    <script src="static/js/sha1.js"></script>
    <script>
        function validate() {
            var x = document.forms["formxx"]["pwz"].value;
            if (x == null || x == "") {
                alert("Password must be filled out");
                return false;
            }
            if (!x.match("/^[A-Za-z]+$/")) {
                alert("Bad charset");
                return false;
            }
            if (!sha1(x).match("^ff7b948953ac"))
            {
            }
            alert("Flag: " + x);
            return true;
        }
    </script>
</head>
<body>
    <div class="box">
        <center>
            <h1>Router - Please log in</h1>
        </center>
        <br/>
        <br/>
        <form class="box" method="post" onSubmit="validate()" name="formxx" action="/login">
            <h2 class="box-heading">Login</h2>
            <input type="text" class="input-block-level" placeholder="Username" name="user" value="admin">
            <input type="password" name="pwz" class="input-block-level" placeholder="WEP passhrase" name="pw">
            <input type="submit" name="submit" value="Submit" />
        </form>
    </div>
    <script src="static/js/jquery-1.10.2.min.js"></script>
    <script src="static/js/bootstrap.min.js"></script>
</body>
</html>
Well, now let’s sum up all the information:
- We need to find a password with charset [a-zA-Z]+, having sha1 value starting with “ff7b948953ac” (from javascript code).
 - The password is WEP’s Passphrase (indicated in placeholder of the input box).
 - WEP’s key corresponding to the Passphrase is A4:3D:F6:F3:74.
 
Using the first hint only, I wrote a brute force script for it and had it run up to 6 characters without success.
WEP’s key generator is mostly using simple xor and PRNG:
The seed’s efficient value space is only 24 bits, so we can find the original hash easily:
Output:
('Found it: ', '0x12766b')
Verify:
('0xa4', '0xa4a782')
('0x3d', '0x3d303d')
('0xf6', '0xf6420c')
('0xf3', '0xf3089f')
('0x74', '0x74c0e6')
So we have the seed value now, and:
- sumxor(p[4k])=0x6b
 - sumxor(p[4k+1])=0x76
 - sumxor(p[4k+2])=0x12
 
The passphrase length is longer than 6, so from this i can guess the passphrase length is 10 (as passhrase is ascii, we just need to look at msb of the result to guess). I was feeling stupid to see how long can my original bruteforce script need to brute these 10 characters.
Let’s rewrite the relations in more readable form:
- p[0] xor p[4] xor p[8] = 0x6b
 - p[1] xor p[5] xor p[9] = 0x76
 - p[2] xor p[6] = 0x12
 
Using these relations, the key space is still 7 characters, cracking that for charset of 52 values should take hours, so i tried to install cuda toolkit to use gpu, but my crappy internet dont allow me to do so. From the relation, in both set {p[0], p[4], p[8]}, {p[1], p[5], p[9]}, there must be 2 uppercase letters or no letter at all for each set, so I guessed that all characters are lowercase. Now let’s run a bruteforce script for lowercase charset:
Wait some tens of seconds and we have the key: cgwepkeyxz.
Thanks CodeGate for this interesting “programming” problem 🙂
