Пример #1
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            bool reply=waitForReply();
            if(reply)
            {
                channel.reply=-1;
            }

            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("subsystem"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(Util.getBytes("sftp"));
            session.write(packet);

            if(reply)
            {
                while(channel.reply==-1)
                {
                    try{System.Threading.Thread.Sleep(10);}
                    catch//(Exception ee)
                    {
                    }
                }
                if(channel.reply==0)
                {
                    throw new JSchException("failed to send sftp request");
                }
            }
        }
Пример #2
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString( Util.getBytes("signal"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(Util.getBytes(signal));
            session.write(packet);
        }
Пример #3
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            // send
            // byte     SSH_MSG_CHANNEL_REQUEST(98)
            // uint32 recipient channel
            // string request type       // "shell"
            // boolean want reply        // 0
            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("shell"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            session.write(packet);
        }
Пример #4
0
        //private byte[] f;
        public override void init(Session session,
			byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C)
        {
            this.session=session;
            this.V_S=V_S;
            this.V_C=V_C;
            this.I_S=I_S;
            this.I_C=I_C;

            //    sha=new SHA1();
            //    sha.init();

            try
            {
                Type t=Type.GetType(session.getConfig("sha-1"));
                sha=(HASH)(Activator.CreateInstance(t));
                sha.init();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }

            buf=new Buffer();
            packet=new Packet(buf);

            try
            {
                Type t=Type.GetType(session.getConfig("dh"));
                dh=(DH)(Activator.CreateInstance(t));
                dh.init();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }

            packet.reset();
            buf.putByte((byte)0x22);
            buf.putInt(min);
            buf.putInt(preferred);
            buf.putInt(max);
            session.write(packet);

            state=SSH_MSG_KEX_DH_GEX_GROUP;
        }
Пример #5
0
		public void request(Session session, Channel channel)
		{
			Packet packet=session.packet;
			Buffer buf=session.buf;
			// send
			// byte     SSH_MSG_CHANNEL_REQUEST(98)
			// uint32 recipient channel
			// string request type       // "exec"
			// boolean want reply        // 0
			// string command
			packet.reset();
			buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
			buf.putInt(channel.getRecipient());
			buf.putString(new Str("exec").getBytes());
			buf.putByte((byte)(waitForReply() ? 1 : 0));
			buf.putString(new Str(command).getBytes());
			session.write(packet);
		}
Пример #6
0
        public virtual bool start(Session session)
        {
            Packet packet=session.packet;
            Buffer buf=session.buf;
            // send
            // byte      SSH_MSG_SERVICE_REQUEST(5)
            // string    service name "ssh-userauth"
            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_SERVICE_REQUEST);
            buf.putString(Util.getBytes("ssh-userauth"));
            session.write(packet);

            // receive
            // byte      SSH_MSG_SERVICE_ACCEPT(6)
            // string    service name
            buf=session.read(buf);
            //System.out.println("read: 6 ? "+buf.buffer[5]);
            return buf.buffer[5]==6;
        }
Пример #7
0
		internal static String[] getPortForwarding(Session session)
		{
			java.util.Vector foo=new java.util.Vector();
			lock(pool)
			{
				for(int i=0; i<pool.size(); i++)
				{
					PortWatcher p=(PortWatcher)(pool.elementAt(i));
					if(p.session==session)
					{
						foo.addElement(p.lport+":"+p.host+":"+p.rport);
					}
				}
			}
			String[] bar=new String[foo.size()];
			for(int i=0; i<foo.size(); i++)
			{
				bar[i]=(String)(foo.elementAt(i));
			}
			return bar;
		}
Пример #8
0
        internal PortWatcher(Session session, 
			String address, int lport, 
			String host, int rport,
			ServerSocketFactory factory)
        {
            this.session=session;
            this.lport=lport;
            this.host=host;
            this.rport=rport;
            try
            {
                boundaddress=InetAddress.getByName(address);
                ss=(factory==null) ?
                    new ServerSocket(lport, 0, boundaddress) :
                    factory.createServerSocket(lport, 0, boundaddress);
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
                throw new JSchException("PortForwardingL: local port "+address+":"+lport+" cannot be bound.");
            }
        }
