From b5c06771c11c78cbaa3b26207949eea3c1fe0fa5 Mon Sep 17 00:00:00 2001 From: desaster Date: Tue, 23 Feb 2010 05:43:39 +0000 Subject: [PATCH] New command: apt-get git-svn-id: https://kippo.googlecode.com/svn/trunk@95 951d7100-d841-11de-b865-b3884708a8e2 --- kippo/commands/__init__.py | 1 + kippo/commands/apt.py | 98 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 kippo/commands/apt.py diff --git a/kippo/commands/__init__.py b/kippo/commands/__init__.py index 4fd9930e..fd2fe0d7 100644 --- a/kippo/commands/__init__.py +++ b/kippo/commands/__init__.py @@ -8,5 +8,6 @@ __all__ = [ 'ssh', 'tar', 'wget', + 'apt', 'dice', ] diff --git a/kippo/commands/apt.py b/kippo/commands/apt.py new file mode 100644 index 00000000..835f29fb --- /dev/null +++ b/kippo/commands/apt.py @@ -0,0 +1,98 @@ +# Copyright (c) 2009 Upi Tamminen +# See the COPYRIGHT file for more information + +from twisted.internet import reactor, defer +from twisted.internet.defer import inlineCallbacks +from kippo.core.honeypot import HoneyPotCommand +import random, re + +commands = {} + +class command_faked_package_class_factory(object): + @staticmethod + def getCommand(name): + class command_faked_installation(HoneyPotCommand): + def call(self): + self.writeln("%s: Segmentation fault" % name) + return command_faked_installation + +'''apt-get fake +suppports only the 'install PACKAGE' command. +Places a 'Segfault' at /usr/bin/PACKAGE''' +class command_aptget(HoneyPotCommand): + def start(self): + if len(self.args) > 0 and self.args[0] == 'install': + self.do_install() + else: + self.do_locked() + + def sleep(self, time, time2 = None): + d = defer.Deferred() + if time2: + time = random.randint(time * 100, time2 * 100) / 100.0 + reactor.callLater(time, d.callback, None) + return d + + @inlineCallbacks + def do_install(self,*args): + if len(self.args) <= 1: + self.writeln('0 upgraded, 0 newly installed, 0 to remove and %s not upgraded.' % random.randint(200,300)) + self.exit() + return + + packages = {} + for y in [re.sub('[^A-Za-z0-9]', '', x) for x in self.args[1:]]: + packages[y] = { + 'version': '%d.%d-%d' % \ + (random.choice((0, 1)), + random.randint(1, 40), + random.randint(1, 10)), + 'size': random.randint(100, 900) + } + totalsize = sum([packages[x]['size'] for x in packages]) + + self.writeln('Reading package lists... Done') + self.writeln('Building dependency tree') + self.writeln('Reading state information... Done') + self.writeln('The following NEW packages will be installed:') + self.writeln(' %s ' % ' '.join(packages)) + self.writeln('0 upgraded, %d newly installed, 0 to remove and 259 not upgraded.' % \ + len(packages)) + self.writeln('Need to get %s.2kB of archives.' % (totalsize)) + self.writeln('After this operation, %skB of additional disk space will be used.' % \ + (totalsize * 2.2,)) + i = 1 + for p in packages: + self.writeln('Get:%d http://ftp.debian.org stable/main %s %s [%s.2kB]' % \ + (i, p, packages[p]['version'], packages[p]['size'])) + i += 1 + yield self.sleep(1, 2) + self.writeln('Fetched %s.2kB in 1s (4493B/s)''' % (totalsize)) + self.writeln('Reading package fields... Done') + yield self.sleep(1, 2) + self.writeln('Reading package status... Done') + self.writeln('(Reading database ... 177887 files and directories currently installed.)') + yield self.sleep(1, 2) + for p in packages: + self.writeln('Unpacking %s (from .../archives/%s_%s_i386.deb) ...' % \ + (p, p, packages[p]['version'])) + yield self.sleep(1, 2) + self.writeln('Processing triggers for man-db ...') + yield self.sleep(2) + for p in packages: + self.writeln('Setting up %s (%s) ...' % \ + (p, packages[p]['version'])) + self.fs.mkfile('/usr/bin/%s' % p, + 0, 0, random.randint(10000, 90000), 33188) + self.honeypot.commands['/usr/bin/%s' % p] = \ + command_faked_package_class_factory.getCommand(p) + yield self.sleep(2) + self.exit() + + def do_locked(self): + self.writeln('E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)') + self.writeln('E: Unable to lock the list directory') + self.exit() +commands['/usr/bin/apt-get'] = command_aptget + +# vim: set sw=4 et tw=0: