关于代理,可能我了解的就是简单的web代理,再加上渗透时需要用到的内网转发,最后可能就是上次去了解的nginx反向代理,下面问题是微信群里一大佬的面试题,本着学习的态度,还是来好好学习下各方面的代理知识。
整理后的问题如下:
1.Web反向代理
2.正向端口转发,反向端口转发,动态端口转发
3.正向socks/http代理,反向socks/http代理
4.正向vpn,反向bridge vpn
对于上述问题一般是怎样理解的,分别有哪些代表性的工具?
下面来针对上述问题来进行一个探讨!
这应该就是指利用服务器来处理接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
最常见的架构可能就是Nginx反向代理,一方面保护和隐藏真实服务器,另一方面实现负载均衡。
如上图所示,所有流量都必须经过这个反向代理服务器,并且由这个反向代理服务器对内进行交互,对外进行流量的传输和返回。
这个问题其实可以分为两类,正向反向是一类,动态是一类,因此这个问题其实又分为两个具体的问题,正向和反向端口转发有什么不同?什么是动态端口转发?
这是正向反向代理的一个图例,在正向代理中,proxy和client同属一个LAN,对server透明;反向代理中,proxy和server同属一个LAN,对client透明。
实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。在这里这种架构同样适用于端口转发。
正向端口转发的流程:
Lhost-->Proxy-->Rhost
Lhost为了访问到Rhost,向Proxy发送了一个请求并且指定目标是Rhost,然后proxy向 Rhost 转交请求并将获得的内容返回给Lhost,简单来说正向代理就是Proxy代替了我们去访问Rhost。
反向端口转发的流程:
Lhost<--->Proxy<--->Firewall<--->Rhost
Lhost只向Proxy发送普通的请求,具体让他转到哪里,proxy自己判断,然后将返回的数据递交回来,这样的好处就是在某些防火墙只允许Proxy数据进出的时候可以有效的进行穿透。
这里作一个简单区分。正向代理代理的是客户端,反向代理代理的是服务端,这里用于端口转发同样适用!
下面来阐释什么是正向和反向的端口转发:
顾名思义就是把本地主机端口通过待登录主机端口转发到远程主机端口上去。
ssh -L 50000:www.google.com:80 user@host
当成功执行上面的命令之后,访问本地的50000端口,就等同于访问 www.google.com 的 80 端口。但和直接访问有着本质的区别:这次是通过登录主机来安全转发数据的,没有人知道你和远程主机之间传输了何种数据。就算你不能和远程主机建立连接(而登录主机能访问),那就能突破(绕过)防火墙的限制。
这里就是指把登录主机端口通过本地主机端口转发到远程主机上。
举例:ssh -R 0.0.0.0:8080:localhost:80 user@host。
当成功执行上面的命令之后,访问登录主机的 8080 端口就相当于访问远程主机的80端口!
设想这样一种情况:你在本机开发了一个web应用,想拿给别人测试,但现在你却处在内网,外网是无法直接访问内网的主机的,怎么办!?很多人可能会说,找台有公网IP的主机,重新部署一下就行了。这样可行,但太麻烦。然而自从你了解了的反向端口转发功能之后,一切都变得简单了。只需在本地主机上执行一下上面例子的命令即可实现外网访问内网web应用。
这里常见的应用就是ssh的动态绑定。因此动态端口转发也就离不开ssh的一些相关应用,例如翻墙。
如上图所示,我们可以可到ssh连接一共分为4个步骤:
1.首先,墙内的客户机跟墙外的代理服务器,建立好SSH连接,并设定动态绑定。
2.此时墙内客户机上的SSH会监听本地的一个端口7001。
3.客户机上的程序,将对www.youtube.com:80的请求告知7001端口的SSH,SSH将此请求通过SSH加密连接发送到墙外服务器的SSH上。
4.由于建立的动态绑定,服务器会将www.youtube.com:80的请求发送给www.youtube.com上的80端口,并在收到回复后,通过原路返回给客户机的SSH,客户机的SSH返回给应用程序。
在这里SSH客户端已经不仅仅是个客户端了,它同时打开了7001端口侦听本机应用程序的请求,这是SSH跟传统用法最大的区别。而服务端的SSH也不仅仅是处理客户端的请求,而是将请求转发到对应的主机和端口,这里的“动态”二字体现在服务端的SSH的转发目标是不固定的,是根据客户端的请求而定的。
通常我们会将socks代理和http代理合起来说,但是这里先说一下两者之间的区别吧。SOCKS工作在比HTTP代理更低的层次:SOCKS使用握手协议来通知代理软件其客户端试图进行的连接SOCKS,然后尽可能透明地进行操作,而常规代理可能会解释和重写报头(例如,使用另一种底层协议,例如FTP;然而,HTTP代理只是将HTTP请求转发到所需的HTTP服务器)。虽然HTTP代理有不同的使用模式,通过CONNECT方法允许转发TCP连接;然而,SOCKS代理还可以转发UDP流量和反向代理,而HTTP代理不能。
回到主题上,正向socks/http代理应该就是我们最常见的这种浏览器代理,通过代理服务器来进行抓包或者传送流量给对方服务器,常见工具的话就是burp或者fd。
反向代理是先在服务器A(比如攻击机)上运行 SOCKS代理的服务端程序监听指定端口,然后在客户机(比如靶机)上运行客户端程序连接服务器的指定端口。这样就建立了一条从靶机到攻击机的反向SOCKS隧道,攻击机的应用程序(比如wget、nmap、curl等)使用该隧道后,程序的所有流量都会先经过靶机转发出去。
对于反向socks/http代理应该不是很难理解,其实就是在客户机上创建了一个隧道反向连接到我们的服务器,服务器的流量就可以通过从这个隧道出去,实现流量的匿名。常见的工具就是proxychains了吧。
正向vpn应该比较好理解,就是一般常见的vpn架构,我们客户机连接到墙外的服务器,然后通过这个创建的隧道进行流量的传输。
反向桥接vpn这里举一个例子开头,在参加ctf线下赛时,我们时常需要下载官方提供的vpn软件,然后通过注册的账号密码来登录这个vpn,登录成功后会显示我们本机被分配的一个内网ip,最后通过vpn客户端我们才能访问比赛题目。
这里用到两种技术,一种是反向vpn,一种是桥接模式。对于桥接模式应该比较好理解,就是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机。借助这种架构方式,我们可以通过互联网将客户端和服务端联系起来,使得用户可以在任意联网的机器上,接入运行服务端机器所在的局域网网络,服务器端无需外网IP及防火墙特殊设置即可实现远程接入。
那么反向vpn最常见的应用可能就是vpn pivoting。下面来简单的介绍一下vpn pivoting。
这是vpn pivoting的一个工作架构。攻击机会虚拟出一个网络接口与目标机进行对接,任何应用如果想要访问目标机里的网络,那么就会通过这个虚拟的网络接口进行流量的传输,通过vpn隧道到达目标机的网络,这时候目标机的vpn软件会监听这个隧道的流量,然后通过TUN/TAP驱动将流量传输到网络接口,从而让攻击机能够访问到目标机的网络。
这里vpn pivoting的一个强大之处就是攻击机的任何应用都可以通过这个隧道访问目标机的网络,如nmap、metasploit等等。
上述如有不当之处,敬请指出~