【原創】使用golang訪問windows telnet服務器

本篇博客記錄本次使用golang語言tcp方式進行telnet服務器訪問python

環境:golang

一、win7系統telnet服務器,使用地址:192.168.8.189服務器

二、python使用telnetlib庫對telnet服務器進行訪問的客戶端例程tcp

三、服務端用戶名:admin  密碼:123456學習

本次功能實現過程:this

第一步:抓包獲取telnet交互流程分析spa

一、打開cmd。輸入:telnet 192.168.8.189      訪問 telnet服務器,依次輸入用戶名密碼,登陸成功後輸入:exit 退出;code

二、打開wireshark對上述流程進行抓包;blog

流查看抓包內容以下:cmd

轉儲16進制查看:

 

內容分析結果:

一、回車換行內容爲:0d 0a     也就是window自己的換行:\r\n;

二、回顯內容包含大量屏幕座標信息,基本沒法直接使用;

 

看到該內容後想起之前使用python進行telnet服務器訪問時,回顯內容無屏幕座標信息,遂找出之前寫的python程序對訪問信息進行抓包查看:

第二步:用使用telnetlib庫編寫的python程序對服務器進行訪問,對交互流程抓包

轉儲16進制:

查看內容發現回顯內容無屏幕座標信息,對比兩次交互內容,決定使用golang對方式二進行模擬,注意圖中紅色框內信息;

golang程序例程:

第一步:建立鏈接

func telnet_Creat(host string,usr string,pass string)  (conn net.Conn, err error) {
    telnetClientObj := new(TelnetClient)
    telnetClientObj.IP = host
    telnetClientObj.Port = "23"
    telnetClientObj.IsAuthentication = true
    telnetClientObj.UserName = usr
    telnetClientObj.Password = pass
    conn,err =telnetClientObj.Telnet(20)

    return conn,err
}
func (this *TelnetClient) Telnet(timeout int) (conn net.Conn, err error) {
raddr := this.IP + ":" + this.Port
conn, err = net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)
if nil != err {
log.Print("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)
return
}
if false == this.telnetProtocolHandshake(conn) {
log.Print("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")
return
}
return
}
 

第二步:模擬登陸(telnetProtocolHandshake)

func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {
    var buf [4096]byte
    log.Print("telnetProtocolHandshake")
    n, err := conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }
    log.Print("1====",string(buf[0:n]))
    log.Printf("%x",(buf[0:n]))
    buf[0] = 0xff
    buf[1] = 0xfc
    buf[2] = 0x25
    buf[3] = 0xff
    buf[4] = 0xfe
    buf[5] = 0x01
    n, err = conn.Write(buf[0:6])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
        return false
    }

    n, err = conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }
    log.Print("2====",string(buf[0:n]))
    buf[0] = 0xff
    buf[1] = 0xfe
    buf[2] = 0x03
    buf[3] = 0xff
    buf[4] = 0xfc
    buf[5] = 0x27
    n, err = conn.Write(buf[0:6])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
        return false
    }

    n, err = conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }
    log.Print("3====",string(buf[0:n]))
    n, err = conn.Write([]byte(this.UserName + "\r\n"))
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
        return false
    }
    time.Sleep(time.Millisecond * 500)

    n, err = conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }
    log.Print("4====",string(buf[0:n]))
    n, err = conn.Write([]byte(this.Password+ "\r\n"))
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
        return false
    }
    time.Sleep(time.Millisecond * 2000)
    n, err = conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }

    log.Print("5====",string(buf[0:n]))

    buf[0] = 0xff
    buf[1] = 0xfc
    buf[2] = 0x18
    n, err = conn.Write(buf[0:3])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err)
        return false
    }
    n, err = conn.Read(buf[0:])
    if nil != err {
        log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err)
        return false
    }
    log.Print("6====",string(buf[0:n]))

    return true
}

 

 

完整程序:

package tool

import (
    "log"
    "net"
    "time"
)

type TelnetClient struct {
    IP               string
    Port             string
    IsAuthentication bool
    UserName         string
    Password         string
}

func main() {
    conn,err:= telnet_Creat(host,usr,pass)
    if nil != err {
        return err

    }
    defer conn.Close()  
//後續對conn進行操做便可
}

func telnet_Creat(host string,usr string,pass string)  (conn net.Conn, err error) {
    telnetClientObj := new(TelnetClient) telnetClientObj.IP = host telnetClientObj.Port = "23" telnetClientObj.IsAuthentication = true telnetClientObj.UserName = usr telnetClientObj.Password = pass conn,err =telnetClientObj.Telnet(20) return conn,err }
func (this *TelnetClient) Telnet(timeout int) (conn net.Conn, err error) {
raddr := this.IP + ":" + this.Port
conn, err = net.DialTimeout("tcp", raddr, time.Duration(timeout)*time.Second)
if nil != err {
log.Print("pkg: model, func: Telnet, method: net.DialTimeout, errInfo:", err)
return
}
if false == this.telnetProtocolHandshake(conn) {
log.Print("pkg: model, func: Telnet, method: this.telnetProtocolHandshake, errInfo: telnet protocol handshake failed!!!")
return
}
return
}
func (this *TelnetClient) telnetProtocolHandshake(conn net.Conn) bool {
    var buf [4096]byte log.Print("telnetProtocolHandshake") n, err := conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("1====",string(buf[0:n])) log.Printf("%x",(buf[0:n])) buf[0] = 0xff buf[1] = 0xfc buf[2] = 0x25 buf[3] = 0xff buf[4] = 0xfe buf[5] = 0x01 n, err = conn.Write(buf[0:6]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err) return false } n, err = conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("2====",string(buf[0:n])) buf[0] = 0xff buf[1] = 0xfe buf[2] = 0x03 buf[3] = 0xff buf[4] = 0xfc buf[5] = 0x27 n, err = conn.Write(buf[0:6]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err) return false } n, err = conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("3====",string(buf[0:n])) n, err = conn.Write([]byte(this.UserName + "\r\n")) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err) return false } time.Sleep(time.Millisecond * 500) n, err = conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("4====",string(buf[0:n])) n, err = conn.Write([]byte(this.Password+ "\r\n")) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err) return false } time.Sleep(time.Millisecond * 2000) n, err = conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("5====",string(buf[0:n])) buf[0] = 0xff buf[1] = 0xfc buf[2] = 0x18 n, err = conn.Write(buf[0:3]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Write, errInfo:", err) return false } n, err = conn.Read(buf[0:]) if nil != err { log.Print("pkg: model, func: telnetProtocolHandshake, method: conn.Read, errInfo:", err) return false } log.Print("6====",string(buf[0:n])) return true }

 

若有問題可添加VX :d11235812  一塊兒學習交流;

相關文章
相關標籤/搜索