Seit langen spiele ich schon mit dem Gedanken, dem Glastopf Web Honeypot ein IRC Log Bot zu verpassen. An sich eine nicht all zu schwere Aufgabe:
Im Folgenden möchte ich kurz erläutern, wie ich mir das vorstelle und worauf ich meine Lösung aufbaue.
class ircbot():
"""IRC client class"""
def __init__(self):
self.s=socket.socket()
self.s.connect((server, port))
self.s.send(nick)
self.s.send(ident)
Hier definiere ich Variablen und verbinde zum IRC Server.
def ircthread(self):
"""IRC client"""
readbuffer = ""
while True:
readbuffer=readbuffer+self.s.recv(1024)
temp=readbuffer.split("\n")
readbuffer=temp.pop()
for line in temp:
line=line.rstrip()
line=line.split()
print line
if(line[0]=="PING"):
self.s.send(PONG)
Dies ist der Prozess, der sich um die Kommunikation mit dem IRC Server kümmert.
def sendfunc(self, message):
"""Sends the message to the IRC channel"""
while True:
if self.joined == True and message != "":
self.s.send(message)
message = ""
time.sleep(2)
break
Hiermit sende ich die Nachricht vom Glastopf an den IRC Channel.
if __name__ == '__main__':
# Wir erstellen eine Instanz...
bot = ircbot()
# Starten die Kommunikation mit dem Server...
ircthread = threading.Thread(target=bot.ircthread)
ircthread.start()
# Und schreiben in den channel:
bot.sendfunc("Send this to the channel!")
bot.sendfunc("Log this!")
Die ist das ungefähre Prinzip meines IRC Log Bots. Ich muss mir noch Gedanken über: Quits: glastopfbot (glastopfbot@ip) (Excess Flood) machen und wie der Bot reagiert, wenn er mit dem Senden von Nachrichten an den Server nicht mehr hinterher kommt. Da wir immer ein time.sleep() brauchen, kann, je nach Platzierung der Log Nachrichten, der Bot die Antwort an den Angreifer verzögern oder es könnte zum Timeout kommen.