IRCP

- information gathering tool for irc servers
git clone git://git.acid.vegas/IRCP.git
Log | Files | Refs | Archive | README | LICENSE

commit 3f66438ebebcbe4c619c8f4486324ea78ed19e6d
parent 7ace89b6592fbcb1362e8d9d0c0af6977c05b979
Author: acidvegas <acid.vegas@acid.vegas>
Date: Mon, 5 Jun 2023 21:36:25 -0400

Improved ban detections & added SSL/TLS cipher logging

Diffstat:
Mircp.py | 52++++++++++++++++++++++++++++++++++------------------

1 file changed, 34 insertions(+), 18 deletions(-)

diff --git a/ircp.py b/ircp.py
@@ -53,6 +53,26 @@ badchan = {
 	'520' : 'ERR_OPERONLY',         '926' : 'ERR_BADCHANNEL'
 }
 
+badserver = {
+	'install identd'                              : 'Identd required',
+	'trying to reconnect too fast'                : 'Throttled',
+	'your host is trying to (re)connect too fast' : 'Throttled',
+	'reconnecting too fast'                       : 'Throttled',
+	'access denied'                               : 'Access denied',
+	'not authorized to'                           : 'Not authorized',
+	'not authorised to'                           : 'Not authorized',
+	'password mismatch'                           : 'Password mismatch',
+	'dronebl'                                     : 'DroneBL',
+	'dnsbl'                                       : 'DNSBL',
+	'g:lined'                                     : 'G:Lined',
+	'z:lined'                                     : 'Z:Lined',
+	'timeout'                                     : 'Timeout',
+	'closing link'                                : 'Banned',
+	'banned'                                      : 'Banned',
+	'client exited'                               : 'QUIT',
+	'quit'                                        : 'QUIT'
+}
+
 def backup(name):
 	try:
 		with tarfile.open(f'backup/{name}.tar.gz', 'w:gz') as tar:
@@ -253,17 +273,11 @@ class probe:
 						del self.channels['users'][chan]
 					error(f'{self.display}\033[31merror\033[0m - {chan}', badchan[event])
 				elif line.startswith('ERROR :'):
-					if line.startswith('ERROR :Closing Link'):
-						if 'dronebl' in line.lower():
+					check = [check for check in badserver if check in line.lower()]
+					if check:
+						if check[0] in ('dronebl','dnsbl'):
 							self.snapshot['proxy'] = True
-							error(self.display + '\033[93mDroneBL detected\033[0m')
-							raise Exception('DroneBL')
-						else:
-							raise Exception('Banned')
-					elif line.startswith('ERROR :Trying to reconnect too fast') or line.startswith('ERROR :Your host is trying to (re)connect too fast') or line.startswith('ERROR :Reconnecting too fast'):
-						raise Exception('Throttled')
-					elif line.startswith('ERROR :Access denied'):
-						raise Exception('Access denied')
+						raise Exception(badserver[check[0]])
 				elif args[0] == 'PING':
 					await self.raw('PONG ' + args[1][1:])
 				elif event == '001': #RPL_WELCOME
@@ -286,7 +300,7 @@ class probe:
 					nick = args[3]
 					if 'open proxy' in line.lower() or 'proxy monitor' in line.lower():
 						self.snapshot['proxy'] = True
-						error(self.display + '\033[93mProxy Monitor detected\033[0m')
+						error(self.display + '\033[93mProxy Monitor detected\033[0m', nick)
 					else:
 						debug(f'{self.display}\033[34mWHOIS\033[0m {nick}')
 				elif event == '322' and len(args) >= 4: # RPL_LIST
@@ -336,12 +350,11 @@ class probe:
 							self.jthrottle = throttle.seconds if seconds > throttle.seconds else seconds
 					error(self.display + '\033[31merror\033[0m - delay found', msg)
 				elif event == '465': # ERR_YOUREBANNEDCREEP
-					if 'dronebl' in line.lower():
-						self.snapshot['proxy'] = True
-						error(self.display + '\033[93mDroneBL detected\033[0m')
-						raise Exception('DroneBL')
-					else:
-						raise Exception('K-Lined')
+					check = [check for check in badserver if check in line.lower()]
+					if check:
+						if check[0] in ('dronebl','dnsbl'):
+							self.snapshot['proxy'] = True
+						raise Exception(badserver[check[0]])
 				elif event == '464': # ERR_PASSWDMISMATCH
 					raise Exception('Network has a password')
 				elif event == '487': # ERR_MSGSERVICES
@@ -378,6 +391,9 @@ class probe:
 						if msg[:8] == '\001VERSION':
 							version = random.choice(('http://www.mibbit.com ajax IRC Client','mIRC v6.35 Khaled Mardam-Bey','xchat 0.24.1 Linux 2.6.27-8-eeepc i686','rZNC Version 1.0 [02/01/11] - Built from ZNC','thelounge v3.0.0 -- https://thelounge.chat/'))
 							await self.raw(f'NOTICE {nick} \001VERSION {version}\001')
+						elif ('You are connected' in data or 'Connected securely via' in data) and ('SSL' in data or 'TLS' in data):
+							cipher = data.split()[-1:][0].replace('\'','').replace('"','')
+							self.snapshot['ssl_cipher'] = cipher
 						elif nick == 'NickServ':
 							self.snapshot['services'] = True
 							if 'is now registered' in msg or f'Nickname {self.nickname} registered' in msg:
@@ -389,7 +405,7 @@ class probe:
 								error(self.display + '\033[93mDroneBL detected\033[0m')
 								raise Exception('DroneBL')
 							else:
-								if [i for i in ('You\'re banned','You are permanently banned','You are banned','You are not welcome') if i in msg]:
+								if [i for i in ('You\'re banned','You are permanently banned','You are banned','You are not welcome','Temporary K-line') if i in msg]:
 									raise Exception('K-Lined')
 			except (UnicodeDecodeError, UnicodeEncodeError):
 				pass