Пример #9
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            //byte      SSH_MSG_CHANNEL_REQUEST
            //uint32    recipient_channel
            //string    "window-change"
            //boolean   FALSE
            //uint32    terminal width, columns
            //uint32    terminal height, rows
            //uint32    terminal width, pixels
            //uint32    terminal height, pixels
            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("window-change"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putInt(width_columns);
            buf.putInt(height_rows);
            buf.putInt(width_pixels);
            buf.putInt(height_pixels);
            session.write(packet);
        }
Пример #10
0
		public void request(Session session, Channel channel) 
		{
			Buffer buf=new Buffer();
			Packet packet=new Packet(buf);

			// byte      SSH_MSG_CHANNEL_REQUEST(98)
			// uint32 recipient channel
			// string request type        // "x11-req"
			// boolean want reply         // 0
			// boolean   single connection
			// string    x11 authentication protocol // "MIT-MAGIC-COOKIE-1".
			// string    x11 authentication cookie
			// uint32    x11 screen number
			packet.reset();
			buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
			buf.putInt(channel.getRecipient());
			buf.putString(Util.getBytes("x11-req"));
			buf.putByte((byte)(waitForReply() ? 1 : 0));
			buf.putByte((byte)0);
			buf.putString(Util.getBytes("MIT-MAGIC-COOKIE-1"));
			buf.putString(ChannelX11.getFakedCookie(session));
			buf.putInt(0);
			session.write(packet);
		}
Пример #11
0
		/// <summary>
		/// Constructs a new SSH stream.
		/// </summary>
		/// <param name="host">The hostname or IP address of the remote SSH machine</param>
		/// <param name="username">The name of the user connecting to the remote machine</param>
		/// <param name="password">The password of the user connecting to the remote machine</param>
		public SshStream(string host, string username, string password)
		{
			this.m_host = host;
			JSch jsch=new JSch();
			m_session=jsch.getSession(username, host, 22);
			m_session.setPassword( password );
		
			Hashtable config=new Hashtable();
			config.Add("StrictHostKeyChecking", "no");
			m_session.setConfig(config);
		
			m_session.connect();
           
			m_channel=(ChannelShell)m_session.openChannel("shell");

			m_in	= m_channel.getInputStream();
			m_out	= m_channel.getOutputStream();

			m_channel.connect();
			m_channel.setPtySize(80, 132, 1024, 768);

			Prompt = "\n";
			m_escapeCharPattern = "\\[[0-9;?]*[^0-9;]";
		}
Пример #12
0
 internal static Channel getChannel(int id, Session session)
 {
     lock(pool)
     {
         for(int i=0; i<pool.size(); i++)
         {
             Channel c=(Channel)(pool.elementAt(i));
             if(c.id==id && c.session==session) return c;
         }
     }
     return null;
 }
Пример #13
0
 internal static void disconnect(Session session)
 {
     Channel[] channels=null;
     int count=0;
     lock(pool)
     {
         channels=new Channel[pool.size()];
         for(int i=0; i<pool.size(); i++)
         {
             try
             {
                 Channel c=((Channel)(pool.elementAt(i)));
                 if(c.session==session)
                 {
                     channels[count++]=c;
                 }
             }
             catch(Exception e)
             {
             }
         }
     }
     for(int i=0; i<count; i++)
     {
         channels[i].disconnect();
     }
 }
Пример #14
0
 internal static void delPort(Session session)
 {
     int[] rport=null;
     int count=0;
     lock(pool)
     {
         rport=new int[pool.size()];
         for(int i=0; i<pool.size(); i++)
         {
             Object[] bar=(Object[])(pool.elementAt(i));
             if(bar[0]==session)
             {
                 rport[count++]=((Integer)bar[1]).intValue();
             }
         }
     }
     for(int i=0; i<count; i++)
     {
         delPort(session, rport[i]);
     }
 }
Пример #15
0
		protected virtual void ConnectSession(int tcpPort)
		{
			m_session = m_jsch.getSession(m_user, m_host, tcpPort);
			if (Password != null)
				m_session.setPassword(Password);
			Hashtable config = new Hashtable();
			config.Add("StrictHostKeyChecking", "no");
			m_session.setConfig(config);
			m_session.connect();
		}
