1from __future__ import absolute_import, division 2 3import json 4import string 5from random import choice 6 7from twisted.application import service 8from twisted.python import log 9from twisted.words.protocols.jabber import jid 10from twisted.words.protocols.jabber.jid import JID 11 12from wokkel import muc 13from wokkel.client import XMPPClient 14from wokkel.xmppim import AvailablePresence 15 16import cowrie.core.output 17from cowrie.core.config import CowrieConfig 18 19 20class XMPPLoggerProtocol(muc.MUCClient): 21 22 def __init__(self, rooms, server, nick): 23 muc.MUCClient.__init__(self) 24 self.server = rooms.host 25 self.jrooms = rooms 26 self._roomOccupantMap = {} 27 log.msg(rooms.user) 28 log.msg(rooms.host) 29 self.nick = nick 30 self.last = {} 31 self.activity = None 32 33 def connectionInitialized(self): 34 """ 35 The bot has connected to the xmpp server, now try to join the room. 36 """ 37 self.join(self.jrooms, self.nick) 38 39 def joinedRoom(self, room): 40 log.msg('Joined room {}'.format(room.name)) 41 42 def connectionMade(self): 43 log.msg('Connected!') 44 45 # send initial presence 46 self.send(AvailablePresence()) 47 48 def connectionLost(self, reason): 49 log.msg('Disconnected!') 50 51 def onMessage(self, msg): 52 pass 53 54 def receivedGroupChat(self, room, user, body): 55 pass 56 57 def receivedHistory(self, room, user, body, dely, frm=None): 58 pass 59 60 61class Output(cowrie.core.output.Output): 62 """ 63 xmpp output 64 """ 65 def start(self): 66 server = CowrieConfig().get('output_xmpp', 'server') 67 user = CowrieConfig().get('output_xmpp', 'user') 68 password = CowrieConfig().get('output_xmpp', 'password') 69 muc = CowrieConfig().get('output_xmpp', 'muc') 70 resource = ''.join([choice(string.ascii_letters) 71 for i in range(8)]) 72 jid = user + '/' + resource 73 application = service.Application('honeypot') 74 self.run(application, jid, password, JID(None, [muc, server, None]), server) 75 76 def run(self, application, jidstr, password, muc, server): 77 self.xmppclient = XMPPClient(JID(jidstr), password) 78 if CowrieConfig().getboolean('output_xmpp', 'debug', fallback=False): 79 self.xmppclient.logTraffic = True 80 (user, host, resource) = jid.parse(jidstr) 81 self.muc = XMPPLoggerProtocol( 82 muc, server, user + '-' + resource) 83 self.muc.setHandlerParent(self.xmppclient) 84 self.xmppclient.setServiceParent(application) 85 self.anonymous = True 86 self.xmppclient.startService() 87 88 def write(self, logentry): 89 for i in list(logentry.keys()): 90 # Remove twisted 15 legacy keys 91 if i.startswith('log_'): 92 del logentry[i] 93 elif i == "time": 94 del logentry[i] 95 msgJson = json.dumps(logentry, indent=5) 96 97 self.muc.groupChat(self.muc.jrooms, msgJson) 98 99 def stop(self): 100 self.xmppclient.stopService() 101