comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Taller de web scrapping, consumo de apis, etc

  • 14 Respuestas
  • 5423 Vistas

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

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« en: Agosto 25, 2016, 11:01:13 pm »
Edit: Hola. Esto es un taller sobre sacar datos de webs, hacer bots, pegarle a apis y ese tipo de cosas.
La idea es que lo vayan siguiendo y haciendo los ejercicios para afirmar los conocimientos. Cuando ande lo que hicieron, posteenlo. Si tienen dudas, poteenlas aca mismo.

Indice:
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Abajo el mensaje original

Hola gente, tengo ganas de hacer un taller. La idea es hacer un post cada tanto en el que explico algo y dejar unos dias para que hagan ejercicios y suban los resultados. Para que funcione eso tiene que haber gente que lo quiera hacer mientras van saliendo los posts

Podemos hacer otro tema, pero estaba pensando en hacer algo asi:
Scrapping de webs (el ejercicio es sacar datos del foro)
Lo mismo pero mandando post (el ejercicio es tratar de loguearse con distintas cuentas que vayamos sacando con lo del post anterior)
Algo similar pero con una web que muestre los datos con javascript
Una explicacion de apis rest y usamos alguna
Capaz algo asi con soap y oauth
Y para terminar, hacemos un bot para alguna web

Quien se anota?
Hay que saber programar y un poco de python (variables, for, while, if, funciones, import y poco mas)
« Última modificación: Agosto 29, 2016, 09:10:15 pm por seth »

Desconectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5401
  • Actividad:
    36.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Agosto 25, 2016, 11:39:07 pm »
Que bien @No tienes permisos para ver links. Registrate o Entra con tu cuenta! Yo me apunto. Se ve bastante interesante la propuesta.
Decime que necesitas para que arranquemos.

Saludos!
ANTRAX


Conectado Zentraedi

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    16.67%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #2 en: Agosto 26, 2016, 12:18:08 am »
Estoy aprendiendo de a poco y no sabria como hacerlo, pero me suscribo como espectador, exitos con el taler.

Desconectado cnfs

  • *
  • Underc0der
  • Mensajes: 103
  • Actividad:
    0%
  • Reputación 3
    • Ver Perfil
    • shad0whack
    • Email
  • Twitter: https://twitter.com/cmind33
« Respuesta #3 en: Agosto 26, 2016, 01:32:27 am »
Dale nomas, todo lo que sea para aportar bienvenido. Si necesitas una mano tan solo avisa.

Saludos.
Security Researcher / Reverse Engineer
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #4 en: Agosto 29, 2016, 09:00:27 pm »
Bueno, no se por que esto está en off topic, pero arrancamos con el primer post (el que puede lo manda a python? o capaz talleres underc0de, donde corresponda)

Vamos a usar python 2.7
Para hacer peticiones http vamos a usar la libreria requests. Es facil de usar y tiene buena documentacion (leanla cuando quieran hacer algo que no expliqué): No tienes permisos para ver links. Registrate o Entra con tu cuenta
Cuando vean codigo corranlo, no se queden con lo que yo les digo que hace. Tambien puede ser util y modificandolo para ver que pasa.

Todos saben que es http, no? Es el protocolo que se usa en las webs. https es http cifrado y para nuestro uso va a ser exactamente lo mismo porque eso lo maneja la libreria.
Cada vez que abris una web, el navegador se conecta al servidor y le hace una peticion. Cada vez que mandas un formulario, lo mismo. También cuando carga css, imagenes, javascript, etc. (si, se pueden reusar conexiones pero queda afuera de esto que voy a explicar).
La mayoria de estas peticiones son del tipo GET. En las peticiones get, todos los parametros se pasan en la url. A veces, cuando mandas un formulario se usa POST en lugar de GET. En POST, podes mandar datos que no van por la url, van por otro lado, y por lo tanto pueden ser mas grandes.
Hay mas métodos que no se suelen usar en webs.

Hagamos un get al index del foro:
Código: Python
  1. import requests #importa la libreria requests
  2.  
  3. resultado = requests.get("https://underc0de.org/foro/index.php") #dentro del modulo requests, busca la funcion get
  4. print resultado.text #el resultado es un objeto con varios metodos y propiedades, por ahora usamos .text
Como se hacer eso? está en el link que pasé de la libreria
Si da un error de la libreria requests, hay que instalarla con pip install requests

