1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Irssi's botnet description
|
|
|
|
|
|
|
|
Copyright (c) 1999-2000 Timo Sirainen
|
|
|
|
|
|
|
|
|
|
|
|
0. History
|
1999-11-27 15:37:25 -05:00
|
|
|
|
|
|
|
draft v0.1 : 21.8.1999
|
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Just a first draft of my botnet design I did on a boring friday
|
|
|
|
work afternoon :) I'll try to implement this to irssi some day, it
|
|
|
|
feels pretty interesting now so it might be pretty soon even. Any
|
|
|
|
comments are welcome :)
|
1999-11-27 15:37:25 -05:00
|
|
|
|
|
|
|
draft v0.2 : 21.11.1999
|
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Exactly three months since the first draft :) Now I actually have
|
|
|
|
some code done, just committed pretty simple botnet to irssi CVS.
|
|
|
|
Made several changes to this document.. Still missing much details
|
|
|
|
but the basic idea should be clear.
|
|
|
|
|
|
|
|
draft v0.3 : 21.05.2000
|
|
|
|
|
|
|
|
Strange, again the same day. I really didn't plan this :)
|
|
|
|
Reformatted the text, added lots of text, implemented more of the
|
|
|
|
stuff.
|
|
|
|
|
|
|
|
|
|
|
|
1. General
|
|
|
|
|
|
|
|
1.1 Description
|
|
|
|
|
|
|
|
A small description of what botnet would do: A group of bots
|
|
|
|
efficiently working together to perform their tasks. Like when
|
|
|
|
someone's trying to take over your channel, bots will quickly
|
|
|
|
decide who deops/kicks whom instead of multiple bots deopping or
|
|
|
|
trying to kick the same people.
|
|
|
|
|
|
|
|
Irssi's botnet is pretty much based on trust. Some malicious bot
|
|
|
|
can quite well mess up the whole botnet. Connecting the bots to
|
|
|
|
each other via ssh would be a good idea.
|
|
|
|
|
|
|
|
1.2 Configuration
|
|
|
|
|
|
|
|
example config file:
|
|
|
|
|
|
|
|
mybotnet =
|
|
|
|
{
|
|
|
|
priority=5;
|
|
|
|
nick=mybot;
|
|
|
|
uplinks = (
|
|
|
|
{ host = "main.botnet.org"; password = "mypass"; },
|
|
|
|
{ host = "alter.botnet.org"; password = "pass2"; }
|
|
|
|
);
|
|
|
|
downlinks = (
|
|
|
|
{ password = "thepass"; valid_addrs = ( "192.168.0.*" ); },
|
|
|
|
{ password = "blah"; valid_addrs = ( "*.botnet.org" ); },
|
|
|
|
{ password = "localpass"; valid_addrs = ( "127.*" ); }
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
When connecting to botnet, the bot first tries to connect to the
|
|
|
|
first bot in uplinks list, then the second, etc. Setting port to -1
|
|
|
|
will prevent connecting to the bot, 0 uses the default.
|
|
|
|
|
|
|
|
1.3 Botnet master
|
|
|
|
|
|
|
|
To avoid total chaos inside botnet, the bots shouldn't do (almost)
|
|
|
|
anything without a command from botnet's master. The master should
|
|
|
|
know everything, and give commands to clients that can perform the
|
|
|
|
task best.
|
|
|
|
|
|
|
|
Master is the bot with the highest priority. If there's multiple
|
|
|
|
with the same priority, the one that already was the master will
|
|
|
|
stay master. When joining two botnets to one, the uplink's master
|
|
|
|
stays. If link to master breaks, the closest bot to it will choose
|
|
|
|
a new one.
|
|
|
|
|
|
|
|
The priorities should be given so that the bots that have the
|
|
|
|
fastest connections and are in the middle of the botnet have the
|
|
|
|
highest priorities.
|
|
|
|
|
|
|
|
1.4 Command format
|
|
|
|
|
|
|
|
Commands that are sent inside botnet are in the following format:
|
|
|
|
|
|
|
|
<from_nick> <to_nick> COMMAND [command specific data..]
|
|
|
|
|
|
|
|
If to_nick is '-', the command should be sent to everyone.
|
|
|
|
|
|
|
|
|
|
|
|
2. Handshake
|
|
|
|
|
|
|
|
First host checks from bots' valid_addrs who is connecting. If
|
|
|
|
there's no matches it just disconnects the client.
|
|
|
|
|
|
|
|
CLIENT: PASS <password>
|
|
|
|
HOST : (if error, disconnect)
|
|
|
|
|
|
|
|
CLIENT: NICK <nick>
|
|
|
|
HOST : NICKERROR | CONNECTED
|
|
|
|
|
|
|
|
If nick is already in use, the host sends NICKERROR and waits for
|
|
|
|
new nick.
|
|
|
|
|
|
|
|
Now we're connected to botnet. The commands from now on use the
|
|
|
|
format specified in section 1.4.
|
|
|
|
|
|
|
|
Both the client and the host sends information to other side of
|
|
|
|
all the clients they serve (if any):
|
|
|
|
|
|
|
|
BOTINFO <nick> <connected_to_nick> <priority>
|
|
|
|
|
|
|
|
BOTINFOs must be sent sorted so that connected_to_nick bot is
|
|
|
|
always known. Like first comes the bots connected to the
|
|
|
|
host/client, then the bots connected to them etc.
|
|
|
|
|
|
|
|
If the client had downlinks, nick collisions might happen. The
|
|
|
|
uplink is responsible for noticing them from BOTINFO commands.
|
|
|
|
It should automatically replace the nicks with new ones and
|
|
|
|
send nick change command to client and all it's downlinks. For
|
|
|
|
example if host received:
|
|
|
|
|
|
|
|
BOTINFO bot highbot 10
|
|
|
|
|
|
|
|
And the bot already exists, the BOTINFO is changed to:
|
|
|
|
|
|
|
|
BOTINFO bot2 highbot 10
|
|
|
|
|
|
|
|
And the client and it's downlinks are notified:
|
|
|
|
|
|
|
|
BOTNICK bot2 bot
|
|
|
|
|
|
|
|
After sending BOTINFOs, the host tells the current master:
|
|
|
|
|
|
|
|
MASTER <nick>
|
|
|
|
|
|
|
|
The client now checks if it's priority is higher than the current
|
|
|
|
master's. If it is, it will send the MASTER command without any
|
|
|
|
parameters.
|
|
|
|
|
|
|
|
|
|
|
|
3. Bot connections
|
|
|
|
|
|
|
|
3.1 General
|
|
|
|
|
|
|
|
Everyone's connections should be kept in n-way tree. Example:
|
|
|
|
|
|
|
|
|
|
|
|
[highuplink]
|
|
|
|
_____________/ | | \
|
|
|
|
/ | [h5] [h6]
|
|
|
|
[h1] | / | \
|
|
|
|
/ \ | [h7] | [h8]
|
|
|
|
[h2] [h3] | | \
|
|
|
|
| [uplink] [h9] [h10]
|
|
|
|
[h4] / | \
|
|
|
|
[up2] | [up1]
|
|
|
|
/ | | |
|
|
|
|
[up3] [up4] | [up5]
|
|
|
|
|
|
|
|
|
[we]
|
|
|
|
/ \
|
|
|
|
[client1] [client2]
|
|
|
|
/ \
|
|
|
|
[c3] [c4]
|
|
|
|
|
|
|
|
|
|
|
|
Botnet should try to keep together even if some hub in the middle
|
|
|
|
crashes. Each bot should have at least two uplinks in case one
|
|
|
|
dies. For example if [uplink] dies, [we] and [up1] could connect
|
|
|
|
to [up2], and [up2] could connect to [highuplink].
|
|
|
|
|
|
|
|
When connection is closed to some bot, a notice is sent by the
|
|
|
|
bot's uplink:
|
|
|
|
|
|
|
|
BOTQUIT <nick>
|
|
|
|
|
|
|
|
The quit notice should be sent only about the bot that was
|
|
|
|
disconnected. Bots should figure out themselves the other bots and
|
|
|
|
remove them too from their lists.
|
|
|
|
|
|
|
|
3.2 Lag
|
|
|
|
|
|
|
|
Each bot should send PING commands to their up/downlinks every
|
|
|
|
now and then (1min?) to check that the connection is still active.
|
|
|
|
If the PONG isn't received in 10 seconds, it's priority should be
|
|
|
|
temporarily lowered to -1. If the PONG isn't received in 3
|
|
|
|
minutes, the whole connection should be closed.
|
|
|
|
|
|
|
|
Master should know lag times of every bots. It could then
|
|
|
|
automatically raise/lower bots' priorities depending on how big
|
|
|
|
their lag is. Master could also lower it's own priority and pass
|
|
|
|
the master status to someone else with lower lag.
|
|
|
|
|
|
|
|
If there's lot of lag (>3sec?) somewhere and something urgent
|
|
|
|
happens, the botnet could split and behave independently.
|
|
|
|
|
|
|
|
|
|
|
|
4. IRC networks
|
|
|
|
|
|
|
|
4.1 Server connections
|
|
|
|
|
|
|
|
When bot is connected to some irc server and is ready to take
|
|
|
|
commands, it says:
|
|
|
|
|
|
|
|
IRCJOIN <tag> <ircnet> <server> <nick>
|
|
|
|
|
|
|
|
Tag is the bot specific unique tag of the server, so that the bot
|
|
|
|
can connect multiple times to same IRC network. All IRC related
|
|
|
|
commands should specify the server tag where it should be sent.
|
|
|
|
|
|
|
|
If bot quits an irc network, it says:
|
|
|
|
|
|
|
|
IRCQUIT <tag>
|
|
|
|
|
|
|
|
4.2 IRC commands
|
|
|
|
|
|
|
|
Master asks a bot to send some command to IRC server by saying:
|
|
|
|
|
|
|
|
CMD <id> <tag> <command>
|
|
|
|
|
|
|
|
<command> can't really be anything, since the bot should also be
|
|
|
|
able to reply to it. The <id> is for identifying the command/reply
|
|
|
|
pair. Master should keep the command in memory until it receives
|
|
|
|
the reply:
|
|
|
|
|
|
|
|
CMDREPLY <id> <last> <reply>
|
|
|
|
|
|
|
|
The command could get a reply of multiple lines, so <last>
|
|
|
|
specifies if the reply is the last line (1 or 0).
|
|
|
|
|
|
|
|
If the command failed for some reason, the bot will reply with
|
|
|
|
|
|
|
|
CMDFAIL <id>
|
|
|
|
|
|
|
|
and master should send the command to some other bot.
|
|
|
|
|
|
|
|
4.3 Channels
|
|
|
|
|
|
|
|
When joined/left channels, the bot says:
|
|
|
|
|
|
|
|
CHANJOIN <tag> <channel>
|
|
|
|
CHANPART <tag> <channel>
|
|
|
|
|
|
|
|
After BOTJOIN, master tries to op the bot. When bot receives +o,
|
|
|
|
it says:
|
|
|
|
|
|
|
|
CHANOP <tag> <channel>
|
|
|
|
|
|
|
|
If it is the first opped bot in channel, master orders the bot to
|
|
|
|
op the rest of the bots.
|
|
|
|
|
|
|
|
If the bot is kicked, it says:
|
|
|
|
|
|
|
|
CHANKICK <tag> <channel>
|
|
|
|
|
|
|
|
When master notices that bot is kicked, it first checks if there's
|
|
|
|
any other opped bots in channel. If not, it waits for a random
|
|
|
|
pause, 5-10sec before letting the bot join the channel again so
|
|
|
|
that it won't get autorejoin ban.
|
|
|
|
|
|
|
|
If bot can't join channel, it says:
|
|
|
|
|
|
|
|
CHANBANNED <tag> <channel>
|
|
|
|
(or)
|
|
|
|
CHANCANTJOIN <tag> <channel>
|
|
|
|
|
|
|
|
When received BOTBANNED, master tries to unban bot or set a ban
|
|
|
|
exception. BOTCANTJOIN results as invite to channel.
|
|
|
|
|
|
|
|
4.4 Channel information
|
|
|
|
|
|
|
|
When master notices that bot is the first one joined to channel,
|
|
|
|
it asks the bot for some channel information:
|
|
|
|
|
|
|
|
CMD <id> <tag> NAMES <channel>
|
|
|
|
CMD <id> <tag> WHO <channel>
|
|
|
|
CMD <id> <tag> MODE <channel>
|
|
|
|
CMD <id> <tag> MODE b <channel>
|
|
|
|
CMD <id> <tag> MODE e <channel> (if IRC network supports this)
|
|
|
|
CMD <id> <tag> MODE I <channel> (if IRC network supports this)
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
It's also possible that if several bots join immediately after the
|
|
|
|
first bot, the commands are shared between all the bots.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Bots should cache the information as much as possible, at least
|
|
|
|
NAMES command.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
4.5 Channel priorities
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Every channel has a priority: LOW, NORMAL, HIGH.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Normally LOW operates just as NORMAL channels, except when some
|
|
|
|
channel has HIGH priority and bots are really busy, LOW channels
|
|
|
|
just wait until there's time for them.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
In NORMAL channels, the most urgent operations (kicks, ops, deops)
|
|
|
|
are performed quite soon even while bots are busy handling HIGH
|
|
|
|
priority commands.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Channels shouldn't normally be HIGH priority, but if attack
|
|
|
|
against channel is detected (like someone comes from split, gets
|
|
|
|
ops and gets to op someone else), it's priority is set to HIGH.
|
|
|
|
When channel's priority is HIGH, botnet does everything it can to
|
|
|
|
get rid of unauthorized opped people as fast as possible.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
LOW channel's priority can also be raised to HIGH, but it's
|
|
|
|
priority is dropped back to LOW if some NORMAL channel's priority
|
|
|
|
is raised to HIGH too.
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
Master notifies about channel's priority change by saying:
|
1999-11-27 15:37:25 -05:00
|
|
|
|
2000-05-25 07:30:47 -04:00
|
|
|
CHANPRIORITY <ircnet> <channel> <LOW/NORMAL/HIGH>
|
1999-11-27 15:37:25 -05:00
|
|
|
|