Пример #16
0
        public override void init(Session session,
			byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C)
        {
            this.session=session;
            this.V_S=V_S;
            this.V_C=V_C;
            this.I_S=I_S;
            this.I_C=I_C;

            //    sha=new SHA1();
            //    sha.init();
            try
            {
                Type t=Type.GetType(session.getConfig("sha-1"));
                sha=(HASH)(Activator.CreateInstance(t));
                sha.init();
            }
            catch(Exception ee)
            {
                Console.WriteLine(ee);
            }

            buf=new Buffer();
            packet=new Packet(buf);

            try
            {
                Type t=Type.GetType(session.getConfig("dh"));
                dh=(DH)(Activator.CreateInstance(t));
                dh.init();
            }
            catch(Exception ee)
            {
                Console.WriteLine(ee);
            }

            dh.setP(p);
            dh.setG(g);

            // The client responds with:
            // byte  SSH_MSG_KEXDH_INIT(30)
            // mpint e <- g^x mod p
            //         x is a random number (1 < x < (p-1)/2)

            e=dh.getE();

            packet.reset();
            buf.putByte((byte)SSH_MSG_KEXDH_INIT);
            buf.putMPInt(e);
            session.write(packet);

            state=SSH_MSG_KEXDH_REPLY;
        }
Пример #17
0
        byte[] getSignature_dss(Session session, byte[] data)
        {
            /*
                byte[] foo;
                int i;
                System.out.print("P ");
                foo=P_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
                System.out.print("Q ");
                foo=Q_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
                System.out.print("G ");
                foo=G_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
            */

            try
            {
                Type t=Type.GetType(jsch.getConfig("signature.dss"));
                SignatureDSA dsa=(SignatureDSA)(Activator.CreateInstance(t));
                dsa.init();
                dsa.setPrvKey(prv_array, P_array, Q_array, G_array);

                /*
                byte[] goo=new byte[4];
                goo[0]=(byte)(session.getSessionId().Length>>>24);
                goo[1]=(byte)(session.getSessionId().Length>>>16);
                goo[2]=(byte)(session.getSessionId().Length>>>8);
                goo[3]=(byte)(session.getSessionId().Length);
                dsa.update(goo);
                dsa.update(session.getSessionId());
                */
                dsa.update(data);
                byte[] sig = dsa.sign();
                Buffer buf=new Buffer("ssh-dss".Length+4+
                    sig.Length+4);
                buf.putString( System.Text.Encoding.Default.GetBytes( "ssh-dss" ) );
                buf.putString(sig);
                return buf.buffer;
            }
            catch(Exception e)
            {
                Console.WriteLine("e "+e);
            }
            return null;
        }
Пример #18
0
		internal static PortWatcher getPort(Session session, String address, int lport)
		{
			InetAddress addr;
			try
			{
				addr=InetAddress.getByName(address);
			}
			catch(Exception uhe)
			{
				throw new JSchException("PortForwardingL: invalid address "+address+" specified.");
			}
			lock(pool)
			{
				for(int i=0; i<pool.size(); i++)
				{
					PortWatcher p=(PortWatcher)(pool.elementAt(i));
					if(p.session==session && p.lport==lport)
					{
						if(p.boundaddress.isAnyLocalAddress() ||
							p.boundaddress.equals(addr))
							return p;
					}
				}
				return null;
			}
		}
Пример #19
0
 internal virtual void setSession(Session session)
 {
     this.session=session;
 }
Пример #20
0
		/// <summary>
		/// Closes the SSH subsystem
		/// </summary>
		public virtual void Close()
		{
			if (m_channel != null)
			{
				m_channel.close();
				m_channel.disconnect();
				m_channel = null;
			}
			if (m_session != null)
			{
				m_session.disconnect();
				m_session = null;
			}
		}
Пример #21
0
		internal static void delPort(Session session)
		{
			lock(pool)
			{
				PortWatcher[] foo=new PortWatcher[pool.size()];
				int count=0;
				for(int i=0; i<pool.size(); i++)
				{
					PortWatcher p=(PortWatcher)(pool.elementAt(i));
					if(p.session==session) 
					{
						p.delete();
						foo[count++]=p;
					}
				}
				for(int i=0; i<count; i++)
				{
					PortWatcher p=foo[i];
					pool.removeElement(p);
				}
			}
		}
Пример #22
0
		internal static void delPort(Session session, String address, int lport) 
		{
			PortWatcher pw=getPort(session, address, lport);
			if(pw==null)
			{
				throw new JSchException("PortForwardingL: local port "+address+":"+lport+" is not registered.");
			}
			pw.delete();
			pool.removeElement(pw);
		}
Пример #23
0
		internal static PortWatcher addPort(Session session, String address, int lport, String host, int rport, ServerSocketFactory ssf) 
		{
			if(getPort(session, address, lport)!=null)
			{
				throw new JSchException("PortForwardingL: local port "+ address+":"+lport+" is already registered.");
			}
			PortWatcher pw=new PortWatcher(session, address, lport, host, rport, ssf);
			pool.addElement(pw);
			return pw;
		}
Пример #24
0
        public override bool start(Session session)
        {
            base.start(session);
            //System.out.println("UserAuthNone: start");
            Packet packet=session.packet;
            Buffer buf=session.buf;
            String username=session.username;

            byte[] _username=null;
            try{ _username=Util.getBytesUTF8(username); }
            catch
            {//(java.io.UnsupportedEncodingException e){
                _username=Util.getBytes(username);
            }

            // send
            // byte      SSH_MSG_USERAUTH_REQUEST(50)
            // string    user name
            // string    service name ("ssh-connection")
            // string    "none"
            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
            buf.putString(_username);
            buf.putString(Util.getBytes("ssh-connection"));
            buf.putString(Util.getBytes("none"));
            session.write(packet);

            loop:
                while(true)
                {
                    // receive
                    // byte      SSH_MSG_USERAUTH_SUCCESS(52)
                    // string    service name
                    buf=session.read(buf);
                    //System.out.println("UserAuthNone: read: 52 ? "+    buf.buffer[5]);
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS)
                    {
                        return true;
                    }
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] _message=buf.getString();
                        byte[] lang=buf.getString();
                        String message=null;
                        try{ message=Util.getStringUTF8(_message); }
                        catch
                        {//(java.io.UnsupportedEncodingException e){
                            message=Util.getString(_message);
                        }
                        if(userinfo!=null)
                        {
                            userinfo.showMessage(message);
                        }
                        goto loop;
                    }
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] foo=buf.getString();
                        int partial_success=buf.getByte();
                        methods=Util.getString(foo);
                        //System.out.println("UserAuthNONE: "+methods+
                        //		   " partial_success:"+(partial_success!=0));
                        //	if(partial_success!=0){
                        //	  throw new JSchPartialAuthException(new String(foo));
                        //	}
                        break;
                    }
                    else
                    {
                        //      System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                        throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                    }
                }
            //throw new JSchException("USERAUTH fail");
            return false;
        }
Пример #25
0
        public override bool start(Session session)
        {
            //    super.start(session);
            //System.out.println("UserAuthPassword: start");
            Packet packet=session.packet;
            Buffer buf=session.buf;
            String username=session.username;
            String password=session.password;
            String dest=username+"@"+session.host;
            if(session.port!=22){
              dest+=(":"+session.port);
            }

            while(true){
              if(password==null){
            if(userinfo==null){
              //throw new JSchException("USERAUTH fail");
              return false;
            }
            if(!userinfo.promptPassword("Password for "+dest)){
              throw new JSchAuthCancelException("password");
              //break;
            }
            password=userinfo.getPassword();
            if(password==null){
              throw new JSchAuthCancelException("password");
              //break;
            }
              }

              byte[] _username=null;
              try{ _username=Util.getBytesUTF8(username); }
              catch{//(java.io.UnsupportedEncodingException e){
            _username=Util.getBytes(username);
              }

              byte[] _password=null;
              try{ _password=Util.getBytes(password); }
              catch{//(java.io.UnsupportedEncodingException e){
            _password=Util.getBytes(password);
              }

              // send
              // byte      SSH_MSG_USERAUTH_REQUEST(50)
              // string    user name
              // string    service name ("ssh-connection")
              // string    "password"
              // boolen    FALSE
              // string    plaintext password (ISO-10646 UTF-8)
              packet.reset();
              buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
              buf.putString(_username);
              buf.putString(Util.getBytes("ssh-connection"));
              buf.putString(Util.getBytes("password"));
              buf.putByte((byte)0);
              buf.putString(_password);
              session.write(packet);

              loop:
              while(true){
            // receive
            // byte      SSH_MSG_USERAUTH_SUCCESS(52)
            // string    service name
            buf=session.read(buf);
            //System.out.println("read: 52 ? "+    buf.buffer[5]);
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS){
              return true;
            }
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER){
              buf.getInt(); buf.getByte(); buf.getByte();
              byte[] _message=buf.getString();
              byte[] lang=buf.getString();
              String message=null;
              try{ message=Util.getStringUTF8(_message); }
              catch{//(java.io.UnsupportedEncodingException e){
            message=Util.getString(_message);
              }
              if(userinfo!=null){
            userinfo.showMessage(message);
              }
              goto loop;
            }
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE){
              buf.getInt(); buf.getByte(); buf.getByte();
              byte[] foo=buf.getString();
              int partial_success=buf.getByte();
              //System.out.println(new String(foo)+
              //		 " partial_success:"+(partial_success!=0));
              if(partial_success!=0){
            throw new JSchPartialAuthException(Util.getString(foo));
              }
              break;
            }
            else{
            //        System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
            //	  throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
              return false;
            }
              }
              password=null;
            }
            //throw new JSchException("USERAUTH fail");
            //return false;
        }
