Mar 07 2010

Conficker et process Lsass

Si la consommation CPU du process lsass.exe est anormale sur les DCs de l’un de vos sites cela peut être lié à la présence du virus Conficker sur les postes de travail de ce site. Le lien mentionné vous indique comment limiter sa propagation et désinfecter les postes infectés. Mais comment identifier facilement les postes déjà infectés?

Ce problème a déjà été traité dans un post de l’équipe AskDS, nous allons le compléter avec des scripts et commentaires qui vous aideront à mieux venir à bout de ce virus.

La méthode qui s’est avérée la plus payante est l’utilisation de la stratégie permettant d’activer les échecs d’authentification dans le journal de sécurité des DCs. Pour cela créer une GPO avec filtrage de sécurité sur les DCs impactés qui permet d’appliquer les paramètres suivants :

Mettre à jour les stratégies de groupe sur les DCs concernés, vous devriez voir apparaître les événements suivants dans le journal de sécurité:

Laisser tourner cet audit pendant plusieurs minutes puis désactiver la GPO de façon à ne pas trop poluer votre journal de sécurité. Voyons maintenant plus précisément le contenu de l’événement d’ID 672:

Nous voyons que nous pouvons récupérer l’IP du poste infecté via “Client Adress”. Nous allons donc réaliser un script qui scanne le journal de sécurité du DC à la recherche de cet événement et nous compte le nombre d’occurences de chaque IP. Nous aurons alors les PCs les plus infectés et sollicitant le plus notre DC.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'Enter Name of your DC
strComputer = "XXXXXX"
 
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set fso = CreateObject("Scripting.FileSystemObject")
 
sCurPath = fso.GetAbsolutePathName(".")
 
Set FLog = FSO.CreateTextFile(sCurPath&"\ip.txt")
 
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 
'Get time one hour ago
dtmCurrentDate = DateAdd("h", -1, now)
 
'Format time
dtmTargetDate = Year(dtmCurrentDate)
dtmMonth = Month(dtmCurrentDate)
If Len(dtmMonth) = 1 Then
 dtmMonth = "0" & dtmMonth
End If
dtmTargetDate = dtmTargetDate & dtmMonth
dtmDay = Day(dtmCurrentDate)
If Len(dtmDay) = 1 Then
 dtmDay = "0" & dtmDay
End If
dtmTargetDate = dtmTargetDate & dtmDay
dtmHour = Hour(dtmCurrentDate)
If Len(dtmHour) = 1 Then
 dtmHour = "0" & dtmHour
End If
dtmTargetDate = dtmTargetDate & dtmHour
dtmTargetDate = dtmTargetDate & "0000.000000"
dtmTargetDate = dtmTargetDate & chr(43) & Cstr(120)
 
'search all EventID 672 occuring one hour ago
Set colLoggedEvents = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventCode = '672' AND TimeWritten >='"&dtmTargetDate&"'")
For Each objEvent in colLoggedEvents
'parse the Message IP is between Client Adress and Certificate Issuer Name
   message = objEvent.Message
   message1 = split(message,"Client Address:")
   messagef = split(message1(1),"Certificate Issuer Name:")
   FLog.Writeline (messagef(0))
Next
msgbox "View all IPs in ip.txt, now lets count occurences"
FLog.close
 
Set df1 = fso.OpenTextFile(sCurPath&"\ip.txt",ForReading,True)
Set FLog2 = fso.CreateTextFile(sCurPath&"\result.csv")
 
Dim IPCOUNT(80000,2)
 
'Initialize counting table
for j=0 to 80000
IPCOUNT(j,0) = "0"
IPCOUNT(j,1) = 0
Next
'read lines of ip.txt and save result in table, if a new IP is discovered a new column is filled in with IP otherwise counter is increased by one
Do while Not df1.AtEndOfStream
IPTST = df1.readline()
marque = "non"
   if IPTST <> "" then
   i=0
      Do While IPCOUNT(i,0) <> "0"
           if IPCOUNT(i,0) = IPTST then
             IPCOUNT(i,1) = IPCOUNT(i,1) + 1
             marque = "oui"
         End if
      i = i + 1
      Loop
 
      if marque = "non" then
      IPCOUNT(i,0) = IPTST
      IPCOUNT(i,1) = 1
      End if
 
  End if
Loop
 
df1.close
 
'write table result in text file
for k=0 to 80000
FLog2.writeline(IPCOUNT(k,0)&";"&IPCOUNT(k,1))
Next
 
msgbox "Done, Check result.csv"

Pour télécharger le script vbs c’est ici:

Les IPs dont le nombre d’occurrences est le plus fort correspondent aux postes à traiter le plus rapidemment par votre service informatique. Cet audit est à réaliser en plusieurs fois, car biensur les postes éteints et inféctés ne sont pas localisés par cet audit. De plus Conficker s’active via des tâches planifiées, donc il se peut que lors de votre audit la tâche soit inactive. Au bout de plusieurs audits nous sommes venus à bout de ce virus sur un site particulièrement infecté, en témoigne le graphique d’activité CPU du DC ci dessous:

Pour terminer il se peut que certains postes infectés ne soient pas atteignables facilement par votre service informatique et que vous ne pouvez pas attendre pour régler ce problème de charge CPU car cela pénalise les autres utilisateurs. Il existe pour cela une manière simple mais radicale: bannir cette IP afin qu’elle ne contacte plus votre DC à l’aide la commande suivante, à lancer sur votre DC:

cmd /c route -p add %CLIENT_IP_ADRESS% MASK 255.255.255.255 %UNUSED_IP_ADRESS%

La variable %UNUSED_IP_ADRESS% correspond à une adresse IP du même subnet que votre DC qui ne pointe sur rien, et %CLIENT_IP_ADRESS% l’adresse IP du poste infecté. Le commutateur /p permet de garder cette route même après reboot du DC. Cette commande est à lancer sur tous les DCs que le poste infecté est susceptible d’atteindre.

This post is also available in: Anglais

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs