├── GAMEADMIN.asciidoc ├── README.asciidoc ├── SERVICE_DEV.asciidoc ├── bin ├── ctfd.js ├── scores.js ├── status.js └── viz.js ├── config.js ├── html ├── Stats.js ├── jquery.flot.min.js ├── jquery.flot.stack.min.js ├── jquery.flot.time.min.js ├── scores.css ├── scores.html ├── scores.js ├── status.css ├── status.html ├── status.js ├── viz.css ├── viz.html └── viz.js ├── index.js ├── lib ├── ctfd.js ├── datavizwebpage.js ├── flag.js ├── flagfactory.js ├── flagreceiver.js ├── scoreswebpage.js ├── service.js ├── servicecommandexecuter.js ├── statuswebpage.js ├── team.js ├── templatesubstitute.js ├── timedexecuter.js ├── timedservicehandler.js └── userdataparser.js ├── package.json ├── scripts ├── challenge.sh └── flag_deliver ├── services ├── Barbershop │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── build.xml │ ├── check_barbershop │ ├── conf │ │ └── web.xml │ ├── db.sql │ ├── exploit.sh │ ├── html │ │ ├── benjamin.jpg │ │ ├── index.html │ │ ├── script.js │ │ └── style.css │ ├── lib │ │ ├── jettison-1.0.1.jar │ │ ├── mysql-connector-java-5.1.10-bin.jar │ │ └── xstream-1.3.1.jar │ └── src │ │ ├── Appointment.java │ │ ├── Appointments.java │ │ ├── Database.java │ │ ├── HelloWorld.java │ │ ├── JSONStream.java │ │ ├── ListMyAppointments.java │ │ ├── MakeAppointment.java │ │ ├── Product.java │ │ ├── User.java │ │ └── WeekData.java ├── Bashtard │ ├── Manifest.json │ ├── bashtard │ ├── check_bashtard.py │ └── src │ │ └── bashtard.sh ├── DrunkDriver │ ├── Makefile │ ├── Manifest.json │ ├── README.txt │ ├── client.c │ ├── drunk │ └── drunkdriver.c ├── EchoServer │ ├── Manifest.json │ ├── client.py │ └── echo-server.lisp ├── FileServer │ ├── Manifest.json │ ├── README │ ├── build.xml │ ├── check_fileserver │ ├── fileserver-init │ └── src │ │ ├── Exploit.java │ │ ├── client │ │ └── Client.java │ │ ├── protocol │ │ ├── FileGet.java │ │ ├── FileGetResult.java │ │ ├── FileNotFoundResult.java │ │ └── FilePut.java │ │ └── server │ │ ├── FileClient.java │ │ ├── FileClientListener.java │ │ └── FileServer.java ├── GraphicusMaximus │ ├── Manifest.json │ ├── build.xml │ ├── check_graphicusmaximus.py │ ├── src │ │ └── GraphicusMaximus.java │ └── third-party │ │ └── mysql-connector-java-5.1.34-bin.jar ├── HighLow │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── client │ │ └── main.c │ ├── highlow-init │ └── src │ │ ├── client.c │ │ ├── client.h │ │ ├── db.c │ │ ├── db.h │ │ ├── game.h │ │ ├── main.c │ │ ├── protocol.h │ │ ├── server.c │ │ ├── server.h │ │ ├── user.h │ │ ├── util.c │ │ └── util.h ├── JabbaChat │ ├── Manifest.json │ ├── build.xml │ ├── client │ │ ├── client.js │ │ ├── handlerlist.js │ │ ├── names.js │ │ ├── node_modules │ │ │ ├── node-bosh-xmpp-client │ │ │ │ ├── .npmignore │ │ │ │ ├── README.markdown │ │ │ │ ├── examples │ │ │ │ │ └── exampleclient.js │ │ │ │ ├── lib │ │ │ │ │ ├── autil.js │ │ │ │ │ └── boshclient.js │ │ │ │ ├── node_modules │ │ │ │ │ ├── ltx │ │ │ │ │ │ ├── .npmignore │ │ │ │ │ │ ├── .travis.yml │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ ├── README.markdown │ │ │ │ │ │ ├── benchmark │ │ │ │ │ │ │ ├── .npmignore │ │ │ │ │ │ │ ├── benchmark.js │ │ │ │ │ │ │ ├── build.js │ │ │ │ │ │ │ └── index.html │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── lib │ │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ │ ├── index-browserify.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── parse.js │ │ │ │ │ │ │ ├── sax_easysax.js │ │ │ │ │ │ │ ├── sax_expat.js │ │ │ │ │ │ │ ├── sax_ltx.js │ │ │ │ │ │ │ ├── sax_node-xml.js │ │ │ │ │ │ │ └── sax_saxjs.js │ │ │ │ │ │ ├── node_modules │ │ │ │ │ │ │ └── sax │ │ │ │ │ │ │ │ ├── AUTHORS │ │ │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ │ │ ├── LICENSE-W3C.html │ │ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ │ │ ├── component.json │ │ │ │ │ │ │ │ ├── examples │ │ │ │ │ │ │ │ ├── big-not-pretty.xml │ │ │ │ │ │ │ │ ├── example.js │ │ │ │ │ │ │ │ ├── get-products.js │ │ │ │ │ │ │ │ ├── hello-world.js │ │ │ │ │ │ │ │ ├── not-pretty.xml │ │ │ │ │ │ │ │ ├── pretty-print.js │ │ │ │ │ │ │ │ ├── shopping.xml │ │ │ │ │ │ │ │ ├── strict.dtd │ │ │ │ │ │ │ │ ├── test.html │ │ │ │ │ │ │ │ └── test.xml │ │ │ │ │ │ │ │ ├── lib │ │ │ │ │ │ │ │ └── sax.js │ │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ │ └── test │ │ │ │ │ │ │ │ ├── attribute-name.js │ │ │ │ │ │ │ │ ├── buffer-overrun.js │ │ │ │ │ │ │ │ ├── case.js │ │ │ │ │ │ │ │ ├── cdata-chunked.js │ │ │ │ │ │ │ │ ├── cdata-end-split.js │ │ │ │ │ │ │ │ ├── cdata-fake-end.js │ │ │ │ │ │ │ │ ├── cdata-multiple.js │ │ │ │ │ │ │ │ ├── cdata.js │ │ │ │ │ │ │ │ ├── cyrillic.js │ │ │ │ │ │ │ │ ├── duplicate-attribute.js │ │ │ │ │ │ │ │ ├── entities.js │ │ │ │ │ │ │ │ ├── entity-mega.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── issue-23.js │ │ │ │ │ │ │ │ ├── issue-30.js │ │ │ │ │ │ │ │ ├── issue-35.js │ │ │ │ │ │ │ │ ├── issue-47.js │ │ │ │ │ │ │ │ ├── issue-49.js │ │ │ │ │ │ │ │ ├── issue-84.js │ │ │ │ │ │ │ │ ├── parser-position.js │ │ │ │ │ │ │ │ ├── script-close-better.js │ │ │ │ │ │ │ │ ├── script.js │ │ │ │ │ │ │ │ ├── self-closing-child-strict.js │ │ │ │ │ │ │ │ ├── self-closing-child.js │ │ │ │ │ │ │ │ ├── self-closing-tag.js │ │ │ │ │ │ │ │ ├── stray-ending.js │ │ │ │ │ │ │ │ ├── trailing-attribute-no-value.js │ │ │ │ │ │ │ │ ├── trailing-non-whitespace.js │ │ │ │ │ │ │ │ ├── unclosed-root.js │ │ │ │ │ │ │ │ ├── unquoted.js │ │ │ │ │ │ │ │ ├── utf8-split.js │ │ │ │ │ │ │ │ ├── xmlns-issue-41.js │ │ │ │ │ │ │ │ ├── xmlns-rebinding.js │ │ │ │ │ │ │ │ ├── xmlns-strict.js │ │ │ │ │ │ │ │ ├── xmlns-unbound-element.js │ │ │ │ │ │ │ │ ├── xmlns-unbound.js │ │ │ │ │ │ │ │ ├── xmlns-xml-default-ns.js │ │ │ │ │ │ │ │ ├── xmlns-xml-default-prefix-attribute.js │ │ │ │ │ │ │ │ ├── xmlns-xml-default-prefix.js │ │ │ │ │ │ │ │ └── xmlns-xml-default-redefine.js │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test │ │ │ │ │ │ │ ├── element-test.js │ │ │ │ │ │ │ └── parse-test.js │ │ │ │ │ └── node-expat │ │ │ │ │ │ ├── .npmignore │ │ │ │ │ │ ├── .travis.yml │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ ├── README.markdown │ │ │ │ │ │ ├── bench.js │ │ │ │ │ │ ├── binding.gyp │ │ │ │ │ │ ├── build │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── Release │ │ │ │ │ │ │ ├── .deps │ │ │ │ │ │ │ │ └── Release │ │ │ │ │ │ │ │ │ ├── libexpat.a.d │ │ │ │ │ │ │ │ │ ├── node_expat.node.d │ │ │ │ │ │ │ │ │ └── obj.target │ │ │ │ │ │ │ │ │ ├── deps │ │ │ │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ │ │ │ └── libexpat.a.d │ │ │ │ │ │ │ │ │ ├── expat │ │ │ │ │ │ │ │ │ └── deps │ │ │ │ │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ │ │ │ ├── xmlparse.o.d │ │ │ │ │ │ │ │ │ │ ├── xmlrole.o.d │ │ │ │ │ │ │ │ │ │ └── xmltok.o.d │ │ │ │ │ │ │ │ │ ├── node_expat.node.d │ │ │ │ │ │ │ │ │ └── node_expat │ │ │ │ │ │ │ │ │ └── node-expat.o.d │ │ │ │ │ │ │ ├── libexpat.a │ │ │ │ │ │ │ ├── linker.lock │ │ │ │ │ │ │ ├── node_expat.node │ │ │ │ │ │ │ └── obj.target │ │ │ │ │ │ │ │ ├── deps │ │ │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ │ │ └── libexpat.a │ │ │ │ │ │ │ │ ├── expat │ │ │ │ │ │ │ │ └── deps │ │ │ │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ │ │ └── lib │ │ │ │ │ │ │ │ │ ├── xmlparse.o │ │ │ │ │ │ │ │ │ ├── xmlrole.o │ │ │ │ │ │ │ │ │ └── xmltok.o │ │ │ │ │ │ │ │ ├── node_expat.node │ │ │ │ │ │ │ │ └── node_expat │ │ │ │ │ │ │ │ └── node-expat.o │ │ │ │ │ │ ├── binding.Makefile │ │ │ │ │ │ ├── config.gypi │ │ │ │ │ │ ├── deps │ │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ │ ├── expat.target.mk │ │ │ │ │ │ │ │ ├── libexpat.Makefile │ │ │ │ │ │ │ │ └── version.target.mk │ │ │ │ │ │ └── node_expat.target.mk │ │ │ │ │ │ ├── deps │ │ │ │ │ │ └── libexpat │ │ │ │ │ │ │ ├── CMake.README │ │ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ │ │ ├── COPYING │ │ │ │ │ │ │ ├── Changes │ │ │ │ │ │ │ ├── ConfigureChecks.cmake │ │ │ │ │ │ │ ├── MANIFEST │ │ │ │ │ │ │ ├── Makefile.in │ │ │ │ │ │ │ ├── README │ │ │ │ │ │ │ ├── aclocal.m4 │ │ │ │ │ │ │ ├── amiga │ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ │ ├── README.txt │ │ │ │ │ │ │ ├── expat.xml │ │ │ │ │ │ │ ├── expat_68k.c │ │ │ │ │ │ │ ├── expat_68k.h │ │ │ │ │ │ │ ├── expat_68k_handler_stubs.c │ │ │ │ │ │ │ ├── expat_base.h │ │ │ │ │ │ │ ├── expat_lib.c │ │ │ │ │ │ │ ├── expat_vectors.c │ │ │ │ │ │ │ ├── include │ │ │ │ │ │ │ │ ├── inline4 │ │ │ │ │ │ │ │ │ └── expat.h │ │ │ │ │ │ │ │ ├── interfaces │ │ │ │ │ │ │ │ │ └── expat.h │ │ │ │ │ │ │ │ ├── libraries │ │ │ │ │ │ │ │ │ └── expat.h │ │ │ │ │ │ │ │ └── proto │ │ │ │ │ │ │ │ │ └── expat.h │ │ │ │ │ │ │ └── launch.c │ │ │ │ │ │ │ ├── bcb5 │ │ │ │ │ │ │ ├── README.txt │ │ │ │ │ │ │ ├── all_projects.bpg │ │ │ │ │ │ │ ├── elements.bpf │ │ │ │ │ │ │ ├── elements.bpr │ │ │ │ │ │ │ ├── elements.mak │ │ │ │ │ │ │ ├── expat.bpf │ │ │ │ │ │ │ ├── expat.bpr │ │ │ │ │ │ │ ├── expat.mak │ │ │ │ │ │ │ ├── expat_static.bpf │ │ │ │ │ │ │ ├── expat_static.bpr │ │ │ │ │ │ │ ├── expat_static.mak │ │ │ │ │ │ │ ├── expatw.bpf │ │ │ │ │ │ │ ├── expatw.bpr │ │ │ │ │ │ │ ├── expatw.mak │ │ │ │ │ │ │ ├── expatw_static.bpf │ │ │ │ │ │ │ ├── expatw_static.bpr │ │ │ │ │ │ │ ├── expatw_static.mak │ │ │ │ │ │ │ ├── libexpat_mtd.def │ │ │ │ │ │ │ ├── libexpatw_mtd.def │ │ │ │ │ │ │ ├── makefile.mak │ │ │ │ │ │ │ ├── outline.bpf │ │ │ │ │ │ │ ├── outline.bpr │ │ │ │ │ │ │ ├── outline.mak │ │ │ │ │ │ │ ├── setup.bat │ │ │ │ │ │ │ ├── xmlwf.bpf │ │ │ │ │ │ │ ├── xmlwf.bpr │ │ │ │ │ │ │ └── xmlwf.mak │ │ │ │ │ │ │ ├── configure │ │ │ │ │ │ │ ├── configure.in │ │ │ │ │ │ │ ├── conftools │ │ │ │ │ │ │ ├── PrintPath │ │ │ │ │ │ │ ├── ac_c_bigendian_cross.m4 │ │ │ │ │ │ │ ├── config.guess │ │ │ │ │ │ │ ├── config.sub │ │ │ │ │ │ │ ├── expat.m4 │ │ │ │ │ │ │ ├── get-version.sh │ │ │ │ │ │ │ ├── install-sh │ │ │ │ │ │ │ ├── ltmain.sh │ │ │ │ │ │ │ └── mkinstalldirs │ │ │ │ │ │ │ ├── doc │ │ │ │ │ │ │ ├── expat.png │ │ │ │ │ │ │ ├── reference.html │ │ │ │ │ │ │ ├── style.css │ │ │ │ │ │ │ ├── valid-xhtml10.png │ │ │ │ │ │ │ ├── xmlwf.1 │ │ │ │ │ │ │ └── xmlwf.sgml │ │ │ │ │ │ │ ├── examples │ │ │ │ │ │ │ ├── elements.c │ │ │ │ │ │ │ ├── elements.dsp │ │ │ │ │ │ │ ├── outline.c │ │ │ │ │ │ │ └── outline.dsp │ │ │ │ │ │ │ ├── expat.dsw │ │ │ │ │ │ │ ├── expat.pc.in │ │ │ │ │ │ │ ├── expat_config.h │ │ │ │ │ │ │ ├── expat_config.h.cmake │ │ │ │ │ │ │ ├── expat_config.h.in │ │ │ │ │ │ │ ├── lib │ │ │ │ │ │ │ ├── Makefile.MPW │ │ │ │ │ │ │ ├── amigaconfig.h │ │ │ │ │ │ │ ├── ascii.h │ │ │ │ │ │ │ ├── asciitab.h │ │ │ │ │ │ │ ├── expat.dsp │ │ │ │ │ │ │ ├── expat.h │ │ │ │ │ │ │ ├── expat_external.h │ │ │ │ │ │ │ ├── expat_static.dsp │ │ │ │ │ │ │ ├── expatw.dsp │ │ │ │ │ │ │ ├── expatw_static.dsp │ │ │ │ │ │ │ ├── iasciitab.h │ │ │ │ │ │ │ ├── internal.h │ │ │ │ │ │ │ ├── latin1tab.h │ │ │ │ │ │ │ ├── libexpat.def │ │ │ │ │ │ │ ├── libexpatw.def │ │ │ │ │ │ │ ├── macconfig.h │ │ │ │ │ │ │ ├── nametab.h │ │ │ │ │ │ │ ├── utf8tab.h │ │ │ │ │ │ │ ├── winconfig.h │ │ │ │ │ │ │ ├── xmlparse.c │ │ │ │ │ │ │ ├── xmlrole.c │ │ │ │ │ │ │ ├── xmlrole.h │ │ │ │ │ │ │ ├── xmltok.c │ │ │ │ │ │ │ ├── xmltok.h │ │ │ │ │ │ │ ├── xmltok_impl.c │ │ │ │ │ │ │ ├── xmltok_impl.h │ │ │ │ │ │ │ └── xmltok_ns.c │ │ │ │ │ │ │ ├── libexpat.gyp │ │ │ │ │ │ │ ├── m4 │ │ │ │ │ │ │ ├── libtool.m4 │ │ │ │ │ │ │ ├── ltoptions.m4 │ │ │ │ │ │ │ ├── ltsugar.m4 │ │ │ │ │ │ │ ├── ltversion.m4 │ │ │ │ │ │ │ └── lt~obsolete.m4 │ │ │ │ │ │ │ ├── tests │ │ │ │ │ │ │ ├── README.txt │ │ │ │ │ │ │ ├── benchmark │ │ │ │ │ │ │ │ ├── README.txt │ │ │ │ │ │ │ │ ├── benchmark.c │ │ │ │ │ │ │ │ ├── benchmark.dsp │ │ │ │ │ │ │ │ └── benchmark.dsw │ │ │ │ │ │ │ ├── chardata.c │ │ │ │ │ │ │ ├── chardata.h │ │ │ │ │ │ │ ├── minicheck.c │ │ │ │ │ │ │ ├── minicheck.h │ │ │ │ │ │ │ ├── runtests.c │ │ │ │ │ │ │ ├── runtestspp.cpp │ │ │ │ │ │ │ └── xmltest.sh │ │ │ │ │ │ │ ├── version.c │ │ │ │ │ │ │ ├── vms │ │ │ │ │ │ │ ├── README.vms │ │ │ │ │ │ │ ├── descrip.mms │ │ │ │ │ │ │ └── expat_config.h │ │ │ │ │ │ │ ├── win32 │ │ │ │ │ │ │ ├── MANIFEST.txt │ │ │ │ │ │ │ ├── README.txt │ │ │ │ │ │ │ └── expat.iss │ │ │ │ │ │ │ └── xmlwf │ │ │ │ │ │ │ ├── codepage.c │ │ │ │ │ │ │ ├── codepage.h │ │ │ │ │ │ │ ├── ct.c │ │ │ │ │ │ │ ├── filemap.h │ │ │ │ │ │ │ ├── readfilemap.c │ │ │ │ │ │ │ ├── unixfilemap.c │ │ │ │ │ │ │ ├── win32filemap.c │ │ │ │ │ │ │ ├── xmlfile.c │ │ │ │ │ │ │ ├── xmlfile.h │ │ │ │ │ │ │ ├── xmlmime.c │ │ │ │ │ │ │ ├── xmlmime.h │ │ │ │ │ │ │ ├── xmltchar.h │ │ │ │ │ │ │ ├── xmlurl.h │ │ │ │ │ │ │ ├── xmlwf.c │ │ │ │ │ │ │ ├── xmlwf.dsp │ │ │ │ │ │ │ └── xmlwin32url.cxx │ │ │ │ │ │ ├── lib │ │ │ │ │ │ └── node-expat.js │ │ │ │ │ │ ├── node-expat.cc │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ ├── test-mystic-library.xml │ │ │ │ │ │ └── test.js │ │ │ │ └── package.json │ │ │ ├── node-stringprep │ │ │ │ ├── .npmignore │ │ │ │ ├── LICENSE │ │ │ │ ├── README.markdown │ │ │ │ ├── binding.gyp │ │ │ │ ├── build │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── Release │ │ │ │ │ │ ├── .deps │ │ │ │ │ │ │ └── Release │ │ │ │ │ │ │ │ ├── node_stringprep.node.d │ │ │ │ │ │ │ │ └── obj.target │ │ │ │ │ │ │ │ ├── node_stringprep.node.d │ │ │ │ │ │ │ │ └── node_stringprep │ │ │ │ │ │ │ │ └── node-stringprep.o.d │ │ │ │ │ │ ├── linker.lock │ │ │ │ │ │ ├── node_stringprep.node │ │ │ │ │ │ └── obj.target │ │ │ │ │ │ │ ├── node_stringprep.node │ │ │ │ │ │ │ └── node_stringprep │ │ │ │ │ │ │ └── node-stringprep.o │ │ │ │ │ ├── binding.Makefile │ │ │ │ │ ├── config.gypi │ │ │ │ │ └── node_stringprep.target.mk │ │ │ │ ├── install.sh │ │ │ │ ├── leakcheck.js │ │ │ │ ├── node-stringprep.cc │ │ │ │ ├── package.json │ │ │ │ └── wscript │ │ │ └── underscore │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── package.json │ │ │ │ ├── underscore-min.js │ │ │ │ └── underscore.js │ │ ├── out │ │ └── package.json │ ├── component │ │ ├── config.json │ │ ├── index.js │ │ ├── lib │ │ │ ├── handlerlist.js │ │ │ ├── iditerator.js │ │ │ └── jid.js │ │ ├── package.json │ │ └── server.js │ ├── create_installer.sh │ ├── lib │ │ ├── mongo-java-driver-2.11.2.jar │ │ ├── openfire.jar │ │ └── slf4j-log4j12.jar │ ├── src │ │ ├── MongoloidAdminProvider.java │ │ ├── MongoloidAuthProvider.java │ │ ├── MongoloidDatabase.java │ │ └── MongoloidUserProvider.java │ └── www │ │ ├── auth.php │ │ ├── css │ │ ├── images │ │ │ ├── jabba.png │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jabba.css │ │ └── jquery-ui-1.9.2.custom.min.css │ │ ├── index.php │ │ └── js │ │ ├── jabba.js │ │ ├── jquery-ui.min.js │ │ ├── jquery.min.js │ │ ├── strophe.min.js │ │ └── underscore-min.js ├── LeetPhorum │ ├── Manifest.json │ ├── check_leet.py │ ├── idea.txt │ └── src │ │ ├── db.sql │ │ ├── index.php │ │ ├── js │ │ ├── jquery-2.1.1.min.js │ │ ├── jstree.min.js │ │ ├── leet.js │ │ ├── libs │ │ │ ├── jquery.js │ │ │ └── require.js │ │ └── themes │ │ │ └── default │ │ │ ├── 32px.png │ │ │ ├── 40px.png │ │ │ ├── style.css │ │ │ ├── style.min.css │ │ │ └── throbber.gif │ │ └── leet.css ├── MathServer │ ├── Manifest.json │ ├── mathclient.py │ └── mathserver.py ├── MyStatus │ ├── Manifest.json │ ├── check_mystatus.py │ └── src │ │ ├── index.php │ │ ├── jquery-2.1.1.min.js │ │ └── mystatus.js ├── Phasebook │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── check_phasebook │ ├── db.sql │ ├── phasebook_usersearch_sqli_sploit.sh │ └── src │ │ ├── classes.php │ │ ├── config.php │ │ ├── db.php │ │ ├── images │ │ ├── gal.png │ │ └── guy.png │ │ ├── index.php │ │ └── pages │ │ ├── create │ │ ├── main │ │ ├── new_account │ │ ├── new_avatar │ │ ├── profile │ │ └── usersearch ├── PythonOnPills │ ├── Manifest.json │ ├── check_pills.sh │ ├── pills.py │ └── www │ │ ├── Morpheus.jpg │ │ ├── blue.png │ │ ├── index.html │ │ ├── jquery.min.js │ │ ├── pills.js │ │ ├── red.png │ │ └── style.css ├── RabbitShare │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── RabbitShare.tar.gz │ ├── check_rabbitshare │ ├── exploit.sh │ └── src │ │ ├── config.php │ │ ├── index.php │ │ └── rabbitshare_logo.png ├── SecretService │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── check_secretservice.sh │ ├── secretservice-init │ ├── src │ │ ├── database.c │ │ ├── database.h │ │ ├── message.c │ │ ├── message.h │ │ └── secretservice.c │ └── ss_client.rb ├── SomeService │ ├── Manifest.json │ ├── README │ └── flag ├── SpeakersCorner │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── SpeakersCorner.tar.gz │ ├── check_speakerscorner │ ├── exploit.sh │ └── src │ │ ├── database.php │ │ ├── index.php │ │ ├── model.php │ │ ├── pages │ │ ├── active.php │ │ ├── all.php │ │ ├── home.php │ │ ├── newblog.php │ │ ├── newuser.php │ │ └── viewblog.php │ │ ├── style.css │ │ └── ui.php ├── TheQuotinator │ ├── IDEA │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── TheQuotinator.tar.gz │ ├── check_thequotinator.rb │ ├── exploit.rb │ ├── list_flags_exploit.rb │ ├── quotinator │ ├── quotinator-init │ ├── quotinator_writeup.pdf │ └── src │ │ ├── main.c │ │ └── main.o ├── TicTacToe │ ├── Manifest.json │ ├── check_tictactoe.py │ └── src │ │ ├── helper │ │ └── user.rb │ │ ├── run.sh │ │ ├── tttd.rb │ │ └── userd.rb ├── WebServer │ ├── Makefile │ ├── Manifest.json │ ├── README │ ├── cgi_exec │ ├── check_yellowpages │ └── src │ │ ├── cgi-bin │ │ ├── add │ │ └── search │ │ ├── init-script │ │ ├── static │ │ ├── index.html │ │ ├── js │ │ │ ├── jquery-1.5.1.js │ │ │ └── yp.js │ │ └── style.css │ │ └── ws.js ├── WhereAmI │ ├── Makefile │ ├── Manifest.json │ ├── client.py │ ├── exploit.py │ ├── src │ │ └── whereami.c │ └── whereami └── Wizard │ ├── Manifest.json │ ├── build.xml │ ├── check_wizard.py │ └── src │ └── Wizard.java └── test └── test.js /bin/ctfd.js: -------------------------------------------------------------------------------- 1 | var repl = require('repl'), 2 | ctfd = require('../index'); 3 | fs = require('fs'), 4 | conf = JSON.parse( 5 | fs.readFileSync(process.argv.length > 2 ? 6 | process.argv[2] : 'config.js', 'utf-8') 7 | ), 8 | daemon = ctfd.createDaemon(conf); 9 | 10 | repl.start('ctfd> ').context.daemon = daemon; 11 | -------------------------------------------------------------------------------- /bin/scores.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'), 3 | _ = require('underscore'), 4 | mongojs = require('mongojs'), 5 | router = require('choreographer').router(), 6 | conf = JSON.parse( 7 | fs.readFileSync(process.argv.length > 2 ? 8 | process.argv[2] : 'config.js', 'utf-8') 9 | ), 10 | db = mongojs.connect(conf.database, ['flags','challenges']); 11 | 12 | _.forEach(fs.readdirSync(conf.web.document_root), function(file) { 13 | var ext = file.substr(file.lastIndexOf('.') + 1); 14 | router.get('/' + file, function(req, res) { 15 | res.writeHead(200, { 16 | 'Content-Type' : { 17 | 'js' : 'application/javascript', 18 | 'css' : 'text/css', 19 | 'html' : 'text/html' 20 | }[ext] 21 | }); 22 | res.end(fs.readFileSync(conf.web.document_root + '/' + file)); 23 | }); 24 | }); 25 | 26 | require('../lib/scoreswebpage')(router, db, conf.points); 27 | 28 | http.createServer(router).listen(conf.web.port); 29 | -------------------------------------------------------------------------------- /bin/status.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'), 3 | mongojs = require('mongojs'), 4 | router = require('choreographer').router(), 5 | conf = JSON.parse( 6 | fs.readFileSync(process.argv.length > 2 ? 7 | process.argv[2] : 'config.js', 'utf-8') 8 | ), 9 | db = mongojs.connect(conf.database, ['flags']); 10 | 11 | _.forEach(fs.readdirSync(conf.web.document_root), function(file) { 12 | var ext = file.substr(file.lastIndexOf('.') + 1); 13 | router.get('/' + file, function(req, res) { 14 | res.writeHead(200, { 15 | 'Content-Type' : { 16 | 'js' : 'application/javascript', 17 | 'css' : 'text/css', 18 | 'html' : 'text/html' 19 | }[ext] 20 | }); 21 | res.end(fs.readFileSync(conf.web.document_root + '/' + file)); 22 | }); 23 | }); 24 | 25 | require('../lib/statuswebpage')(router, db); 26 | 27 | http.createServer(router).listen(conf.web.port); 28 | -------------------------------------------------------------------------------- /bin/viz.js: -------------------------------------------------------------------------------- 1 | var http = require('http'), 2 | fs = require('fs'), 3 | _ = require('underscore'), 4 | mongojs = require('mongojs'), 5 | router = require('choreographer').router(), 6 | conf = JSON.parse( 7 | fs.readFileSync(process.argv.length > 2 ? 8 | process.argv[2] : 'config.js', 'utf-8') 9 | ), 10 | db = mongojs.connect(conf.database, ['flags','challenges']); 11 | 12 | _.forEach(fs.readdirSync(conf.web.document_root), function(file) { 13 | var ext = file.substr(file.lastIndexOf('.') + 1); 14 | router.get('/' + file, function(req, res) { 15 | res.writeHead(200, { 16 | 'Content-Type' : { 17 | 'js' : 'application/javascript', 18 | 'css' : 'text/css', 19 | 'html' : 'text/html' 20 | }[ext] 21 | }); 22 | res.end(fs.readFileSync(conf.web.document_root + '/' + file)); 23 | }); 24 | }); 25 | 26 | require('../lib/datavizwebpage')(router, db, _.pluck(conf.teams, 'name'), _.pluck(conf.services, 'name')); 27 | 28 | http.createServer(router).listen(conf.web.port); 29 | -------------------------------------------------------------------------------- /html/scores.css: -------------------------------------------------------------------------------- 1 | .plot { 2 | display: inline-block; 3 | width: 1600px; 4 | height: 800px; 5 | } 6 | 7 | .table_scores { 8 | border-collapse: collapse; 9 | } 10 | 11 | .table_scores thead { 12 | background-color: black; 13 | color: white; 14 | text-align: center; 15 | font-weight: bold; 16 | } 17 | 18 | .table_scores tbody { 19 | border: 1px solid black; 20 | } 21 | 22 | .table_scores tbody tr:nth-child(even) { 23 | background-color: lightgray; 24 | } 25 | 26 | .table_scores td { 27 | margin: 5px; 28 | padding: 5px; 29 | text-align: center; 30 | } 31 | 32 | .table_scores tbody tr td:nth-child(1) { 33 | border-right: 1px solid black; 34 | font-weight: bold; 35 | text-align: right; 36 | } 37 | 38 | .table_scores tbody tr td:nth-child(7) { 39 | border-left: 1px solid black; 40 | font-weight: bold; 41 | } 42 | -------------------------------------------------------------------------------- /html/status.css: -------------------------------------------------------------------------------- 1 | table { 2 | border-collapse: collapse; 3 | } 4 | 5 | td { 6 | border: 1px solid black; 7 | padding-left: 5px; 8 | padding-right: 5px; 9 | } 10 | 11 | .strong { 12 | background-color: black; 13 | color: white; 14 | font-weight: bold; 15 | } 16 | 17 | .yellow { 18 | background-color: yellow; 19 | } 20 | 21 | .red { 22 | background-color: red; 23 | } 24 | 25 | .green { 26 | background-color: green; 27 | } 28 | -------------------------------------------------------------------------------- /html/status.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Capture The Flag - Status 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Capture The Flag Status

13 |
14 |

Delivery

15 |
16 |
17 |
18 |
19 |

Check

20 |
21 |
22 |
23 |
24 |

Defend

25 |
26 |
27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /html/viz.css: -------------------------------------------------------------------------------- 1 | canvas { 2 | border : 1px solid black; 3 | } 4 | 5 | .buttons { 6 | display: inline-block; 7 | width: 600px; 8 | } 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/ctfd'); 2 | -------------------------------------------------------------------------------- /lib/flag.js: -------------------------------------------------------------------------------- 1 | module.exports = Flag; 2 | 3 | function Flag(name, data, team, service) { 4 | this.name = name; 5 | this.data = data; 6 | this.team = team; 7 | this.service = service; 8 | }; 9 | -------------------------------------------------------------------------------- /lib/flagfactory.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter, 2 | util = require('util'), 3 | Flag = require('./flag'); 4 | 5 | module.exports = FlagFactory; 6 | 7 | function FlagFactory(nameLength, flagLength) { 8 | EventEmitter.call(this); 9 | this.nameLength = nameLength; 10 | this.flagLength = flagLength; 11 | 12 | this.nameToFlag = {}; 13 | this.flags = {}; 14 | }; 15 | util.inherits(FlagFactory, EventEmitter); 16 | 17 | FlagFactory.prototype.createFlag = function(team, service, time) { 18 | var name = this._createUniqueRandomString('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', this.nameLength, this.nameToFlag), 19 | data = this._createUniqueRandomString('0123456789ABCDEF', this.flagLength, this.flags), 20 | flag = new Flag(name, data, team, service); 21 | 22 | this.nameToFlag[name] = flag; 23 | this.flags[data] = flag; 24 | 25 | this.emit('flag', flag, time); 26 | 27 | return flag; 28 | }; 29 | 30 | FlagFactory.prototype._createUniqueRandomString = function(alphabet, length, hash) { 31 | var str; 32 | 33 | do { 34 | str = this._createRandomString(alphabet, length); 35 | } while (hash[str] !== undefined); 36 | 37 | return str; 38 | } 39 | 40 | FlagFactory.prototype._createRandomString = function(alphabet, length) { 41 | var str = ''; 42 | while (str.length < length) { 43 | str += alphabet.charAt(Math.floor(Math.random() * alphabet.length)); 44 | } 45 | return str; 46 | }; 47 | -------------------------------------------------------------------------------- /lib/flagreceiver.js: -------------------------------------------------------------------------------- 1 | var UserDataParser = require('./userdataparser'), 2 | EventEmitter = require('events').EventEmitter, 3 | util = require('util'), 4 | _ = require('underscore'); 5 | 6 | module.exports = FlagReceiver; 7 | 8 | function UserConnection(socket) { 9 | EventEmitter.call(this); 10 | 11 | var parser = new UserDataParser(); 12 | this.socket = socket; 13 | 14 | socket.on('close', _.bind(function() { 15 | this.emit('close'); 16 | }, this)); 17 | 18 | socket.on('error', function() {}); 19 | 20 | socket.on('data', _.bind(function(d) { 21 | parser.append(d); 22 | }, this)); 23 | 24 | parser.on('TEAM', _.bind(function(name) { 25 | this.emit('team', name); 26 | }, this)); 27 | 28 | parser.on('FLAG', _.bind(function(flag) { 29 | if (flag.match(/^[0-9a-f]{64}$/i)) { 30 | this.emit('flag', flag); 31 | } 32 | }, this)); 33 | }; 34 | util.inherits(UserConnection, EventEmitter); 35 | 36 | function FlagReceiver(server) { 37 | EventEmitter.call(this); 38 | 39 | server.on('connection', _.bind(function(socket) { 40 | socket.setEncoding('utf8'); 41 | var con = new UserConnection(socket); 42 | this.emit('connection', con); 43 | }, this)); 44 | }; 45 | util.inherits(FlagReceiver, EventEmitter); 46 | -------------------------------------------------------------------------------- /lib/service.js: -------------------------------------------------------------------------------- 1 | module.exports = Service; 2 | 3 | function Service(name, directory, commands) { 4 | this.name = name; 5 | this.directory = directory; 6 | this.commands = commands; 7 | }; 8 | -------------------------------------------------------------------------------- /lib/statuswebpage.js: -------------------------------------------------------------------------------- 1 | module.exports = function (router, db, daemon) { 2 | router.get('/status.json', function(req, res) { 3 | var result = {}; 4 | 5 | res.writeHead(200, {'Content-Type' : 'application/json'}); 6 | db.flags.find({time:daemon.latestPlantTime}).forEach(function(err, doc) { 7 | if (err === null) { 8 | if (doc) { 9 | if (result[doc.team] === undefined) { 10 | result[doc.team] = {}; 11 | } 12 | result[doc.team][doc.service] = { 13 | delivered : doc.delivered, 14 | check : (doc.checks.length === 0 ? null : doc.checks[doc.checks.length - 1].result), 15 | captured : doc.captures.length > 0 16 | }; 17 | } else { 18 | res.end(JSON.stringify(result, null, 4)); 19 | } 20 | } 21 | }); 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /lib/team.js: -------------------------------------------------------------------------------- 1 | module.exports = Team; 2 | 3 | function Team(name, host) { 4 | this.name = name; 5 | this.host = host; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/templatesubstitute.js: -------------------------------------------------------------------------------- 1 | module.exports = templateSubstitute; 2 | 3 | function templateSubstitute(str, hash) { 4 | var x, regex; 5 | for (x in hash) { 6 | regex = new RegExp('%' + x + '%', 'g'); 7 | str = str.replace(regex, hash[x]); 8 | } 9 | return str; 10 | }; 11 | -------------------------------------------------------------------------------- /lib/timedexecuter.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter, 2 | util = require('util'), 3 | _ = require('underscore'), 4 | child_process = require('child_process'); 5 | 6 | module.exports = TimedExecuter; 7 | 8 | function TimedExecuter(max_time) { 9 | EventEmitter.call(this); 10 | this.max_time = max_time; 11 | }; 12 | util.inherits(TimedExecuter, EventEmitter); 13 | 14 | TimedExecuter.ERROR_CODES = { 15 | 'OK' : 0, 16 | 'TIMED_OUT' : -1 17 | }; 18 | 19 | TimedExecuter.prototype.execute = function(command, callback) { 20 | var child = child_process.exec(command, { 21 | timeout : this.max_time 22 | }, _.bind(function(err, stdout, stderr) { 23 | var data = { 24 | 'command' : command, 25 | 'status' : -1, 26 | 'line' : 'Timed out' 27 | }; 28 | if (err === null || err.killed === false) { 29 | data.status = err ? err.code : 0; 30 | data.line = stdout.split('\n')[0]; 31 | } 32 | callback(data.status, data.line); 33 | this.emit('command', data); 34 | }, this)); 35 | } 36 | -------------------------------------------------------------------------------- /lib/timedservicehandler.js: -------------------------------------------------------------------------------- 1 | var _ = require('underscore'); 2 | 3 | module.exports = TimedServiceHandler; 4 | 5 | function TimedServiceHandler(flagFactory, serviceCommandExecuter, service, teams) { 6 | this.flagFactory = flagFactory; 7 | this.serviceCommandExecuter = serviceCommandExecuter; 8 | this.service = service; 9 | this.teams = teams; 10 | 11 | _.each(teams, function(team) { 12 | team.flags[service.name] = []; 13 | }); 14 | }; 15 | 16 | TimedServiceHandler.prototype.plantFlags = function() { 17 | _.each(this.teams, _.bind(function(team) { 18 | var flag = this.flagFactory.createFlag(team, this.service); 19 | team.flags[this.service.name].push(flag); 20 | this.serviceCommandExecuter.plantFlag(flag, _.bind(function(status, line) { 21 | //Handle this 22 | }, this)); 23 | }, this)); 24 | }; 25 | 26 | TimedServiceHandler.prototype.checkFlags = function() { 27 | _.each(this.teams, _.bind(function(team) { 28 | var flag = _.last(team.flags[this.service.name]); 29 | this.serviceCommandExecuter.checkFlag(flag, _.bind(function(status, line) { 30 | //Handle this 31 | }, this)); 32 | }, this)); 33 | }; 34 | -------------------------------------------------------------------------------- /lib/userdataparser.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter, 2 | util = require('util'), 3 | _ = require('underscore'); 4 | 5 | module.exports = UserDataParser; 6 | 7 | function UserDataParser() { 8 | EventEmitter.call(this); 9 | 10 | var legalCommands = [ 11 | 'TEAM', 'FLAG' 12 | ]; 13 | this.data = ''; 14 | 15 | this.on('line', function(line) { 16 | var regex = /^([^ ]*) (.*)$/, 17 | match = regex.exec(line); 18 | if (match && _.indexOf(legalCommands, match[1]) !== -1) { 19 | this.emit(match[1], match[2]); 20 | } else { 21 | this.emit('malformed', line); 22 | } 23 | }); 24 | }; 25 | util.inherits(UserDataParser, EventEmitter); 26 | 27 | UserDataParser.prototype.append = function(data) { 28 | this.data = this._parse(this.data + data); 29 | return this.data; 30 | }; 31 | 32 | UserDataParser.prototype._parse = function(data) { 33 | var str; 34 | while (data.match(/\n/)) { 35 | str = data.replace(/([^\r\n]*?)[\r\n]+/, '$1'); 36 | data = data.replace(/[^\r\n]*?[\r\n]+(.*)/, '$1'); 37 | this.emit('line', str); 38 | } 39 | return data; 40 | }; 41 | 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Robert Larsen (http://www.the-playground.dk)", 3 | "name": "CTFd", 4 | "description": "Capture The Flag daemon", 5 | "version": "0.0.1", 6 | "repository": { 7 | "url": "" 8 | }, 9 | "main": "index", 10 | "engines": { 11 | "node": "~0.6.11" 12 | }, 13 | "dependencies": { 14 | "socket.io" : "0.8.7", 15 | "underscore" : "1.3.1", 16 | "choreographer" : "", 17 | "mongojs" : "" 18 | }, 19 | "devDependencies": { 20 | "expresso" : "0.9.2" 21 | }, 22 | "optionalDependencies": {} 23 | } 24 | -------------------------------------------------------------------------------- /scripts/challenge.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if test -z "${5}"; then 4 | echo "Usage: ${0}