烂土豆分析

  • A+
所属分类:安全文章

土豆提权需要的权限及函数原型

SeImpersonatePrivilege

BOOL CreateProcessWithTokenW(
HANDLE hToken,
DWORD dwLogonFlags,
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

SeAssignPrimaryTokenPrivilege

BOOL CreateProcessAsUserW(
HANDLE hToken,
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

DCOM

                        Ole32.CreateILockBytesOnHGlobal(IntPtr.Zero, true, out ILockBytes lockBytes);
Ole32.StgCreateDocfileOnILockBytes(lockBytes, Ole32.STGM.CREATE | Ole32.STGM.READWRITE | Ole32.STGM.SHARE_EXCLUSIVE, 0, out IStorage storage);
StorageTrigger storageTrigger = new StorageTrigger(storage, string.Format("127.0.0.1[{0}]", 6666), TowerProtocol.EPM_PROTOCOL_TCP);

Ole32.MULTI_QI[] qis = new Ole32.MULTI_QI[1];
qis[0].pIID = Ole32.IID_IUnknownPtr;

Ole32.CoGetInstanceFromIStorage(null, ref clsId, null, Ole32.CLSCTX.CLSCTX_LOCAL_SERVER, storageTrigger, 1, qis);

这段代码是我告诉COM我要在ip为127.0.0.1 port为6666的RPC服务器加载BITS对象(4991d34b-80a1-4291-83b6-3328366b9097)


当创建对象时 COM客户端会以SYSTEAM向我们上面自定义的RPC服务器进行请求


下面的图是调用流程


烂土豆分析


在协商之前我们需要调用AcquireCredentialsHandle函数来获取我们需要的CredHandle结构


接下来调用创建远程COM对象 COM客户端回向我们发起第一次请求 也就是Negotiate协商(ntlm 阶段1) 然后我们调用AcceptSecurityContext函数获取质询消息(ntlm 阶段2)


烂土豆分析


然后我们连接RPC 将客户端的Negotiate协商(ntlm 阶段1)中继到RPC


要成功让客户端认证我们还需要替换把rpc的质询消息(阶段2)的NTLM Secure Service Provider 替换成我们调用AcceptSecurityContext返回的质询消息(阶段2) (这里其实不用中继到rpc 可以自行实现rpc协议不过那样就有点太麻烦了)


烂土豆分析


当客户端进行身份认证(ntlm 阶段3) 消息响应时 我们将阶段3的请求再次使用AcceptSecurityContext函数完成最终认证 并调用QuerySecurityContextToken函数获取Token 完成提权获取token流程


WimRM

在使用Activator创建Com对象(BITS)的时候 Winrm客户端回向本机的5985端口发起http Negotiate协商认证


烂土豆分析


使用DCOM内的技术可进行权限提升(无需像DCOM那样 替换NTLM Secure Service Provider 因为认证协议就是NTLM Secure Service Provider)

winrm windows用户端是默认不开启的 windows server在2012及以上默认开启了winrm 导致无法利用漏洞

pipepotato

在调用打印机服务的时候 地址可控(RpcRemoteFindFirstPrinterChangeNotificationEx) 我们可以填入我们的UNC地址(pipe管道) 当打印机连接我们的客户端时 可以通过ImpersonateNamedPipeClient函数模拟客户端 然后CreateProcessAsUserW/CreateProcessWithTokenW函数进行提权

windows 九大权限利用

  1. SeImpersonatePrivilege

    需要高权限token和特权
    CreateProcessWithTokenW
  2. SeAssignPrimaryPrivilege

    需要高权限token和特权
    CreateProcessAsUser
  3. SeTcbPrivilege

    系统最高权限
    利用:
    创建高权限Token
  4. SeBackupPrivilege

    具有任意文件读权限
    利用:
    读取注册表HKEY_LOCAL_MACHINESAM、HKEY_LOCAL_MACHINESECURITY和HKEY_LOCAL_MACHINESYSTEM
    读文件 C:/Windows/System32/config/sam
  5. SeRestorePrivilege

    具有任意文件写权限
    利用:
    劫持dll
    放大镜后门
  6. SeCreateTokenPrivilege

    SeCreateTokenPrivilege
    利用:
    通过WinAPI ZwCreateToken创建Primary Token
    将Token添加至local administrator组
    该Token具有System权限
  7. SeLoadDriverPrivilege

    加载驱动文件
    利用:
    reg add hkcuSystemCurrentControlSetCAPCOM /v ImagePath /t REG_SZ /d "??C:testCapcom.sys"
    reg add hkcuSystemCurrentControlSetCAPCOM /v Type /t REG_DWORD /d 1
  8. SeTakeOwnershipPrivilege

    同SeRestorePrivilege类似,对当前系统任意文件具有写权限
  9. SeDebugPrivilege

    用来调试指定进程
    利用:
    注入shellcode到高权限进程

以上利用脚本的代码 https://github.com/3gstudent/Homework-of-C-Language


本文始发于微信公众号(米斯特安全团队):烂土豆分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: