Foro de elhacker.net

Comunicaciones => Android => Mensaje iniciado por: @XSStringManolo en 2 Mayo 2020, 08:43 am



Título: Scraper cutre de los mensajes recientes del foro.Java, Js, Ncat, WebView, Termux
Publicado por: @XSStringManolo en 2 Mayo 2020, 08:43 am
Código
  1. package com.stringmanolo.elhrecent;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.webkit.WebView;
  6. import android.webkit.WebChromeClient;
  7. import android.webkit.JsResult;
  8. import android.os.Handler;
  9. import com.stringmanolo.elhrecent.R;
  10.  
  11. /*
  12.  
  13. Este código ha sido desarrollado y probado en el siguiente entorno:
  14.  
  15. Sistema: Android.
  16.  
  17. IDE: Java N-IDE.
  18.  
  19. Software adicional: Termux/netcat y google chrome.
  20.  
  21. */
  22.  
  23.  
  24. /*
  25.  
  26. Como funciona?
  27. Pones un servidor a la escucha y abres esta aplicación.
  28.  
  29. Como compilar?
  30. Debes crear un nuevo proyecto para Android y añadir el codigo.
  31.  
  32. Este es el MainActivity.java
  33.  
  34. Añade también el permiso de acceso a internet en el manifest y añade un webview en el activity_main.xml con id navegador
  35. android:id="@+id/navegador"
  36.  
  37. */
  38.  
  39. public class MainActivity extends Activity {
  40.  @Override
  41.  protected void onCreate(Bundle savedInstanceState) {
  42.    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
  43.  
  44. /* id.navegador definido en activity_main.xml */
  45.    final WebView Navegador;
  46.    Navegador = (WebView)findViewById(R.id.navegador);
  47.  
  48. /* Habilita javascript */ Navegador.getSettings().setJavaScriptEnabled(true);
  49.  
  50. /* Utiliza chrome de cliente HTTP. */
  51.    Navegador.setWebChromeClient(new WebChromeClient() {
  52.      @Override
  53.      public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
  54. /* Habilita el alert */
  55.        return super.onJsAlert(view, url, message, result);
  56.      }  
  57.    });
  58.  
  59. /* Cambia el userAgent para que no salga el confirm de tapatalk */ Navegador.getSettings().setUserAgentString("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36");
  60.  
  61. /* Carga la página con mensajes recientes del foro. */ Navegador.loadUrl("https://foro.elhacker.net/recent.html");
  62.  
  63. /* Handler para zumbar el script en el contexto de la página del foro. Con espera asíncrona. */
  64.    final Handler jsh = new Handler();
  65.    jsh.postDelayed(new Runnable() {
  66.      @Override
  67.      public void run() {
  68.  
  69. /* Código desglosado:
  70.  
  71. javascript:
  72. Pseudoprotocolo. Permite ejecutar el script en el contexto de la página actual.
  73.  
  74. document.querySelectorAll(\".bordercolor\");
  75. Obtiene todos los elementos de la página con la clase bordercolor.
  76.  
  77. tags+=links[i].outerHTML;tags+=\"<p></p>\";
  78. Obtiene el código de todos los elementos en un string y los separa utilizando etiquetas <p>.
  79.  
  80. return \"SFRUUC8xLjEgMjAwIE9LDQoNCg==\" +''+btoa(tags);
  81. En la llamada a la funcion Scrap() retorna un ok status 200 codificado en base64 y codifica a base64 el código de todos los elementos obtenidos de la página.
  82.  
  83. r.open('GET','http://127.0.0.1:8080/q?codigo='+Scrap(), 1);
  84. Envia una petición GET a la dirección 127.0.0.1 puerto 8080 el parámetro y en la propia url el retorno de la función Scrap()
  85.  
  86. */
  87. Navegador.loadUrl("javascript:function Scrap(){var links=document.querySelectorAll(\".bordercolor\");var tam=links.length;var tags=\"\";for(var i=1;i<tam;++i){tags+=links[i].outerHTML;tags+=\"<p></p>\";}return \"SFRUUC8xLjEgMjAwIE9LDQoNCg==\" +''+btoa(tags)}r=new XMLHttpRequest();r.open('GET','http://127.0.0.1:8080/q?codigo='+Scrap(), 1);r.send();r.onreadystatechange=function(){r.readyState==4&&r.status==200?alert(r.responseText):1}");  
  88.      }
  89.    }, 15000); /* Esperar 15 segundos para conexiones lentas. */
  90.  }
  91. }
  92. /* Se debe poner a la escucha previamente un servidor en la dirección y puerto que asignes en el script.
  93.  
  94. Yo utilizo el siguiente comando:
  95.  
  96. $ netcat -l -v 127.0.0.1 8080 | grep -Po '(?<=(codigo=)).*(?=HTTP)' | base64 -d > codigoH.html | netcat -l -k 127.0.0.1 8081 < codigoH.html | echo -e "\r\n\r\n\r\n"
  97.  
  98. Comando desglosado:
  99.  
  100. netcat -l -v 127.0.0.1 8080
  101. Pone a la escucha y logea la actividad en la ip 127.0.0.1 y puerto 8080. Según tu versión de netcat puede cambiar la sintaxis.
  102.  
  103. | grep -Po '(?<=(codigo=)).*(?=HTTP)'
  104. Obtiene solo el string entre codigo= y HTTP. Es decir, solo el 200 ok status y el código extraido de la página codificado en base64.
  105.  
  106. | base64 -d > codigoH.html
  107. Decodifica de base64 y guarda el stream en un archivo codigoH.html
  108.  
  109. | netcat -l -k 127.0.0.1 8081 < codigoH.html
  110. Pone a la escucha el netcat también en la dirección 127.0.0.1 con puerto 8081 y responde con una petición y el contenido html. De esta forma netcat actual de servidor válido para el navegador. Al poner http://127.0.0.1:8081 recibes el código. Según tu navegador puede que necesites preformatear el documento en un html válido y añadirle algunas cabeceras o etiquetas meta para la codificación.
  111.  
  112. echo -e "\r\n\r\n\r\n"
  113. Añade el fin de la petición para que el navegador carge la página y rompe el netcat.
  114.  
  115. */


Hice un scraper cutre para ver los últimos mensajes del foro en el Android.

Se le puede meter el runable como servicio y arrancar al inicio para tenerlo 24/7. Hacer un intento desde un broadcast reciber, meterle un systemclock.pause, cambiar el netcat y demás por sockets, mostrar el código en una preview con notificaciones o en plan widget o ventana... También podeis meterle una interfaz de javascript y controlar el navegador desde el netcat con la interfaz, el pseudoprotocolo, el xhr y el eval. Por ejemplo podrías darte un llama cuelga automáticamente desde un Android a otro cuando alguien publique un nuevo tema en un foro que te interesa xD

Puedes también enchufarle por pseudoprotocolo etiquetas style a lo bruto después del for
tags+=\"<style>td{border-left: 3px solid red;background-color:lightgrey;}</style>\";

Puede reusar la misma metodología para enviar forms, o hacer otras tareas con javascript en otras páginas.

Igual más alante lo mejoro para que se pueda automatizar con interfaz en múltiples páginas.