IRCP

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

commit 45100452dac71f2fa468ed76c0629f281c1d00ac
parent 60ee352e9f3c9f1c2ebc956538682afbe536795e
Author: acidvegas <acid.vegas@acid.vegas>
Date: Tue, 30 May 2023 02:35:57 -0400

Added CAP, MODULE, INFO, CREDITS, IRCOPS, STATS p, & MODULE replies stored in the snapshot

Diffstat:
MREADME.md | 36+++++++++++++++++++++---------------
Mircp.py | 18++++++++++++------

2 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/README.md b/README.md
@@ -11,7 +11,7 @@ The idea is to create a *proof-of-concept* documenting how large-scale informati
 ## Order of Operations
 First, an attempt to connect using SSL/TLS on port 6697 is made, which if it fails, will fall back to a standard connection on port 6667.
 
-Once connected, server information is gathered from `LUSERS`, `VERSION`, `LINKS`, `MAP`, `ADMIN`, `MOTD`, `LIST`, replies.
+Once connected, server information is gathered from `ADMIN`, `CAP LS`, `MODULES -all`, `VERSION`, `IRCOPS`, `MAP`, `INFO`, `LINKS`, `STATS p`, & `LIST` replies.
 
 An attempt to register a nickname is then made by trying to contact NickServ.
 
@@ -61,14 +61,16 @@ All of the raw data from a server is logged & stored. The categories below are s
 | 003     | RPL_CREATED    |
 | 004     | RPL_MYINFO     |
 | 005     | RPL_ISUPPORT   |
-| 372     | RPL_MOTD       |
-| 351     | RPL_VERSION    |
-| 364     | RPL_LINKS      |
 | 006     | RPL_MAP        |
 | 018     | RPL_MAPUSERS   |
 | 257     | RPL_ADMINLOC1  |
 | 258     | RPL_ADMINLOC2  |
 | 259     | RPL_ADMINEMAIL |
+| 351     | RPL_VERSION    |
+| 364     | RPL_LINKS      |
+| 371     | RPL_INFO       |
+| 372     | RPL_MOTD       |
+| 304     | RPL_TEXT       |
 
 ###### Statistics Information (LUSERS)
 | Numeric | Title             |
@@ -102,18 +104,23 @@ All of the raw data from a server is logged & stored. The categories below are s
 | 338     | RPL_WHOISACTUALLY |
 | 352     | RPL_WHOREPLY      |
 
-###### Bad Numerics
+###### Bad Numerics (channel)
+| Numeric | Title              |
+| ------- | ------------------ |
+| 439     | ERR_TARGETTOOFAST  |
+| 470     | ERR_LINKCHANNEL    |
+| 471     | ERR_CHANNELISFULL  |
+| 473     | ERR_INVITEONLYCHAN |
+| 474     | ERR_BANNEDFROMCHAN |
+| 475     | ERR_BADCHANNELKEY  |
+| 477     | ERR_NEEDREGGEDNICK |
+| 489     | ERR_SECUREONLYCHAN |
+| 519     | ERR_TOOMANYUSERS   |
+| 520     | ERR_OPERONLY       |
+
+###### Bad Numerics (server)
 | Numeric | Title                |
 | ------- | -------------------- |
-| 470     | ERR_LINKCHANNEL      |
-| 471     | ERR_CHANNELISFULL    |
-| 473     | ERR_INVITEONLYCHAN   |
-| 474     | ERR_BANNEDFROMCHAN   |
-| 475     | ERR_BADCHANNELKEY    |
-| 477     | ERR_NEEDREGGEDNICK   |
-| 489     | ERR_SECUREONLYCHAN   |
-| 519     | ERR_TOOMANYUSERS     |
-| 520     | ERR_OPERONLY         |
 | 464     | ERR_PASSWDMISMATCH   |
 | 465     | ERR_YOUREBANNEDCREEP |
 | 466     | ERR_YOUWILLBEBANNED  |
@@ -123,7 +130,6 @@ All of the raw data from a server is logged & stored. The categories below are s
 ![](.screens/preview.png)
 
 ## Todo
-* Capture `IRCOPS` & `STATS p` command outputs
 * Built in identd
 * Checking for IPv6 availability *(SSL= in 005 responses may help verify IPv6)*
 * Support for IRC servers using old versions of SSL
diff --git a/ircp.py b/ircp.py
@@ -49,10 +49,11 @@ donotscan = (
 snapshot = {
 	'server'   : None,
 	'host'     : None,
-	'raw'      : [], # all other data goes in here
-	'NOTICE'   : None,
 	'services' : False,
 	'ssl'      : False,
+	'raw'      : [], # all other data goes in here
+	'CAP'      : None,
+	'NOTICE'   : None,
 
 	# server information
 	'001' : None, # RPL_WELCOME
@@ -67,7 +68,9 @@ snapshot = {
 	'259' : None, # RPL_ADMINEMAIL
 	'351' : None, # RPL_VERSION
 	'364' : None, # RPL_LINKS
+	'371' : None, # RPL_INFO
 	'372' : None, # RPL_MOTD
+	'304' : None, # RPL_TEXT
 
 	# statistic information (lusers)
 	'250' : None, # RPL_STATSCONN
@@ -108,9 +111,9 @@ snapshot = {
 	'520' : None, # ERR_OPERONLY
 
 	# bad server numerics
-	'464' :	None, # ERR_PASSWDMISMATCH
-	'465' :	None, # ERR_YOUREBANNEDCREEP
-	'466' :	None, # ERR_YOUWILLBEBANNED
+	'464' : None, # ERR_PASSWDMISMATCH
+	'465' : None, # ERR_YOUREBANNEDCREEP
+	'466' : None, # ERR_YOUWILLBEBANNED
 	'421' : None  # ERR_UNKNOWNCOMMAND
 }
 
@@ -202,7 +205,10 @@ class probe:
 				'pass': settings.ns_pass if settings.ns_pass else rndnick(),
 				'mail': settings.ns_mail if settings.ns_mail else f'{rndnick()}@{rndnick()}.'+random.choice(('com','net','org'))
 			}
-			for command in ('ADMIN', 'VERSION', 'LINKS', 'MAP', 'PRIVMSG NickServ :REGISTER {0} {1}'.format(login['pass'], login['mail']), 'LIST'):
+			cmds = ('ADMIN', 'CAP LS', 'INFO', 'IRCOPS', 'LINKS', 'MAP', 'MODULES -all', 'STATS p', 'VERSION')
+			random.shuffle(cmds)
+			cmds += ('PRIVMSG NickServ :REGISTER {0} {1}'.format(login['pass'], login['mail']), 'LIST')
+			for command in cmds:
 				try:
 					await self.raw(command)
 				except: