# Copyright (c) 2009 Upi Tamminen # See the COPYRIGHT file for more information import os, time, anydbm, datetime from kippo.core.honeypot import HoneyPotCommand from twisted.internet import reactor from kippo.core.config import config from kippo.core.userdb import UserDB commands = {} class command_whoami(HoneyPotCommand): def call(self): self.writeln(self.honeypot.user.username) commands['/usr/bin/whoami'] = command_whoami class command_uptime(HoneyPotCommand): def call(self): self.writeln(' %s up 14 days, 3:53, 0 users, load average: 0.08, 0.02, 0.01' % \ time.strftime('%H:%M:%S')) commands['/usr/bin/uptime'] = command_uptime class command_w(HoneyPotCommand): def call(self): self.writeln(' %s up 14 days, 3:53, 1 user, load average: 0.08, 0.02, 0.01' % \ time.strftime('%H:%M:%S')) self.writeln('USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT') self.writeln('%-8s pts/0 %s %s 0.00s 0.00s 0.00s w' % \ (self.honeypot.user.username, self.honeypot.clientIP[:17].ljust(17), time.strftime('%H:%M', time.localtime(self.honeypot.logintime)))) commands['/usr/bin/w'] = command_w commands['/usr/bin/who'] = command_w class command_echo(HoneyPotCommand): def call(self): self.writeln(' '.join(self.args)) commands['/bin/echo'] = command_echo # for testing purposes class command_exxxit(HoneyPotCommand): def call(self): self.honeypot.terminal.loseConnection() commands['exxxit'] = command_exxxit class command_exit(HoneyPotCommand): def call(self): if 'PuTTY' in self.honeypot.clientVersion or \ 'libssh' in self.honeypot.clientVersion or \ 'sshlib' in self.honeypot.clientVersion: self.honeypot.terminal.loseConnection() return self.honeypot.terminal.reset() self.writeln('Connection to server closed.') self.honeypot.hostname = 'localhost' self.honeypot.cwd = '/root' commands['exit'] = command_exit commands['logout'] = command_exit class command_clear(HoneyPotCommand): def call(self): self.honeypot.terminal.reset() commands['/usr/bin/clear'] = command_clear class command_hostname(HoneyPotCommand): def call(self): self.writeln(self.honeypot.hostname) commands['/bin/hostname'] = command_hostname class command_uname(HoneyPotCommand): def call(self): if len(self.args) and self.args[0].strip() == '-a': self.writeln( 'Linux %s 2.6.26-2-686 #1 SMP Wed Nov 4 20:45:37 UTC 2009 i686 GNU/Linux' % \ self.honeypot.hostname) else: self.writeln('Linux') commands['/bin/uname'] = command_uname class command_ps(HoneyPotCommand): def call(self): user = self.honeypot.user.username args = '' if len(self.args): args = self.args[0].strip() _user, _pid, _cpu, _mem, _vsz, _rss, _tty, _stat, \ _start, _time, _command = range(11) output = ( ('USER ', ' PID', ' %CPU', ' %MEM', ' VSZ', ' RSS', ' TTY ', 'STAT ', 'START', ' TIME ', 'COMMAND',), ('root ', ' 1', ' 0.0', ' 0.1', ' 2100', ' 688', ' ? ', 'Ss ', 'Nov06', ' 0:07 ', 'init [2] ',), ('root ', ' 2', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kthreadd]',), ('root ', ' 3', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[migration/0]',), ('root ', ' 4', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[ksoftirqd/0]',), ('root ', ' 5', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[watchdog/0]',), ('root ', ' 6', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:17 ', '[events/0]',), ('root ', ' 7', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[khelper]',), ('root ', ' 39', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kblockd/0]',), ('root ', ' 41', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kacpid]',), ('root ', ' 42', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kacpi_notify]',), ('root ', ' 170', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kseriod]',), ('root ', ' 207', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S ', 'Nov06', ' 0:01 ', '[pdflush]',), ('root ', ' 208', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S ', 'Nov06', ' 0:00 ', '[pdflush]',), ('root ', ' 209', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[kswapd0]',), ('root ', ' 210', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[aio/0]',), ('root ', ' 748', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[ata/0]',), ('root ', ' 749', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[ata_aux]',), ('root ', ' 929', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'S< ', 'Nov06', ' 0:00 ', '[scsi_eh_0]',), ('root ', '1014', ' 0.0', ' 0.0', ' 0', ' 0', ' ? ', 'D< ', 'Nov06', ' 0:03 ', '[kjournald]',), ('root ', '1087', ' 0.0', ' 0.1', ' 2288', ' 772', ' ? ', 'S 1 and self.args[0].strip().count('-h') \ and self.args[1].strip().count('now'): self.nextLine() self.writeln( 'Broadcast message from root@%s (pts/0) (%s):' % \ (self.honeypot.hostname, time.ctime())) self.nextLine() self.writeln('The system is going down for maintenance NOW!') reactor.callLater(3, self.finish) elif len(self.args) > 1 and self.args[0].strip().count('-r') \ and self.args[1].strip().count('now'): self.nextLine() self.writeln( 'Broadcast message from root@%s (pts/0) (%s):' % \ (self.honeypot.hostname, time.ctime())) self.nextLine() self.writeln('The system is going down for reboot NOW!') reactor.callLater(3, self.finish) else: self.writeln("Try `shutdown --help' for more information.") self.exit() return def finish(self): self.writeln('Connection to server closed.') self.honeypot.hostname = 'localhost' self.honeypot.cwd = '/root' self.exit() commands['/sbin/shutdown'] = command_shutdown class command_reboot(HoneyPotCommand): def start(self): self.nextLine() self.writeln( 'Broadcast message from root@%s (pts/0) (%s):' % \ (self.honeypot.hostname, time.ctime())) self.nextLine() self.writeln('The system is going down for reboot NOW!') reactor.callLater(3, self.finish) def finish(self): self.writeln('Connection to server closed.') self.honeypot.hostname = 'localhost' self.honeypot.cwd = '/root' self.exit() commands['/sbin/reboot'] = command_reboot class command_history(HoneyPotCommand): def call(self): if len(self.args) and self.args[0] == '-c': self.honeypot.historyLines = [] self.honeypot.historyPosition = 0 return count = 1 for l in self.honeypot.historyLines: self.writeln(' %s %s' % (str(count).rjust(4), l)) count += 1 commands['history'] = command_history class command_date(HoneyPotCommand): def call(self): time = datetime.datetime.utcnow(); self.writeln(time.strftime("%a %b %d %H:%M:%S UTC %Y")) commands['/bin/date'] = command_date class command_yes(HoneyPotCommand): def start(self): self.y() def y(self): self.writeln('y') self.scheduled = reactor.callLater(0.01, self.y) def ctrl_c(self): self.scheduled.cancel() self.exit() commands['/usr/bin/yes'] = command_yes class command_nop(HoneyPotCommand): def call(self): pass commands['/bin/chmod'] = command_nop commands['set'] = command_nop commands['unset'] = command_nop commands['export'] = command_nop commands['/bin/bash'] = command_nop commands['/bin/sh'] = command_nop commands['/bin/kill'] = command_nop commands['/bin/su'] = command_nop # vim: set sw=4 et: