Skip to main content

Build a Vulnerable IIS SharePoint Lab with Fluent Bit: Complete Deployment Guide

Cover image

Article Metadata

Ecosystem Fit

This page mirrors the original Medium article into the 1200km.com Docusaurus ecosystem. The original article flow, images, screenshots, infographics, and technical blocks are preserved from the export.

A full step-by-step guide with all scripts to deploy a vulnerable SharePoint-style site on Windows IIS and ship its logs with Fluent Bit — from scratch.

Article image

Introduction

Most people learn IIS and “SharePoint” pentesting the hard way: in production, under pressure, with incomplete logs, and with zero room to break things. That’s backwards.

If you want to become effective at web pentesting (or detection engineering) you need arepeatable labthat you can reset, attack, and observe — over and over — until patterns become instinct. Not “a random vulnerable VM,” but a realistic stack that mirrors what you’ll actually meet in enterprise environments:

  • Windows Server + IIS(classic target surface)

  • SharePoint-style app patterns(auth-less pages, legacy ASP.NET, messy inputs)

  • Attack scenarios that generate teachable telemetry(XSS, traversal, SQLi-like payloads)

  • Proper logging coverageso every request leaves evidence: access logs, kernel-level rejects, deep diagnostics, and Windows events

  • Centralized shippingso you train thereal workflow: attack → logs → search/hunt → detection rules

That’s exactly what this guide gives you.

You’ll build afully automated vulnerable IIS lab(Windows Server 2012 R2 in Vagrant) with a purposely insecure “SharePoint-style” ASP.NET site, and you’ll instrument it withFluent Bit as a Windows serviceto forwardIIS W3C,HTTPERR,Failed Request Tracing,ULS-style app logs, andWindows Event Logsto an HTTP backend (like XPLG or any listener).

Why this matters for pentest training:

  • You don’t just “get a payload to work”— you learn what success and failurelook like in logs.

  • You can practicereal reporting: reproduce, capture evidence, explain impact, map telemetry.

  • Blue team? Same lab becomes your detection range: write queries, build alerts, validate them against known traffic.

  • You can reset fast and iterate:infrastructure-as-labbeats “pet VMs” every time.

The goal is simple:turn pentesting practice into an engineering loop— controlled exploits, consistent telemetry, and repeatable experiments — so you build skill that transfers directly to real environments.

What You’ll Build

  • Windows Server 2012 R2 VM(Vagrant + libvirt/VirtualBox)

  • IISwith W3C logging, Failed Request Tracing

  • Vulnerable SharePoint app— XSS, path traversal, SQLi simulation (all requests logged)

  • Fluent Bit— Windows service collecting IIS + Windows Event logs, shipping to HTTP backend

Table of Contents

  • Introduction

  • Prerequisites

  • Project Structure

  • 1. Vagrantfile

  • 2. Provisioning Script: enable-rdp.ps1

  • 3. Provisioning Script: install-iis.ps1

  • 4. Provisioning Script: install-sharepoint.ps1

  • 5. Provisioning Script: install-fluent-bit.ps1

  • 6. Vulnerable SharePoint App

  • 7. IIS Log Types: Access vs Error

  • 8. Fluent Bit Config: fluent-bit.conf

  • 9. Fluent Bit Parsers: parsers.conf

  • Deployment Steps

Prerequisites

  • Vagrant2.2+

  • libvirt+vagrant-libvirt(or VirtualBox)

  • FreeRDP(freerdp2-x11)

sudo apt install vagrant libvirt-daemon-
system
libvirt-clients qemu-kvm vagrant-libvirt freerdp2-x11
sudo usermod -aG libvirt $USER
# Log out and back in

Project Structure

Create the following layout:

Windows_IIS/
├── Vagrantfile
├── fluent-bit/
│ ├── fluent-bit.conf
│ └── parsers.conf
├── vulnerable-sharepoint/
│ ├──
default
.aspx
│ ├── search.aspx
│ ├── documents.aspx
│ ├── api.aspx
│ └── Web.config
└── provisioning/
├── enable-rdp.ps1
├── install-iis.ps1
├── install-sharepoint.ps1
└── install-fluent-bit.ps1

1. Vagrantfile

