-
Notifications
You must be signed in to change notification settings - Fork 0
/
vnc_detecta.pyw
236 lines (219 loc) · 9.43 KB
/
vnc_detecta.pyw
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#-------------------------------------------------------------------------------
# Name: vnc_detecta
# Purpose: email aviso conexiones al puerto 3389, 47195, 5900
# propios de escritorio remoto o vnc
# solo manda un email de aviso cada hora
# con los procesos del sistema ejecutándose en ese momento
# pero se guarda log cada vez que se detecta
# Author: JULIO
#
# Created: 17/06/2011
# Copyright: (c) JULIO 2011
# Licence: <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import time,datetime,os,sys,subprocess
import win32evtlog # requires pywin32 pre-installed
import smtplib, ConfigParser
import random, socket
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
from envia_email import mandaemail
def main():
pass
if __name__ == '__main__':
main()
nombre = socket.gethostname()
ip_local = socket.gethostbyname_ex(socket.gethostname())[2][0]
fic_error = open('vnc_detecta_'+ nombre + '_error.txt','a')
fic_log = 'vnc_detecta_' + nombre + '_log.txt'
fic_log_proceso = 'vnc_detecta_pro_' + nombre + '_log.txt'
fic_temp = 'vnc_detectado_' + nombre + '_temp.txt'
fic_temp_proceso = 'vnc_detectado_pro_' + nombre + '_temp.txt'
dt = datetime.datetime.now()
conf = 'vnc_detecta_conf.txt'
if not os.path.exists(conf):
print 'Falta fichero configuración'
exit()
ficini = ConfigParser.ConfigParser()
ficini.read(conf)
if not ficini.has_section('principal'):
print 'Faltan datos principales'
exit()
emailuser = ficini.get('principal', 'u')
emailpassw = ficini.get('principal', 'p')
emailpop3 = ficini.get('principal', 'pop3')
emailssl = ficini.get('principal', 'ssl')
emailsmtp = ficini.get('principal', 'smtp')
emailaquien = ficini.get('principal', 'aquien').split(',')
emailsi = ficini.get('principal', 'emailsi')
puertos = ficini.items('puertos')
procesos = ficini.items('procesos')
formato_es = '%d/%m/%y %H:%M:%S'
formato_en = '%m/%d/%y %H:%M:%S'
formato =formato_en
try:
eventos = ficini.items('eventos')
formato = ficini.get('principal','formatofecha')
except:
pass
excepciones=[]
try:
excepciones = ficini.items('excepciones')
except:
pass
for puerto in puertos:
sentencia='netstat -no|find "'+ ip_local + ':' + puerto[0] + '"'
pidc = subprocess.Popen(sentencia,shell=True,stdout=subprocess.PIPE,stderr=fic_error) # con esto esperamos a que termine antes de seguir con el siguiente
hay=pidc.stdout.readlines()
if len(hay)>0:
fich_log = open(fic_log,"a+")
for row in hay:
ip = row.split()[2]
ip = ip.split(":")[0]
salimos = False
for exc in excepciones:
if exc[0] == ip:
salimos = True
if salimos:
break
ip = ip.replace(".","_")
#ip = ip + '_en_' + puerto
fich_log.write(nombre + '_acceso_'+ str(dt) + '_' + row[:-2]+' '+'\n')
fich_temp = open(fic_temp,"w+")
fich_temp.write(nombre + '_acceso_'+ str(dt)+'_'+row[:-2]+' '+'\n')
fich_temp.close()
# flag para no repetir cada hora
fic_flag = 'vnc_detectado_'+ nombre + '_' + puerto[0] + '_' + dt.strftime("%Y%m%d_%HH")+'_ip_'+ ip + '.txt'
if (os.path.exists(fic_flag)==False):
fich_flag=open(fic_flag,"w+")
fich_flag.close()
if puerto[0] =='3389':
sentencia2='tasklist /v|find /i "rdp-tcp">>'+ fic_temp
if puerto[0] =='47195' or puerto[0] =='5900' or puerto[0] =='47196':
sentencia2='tasklist /v>>'+ fic_temp
pidc1 = subprocess.Popen(sentencia2,shell=True,stderr=fic_error)
adjunto=fic_temp
asunto = nombre + '_acceso_'+ puerto[0] + '_'+ ip + dt.strftime("_%Y%m%d_%HH")
texto=row[:-2]
time.sleep(1)
if emailsi=='si':
'''
harto de emails por simple conexión tcp al 3389
de los juankers
'''
if puerto[1]<>'emailno':
mandaemail(emailuser, emailpassw, emailsmtp,emailaquien,asunto,texto,adjunto)
fich_log.close()
# a pelo los procesos rdp-tcp
if puerto[0] =='3389':
sentencia2='tasklist /v|find /i "rdp-tcp">>'+ fic_log
if puerto[0] =='47195' or puerto[0]=='5900' or puerto[0]=='47196':
sentencia2='tasklist /v >>'+ fic_log
pidc1 = subprocess.Popen(sentencia2,shell=True,stderr=fic_error)
#fic_h_error.write('escritorio remoto pasado '+ str(dt) + '\n')
# ahora procesos
#C:\Program Files (x86)\TeamViewer\Version7\Connections_incoming.txt
for proceso in procesos:
sentencia2='tasklist /v|find /i "'+ proceso[0] + '"'
#print sentencia2
pid = subprocess.Popen(sentencia2,shell=True,stdout=subprocess.PIPE,stderr=fic_error) # con esto esperamos a que termine antes de seguir con el siguiente
hay=pid.stdout.readlines()
if len(hay)>0:
fich_log_pro = open(fic_log_proceso,"a+")
for row in hay:
pro_entero = row.split()[0]
pro_id = row.split()[1]
fich_log_pro.write(nombre + '_acceso_proceso_'+ proceso[0]+'_'+ pro_id + '_'+str(dt) + '_' + row[:-2]+' '+'\n')
fich_temp_pro = open(fic_temp_proceso,"w+")
fich_temp_pro.write(nombre + '_acceso_proceso_'+ proceso[0]+'_'+ pro_id + '_'+str(dt)+'_'+row[:-2]+' '+'\n')
fich_temp_pro.close()
# flag para no repetir cada hora
fic_flag = 'vnc_detectado_pro_'+ nombre + '_' + proceso[0] + '_' + pro_id + '_'+ dt.strftime("%Y%m%d_%HH")+ '.txt'
if (os.path.exists(fic_flag)==False):
fich_flag=open(fic_flag,"w+")
fich_flag.close()
sentencia2='tasklist /v>>'+ fic_temp_proceso
pidc1 = subprocess.Popen(sentencia2,shell=True,stderr=fic_error)
adjunto=fic_temp_proceso
if proceso[1]<>'': adjunto=proceso[1]
asunto = nombre + '_acceso_proceso_'+ proceso[0] + '_'+ pro_id +'_'+ dt.strftime("_%Y%m%d_%HH")
texto=row[:-2]
time.sleep(1)
if emailsi=='si':
mandaemail(emailuser, emailpassw, emailsmtp,emailaquien,asunto,texto,adjunto)
fich_log_pro.close()
#exit()
fic_error.close()
ult_evento = ['12/01/14 0:0:0']
if (os.path.exists('vnc_detecta_evento.txt')):
fich_evento = open('vnc_detecta_evento.txt',"r")
ult_evento = fich_evento.readlines()
ult_evento = ult_evento[0].split(chr(9))
fich_evento.close()
else:
fich_evento = open('vnc_detecta_evento.txt',"w")
fich_evento.write(dt.strftime(formato) )
fich_evento.close()
fechaantes = datetime.datetime.strptime(str(ult_evento[0]),formato)
server = 'localhost' # name of the target computer to get event logs
logtype = 'Security' #'System' # 'Application' # 'Security'
hand = win32evtlog.OpenEventLog(server,logtype)
flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ
#total = win32evtlog.GetNumberOfEventLogRecords(hand)
texto = ''
if len(eventos)>0:
events=1
while events:
events = win32evtlog.ReadEventLog(hand, flags,0)
if events:
for event in events:
#print events
fecha = datetime.datetime.strptime(str(event.TimeGenerated), formato)
if fecha <= fechaantes:
break
#print event.EventID
for miraevento in eventos:
if str(event.EventID) in miraevento[0]:
fich_evento = open('vnc_detecta_evento_temporal.txt',"a")
new_evento = str(event.TimeGenerated) + chr(9) + str(event.EventID)+ chr(9) + str(event.EventCategory) + chr(9) + str(event.SourceName)
fich_evento.write(new_evento+'\n\r')
data = event.StringInserts
if data:
for msg in data:
fich_evento.write(msg + '\n\r')
fich_evento.write('\n\r')
fich_evento.close()
texto = texto + '_' +str(event.EventID)
if (os.path.exists('vnc_detecta_evento_temporal.txt')):
try:
os.remove('vnc_detecta_evento.txt')
except:
pass
finally:
os.rename('vnc_detecta_evento_temporal.txt', 'vnc_detecta_evento.txt')
if emailsi=='si':
asunto = nombre + '_eventos_'+ dt.strftime("%Y%m%d_%HH")
adjunto = 'vnc_detecta_evento.txt'
time.sleep(1)
mandaemail(emailuser, emailpassw, emailsmtp,emailaquien,asunto,texto,adjunto)
fich_log =open("ftp_cada_5m_do_log.txt","a+")
fich_log.write('fin vnc_detecta '+ str(datetime.datetime.now()) + '\n')
fich_log.close()
exit()
'''
print 'Event Category:', event.EventCategory
print 'Time Generated:', event.TimeGenerated
print 'Source Name:', event.SourceName
print 'Event ID:', event.EventID
print 'Event Type:', event.EventType
data = event.StringInserts
if data:
print 'Event Data:'
for msg in data:
print msg
print
'''