Comment démarrer un processus sur pc distant de manière cachée et transparente

Soyez le premier à donner votre avis sur cette source.

Vue 14 955 fois - Téléchargée 1 872 fois

Description

Salut,

cette source montre comment démarrer sur un PC distant un processus, sans RIEN AVOIR A FAIRE sur le PC distant (aucune manipulation à faire dessus, pas de server à lancer manuellement, pas de WMI à activer...), de manière cachée.

Il suffit de démarrer le programme sur le PC principal et de cliquer sur "Go" pour créer un process sur la machine distante.

Comment çà marche ?

En gros :
- on créé une connection avec la machine distante (WNetAddConnection2)
- on copie le fichier "server.exe" sur la machine distante (CopyFile)
- on démarre le fichier "server.exe", qui est en fait un service, par OpenScmanager, CreateService et StartService (c'est là toute la subtilité !)
- le service démarré, il peut faite n'importe quoi.

Bref, ensuite si vous voulez vous transformez le service .Net en service codé en C complètement autonome, et vous avez un programme capable de faire n'importe quoi à distance (un malware pour les plus pessimistes).

Créez ensuite un tube nommé pour communiquer avec une archi client-server, et tout est possible, prochainement dans YAPM :-p

Ne pas oublier de détruire le service à la sortie du programme ! (j'ai pas viré le fichier *.exe dans l'exemple).

Pour info, c'est le fonctionnement de psexec de Sysinternals (en gros).

@+

Source / Exemple :


Option Strict On

Public Class Form1

    Private hScm As IntPtr
    Private hServ As IntPtr
    Private path As String = Replace(Application.StartupPath & "\server.exe", "\", "\\")

    Private remoteHost As String
    Private pass As String
    Private user As String
    Private Net As New API.NETRESOURCE

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        remoteHost = Me.TextBox1.Text
        pass = Me.TextBox3.Text
        user = Me.TextBox2.Text

        ' Create connection to remote computer
        Net.dwType = API.NETRESOURCE.Type.RESOURCETYPE_ANY
        Net.lpProvider = Nothing
        Net.lpLocalName = Nothing
        Net.lpRemoteName = "\\" & remoteHost & "\IPC$"

        Dim ret As Integer
        ret = API.WNetAddConnection2(Net, pass, user, API.CONNECT_COMMANDLINE)
        
        If (ret <> 0) AndAlso (user <> Nothing) Then
            If ret = 1219 Then
                ' Connection already created. Disconnecting..
                ret = CancelConnection()
            Else
                If ret = 1326 Then
                    If InStr(user, "\"c) = 0 Then
                        Dim CurrentUserName As String = "localhost\" & user
                        ret = API.WNetAddConnection2(Net, pass, CurrentUserName, API.CONNECT_UPDATE_PROFILE)
                    End If
                End If
            End If
            If ret <> 0 Then
                ' Error
                RaiseError(API.GetError)
            End If
        End If

        ' Share executable service
        Dim remote As String = "\\" & remoteHost & "\ADMIN$\System32"
        Dim ret3 As Boolean = API.CopyFile(path, remote & "\yapmserver.exe", Nothing)

        ' Create and install service
        hScm = API.OpenSCManager(remoteHost, vbNullString, CInt(API.SC_MANAGER_ALL_ACCESS))
        hServ = API.CreateService(hScm, "yapm_server", "YAPM server", _
                                  CInt(API.SERVICE_RIGHTS.SERVICE_ALL_ACCESS), _
                                  API.SERVICE_WIN32_OWN_PROCESS, _
                                  API.SERVICE_START_TYPE.DemandStart, _
                                  API.SERVICE_ERROR_CONTROL.Ignore, _
                                  remote & "\yapmserver.exe", Nothing, _
                                  Nothing, Nothing, Nothing, Nothing)

        If hServ = IntPtr.Zero Then
            If Err.LastDllError = 1073 Then
                ' Service already exists
                hServ = API.OpenService(hScm, "yapm_server", API.SERVICE_RIGHTS.SERVICE_ALL_ACCESS)
            End If
        End If

        Call API.CloseServiceHandle(hScm)

        ' Start service !
        API.apiStartService(hServ, Nothing, Nothing)

    End Sub

    ' Stop and delete service
    Private Sub DeleteService()

        ' Stop and delete service
        Dim lpss As API.SERVICE_STATUS
        API.ControlService(hServ, API.SERVICE_CONTROL._STOP, lpss)

        Call API.DeleteService(hServ)
        Call API.CloseServiceHandle(hServ)

    End Sub

    ' Cancel connection
    Private Function CancelConnection() As Integer

        Call API.WNetCancelConnection2(remoteHost, Nothing, True)
        Return API.WNetAddConnection2(Net, pass, user, API.CONNECT_UPDATE_PROFILE)

    End Function

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Call DeleteService()
        Call CancelConnection()
    End Sub

    Private Sub RaiseError(ByVal _error As String)
        Me.rtb.Text = _error
    End Sub

End Class

Conclusion :


Evidemment avec çà on peut faire un malware/virus sans problèmes, mais c'est pas le but...

Il peut y avoir des problèmes, j'ai fait çà à l'arrache !

@+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,
C'est super simple : comme je l'ai indiqué, seuls les comptes ayant des droits d'administrateurs sur la machine sur laquelle on tente d'installer le service ont le droit effectif de le faire.
S'il s'agit de la machine local il suffit de ne pas utiliser de compte qui soit administrateur et/ou d'utiliser un programme qui réduit les droits dont il dispose aux droit nécessaires pour fonctionner (principe du bac à sable).
S'il s'agit d'une machine distante, il suffit de ne pas se connecter avec un compte administrateur de la machine distante.
A noter, le compte SYSTEM qui a TOUS les droits sur la machine locale n'a aucun droit sur la machine distante.
Quand on est administrateur d'un réseau, il est important de bien avoir en tête que lorsqu'on est connecté en tant qu'administrateur, on dispose des droits nécessaire et surtout suffisants pour propager n'importe quel programme sur un réseau d'entreprise.
Messages postés
30
Date d'inscription
mardi 21 août 2007
Statut
Membre
Dernière intervention
4 octobre 2010

peut on empecher ces types d'application à acceder à une machine si oui comment?
comme quoi, il vaut mieu prevenir que guerir!
Jolie source, comme toujours avec violent_ken et les process!
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

Ah ok ça me rassure qu'il soit nécessaire d'avoir les droits admin !

Très intéressant en tout cas
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Oui effectivement j'ai oublié de le préciser, les droits d'admin sont requis.

Heureusement bien sur, sinon n'importe qui ferait n'importe quoi. Par contre très souvent les gens sont admins de leur machine sans le savoir (c'est rare les comptes limités sous Windows, XP notamment).

Il faut utiliser ce type de code dans le but d'administrer un PC à distance, et bien souvent dans ces cas on est admin et on possède un compte qui a les droits requis.
Pour faire un malware, mieux vaut utiliser un exploit plutôt qu'une méthode traditionnelle et autorisée par l'OS comme celle-ci.

@+
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,
Ton code nécessite néanmoins d'avoir les droits d'admin sur la machine distante, ce qui limite considérablement sa portée en tant que malware, sauf si bien sûr, l'utilisateur est inconscient du danger et ouvre les portes... mais ceci n'arrive jamais.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.