# Windows IIS + SharePoint Foundation VM (vulnerable, for logging training)
# Uses pre-built Windows Server 2012 R2 box. For custom build from ISO, see docs/PACKER_FROM_ISO.md
# ISO reference: /home/andrey/DC_simulator/iso/Windows_Server_2012_R2_Evaluation.iso
Vagrant.configure(
"2"
)
do
|config|
config.vm.box =
"jborean93/WindowsServer2012R2"
config.vm.box_version =
"1.1.0"
config.vm.guest = :windows
config.vm.communicator =
"winrm"
config.winrm.username =
"vagrant"
config.winrm.password =
"vagrant"
config.vm.provider
"virtualbox"

do
|vb|
vb.name =
"windows-iis-sharepoint"
vb.memory = 4096
vb.cpus = 2
vb.customize [
"modifyvm"
, :
id
,
"--vram"
,
"64"
]
end
config.vm.provider
"libvirt"

do
|lv|
lv.memory = 4096
lv.cpus = 2
lv.management_network_name =
"default"
end

# Private network: VM gets 192.168.56.10, host is 192.168.56.1 (VirtualBox) or virbr0 (libvirt)

# Fluent Bit will send to host (log-listener, XPLG) at this IP
config.vm.network
"private_network"
, ip:
"192.168.56.10"

# Upload fluent-bit config (avoids synced folder issues)
config.vm.provision
"file"
,
source
:
"fluent-bit/fluent-bit.conf"
, destination:
"C:/tmp/fluent-bit.conf"
config.vm.provision
"file"
,
source
:
"fluent-bit/parsers.conf"
, destination:
"C:/tmp/parsers.conf"

# Upload vulnerable SharePoint app
config.vm.provision
"file"
,
source
:
"vulnerable-sharepoint/default.aspx"
, destination:
"C:/tmp/vulnerable-sharepoint/default.aspx"
config.vm.provision
"file"
,
source
:
"vulnerable-sharepoint/search.aspx"
, destination:
"C:/tmp/vulnerable-sharepoint/search.aspx"
config.vm.provision
"file"
,
source
:
"vulnerable-sharepoint/documents.aspx"
, destination:
"C:/tmp/vulnerable-sharepoint/documents.aspx"
config.vm.provision
"file"
,
source
:
"vulnerable-sharepoint/api.aspx"
, destination:
"C:/tmp/vulnerable-sharepoint/api.aspx"
config.vm.provision
"file"
,
source
:
"vulnerable-sharepoint/Web.config"
, destination:
"C:/tmp/vulnerable-sharepoint/Web.config"

# Provision: enable RDP first, then IIS, SharePoint (with vulnerable app), Fluent Bit
config.vm.provision
"shell"
, path:
"provisioning/enable-rdp.ps1"
, privileged:
false
config.vm.provision
"shell"
, path:
"provisioning/install-iis.ps1"
, privileged:
false
config.vm.provision
"shell"
, path:
"provisioning/install-sharepoint.ps1"
, privileged:
true
config.vm.provision
"shell"
, path:
"provisioning/install-fluent-bit.ps1"
, privileged:
false
, args: [
"C:/tmp"
]
end

2. Provisioning Script: enable-rdp.ps1

enable-rdp.
ps1
# Enable RDP and open firewall for Remote Desktop
$ErrorActionPreference =
"Stop"
Write-Host
"Enabling Remote Desktop..."
Set
-ItemProperty -Path
"HKLM:\System\CurrentControlSet\Control\Terminal Server"
-Name
"fDenyTSConnections"
-Value
0
-Force
Set
-ItemProperty -Path
"HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
-Name
"UserAuthentication"
-Value
0
-Force
Write-Host
"Opening firewall for RDP..."
Enable-NetFirewallRule -DisplayGroup
"Remote Desktop"
New-NetFirewallRule -DisplayName
"RDP"
-Direction Inbound -Protocol TCP -LocalPort
3389
-Action Allow -ErrorAction SilentlyContinue
Write-Host
"RDP enabled. Restart required for some settings - or connect now."
Restart-Service TermService -Force -ErrorAction SilentlyContinue

3. Provisioning Script: install-iis.ps1

install-iis.
ps1
# Install IIS with common features (vulnerable config for training)
$ErrorActionPreference = "Stop"
Write-Host "Installing IIS and Web features..."
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Install-WindowsFeature -Name Web-ASP-Net45
Install-WindowsFeature -Name Web-Net-Ext45
Install-WindowsFeature -Name Web-ISAPI-Ext
Install-WindowsFeature -Name Web-ISAPI-Filter
Install-WindowsFeature -Name Web-Log-Libraries
Install-WindowsFeature -Name Web-Request-Monitor
Install-WindowsFeature -Name Web-Http-Tracing
Install-WindowsFeature -Name Web-Stat-Compression
Install-WindowsFeature -Name Web-Dyn-Compression
Import-Module WebAdministration
Set-ItemProperty "IIS:\Sites\Default Web Site" -Name logFile.logFormat -Value "W3C"
Set-ItemProperty "IIS:\Sites\Default Web Site" -Name logFile.logExtFileFlags -Value "Date,Time,ClientIP,UserName,ServerIP,Method,UriStem,UriQuery,HttpStatus,Win32Status,TimeTaken,ServerPort,UserAgent,Referer"
Set-ItemProperty "IIS:\Sites\Default Web Site" -Name logFile.directory -Value "C:\inetpub\logs\LogFiles"
$content = @"
<!DOCTYPE
html
>
<
html
>
<
head
>
<
title
>
SharePoint-style Site
</
title
>
</
head
>
<
body
>
<
h1
>
Simple SharePoint-style Landing
</
h1
>
<
p
>
This is a minimal IIS site for logging training. Vulnerable configuration.
</
p
>
<
p
>
Time: $(Get-Date)
</
p
>
</
body
>
</
html
>
"@
$content | Out-File -FilePath "C:\inetpub\wwwroot\default.aspx" -Encoding UTF8
New-Item -ItemType Directory -Force -Path "C:\inetpub\logs\LogFiles" | Out-Null
New-Item -ItemType Directory -Force -Path "C:\inetpub\logs\FailedReqLogFiles" | Out-Null
Write-Host "IIS installation complete."

4. Provisioning Script: install-sharepoint.ps1

install-sharepoint.
ps1
# Vulnerable SharePoint-style setup - precompiles to avoid ASP.NET temp folder permission issues
$ErrorActionPreference
=
"Stop"
Import-Module WebAdministration
if
(-
not
(Test-Path
"IIS:\AppPools\SharePointAppPool"
)) {
New-WebAppPool -Name
"SharePointAppPool"
Set-ItemProperty
"IIS:\AppPools\SharePointAppPool"
-Name
"managedRuntimeVersion"
-Value
"v4.0"
}
$sitePath
=
"C:\inetpub\wwwroot\SharePointSite"
$stagingPath
=
"C:\inetpub\wwwroot\SharePointStaging"
$vulnSource
=
$null
if
(Test-Path
"C:\vagrant\vulnerable-sharepoint\default.aspx"
) {
$vulnSource
=
"C:\vagrant\vulnerable-sharepoint"
}
elseif
(Test-Path
"C:\tmp\vulnerable-sharepoint\default.aspx"
) {
$vulnSource
=
"C:\tmp\vulnerable-sharepoint"
}
if
(
$vulnSource
) {
Write-Host
"Deploying and precompiling vulnerable SharePoint app..."

if
(Test-Path
$stagingPath
) { Remove-Item -Path
$stagingPath
-Recurse -Force }
New-Item -ItemType
Directory
-Force -Path
$stagingPath
| Out-Null
Copy-Item -Path
"
$vulnSource
\*"
-Destination
$stagingPath
-Recurse -Force

if
(Test-Path
$sitePath
) { Remove-Item -Path
"
$sitePath
\*"
-Recurse -Force }
New-Item -ItemType
Directory
-Force -Path
$sitePath
| Out-Null
&
"
$env
:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe"
-p
$stagingPath
-v / -fixednames
$sitePath
Remove-Item -Path
$stagingPath
-Recurse -Force -ErrorAction SilentlyContinue
Write-Host
"Vulnerable app precompiled and deployed."
}
else
{
Write-Host
"Vulnerable app not found, creating placeholder..."

$pageContent
= @
"
<!DOCTYPE html>
<html><head><title>SharePoint</title></head>
<body><h1>SharePoint-style Site</h1><p>Placeholder.</p></body>
</html>
"
@

$pageContent
| Out-File -FilePath
"
$sitePath
\default.aspx"
-Encoding UTF8
}
$acl
= Get-Acl
$sitePath
$rule
= New-Object System.Security.AccessControl.
FileSystemAccessRule
(
"IIS AppPool\SharePointAppPool"
,
"Read"
,
"ContainerInherit,ObjectInherit"
,
"None"
,
"Allow"
)
$acl
.
SetAccessRule
(
$rule
)
Set-Acl
$sitePath

$acl
$siteName
=
"SharePointSite"
if
(-
not
(Test-Path
"IIS:\Sites\$siteName"
)) {
New-Website -Name
$siteName
-PhysicalPath
$sitePath
-ApplicationPool
"SharePointAppPool"
-Port
8080
Write-Host
"SharePoint site created on port 8080."
}
else
{
Set-ItemProperty
"IIS:\Sites\$siteName"
-Name physicalPath -Value
$sitePath
}
$ulsPath
=
"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS"
New-Item -ItemType
Directory
-Force -Path
$ulsPath
| Out-Null
"# SharePoint ULS-style log - $(Get-Date)"
| Out-File
"
$ulsPath
\uls.log"
-Encoding UTF8
Write-Host
"SharePoint-style setup complete."

5. Provisioning Script: install-fluent-bit.ps1

# Install Fluent Bit on Windows - downloads from packages.fluentbit.io, installs as service
$ErrorActionPreference
=
"Stop"
[Net.ServicePointManager]::
SecurityProtocol
= [Net.SecurityProtocolType]::
Tls12
$fluentBitVersion
=
"4.2.2"
$fluentBitUrl
=
"https://packages.fluentbit.io/windows/fluent-bit-
$fluentBitVersion
-win64.zip"
$installDir
=
"C:\fluent-bit"
$configDir
=
"
$installDir
\conf"
Write-Host
"Installing Fluent Bit
$fluentBitVersion
..."
New-Item -ItemType
Directory
-Force -Path
$installDir
| Out-Null
New-Item -ItemType
Directory
-Force -Path
"
$installDir
\data"
| Out-Null
New-Item -ItemType
Directory
-Force -Path
"
$installDir
\data\chunks"
| Out-Null
New-Item -ItemType
Directory
-Force -Path
$configDir
| Out-Null
$zipPath
=
"
$env
:TEMP\fluent-bit-
$fluentBitVersion
-win64.zip"
if
(-
not
(Test-Path
$zipPath
)) {
Write-Host
"Downloading Fluent Bit..."
Invoke-WebRequest -Uri
$fluentBitUrl
-OutFile
$zipPath
-UseBasicParsing
}
$svc
= Get-Service -Name
"fluent-bit"
-ErrorAction SilentlyContinue
if
(
$svc
-
and

$svc
.Status -eq
"Running"
) {
Stop-Service fluent-bit -Force
Start-Sleep -Seconds
2
}
Write-Host
"Extracting Fluent Bit..."
$extractDir
=
"
$env
:TEMP\fluent-bit-extract"
if
(Test-Path
$extractDir
) { Remove-Item -Path
$extractDir
-Recurse -Force }
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::
ExtractToDirectory
(
$zipPath
,
$extractDir
)
$extractedDir
= Get-ChildItem -Path
$extractDir
-
Directory
| Where-Object {
$_
.Name -like
"fluent-bit*"
} | Select-Object -First
1
if
(
$extractedDir
) {
Get-ChildItem -Path
$extractedDir
.FullName | ForEach-Object {

$dest
= Join-Path
$installDir

$_
.Name

if
(Test-Path
$dest
) { Remove-Item -Path
$dest
-Recurse -Force }
Move-Item -Path
$_
.FullName -Destination
$installDir
-Force
}
Remove-Item -Path
$extractDir
-Recurse -Force -ErrorAction SilentlyContinue
}
$configSource
=
$args
[
0
]
if
(-not
$configSource
) {
$configSource
=
"C:\tmp"
}
if
(Test-
Path
(Join-Path
$configSource

"fluent-bit.conf"
)) {
Copy-
Item
(Join-Path
$configSource

"fluent-bit.conf"
) -Destination
$configDir
-Force
Copy-
Item
(Join-Path
$configSource

"parsers.conf"
) -Destination
$configDir
-Force
Write-Host
"Config copied from
$configSource
"
}
else
{
Write-Host
"ERROR: fluent-bit config not found"

exit

1
}
$fluentBitExe
= Join-Path
$installDir

