Xi4or0uji's blog

内网端口转发

字数统计: 1.6k阅读时长: 7 min
2019/10/25 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简介
    1. 2.1. 口令登录
    2. 2.2. 秘钥登录
  3. 3. 端口转发
    1. 3.1. 环境搭建
    2. 3.2. 正向代理
      1. 3.2.1. 方法一
      2. 3.2.2. 方法二
      3. 3.2.3. 方法三
    3. 3.3. 反向代理
      1. 3.3.1. 方法一
      2. 3.3.2. 方法二