Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas

jueves, 22 de enero de 2026

WINDOWS. Seguridad. Consejo. Cuenta importante

 

En las propiedades de los usuarios podemos encontrar la siguiente característica “la cuenta es importante y no se puede delegar”


Por seguridad, se debería activar para todas las cuentas privilegiadas o que tengan permisos especiales, ya que: 

  • Una cuenta privilegiada NO es una cuenta personal
  • Delegar una cuenta privilegiada es abrir la puerta al desastre
  • Las cuentas privilegiadas deben usarse SOLO para tareas privilegiadas

Activar ese tip es una forma de reforzar una idea clave: Una cuenta privilegiada no es una herramienta compartida, es un activo crítico que requiere control absoluto, uso limitado y responsabilidad individual.


by GoN | Published: Jan 2026 | Last Updated:

miércoles, 21 de enero de 2026

WINDOWS. PS IOC


 Propósito

Dada una palabra o un ejecutable, buscar un IOC (Indicador de compromiso) en un Host.

Introduces las palabras clave y el script analiza:

  • Procesos
  • Servicios
  • Tareas programadas
  • Carpetas sospechosas
  • Claves RUN / RUNONCE
  • Servicios en el registro
  • Búsqueda de binarios en AppData / Temp
  • Exportación CSV
  • Programas instalado
  • Ejecución en RAM

·         Startup del usuario y del sistema


Pasos

Para ejecutar: powershell.exe -ExecutionPolicy Bypass -File .\BuscasIOC.ps1

<#

    Detect-Strings-Extended.ps1

    Autor: Guillermo

    Objetivo:

        Script INFORMÁTICO que analiza el equipo para encontrar cualquier rastro

        de cadenas sospechosas en:

 

            • Programas instalados

            • Procesos en RAM

            • Servicios

            • Tareas programadas

            • Carpetas sospechosas

            • Entradas en RUN / RUNONCE

            • Servicios en el Registro

            • Archivos en AppData / Temp

            • Programas configurados en el inicio de Windows

 

        NO modifica nada. NO detiene nada. NO elimina nada.

#>

 

Write-Host "======================================================" -ForegroundColor Cyan

Write-Host "   ANALIZADOR DE INDICADORES - MODO INFORMATIVO"       -ForegroundColor Cyan

Write-Host "======================================================" -ForegroundColor Cyan

 

# 1) Pedir cadenas al usuario

$input = Read-Host "Introduce las cadenas a buscar (separadas por coma). Ej: updater, malware, test"

$patterns = $input.Split(",") | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" }

 

if ($patterns.Count -eq 0) {

    Write-Host "No se han introducido cadenas. Saliendo..." -ForegroundColor Red

    exit

}

 

Write-Host "`nCadenas a buscar:" -ForegroundColor Yellow

$patterns | ForEach-Object { Write-Host " - $_" -ForegroundColor Green }

 

# Convertir a regex OR

$regex = ($patterns -join "|")

 

$results = New-Object System.Collections.Generic.List[object]

 

function Add-Result($Tipo,$Ruta,$Detalle) {

    $results.Add([pscustomobject]@{

        Tipo    = $Tipo

        Ruta    = $Ruta

        Detalle = $Detalle

    })

}

 

# =====================================================================

# [0] PROGRAMAS INSTALADOS (Add/Remove Programs)

# =====================================================================

Write-Host "`n========== [0] PROGRAMAS INSTALADOS ==========" -ForegroundColor Cyan

 

$installedApps = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, `

                                  HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, `

                                  HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* `

                    -ErrorAction SilentlyContinue

 

foreach ($app in $installedApps) {

    if ($app.DisplayName -match $regex) {

        Add-Result "Programa Instalado" $app.DisplayName $app.DisplayVersion

        Write-Host "Programa detectado: $($app.DisplayName)" -ForegroundColor Green

    }

}

 

# =====================================================================

# [1] PROCESOS

# =====================================================================

Write-Host "`n========== [1] PROCESOS ==========" -ForegroundColor Cyan

Get-Process -ErrorAction SilentlyContinue |

    Where-Object { $_.Name -match $regex } |

    ForEach-Object {

        Add-Result "Proceso" ($_.Path) ($_.Name)

        $_

    }

 