"bin\fluent-bit.exe"
$configPath
= Join-Path
$configDir

"fluent-bit.conf"
if
(Test-Path
$fluentBitExe
) {

$binPath
=
"
$fluentBitExe
-c
$configPath
"

$existing
= Get-Service -Name
"fluent-bit"
-ErrorAction SilentlyContinue

if
(
$existing
) {
sc.exe delete fluent-bit
Start-Sleep -Seconds
2
}
sc.exe create fluent-bit binpath=
$binPath
start= auto
Write-Host
"Fluent Bit installed as Windows service."
Start-Service fluent-bit -ErrorAction SilentlyContinue
}
else
{
Write-Host
"WARNING: fluent-bit.exe not found."
}
Write-Host
"Fluent Bit installation complete."

6. Vulnerable SharePoint App

default.aspx

default
.aspx
<%@ Page Language="C#" %>
<!DOCTYPE
html
>
<
html
>
<
head
>
<
title
>
Vulnerable SharePoint - Logging Training
</
title
>
</
head
>
<
body
>
<
h1
>
Vulnerable SharePoint Site
</
h1
>
<
p
>
Intentionally vulnerable for security and logging training. All activity is logged.
</
p
>
<
ul
>
<
li
>
<
a

href
=
"default.aspx"
>
Home
</
a
>
</
li
>
<
li
>
<
a

href
=
"search.aspx"
>
Search (XSS)
</
a
>
</
li
>
<
li
>
<
a

href
=
"documents.aspx"
>
Documents (Path Traversal)
</
a
>
</
li
>
<
li
>
<
a

href
=
"api.aspx"
>
API (SQLi simulation)
</
a
>
</
li
>
</
ul
>
<
p
>
Request at: <%= DateTime.Now %>
</
p
>
</
body
>
</
html
>

search.aspx (Reflected XSS)

search.
aspx
<%@ Page Language="C#" %>
<!DOCTYPE
html
>
<
html
>
<
head
>
<
title
>
Search - Vulnerable SharePoint
</
title
>
</
head
>
<
body
>
<
h1
>
Document Search
</
h1
>
<
form

method
=
"GET"

action
=
"search.aspx"
>

<
input

type
=
"text"

name
=
"q"

value
=
"<%= Request.QueryString["
q
"] ?? "" %>
" />

<
input

type
=
"submit"

value
=
"Search"
/>
</
form
>
<% if (!string.IsNullOrEmpty(Request.QueryString["q"])) { %>

<
p
>
Results for: <%= Request.QueryString["q"] %>
</
p
>

<
p
>
<
em
>
Vulnerable: reflected XSS in search - payload appears in response
</
em
>
</
p
>
<% } %>
<
p
>
<
a

href
=
"default.aspx"
>
Back
</
a
>
</
p
>
</
body
>
</
html
>

documents.aspx (Path Traversal)

documents.
aspx
<%@ Page Language="C#" %>
<!DOCTYPE
html
>
<
html
>
<
head
>
<
title
>
Documents - Vulnerable SharePoint
</
title
>
</
head
>
<
body
>
<
h1
>
Document Library
</
h1
>
<
form

method
=
"GET"

action
=
"documents.aspx"
>

<
label
>
File:
<
input

type
=
"text"

name
=
"file"

value
=
"<%= Request.QueryString["
file
"] ?? "
report.pdf
" %>
" />
</
label
>

<
input

type
=
"submit"

value
=
"Open"
/>
</
form
>
<%
string file = Request.QueryString["file"];
if (!string.IsNullOrEmpty(file)) {
bool looksSuspicious = file.Contains("..") || file.Contains(":");
Response.Write("
<
p
>
Requested file: " + Server.HtmlEncode(file) + "
</
p
>
");
if (looksSuspicious) {
Response.Write("
<
p
>
<
strong
>
Path traversal attempt detected - logged!
</
strong
>
</
p
>
");
}
Response.Write("
<
p
>
<
em
>
Vulnerable: path traversal attempts are logged for analysis
</
em
>
</
p
>
");
}
%>
<
p
>
<
a

href
=
"default.aspx"
>
Back
</
a
>
</
p
>
</
body
>
</
html
>

api.aspx (SQLi Simulation)

api.
aspx
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE
html
>
<
html
>
<
head
>
<
title
>
API - Vulnerable SharePoint
</
title
>
</
head
>
<
body
>
<
h1
>
REST API (SQLi simulation)
</
h1
>
<
form

method
=
"GET"

action
=
"api.aspx"
>

<
label
>
User ID:
<
input

type
=
"text"

name
=
"id"

value
=
"<%= Request.QueryString["
id
"] ?? "
1
" %>
" />
</
label
>

<
input

type
=
"submit"

value
=
"Query"
/>
</
form
>
<%
string id = Request.QueryString["id"];
if (!string.IsNullOrEmpty(id)) {
string fakeQuery = "SELECT * FROM users WHERE id='" + id + "'";
Response.Write("
<
p
>
Simulated query (logged): " + Server.HtmlEncode(fakeQuery) + "
</
p
>
");
Response.Write("
<
p
>
<
em
>
Vulnerable: SQL injection - try id=1' OR '1'='1
</
em
>
</
p
>
");
}
%>
<
p
>
<
a

href
=
"default.aspx"
>
Back
</
a
>
</
p
>
</
body
>
</
html
>

Web.config

Web.
config
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<
configuration
>

<
system.web
>

<
compilation

debug
=
"true"

targetFramework
=
"4.5"

tempDirectory
=
"C:\inetpub\temp\ASP.NET"
/>

<
httpRuntime

targetFramework
=
"4.5"
/>

</
system.web
>
</
configuration
>

7. IIS Log Types: Access vs Error

This topic explains each log type collected by Fluent Bit and whether it is anaccess log(successful requests) or anerror log(failures, rejections, diagnostics).

Access Logs

IIS W3C Extended Log (iis.w3c)

**Type:**Access log Path:C:\inetpub\logs\LogFiles\W3SVC*/*.log **Format:**W3C Extended Log Format (space-separated)

Recordsevery HTTP requestthat reaches IIS, whether it succeeds or fails from the application’s perspective. Each line typically includes:

**Use case:**Traffic analysis, security auditing, performance, debugging. You see all requests, including 4xx/5xx responses.

**Note:**W3C logs include both successful (2xx) and failed (4xx, 5xx) requests. “Access” here means “request log,” not “success-only.”

Error Logs

HTTPERR (iis.httperr)

**Type:**Error log Path:C:\Windows\System32\LogFiles\HTTPERR\*.log **Format:**Space-separated

Records events whereHTTP.sys(kernel-mode HTTP driver) rejects or fails requestsbeforethey reach IIS. Typical cases:

  • Connection timeouts

  • Rejected connections (e.g. too many)

  • Invalid requests

  • SSL/TLS handshake failures

  • Request header/body issues

Example events:

  • Timer_ConnectionIdle— client idle timeout

  • Timer_MinBytesPerSecond— slow client

  • Rejected— connection rejected

  • SSL handshake— TLS errors

**Use case:**Diagnosing connection and low-level HTTP issues that never reach the application.

Failed Request Tracing (iis.freb)

**Type:**Error / diagnostic log Path:C:\inetpub\logs\FailedReqLogFiles\*\*.xml **Format:**XML

Generated whenFailed Request Tracingis enabled for a site. Contains detailed diagnostics for requests that meet failure rules (e.g. status 500, slow requests).

Contents:

  • Request details

  • Module trace (which module failed)

  • Stack traces

  • Timing

**Use case:**Deep troubleshooting of specific failing requests. Must be enabled per-site in IIS.

Application Logs

SharePoint ULS (sharepoint.uls)

**Type:**Application log Path:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\*.log **Format:**Tab-separated

SharePoint Unified Logging Service logs. Contains application-level events, errors, and traces from SharePoint.

**Use case:**SharePoint-specific debugging and monitoring. Only present if SharePoint (or a similar structure) is installed.

Windows Event Log — Application (windows.application)

**Type:**System / application log **Source:**Windows Event Log API **Channel:**Application

System and application events from the Application channel, including IIS and ASP.NET.

**Use case:**Service starts/stops, application crashes, and other system-level events.

Summary: Access vs Error

Access logs= what was requested (W3C). Error logs= what failed and why (HTTPERR, FREB, ULS, Event Log).

8. Fluent Bit Config: fluent-bit.conf

fluent-bit.
conf
# Fluent Bit for Windows IIS - raw collection, NO log modifications
# Outputs logs as-is from each source. Adjust Host/Port in [OUTPUT] for your backend.
[
SERVICE
]

Flush

2

Grace

30

Log_Level

info

Parsers_File

parsers.conf

storage.path

C:/fluent-bit/data/chunks

storage.sync

normal
# --- ACCESS LOGS ---
# IIS W3C Extended Log (access log)
# Path: C:\inetpub\logs\LogFiles\W3SVC*/*.log
# Tag: iis.w3c
[
INPUT
]

Name

tail

Tag

iis.w3c

Path

C:/inetpub/logs/LogFiles/W3SVC*/*.log

Parser

iis_w3c

Path_Key

source_path

DB

C:/fluent-bit/data/flb_iis.db

Mem_Buf_Limit

5MB

Refresh_Interval

10

Ignore_Older

1h

Read_from_Head

On
# --- ERROR LOGS ---
# HTTPERR (HTTP.sys error log)
# Path: C:\Windows\System32\LogFiles\HTTPERR\*.log
# Tag: iis.httperr
[
INPUT
]

Name

tail

Tag

iis.httperr

Path

C:/Windows/System32/LogFiles/HTTPERR/*.log

Parser

iis_httperr

DB

C:/fluent-bit/data/flb_httperr.db

Mem_Buf_Limit

2MB

Refresh_Interval

10

Ignore_Older

1h

Read_from_Head

On
# Failed Request Tracing (diagnostic XML)
# Path: C:\inetpub\logs\FailedReqLogFiles\*\*.xml
# Tag: iis.freb
[
INPUT
]

Name

tail

Tag

iis.freb

Path

C:/inetpub/logs/FailedReqLogFiles/*/*.xml

Parser

iis_freb

DB

C:/fluent-bit/data/flb_freb.db

Mem_Buf_Limit

2MB

Refresh_Interval

10

Ignore_Older

1h

Read_from_Head

On
# --- SHAREPOINT / APPLICATION ---
# SharePoint ULS (Unified Logging Service)
# Path: ...\Web Server Extensions\15\LOGS\*.log
# Tag: sharepoint.uls
[
INPUT
]

Name

tail

Tag

sharepoint.uls

Path

C:/Program

Files/Common

Files/Microsoft

Shared/Web

Server

Extensions/15/LOGS/*.log

Parser

sharepoint_uls

DB

C:/fluent-bit/data/flb_uls.db

Mem_Buf_Limit

5MB

Refresh_Interval

10

Ignore_Older

1h

Read_from_Head

On

Path_Key

source_path
# Windows Event Log - Application channel
# Tag: windows.application
[
INPUT
]

Name

winlog

Tag

windows.application

Channels

Application

Interval_Sec

5
# --- FILTERS: separate logs by type for XPLG (cluster_name->source->host) ---
[
FILTER
]

Name

modify

Match

iis.w3c

Add

cluster_name

windows-iis-vm

Add

source

iis_w3c

Add

log_type

access
[
FILTER
]

Name

modify

Match

iis.httperr

Add

cluster_name

windows-iis-vm

Add

source

iis_httperr

Add

log_type

error
[
FILTER
]

Name

modify

Match

iis.freb

Add

cluster_name

windows-iis-vm

Add

source

iis_freb

Add

log_type

error
[
FILTER
]

Name

modify

Match

sharepoint.uls

Add

cluster_name

windows-iis-vm

Add

source

sharepoint_uls

Add

log_type

application
[
FILTER
]

Name

modify

Match

windows.application

Add

cluster_name

windows-iis-vm

Add

source

windows_event

Add

log_type

system
# Normalize message field (XPLG expects message for display)
[
FILTER
]

Name

modify

Match

iis.*

Rename

log

message
[
FILTER
]

Name

modify

Match

sharepoint.*

Rename

log

message
[
FILTER
]

Name

modify

Match

windows.*

Rename

Message

message
# Ensure "log" field for XPLG (many collectors use "log" as primary display)
[
FILTER
]

Name

modify

Match

*

Copy

message

log
# --- OUTPUT ---
[
OUTPUT
]

Name

http

Match

*

Host

192.168
.56
.1

Port

8081

URI

/ingest

Format

json_stream

Json_date_key

timestamp

Json_date_format

iso8601
[
OUTPUT
]

Name

http

Match

*

Host

192.168
.56
.1

Port

30303

URI

/logeye/api/logger.jsp?token=b757c1af-2664-4c90-adf5-1a58fa1bf2ab

Format

json

Json_date_key

time

Json_date_format

iso8601

Retry_Limit

5

Header

X-Xpolog-Sender

fluent-bit-windows-iis
Note:
Change
Host
and
Port
in
[OUTPUT]
to your log backend.
192.168.56.1
is the host on the Vagrant private network.

9. Fluent Bit Parsers: parsers.conf

parsers.
conf
[PARSER]
Name iis_w3c
Format regex
Regex ^(?<date>\d
{4}
-\d
{2}
-\d
{2}
) (?<
time
>\d
{2}
:\d
{2}
:\d
{2}
) (?<
log
>.*)$
Time_Key
time
Time_Format %H:%M:%S
Time_Keep On
[PARSER]
Name iis_w3c_header
Format regex
Regex ^
#(?<log>.*)$
Time_Keep Off
[PARSER]
Name iis_httperr
Format regex
Regex ^(?<date>\d
{4}
-\d
{2}
-\d
{2}
) (?<
time
>\d
{2}
:\d
{2}
:\d
{2}\.\d
+) (?<c_ip>[^ ]+) (?<cs_method>[^ ]+) (?<cs_uri_stem>[^ ]+) (?<sc_status>[^ ]+) (?<s_port>[^ ]+) (?<cs_referer>[^ ]+) (?<cs_user_agent>[^ ]+)
Time_Key
time
Time_Format %H:%M:%S
Time_Keep On
[PARSER]
Name iis_freb
Format regex
Regex ^(?<
log
>.*)$
Time_Keep Off
[PARSER]
Name sharepoint_uls
Format regex
Regex ^(?<timestamp>\d
{2}
/\d
{2}
/\d
{4}
\d
{2}
:\d
{2}
:\d
{2}\.\d
+)\s+(?<
log
>.*)$
Time_Key timestamp
Time_Format %m/%d/%Y %H:%M:%S
Time_Keep On

Deployment Steps

1. Create the directory structure and files

mkdir
-p Windows_IIS/{fluent-bit,vulnerable-sharepoint,provisioning}
cd
Windows_IIS

Create each file above (Vagrantfile, provisioning scripts, ASPX pages, configs).

2. Start the VM

# With libvirt:
sg libvirt -c
"vagrant up"
# With VirtualBox:
vagrant up

First run: 15–30 minutes (downloads Windows box ~4–5 GB, provisions).

3. Connect and test

vagrant rdp
# Credentials: vagrant / vagrant

In the VM browser:http://localhost:8080/

Vulnerable URLs:

  • http://192.168.56.10:8080/search.aspx?q=&lt;script&gt;alert(1)&lt;/script&gt;

  • [http://192.168.56.10:8080/documents.aspx?file=../../../etc/passwd](http://192.168.56.10:8080/documents.aspx?file=../../../etc/passwd)

  • http://192.168.56.10:8080/api.aspx?id=1' OR '1'='1

4. Ensure log backend is reachable

Run a log collector on the host (e.g. port 8081) so Fluent Bit can send logs. The VM reaches the host at192.168.56.1.