Question
Port Knicking
- Fred
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 8 ans 8 mois #23806
par Fred
Port Knicking a été créé par Fred
Bonjours a tous et merci d'avance de votre aide
Voilà, pour faire simple j'ai une application d'un poste secondaire (téléphone en l'occurence) qui communique via un port spécifique avec une application sur mon Poste principal (Windows 10).
Le problème, c'est que l'application sur mon poste principal ne peux pas être lancé h24, c'est pourquoi j'essaye de créer un script Powershell de port knocking qui se lance au boot et qui va attendre un paquet sur le port en question, et quand ce sera fait, va lancer l'application approprié et lui laisser la communication jusqu'a la prochaine fois.
J'ai déjà (avec de l'aide) commencé un script Powershell assez \"simple\"
[code:1]$Listener = [System.Net.Sockets.TcpListener]8080;
while($true)
{
$Listener.Start();
$client = $Listener.AcceptTcpClient();
Write-Host \"Connecté, lancement de l'appli\";
$client.Close();
$Listener.Stop();
Start-Process -FilePath \"C:\Program Files (x86)\...\xxx.exe\" -Wait
Start-Sleep -s 10;
[/code:1]Dès qu'une connexion est tenté, le script va lancer l'exe et attendre qu'il soit fermé pour recommencer l'écoute (après une courte pause)
Ce script marche très bien, le problème, c'est que si l'appli PC est lancé manuellement (ce qui peut arriver) et qu'une connexion est détecté, le script essayera de lancer un autre exe qui échouera, mais surtout le -wait ne sera pas pris en compte et dans ce cas, l'écoute active du port empêche toute communication entre les 2 appli. (je ne sais pas si je me fait bien comprendre)
J'ai donc essayé
[code:1]while($true)
{
while((Get-Process -Name xxx -ErrorAction SilentlyContinue) -ne $null)
{
Start-Sleep -s 10;
}
$Listener = [System.Net.Sockets.TcpListener]8080;
$Listener.Start();
$client = $Listener.AcceptTcpClient();
Write-Host \"Connecté, lancement de l'appli\";
$client.Close();
$Listener.Stop();
If ((Get-Process -Name xxx -ErrorAction SilentlyContinue) -eq $null)
{
Start-Process -FilePath \"C:\Program Files (x86)\...\xxx.exe\" -Wait
Start-Sleep -s 10;
} else {
Write-Host \"appli déjà lancé\"
}
}[/code:1]
Ici, dès qu'une connexion est tenté, il va d'abord vérifier si l'exe est déjà lancé. Si ce n'est pas le cas, il va le faire comme précédemment, mais si il est déjà lancé, il va reprendre depuis le début, sauf que cette fois au début il y a une boucle infini si l'exe est lancé.
Le script a l'air de se dérouler correctement, mais visiblement, même quand le script est bloqué dans la boucle infini sleep 10 (car l'appli est déjà lancé), l'écoute reste active car la communication échoue en boucle...
le paramètre \"-wait\" a l'air de marcher pour mettre en pause l'écoute (CF le 1er script), mais je ne sais pas trop comment l'implémenter dans le cas ou l'appli est déjà lancé (sachant que je ne veux pas quitter l'appli si elle est déjà lancé)
Voilà, j'espère que vous pourrez m'aider parceque je ne suis pas très doué en scripting.
Merci d'avance de votre aide
Voilà, pour faire simple j'ai une application d'un poste secondaire (téléphone en l'occurence) qui communique via un port spécifique avec une application sur mon Poste principal (Windows 10).
Le problème, c'est que l'application sur mon poste principal ne peux pas être lancé h24, c'est pourquoi j'essaye de créer un script Powershell de port knocking qui se lance au boot et qui va attendre un paquet sur le port en question, et quand ce sera fait, va lancer l'application approprié et lui laisser la communication jusqu'a la prochaine fois.
J'ai déjà (avec de l'aide) commencé un script Powershell assez \"simple\"
[code:1]$Listener = [System.Net.Sockets.TcpListener]8080;
while($true)
{
$Listener.Start();
$client = $Listener.AcceptTcpClient();
Write-Host \"Connecté, lancement de l'appli\";
$client.Close();
$Listener.Stop();
Start-Process -FilePath \"C:\Program Files (x86)\...\xxx.exe\" -Wait
Start-Sleep -s 10;
[/code:1]Dès qu'une connexion est tenté, le script va lancer l'exe et attendre qu'il soit fermé pour recommencer l'écoute (après une courte pause)
Ce script marche très bien, le problème, c'est que si l'appli PC est lancé manuellement (ce qui peut arriver) et qu'une connexion est détecté, le script essayera de lancer un autre exe qui échouera, mais surtout le -wait ne sera pas pris en compte et dans ce cas, l'écoute active du port empêche toute communication entre les 2 appli. (je ne sais pas si je me fait bien comprendre)
J'ai donc essayé
[code:1]while($true)
{
while((Get-Process -Name xxx -ErrorAction SilentlyContinue) -ne $null)
{
Start-Sleep -s 10;
}
$Listener = [System.Net.Sockets.TcpListener]8080;
$Listener.Start();
$client = $Listener.AcceptTcpClient();
Write-Host \"Connecté, lancement de l'appli\";
$client.Close();
$Listener.Stop();
If ((Get-Process -Name xxx -ErrorAction SilentlyContinue) -eq $null)
{
Start-Process -FilePath \"C:\Program Files (x86)\...\xxx.exe\" -Wait
Start-Sleep -s 10;
} else {
Write-Host \"appli déjà lancé\"
}
}[/code:1]
Ici, dès qu'une connexion est tenté, il va d'abord vérifier si l'exe est déjà lancé. Si ce n'est pas le cas, il va le faire comme précédemment, mais si il est déjà lancé, il va reprendre depuis le début, sauf que cette fois au début il y a une boucle infini si l'exe est lancé.
Le script a l'air de se dérouler correctement, mais visiblement, même quand le script est bloqué dans la boucle infini sleep 10 (car l'appli est déjà lancé), l'écoute reste active car la communication échoue en boucle...
le paramètre \"-wait\" a l'air de marcher pour mettre en pause l'écoute (CF le 1er script), mais je ne sais pas trop comment l'implémenter dans le cas ou l'appli est déjà lancé (sachant que je ne veux pas quitter l'appli si elle est déjà lancé)
Voilà, j'espère que vous pourrez m'aider parceque je ne suis pas très doué en scripting.
Merci d'avance de votre aide
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 8 ans 8 mois #23811
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Port Knicking
Salut,
pas certains d'avoir compris le problème...
Dans le cas où le proces existe, l'objet process propose la méthode WaitForExit () et l'event Exited.
pas certains d'avoir compris le problème...
Dans le cas où le proces existe, l'objet process propose la méthode WaitForExit () et l'event Exited.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Fred
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 8 ans 8 mois #23819
par Fred
Réponse de Fred sur le sujet Re:Port Knicking
Salut, pour simplifier le problème, le port knocking s'accapare des paquets et donc bloque la connexion, donc il faut que j'arrive a stopper temporairement cette écoute active.
Après plusieurs tests, j'ai pu voir que le $client.Close(); et $Listener.Stop(); ne l'arrête pas, mais le -Wait si, donc j'essaye d'adapter un -Wait sur un processus(du gestionnaire de tâche) déjà lancé.
J'ai essayé de me renseigner et de faire quelques tests sur le WaitforExit() mais je n'arrive pas a le faire marcher... Je suis désolé, je suis vraiment débutant en PowerShell, tu pourrais me faire une commande toute faite qui applique un WaitForExit sur un process s'il te plait ?
Après plusieurs tests, j'ai pu voir que le $client.Close(); et $Listener.Stop(); ne l'arrête pas, mais le -Wait si, donc j'essaye d'adapter un -Wait sur un processus(du gestionnaire de tâche) déjà lancé.
J'ai essayé de me renseigner et de faire quelques tests sur le WaitforExit() mais je n'arrive pas a le faire marcher... Je suis désolé, je suis vraiment débutant en PowerShell, tu pourrais me faire une commande toute faite qui applique un WaitForExit sur un process s'il te plait ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 8 ans 8 mois #23821
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Port Knicking
Un exemple:
[code:1]
start-process notepad
$p=get-process notepad
$p.WaitForExit()
[/code:1]
Tant que le process Notepad est en cours d'exécution, l'appel à WaitForExit est bloquant.
Pour info le paramètre -Wait fait la même chose sur le nouveau process créé.
[code:1]
start-process notepad
$p=get-process notepad
$p.WaitForExit()
[/code:1]
Tant que le process Notepad est en cours d'exécution, l'appel à WaitForExit est bloquant.
Pour info le paramètre -Wait fait la même chose sur le nouveau process créé.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Fred
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 8 ans 8 mois #23822
par Fred
Réponse de Fred sur le sujet Re:Port Knicking
Ah oui la détection de processus a l'air de marcher correctement, mais le WaitForExit() n'a pas l'air d'arrêter l'écoute comme le fait -Wait...
As-tu une idée pour libérer le socket lorsqu'un process est lancé manuellement ?
Ou peut-être qu'il faut reprendre le script depuis le début, je ne comprends pas toutes les lignes donc je ne sais pas si il y a une faille...
Pour faire simple, voici un cas concret qui se rapproche de ce que je veux faire :
=> Je ne veux pas garder Skype allumé h24 mais si quelqu'un essaye de m'appeler, je veux que mon PC allume skype tout seul.
Pour cela, le script écoutera le port de communication de skype, et dès qu'un packet sera entendu (quelqu'un m'appel), le script lancera l'exe de skype.
Le problème que j'ai eut (de ce que je comprends), c'est que la commande d'écoute du port s'accapare des paquets et empêche l'appel une fois skype démarré, même avec une boucle \"Start-Sleep\".
Le seul moyen que j'ai trouvé c'est avec un -Wait lors du démarrage de l'exe (je ne comprends pas pourquoi mais il libère le port), mais ça n'est pas possible si j'ai lancé skype manuellement (la commande WaitForExit ne libère pas le port visiblement)
Je me fais comprendre ?
As-tu une idée pour libérer le socket lorsqu'un process est lancé manuellement ?
Ou peut-être qu'il faut reprendre le script depuis le début, je ne comprends pas toutes les lignes donc je ne sais pas si il y a une faille...
Pour faire simple, voici un cas concret qui se rapproche de ce que je veux faire :
=> Je ne veux pas garder Skype allumé h24 mais si quelqu'un essaye de m'appeler, je veux que mon PC allume skype tout seul.
Pour cela, le script écoutera le port de communication de skype, et dès qu'un packet sera entendu (quelqu'un m'appel), le script lancera l'exe de skype.
Le problème que j'ai eut (de ce que je comprends), c'est que la commande d'écoute du port s'accapare des paquets et empêche l'appel une fois skype démarré, même avec une boucle \"Start-Sleep\".
Le seul moyen que j'ai trouvé c'est avec un -Wait lors du démarrage de l'exe (je ne comprends pas pourquoi mais il libère le port), mais ça n'est pas possible si j'ai lancé skype manuellement (la commande WaitForExit ne libère pas le port visiblement)
Je me fais comprendre ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 8 ans 8 mois #23826
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Port Knicking
Fred02 écrit:
Tracer les ports ?
Fred02 écrit:
A voir ce que fait exactement ton soft avec les ports lorsqu'il est en cours d'exécution.mais le WaitForExit() n'a pas l'air d'arrêter l'écoute comme le fait -Wait...
Tracer les ports ?
Fred02 écrit:
Je connais peu le développement des couches réseau ,je ne suis pas certains de pouvoir t'aider plus que ça.Je me fais comprendre ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.052 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Port Knicking