# =====================================================================

# [2] SERVICIOS

# =====================================================================

Write-Host "`n========== [2] SERVICIOS ==========" -ForegroundColor Cyan

Get-Service -ErrorAction SilentlyContinue |

    Where-Object { $_.Name -match $regex -or $_.DisplayName -match $regex } |

    ForEach-Object {

        Add-Result "Servicio" $_.Name $_.DisplayName

        $_

    }

 

# =====================================================================

# [3] TAREAS PROGRAMADAS

# =====================================================================

Write-Host "`n========== [3] TAREAS PROGRAMADAS ==========" -ForegroundColor Cyan

Get-ScheduledTask -ErrorAction SilentlyContinue |

    Where-Object { $_.TaskName -match $regex -or $_.Description -match $regex } |

    ForEach-Object {

        Add-Result "Tarea Programada" $_.TaskName $_.Description

        $_

    }

 

# =====================================================================

# [4] CARPETAS HABITUALES

# =====================================================================

Write-Host "`n========== [4] CARPETAS HABITUALES ==========" -ForegroundColor Cyan

$paths = @(

    "$env:LOCALAPPDATA",

    "$env:LOCALAPPDATA\Programs",

    "$env:APPDATA",

    "$env:TEMP",

    "$env:ProgramFiles",

    "$env:ProgramFiles(x86)"

)

 

foreach ($base in $paths) {

    if (Test-Path $base) {

        Get-ChildItem $base -Recurse -ErrorAction SilentlyContinue |

            Where-Object { $_.Name -match $regex } |

            ForEach-Object {

                Add-Result "Archivo/Carpeta" $_.FullName "Coincidencia en nombre"

                Write-Host "Encontrado: $($_.FullName)" -ForegroundColor Green

            }

    }

}

 

# =====================================================================

# [5] RUN / RUNONCE

# =====================================================================

Write-Host "`n========== [5] RUN / RUNONCE ==========" -ForegroundColor Cyan

$runKeys = @(

    "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",

    "HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce",

    "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run",

    "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"

)

 

foreach ($rk in $runKeys) {

    if (Test-Path $rk) {

        $vals = Get-ItemProperty $rk -ErrorAction SilentlyContinue

        foreach ($prop in $vals.PSObject.Properties) {

            if ($prop.Name -notlike "PS*" -and (

                $prop.Name -match $regex -or ($prop.Value -as [string]) -match $regex

            )) {

                Add-Result "RunKey" $rk "$($prop.Name) = $($prop.Value)"

                Write-Host "[RUN] $rk → $($prop.Name) = $($prop.Value)" -ForegroundColor Green

            }

        }

    }

}

 

# =====================================================================

# [6] SERVICIOS DEL REGISTRO

# =====================================================================

Write-Host "`n========== [6] SERVICIOS DEL REGISTRO ==========" -ForegroundColor Cyan

Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" -ErrorAction SilentlyContinue |

    Where-Object { $_.Name -match $regex } |

    ForEach-Object {

        Add-Result "RegistroServicio" $_.Name "Coincidencia en nombre de clave"

        $_.Name

    }

 

# =====================================================================

# [7] INICIO DE WINDOWS (Startup)

# =====================================================================

Write-Host "`n========== [7] PROGRAMAS EN EL INICIO ==========" -ForegroundColor Cyan

 

$startupPaths = @(

    "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup",

    "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Startup"

)

 

foreach ($sp in $startupPaths) {

    if (Test-Path $sp) {

        Get-ChildItem $sp -ErrorAction SilentlyContinue |

            Where-Object { $_.Name -match $regex } |

            ForEach-Object {

                Add-Result "Inicio Windows" $_.FullName "Coincidencia en acceso directo"

                Write-Host "En inicio: $($_.FullName)" -ForegroundColor Yellow

            }

    }

}

 

# =====================================================================

# [8] BINARIOS EN APPDATA / TEMP

# =====================================================================

Write-Host "`n========== [8] BINARIOS APPDATA / TEMP ==========" -ForegroundColor Cyan

$binroots = @("$env:LOCALAPPDATA","$env:APPDATA","$env:TEMP")

 

