Envoyer un CSV en HTTP en PowerShell

Envoyer un CSV en HTTP en PowerShell

Salut à tous, aujourd’hui j’ai eu un besoin d’envoyer un CSV en HTTP en PowerShell. J’ai fait ça pour automatiser un envoi de fichier de résultat de script entre 2 serveurs. Ma grosse contrainte était que je pouvais pas faire du mode ‘Push’ (cf. transfert SCP sans mot de passe) comme je partais d’une zone de sécurité moindre que celle de destination. Et comme, le fichier source venait d’un Windows, je ne voulais pas mettre en place un serveur Web IIS sur le serveur pour un pauvre fichier CSV à transférer 2 fois par jour…

Du coup, j’ai bricolé quelques lignes à la fin de mon script PowerShell pour exposer le fichier en HTTP et permettre au serveur destination de venir les « Puller » pour respecter le sens d’établissement du flux.

Et sans transition le script pour envoyer un CSV en HTTP en PowerShell :

Function New-SimpleHTTPListener {
  Param (         
    [Parameter()] [Int] $Port = 7443
  )
  Begin{
    $listener = New-Object System.Net.HttpListener
    $prefix = "http://localhost:$Port/"
    $listener.Prefixes.Add($prefix)
  }

  Process{

    try{
      $listener.Start()
      Write-Host "Listening on $Port ..."
      $pathwd = Get-Location
      while ($listener.IsListening) {
        $context = $listener.GetContext()

        if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.RawUrl -eq '/quit')
        {
            $listener.Close()
            break;
        }    

        $HTTPresponse = $context.Response
        $HTTPresponse.StatusCode = "200"
        $HTTPResponse.Headers.Add("Content-Type","text/csv") 

        $RequestUrl = $context.Request.Url.OriginalString
        $data = [System.Text.UTF8Encoding]::UTF8.GetBytes([System.IO.File]::ReadAllText("$pathwd"  + '\' + ($RequestUrl.Split('/')[-1])))

        $HTTPresponse.ContentLength64 = $data.Length

        $output = $HTTPresponse.OutputStream

        $output.Write($data,0,$data.Length)

        $output.Close() 
      }
    }catch{
       Write-Warning "Error with Server : $_" 
    }Finally{
      Write-Warning "terminating Server : $_" 
      $listener.Stop()
    }
  }

  End{
    
  }
}

New-SimpleHTTPListener

Alors clairement, c’est du bon gros « quick and dirty … Lire la suite

Tweeter en PowerShell – PSTwitterAPI

Tweeter en PowerShell

Salut à tous, on nous a demandé d’organiser un petit Capture The Flag (CTF) en interne au boulot. Du coup, il a fallu faire quelques challenges et je me suis dit que j’allais refaire un challenge que j’avais bien aimé du SANS celui à base de tweet offusqués. Du coup j’ai voulu refaire le mien, la dernière fois, j’avais fait le crawler en Python, ce coup ci j’ai donc voulu Tweeter en PowerShell (au cas où vous n’auriez toujours pas compris que je kif ce langage…^^).

Alors j’aurais pu jouer à le faire à la main avec Invoke-RestMethod, mais bon une recherche Google Plus tard et je suis tombé sur : PSTwitterAPI qui fait très très bien le boulot. En fait le plus long ça a été de créer un compte Twitter, de générer les accès API en écriture et de préparer le fichier avec le flag caché dedans…^^

Mais du coup, Un fois que vous avez fait le fichier de résultat, le script pour le pusher sur le site, il tient en quelques lignes :

Import-Module PSTwitterAPI
$OAuthSettings = @{
  ApiKey = "xxx"
  ApiSecret = "yyy"  
  AccessToken = "123"
  AccessTokenSecret = "456"
}
Set-TwitterOAuthSettings @OAuthSettings

$a = Get-Content 
Lire la suite

Envoyer des syslog en Powershell

Envoyer des syslog en Powershell

Salut à tous, aujourd’hui je vais m’arrêter sur un bout de script dont j’ai eu besoin il y a quelques mois de cela pour envoyer des syslog en Powershell et que chaque machines où je faisait exécuter un script envoie directement ses résultats à à un serveur syslog. Et puis tant qu’on y était avec Grégoire, on a fait le récepteur syslog au passage histoire de pouvoir tester ça en local sans se faire trop mal à monter un vrai serveur syslog.

Syslog ?

Pour rappel Syslog est un protocole réseau qui permet d’envoyer des logs. Bien connu et largement utilisé, il permet de déporter les logs entre l’équipement et la machine qui les stocke, voire les traite (qui a dit Splunk?). Il y a 2 RFC qui cadrent la norme la RFC 3164 et la RFC 5424. En grande majorité, syslog passe sur UDP, le problème c’est que ça ne garantie pas la bonne arrivée de 100% des logs sur vos collecteurs syslog. Mais on commence à trouver de plus en plus de TCP dans l’utilisation de Syslog.

Chiffrement ? Signature ?

Une petite digression pour votre culture, même si en TCP on garantie la bonne réception … Lire la suite

Extraire les N premières lignes d’un fichier en PowerShell

Extraire les N premières lignes d'un fichier en PowerShell

Salut à tous, aujourd’hui je vous propose une rapide commande PowerShell pour extraire les N premières lignes d’un fichier en PowerShell et dont j’ai eu besoin pour intégrer quelques logs dans un Splunk aujourd’hui.

Le fichier de log pour une journée faisait 5Go, c’était un peu gros pour tester l’intégration. J’ai voulu piquer uniquement les 5000 premières lignes mais sans passer par un Linux (avec Head par exemple) ou dans un éditeur de texte comme notepad.

La bonne nouvelle c’est que, comme d’habitude, ça se fait très bien en PowerShell :

Get-Content "grosfichier.csv" | select -First 5000 | Out-File "first-5000-grosfichier.csv"

Et voilà ! c’est tout pour aujourd’hui, mais comme ça vous saurez faire la prochaine fois que vous aurez besoin de d’extraire les N premières lignes d’un fichier en PowerShell ! @+… Lire la suite