The Great SharePoint Rescue: How We Outsmarted Ransomware with a Clever Script
Security

The Great SharePoint Rescue: How We Outsmarted Ransomware with a Clever Script

15 mei 20245 min leestijdCloud Agent Redactie

Een IT-bedrijf belde ons in paniek. Ransomware had honderden bestanden versleuteld in SharePoint Online. De hackers eisten 50.000 euro. Wij schreven een PowerShell script en stuurden ze met lege handen weg.

Het was een doorsnee donderdagochtend tot de telefoon ging. Een collega IT-bedrijf aan de lijn, hoorbaar in paniek. Hun klant was getroffen door ransomware — de beruchte Faust-variant — en honderden bestanden in SharePoint Online waren versleuteld en naar de prullenbak gestuurd. Op elk bestand stond nu een extensie als .id[XXXXXX].[email@criminelen.com].faust. De hackers eisten €50.000 voor de decryptiesleutel.

Wij dachten: dat gaan we ze niet geven.

De situatie: €50.000 of alles kwijt

De Faust-ransomware is een variant van de Phobos-familie en werkt op een vervelend slimme manier. In plaats van bestanden simpelweg te versleutelen en te laten staan, verplaatst hij de versleutelde versies naar de SharePoint Recycle Bin. De originelen zijn weg. Wat overblijft zijn bestanden met namen als:

Jaarrekening2023.xlsx.id[A1B2C3].[betaal@nu.com].faust

Het bijzondere aan SharePoint Online is dat de Recycle Bin versiebeheer bijhoudt. De originele, niet-versleutelde versie van elk bestand zit nog steeds in de SharePoint-infrastructuur. Je hoeft alleen maar te weten hoe je er bij komt.

Het wapen: een PowerShell script van 73 regels

Said Aazani (dat ben ik) ging aan het werk. Het idee was simpel in theorie, maar vergt precisie in de uitvoering:

  1. Verbinding maken met SharePoint via PnP PowerShell
  2. Alle versleutelde bestanden ophalen uit de Recycle Bin
  3. Per bestand controleren of het origineel al bestaat
  4. Het bestand terugzetten en de ransomware-extensie strippen
  5. De versie resetten naar de staat van voor de aanval
  6. Alles loggen zodat je achteraf precies weet wat er hersteld is

Klinkt logisch. De duivel zat hem in de details — zoals de Start-Sleep -Seconds 5 na elke restore. SharePoint heeft even tijd nodig om een bestand terug te zetten voordat je het kunt hernoemen. Dat soort dingen leer je niet uit documentatie, maar uit een server die je om 23:00 uur in je gezicht gooit.

# Enhanced SharePoint Online File Recovery Script
# Developed by Cloud Agent B.V. - https://cloudagent.nl

if (-not (Get-Module -Name "PnP.PowerShell" -ListAvailable)) {
    Install-Module -Name "PnP.PowerShell" -Scope CurrentUser
}

$SiteURL = "<Your SharePoint Site URL>"
$DocumentLibraryPath = "<Your Document Library Path>"
$FileExtension = "<File Extension>"  # e.g., .faust
$SuffixToRemove = "<Full Suffix to Remove>"  # e.g., .id[XXXXXX].[email].faust
$LogFilePath = "<Path to Log File>"

Connect-PnPOnline -Url $SiteURL -UseWebLogin

$allItems = Get-PnPRecycleBinItem | Where-Object {
    $_.DirName -like "$DocumentLibraryPath/*" -and
    $_.Title -like "*$FileExtension*" -and
    $_.Title -notlike "desktop.ini.id*"
}

$totalItems = $allItems.Count
$currentItem = 0

