def test_random_invalid_method(self):
        """
        We test sending data to a TCP echo server listening on port 80, if what
        we get back is not what we have sent then there is tampering going on.
        This is for example what squid will return when performing such
        request:

            HTTP/1.0 400 Bad Request
            Server: squid/2.6.STABLE21
            Date: Sat, 23 Jul 2011 02:22:44 GMT
            Content-Type: text/html
            Content-Length: 1178
            Expires: Sat, 23 Jul 2011 02:22:44 GMT
            X-Squid-Error: ERR_INVALID_REQ 0
            X-Cache: MISS from cache_server
            X-Cache-Lookup: NONE from cache_server:3128
            Via: 1.0 cache_server:3128 (squid/2.6.STABLE21)
            Proxy-Connection: close

        """
        payload = randomSTR(4) + " / HTTP/1.1\n\r"

        d = self.sendPayload(payload)
        d.addCallback(self.check_for_manipulation, payload)
        return d
Example #2
0
    def test_search_bad_request(self):
        """
        Attempts to perform a request with a random invalid HTTP method.

        If we are being MITMed by a Transparent Squid HTTP proxy we will get
        back a response containing the X-Squid-Error header.
        """
        def process_headers(headers):
            log.debug("Processing headers in test_search_bad_request")
            if 'X-Squid-Error' in headers:
                log.msg("Detected the presence of a transparent HTTP "\
                        "squid proxy")
                self.report['trans_http_proxy'] = True
            else:
                log.msg("Did not detect the presence of transparent HTTP "\
                        "squid proxy")
                self.report['transparent_http_proxy'] = False

        log.msg("Testing Squid proxy presence by sending a random bad request")
        headers = {}
        #headers["Host"] = [self.input]
        method = utils.randomSTR(10, True)
        self.report['transparent_http_proxy'] = None
        return self.doRequest(self.localOptions['backend'],
                              method=method,
                              headers=headers,
                              headers_processor=process_headers)
Example #3
0
    def test_search_bad_request(self):
        """
        Attempts to perform a request with a random invalid HTTP method.

        If we are being MITMed by a Transparent Squid HTTP proxy we will get
        back a response containing the X-Squid-Error header.
        """
        def process_headers(headers):
            log.debug("Processing headers in test_search_bad_request")
            if 'X-Squid-Error' in headers:
                log.msg("Detected the presence of a transparent HTTP "\
                        "squid proxy")
                self.report['trans_http_proxy'] = True
            else:
                log.msg("Did not detect the presence of transparent HTTP "\
                        "squid proxy")
                self.report['transparent_http_proxy'] = False

        log.msg("Testing Squid proxy presence by sending a random bad request")
        headers = {}
        #headers["Host"] = [self.input]
        method = utils.randomSTR(10, True)
        self.report['transparent_http_proxy'] = None
        return self.doRequest(self.localOptions['backend'], method=method,
                        headers=headers, headers_processor=process_headers)
Example #4
0
    def test_random_invalid_method(self):
        """
        We test sending data to a TCP echo server listening on port 80, if what
        we get back is not what we have sent then there is tampering going on.
        This is for example what squid will return when performing such
        request:

            HTTP/1.0 400 Bad Request
            Server: squid/2.6.STABLE21
            Date: Sat, 23 Jul 2011 02:22:44 GMT
            Content-Type: text/html
            Content-Length: 1178
            Expires: Sat, 23 Jul 2011 02:22:44 GMT
            X-Squid-Error: ERR_INVALID_REQ 0
            X-Cache: MISS from cache_server
            X-Cache-Lookup: NONE from cache_server:3128
            Via: 1.0 cache_server:3128 (squid/2.6.STABLE21)
            Proxy-Connection: close

        """
        payload = randomSTR(4) + " / HTTP/1.1\n\r"

        d = self.sendPayload(payload)
        d.addCallback(self.check_for_manipulation, payload)
        return d
def get_measurement_header():
    return {
        'probe_asn': 'AS'+str(random.randint(0, 2**16)),
        'probe_cc': randomSTR(2, num=False),
        'probe_ip': '127.0.0.1',
        'probe_city': None,
        'software_name': 'ooniprobe',
        'software_version': '0.0.0',
        'options': {},
        'annotations': {},
        'data_format_version': '0.2.0',
        'test_name': 'dummy',
        'test_version': '0.0.0',
        'test_helpers': {},
        'test_start_time': '2016-01-01 01:01:01',
        'test_runtime': 0.1,
        'input_hashes': [],
        'report_id': randomSTR(100),
        'test_keys': {},
        'input': ''
    }
Example #6
0
def get_measurement_header():
    return {
        'probe_asn': 'AS' + str(random.randint(0, 2**16)),
        'probe_cc': randomSTR(2, num=False),
        'probe_ip': '127.0.0.1',
        'probe_city': None,
        'software_name': 'ooniprobe',
        'software_version': '0.0.0',
        'options': {},
        'annotations': {},
        'data_format_version': '0.2.0',
        'test_name': 'dummy',
        'test_version': '0.0.0',
        'test_helpers': {},
        'test_start_time': '2016-01-01 01:01:01',
        'test_runtime': 0.1,
        'input_hashes': [],
        'report_id': randomSTR(100),
        'test_keys': {},
        'input': ''
    }
def write_dummy_measurements(fh, size=100):
    """
    :param fh: an open file handle
    :param size: size of the measurements in bytes to write
    :return: The actual size that has been written.
    """
    written_size = 0
    while written_size < size:
        entry = get_measurement_header()
        entry['test_keys']['data'] = randomSTR(int(size / 10))
        data = json.dumps(entry)
        written_size += len(data)
        fh.write(data)
    return written_size
Example #8
0
def write_dummy_measurements(fh, size=100):
    """
    :param fh: an open file handle
    :param size: size of the measurements in bytes to write
    :return: The actual size that has been written.
    """
    written_size = 0
    while written_size < size:
        entry = get_measurement_header()
        entry['test_keys']['data'] = randomSTR(int(size / 10))
        data = json.dumps(entry)
        written_size += len(data)
        fh.write(data)
    return written_size
Example #9
0
def random_measurement_name(start_date=None, end_date=None):
    # By default we use as start date something in the past 6 days and end
    # date today.
    if start_date is None:
        start_date = datetime.now() - timedelta(days=6)
    if end_date is None:
        end_date = datetime.now()

    test_details = dict(
        test_name=random.choice([
            'http_invalid_request_line', 'web_connectivity',
            'http_header_field_manipulation', 'vanilla_tor', 'new_test_name'
        ]),
        probe_cc=randomSTR(2, num=False),  # XXX this should be a valid CC
        probe_asn='AS' + str(random.randint(0, 2**16)),
        test_start_time=randomDate(start_date, end_date).strftime(LONG_DATE))
    return generate_filename(test_details)
def random_measurement_name(start_date=None, end_date=None):
    # By default we use as start date something in the past 6 days and end
    # date today.
    if start_date is None:
        start_date = datetime.now() - timedelta(days=6)
    if end_date is None:
        end_date = datetime.now()

    test_details = dict(
        test_name=random.choice(['http_invalid_request_line',
                                 'web_connectivity',
                                 'http_header_field_manipulation',
                                 'vanilla_tor',
                                 'new_test_name']),
        probe_cc=randomSTR(2, num=False), # XXX this should be a valid CC
        probe_asn='AS'+str(random.randint(0, 2**16)),
        test_start_time=randomDate(start_date, end_date).strftime(LONG_DATE)
    )
    return generate_filename(test_details)