forked from p15670423/monkey
Merge pull request #2352 from guardicore/2323-SocketAddress-in-TCPRelay
SocketAddress in TCPRelay
This commit is contained in:
commit
aec9cbb4b1
|
@ -21,6 +21,7 @@ from common.network.network_utils import (
|
||||||
get_my_ip_addresses,
|
get_my_ip_addresses,
|
||||||
get_network_interfaces,
|
get_network_interfaces,
|
||||||
)
|
)
|
||||||
|
from common.types import SocketAddress
|
||||||
from common.utils.argparse_types import positive_int
|
from common.utils.argparse_types import positive_int
|
||||||
from common.utils.attack_utils import ScanStatus, UsageEnum
|
from common.utils.attack_utils import ScanStatus, UsageEnum
|
||||||
from common.version import get_version
|
from common.version import get_version
|
||||||
|
@ -120,6 +121,11 @@ class InfectionMonkey:
|
||||||
# TODO: `address_to_port()` should return the port as an integer.
|
# TODO: `address_to_port()` should return the port as an integer.
|
||||||
self._cmd_island_ip, self._cmd_island_port = address_to_ip_port(server)
|
self._cmd_island_ip, self._cmd_island_port = address_to_ip_port(server)
|
||||||
self._cmd_island_port = int(self._cmd_island_port)
|
self._cmd_island_port = int(self._cmd_island_port)
|
||||||
|
|
||||||
|
self._island_address = SocketAddress(
|
||||||
|
IPv4Address(self._cmd_island_ip), self._cmd_island_port
|
||||||
|
)
|
||||||
|
|
||||||
self._control_client = ControlClient(
|
self._control_client = ControlClient(
|
||||||
server_address=server, island_api_client=self._island_api_client
|
server_address=server, island_api_client=self._island_api_client
|
||||||
)
|
)
|
||||||
|
@ -232,8 +238,7 @@ class InfectionMonkey:
|
||||||
relay_port = get_free_tcp_port()
|
relay_port = get_free_tcp_port()
|
||||||
self._relay = TCPRelay(
|
self._relay = TCPRelay(
|
||||||
relay_port,
|
relay_port,
|
||||||
IPv4Address(self._cmd_island_ip),
|
self._island_address,
|
||||||
self._cmd_island_port,
|
|
||||||
client_disconnect_timeout=config.keep_tunnel_open_time,
|
client_disconnect_timeout=config.keep_tunnel_open_time,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -487,7 +492,7 @@ class InfectionMonkey:
|
||||||
|
|
||||||
def _close_tunnel(self):
|
def _close_tunnel(self):
|
||||||
logger.info(f"Quitting tunnel {self._cmd_island_ip}")
|
logger.info(f"Quitting tunnel {self._cmd_island_ip}")
|
||||||
notify_disconnect(self._cmd_island_ip, self._cmd_island_port)
|
notify_disconnect(self._island_address)
|
||||||
|
|
||||||
def _send_log(self):
|
def _send_log(self):
|
||||||
monkey_log_path = get_agent_log_path()
|
monkey_log_path = get_agent_log_path()
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import socket
|
import socket
|
||||||
from ipaddress import IPv4Address
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
|
from common.types import SocketAddress
|
||||||
|
|
||||||
from .consts import SOCKET_TIMEOUT
|
from .consts import SOCKET_TIMEOUT
|
||||||
from .sockets_pipe import SocketsPipe
|
from .sockets_pipe import SocketsPipe
|
||||||
|
|
||||||
|
@ -15,9 +16,9 @@ class TCPPipeSpawner:
|
||||||
Creates bi-directional pipes between the configured client and other clients.
|
Creates bi-directional pipes between the configured client and other clients.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, target_addr: IPv4Address, target_port: int):
|
def __init__(self, target_addr: SocketAddress):
|
||||||
self._target_addr = target_addr
|
self._target_ip = target_addr.ip
|
||||||
self._target_port = target_port
|
self._target_port = target_addr.port
|
||||||
self._pipes: Set[SocketsPipe] = set()
|
self._pipes: Set[SocketsPipe] = set()
|
||||||
self._lock = Lock()
|
self._lock = Lock()
|
||||||
|
|
||||||
|
@ -31,7 +32,7 @@ class TCPPipeSpawner:
|
||||||
dest = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
dest = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
dest.settimeout(SOCKET_TIMEOUT)
|
dest.settimeout(SOCKET_TIMEOUT)
|
||||||
try:
|
try:
|
||||||
dest.connect((str(self._target_addr), self._target_port))
|
dest.connect((str(self._target_ip), self._target_port))
|
||||||
except OSError as err:
|
except OSError as err:
|
||||||
source.close()
|
source.close()
|
||||||
dest.close()
|
dest.close()
|
||||||
|
|
|
@ -3,6 +3,7 @@ from logging import getLogger
|
||||||
from threading import Lock, Thread
|
from threading import Lock, Thread
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
|
from common.types import SocketAddress
|
||||||
from infection_monkey.network.relay import (
|
from infection_monkey.network.relay import (
|
||||||
RelayConnectionHandler,
|
RelayConnectionHandler,
|
||||||
RelayUserHandler,
|
RelayUserHandler,
|
||||||
|
@ -22,15 +23,14 @@ class TCPRelay(Thread, InterruptableThreadMixin):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
relay_port: int,
|
relay_port: int,
|
||||||
dest_addr: IPv4Address,
|
dest_address: SocketAddress,
|
||||||
dest_port: int,
|
|
||||||
client_disconnect_timeout: float,
|
client_disconnect_timeout: float,
|
||||||
):
|
):
|
||||||
self._user_handler = RelayUserHandler(
|
self._user_handler = RelayUserHandler(
|
||||||
new_client_timeout=client_disconnect_timeout,
|
new_client_timeout=client_disconnect_timeout,
|
||||||
client_disconnect_timeout=client_disconnect_timeout,
|
client_disconnect_timeout=client_disconnect_timeout,
|
||||||
)
|
)
|
||||||
self._pipe_spawner = TCPPipeSpawner(dest_addr, dest_port)
|
self._pipe_spawner = TCPPipeSpawner(dest_address)
|
||||||
relay_filter = RelayConnectionHandler(self._pipe_spawner, self._user_handler)
|
relay_filter = RelayConnectionHandler(self._pipe_spawner, self._user_handler)
|
||||||
self._connection_handler = TCPConnectionHandler(
|
self._connection_handler = TCPConnectionHandler(
|
||||||
bind_host="",
|
bind_host="",
|
||||||
|
|
|
@ -6,6 +6,7 @@ from typing import Dict, Iterable, Iterator, Optional
|
||||||
|
|
||||||
from common.common_consts.timeouts import LONG_REQUEST_TIMEOUT
|
from common.common_consts.timeouts import LONG_REQUEST_TIMEOUT
|
||||||
from common.network.network_utils import address_to_ip_port
|
from common.network.network_utils import address_to_ip_port
|
||||||
|
from common.types import SocketAddress
|
||||||
from infection_monkey.island_api_client import (
|
from infection_monkey.island_api_client import (
|
||||||
AbstractIslandAPIClientFactory,
|
AbstractIslandAPIClientFactory,
|
||||||
IIslandAPIClient,
|
IIslandAPIClient,
|
||||||
|
@ -90,22 +91,22 @@ def send_remove_from_waitlist_control_message_to_relays(servers: Iterable[str]):
|
||||||
|
|
||||||
def _send_remove_from_waitlist_control_message_to_relay(server: str):
|
def _send_remove_from_waitlist_control_message_to_relay(server: str):
|
||||||
ip, port = address_to_ip_port(server)
|
ip, port = address_to_ip_port(server)
|
||||||
notify_disconnect(IPv4Address(ip), int(port))
|
server_address = SocketAddress(IPv4Address(ip), int(port))
|
||||||
|
notify_disconnect(server_address)
|
||||||
|
|
||||||
|
|
||||||
def notify_disconnect(server_ip: IPv4Address, server_port: int):
|
def notify_disconnect(server_address: SocketAddress):
|
||||||
"""
|
"""
|
||||||
Tell upstream relay that we no longer need the relay.
|
Tell upstream relay that we no longer need the relay
|
||||||
|
|
||||||
:param server_ip: The IP address of the server to notify.
|
:param server_address: The address of the server to notify
|
||||||
:param server_port: The port of the server to notify.
|
|
||||||
"""
|
"""
|
||||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as d_socket:
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as d_socket:
|
||||||
d_socket.settimeout(LONG_REQUEST_TIMEOUT)
|
d_socket.settimeout(LONG_REQUEST_TIMEOUT)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
d_socket.connect((str(server_ip), server_port))
|
d_socket.connect((str(server_address.ip), server_address.port))
|
||||||
d_socket.sendall(RELAY_CONTROL_MESSAGE_REMOVE_FROM_WAITLIST)
|
d_socket.sendall(RELAY_CONTROL_MESSAGE_REMOVE_FROM_WAITLIST)
|
||||||
logger.info(f"Control message was sent to the server/relay {server_ip}:{server_port}")
|
logger.info(f"Control message was sent to the server/relay {server_address}")
|
||||||
except OSError as err:
|
except OSError as err:
|
||||||
logger.error(f"Error connecting to socket {server_ip}:{server_port}: {err}")
|
logger.error(f"Error connecting to socket {server_address}: {err}")
|
||||||
|
|
|
@ -8,7 +8,6 @@ from common.agent_configuration.agent_sub_configurations import (
|
||||||
ScanTargetConfiguration,
|
ScanTargetConfiguration,
|
||||||
)
|
)
|
||||||
from common.credentials import Credentials, LMHash, NTHash
|
from common.credentials import Credentials, LMHash, NTHash
|
||||||
from common.types import SocketAddress
|
|
||||||
from infection_monkey.exploit.log4shell_utils.ldap_server import LDAPServerFactory
|
from infection_monkey.exploit.log4shell_utils.ldap_server import LDAPServerFactory
|
||||||
from monkey_island.cc.event_queue import IslandEventTopic, PyPubSubIslandEventQueue
|
from monkey_island.cc.event_queue import IslandEventTopic, PyPubSubIslandEventQueue
|
||||||
from monkey_island.cc.models import Report
|
from monkey_island.cc.models import Report
|
||||||
|
@ -326,6 +325,3 @@ SCANNED
|
||||||
EXPLOITED
|
EXPLOITED
|
||||||
CC
|
CC
|
||||||
CC_TUNNEL
|
CC_TUNNEL
|
||||||
|
|
||||||
# TODO: Remove after #2323
|
|
||||||
SocketAddress
|
|
||||||
|
|
Loading…
Reference in New Issue