Loved playing Codegate this year, this was a fun challenge, although it went a little quick.
The server was provided in the description:
nc 175.119.158.131 1129
After connecting you get a d8 shell. Looking this up I quickly learned it was a V8 engine javascript shell. Found this and a few helpful commands from this post - http://www.sandeepdatta.com/2011/10/using-v8-javascript-shell-d8.html
After playing around a bit, looking for methods similar to node, I just tried one of the methods listed in the blog post above:
d8> quit(1)
This lead to the unintentional way of solving the challenge, but it was quick and I took it. (Also probably due to my poor ability to read directions right in-front of me)
Here was the result of running the quit command on the server:
quit(1) Traceback (most recent call last): File "/home/codegate/wrapper.py", line 14, inp.expect("d8>") File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 315, in expect timeout, searchwindowsize, async) File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 339, in expect_list return exp.expect_loop(timeout) File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 102, in expect_loop return self.eof(e) File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 49, in eof raise EOF(msg) pexpect.exceptions.EOF: End Of File (EOF). Exception style platform. command: /usr/bin/v8/d8 args: ['/usr/bin/v8/d8', '--shell', '/home/codegate/cg.js'] searcher: None buffer (last 100 chars): '' before (last 100 chars): ' quit(1)\r\n' after: match: None match_index: None exitstatus: 1 flag_eof: True pid: 13615 child_fd: 5 closed: False timeout: 30 delimiter: logfile: None logfile_read: ', mode 'w' at 0x7fbc2021d150> logfile_send: None maxread: 2000 ignorecase: False searchwindowsize: None delaybeforesend: 0.05 delayafterclose: 0.1 delayafterterminate: 0.1
Ahhh! What a useful traceback, Thank You D8! This makes the challenge a lot easier :D
We can see the executed script for the challenge is:
args: ['/usr/bin/v8/d8', '--shell', '/home/codegate/cg.js']
or
/usr/bin/v8/d8 --shell /home/codegate/cg.js
So let's check out that file if we can by reading it in d8!
d8> read("/home/codegate/cg.js") read("/home/codegate/cg.js") "function js_challenge(flag) { return function(arr) { var random_value = "ac1a39300ce7ee8b6cff8021fd7b0b5caf5bc1c316697bd8f22e00f9fab710d6b8dba23ca80f6d80ca697e7aa26fd5f6"; var check = "20150303"; if((arr === null || arr === undefined)) { print("arr is null or undefined."); return; } if(!arr.hasOwnProperty('length')) { print("length property is null or undefined."); return; } if(arr.length >= 0) { print("i think you're not geek. From now on, a GEEK Only!"); return; } if(Object.getPrototypeOf(arr) !== Array.prototype) { print("Oh.... can you give me an array?"); return; } var length = check.length; for(var i=0;i<length;i++) { arr[i] = random_value[Math.floor(Math.random() * random_value.length)]; } for(i=0;i<length;i++) { if(arr[i] !== check[i]) { print("Umm... i think 2015/03/03 is so special day.\nso you must set random value to 20150303 :)"); return; } } print("Yay!!"); print(flag); } } var challenge100 = js_challenge('flag is \"easy xD, get a more hardest challenge!\"'); print("[JavaScript Jail]") print("let start to type on 'challenge100'") "
Flag!
easy xD, get a more hardest challenge!
The flag doesn't lie, as we can see in the source of the challenge, it wouldn't have been that bad the other way either. But still a lot easier just reading the source!
And even though it was the simple route, still had a lot of fun playing around in d8, learning new things and finding a flag.