diff options
author | David Barksdale <amatus.amongus@gmail.com> | 2012-04-09 21:55:20 -0500 |
---|---|---|
committer | David Barksdale <amatus.amongus@gmail.com> | 2012-04-10 09:24:34 -0500 |
commit | dc7d259388543f55e4d4126ce874c4b71f48d5f6 (patch) | |
tree | 76cb6c3e7b91042494d5c3bfbc0b010ed5c60dc1 | |
parent | c8d51d66e25e7d5246e7da5a37c500c96fa8e12e (diff) |
Added a README.md for the challenges.
-rw-r--r-- | flags/README.md | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/flags/README.md b/flags/README.md new file mode 100644 index 0000000..b7ec3d4 --- /dev/null +++ b/flags/README.md @@ -0,0 +1,166 @@ +Simple +====== + +Files +----- + + -rwxr-sr-x 1 root simple 5266 Apr 6 02:08 simple + -rw-r--r-- 1 root root 363 Apr 6 02:08 simple.c + -rw-r----- 1 root simple 33 Apr 6 02:00 simple.flag + -rw-r--r-- 1 root root 33 Apr 6 01:59 simple.not.the.flag + +Synopsis +-------- + +This program opens a file named "simple.not.the.flag" and prints its contents. +The file containing the flag is named "/flags/simple.flag". + +Vulnerability +------------- + +The open call looks in the current directory for a file named +"simple.not.the.flag" and will follow symlinks, rather than opening the +intended file named "/flags/simple.not.the.flag" which the unprivileged user +has no control over. + +Exploit +------- + +Change the current directory to one in which we have write permissions. + cd ~ +Create a symlink named "simple.not.the.flag" that points to the flag file we +want. + ln -s /flags/simple.flag simple.not.the.flag +Run the program from this directory. + /flags/simple + +Exec +==== + +Files +----- + + -rwxr-sr-x 1 root exec 6477 Apr 5 22:50 exec + -rw-r--r-- 1 root root 883 Apr 5 22:50 exec.c + -rw-r----- 1 root exec 33 Apr 5 00:32 exec.flag + +Synopsis +-------- + +This program: +1. Opens the flag file "/flags/exec.flag". +2. Reads it into memory. +3. Forks a child process. +4. Drops privileges in the child process before executing a user-specified +program. +5. Waits for the child to exit. + +Vulnerability +------------- + +The program forgets to close the open file descriptor to the flag file before +execing the user-specified program in step 4. Step 2 is simply misdirection +supported by comments in the code. + +Exploit +------- + +Write a program which performs the following operations on file descriptor +number 3: +1. Seeks to the beginning of the file. +2. Reads the contents of the file and prints it out. +Run the exec program given the name of the our exploit program to execute. + +RSA +=== + +Files +----- + + -rwxr-xr-x 1 root root 217 Apr 6 00:41 make-keys.rsa + -rw-r----- 1 root rsa 33 Apr 5 23:19 rsa.flag + -rw-r----- 1 root rsa 1600 Apr 6 00:48 rsa.keys + -rwxr-xr-x 1 root root 1966 Apr 6 23:12 rsa.py + -rwxr-sr-x 1 root rsa 5794 Apr 6 20:19 rsa-runner + -rw-r--r-- 1 root root 468 Apr 6 20:19 rsa-runner.c + +Synopsis +-------- + +The make-keys.rsa program is a python script which generates the rsa.keys +keystore containing a private and public key for "Alice" and a public key for +"Bob". +The rsa-runner program is a setgid wrapper for rsa.py, since interpred scripts +cannot be run setgid. +The rsa.py program reads the flag file and the keystore into memory and then +starts a TCPServer to handle requests. When a request is received it is +unpickled into a python object and the "request" property is examined. +If the request property is the string "start" a new python object with the +following properties is pickled and sent to the remote peer: +name = "Alice" +request = "get_flag" +keyid = MD5(DER encoding of Alice's public key) +signature = Sig(request + ":" + AsciiHex(keyid), Alice's private key) +If the request property is the string "get_flag" the message must pass these +tests before the flag is sent to the remote peer: +The the name property must exist in the keystore. +The keyid property must match the MD5 hash of a key in the keystore. +The name must not be the string "Alice". +The signature is validated against the key in the keystore which matches the +keyid property. + +Vulnerability +------------- + +The name property is not covered by the signature, nor is it checked against +keyid, nor is it used to select the signature verification key, so it can be +modified without detection leaving a "valid" get_flag request. + +Exploit +------- + +Using the python REPL, connect to the rsa.py server, send the "start" request, +and unpickle the response. + >>> import socket, pickle + >>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + >>> sock.connect(('localhost', 6666)) + >>> class Request: + ... pass + ... + >>> msg = Request() + >>> msg.request='start' + >>> sock.sendall(pickle.dumps(msg)) + >>> buf = sock.recv(1024) + >>> msg2 = pickle.loads(buf) +Reconnect to the server (this has something to do with the way I coded rsa.py), +modify the name property of the reponse to "Bob" and send it back. + >>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + >>> sock.connect(('localhost', 6666)) + >>> msg2.name='Bob' + >>> sock.sendall(pickle.dumps(msg2)) +Consume the response and unpickle it. + >>> buf = sock.recv(1024) + >>> pickle.loads(buf) + +Lottery +======= + +Files +----- + + -rw-r----- 1 root 1666 33 Apr 5 22:33 lottery.flag + +Synopsis +-------- + +This is simply a flag file that can only be read by group 1666. + +Vulnerability +------------- + +The CTF website allows competitors to create a user and group for themselves. + +Exploit +------- + +Write a script to create users and groups until group number 1666 is assigned. |