mirror of
				https://github.com/mgeeky/Penetration-Testing-Tools.git
				synced 2025-11-04 04:55:26 +01:00 
			
		
		
		
	Added Simulate-DNSTunnel.ps1
This commit is contained in:
		@@ -22,4 +22,6 @@
 | 
			
		||||
 | 
			
		||||
- **`pth-carpet.py`** - Pass-The-Hash Carpet Bombing utility - trying every provided hash against every specified machine. ([gist](https://gist.github.com/mgeeky/3018bf3643f80798bde75c17571a38a9))
 | 
			
		||||
 | 
			
		||||
- **`Simulate-DNSTunnel.ps1`** - Performs DNS Tunnelling simulation for purpose of triggering installed Network IPS and IDS systems, generating SIEM offenses and picking up Blue Teams.
 | 
			
		||||
 | 
			
		||||
- **`win-clean-logs.bat`** - Batch script to hide malware execution from Windows box. Source: Mandiant M-Trends 2017. ([gist](https://gist.github.com/mgeeky/3561be7e697c62f543910851c0a26d00))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										134
									
								
								windows/Simulate-DNSTunnel.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								windows/Simulate-DNSTunnel.ps1
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
<#
 | 
			
		||||
    Simulate-DNSTunnel.ps1
 | 
			
		||||
 | 
			
		||||
    Author: Mariusz Banach (@mgeeky)
 | 
			
		||||
    License: GPL
 | 
			
		||||
    Required Dependencies: None
 | 
			
		||||
    Optional Dependencies: None
 | 
			
		||||
 | 
			
		||||
#>
 | 
			
		||||
 | 
			
		||||
$MaxQueryLength = 253
 | 
			
		||||
$MaxDnsLabelLength = 63
 | 
			
		||||
 | 
			
		||||
# Although it can get even up to 127, keeping it lower value may seem more genuine
 | 
			
		||||
$MaxNumberOfLevels = 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function Simulate-DNSTunnel
 | 
			
		||||
{
 | 
			
		||||
<#
 | 
			
		||||
    .SYNOPSIS
 | 
			
		||||
 | 
			
		||||
        Performs DNS Tunnelling simulation.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .DESCRIPTION
 | 
			
		||||
 | 
			
		||||
        This function performs DNS tunelling simulation for purpose 
 | 
			
		||||
        of triggering installed Network IPS and IDS systems. By issuing 
 | 
			
		||||
        DNS queries over system's default resolver, will introduce peak 
 | 
			
		||||
        in high-entropy anomalous queries to be picked up by blue teams.
 | 
			
		||||
 | 
			
		||||
    .PARAMETER Domain
 | 
			
		||||
 | 
			
		||||
        Domain to be queried against randomly generated anomalous-looking long subdomain.
 | 
			
		||||
        This domain should have a '*' type A record pointing to some IP address
 | 
			
		||||
        for every wildcard subdomain queried, to avoid subsequent DNS failures.
 | 
			
		||||
        Also, obviously the domain should be resolveable.
 | 
			
		||||
 | 
			
		||||
    .PARAMETER Interval
 | 
			
		||||
 | 
			
		||||
        This parameter introduces delay between subsequent queries (in seconds). When unset, 
 | 
			
		||||
        every query will be triggered sequentially one after another. Otherwise,
 | 
			
		||||
        a sleep will be introduced between queries, simulating thus DNS beaconing.
 | 
			
		||||
 | 
			
		||||
    .PARAMETER QueriesNumber
 | 
			
		||||
 | 
			
		||||
        Number of DNS queries to perform. If unset, script will perform inifinite number
 | 
			
		||||
        of DNS queries. In such case, it can be terminated by CTRL+C.
 | 
			
		||||
 | 
			
		||||
    .EXAMPLE
 | 
			
		||||
 | 
			
		||||
        Simulate-DNSTunnel -Domain google.com
 | 
			
		||||
 | 
			
		||||
#>
 | 
			
		||||
    
 | 
			
		||||
    [CmdletBinding()] Param(
 | 
			
		||||
        [String]
 | 
			
		||||
        $Domain,
 | 
			
		||||
 | 
			
		||||
        [Double]
 | 
			
		||||
        $Interval = 0.0,
 | 
			
		||||
 | 
			
		||||
        [Int]
 | 
			
		||||
        $QueriesNumber = 0
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    $Num = 0
 | 
			
		||||
 | 
			
		||||
    While ( ($Num -lt $QueriesNumber) -or ($QueriesNumber -eq 0))
 | 
			
		||||
    {
 | 
			
		||||
        $Num += 1
 | 
			
		||||
        $Query = Generate-AnomalousQuery -Domain $Domain
 | 
			
		||||
 | 
			
		||||
        If ($Interval -ne 0.0 )
 | 
			
		||||
        {
 | 
			
		||||
            Start-Sleep -m ($Interval * 1000)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Try
 | 
			
		||||
        {
 | 
			
		||||
            Write-Host "[+] $Num. Querying: $Query"
 | 
			
		||||
            [System.Net.Dns]::GetHostByName($Query).Hostname
 | 
			
		||||
        }
 | 
			
		||||
        Catch
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Get-RandomString
 | 
			
		||||
{
 | 
			
		||||
    [CmdletBinding()] Param(
 | 
			
		||||
        [int]
 | 
			
		||||
        $Count
 | 
			
		||||
    )
 | 
			
		||||
    return -join ((65..90) + (97..122) | Get-Random -Count $Count | %{[char]$_})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Generate-AnomalousQuery
 | 
			
		||||
{
 | 
			
		||||
    Param(
 | 
			
		||||
        [String]
 | 
			
		||||
        $Domain
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    $QueryToGenerateLen = (Get-Random) % ($MaxQueryLength - $Domain.Length - 1)
 | 
			
		||||
    $PartLen = [math]::Min($MaxDnsLabelLength, $QueryToGenerateLen)
 | 
			
		||||
    $NumberOfParts = (Get-Random) % $MaxNumberOfLevels
 | 
			
		||||
 | 
			
		||||
    $Query = ""
 | 
			
		||||
 | 
			
		||||
    For ($i = 0; $i -lt $NumberOfParts; $i++ )
 | 
			
		||||
    {
 | 
			
		||||
        $Query += Get-RandomString -Count ($PartLen / $NumberOfParts)
 | 
			
		||||
        $Query += "."
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    While ($Query.Length -lt $QueryToGenerateLen )
 | 
			
		||||
    {
 | 
			
		||||
        $Query += Get-RandomString -Count 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    If (($Query.Length + $Domain.Length) -ge ($MaxQueryLength + 1) )
 | 
			
		||||
    {
 | 
			
		||||
        $Query = $Query.Substring(0, $MaxQueryLength - $Domain.Length - 1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $Query = $Query -replace "\.\.", "."
 | 
			
		||||
 | 
			
		||||
    $Query += ".$Domain"
 | 
			
		||||
    return $Query
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user