目录
简介
SSH是 "Secure Shell" 的缩写,是建立在应用层和传输层基础上的一种安全协议,方便跨平台访问,常用于Linux服务器远程加密登录,同时可以借助ssh协议来传输数据,提供更安全的SFTP服务。
SSH服务安装
查看openssh安装情况:
rpm -qa openssh*
如果不存在的话需要先进行安装
安装
Centos系列运行命令安装:
yum install -y openssh
或
yum install openssh-server -y
或
yum install openssh*
当然,安装软件操作需要root权限运行
Debian系列运行命令安装:
apt-get install openssh-server
或
apt-get install openssh*
SSH配置文件
安装完成后配置文件路径在:
/etc/ssh/
ls /etc/ssh #查看
这里有两个配置文件需要区分一下:
/etc/ssh/ssh_config #ssh客户端配置文件
/etc/ssh/sshd_config #ssh服务端配置文件
通常需要配置的就是 '/etc/ssh/sshd_config' 文件
最后在改动之前进行一下备份
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp
cp命令用于复制文件
常用参数:
-a #复制目录时使用,保留链接、文件属性,并复制目录下的所有内容
-d #复制时保留链接。相当于 Windows 系统的快捷方式
-f #覆盖已经存在的目标文件而不给出提示
-i #覆盖目标文件之前给出提示,要求用户确认是否覆盖
-p #除复制文件的内容外,同时复制时间和访问权限到新文件
-r #若源文件是一个目录文件,将复制该目录下所有的子目录和文件
-l #不复制文件,只生成链接文件
sshd_config文件内容:
Port 22 #监听端口,默认22,可随意更改
#AddressFamily any #IPV4和IPV6协议使用,any表示二者同时使用
ListenAddress 0.0.0.0 #IPV4,0.0.0.0表示本机的所有地址
#ListenAddress :: #IPV6
PermitRootLogin yes #允许管理员登录,yes允许,no拒绝
PermitEmptyPasswords no #是否允许空密码用户登录
PasswordAuthentication yes #是否允许基于密码登录
SSH登录系统
SSH提供基于口令(密码)的安全验证和基于密匙的安全验证方式。
基于密码的安全验证
只要你知道自己帐号和对应的密码,就可以通过ssh服务登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,比如蜜罐。
比如这里我这里使用用户名 'root' ,密码 'root' ,登录cnentos:
没有做过多限制的话,只有用户名和密码正确即可通过ssh服务登录。
-l #登录的用户名
-p #连接的端口
基于密匙的安全验证
将自己的公钥储存在远程主机上,登录的时候远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不用在输入密码即可成功登录到系统。
sshd_config配置文件需要配置:
PubkeyAuthentication yes #公钥验证开启
AuthorizedKeysFile .ssh/authorized_keys #私钥文件路径,公钥发给客户端PasswordAuthentication no #禁用密码验证登录
首先生成一个秘钥文件
ssh-keygen
这里我是在本地windows中生成的所以是 'ssh-keygen.exe'
中间不用输入使用默认即可
id_rsa #私钥
id_rsa.pub #公钥
然后将本机的公钥文件复制到远程机器的用户家目录下保存到 '.ssh/authorized_keys' 文件中
这里我是直接使用的ssh终端软件将id_rsa.pub文件进行的sftp文件传输到ssh服务主机的root家目录下
因为这里没有 ‘.ssh’ 文件夹,所以这里先新建了一个
随后将 'id_rsa.pub' 文件中的内容保存为 '.ssh' 文件夹下的 'authorized_keys'
然后重启了一下ssh服务
最后运行命令验证秘钥后没有输入用户密码直接登录到了ssh服务主机
当然,这里我没有更改任何的文件夹及文件的权限,至于网上很多说需要更改 '.ssh' 权限的设置自己可以去尝试一下:
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
在说明一下,这里我是在windows主机上传输文件到linux主机,如果直接两台linux主机上进行文件传输可以使用scp命令,当然windows上也支持scp命令,但是好像只能使用ssh服务的默认22端口,我这里是映射出来的端口在2222,进过尝试无法完成,所以采用sftp直接上传文件了
scp
scp:'secure copy' ,命令是 linux 系统下基于 ssh 登陆进行安全的远程复制文件和目录命令。
常用参数:
- -p:保留原文件的修改时间,访问时间和访问权限。
- -q: 不显示传输进度条
- -r: 递归复制整个目录
- -v:详细方式显示输出
- -P port:大写的P, port是指定数据传输用到的端口号
SSH命令参数
ssh user@]host [command]
ssh 192.168.217.128
#windows命令行中不加用户名默认使用当前系统用户名
#linux中不假用户名默认使用root用户
参数:
-b #指定连接的源IP
-g #允许远程主机连接主机的转发端口
-i #指定私钥文件
-l #指定连接远程服务器登录用户名
-N #不执行远程指令
-p #指定远程服务器上的端口
-q #静默模式
-X #开启X11转发功能
-x #关闭X11转发功能
-t #不分配伪终端
SSH隐身登录
ssh -T root@192.168.217.128 /bin/bash -i
-T #不分配伪终端
-i #bash的参数,表示交互式shell
这里以kali为例:
目前只打开了一个终端
通过windows使用ssh添加一个会话后
使用 'w' 和 'who' 命令查看当前已经多出来一个用户在线
尝试运行命令:
ssh ling@192.168.217.128 -T /bin/bash -i
此时在运行 'w' 和 'who' 命令但是没有检测出新加入的ssh连接从而达到隐身登录的目的。
SSH端口转发
SSH能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务。SSH为其他TCP链接提供了一个安全的通道来进行传输,如果工作环境许中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,那么就能够将通过ssh将TCP用端口转发来使用SSH进行通讯。
-L #本地转发
-R #远程转发
-f #后台启用
-N #不打开远程shell(不加-N则直接登录进去)
-g #启用网关功能
本地转发
ssh -L 本地端口:连接主机:连接主机端口 转发的主机
ssh -L 8888:192.168.217.128:22 192.168.217.128
将本地8888端口通过192.168.217.128转发至192.168.217.128主机的22端口
运行命令之后本机和192.168.217.128主机建立了一个tcp连接用于转发
这时候在本地从新打开一个终端并尝试运行ssh命令连接本地8888端口
ssh 127.0.0.1 -p 8888 -l root
这个时候连接上的同样是kali主机
SSH日志信息
cat /var/log/auth.log #ubuntu
cat /var/log/secure #centos
cat /var/log/auth.log |grep "Accept" #登录成功的日志
cat /var/log/auth.log |grep "pam_unix(sshd:session): session closed" #正常退出的日志
cat /var/log/auth.log | grep "Failed password for" #登录失败日志
sudo grep "Failed password" /var/log/auth.log|perl -e 'while($_=<>){ /for(.*?)from/; print"$1\n";}'|sort|uniq -c|sort -nr
#统计登录失败的用户名及次数
sudo cat /var/log/auth.log | grep "Failed password for" |grep "root" | grep -Po '(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}'|sort|uniq -c|sort -nr
#统计登录者的Ip和次数(这里用的是root)
cat /var/log/auth.log | grep "Failed password for"| grep "invalid" | cut -d " " -f 11 | sort | uniq -c | sort -nr
#统计不存在的用户名及错误登录次数
SSH暴力破解
hydra -L users.txt -P password.txt -t 5 -vV -o ssh.txt -e ns 192.168.217.128 ssh
hydra -L user.txt -P pass.txt -t 20 -vV ssh://192.168.217.128
声明
提供的技术仅供学习参考测试,利用本文提供的信息造成的直接或间接损失由使用者自行承担。
结语
对未来真正的慷慨,是把一切献给现在。