diff --git a/README.md b/README.md index 3814836..75df468 100644 --- 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 index 6d3b529..ea630d9 100644 --- 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: