Linux下端口转发简介

来源:互联网 发布:精通d3.js 第2版 编辑:程序博客网 时间:2024/05/16 23:51

-纪实

这周去参加了在西安电子科技大学举报的”全国电子信息设计大赛“-动态演练组的比赛,下面就简要地说下比赛的一些基本情况吧。此次比赛的队伍有24支,大都来自”211“,”985“工程大学,比赛环境在一个封闭的会议厅里面,中间放着大型服务器和交换机等设备,全程比赛持续24小时,期间不能上网且场地有信号屏蔽(亲测2/3/4g均无信号),这里要吐槽一下的就是,在赛前一小时才宣布比赛的具体规则(不知其中是否有xxxx,反正我们是被坑了)。

这里对比赛的环境进行一个简单地回顾,因为每个队伍的比赛环境都相同并且相互隔离,所以此次比赛无法进行队伍之间的干扰。比赛形式主要以模拟环境下的目标渗透为主(获取目标机上的flag得分),靶机环境有两层,4台靶机位于外网(其中2台为跳靶机,连接着内网),2台靶机位于内网。下面是一些靶机的信息(记得不太清了):

(外网基本信息)

靶机

网络地址

操作系统

相关服务

Target1

10.10.0.100/16

Window Server 2003 SP2

135 netbios

445 smb

3389 win-remote-control

(还有一些Oracle的相关服务,具体端口忘记了)

Target2

10.10.0.101/16

Ubuntu 12.10 32bit

80 apache 2.2.22

Target3

10.10.0.102/16

192.168.0.100/24

Ubuntu(具体版本未知)

22 OpenSSH(3.5?具体忘了)

Target4

10.10.0.103/16

192.168.0.101/24

Ubuntu 14.04 32bit

22 OpenSSH 6.5

80 apache(具体版本忘记)

(内网基本信息)

靶机

网络地址

操作系统

相关服务

Target5

192.168.0.102/24

Linux(具体发行版未知)

22 ssh

80 apache(具体版本未知)

??(其他还没来得及探测)

Target6

192.168.0.103/24

Linux(具体发行版未知)

22 ssh

80 apache(具体版本未知)

??(其他还没来得及探测)

 

网络拓扑如下:


具体地渗透过程就不说了,下面说说此次竞赛大致涉及的技术点吧:

(外层网络的具体环境没有给出,可以通过wireshark抓包进行探测)

 

Target1:windows靶机,上面运行着很多Oracle的相关服务,将msf里的exp都用了一遍也没有打进去,尝试爆破3389或者smb也无果,因此放弃该靶机;

Target2:一台仅对外开放80端口服务的靶机(后来拿到webshell才知道,是因为该机使用ufw做了过滤),上面运行着开源程序ResourceSpacev6.5的版本,我们从该版本的一个SQLi中拿到一枚flag,并提取到管理员hash,因该hash有salt,因此查md5无效,后来自己根据程序加密过程写爆破脚本,通过载入强力字典跑出了管理员账号的密码,并通过上传图片或者资源后可任意改文件格式的漏洞拿到此机的webshell,由于该机有ufw,因此无法reverseshell,11小时的提权尝试依然无果(耗费了大量时间,纠结!还不能上网)。

Target3:开放了22端口,爆破一下午依然无果(hydra,medusa都无法使用,提示protocolerror,还好自己早有写ssh爆破脚本),因此也放弃了.

Target4:开放了22和80,web页面是空白(没有任何提示),拿起目录扫描也没有什么收获,后来使用了老工具Hscan才扫到web根目录下的passwd文件(字典太重要了),里面提供了root的密码,因此成功拿下该机权限并发现该机为一台跳板肌,处在内网。

Target5&6:两台内网靶机,因无法上外网下载工具,因此当时在端口扫描上吃了亏(忘了自己曾经用python写过的端口扫描,杯具~),后台在Target4跳板肌上做了端口转发,发现Target5上运行着的web应用,在默认页面上给出了一定的信息,并提供了3道与CTF相关的题目(1道涉及Pwn&Reverse,1道涉及未知文件分析,1道涉及网络流量分析),Target5上还运行着JackCMS和Wordpress。

因时间原因,没能成功拿下内网靶机,所以这里就不在多叙述了。

下面总结一下此次比赛:第一,此次比赛之前,因不知具体规则所以准备较为不充分,在一些环节上吃了亏;第二,对基本的端口转发不太熟悉,折腾半天才弄出个sshsocks5的转发,因此就有了下面的内容;第三,比赛真的好兴奋(24小时就睡了两!!);第四,发现了自己不少的缺点,由于有些技术点并没有亲自尝试过,当真正遇到时,虽知原理却也很难下手。

纪实就到这里吧,下面就针对linux下的端口转发进行一个总结,也算是好好实际模拟一下了。

 

-Linux下端口转发实现

Linux下的端口转发主要可以利用下面两种方式:

1、iptables(nat,forward,…);

2、ssh通道;

 

下面就针对这两种方式搭建本地测试环境(虚拟机实现):

 

(整个测试环境的基本信息)

主机

网络地址

操作系统

开放服务

VM-1

192.168.0.128/24(eth0)

Kali Linux

-

VM-2

192.168.0.130.24(eth1)

10.10.128.5.16(eth0)

Ubuntu 12.10 32bit

-

VM-3

10.10.128.4/16(eth0)

BackBox Linux

22 ssh

80 apache2

 


VM-1


VM-2


VM-3

 

1、iptables(nat,forward,…)

 

场景1:VM-1处于内网,VM-3处于处于外网,VM-1需要访问VM-3上开放的服务。

解决方案:因为VM-2既连接着内网,又连接着外网,因此通过VM-2进行NAT,即可使得VM-1能够通过VM-2的转发间接访问到VM-3。

 

在这里使用仅需要使用iptables中NAT即可简单实现(其实原理就是内网通过NAT上外网,内网渗透也适用),iptables具体原理和配置方法就不多说了,下面直接通过配置VM-2中的iptables使得内网中的VM-1能访问VM-3上的服务。

因为测试机VM-2使用的ubuntu系统,在ubuntu中虽有iptables模块,但是并不能通过serviceiptables start来启动,在root权限下使用下面这条命令能够开启iptables:

root@VM-2:~# modprobe ip_tables

然后添加向iptables中添加规则:

root@VM-2:~#iptables -t nat -A POSTROUTING -s192.168.0.1/24 -d 10.10.128.1/16 -j SNAT --to-source 10.10.128.5

然后在VM-1中添加默认网关:

root@VM-1:~# route add default gw 192.168.0.130

通过上面这条命令,在VM-2中,源地址为192.168.0.1/24,目标地址为10.10.128.1/16的流量都会通过SNAT方式,将源地址改为本机地址(此处为VM-2的地址10.10.128.2),这样转发出去的流量就会正确的返回到VM-2的外网IP上,然后VM-2通过NAT转换时记录的对应表,将对应流量返回到内网的特定主机上,这样就实现了内网的NAT。

 

场景2:VM-1上有web server服务,VM-2为了隐藏内网ip,将外网访问自己的80端口的流量转发到内网VM-1上。

解决方案:利用iptables中的PREROUTING,将访问VM-2的tcp包的目的地址改为内网VM-1的地址。

 

在VM-2上配置下列规则,可以做到端口映射:

root@VM-2:~# iptables -t nat -A PREROUTING -d10.10.128.130 -p tcp —dport 80 -j DNAT --to-destination192.168.0.128:80

root@VM-2:~# iptables -P FORWARD DROP

root@VM-2:~# iptables -A FORWARD -m state —state ESTABLISHED,RELATED -j ACCEPT

root@VM-2:~# iptables -A FORWARD -d192.168.0.128 -p tcp --dport 80 -j ACCEPT


同时需要在VM-1添加默认网关,不然VM-3来的http请求无法找到路由发送出去:

root@VM-1:~# route add default gw 192.168.0.130

 

下面是该场景的测试结果:

(VM-2上的配置的规则)

在VM-3上访问10.10.128.5的端口,通过端口映射间接访问内网192.168.0.128的webserver

 


总结:其实在端口转发或者映射的实现过程上,iptables算是配置起来比较方便的,因为比较灵活,你可以根据实际情况来设置不同的规则来达到不同的效果,在内网渗透中如果拿到了一台linux跳板机,这是就可以通过配置iptables来为内网渗透建立通信桥梁。

 

2、ssh通道

 

ssh端口转发可以有多种形式,这里就拿本地转发和远程转发做个例子吧。

1、本地转发;

2、远程转发;

 

由于Ubuntu Desktop版本不自带ssh,所以这里就将VM-2的系统更换成UbuntuServer 12.04,下面是本次测试的网络配置信息:

主机

网络地址

操作系统

开放服务

VM-1

192.168.0.128/24(eth0)

Kali Linux

22 ssh

VM-2

192.168.0.130.24(eth1)

10.10.128.5.16(eth0)

Ubuntu 12.10 32bit

22 ssh

3306 mysql

VM-3

10.10.128.4/16(eth0)

BackBox Linux

22 ssh

80 apache2

 

1、本地转发

 

场景:假如VM-2和VM-3是内网靶机,VM-1是攻击机,现在攻击者用于VM-2跳靶机的ssh权限,他需要访问内网中VM-3的ssh(VM-1由于与VM-3处在不同网段,不能直接进行访问)。

解决方案:通过ssh通道,VM-1作为sshClient连接到ssh Server VM-2上(ssh建立后,VM-1会在本地建立一个监听端口),VM-2将sshClient通过ssh过来的流量转发到VM-3的ssh端口上,这样就可以使得VM-1访问VM-3了。

 

VM-1上键入(需要192.168.0.130的ssh权限,也就是VM-2的权限)

root@VM-1:~# ssh -L 4444:10.10.128.4 192.168.0.130

这是会在VM-1上的4444端口进行监听,因在ssh连接时没有提供其他参数,固4444端口默认只能localhost或者127.0.0.1能连接,如果需要将此端口共享给其他与VM-1同网的主机,带上 “-g” 参数即可。

ssh -L <localport>:<remote host>:<remote port> <SSH host>

 

这里只把关键部分给以截图


2、远程转发

 

场景:VM-1无法直连VM-2,但VM-2出口连接是允许的,这时VM-1再想通过VM-2访问VM-3就需要远程端口转发了(特别适用于跳靶机无法正向连接的情况)。

解决方案:VM-2通过ssh反向连接至VM-1(成功后会在VM-1开监听端口,然后VM-1通过访问本地的监听端口,即可间接访问至VM-3)


VM-2上键入

root@VM-2:~# ssh -R 4444:10.10.128.4:22 root@192.168.0.128

VM-2通过VM-1后,VM-1会在4444端口上进行监听,所有通过4444端口的流量都会通过ssh到VM-2上,VM-2再将此转发到VM-3上。

ssh -R<local port>:<remote host>:<remote port> <SSH host>


这里给出关键部分截图



总结:ssh端口转发适用于目标有ssh服务且有其权限的情况,ssh转发可以加密通信,对信息的安全通信也有一定的保障。

0 0
原创粉丝点击