foreach ($br in $binroots) {

    if (Test-Path $br) {

        Get-ChildItem $br -Recurse -ErrorAction SilentlyContinue |

            Where-Object { $_.Name -match $regex } |

            ForEach-Object {

                Add-Result "Binario" $_.FullName "Coincidencia en nombre"

                Write-Host "Binario detectado: $($_.FullName)" -ForegroundColor Green

            }

    }

}

 

# =====================================================================

# RESUMEN + EXPORTACIÓN

# =====================================================================

 

Write-Host "`n==============================================" -ForegroundColor Cyan

Write-Host "                 RESUMEN" -ForegroundColor Cyan

Write-Host "==============================================" -ForegroundColor Cyan

 

$results | Format-Table -AutoSize

 

# Nombre con fecha y hora

$timestamp = (Get-Date).ToString("yyyy-MM-dd_HH-mm-ss")

$output = "C:\Temp\Deteccion-Resultado_$timestamp.csv"

 

New-Item -ItemType Directory -Path (Split-Path $output) -Force | Out-Null

$results | Export-Csv -Path $output -NoTypeInformation -Encoding UTF8

 

Write-Host "`nArchivo exportado: $output" -ForegroundColor Yellow

Write-Host "`n--- ANÁLISIS FINALIZADO ---" -ForegroundColor Cyan

 






by GoN | Published: Jan 2026 | Last Updated:

lunes, 21 de agosto de 2023

Security. Tools. Check URLs phishcheck.me

 Purpose

Extract information from a link and verify it.

Steps

Link: https://phishcheck.me/    ;-)






by GoN | Published: Aug 21 2023 | Last Updated: Sep 5

jueves, 20 de agosto de 2020

SECURITY. Check email exposed

 Purpose


Verify if an email account has been exposed.

Steps

Connect to https://haveibeenpwned.com/

Write a email address

The results



by GoN | Published: Aug 20, 2020 | Last Updated:

jueves, 24 de enero de 2019

LINUX. Antivirus CLAMAV

Purpose

Install and protect my Linux operating system from virus. 


We need have administrator  privileges

Steps

Command: "sudo apt-get install clamav clamav-daemon"

 This command can long very minutes




Command: "sudo freshclam" update antivirus


If there are errors:


You need stop this service firts


Command: "sudo /etc/init.d/clamav-daemon start"  start antivirus


Command:
"sudo /etc/init.d/clamav-freshclam start"



To run the software:

 Command: "sudo clamscan"

To scheduler

1. Made a directory for files in quarentine 


2. Use crontab

I choose 1 option

Insert this commands:


This sentence excute te antirus every day at 22:00 and move to /tmp/VIRUSCUARENTENA the suspects files

More info: https://www.clamav.net/


Check in Linux Mint 19.1 Cinnamon & Ubuntu 
by GoN | Published: January 24 2019 | Last Updated: Augost 8, 2020 

miércoles, 20 de julio de 2016

Control de cambios en grupos del AD ampliado.

Hace unos días hice un post parecido a lo que aquí explicaré, el post es:

El resultado es similar pero el código es bastante diferente.

La finalidad del post es que nuestro script esté atento si alguno de nuestros grupos críticos de nuestro AD ha sido alterado, avisándonos mediante un email. Básicamente compara si se ha quitado o añadido algún miembro en los grupos que monitoricemos.

Lo que explicaré aquí será unas modificaciones un script que he encontrado en


Monitorizará los cambios de todos los grupos que pongamos en la variable [Array]$strCriticalGroups. 


[Array]$strCriticalGroups = "Admins. del dominio","Controladores de dominio"

Yo planifico este script para que se ejecute cada hora, por si se me cuela un hacker intentar darme cuenta lo antes posible, sino con una vez al día creo que sería lo aconsejable.


El script original es


# Active Directory Group Notification Reporting Script
# Author: Andy Grogan
# www.telnetport25.com
# Credits: sendMail function based upon code from the 
# Windows PowerShell Team: 
# http://blogs.msdn.com/b/powershell/archive/2009/10/30/sending-automated-emails-with-send-mailmessage-convertto-html-and-the-powershellpack-s-taskscheduler-module.aspx

