Skip to content

Commit

Permalink
Fix socket closing early issue on tcpbanner and bump setuptools
Browse files Browse the repository at this point in the history
  • Loading branch information
jayjb committed Aug 6, 2022
1 parent b18181b commit ae6cac9
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 24 deletions.
52 changes: 29 additions & 23 deletions opencanary/modules/tcpbanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,34 +35,40 @@ def __init__(self, factory, banner_id , accept_banner, send_banner,

def connectionMade(self):
#We limit the data sent through to 255 chars
data = str(self.accept_banner)[:255]

logdata = {'FUNCTION': 'CONNECTION_MADE', 'DATA':data,
'BANNER_ID':str(self.banner_id)}

if self.keep_alive_enabled:
if hasattr(socket, 'TCP_KEEPIDLE'):
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_time
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, self.keep_alive_idle)
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_intvl
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, self.keep_alive_interval)
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_probes
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, self.keep_alive_probes)
# set keep alive on socket
self.transport.setTcpKeepAlive(1)

self.factory.canaryservice.logtype = self.factory.canaryservice.logger.LOG_TCP_BANNER_KEEP_ALIVE_CONNECTION_MADE
self.factory.canaryservice.log(logdata, transport=self.transport)
try:
data = str(self.accept_banner)[:255]

logdata = {'FUNCTION': 'CONNECTION_MADE', 'DATA':data,
'BANNER_ID':str(self.banner_id)}

if self.keep_alive_enabled:
if hasattr(socket, 'TCP_KEEPIDLE'):
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_time
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, self.keep_alive_idle)
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_intvl
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, self.keep_alive_interval)
# overrides value (in seconds) of system-wide ipv4 tcp_keepalive_probes
self.transport.getHandle().setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, self.keep_alive_probes)
# set keep alive on socket
self.transport.setTcpKeepAlive(1)

self.factory.canaryservice.logtype = self.factory.canaryservice.logger.LOG_TCP_BANNER_KEEP_ALIVE_CONNECTION_MADE
self.factory.canaryservice.log(logdata, transport=self.transport)

elif not self.alert_string_enabled:
#flag says we need to wait for incoming data to include a string
#so no point in logging anything here

elif not self.alert_string_enabled:
#flag says we need to wait for incoming data to include a string
#so no point in logging anything here
self.factory.canaryservice.logtype = self.factory.canaryservice.logger.LOG_TCP_BANNER_CONNECTION_MADE
self.factory.canaryservice.log(logdata, transport=self.transport)

self.transport.write(self.accept_banner)

except OSError:
print('Received an OSError. Likely the socket has closed.')
self.factory.canaryservice.logtype = self.factory.canaryservice.logger.LOG_TCP_BANNER_CONNECTION_MADE
self.factory.canaryservice.log(logdata, transport=self.transport)

self.transport.write(self.accept_banner)

def dataReceived(self, data):
"""
Recieved data from tcp connection after connection has been made.
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def get_version(rel_path):
'Jinja2==3.0.1',
'ntlmlib==0.72',
'bcrypt==3.1.7',
'setuptools==44.0.0',
'setuptools==63.2.0',
'hpfeeds==3.0.0']


Expand Down

0 comments on commit ae6cac9

Please sign in to comment.