Eso nos va a imprimir el html del indice del foro. Esto del web scrapping se trata de sacar datos, asi que vamos a tratar de sacar la cantidad de usuarios en linea. Nos importa buscar donde está ese dato y que tiene alrededor, como para poder hacer que el programa lo identifique:
Código: HTML5
  1.                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta class="inline stats">
  2.                                 1738 Visitantes, 209 Usuarios (16 Arañas, 2 Oculto(s))
  3.                         </No tienes permisos para ver links. Registrate o Entra con tu cuenta>

Quiero sacar ese 209, que va a ir cambiando, y mostrarlo con el programa.
Hay varias formas de sacar eso. Nosotros no vamos a tratar de parsear el html, si no que vamos a hacerlo de una forma un poco mas bruta, con expresiones regulares. Vieron cuando en un buscador podes poner * y ? para que hagan de comodines? las expresiones regulares son algo asi, pero muchisimo mas potentes.
En python hay que usar el modulo re:
Código: Python
  1. import re
Documentacion:
No tienes permisos para ver links. Registrate o Entra con tu cuenta
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Se usa asi:
Cita de: python
re.search("regexp", "string")
Donde regexp es la expresion regular y string es el texto en el que va a buscar (en nuestro caso, resultado.text)
Por ejemplo:
Código: Python
  1. import re
  2. print re.search("planeta", "hola mundo")
  3. print re.search("mundo", "hola mundo")
  4.  
El primer print va a devolver None, porque no encontró "planeta" en "hola mundo" y el segundo va a devolver un objeto del tipo SRE_Match. Esto nos permite hacer un if:
Código: Python
  1. import requests
  2. import re
  3.  
  4. resultado = requests.get("https://underc0de.org/foro/index.php")
  5.  
  6.  
  7. if re.search("underc0de", resultado.text):
  8.     print "se encontro underc0de en el html del index"
  9. else:
  10.     print "no se encontro underc0de en el html del index"
  11.  
  12.  
  13. if re.search("elefante", resultado.text):
  14.     print "se encontro elefante en el html del index"
  15. else:
  16.     print "no se encontro elefante en el html del index"
  17.  

Hasta ahi es lo mismo que las funciones de busqueda en cadenas, pero podemos usar muchos caracteres que en una expresion regular tienen un significado especial.
Por ejemplo, un . va a ser un comodin que matchea con cualquier caracter:
Código: Python
  1. import re
  2.  
  3. regexp = "unde.c0de"
  4. texto = "underc0de"
  5. if re.search(regexp, texto):
  6.     print texto + " matchea con " + regexp
  7. else:
  8.     print texto + " NO matchea con " + regexp
  9.  
eso va a entrar por el true
Si quiero que el . sea interpretado como un . literal, hay que escaparlo asi: \.
Reemplazando en el ejemplo anterior las variables por esto, no va a matchear:
Código: Python
  1. regexp = "unde\.c0de"
  2. texto = "underc0de"
  3.  
Pero asi si:
Código: Python
  1. regexp = "unde\.c0de"
  2. texto = "unde.c0de"
  3.  

Con un * va a matchear el caracter anterior entre 0 e infinitas veces. Ejemplos:
Código: Python
  1. regexp = "under*c0de"
  2. texto = "underc0de"
  3.  
Código: Python
  1. regexp = "under*c0de"
  2. texto = "underrrc0de"
  3.  
Código: Python
  1. regexp = "under*c0de"
  2. texto = "undec0de"
Los tres matchean. También podemos combinar eso con un ., que matchearia casi cualquier cosa:
Código: Python
  1. regexp = ".*"
  2. texto = "underc0de"

Esto no nos está alcanzando, porque nosotros queremos extraer datos. Esto se hace envolviendo en parentesis la parte que va a matchear con los datos que queremos. Para ver que es lo que matchearon los parentesis, usamos el metodo .groups() del objeto que nos devuelve .search():
Código: Python
  1. import re
  2.  
  3. resultado = re.search("un(.*)de", "underc0de")
  4. print resultado.groups()
  5.  
El resultado:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
('derc0',)
Eso es una tupla, que en este caso tiene un solo resultado. Tambien pueden haber dos:
Código: Python
  1. import re
  2.  
  3. resultado = re.search("u(.*)r(.*)e", "underc0de")
  4. print resultado.groups()
Resultado:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
('nde', 'c0d')

Vamos con otro caso:
Código: Python
  1. import re
  2.  
  3. resultado = re.search("und(.*)de", "underc0de underc0de")
  4. print resultado.groups()
  5.  
  6.  
Que va a devolver? "erc0" o "erc0de underc0"? Resulta que el * va a matchear todo lo que pueda, asi que devuelve algo que probablemente no sea lo que buscamos:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
('derc0de underc0',)
Para que matchee lo minimo posible hay que agregarle un ?:
Código: Python
  1. import re
  2.  
  3. resultado = re.search("und(.*?)de", "underc0de underc0de")
  4. print resultado.groups()
  5.  

Esto es muy util, por ejemplo, si tenemos un html asi:
Código: HTML5
  1. <No tienes permisos para ver links. Registrate o Entra con tu cuenta id="sidebar"><No tienes permisos para ver links. Registrate o Entra con tu cuenta id="dato_que_queremos">EL DATO ACA</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta>
La expresion regular que queremos es esta:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
<div id="dato_que_queremos">(.*?)</div>Sin el ? tambien va a traer el </div>

Para acceder a cada dato particular podemos usar .group(ID+1), donde ID es el indice de la tupla. Hay que sumarle 1 porque .group(0) devuelve todo lo que matcheo, no solo lo que va entre parentesis.
Volvamos a lo de sacar el 209 de aca:
Código: HTML5
  1. <No tienes permisos para ver links. Registrate o Entra con tu cuenta class="inline stats">
  2.                                 1738 Visitantes, 209 Usuarios (16 Arañas, 2 Oculto(s))
  3.                         </No tienes permisos para ver links. Registrate o Entra con tu cuenta>

La expresion regular puede ser esta:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
Visitantes, (.*?) Usuarios
Y el codigo nos quedaria asi:
Código: Python
  1. import requests
  2. import re
  3.  
  4. web = requests.get("https://underc0de.org/foro/index.php")
  5. regexp = 'Visitantes, (.*?) Usuarios'
  6. resultado = re.search(regexp, web.text)
  7. print resultado.group(1)
  8.  
Eso nos imprime la cantidad de usuarios conectados

Ahora quiero sacar la lista de los ultimos mensajes publicados, esa que sale abajo. El html es asi:
Código: HTML5
  1.                                 <No tienes permisos para ver links. Registrate o Entra con tu cuenta id="ic_recentposts" class="middletext">
  2.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/la-ram/msg104688/?topicseen#msg104688" rel="nofollow">Re:Ocupar la memoria RAM de procesos inutiles</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/selohu/">selohu</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  3.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:14:59 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  4.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/kali-payload-y-no-ip-ataque-fuera-lan/msg104687/?topicseen#msg104687" rel="nofollow">Re:kali payload y no-ip ataque fuera lan</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/blackdrake/">blackdrake</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  5.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:11:33 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  6.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/android-duda-base-de-datos/msg104686/?topicseen#msg104686" rel="nofollow">Re:Android -  Duda Base de Datos para camareros en un bar</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/seth/">seth</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  7.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:10:00 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  8.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/dudas-sin-aclarar/msg104685/?topicseen#msg104685" rel="nofollow">Re:Empezar en las ramas de Phishing y Programación</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/blackdrake/">blackdrake</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  9.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:08:29 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  10.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/stub-limpio-server-detectado-por-que/msg104684/?topicseen#msg104684" rel="nofollow">Re:stub limpio server detectado, por que?</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/blackdrake/">blackdrake</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  11.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:06:05 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  12.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/symlink/msg104683/?topicseen#msg104683" rel="nofollow">Re:Symlink</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/blackdrake/">blackdrake</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  13.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 07:03:10 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  14.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/que-me-aconsejan-en-ventiladores-y-muestras-de-mis-datos/msg104682/?topicseen#msg104682" rel="nofollow">Re:Que me aconsejan en ventiladores y muestras de mis datos.</No tienes permisos para ver links. Registrate o Entra con tu cuenta></No tienes permisos para ver links. Registrate o Entra con tu cuenta> por <No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/profile/selohu/">selohu</No tienes permisos para ver links. Registrate o Entra con tu cuenta> (<No tienes permisos para ver links. Registrate o Entra con tu cuenta href="https://underc0de.org/foro/dudas-generales-121/">Dudas y pedidos generales</No tienes permisos para ver links. Registrate o Entra con tu cuenta>)</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  15.                                         <No tienes permisos para ver links. Registrate o Entra con tu cuenta><No tienes permisos para ver links. Registrate o Entra con tu cuenta>Hoy</No tienes permisos para ver links. Registrate o Entra con tu cuenta> a las 06:35:01 pm</No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  16.                                 </No tienes permisos para ver links. Registrate o Entra con tu cuenta>

La complicacion es que queremos matchear varios posts con una sola regexp, para eso vamos a usar re.findall():
Código: Python
  1. import requests
  2. import re
  3.  
  4. web = requests.get("https://underc0de.org/foro/index.php")
  5. regexp = '<dt><strong><a href=".*?" rel="nofollow">(.*?)</a></strong>'
  6. resultado = re.findall(regexp, web.text)
  7. print resultado
  8.  
Presten atencion a que usamos .*? para que matchee con cualquier url, pero no nos interesa capturarlas.
Nos va a imprimir una lista. Cada elemento de esa lista es uno de los matches:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
[u'Re:[Ayuda] Window no se monta en el grub (est\xe1 cifrado)', u'Re:Saber ID De Un objeto JQuery ?', u'Re:Ocupar la memoria RAM de procesos inutiles', u'Re:kali payload y no-ip ataque fuera lan', u'Re:Android -  Duda Base de Datos para camareros en un bar', u'Re:Empezar en las ramas de Phishing y Programaci\xf3n', u'Re:stub limpio server detectado, por que?']
Ahora, si agregamos parentesis para capturar las urls nos va a devolver una lista de tuplas, donde cada tupla tiene la url y el titulo del post:
Código: Python
  1. import requests
  2. import re
  3.  
  4. web = requests.get("https://underc0de.org/foro/index.php")
  5. regexp = '<dt><strong><a href="(.*?)" rel="nofollow">(.*?)</a></strong>'
  6. resultado = re.findall(regexp, web.text)
  7. print resultado
  8.  
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
[(u'https://underc0de.org/foro/dudas-generales-121/(ayuda)-window-no-se-monta-en-el-grub-(-esta-cifrado)/msg104690/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104690', u'Re:[Ayuda] Window no se monta en el grub (est\xe1 cifrado)'), (u'https://underc0de.org/foro/dudas-generales-121/saber-id-de-un-objeto-jquery/msg104689/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104689', u'Re:Saber ID De Un objeto JQuery ?'), (u'https://underc0de.org/foro/dudas-generales-121/la-ram/msg104688/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104688', u'Re:Ocupar la memoria RAM de procesos inutiles'), (u'https://underc0de.org/foro/dudas-generales-121/kali-payload-y-no-ip-ataque-fuera-lan/msg104687/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104687', u'Re:kali payload y no-ip ataque fuera lan'), (u'https://underc0de.org/foro/dudas-generales-121/android-duda-base-de-datos/msg104686/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104686', u'Re:Android -  Duda Base de Datos para camareros en un bar'), (u'https://underc0de.org/foro/dudas-generales-121/dudas-sin-aclarar/msg104685/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104685', u'Re:Empezar en las ramas de Phishing y Programaci\xf3n'), (u'https://underc0de.org/foro/dudas-generales-121/stub-limpio-server-detectado-por-que/msg104684/?topicseen;PHPSESSID=ub91qif2cdbng1itkjomd0g646#msg104684', u'Re:stub limpio server detectado, por que?')]

Les dejo como ejercicio hacer una funcion que devuelva una lista con todos los nombres de los usuarios que aparecen abajo de " Usuarios activos en los últimos 25 minutos:", llamarla y mostrar el resultado. Cuando lo tengan o se traben posteen el codigo

Puede ser que tengan que escapar algunos caracteres especiales, aunque lo dudo. Si hace falta, acuerdense de que es escapan con \
También puede ser que hagan una expresion regular que matchee con mas datos que los que buscamos. Por ejemplo, puede ser que traiga los nombres de los usuarios que salen al lado de los titulos de los posts. Pueden tratar de hacer una expresion regular mas compleja, o capaz dos: una que matchee el div en el que estan los datos y otra que saque los usuarios de ahi adentro.

« Última modificación: Agosto 29, 2016, 09:16:31 pm por seth »

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #5 en: Septiembre 07, 2016, 11:35:51 am »
Que raro que ya vi dos consultas en el irc sobre esto, pero nadie se pone a practicar

Conectado Zentraedi

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    16.67%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #6 en: Septiembre 07, 2016, 05:14:31 pm »
Que tal, interesante lo que has compartido.
En el metodo search() estamos buscando un match, por lo que debemos saber de que esta rodeado y atrapar ese texto, al menos asi lo entendi.

Lo que no entendi es como el metodo findall() sabe que quiero ver los post y no la lista de usuarios?

En search() le aclaramos que queremos ver pero en findall() no se llega a explicar como sabe lo que quiero ver exactamente.

Perdon si es una pregunta muy basica.

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #7 en: Septiembre 08, 2016, 12:53:53 pm »
Se lo pasas en el primer parametro.

Estos dos codigos hacen lo mismo:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
regexp = '<dt><strong><a href="(.*?)" rel="nofollow">(.*?)</a></strong>'
resultado = re.findall(regexp, web.text)
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
resultado = re.findall('<dt><strong><a href="(.*?)" rel="nofollow">(.*?)</a></strong>', web.text)
fijate que la expresion regular para capturar los usuarios es distinta a la que captura los links

Desconectado Subzer

  • *
  • Underc0der
  • Mensajes: 34
  • Actividad:
    0%
  • Reputación 0
  • Python is my weapon and you are my target.
    • Ver Perfil
« Respuesta #8 en: Septiembre 08, 2016, 09:04:18 pm »
Bueno para seguir un poco con el taller aquí les pongo mi code con la pequeña tarea que seth nos dejó.
Me tome la molestia de desarrollarlo un poco ya que hace años que no programo y estoy retomando todo nuevamente y bueno como ven, he vuelto a la comunidad.

Aqui les dejo el code:
Código: Python
  1. # -*- coding: UTF-8 -*
  2. import requests, re
  3.  
  4. url = "https://www.underc0de.org/foro/index.php"
  5. web = requests.get(url)
  6.  
  7. def staff_user():
  8.         staffuser = '<a href=".*?" style="color: #FF8000;">(.*?)</a>,'
  9.         resultado = re.findall(staffuser, web.text)
  10.         print '[+] Staff LIST: ' + '\n'
  11.         for users in resultado:
  12.                 print users.encode('utf-8') + ''
  13.  
  14. def normal_user():
  15.         normaluser = '<a href=".*?">(.*?)</a>,'
  16.         resultado = re.findall(normaluser, web.text)
  17.         print '\n' + '[+] Users LIST: ' + '\n'
  18.         for users in resultado:
  19.                 print users.encode('utf-8') + ''
  20.                
  21. def online_users():
  22.         online = 'Visitantes, (.*?) Usuarios'
  23.         resultado = re.search(online, web.text)
  24.         print '** Online users' +' ['+str(resultado.group(1))+']'+' **' + '\n'
  25.        
  26. if __name__ == '__main__':
  27.         online_users()
  28.         print 'ONLINE USERS: ' + '\n'
  29.         staff_user()
  30.         normal_user()
  31. else:
  32.         exit(0)
  33.  

Basicamente lo que hace es mostrar la cantidad de usuarios conectados, igual como mostró seth más arriba e imprime una lista de usuarios conectados, tanto 'staff' como usuarios normales.

Tengo un pequeño problema en ese code que cuando lo ejecuto también me imprime foros y subforos de la pagina, como por ejm: 'Pentesting', 'shell', hasta me imprime la licencia del foro y me lo imprime como 'SMF &copy; 2015' a ver si ustedes pueden editarlo y decirme que hice mal, saludos y sigan con el taller!

PABLO ESCOBAR.

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #9 en: Septiembre 09, 2016, 12:54:41 am »
Bien, el problema es que esta regex matchea mas cosas de las que deberia:
<a href=".*?">(.*?)</a>

Fijate que todos los links a los perfiles de los usuarios empiezan con 'No tienes permisos para ver links. Registrate o Entra con tu cuenta', podes incluir eso en lugar de reemplazarlo por .*?
O sea, el .*? lo vas a tener que dejar porque no sabes como sigue el link, pero podes matchear solo los que van a perfiles

Eso tambien te va a matchear links como este:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
<p><span><a href="https://underc0de.org/foro/profile/cybervaca/">cybervaca</a> en <a href="https://underc0de.org/foro/ingenieria-inversa/(-net)-crackme-by-chemitazzhd-c/msg0/?boardseen#new" title="Re:[.NET] CrackMe By ChemitaZzHD - C#">Re:[.NET] CrackMe By Che...</a></span><br />

Una solucion: todos los usuarios que nos interesan son los que estan adentro de <p class="inline smalltext">. Podes matchear primero lo que esta adentro de ese elemento y despues con ese resultado correr las demas regexp

Conectado Zentraedi

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    16.67%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #10 en: Septiembre 12, 2016, 08:00:15 pm »
Hoy pude conectarme e hice la tarea del taller jajaja
me costo mucho ya que no manejo python pero aqui esta

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
import requests
import re
web = requests.get("https://underc0de.org/foro/index.php")
regexp = '<a href="https://underc0de.org/foro/profile/.*?">(.*?)</a>'
resultado = re.findall(regexp, web.text)
print resultado

gracias por la enseñanza muy interesante lo aprendido, espero que sigan las clases en este taller, Saludos.

PD: el codigo muestra en pantalla lo siguiente:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
[u'Gabriela', u'USER1696960', u'Gabriela', u'matitk', u'Stiuvert', u'Nobody', u'selohu', u'S@nde', u'str0nasfck', u'seth', u'unkdown', u'hati', u'circunsxik', u'cybervaca', u'else\xf1orx', u'EPSILON', u'JoanSerna', u'blackdrake', u'Stiuvert', u'Cl0udswX', u'Cl0udswX', u'Dr__Nesto', u'BadB0y_4', u'graphixx', u'cnfs', u'Expermicid', u'ExtaZys', u'Expermicid', u'79137913', u'Expermicid', u'Doddy', u'grep', u'Zentraedi', u'79137913', u'79137913', u'rollth', u'edgarito_2012', u'graphixx', u'ExtaZys', u'Expermicid', u'JJx', u'Subzer', u'graphixx', u'rush', u'ThePlus', u'79137913', u'Flame', u'DeBobiPro', u'Vasyyyl', u'DeBobiPro', u'Hu3c0', u'DeBobiPro', u'graphixx', u'graphixx', u'DeBobiPro', u'austro180', u'ANTRAX', u'Slenderhack', u'rreedd', u'PikachuDorado', u'DiegoTk', u'PikachuDorado', u'Uservzk80', u'Cygog', u'Digital Shadow', u'Cl0udswX', u'Satyricon', u'TioNacho', u'selohu', u'selohu', u'Subzer', u'else\xf1orx', u'Stiuvert', u'Stiuvert', u'Stiuvert', u'julianamorenot', u'79137913', u'po6xsecpo', u'voltage', u'fbian220', u'selohu', u'bridth', u'Subzer', u'Flamer', u'BlackBlex', u'ECVS', u'tondrax', u'matitk', u'rush', u'kronos.boca', u'Jimeno', u'Once', u'julianamorenot', u'Zentraedi', u'neodementor', u'ghro77', u'AJOP', u'ANTRAX', u'mingoandroid', u'cordobez10', u'pema94', u'Falsifikeitor', u'morodog', u'Maxfaider', u'Cr1m1n4l', u'jorge705', u's4ull', u'black magdala', u'TaylorSwift', u'nexusz', u'else\xf1orx', u'Stiuvert', u'noxonsoftwares', u'drotha2', u'ajcomputerses', u'VinC90', u'Kevin Howard', u'diosjeremy', u'adragon', u'3x0rt', u'Kzuma', u'puntoCL', u'roadd', u'zaphiel', u'zydar', u'dehombreadios', u'antoniocr', u'rosav', u'Bebeto', u'graphixx', u'alfred', u'Empty glass', u'Stuxnet', u'jambres', u'Ley20Mil', u'Tatoluckyfox', u'jasan1996', u'Carvachorum', u'jero433', u'DiegoTk', u'UnK', u'neuk', u'Gabriela', u'rollth', u'R.JimSor', u'blackdrake', u'iatsm', u'guilreto', u'Rony1545', u'ChitoEBM', u'manoverde', u'Vasyyyl', u'Hxgm', u'USER1696960', u'Unname', u'Jesuss', u'viagr4', u'roserrva', u'jose angel', u'Darksen', u'FUMATRONIC', u'Bishop', u'Lapazouhakcs', u'zahay', u'q3rv0', u'djbeat', u'cborgon', u'salem', u'koopa2', u'isaac_calvet', u'blueksyx', u'tesla', u'Kode', u'hum4n3xpl01t', u'dannekmr', u'mortico10', u'tito_chua', u'Forken', u'iamcholo', u'xavicibi', u'Joni2012', u'Chriseric', u'rab.', u'Yoskor', u'Cl0udswX', u'stegic', u'Keycarty', u'Nachoct', u'boguies', u'Slenderhack', u'jsDotx3', u'HomeGuard', u'Satyricon', u'aforistis', u'bruno45', u'coloradoxx', u'hati', u'pentestbox', u'harry_arg', u'M1ndCr4ck', u'ubbosatlahlk', u'gerard14', u'Bartrack', u'B4TB0YFUCK3R', u'DIANA YIRET', u'jonycancer', u'pirula01', u'BadB0y_4', u'kreator2178', u'Pytness', u'luff1', u'DarkMulero', u'guerraypaz46', u'Goyo', u'EvilSoft', u'glorytime', u'AnonimoArc', u'Zeroax', u'nansoft', u'yankele', u'marcxiri11', u'terminator2016', u'GOHANCKZ', u'linuxblt', u'zenzey909', u'Cronos', u'moonify', u'Valst', u'TR31N0RD', u'slashh865', u'judas6409', u'Adrian72112', u'beto_201', u'TheBeyonder', u'peleon02', u'djbob', u'Pricker', u'Cr4id3r', u'Alchemist', u'NyxKazuya', u'KR1ST4N', u'troki2011', u'inaki19899', u'lucas.dega', u'Byakko', u'ricci2diaz', u'santinho', u'zadeno3', u'ermaquina97', u'wblack', u'jfr4n', u'undercodeuser', u'srzeta', u'DarkXploitz', u'EnricCat', u'Blank', u'13tm3nt3r', u'ro0tmag', u'xxxcoenxxx', u'jsuarez1965', u'internauta', u'blanix', u'lamepie', u'wactor', u'rus1365', u'circunsxik']
hay una forma de quitar esa  u'(nombre de usuaruio), no pude quitar la u', pero al menos salio el objetivo, gracias.

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #11 en: Septiembre 12, 2016, 08:23:07 pm »
La u está bien, indica que es un string unicode
Si metes un for que recorra la lista y muestre los strings uno por uno, no va a salir

Fijate que te apsa lo mismo que a subzer, te está trayendo datos de mas
En tu caso, trae gabriela varias veces, debe ser porque hizo posts y salen aca: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Conectado Zentraedi

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    16.67%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #12 en: Septiembre 12, 2016, 08:47:15 pm »


No tienes permisos para ver links. Registrate o Entra con tu cuenta
Fijate que te apsa lo mismo que a subzer, te está trayendo datos de mas
En tu caso, trae gabriela varias veces, debe ser porque hizo posts y salen aca: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Si recien me doy cuenta de eso, se repiten varios usuarios, vere como resolverlo.

Desconectado skwlk

  • *
  • Underc0der
  • Mensajes: 12
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil
« Respuesta #13 en: Octubre 02, 2016, 03:11:53 am »
Esta es una solución alternativa a usar expresiones regulares. Para el caso de web scrapping, a mi parecer el uso de las expresiones regulares no es de lo más adecuado ni tampoco sano como para permitirnos conservar la integridad mental  ;D

En este ejemplo uso etree y xpath

Código: Python
  1. import urllib2
  2. from lxml import etree
  3.  
  4. def get_users(html):
  5.     parsedHTML = etree.HTML(html)
  6.     pelement = parsedHTML.xpath('//div[@id="upshrinkHeaderIC"]/p[@class="inline smalltext"]')[0]
  7.     return([href.split("/")[-2] for href in pelement.xpath("a/@href") if "profile" in href])
  8.  
  9.  
  10. if __name__ == "__main__":
  11.     response =  urllib2.urlopen("https://underc0de.org/foro/index.php")
  12.     print(get_users(response.read()))

Código: Bash
  1. ['1410', 'TheAssassinExp', 'arthusu', 'Jonydakid', 'str0nasfck', 'boguies', 'skrillex', 'zenzey909', 'AFelipeTrujillo', 'skwlk', 'wilkin07', 'iamcholo', 'grep', 'Elixus', 'coke951', 'Victimous', 'cnfs', 'Zentraedi', 'Gabriela', 'nkmil', 'Amorrua', 'slipknotoy', 'mariodos', 'rejeanan', 'andrei_phantom', 'BlackBlex', 'xrahitel', 'DaLeXx007', 'DammZ', 'Stuxnet', 'T3mpor4lGN', 'javichoooz', 'YENA', 'ceroMee', 'blackdrake', 'luff1', 'dtubio', 'TioNacho', 'drakoniano', 'gerard14', 'blacksucces', 'servventas', 'Pablo2011', 'blanco', 'erguli', 'noxon', 'graphixx', 'Bernatixer', 'creeper22', 'Rapzus', 'quino32', 'Stiuvert', 'phr4ckl0t', 'R.JimSor', 'roberton84', 'ice.modding', 'Flame', 'theplageblack', 'Joni2012', 'antoniocr', 'japheth1518', 'LionSec', 'Gho0st', 'hack066', 'roadd', 'selohu', 'catami61', 'PikachuDorado', 'Eduardez', 'Se%C3%B1orQ', 'hum4n3xpl01t', 'EPSILON', 'drok3r', 'tito_chua', 'Chriseric', 'cborgon', 'pab%20mac', 'VinC90', 'L3gacy', 'RICY', 'ninfaaruna', 'troki2011', 'Yoskor', 'rollth', 'Flemon', 'pablormago', 'Hu3c0', 'alfred', 'Pistojo', 'darkside85', 'hati', 'nitro_x_net', 'rodanet', 'adragon', 'Meteorrr', 'julen', 'Hactot', 'Rafaelpb14', 'Nkizux', 'Blank', 'Carvachorum', 'lestherelyhuneth123', 'AndresMaicho', 'wicope', 'AndrewMa', 'BadB0y_4', 'caradepoio', 'RickSanchez', 'zaphiel', 'redferne', 'Nik', 'wblack', 'mbwun28']
  2.  


Saludos

Desconectado noah_elbec

  • *
  • Underc0der
  • Mensajes: 2
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: noah_elbec@hotmail.com
« Respuesta #14 en: Agosto 20, 2017, 02:23:06 am »
Yo lo resolví de esta forma: decidí separar el bloque donde están los usuarios conectados para hacer la búsqueda de expresiones regulares solamente en esa parte, de forma que evitamos obtener resultados repetidos ya que hay enlaces a los perfiles de los usuarios en casi todo el index, también, muchas gracias seth y a todos los que aportaron con su respuesta, este taller me ha ayudado bastante.

Código: Python
  1. import requests
  2. import re
  3.  
  4. resultado = requests.get('https://underc0de.org/foro/index.php')
  5.  
  6. resultado = resultado.text
  7.  
  8. # Obtengo el indice de la cadena Usuarios en linea para realizar la busqueda desde ese punto en adelante
  9. # Y asi evitar obtener resultados repetidos
  10. encuentra1 = resultado.find('Usuarios en Línea')
  11.  
  12. bloque = resultado[encuentra1:]
  13.  
  14. regex = '<a href="https://underc0de.org/foro/profile/.*?>(.*?)</a>'
  15.  
  16. lista_usuarios = re.findall(regex,bloque)
  17.  
  18. print(lista_usuarios)

El resultado es este:
Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
['79137913', 'SirVitin', 'Gabriela', 'noah_elbec', 'th3binary', 'dhenux', 'nicolasheise', 'darkalinow', 'Flame', 'Nik', 'madrileña',
'Bael', 'S1ST3MG4M3R7', 'ghostshadow666', 'grep', 'Jackaiser', 'Decode', 'puntoCL', 'noxonsoftwares', 'Stuxnet', 'Yustuz', '¡Gabriel!
', 'animanegra', 'kuarsa', 'scalvhh', 'Stiuvert', 'Christian Fer', 'ampali', 'Yuki', 'WilliamONeill', 'HckH3x', 'Amorrua', 'noyka', '
xyz', 'corpsebalu', 'marcchile', 'user_en1gm4', 'David Bassara', 'phr4ckl0t', 'zenzey909', 'Andrey', 'viobano', 'Cr4id3r', 'n0z', 'Gn
0m3', 'edgoes', 'M03's']

 

¿Te gustó el post? COMPARTILO!