diff --git a/connect.py b/connect.py index f93d0bec7..51020d8f1 100644 --- a/connect.py +++ b/connect.py @@ -1,7 +1,32 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# +# + +import sys +import os + +# reload(sys) +# sys.setdefaultencoding('utf8') + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.join(BASE_DIR, 'apps')) + +import re +import time +import datetime +import textwrap +import getpass +import readline +import django +import paramiko +import errno +import pyte +import operator +import struct, fcntl, signal, socket, select +from io import open as copen +import uuid + + +os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings' -if __name__ == '__main__': - pass diff --git a/server.py b/server.py index f93d0bec7..b2e902218 100644 --- a/server.py +++ b/server.py @@ -3,5 +3,138 @@ # +import base64 +from binascii import hexlify +import os +import socket +import sys +import threading +import traceback + +import paramiko +from paramiko.py3compat import b, u, decodebytes + + +paramiko.util.log_to_file('demo_server.log') + +host_key = paramiko.RSAKey(filename='test_rsa.key') + + +class Server(paramiko.ServerInterface): + # 'data' is the output of base64.encodestring(str(key)) + # (using the "user_rsa_key" files) + data = (b'AAAAB3NzaC1yc2EAAAABIwAAAIEAyO4it3fHlmGZWJaGrfeHOVY7RWO3P9M7hp' + b'fAu7jJ2d7eothvfeuoRFtJwhUmZDluRdFyhFY/hFAh76PJKGAusIqIQKlkJxMC' + b'KDqIexkgHAfID/6mqvmnSJf0b5W8v5h2pI/stOSwTQ+pxVhwJ9ctYDhRSlF0iT' + b'UWT10hcuO4Ks8=') + good_pub_key = paramiko.RSAKey(data=decodebytes(data)) + + def __init__(self): + self.event = threading.Event() + + def check_channel_request(self, kind, chanid): + if kind == 'session': + return paramiko.OPEN_SUCCEEDED + return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED + + def check_auth_password(self, username, password): + print(username, password) + if (username == 'robey') and (password == 'foo'): + return paramiko.AUTH_SUCCESSFUL + return paramiko.AUTH_FAILED + + def check_auth_publickey(self, username, key): + print('Auth attempt with key: ' + u(hexlify(key.get_fingerprint()))) + if (username == 'robey') and (key == self.good_pub_key): + return paramiko.AUTH_SUCCESSFUL + return paramiko.AUTH_FAILED + + def get_allowed_auths(self, username): + return 'password,publickey' + + def check_channel_shell_request(self, channel): + self.event.set() + return True + + def check_channel_pty_request(self, channel, term, width, height, pixelwidth, + pixelheight, modes): + return True + + +def handle_ssh_request(client, addr): + print('Got a connection!') + + try: + t = paramiko.Transport(client, gss_kex=False) + t.set_gss_host(socket.getfqdn("")) + try: + t.load_server_moduli() + except: + print('(Failed to load moduli -- gex will be unsupported.)') + raise + t.add_server_key(host_key) + server = Server() + try: + t.start_server(server=server) + except paramiko.SSHException: + print('*** SSH negotiation failed.') + return + + while True: + # wait for auth + chan = t.accept(20) + if chan is None: + print('*** No channel.') + return + print('Authenticated!') + + server.event.wait(10) + if not server.event.is_set(): + print('*** Client never asked for a shell.') + return + + chan.send('\r\n\r\nWelcome to my dorky little BBS!\r\n\r\n') + chan.send('We are on fire all the time! Hooray! Candy corn for everyone!\r\n') + chan.send('Happy birthday to Robot Dave!\r\n\r\n') + chan.send('Username: ') + f = chan.makefile('rU') + username = f.readline().strip('\r\n') + chan.send('\r\nI don\'t like you, ' + username + '.\r\n') + chan.close() + + except Exception as e: + print('*** Caught exception: ' + str(e.__class__) + ': ' + str(e)) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1) + + +def run_server(): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind(('', 2200)) + except Exception as e: + print('*** Bind failed: ' + str(e)) + traceback.print_exc() + sys.exit(1) + + try: + sock.listen(100) + print('Listening for connection ...') + client, addr = sock.accept() + + t = threading.Thread(target=handle_ssh_request, args=(client, addr)) + t.start() + + except Exception as e: + print('*** Listen/accept failed: ' + str(e)) + traceback.print_exc() + sys.exit(1) + + if __name__ == '__main__': - pass + run_server() \ No newline at end of file diff --git a/test_rsa.key b/test_rsa.key index e69de29bb..f50e9c538 100644 --- a/test_rsa.key +++ b/test_rsa.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWgIBAAKBgQDTj1bqB4WmayWNPB+8jVSYpZYk80Ujvj680pOTh2bORBjbIAyz +oWGW+GUjzKxTiiPvVmxFgx5wdsFvF03v34lEVVhMpouqPAYQ15N37K/ir5XY+9m/ +d8ufMCkjeXsQkKqFbAlQcnWMCRnOoPHS3I4vi6hmnDDeeYTSRvfLbW0fhwIBIwKB +gBIiOqZYaoqbeD9OS9z2K9KR2atlTxGxOJPXiP4ESqP3NVScWNwyZ3NXHpyrJLa0 +EbVtzsQhLn6rF+TzXnOlcipFvjsem3iYzCpuChfGQ6SovTcOjHV9z+hnpXvQ/fon +soVRZY65wKnF7IAoUwTmJS9opqgrN6kRgCd3DASAMd1bAkEA96SBVWFt/fJBNJ9H +tYnBKZGw0VeHOYmVYbvMSstssn8un+pQpUm9vlG/bp7Oxd/m+b9KWEh2xPfv6zqU +avNwHwJBANqzGZa/EpzF4J8pGti7oIAPUIDGMtfIcmqNXVMckrmzQ2vTfqtkEZsA +4rE1IERRyiJQx6EJsz21wJmGV9WJQ5kCQQDwkS0uXqVdFzgHO6S++tjmjYcxwr3g +H0CoFYSgbddOT6miqRskOQF3DZVkJT3kyuBgU2zKygz52ukQZMqxCb1fAkASvuTv +qfpH87Qq5kQhNKdbbwbmd2NxlNabazPijWuphGTdW0VfJdWfklyS2Kr+iqrs/5wV +HhathJt636Eg7oIjAkA8ht3MQ+XSl9yIJIS8gVpbPxSw5OMfw0PjVE7tBdQruiSc +nvuQES5C9BMHjF39LZiGH1iLQy7FgdHyoP+eodI7 +-----END RSA PRIVATE KEY-----