Simple log function

I needed a way to log the console output in PowerShell, which would then allow me to email this (a quick and easy way for me to check that my automated scripts were working correctly).

The following function does just that, sort of.

Instead of capturing everything that is written to the console, text is passed to the Log function which then updates the $Log string before returning the same text to ensure it is written to the console.

Line breaks are automatically added to the string.

The code below shows how to use the Log function.

It’s important to remember that this function will not capture any errors thrown by your script. So, you’ll need to make sure you handle errors correctly.

Finding out-of-date WordPress installations

Several websites, that are hosted on servers I manage, recently fell victim to XML Quadratic Blowup Attacks. They were all running WordPress version 3.9.1 or below.

I first noticed a problem when one of the servers started to run extremely slowly. Every website it hosted was taking an age to respond and frequently timing out. The CPU was maxed out at 100%, mainly from PHP requests.

Further investigation narrowed down the website under attack. Below is a screenshot showing the traffic trend for the month to date of that website.

WordPress DoS Attack
Traffic Trend by Day report for a WordPress website subjected to a DoS attack.

On 15th August page views began to spike, with the most popular requested file being xmlrpc.php.

The temporary fix was to rename the file before installing WordPress 3.9.2, which contains a fix for this exploit.

However, I began to wonder how many other sites, that I was responsible for, could be vulnerable.

So, I decided to write a PowerShell script that scans all websites (on IIS 6 or 7) and checks their current WordPress installation version.

vScanner Console Output
Results are displayed directly in the console and can also be sent to you via email.

Since the WordPress API is used to obtain the current version, you can set this script to run as a task on your server. If an out of date installation of WordPress is detected then you’ll receive an email notification.

Download vScanner v1.0

To turn on email updates, set $SendEmail (line 5) to 1 and be sure to update lines 6 – 11 with your email address and SMTP server details.

msdeploy fails after installing Windows updates

After installing some updates (around 30 in total, between reboots) I noticed that msdeploy was failing to synchronise the IIS Metabase and files from another server.

I’ve ran into this problem before and, if I recall correctly, it also occurred after running Windows Update.

The following error was returned when trying to run msdeploy.

Error: Object of type ‘webServer’ and path ” cannot be created.
Error: Configuration system failed to initialize
Error: Unrecognized configuration section startup. (C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy.exe.config line 2)
Error count: 1.

Also, when trying to load Internet Information Services (IIS) Manager, a warning popped up saying “Configuration system failed to initialize”.

The problem appeared to be with the following files.

  • C:\Windows\System32\inetsrv\config\applicationHost.config
  • C:\Windows\System32\inetsrv\config\administration.config
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\machine.config
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config

The first file had a size of 18KB on the server in question. However, the same file on another server in the cluster had a size of 74KB. The other files were also of different sizes.

In addition to the above, I noticed that the following files from the C:\Windows\System32\inetsrv\config\schema directory were also missing.

  • APE_schema.xml
  • heliconApe_schema.xml
  • NetFx40_IIS_schema_update.xml
  • NetFx45_IIS_schema_update.xml

I don’t know what went wrong, but can only presume (based on past experience and the modified timestamp of the first file) that Windows Update broke this.

The fix was easy – simply restore the files from a backup. You can always copy them from another server in the cluster, which is what I did.