More on ssh2http wrapper implementation
This commit is contained in:
parent
5bd233a860
commit
f6b6b76a8a
1 changed files with 74 additions and 15 deletions
|
@ -57,6 +57,12 @@ func Pipe(conn1 net.Conn, conn2 net.Conn) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func extractBase64Payload(httpString string) string {
|
||||||
|
strs0 := strings.Split(httpString,"<body>")
|
||||||
|
strs1 := strings.Split(strs0[1],"</body>")
|
||||||
|
return strs1[0]
|
||||||
|
}
|
||||||
|
|
||||||
func envelopeSSLServerHandshake(data []byte) string{
|
func envelopeSSLServerHandshake(data []byte) string{
|
||||||
base64sslHandShake := base64.StdEncoding.EncodeToString(data)
|
base64sslHandShake := base64.StdEncoding.EncodeToString(data)
|
||||||
httpEnvelope := `
|
httpEnvelope := `
|
||||||
|
@ -69,8 +75,7 @@ func envelopeSSLServerHandshake(data []byte) string{
|
||||||
return envelope
|
return envelope
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSshClientConnection(remoteAddress string,client net.Conn){
|
func handleSshHandshakeServer(remoteAddress string,client net.Conn) (sshServer net.Conn){
|
||||||
|
|
||||||
bufIn := make([]byte, 1024)
|
bufIn := make([]byte, 1024)
|
||||||
|
|
||||||
sshServer, err := net.Dial("tcp", remoteAddress)
|
sshServer, err := net.Dial("tcp", remoteAddress)
|
||||||
|
@ -79,28 +84,68 @@ func handleSshClientConnection(remoteAddress string,client net.Conn){
|
||||||
fmt.Println("Error connecting:", err.Error())
|
fmt.Println("Error connecting:", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
_,err = sshServer.Read(bufIn)
|
fmt.Println("Reading payload")
|
||||||
|
|
||||||
|
_,err = client.Read(bufIn)
|
||||||
|
|
||||||
|
fmt.Println("Payload readed")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error reading:", err.Error())
|
fmt.Println("Error reading:", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
envelope := envelopeSSLServerHandshake(bufIn)
|
fmt.Println("Input String: ",string(bufIn))
|
||||||
|
|
||||||
|
sshB64Payload := extractBase64Payload(string(bufIn))
|
||||||
|
|
||||||
|
fmt.Println("sshb64Payload: ",sshB64Payload)
|
||||||
|
|
||||||
|
payload, err := base64.StdEncoding.DecodeString(sshB64Payload)
|
||||||
|
|
||||||
|
strPayload := strings.Trim(string(payload),"")
|
||||||
|
fmt.Println("payload: ",strPayload)
|
||||||
|
|
||||||
client.Write([]byte(envelope))
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error reading:", err.Error())
|
fmt.Println("Error reading:", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Write([]byte(envelope))
|
sshServer.Write([]byte(strPayload))
|
||||||
|
|
||||||
|
return sshServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSshHandshakeClient(remoteAddress string,client net.Conn) (sshServer net.Conn){
|
||||||
|
bufIn := make([]byte, 1024)
|
||||||
|
|
||||||
|
sshServer, err := net.Dial("tcp", remoteAddress)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error connecting:", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
_,err = client.Read(bufIn)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error reading:", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
stringInput := strings.Trim(string(bufIn),"\x00")
|
||||||
|
|
||||||
|
envelope := envelopeSSLServerHandshake([]byte(stringInput))
|
||||||
|
|
||||||
|
sshServer.Write([]byte(envelope))
|
||||||
|
return sshServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSshClientConnection(remoteAddress string,client net.Conn){
|
||||||
|
sshServer := handleSshHandshakeClient(remoteAddress,client)
|
||||||
Pipe(sshServer,client)
|
Pipe(sshServer,client)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSshServerConnection(remoteAddress string,client net.Conn){
|
||||||
|
sshServer := handleSshHandshakeServer(remoteAddress,client)
|
||||||
// Close the connection when you're done with it.
|
Pipe(sshServer,client)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ctrlc() {
|
func ctrlc() {
|
||||||
|
@ -115,20 +160,34 @@ func ctrlc() {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func serve(remoteAddress string,localPort string){
|
func serveClient(localService string,remoteAddress string){
|
||||||
|
|
||||||
ln, _ := net.Listen("tcp","localhost:"+localPort)
|
ln, _ := net.Listen("tcp",localService)
|
||||||
|
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
fmt.Println("Listening on :" + localPort)
|
fmt.Println("Listening on :" + localService)
|
||||||
|
|
||||||
for{
|
for{
|
||||||
conn, _ := ln.Accept()
|
conn, _ := ln.Accept()
|
||||||
|
fmt.Printf("New connection established from '%v'\n", conn.RemoteAddr())
|
||||||
go handleSshClientConnection(remoteAddress,conn)
|
go handleSshClientConnection(remoteAddress,conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func serveServer(localService string,remoteSSHServer string){
|
||||||
|
ln, _ := net.Listen("tcp",localService)
|
||||||
|
defer ln.Close()
|
||||||
|
|
||||||
|
fmt.Println("Listening on: "+localService)
|
||||||
|
|
||||||
|
for{
|
||||||
|
conn, _ := ln.Accept()
|
||||||
|
fmt.Printf("New connection established from '%v'\n", conn.RemoteAddr())
|
||||||
|
go handleSshServerConnection(remoteSSHServer,conn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func main(){
|
func main(){
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
|
@ -156,9 +215,9 @@ app.Flags = []cli.Flag{
|
||||||
color.Unset()
|
color.Unset()
|
||||||
app.Action = func(c *cli.Context) error {
|
app.Action = func(c *cli.Context) error {
|
||||||
if c.Bool("serve"){
|
if c.Bool("serve"){
|
||||||
|
serveServer("localhost:10100","localhost:10200")
|
||||||
}else{
|
}else{
|
||||||
serve("localhost:10100","10000")
|
serveClient("localhost:10000","localhost:10100")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue