Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

lunes, 14 de enero de 2019

Ejecutar funciones bash dentro del comando find

El comando find es muy potente y se usa habitualmente en shell scripts. En ocasiones, se requiere ejecutar una serie de acciones por cada uno de los ficheros encontrados por find y esto puede resultar una tarea imposible. Veamos un ejemplo.
Propósito
Se requiere analizar todos los ficheros con extensión .py ubicados dentro de un directorio para detectar todos aquellos que no contienen la declaración de la codificación de texto utilizada. Para estos ficheros, añadir automáticamente la directiva siguiente:
# -*- coding: latin-1 -*-

lunes, 7 de enero de 2019

Usar tildes y eñes en Python

Python es un lenguaje de programación ampliamente usado para todo tipo de proyectos. Es usado también para realizar scripts de administración de sistemas que requieren una complejidad excesiva para realizarlos en bash, por lo que se usa casi un día sí y otro también.
Hoy vamos a ver cómo solucionar un problema que se da en ocasiones: cómo usar tildes, eñes y otros caracteres usados en castellano sin que nos de el siguiente error:
SyntaxError: Non-ASCII character '\xc3' in file ./script.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

lunes, 19 de noviembre de 2018

Instrucción vacía

La mayoría de los lenguajes de programación tienen lo que se denomina instrucción vacía. Esta instrucción en realidad no realiza ninguna función práctica, pero permite rellenar un hueco allí donde se necesita.
Veamos un ejemplo en Python:
import sys
try:
    f = open('myfile','r')
except:
    pass
En este ejemplo, si el fichero myfile no existe saltará una excepción que será capturada por el bloque try. Como no se requiere ejecutar ninguna acción si salta la excepción y la sección except hay que colocarla, se pone en ella la instrucción vacía pass de Python.
Veamos cuál es la instrucción vacía en bash y qué usos se le puede dar.

lunes, 8 de junio de 2015

Creando una botnet con Python y SSH

Os aconsejo ver este pequeño tutorial sobre cómo crear una sencilla botNet usando Python y accediendo a las víctimas por SSH.


No trata los posibles métodos de infección, pero muestra algunos conceptos interesantes. Además, este ejemplo se puede extrapolar para poder ejecutar comandos a toda una flota de servidores o clientes.

lunes, 29 de septiembre de 2014

Integrar Latch en Python

Espero que conozcáis Latch, y si no estáis tardando. Es un excelente método para proteger nuestras cuentas de accesos no autorizados. Se puede implementar en una web, en una aplicación de escritorio, en el propio proceso de logado de usuarios de algunos sistemas operativos, y en general es aplicable a cualquier sistema que ideemos y que sea susceptible de proteger ante eventuales ataques.
Una buena fuente para aprender sobre Latch y seguridad en general es el blog Un informático en el lado del mal.
Como para otros muchos lenguajes y plataformas, Latch tiene una librería para poderse usar desde Python. Con tan solo descargar el fichero latch.py e importarlo en nuestra aplicación Python, podemos usarlo.
Lo primero de todo es darse de alta en la web de Latch como desarrollador. Se hace de forma gratuita. Obtendremos una Latch APP ID y un Latch Secret.

Parear una cuenta de usuario con nuestra aplicación

El proceso de parear un usuario con una aplicación se inicia generando un código aleatorio por parte del usuario, mediante la aplicación para móvil de Latch. En nuestro ejemplo será 92Us26.
El siguiente script Python corresponde al proceso de emparejar un usuario con nuestra aplicación:
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

usuario = sys.argv[1]
codigo  = sys.argv[2]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.pair(codigo)
cuenta_latch = str(response.get_data()['accountId'])

print cuenta_latch
La ejecución del script anterior sería de este modo:
$ python parear.py user01 92Us26
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Como se aprecia, tras el pareo nuestra aplicación se queda con el ID del pestillo que se acaba de crear. En este caso, a modo de ejemplo, se imprime por pantalla. Lo ideal es que nuestra aplicación almacene en una base de datos que el usuario user01 tiene como ID del pestillo de inicio de sesión ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82.

Comprobar el estado del pestillo de un usuario

Una vez que se ha creado el pestillo, el siguiente paso es conocer la forma de consultar su estado (abierto o cerrado). De esta forma, cuando el usuario (o un atacante) introduzca ese login y su contraseña correcta, la aplicación consultará el estado del pestillo. Si está abierto, la aplicación logará al usuario con normalidad. Si está cerrado, la aplicación devolverá el mensaje de usuario o contraseña incorrectos.
A continuación se muestra un pequeño script para consultar el estado del pestillo (en la práctica lo suyo es obtenerlos de la base de datos):
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

latchuserid  = sys.argv[1]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.status(latchuserid)
if response.get_data()['operations'][LATCH_APP_ID]['status'] == 'on':
    print 'Acceso permitido'
