forked from p15670423/monkey
Agent: Implement fingerprinting in Puppet
This commit is contained in:
parent
46487be05d
commit
6d5b55be10
|
@ -18,6 +18,7 @@ from infection_monkey.master.control_channel import ControlChannel
|
||||||
from infection_monkey.model import DELAY_DELETE_CMD, VictimHostFactory
|
from infection_monkey.model import DELAY_DELETE_CMD, VictimHostFactory
|
||||||
from infection_monkey.network import NetworkInterface
|
from infection_monkey.network import NetworkInterface
|
||||||
from infection_monkey.network.firewall import app as firewall
|
from infection_monkey.network.firewall import app as firewall
|
||||||
|
from infection_monkey.network.http_fingerprinter import HTTPFingerprinter
|
||||||
from infection_monkey.network.info import get_local_network_interfaces
|
from infection_monkey.network.info import get_local_network_interfaces
|
||||||
from infection_monkey.payload.ransomware.ransomware_payload import RansomwarePayload
|
from infection_monkey.payload.ransomware.ransomware_payload import RansomwarePayload
|
||||||
from infection_monkey.puppet.puppet import Puppet
|
from infection_monkey.puppet.puppet import Puppet
|
||||||
|
@ -183,6 +184,7 @@ class InfectionMonkey:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _build_puppet() -> IPuppet:
|
def _build_puppet() -> IPuppet:
|
||||||
puppet = Puppet()
|
puppet = Puppet()
|
||||||
|
puppet.load_plugin("HTTPFinger", HTTPFingerprinter(), PluginType.FINGERPRINTER)
|
||||||
puppet.load_plugin("ransomware", RansomwarePayload(), PluginType.PAYLOAD)
|
puppet.load_plugin("ransomware", RansomwarePayload(), PluginType.PAYLOAD)
|
||||||
|
|
||||||
return puppet
|
return puppet
|
||||||
|
|
|
@ -63,8 +63,12 @@ def _query_potential_http_server(host: str, port: int) -> Tuple[Optional[str], O
|
||||||
|
|
||||||
def _get_server_from_headers(url: str) -> Optional[str]:
|
def _get_server_from_headers(url: str) -> Optional[str]:
|
||||||
try:
|
try:
|
||||||
|
logger.debug(f"Sending request for headers to {url}")
|
||||||
with closing(head(url, verify=False, timeout=1)) as req: # noqa: DUO123
|
with closing(head(url, verify=False, timeout=1)) as req: # noqa: DUO123
|
||||||
return req.headers.get("Server")
|
server = req.headers.get("Server")
|
||||||
|
|
||||||
|
logger.debug(f'Got server string "{server}" from {url}')
|
||||||
|
return server
|
||||||
except Timeout:
|
except Timeout:
|
||||||
logger.debug(f"Timeout while requesting headers from {url}")
|
logger.debug(f"Timeout while requesting headers from {url}")
|
||||||
except ConnectionError: # Someone doesn't like us
|
except ConnectionError: # Someone doesn't like us
|
||||||
|
@ -76,5 +80,5 @@ def _get_server_from_headers(url: str) -> Optional[str]:
|
||||||
def _get_open_http_ports(
|
def _get_open_http_ports(
|
||||||
allowed_http_ports: Set, port_scan_data: Dict[int, PortScanData]
|
allowed_http_ports: Set, port_scan_data: Dict[int, PortScanData]
|
||||||
) -> Iterable[int]:
|
) -> Iterable[int]:
|
||||||
open_ports = (psd.port for psd in port_scan_data.values() if psd.status == PortStatus.Open)
|
open_ports = (psd.port for psd in port_scan_data.values() if psd.status == PortStatus.OPEN)
|
||||||
return (port for port in open_ports if port in allowed_http_ports)
|
return (port for port in open_ports if port in allowed_http_ports)
|
||||||
|
|
|
@ -49,7 +49,8 @@ class Puppet(IPuppet):
|
||||||
port_scan_data: Dict[int, PortScanData],
|
port_scan_data: Dict[int, PortScanData],
|
||||||
options: Dict,
|
options: Dict,
|
||||||
) -> FingerprintData:
|
) -> FingerprintData:
|
||||||
return self._mock_puppet.fingerprint(name, host, ping_scan_data, port_scan_data, options)
|
fingerprinter = self._plugin_registry.get_plugin(name, PluginType.FINGERPRINTER)
|
||||||
|
return fingerprinter.get_host_fingerprint(host, ping_scan_data, port_scan_data, options)
|
||||||
|
|
||||||
def exploit_host(
|
def exploit_host(
|
||||||
self, name: str, host: str, options: Dict, interrupt: threading.Event
|
self, name: str, host: str, options: Dict, interrupt: threading.Event
|
||||||
|
|
Loading…
Reference in New Issue