$ADWSDC = "prod-dc-01"
$SMTPServer = "172.31.253.140"
$MessageFrom = "infoSec@prepad.local"
$MessageTo = "administrator@prepad.local"

Import-Module ActiveDirectory
[Array]$strCriticalGroups = "Enterprise Admins","Domain Admins","Exchange Servers"

function sendMail($strBody){

    $ErrorActionPreference = "Stop"                        
        try {                        
            $messageParameters = @{                        
                Subject = "Domain Group Notification Report Update"                        
                Body = $strBody                        
                From = $MessageFrom                        
                To = $MessageTo
                SmtpServer = $SMTPServer                        
            }                        
            Send-MailMessage @messageParameters -BodyAsHtml                        
        } catch {                        
            $_ |                         
                Out-File x:\grpMonSMTPerr.txt -Append -Width 1000                        
        }
}

$messBody += "<p>Please find enclosed your Group Monitoring Report: </p>"

foreach($grp in $strCriticalGroups){

    $GroupMembers = Get-ADGroupMember $grp -Server $ADWSDC
    $messBody += "<h1>" + $grp + "</h1>" + "<br>"
    foreach($member in $GroupMembers){
        $messBody += $member.Name + "<br>"
    }
    
}
sendMail $messBody
En mi adaptación se añade lo siguiente:

- Solo enviará email si hay cambios con la última ejecución del script.

- Adjuntará 3 ficheros al email con los resultados de la última ejecución, la penúltima ejecución y la diferencia.


La adaptación que he propuesto:


#Nuestro Controlador de Dominio
$ADWSDC = "mi_dc01"

$SMTPServer = "191.126.226.9"

$MessageFrom = "Micuenta@midominio.local"
$MessageTo = "destinatario@sudominio.com"
$messBody = ""

Import-Module ActiveDirectory

#Grupos que nos interesa monitorizar
[Array]$strCriticalGroups = "Admins. del dominio","Controladores de dominio"

function sendMail($strBody){


    $ErrorActionPreference = "Stop"                        

        try {                        
            $messageParameters = @{                        
                Subject = "AD. Modificacion de Grupos administrativos de AD"                        
                Body = $strBody                        
                From = $MessageFrom                        
                To = $MessageTo
                SmtpServer = $SMTPServer   
Attachments = $FileResult,$FileToday, $FileYesterday                   
            }                        
            Send-MailMessage @messageParameters -BodyAsHtml                   
        } catch {                        
            $_ |                         
                Out-File c:\grpMonSMTPerr.txt -Width 1000                        
        }
}

$messBody += "<p>Please find enclosed your Group Monitoring Report: </p>"


foreach($grp in $strCriticalGroups){


    $GroupMembers = Get-ADGroupMember $grp -Server $ADWSDC

    $messBody += "<h1>" + $grp + "</h1>" + "<br>"
    foreach($member in $GroupMembers){
        $messBody += $member.Name + "<br>"
    }
    
}

#Localización de carpeta y ficheros de trabajo

$FileYesterday = "C:\Script\Control grupos\_FileYesterday.txt"
$FileToday  = "C:\Script\Control grupos\_FileToday.txt"
$FileResult = "C:\Script\Control grupos\_FileResult.txt"


#Copia el fichero de ayer que esta en FileToday al nuevo nombre con el que trabajar FileYesterday

if (Test-Path $FileToday) {
if (Test-Path $FileYesterday ) { del $FileYesterday }
copy $FileToday $FileYesterday 

#borrarmos el fichero que el que hoy trabajaremos

del $FileToday
}
else
{
# Es la primra ejecución no tenemos datos, creamos el fichero FileYerterday vacio para luego poder comparar.
$messBody | Out-File $FileYesterday 
}

#Guarda la información de hoy en el fichero FileToday

$messBody | Out-File $FileToday


#compara el dia anterior con hoy

compare-object (get-content $FileToday) (get-content $FileYesterday) | Format-List | Out-File $FileResult -width 1000

#si el resultado de la comparacion genera un fichero superior a 0.2kb envia email

if( (get-item $FileResult).length -gt 0.2KB) { sendMail $messBody }


La salida en el cuerpo del email sería algo parecido a: 



El fichero adjunto de diferencias será algo así:

GoN Jul2016