diff --git a/monkey/tests/unit_tests/infection_monkey/network_scanning/test_http_fingerprinter.py b/monkey/tests/unit_tests/infection_monkey/network_scanning/test_http_fingerprinter.py index 20a320048..dde307506 100644 --- a/monkey/tests/unit_tests/infection_monkey/network_scanning/test_http_fingerprinter.py +++ b/monkey/tests/unit_tests/infection_monkey/network_scanning/test_http_fingerprinter.py @@ -5,7 +5,7 @@ import pytest from infection_monkey.i_puppet import PortScanData, PortStatus from infection_monkey.network_scanning.http_fingerprinter import HTTPFingerprinter -OPTIONS = {"http_ports": [80, 443, 8080, 9200]} +OPTIONS = {"http_ports": [80, 443, 1080, 8080, 9200]} PYTHON_SERVER_HEADER = {"Server": "SimpleHTTP/0.6 Python/3.6.9"} APACHE_SERVER_HEADER = {"Server": "Apache/Server/Header"} @@ -26,7 +26,7 @@ def mock_get_http_headers(): @pytest.fixture(autouse=True) def patch_get_http_headers(monkeypatch, mock_get_http_headers): monkeypatch.setattr( - "infection_monkey.network_scanning.http_fingerprinter._get_server_from_headers", + "infection_monkey.network_scanning.http_fingerprinter._get_http_headers", mock_get_http_headers, ) @@ -36,7 +36,7 @@ def http_fingerprinter(): return HTTPFingerprinter() -def test_no_http_ports_open(mock_get_server_from_headers, http_fingerprinter): +def test_no_http_ports_open(mock_get_http_headers, http_fingerprinter): port_scan_data = { 80: PortScanData(80, PortStatus.CLOSED, "", "tcp-80"), 123: PortScanData(123, PortStatus.OPEN, "", "tcp-123"), @@ -45,10 +45,10 @@ def test_no_http_ports_open(mock_get_server_from_headers, http_fingerprinter): } http_fingerprinter.get_host_fingerprint("127.0.0.1", None, port_scan_data, OPTIONS) - assert not mock_get_server_from_headers.called + assert not mock_get_http_headers.called -def test_fingerprint_only_port_443(mock_get_server_from_headers, http_fingerprinter): +def test_fingerprint_only_port_443(mock_get_http_headers, http_fingerprinter): port_scan_data = { 80: PortScanData(80, PortStatus.CLOSED, "", "tcp-80"), 123: PortScanData(123, PortStatus.OPEN, "", "tcp-123"), @@ -59,18 +59,18 @@ def test_fingerprint_only_port_443(mock_get_server_from_headers, http_fingerprin "127.0.0.1", None, port_scan_data, OPTIONS ) - assert mock_get_server_from_headers.call_count == 1 - mock_get_server_from_headers.assert_called_with("https://127.0.0.1:443") + assert mock_get_http_headers.call_count == 1 + mock_get_http_headers.assert_called_with("https://127.0.0.1:443") assert fingerprint_data.os_type is None assert fingerprint_data.os_version is None assert len(fingerprint_data.services.keys()) == 1 - assert fingerprint_data.services["tcp-443"]["data"][0] == PYTHON_SERVER_HEADER + assert fingerprint_data.services["tcp-443"]["data"][0] == PYTHON_SERVER_HEADER["Server"] assert fingerprint_data.services["tcp-443"]["data"][1] is True -def test_open_port_no_http_server(mock_get_server_from_headers, http_fingerprinter): +def test_open_port_no_http_server(mock_get_http_headers, http_fingerprinter): port_scan_data = { 80: PortScanData(80, PortStatus.CLOSED, "", "tcp-80"), 123: PortScanData(123, PortStatus.OPEN, "", "tcp-123"), @@ -81,16 +81,16 @@ def test_open_port_no_http_server(mock_get_server_from_headers, http_fingerprint "127.0.0.1", None, port_scan_data, OPTIONS ) - assert mock_get_server_from_headers.call_count == 2 - mock_get_server_from_headers.assert_any_call("https://127.0.0.1:9200") - mock_get_server_from_headers.assert_any_call("http://127.0.0.1:9200") + assert mock_get_http_headers.call_count == 2 + mock_get_http_headers.assert_any_call("https://127.0.0.1:9200") + mock_get_http_headers.assert_any_call("http://127.0.0.1:9200") assert fingerprint_data.os_type is None assert fingerprint_data.os_version is None assert len(fingerprint_data.services.keys()) == 0 -def test_multiple_open_ports(mock_get_server_from_headers, http_fingerprinter): +def test_multiple_open_ports(mock_get_http_headers, http_fingerprinter): port_scan_data = { 80: PortScanData(80, PortStatus.CLOSED, "", "tcp-80"), 443: PortScanData(443, PortStatus.OPEN, "", "tcp-443"), @@ -100,16 +100,34 @@ def test_multiple_open_ports(mock_get_server_from_headers, http_fingerprinter): "127.0.0.1", None, port_scan_data, OPTIONS ) - assert mock_get_server_from_headers.call_count == 3 - mock_get_server_from_headers.assert_any_call("https://127.0.0.1:443") - mock_get_server_from_headers.assert_any_call("https://127.0.0.1:8080") - mock_get_server_from_headers.assert_any_call("http://127.0.0.1:8080") + assert mock_get_http_headers.call_count == 3 + mock_get_http_headers.assert_any_call("https://127.0.0.1:443") + mock_get_http_headers.assert_any_call("https://127.0.0.1:8080") + mock_get_http_headers.assert_any_call("http://127.0.0.1:8080") assert fingerprint_data.os_type is None assert fingerprint_data.os_version is None assert len(fingerprint_data.services.keys()) == 2 - assert fingerprint_data.services["tcp-443"]["data"][0] == PYTHON_SERVER_HEADER + assert fingerprint_data.services["tcp-443"]["data"][0] == PYTHON_SERVER_HEADER["Server"] assert fingerprint_data.services["tcp-443"]["data"][1] is True - assert fingerprint_data.services["tcp-8080"]["data"][0] == APACHE_SERVER_HEADER + assert fingerprint_data.services["tcp-8080"]["data"][0] == APACHE_SERVER_HEADER["Server"] assert fingerprint_data.services["tcp-8080"]["data"][1] is False + + +def test_server_missing_from_http_headers(mock_get_http_headers, http_fingerprinter): + port_scan_data = { + 1080: PortScanData(1080, PortStatus.OPEN, "", "tcp-1080"), + } + fingerprint_data = http_fingerprinter.get_host_fingerprint( + "127.0.0.1", None, port_scan_data, OPTIONS + ) + + assert mock_get_http_headers.call_count == 2 + + assert fingerprint_data.os_type is None + assert fingerprint_data.os_version is None + assert len(fingerprint_data.services.keys()) == 1 + + assert fingerprint_data.services["tcp-1080"]["data"][0] == "" + assert fingerprint_data.services["tcp-1080"]["data"][1] is False