[Twisted-Python] twisted irc client + packet capturing
David Stainton
dstainton415 at gmail.com
Fri Nov 8 08:11:20 MST 2013
I got my sniffer to work in Twisted... but then I'm not using pycap :
https://github.com/david415/hushVPN/blob/master/nflog_reader.py
I use the NetLinkFilter socket via this python cffi:
https://github.com/mk-fg/scapy-nflog-capture
Anyhow this allows me to control which packets my sniffer picks up via
iptables rules like this:
iptables -A INPUT -p tcp --dport 22 -j NFLOG
Cheers!
David
On Fri, Nov 8, 2013 at 12:50 AM, Edmund Wong <ewong at pw-wspx.org> wrote:
> Hi,
>
> I've created a script that would log on to an irc server, while
> capturing packets.
>
> I came across the following link:
>
> http://dound.com/2009/09/integrating-twisted-with-a-pcap-based-python-packet-sniffer/
>
> But I'm using pycap (http://pycap.sourceforge.net/), but I'm having
> some difficulties with getting it to work.
>
> Here's the code:
>
> # Copyright (c) Twisted Matrix Laboratories.
> # See LICENSE for details.
>
> # twisted imports
> from twisted.words.protocols import irc
> from twisted.internet import reactor, protocol
> from twisted.python import log
> from twisted.internet.defer import Deferred
>
> # system imports
> import time, sys
>
> import pycap.capture
>
> def run_pcap(f):
> p = pycap.capture.capture('eth0')
> p.filter('src host ! 192.168.1.100 and dst host ! 192.168.1.100 and dst
> port 25')
> packet = None
> print "Listening...\n"
> while 1:
> if packet:
> print "Received packet."
> reactor.callFromThread(f, packet)
> else:
> print "no packet\n"
> packet = p.next()
>
> class LogBot(irc.IRCClient):
> """A logging IRC bot."""
>
> nickname = "testbot"
>
> def packetShow(self, packet):
> """ booga """
> msg = "Port 25 hit | From:[%s] To:[%s]" % (packet[1].source,
> packet[1].destination)
> self.msg(self.channel, msg)
>
> def connectionMade(self):
> irc.IRCClient.connectionMade(self)
> print "Setting up callInThread\n"
> reactor.callInThread(run_pcap, self.packetShow)
> print "Finished setting up callInThread\n"
>
> def connectionLost(self, reason):
> irc.IRCClient.connectionLost(self, reason)
>
> # callbacks for events
>
> def signedOn(self):
> """Called when bot has succesfully signed on to server."""
> print "Signing on to %s.\n" % self.factory.channel
> # self.join(self.factory.channel)
> self.sendLine("JOIN %s" % (self.factory.channel,))
>
> def joined(self, channel):
> """This will get called when the bot joins the channel."""
> print "Joining channel %s." % channel
>
> def privmsg(self, user, channel, msg):
> """This will get called when the bot receives a message."""
> user = user.split('!', 1)[0]
>
> # Check to see if they're sending me a private message
> if channel == self.nickname:
> msg = "It isn't nice to whisper! Play nice with the group."
> self.msg(user, msg)
> return
>
> # Otherwise check to see if it is a message directed at me
> if msg.startswith(self.nickname + ":"):
> msg = "%s: I am a log bot" % user
> self.msg(channel, msg)
>
> def action(self, user, channel, msg):
> """This will get called when the bot sees someone do an action."""
> user = user.split('!', 1)[0]
>
> # irc callbacks
>
> def irc_NICK(self, prefix, params):
> """Called when an IRC user changes their nickname."""
> old_nick = prefix.split('!')[0]
> new_nick = params[0]
>
>
> # For fun, override the method that determines how a nickname is changed
> on
> # collisions. The default method appends an underscore.
> def alterCollidedNick(self, nickname):
> """
> Generate an altered version of a nickname that caused a collision in
> an
> effort to create an unused related name for subsequent registration.
> """
> return nickname + '^'
>
> class LogBotFactory(protocol.ClientFactory):
> """A factory for LogBots.
>
> A new protocol instance will be created each time we connect to the
> server.
> """
>
> def __init__(self, channel):
> self.channel = channel
>
> def buildProtocol(self, addr):
> p = LogBot()
> p.factory = self
> return p
>
> def clientConnectionLost(self, connector, reason):
> """If we get disconnected, reconnect to server."""
> connector.connect()
>
> def clientConnectionFailed(self, connector, reason):
> print "connection failed:", reason
> reactor.stop()
>
>
> if __name__ == '__main__':
> # create factory protocol and application
> f = LogBotFactory("#testx")
>
> # connect factory to this host and port
> reactor.connectTCP("192.168.1.170", 6667, f)
>
> # run bot
> reactor.run()
>
> I was told that perhaps I could use twisted.pair,
> but I have no idea how to use the module. The
> documentation is lacking and I've only just started
> programming in Twisted.
>
> Any help appreciated.
>
> Edmund
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
More information about the Twisted-Python
mailing list