Пример #26
0
 internal static String[] getPortForwarding(Session session)
 {
     java.util.Vector foo=new java.util.Vector();
     lock(pool)
     {
         for(int i=0; i<pool.size(); i++)
         {
             Object[] bar=(Object[])(pool.elementAt(i));
             if(bar[0]!=session) continue;
             if(bar[3]==null){ foo.addElement(bar[1]+":"+bar[2]+":"); }
             else{ foo.addElement(bar[1]+":"+bar[2]+":"+bar[3]); }
         }
     }
     String[] bar2=new String[foo.size()];
     for(int i=0; i<foo.size(); i++)
     {
         bar2[i]=(String)(foo.elementAt(i));
     }
     return bar2;
 }
Пример #27
0
 public byte[] getSignature(Session session, byte[] data)
 {
     if(type==RSA) return getSignature_rsa(session, data);
     return getSignature_dss(session, data);
 }
Пример #28
0
 internal static Object[] getPort(Session session, int rport)
 {
     lock(pool)
     {
         for(int i=0; i<pool.size(); i++)
         {
             Object[] bar=(Object[])(pool.elementAt(i));
             if(bar[0]!=session) continue;
             if(((Integer)bar[1]).intValue()!=rport) continue;
             return bar;
         }
         return null;
     }
 }
Пример #29
0
        byte[] getSignature_rsa(Session session, byte[] data)
        {
            try
            {
                Type t=Type.GetType(jsch.getConfig("signature.rsa"));
                SignatureRSA rsa=(SignatureRSA)Activator.CreateInstance(t);

                rsa.init();
                rsa.setPrvKey(e_array, n_array, d_array, p_array, q_array, dmp1_array, dmq1_array, iqmp_array);

                /*
                byte[] goo=new byte[4];
                goo[0]=(byte)(session.getSessionId().Length>>>24);
                goo[1]=(byte)(session.getSessionId().Length>>>16);
                goo[2]=(byte)(session.getSessionId().Length>>>8);
                goo[3]=(byte)(session.getSessionId().Length);
                rsa.update(goo);
                rsa.update(session.getSessionId());
                */
                rsa.update(data);
                byte[] sig = rsa.sign();
                Buffer buf=new Buffer("ssh-rsa".Length+4+
                    sig.Length+4);
                buf.putString( System.Text.Encoding.Default.GetBytes( "ssh-rsa" ));
                buf.putString(sig);
                return buf.buffer;
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
            return null;
        }
Пример #30
0
 internal static byte[] getFakedCookie(Session session)
 {
     lock(faked_cookie_hex_pool)
     {
         byte[] foo=(byte[])faked_cookie_hex_pool[session];
         if(foo==null)
         {
             Random random=Session.random;
             foo=new byte[16];
             lock(random)
             {
                 random.fill(foo, 0, 16);
             }
             /*
             System.out.print("faked_cookie: ");
             for(int i=0; i<foo.length; i++){
                 System.out.print(Integer.toHexString(foo[i]&0xff)+":");
             }
             System.out.println("");
             */
             faked_cookie_pool.Add(session, foo);
             byte[] bar=new byte[32];
             for(int i=0; i<16; i++)
             {
                 bar[2*i]=table[(foo[i]>>4)&0xf];
                 bar[2*i+1]=table[(foo[i])&0xf];
             }
             faked_cookie_hex_pool.Add(session, bar);
             foo=bar;
         }
         return foo;
     }
 }