foreach ($i in $allItems) {
    $currentItem++
    $newFileName = $i.Title -replace [regex]::Escape($SuffixToRemove), ""
    $serverRelativeUrl = "/" + $i.DirName + "/" + $newFileName

    $fileExists = $false
    try {
        $file = Get-PnPFile -Url $serverRelativeUrl -ErrorAction Stop
        $fileExists = $true
    } catch {
        $fileExists = $false
    }

    if (-not $fileExists) {
        try {
            Restore-PnPRecycleBinItem -Identity $i.Id.Guid.ToString() -Force
            Start-Sleep -Seconds 5
            Rename-PnPFile -ServerRelativeUrl ("/" + $i.DirName + "/" + $i.Title) `
                -TargetFileName $newFileName -Force
            Reset-PnPFileVersion -ServerRelativeUrl ("/" + $i.DirName + "/" + $newFileName)
            $logMessage = "Successfully restored: $($i.Title)"
            Add-Content -Path $LogFilePath -Value $logMessage
        } catch {
            $errorMessage = "Error processing $($i.Title): $_"
            Add-Content -Path $LogFilePath -Value $errorMessage
        }
    } else {
        $logMessage = "File already exists, not restored: $serverRelativeUrl"
        Add-Content -Path $LogFilePath -Value $logMessage
    }

    $totalItems--
    Write-Host "Processed item $currentItem. Files left to process: $totalItems"
}

Write-Host "Script execution complete. Check log file: $LogFilePath"

Technische uitleg per onderdeel

1. Module check

PnP.PowerShell is de standaardmodule voor SharePoint-beheer op schaal. Zonder dit kom je nergens. Installatie met -Scope CurrentUser vereist geen lokale admin-rechten.

2. Configuratievariabelen

Alle parameters staan bovenaan als duidelijke variabelen. Vervang de placeholders met jouw specifieke waarden: site URL, library pad, de exacte extensie die de ransomware heeft toegevoegd, en het logbestandpad.

3. Verbinding via PnP Online

Connect-PnPOnline -UseWebLogin opent browserauthenticatie — werkt ook met MFA. Nooit credentials hardcoden in een script. Dat is een cadeautje voor de volgende aanvaller.

4. Recycle Bin filteren

We filteren op drie criteria: het pad matcht de document library, de naam bevat de ransomware-extensie, en systeembestanden als desktop.ini.id* worden uitgesloten.

5. Restore, hernoem, reset

Per bestand: strip de suffix met [regex]::Escape() — belangrijk omdat de suffix punten en brackets bevat die speciale regex-betekenis hebben. Controleer of het origineel al bestaat om overschrijven te voorkomen. Restore vanuit de Recycle Bin, wacht 5 seconden, hernoem, reset de versie.

6. Logging

Elke actie wordt weggeschreven. Geen nice-to-have — bij een hersteloperatie van honderden bestanden moet je kunnen aantonen wat er is hersteld, ook richting toezichthouders of verzekeraars.

Resultaat

Het script draaide succesvol door de volledige document library. Alle honderden versleutelde bestanden werden hersteld, hernoemd en teruggezet. De klant hoefde geen cent losgeld te betalen. De hackers kregen nul euro. Wij kregen een zeer dankbare klant.

Totale schade: de tijd van de hersteloperatie en een flinke adrenalinestoot. Had het €50.000 kunnen zijn? Absoluut. Was het dat? Nee.

Lessen uit deze casus

  • SharePoint Recycle Bin is je vriend — ransomware die bestanden naar de prullenbak verplaatst heeft een zwakke plek ingebouwd: versiebeheer werkt in jouw voordeel
  • PnP PowerShell is onmisbaar voor SharePoint-beheer op schaal — leer het, gebruik het
  • Betaal nooit losgeld — geen garantie op een werkende sleutel en je financiert de volgende aanval
  • Logging is niet optioneel — zonder audittrail weet je niet wat er hersteld is
  • Test je herstelplan voordat je het nodig hebt — dit script werkte omdat we de omgeving kenden

Heeft u te maken met een soortgelijke situatie, of wilt u weten hoe wij uw Microsoft 365-omgeving beschermen tegen ransomware? Neem contact op — wij sturen de hackers ook bij u met lege handen weg.

Meer weten over dit onderwerp?

Onze IT-experts staan klaar om u te helpen. Gratis adviesgesprek — binnen 24 uur reactie.

Neem contact op
CA

Cloud Agent Redactie

Gepubliceerd op 15 mei 2024 · 5 min leestijd