4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / server.py PY
#!/usr/bin/env python3

__author__ = 'Chariton Karamitas <[email protected]>'


import sys
import os
import hashlib
import http
import http.server
import socketserver
import tempfile

import logger


_ADDRESS = ''
_PORT = 8000


class _HTTPRequestHandler(http.server.BaseHTTPRequestHandler):

    def setup(self):
        super(_HTTPRequestHandler, self).setup()
        self._logger = logger.get_logger(self.__class__.__name__)


    def _handle_push(self):

        try:
            content_length = int(self.headers.get('Content-Length', 0))
        except ValueError:
            content_length = 0

        data = bytes()
        while len(data) < content_length:
            data += self.rfile.read(content_length - len(data))

        if len(data) > 0:

            filename = '%s/%s.bin' % (tempfile.gettempdir(), hashlib.md5(data).hexdigest())
            with open(filename, 'wb') as fp:
                fp.write(data)

            self._logger.info('Received %d bytes, stored in %s' % (content_length, filename))



    def _handle_log(self):

        try:
            content_length = int(self.headers.get('Content-Length', 0))
        except ValueError:
            content_length = 0

        data = bytes()
        while len(data) < content_length:
            data += self.rfile.read(content_length - len(data))

        if len(data) > 0:
            self._logger.info(data.decode('utf-8'))



    def do_POST(self, *args, **kwargs):

        if self.path == '/push':
            self._handle_push()
        elif self.path == '/log':
            self._handle_log()

        self.send_response(http.HTTPStatus.OK)


    def log_message(self, format, *args):
        pass



class _AddressReuseTCPServer(socketserver.TCPServer):
    allow_reuse_address = True


def start(address, port):
    try:
        with _AddressReuseTCPServer((address, port), _HTTPRequestHandler) as httpd:
            httpd.serve_forever()
    except KeyboardInterrupt:
        pass

    return os.EX_OK


def main(argv):
    print('Starting server on %s:%d' % (_ADDRESS, _PORT))
    start(_ADDRESS, _PORT)
    return os.EX_OK


if __name__ == '__main__':
    sys.exit(main(sys.argv))