else:
    print 'Acceso denegado'
La ejecución del script sería:
$ python comprobar.py
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Acceso denegado
¿Cómo has usado Latch en tu aplicación? ¿Qué usos le has dado? ¡Deja tu comentario!

jueves, 24 de julio de 2014

Enviar mensajes por Hangouts desde consola

Necesitaba enviar mensajes por Hangouts desde linea de comandos, para hacerlo de manera automática con scripts. Tras probar distintas aplicaciones, algunas que funcionaban pero con un entorno interactivo con ncurses, y otras que directamente fallaban, encontré la solución. Sencilla y elegante:


1. Instalar la librería XMPP para Python:

# aptitude install python-xmpp

2. Crear el script Python que enviará los Hangout. Llamémoslo sendHangouts.py:

#!/usr/bin/python
# -*- coding: latin-1 -*-

# 1er parametro: cuenta del destinatario
# 2o parametro: mensaje a enviar

import sys, xmpp

jid = xmpp.protocol.JID('cuenta.desde.la.que.envio.el.hangout@gmail.com')
cl=xmpp.Client(jid.getDomain(),debug=[])
cl.connect()
cl.auth(jid.getNode(),'contraseña.de.la.cuenta')
cl.send(xmpp.protocol.Message(sys.argv[1],sys.argv[2], typ='chat'))

3. Asignar permisos de ejecución al script:

# chmod +x sendHangouts.py


4. Para que cuenta.desde.la.que.envio.el.hangout@gmail.com pueda mandar un hangouts a mi.cuenta.destinataria@gmail.com, el emisor tendrá que tener al destinatario en su agenda de contactos. Valdría con que cuenta.desde.la.que.envio.el.hangout@gmail.com enviase un email a mi.cuenta.destinataria@gmail.com.

5. Y listo para enviar mensajes:

# ./sendHangouts.py mi.cuenta.destinataria@gmail.com Hola
# ./sendHangouts.py mi.cuenta.destinataria@gmail.com "Alarma crítica en servidor de base de datos"

6. A inventar posibles usos.

sábado, 24 de octubre de 2009

Mandar emails desde Python

Os voy a mostrar una sencilla función que os permitirá enviar correos electrónicos desde Python:

# -*- coding: latin-1 -*-
import smtplib
CUENTA_CORREO='usuario@dominio'
PASSWORD_CUENTA_CORREO='pass'
IP_SERVIDOR_SMTP='X.X.X.X'

 
def mail(destinatarios, cc, asunto, mensaje):
    # Destinatarios: lista de emails
    # cc: lista de emails
    # asunto: string
    # mensaje: string
    headers = "From: %s\r\nTo: %s\r\nCc: %s\r\nContent-Type: text/plain; charset=\"utf-8\"\r\nSubject: %s\r\n\r\n" % (CUENTA_CORREO, ','.join(destinatarios), ','.join(cc), asunto)
    message = headers + mensaje

    mailServer = smtplib.SMTP(IP_SERVIDOR_SMTP)
    mailServer.login(CUENTA_CORREO, PASSWORD_CUENTA_CORREO)
    mailServer.sendmail(CUENTA_CORREO, destinatarios + cc, message)
    mailServer.quit()


mail(['a@hotmail.com','b@hotmail.com'], ['c@hotmail.com'], 'prueba', 'esto es una prueba')

viernes, 9 de octubre de 2009

Cifrar contraseñas con Python

Python es un estupendo lenguaje con el que construir desde pequeños scripts a grandes aplicaciones en un abrir y cerrar de ojos. Yo hago mis pinitos con él.

Si alguna vez habéis realizado un programa en el que los usuarios han de logarse, es fundamental que el servidor guarde las contraseñas con un cifrado seguro. Y es interesante que si dos usuarios escogen la misma contraseña, el administrador de sistemas que gestione dicha información encriptada no sepa de este hecho, es decir, que no vea la misma cadena cifrada para dos usuarios.

La estrategia que seguiremos será la siguiente: la cadena de texto a cifrar no será sólo el password del usuario, sino la concatenación de su login y su password. Así, dos usuarios con la misma password no tendrán la misma cadena cifrada (pues el login se supone que es único). Usaremos el cifrado SHA-1 por ser un método (hasta ahora) seguro.

Este script en Python nos dará la clave cifrada que tendremos que guardar:

# -*- coding: latin-1 -*-

import hashlib, sys

if len(sys.argv) < 3:
    print "Uso: python encriptador.py USUARIO PASSWORD"
else:
    print "Password generado: " + hashlib.sha1( sys.argv[1] + sys.argv[2] ).hexdigest()

Para los no iniciados en Python, para ejecutarlo basta con:

$ python encriptador.py pepico delospalotes

Si deseáis usar el cifrado SHA-256, bastará con sustituir en el script anterior "sha1" por "sha256". La cadena resultado veréis que es más larga.