2011-10-25 3 views
1

최소한의 텔넷을 사용하여 양식 프로젝트를 통해 텔넷 클라이언트를 백본으로 사용하고 있습니다. 협상 과정에서 클라이언트는 서버에 37 바이트의 데이터 바이트를 보냅니다. 이것이 IAC 인 경우 인증을위한 것입니다. 클라이언트와 서버간에 협상이 완료 될 때까지 전송 된 데이터가 없어야합니다.텔넷 협상에서 데이터 바이트가 누락됩니다. 이것은 어디서 오는 거니?

막혔습니다. 누군가 37 비트의 데이터 바이트를 자동으로 보내는 이유를 알아낼 수 있습니까? 이것은 wireshark를 사용하여 패킷을 스니핑 할 때 발견 된 것입니다. Void Parsetelnet 섹션은 전송이 발생하는 곳입니다.

Wireshark를 사용할 때 인증 옵션을 요구하는 서버 인스턴스가 없습니다. 그래서 나는 수업이 바이트 37을 얻는 곳을 잃어 버렸습니다. 나는 그것을 보내지 않아야합니다. 여기서 클래스

Telnet Authentication Option
using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Net.Sockets; 

    namespace STC_Control 
    { 
     enum Verbs 
     { 
      WILL = 251, 
      WONT = 252, 
      DO = 253, 
      DONT = 254, 
      IAC = 255 
     } 

     enum Options 
     { 
      SGA = 3 
     } 

     class TelnetConnection 
     { 
      TcpClient tcpSocket; 

      int TimeOutMs = 100; 

      public TelnetConnection(string Hostname, int Port) 
      { 
       tcpSocket = new TcpClient(Hostname, Port); 

      } 

      public void WriteLine(string cmd) 
      { 
       Write(cmd + "\n"); 
      } 

      public void Write(string cmd) 
      { 
       if (!tcpSocket.Connected) return; 
       byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF")); 
       tcpSocket.GetStream().Write(buf, 0, buf.Length); 
      } 

      public string Read() 
      { 

       if (!tcpSocket.Connected) return null; 

        StringBuilder sb = new StringBuilder(); 

        do 
        { 
         ParseTelnet(sb); 
         System.Threading.Thread.Sleep(TimeOutMs); 
        } while (tcpSocket.Available > 0); 
        return sb.ToString(); 

      } 

      public bool IsConnected 
      { 
       get { return tcpSocket.Connected; } 
      } 

      void ParseTelnet(StringBuilder sb) 
      { 
       while (tcpSocket.Available > 0) 
       { 
        int input = tcpSocket.GetStream().ReadByte(); 
        switch (input) 
        { 
         case -1: 
          break; 
         case (int)Verbs.IAC: 
          // interpret as command 
          int inputverb = tcpSocket.GetStream().ReadByte(); 
          if (inputverb == -1) break; 
          switch (inputverb) 
          { 
           case (int)Verbs.IAC: 
            //literal IAC = 255 escaped, so append char 255 to string 
            sb.Append(inputverb); 
            break; 
           case (int)Verbs.DO: 
           case (int)Verbs.DONT: 
           case (int)Verbs.WILL: 
           case (int)Verbs.WONT: 
            // reply to all commands with "WONT", unless it is SGA (suppres go ahead) 
            int inputoption = tcpSocket.GetStream().ReadByte(); 
            if (inputoption == -1) break; 
            tcpSocket.GetStream().WriteByte((byte)Verbs.IAC); 
            if (inputoption == (int)Options.SGA) 
             tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO); 
            else 
             tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT); 
            tcpSocket.GetStream().WriteByte((byte)inputoption); 
            break; 
           default: 
            break; 
          } 
          break; 
         default: 
          sb.Append((char)input); 
          break; 
        } 
       } 

      } 
     } 
    } 

답변

0

"인증 유형 및 모드 협상 암호화가 사용 인증 정보 전달되어야하는지되어야하는지 여부를 포함하는 일반적인 방법으로 텔넷 프로토콜 인증 옵션을 지정한다."source

텔넷을 통한 NTLM 인증 세션을 설명하는 MSDN에는 example이 있습니다.

관련 문제