目录
一、SSH协议简介
SSH(Secure Shell protocol)协议是应用层协议,OpenSSH 是SSH (Secure SHell)协议的免费开源实现,SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。
二、SSH工作原理
私钥KEYpri加密公钥KEYpub解密
1)server第一次启动sshd服务时候,会生成自己的私钥KEYser-pri,生成公钥KEYser-pub存放在/etc/ssh/ssh_host_*下
2)client用户发起ssh请求
3)server将自己的公钥KEYser-pub发送给client
4)client将server的公钥KEYser-pub存放于~/.ssh/known_hosts下,并开始生成自己的公私钥KEYcli-pub 和KEYcli-pri
5)client回传自己的公钥KEYcli-pub到server,此时server端有自己的私钥KEYser-pri和client的公钥KEYcli-pub,client端有自己的私钥KEYcli-pri和server的公钥KEYser-pub,之后可以使用公私钥加密通信了。
6)开始双向加密通信
要点:
/etc/ssh/ssh_host_* 是服务端放置自己的公钥的地方
~/.ssh/known_hosts 是客户端存放服务端公钥的地方
server端(keyser-pri+keycli-pub)keyser-pri用来发送数据时加密发送,keycli-pub用来接收client数据后解密
client端(keycli-pri+keyser-pub)keycli-pri用来发送数据时加密发送,keyser-pub用来接收client数据后解密
三、SSH协议组成
1)传输层协议:提供服务器认证,保密性和完整性,和可以压缩提高传输效率。基于TCP/IP连接
2)用户认证协议:为服务器提供客户的身份认证
3)连接协议:对接上层的网络安全应用协议
认证方式:
1)支持username-passwd认证
2)支持秘钥认证
四、SSH隧道技术
普通的ssh命令如下:
ssh root@192.168.1.1
创建隧道常用的参数说明:
-C:压缩传输,提高传输速度
-f:将ssh转入后台执行,不占用当前的shell
-N:建立静默连接(不回显ssh页面)
-g:允许远程主机连接本地用于端口转发的端口
-L:本地端口转发
-R:远程端口转发
-D:动态端口转发(socket代理)
-p:指定ssh端口
Q1、什么是端口转发
ssh会加密和解密ssh客户端与服务端的网络数据,ssh还可以将其他的tcp端口网络数据通过ssh链接来转发,并且是机密解密的(又称隧道)。而且一般情况下ssh协议是被允许通过防火墙的,所以很容易被攻击者利用。
Q2、ssh端口转发的优势
1)加密客户端和服务端之间通讯数据
2)可以突破防火墙的限制
1、本地转发(远程转发到本地-正向代理)
情景一:
A想访问B但是无法穿透防火墙,但是A可以对B发送SSH连接
所以在A上执行命令:
ssh -NL 54321[本地端口]:localhost[目标ip]:12345[目标端口] username[目标用户名]@B[ip/host] -p 22[目标ssh监听的端口]
然后输入B的ssh密码
含义是:在A上访问自己的54321端口相当于通过(B的)localhost的12345端口。
然后A在自己本地访问54321端口数据就会通过ssh发送给了B,然后B访问了自己的12345端口,这样就可以通过B的12345访问B的网络,本地端口54321转发到了远程主机去访问某个端口
情景二:
vps可以访问web server(192.168.2.11),但是不能访问data server(1.1.1.5),但是web server有两块网卡,可以使用ssh将vps的54321端口本地转发到远端的web server,通过web server去访问data server的3389端口(实际上是走了web server的另一块网卡1.1.1.6访问了data server的3389,把web server当成跳板机)
在hacker上控制vps执行命令:
ssh -CfNg -L 54321[本机端口]:1.1.1.5[目标ip]:3389[目标端口] username[跳板机用户名]@192.168.2.11[跳板机ip或host] -p 22[跳板机ssh监听端口]
查看本地54321端口是否连接:netstat -tulnp | grep “54321”
如果连接建立,此时vps访问自己的本地的54321端口就相当于借助web server的访问了data server的3389端口
vps上执行命令:rdesktop 127.0.0.1:54321 即可打开data server的3389远程桌面
或者hacker上执行命令:rdesktop 150.150.150.150:54321 也可以访问到data server的3389远程桌面
注意:
本地端口转发:是在本地监听一个端口,所有访问这个端口的数据都会通过ssh隧道传输到远端机器,由远端机器代理去访问某个端口。
本地端口映射:是把本地的某个端口转发到远端机器的指定端口。
2、远程转发(本地转发到远程-反向代理)
本地端口转发:是将本地的监听一个端口通过ssh转发到远端主机(服务器)的某个端口。(自己本地启端口给远端用)
远程端口转发:是在远端主机上监听一个端口,所有的访问远程主机的这个端口的数据都会通过ssh转发到本地对应的端口(让远端自己启端口给自己用)
情景一:
vps不能访问内网3台机器。Web server可以访问vps,data和域控都是纯内网机器,要想访问内网的data server的3389,可以使用ssh让web server主机监听一个端口,使web server把监听到的数据通过ssh隧道传输给本地对应的3399端口(web server跳板机)。
在hacker上控制vps执行命令:
ssh -CfNg -R 3399[本机端口]:1.1.1.5[目标ip]:3389[目标端口] username[跳板机用户名]@192.168.2.11[跳板机ip或host] -p 22[跳板机ssh监听端口]
【注意执行了-R参数】
vps上执行命令:rdesktop 127.0.0.1:3399 即可打开data server的3389远程桌面
或者hacker上执行命令:rdesktop 150.150.150.150:3399 也可以访问到data server的3389远程桌面
3、动态转发(socks5代理)
情景一:
操作vps,使用ssh动态代理,借助web server实现vps访问域控制器上的文件。
操作步骤:
1)vps执行让web server开启动态转发命令:
ssh -CfNg -D 8888[本地监听端口] username[用户名]@192.168.2.11[ip或host] -p 22[ssh监听端口]
2)vps本地给浏览器配置socks5 proxy代理:127.0.0.1:8888。
3)然后浏览器访问域控制器1.1.1.2即可。
情景二:
hacker本机不直接访问web server,而是走vps动态代理访问web server
操作步骤:
1)hacker上执行让vps开启动态转发命令:
ssh -CfNg -D 8888[本地监听端口] root[vps用户名]@150.150.150.150[ip或host] -p 22[ssh监听端口]
2)hacker本机设置浏览器socks5代理:127.0.0.1:8888
3)然后浏览器方位web server即可,此时web server被访问显示的ip是vps的,hacker的ip不显示
【本机操作见02-SSH动态代理】
五、进阶使用
1)进阶ssh多级跳板机动态代理
参数 -J 【jump-host】
语法:ssh -J [user@jump-host:port] [user@remote-host:port]
ssh -J [user1@jump-host1:port],[user2@jump-host2:port]… [user@remote-host:port]
示例:
ssh -J user1@host1,user2@host2,uesr3@host3 D-user@D-host
ssh代理了一圈(7台机器)最后从93机器登陆了55,但是在55机器上只能看到是93登录,并不知道最开始ip在哪
ssh开启动态代理从55出口出去+代理了一圈跳板机
此时配合本机的浏览器socks5代理(127.0.0.1:1080),即可伪装本机的ip,使用55的ip访问
2)scp多级跳板机传输文件
scp -o ‘ProxyJump jump-host1,jump-host2’ file.txt user@host:/my/dir
scp -o ‘ProxyJump user@host’ 123.txt user@host:/tmp/
3)动态代理(socks代理)配合goby
本地让vps启动动态代理
ssh -CfNg -D 8361 root@150.158.159.89 -p 5772
设置goby的代理127.0.0.1:8361
使用sshuttle也可以,只不过这样就不需要在goby上设置服务器了,因为会默认走