Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DtxdF

#661
¿Qué arquitectura es su procesador? ¿64 bits o 32 bits? ¿Cuál es la arquitectura de la aplicación? ¿Tiene desactivado el filtro Smartscreen?.

Haga esa pequeña investigación y puede que solucione el problema, pero lo más probable es que tenga que ver con esas preguntas.

PD: Son sólo conjeturas, espero que alguien le ilumine.

~ DtxdF
#662






ó


~ DtxdF
#663
CitarSegún entendí. Hay un usuario que ha hecho una redirección tipo MITM, en la cual todos los pedidos destinados a su server, primero pasan por los de él.

Es lo primero que pensé cuando descifré la duda, pero creo que también existe otra posibilidad, un proxy.

Hasta ahora entiendo que existen estos tres usuarios (los marcaré con letras :-D):

A): El usuario cliente
B): El servidor que el cliente desea conectarse
C): El servidor proxy o la máquina atacante realizando un MITM

Sin importar si el servidor C sea una máquina reenviando los paquetes por medio de un MITM o no, y como su servidor (A) es programado por usted mismo, puede ser creativo e integrar en la propia aplicación un sistema de autenticación y validación. Por ejemplo, podría firmar y cifrar los datos enviados con un algoritmo asimétrico (como RSA, DSA, etc), además del sistema de autenticación.

Claro que si es un MITM debe tener cuidado en compartir la clave pública, porque si el atacante es ingenioso puede no enviar el paquete legitimo con la clave, sino que envía el suyo propio con su propia clave pública y cifra los datos con la clave capturada para que no sea detectado :-)

Además de lo mencionado (el sistema de autenticación y validación), puede hacerlo a través de la dirección IP y la MAC (en caso de ser en la misma LAN), pero igualmente se pueden falsificar :-)

Aunque debería escuchar al compañero si desea tener seguridad en sus sistemas.

~ DtxdF
#664
Que hermosura de aporte, es en serio, me encanto el vídeo donde el Drone vuela por los edificios :-O

~ DtxdF
#665
Un USB Dumper es una utilidad que copia (o extrae) todo los archivos que encuentre en un dispositivo (mayormente extraible, como un USB), una vez se conectó al ordenador. Éste tiene como primer objetivo el robo de información, pero puede darse un caso un tanto excepcional de un análisis o el respaldo de la información del mismo dispositivo.


La siguiente utilidad es un fork del usuario @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login que acabo de terminar, y pueden encontrar el post You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.

Repositorios:


  • Fork: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • Original: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Características de esta versión


  • Eficiencia: Es realmente rápido
  • Recursividad: Además de copiar todos los archivos que pueda, también crea las carpetas según el nombre de éstas en el directorio de salida
  • El pingüino se asoma por la ventana: Funciona tanto para Windows como para GNU/Linux
  • Múltiples objetivos: Los objetivos se definen en config.h según el sistema operativo y se pueden colocar más de uno si se desea
  • Fácil: Es realmente fácil, simplemente ejecutando el nombre del ejecutable, el parámetro ( -t ) para seleccionar la ruta y listo, empiece a extraer todos esos datos del dispositivo víctima, mientras que para *nix si se desea se puede usar el script (que es copiado en la instalación a '/etc/init.d') para crear un daemon y ejecutarlo en segundo plano.

Instalación:

Decarga:

Código: bash
git clone https://github.com/DtxdF/UsbDumper.git
cd UsbDumper


GNU/Linux

Código: bash
sudo make -f linux.mk install
man UsbDumper # UsbDumper -h


Nota: Por defecto se instala e inicia el daemon en "/etc/init.d", si desea puede apagarlo y deshabilitarlo (o borrarlo)

Código: bash
systemctl disable UsbDumper
systemctl stop UsbDumper
# Para eliminarlo
rm -f /etc/init.d/UsbDumper


El daemon no es necesario, es para que se mantenga oculta, pero hay diferentes maneras de poder lograrlo, como usar cron, usar nohup o una variedad de herramientas de apoyo. ¡ES LIBRE DE USAR LA QUE DESEA!

Windows

Código: bash
mingw32-make -f windows.mk
UsbDumper.exe -h


Notas


  • El programa termina su ejecución cuando se haya completado la extración de cada dispositivo víctima
  • Debe tener en cuenta la primera nota para el daemon, el daemon es usado para ocultar lo que se está haciendo.
  • Cuando se termine de extraer todos los archivos, el programa tomará en cuenta la ruta como identificador para no volver a copiar los archivos
  • El archivo config.h es el encargado de verificar los dispositivos víctimas, y es el usuario el que decide qué dispositivos serán los que se desea extraer los archivos

Capturas de pantalla

Instalando

Copiando los archivos del dispositivo víctima

Terminando la extracción

Actualizado: El programa se ha actualizado para agregar soporte Unicode tanto para Windows como Linux, además de otros pequeños errores o inconvenientes.

~ DtxdF
#666
Es que el código que te proporcionó ANTRAX está hecho en Java, por lo que tendrías que traducirlo.

~ DtxdF
#667
Las herramientas de Kali Linux son para el pentesting, no son para un aprendizaje un tanto profundo, o viendo de forma analógica: El arsenal de un policía, de esos de la vieja escuela.

Para entender mejor por qué los servicios que tienen medidas de seguridad detectan los troyanos conocidos (algunas veces ni tan conocidos o nulos), lea sobre un lenguaje de programación, trate de crear un runpe (servirá para lo siguiente), y un crypter (éste es el que le explicará un poco mejor todo); Además de los AVs (Anti Virus), cómo: La heuristica, las medidas de seguridad para la prevención y protección (ya le mencioné una), etc, etc, etc.

Si quiere para comenzar haga un crypter "Scan Time" (que se ejecuta al desencriptarse en el disco) y luego un "runtime" (éste se hace en la memoria y más complejo) para comenzar.

Por cierto, para ayudarlo, mire el runpe que hizo números: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

~ DtxdF
#668
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

En la misma página que compatió explica el significado de los archivos, además de la información que le proporcionó nuestros compañeros.

Citarno solo no tengo aplicaciones de facebook, sino tampoco ninguna cuenta en ningún servicio asociado, a excepción de Whatsapp.

No tiene Internet en el móvil, ¿pero usa Whatsapp?, ilógico. Pero contrasta lo que dice aminanegra en su caso, del por qué tiene ese archivo.

Citarni me he conectado a una red wifi en esa zona

Lo que quiere decir que sí se ha conectado en otra, ¿me equivoco?.

Conclusión: No se preocupe, todo es parte de las aplicaciones de uso diario; preocupese si ha descargado e instalado aplicaciones en tiendas de tercero, si ha compartido el móvil o lo busca la interpol (Bromeo  ;D).

~ DtxdF
#669
A ti amigo, es un placer como siempre :D

~ DtxdF
#670
Excelente, fantástico, simple y hermoso.

+1  ;D

~ DtxdF
#671
En el día de hoy les presentare una fantástica herramienta que ha creado nuestro compañero @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login . Se hace llamar LeakChecker y su objetivo es mostrarnos si nuestras credenciales han sido filtradas a una base de datos, y lo mejor es que se puede hacer todo el proceso a través del teléfono.


La herramienta es de código abierto, pero nuestro compañero también nos proporcionó el APK e incluso, ésta no requiere permisos especiales para poder usarla. Dicho lo anterior tenemos dos opciones para descargarla: Clonar el repositorio o Descargar directamente el APK.

Clonando el repositorio:

Código: bash
git clone https://github.com/4nimanegra/LeakChecker.git
cd LeakChecker


En nuestro caso, usemos el APK:

Enlace de la descarga: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Una vez ejecutada:


La instalamos y una vez finalizada, disponemos de un formulario, ahí es donde tenemos que colocar nuestra dirección de correo electrónico para verificar si nuestras credenciales fueron expuestas:


Como se puede observar mis credenciales no están expuestas  ;D. También se puede observar la facilidad de la herramienta y lo mejor, es que podemos transportarla en nuestro bolsillo.

Algo que se debe tener en consideración es que al igual que el creador, la herramienta es ética, no procura revelar información sensible, por lo que sólo se mostrarán algunos caracteres y tendrá un tiempo de espera de 60 segundos por cada solicitud, suficiente para verificar.


~ DtxdF
#672
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

¿Por dónde se está conectando? ¿Un script,? ¿Por la consola?

Si es por la consola:, osea simplemente ejecutando 'mysql', puede ser que no tenga iniciado el servicio, así que:

Código: bash
systemctl start mysql


Si es por un script, verifique que todos los datos sean correctos: Nombre de usuario, Contraseña, Dirección IP/Hostname, Puerto

~ DtxdF
#673
Mire el siguiente enlace: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Puede ver muchos con una simple búsqueda en Google: hydra falsos positivos kali linux

Verá el porqué da falsos positivos, es mejor crear una herramienta que analice el mismo código HTML generado y en base a ello determinar si es correcto o no.

Por ejemplo con un script simple que envíe peticiones con credenciales erroneas el servidor podría devolver "error", mientras que cuando sea correcto devuelva "good!" o algo así (es un ejemplo).

Palabras clave a usar en Google: python beautifulsoup tutorial

~ DtxdF
#674
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

uTorrent en GNU/Linux tiene una interfaz web que usa una API sobre el daemon principal, usa la API de éste y listo.

También te podría interesar:

* - You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
* - You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

~ DtxdF
#675
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Debe verificar qué o cuántos protocolos acepta su adaptador y en base a ello, seleccionar el que le plazca. Puede ver las velocidades aquí: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Con protocolos me refiero
adonde está la clave 'hw_mode'. Puede apoyarse de la información que le proporcioné anteriormente de Wikipedia.

Además si acepta el estándar 802.11n (u otro) deberá mejorar el rendimiento de la transmisión, y para activarlo agrege:

Código: text
ieee80211n=1


Sobre "el mejor método", no lo hay. Aunque le dejaré algunas fuentes para ver la lógica detrás de estos ataques.

* - You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
* - You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

El primero usa airbase-ng en lugar de hostapd, pero el concepto es el mismo "crear un AP" (así que sea creativo), mientras que el segundo le falto la desautenticación, pero el primer enlace lo completa.

Otra cosa, investigue sobre las variantes de hostapd, como hostapd-wpe, que son dedicadas a estos actos.

Y una última cosa, el archivo de configuración de dnsmasq.conf estás muy bien documentado, lea cada parte que habilita para saber que está haciendo y aprender mucho más.

Hostapd, tiene un archivo de configuración para ejemplos: /usr/share/doc/hostapd/examples/hostapd.conf

Ahí encontrará mucha más información sobre él, y aprenderá mucho más.

[Actualizo]

Por cierto, no sé si lo hizo pero debe proporcionarle Internet a los clientes (en caso de que desee) y desactivar NetworkManager o cualquier obstaculo.

Debe hacer el enmascaramiento con el siguiente comando:

Código: bash
iptables --table nat --out-interface <Interfaz de la salida al exterior> --jump MASQUERADE --append POSTROUTING
sysctl net.ipv4.ip_forward=1


~ DtxdF
#676
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

No es eso, es que debería probar e investigar lo que se le propone ya que lo ideal es aprender de forma autodidacta (es una experiencia fantástica), si tiene dudas (como es el caso) no se preocupe, pregunte, pero si se le dice algo, indage todo lo que pueda, aprenderá mucho más, ya que simplemente podemos decirle que hacer y listo "Tema solucionado", pero si le damos pistas para que haga una investigación aprenderá por toneladas  ;)

Si necesita más ayuda busque en su buscador: como hacer ejecutar un programa al inicio de windows con el regedit cmd "reg add"

No es coherente el texto, pero para Google si lo será  ;)

~ DtxdF
#677
El compañero @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login le ha explicado simple y sencillamente, y el resultado de ejecutar los comandos que especificó son totalmente acertados. Debería probarlos.

Aunque su último comentario es revelador, no sé si lo que desea es que su programa al instalarse en el PC (por ejemplo con un MSI o el mismo exe) se autoejecute al iniciar lo básico del Sistema Operativo, cosa que sería lo mismo que le proporcionó Kirari. También podría crear un Acceso Directo y copiarlo a la carpeta llamada "Menú de inicio" .

~ DtxdF
#678
Gracias @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login  :D

~ DtxdF
#679
Dudas y pedidos generales / Re:Detectar Keylogger
Abril 08, 2020, 10:29:45 AM
Agregando un poco de lo que dice aminanegra.

Supongo que deseas saber de la detección de un keylogger que no estás probando, tu amigo será lsof (Linux) como nos lo comenta el compañero y  El monitor de recursos (Windows) y debes tener en cuenta que el directorio que mayormente se usaría para estos actos es "/tmp" (Linux), "%tmp%" (Windows). En Linux tiene todos los permisos (drwxrwxrwt) incluido el sticky bit, por lo que no habrá problemas al escribir y leer aquí.

Puedes usar el siguiente comando:

Código: bash
watch --precise --interval 1 lsof -i +D /tmp


Para ver en tiempo real lo que se está haciendo en el directorio temporal, además de mostrar todas las conexiones pertenecientes.

Sin embargo la cosa se complica un poco cuando un atacante puede ejecuar el siguiente comando:

Código: bash
find / -type d -perm 0777


O bueno también se podría "buscar todos los directorios que tengan permiso de escritura y lectura"; eso en caso de que "/tmp" no funcione.

Una cosa más antes de que se me olvide. Use ltrace si tiene el binario para ver las llamadas que está haciendo el programa: Por ejemplo, yo me descarge un keylogger ya hecho desde "You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login" y ejecuté lo siguiente:

Código: bash
make
ltrace ./keylog -f keys.txt


Y obtuve:

Código: text
scandir(0x557bf0fa7299, 0x7fff0ef9ec60, 0x557bf0fa6bf5, 0x7eff97d975b0 <unfinished ...>
snprintf("/dev/input/.", 512, "%s%s", "/dev/input/", ".")                                             = 12
__xstat(1, "/dev/input/.", 0x7fff0ef9e910)                                                            = 0
snprintf("/dev/input/..", 512, "%s%s", "/dev/input/", "..")                                           = 13
__xstat(1, "/dev/input/..", 0x7fff0ef9e910)                                                           = 0
snprintf("/dev/input/event9", 512, "%s%s", "/dev/input/", "event9")                                   = 17
__xstat(1, "/dev/input/event9", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event8", 512, "%s%s", "/dev/input/", "event8")                                   = 17
__xstat(1, "/dev/input/event8", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event7", 512, "%s%s", "/dev/input/", "event7")                                   = 17
__xstat(1, "/dev/input/event7", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event6", 512, "%s%s", "/dev/input/", "event6")                                   = 17
__xstat(1, "/dev/input/event6", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event5", 512, "%s%s", "/dev/input/", "event5")                                   = 17
__xstat(1, "/dev/input/event5", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/by-id", 512, "%s%s", "/dev/input/", "by-id")                                     = 16
__xstat(1, "/dev/input/by-id", 0x7fff0ef9e910)                                                        = 0
snprintf("/dev/input/by-path", 512, "%s%s", "/dev/input/", "by-path")                                 = 18
__xstat(1, "/dev/input/by-path", 0x7fff0ef9e910)                                                      = 0
snprintf("/dev/input/event4", 512, "%s%s", "/dev/input/", "event4")                                   = 17
__xstat(1, "/dev/input/event4", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event3", 512, "%s%s", "/dev/input/", "event3")                                   = 17
__xstat(1, "/dev/input/event3", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event2", 512, "%s%s", "/dev/input/", "event2")                                   = 17
__xstat(1, "/dev/input/event2", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event1", 512, "%s%s", "/dev/input/", "event1")                                   = 17
__xstat(1, "/dev/input/event1", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/event0", 512, "%s%s", "/dev/input/", "event0")                                   = 17
__xstat(1, "/dev/input/event0", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/mouse0", 512, "%s%s", "/dev/input/", "mouse0")                                   = 17
__xstat(1, "/dev/input/mouse0", 0x7fff0ef9e910)                                                       = 0
snprintf("/dev/input/mice", 512, "%s%s", "/dev/input/", "mice")                                       = 15
__xstat(1, "/dev/input/mice", 0x7fff0ef9e910)                                                         = 0
<... scandir resumed> )                                                                               = 12
snprintf("/dev/input/event0", 512, "%s%s", "/dev/input/", "event0")                                   = 17
open("/dev/input/event0", 0, 01676365161)                                                             = 3
ioctl(3, -2147203808, 0x7fff0ef9ea5c)                                                                 = 4
ioctl(3, -2147203807, 0x7fff0ef9ea5c)                                                                 = 4
strdup("/dev/input/event0")                                                                           = 0x557bf2a0b260
close(3)                                                                                              = 0
free(0x557bf2a134b0)                                                                                  = <void>
free(0x557bf2a13480)                                                                                  = <void>
free(0x557bf2a13450)                                                                                  = <void>
free(0x557bf2a13420)                                                                                  = <void>
free(0x557bf2a133f0)                                                                                  = <void>
free(0x557bf2a133c0)                                                                                  = <void>
free(0x557bf2a13390)                                                                                  = <void>
free(0x557bf2a13360)                                                                                  = <void>
free(0x557bf2a13330)                                                                                  = <void>
free(0x557bf2a13300)                                                                                  = <void>
free(0x557bf2a135c0)                                                                                  = <void>
free(0x557bf2a13590)                                                                                  = <void>
free(0x557bf2a134e0)                                                                                  = <void>
getopt(3, 0x7fff0ef9edb8, "sn:f:")                                                                    = 102
getopt(3, 0x7fff0ef9edb8, "sn:f:")                                                                    = -1
open("keys.txt", 1089, 04)                                                                            = 3
open("/dev/input/event0", 0, 02101)                                                                   = 4
signal(SIGINT, 0x557bf0fa6582)                                                                        = 0
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("CAPSLOCK")                                                                                    = 8
write(3, "CAPSLOCK", 9)                                                                               = 9
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "3\317\215^", 3072)                                                                           = 48
read(4, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("U")                                                                                           = 1
write(3, "U", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
Usigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("CAPSLOCK")                                                                                    = 8
write(3, "CAPSLOCK", 9)                                                                               = 9
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 48
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("N")                                                                                           = 1
write(3, "N", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n") n                                                                                         = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("D")                                                                                           = 1
write(3, "D", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2d)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("E")                                                                                           = 1
write(3, "E", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4e, "3\317\215^", 3072)                                                                           = 72
read(4, "3\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("R")                                                                                           = 1
write(3, "R", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4r, "4\317\215^", 3072)                                                                           = 72
read(4, "4\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("C")                                                                                           = 1
write(3, "C", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }c, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "4\317\215^", 3072)                                                                           = 72
read(4, "4\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("0")                                                                                           = 1
write(3, "0", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n"0)                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "4\317\215^", 3072)                                                                           = 72
read(4, "4\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("D")                                                                                           = 1
write(3, "D", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4d, "4\317\215^", 3072)                                                                           = 72
read(4, "4\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("E")                                                                                           = 1
write(3, "E", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4e, "4\317\215^", 3072)                                                                           = 72
read(4, "J\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("LEFTCTRL")                                                                                    = 8
write(3, "LEFTCTRL", 9)                                                                               = 9
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
read(4, "J\317\215^", 3072)                                                                           = 72
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }^C <no return ...>
--- SIGINT (Interrupt) ---
<... sigaction resumed> , { 0, <>, 0, 0 })                                                            = 0
strlen("C")                                                                                           = 1
write(3, "C", 2)                                                                                      = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
sigemptyset(<>)                                                                                       = 0
sigaction(SIGPIPE, { 0x1, <>, 0, 0 }, { 0, <>, 0, 0 })                                                = 0
strlen("\n")                                                                                          = 1
write(3, "\n", 2)                                                                                     = 2
sigaction(SIGPIPE, { 0, <>, 0, 0 }, nil)                                                              = 0
close(4)                                                                                              = 0
close(3)                                                                                              = 0
free(0x557bf2a0b260)                                                                                  = <void>
+++ exited (status 0) +++


Que leyendo el archivo generado:

Código: bash
tr -d "\n" < keys.txt && echo


Obtenemos:

Código: text
HOLALEFTCTRLCCAPSLOCKUCAPSLOCKNDERC0DELEFTCTRLC


Creo que le será de utilidad para detectar keylogger's manualmente, pero claro, hay muchas maneras de detectarlos y más complejas y efectivas, incluso igual que los AVs (Aunque a veces la mano humana es más efectiva >:-)).

~ DtxdF
#680
CLIConfig: Parsea tus archivos de configuración desde la terminal

CLIConfig es una utilidad para la línea de comandos, pero la verdadera estrella de esta película es la librería que usa "conf_parser.h" qué es la encargada de leer los archivos de configuración.CONF mientras que la herramienta antes mencionada hace mucho más.

Instalación

Código: bash
git clone https://github.com/DtxdF/CLIConfig.git
cd ./CLIConfig
sudo make install
man CLIConfig # o CLIConfig -h


Repositorio: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Ejemplos de CLIConfig

CLIConfig ayudará a la persona que esté haciendo scripting y necesite interactuar con los archivos de configuración del sistema. Por lo que siguiendo las pautas que se mostrarán a continuación quedará más que claro:

En mi caso yo usaré el archivo de configuración de DNSMASQ, pero antes haré una copia para esta demostración

Código: bash
cd /tmp
cp /etc/dnsmasq.conf .
CLIConfig dnsmasq.conf -s


CLIConfig no lee comentarios que tengan almuadillas antepuestas (#) por lo que en mi caso se mostraría lo siguiente:

Código: text
[Procesando: dnsmasq.conf]

domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0

[Procesado: dnsmasq.conf]


Sí quisieramos eliminar el procesamiento se tendría que colocar el parámetro "-n" ó "--no-banner":

Código: text
domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0


Sí quisieramos mostrar las claves "server" sería de la siguiente manera:

Código: bash
CLIConfig -k server -s dnsmasq.conf


El resultado sería el siguiente

Código: text
[Procesando: dnsmasq.conf]

server=1.1.1.1
server=1.0.0.1

[Procesado: dnsmasq.conf]


Quiero recordar que todo lo que no sea un parámetro o un argumento de un parámetro es un considerado un archivo

Código: bash
cp /etc/wvdial.conf .
CLIConfig -s dnsmasq.conf wvdial.conf


Resultado:

Código: text
[Procesando: dnsmasq.conf]

domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=1.1.1.1
server=1.0.0.1
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0

[Procesado: dnsmasq.conf]
[Procesando: wvdial.conf]

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB2
ISDN = 0
Phone = *99
Password = none
Username = none

[Procesado: wvdial.conf]


CLIConfig no le quita los espacios a las claves, por lo que en el caso de wvdial se tendría que colocar espacios.

Código: bash
CLIConfig -s /etc/wvdial.conf -k "Username "


Resultado:

Código: text
[Procesando: /etc/wvdial.conf]

Username = none

[Procesado: /etc/wvdial.conf]


Para modificar los servidores DNS de dnsmasq.conf haríamos los siguiente:

Código: bash
CLIConfig dnsmasq.conf -k server -v 8.8.8.8 -o


Código: text
[Procesando: dnsmasq.conf]

¡server ha sido modificado con éxito!

[Procesado: dnsmasq.conf]


Si vemos el archivo modificado:

Código: bash
cat dnsmasq.conf


Código: text
domain-needed
bogus-priv
no-resolv
log-queries
log-dhcp
log-facility=/var/log/dnsmasq.log
server=8.8.8.8
server=8.8.8.8
dhcp-range=eth0,192.168.0.2,192.168.0.254,12h
interface=eth0


No se ve tan bien... Y es por qué no le especificamos qué coincidencia deseamos modificar, por lo que lo hará con todos los que encuentre, para realizarlo:

Código: bash
CLIConfig dnsmasq.conf -k server -v 8.8.4.4 -o -p 2
...
cat dnsmasq.conf


Código: bash
...
server=8.8.8.8
server=8.8.4.4
...


NOTA: El parámetro "-o" ó "--overwrite" sobre-escribe el valor de la clave y el archivo, por lo que es mejor que hagamos un respaldo del anterior en casos reales

Para agregar una nueva clave:

Código: bash
CLIConfig dnsmasq.conf -k dhcp-range -v wlan0,10.42.0.2,10.42.0.254,5h -w


Código: text
[Procesando: dnsmasq.conf]

Escrito: dhcp-range=wlan0,10.42.0.2,10.42.0.254,5h

[Procesado: dnsmasq.conf]


Para eliminar todas las claves coincidentes:

Código: bash
CLIConfig dnsmasq.conf -d -k server


Eliminar sólo la segunda coincidencia:

Código: bash
CLIConfig dnsmasq.conf -d -k server -p 2


Ver la ayuda:

Código: bash
CLIConfig -h


Funcionamiento de cada parámetro


  • -h/--help: Muestra la ayuda
  • -s/--show: Muestra el archivo de configuración parseado
  • -k/--key: Coincidir con la clave
  • -w/--write: Agregar una clave y un valor a la configuración
  • -v/--value: El valor de la clave
  • -n/--no-banner: No mostrar el procesamiento de los que se está haciendo
  • -o/--overwrite: Sobre-escribe el valor de una(s) clave(s)
  • -E/--expression: Usar un valor como coincidencia en vez de la clave
  • -I/--init: Iniciar la interacción después de un número N
  • -O/--only: Sólo actuar con N filas
  • --offset: Lo mismo que --only
  • -i/--id: Actuar solamente cuando la llamada del callback número X sea igual a Y
  • -p/--pattern: Cuándo haya N coincidencias encontradas actuar con la que ajustó el usuario
  • -d/--delete: Borrar una clave

NOTA: Es necesario comprender el funcionamiento de cada parámetro que usa, ya que no todos funcionan de la misma manera y no todos se pueden combinar, además de los valores por defecto que fueron otorgados a éstos por el diseño del mismo programa.

Combinaciones:


  • -s/--show: -k/--key, -E/--expression, -O/--only, -i/--id, -p/--pattern, -I/--init
  • -k/--key: -v/--value, -w/--write, -s/--show, -o/--overwrite, -O/--only, -i/--id, -p/--pattern, -d/--delete, -I/--init
  • -w/--write: -k/--key, -v/--value
  • -v/--value: -k/--key, -w/--write, -o/--overwrite, -O/--only, -p/--pattern, -I/--init
  • -o/--overwrite: -k/--key, -v/--value, -E/--expression, -O/--only, -p/--pattern, -I/--init
  • -E/--expression: -s/--show, -v/--value, -o/--overwrite, -O/--only, -p/--pattern, -I/--init
  • -O/--only/--offset: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -i/--id, -p/--pattern, -d/--delete, -I/--init
  • -i/--id: -s/--show, -O/--only
  • -I/--init: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -p/--pattern, -d/--delete
  • -p/--pattern: -s/--show, -k/--key, -v/--value, -o/--overwrite, -E/--expression, -O/--only, -d/--delete, -I/--init

NOTA-#1: El parámetro -n/--no-banner no fue colocado en la tabla porque se puede combinar con todos

NOTA-#2: Sí se define el parámetro -k/--key al mismo tiempo que -E/--expression, el segundo no se tomara en cuenta, pero si el primero.

NOTA-#3: El valor por defecto de los siguientes parámetros es "0", lo que quiere decir que no se hará nada al menos que se le coloque un número mayor: -O/--only, -i/--id, -p/--pattern.

Sintaxis de los archivos de configuración

La sintaxis de un archivo de configuración se rige de la siguiente manera:

Código: text
clave=valor


Ejemplo de la librería

Primero compilamos la librería:

Código: bash
make conf_parser.o


Teniendo el siguiente archivo de configuración:

Código: bash
cat test.conf

Código: text
name=Josef
lastname=Naranjo
age=17
alias=DtxdF


Y teniendo el siguiente parser (test.c):

Código: c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "conf_parser.h"

#define CMP(x,y) strcmp(x, y) == 0

struct configuration {
char * name;
char * lastname;
long age;
char * alias;

};

int parser(void * config, char * key, char * value) {
struct configuration * conf = (struct configuration *)config;
char *endstr;

if (CMP(key, "name")) {
conf->name = strdup(value);

} else if (CMP(key, "lastname")) {
conf->lastname = strdup(value);

} else if (CMP(key, "age")) {
conf->age = strtol(value, &endstr, 10);

if (errno != 0) {
return errno;

}

} else if (CMP(key, "alias")) {
conf->alias = strdup(value);

} else {
return 3; // Cuando una clave no es válida (Opcional)

}

return 0;

}

int main(void) {
struct configuration config;
FILE * file;

if ((file = fopen("test.conf", "rb")) == NULL) {
perror("Error abriendo el archivo de configuración");
               
      return errno;

}

if (ini_parse(file, &config, parser) != 0) {
perror("Ocurrio un error interpretando el archivo de configuración");

return errno;

}

printf("Información del sujeto:\n");
printf("----------------------\n\n");

printf("Nombre: %s\n", config.name);
printf("Apellido: %s\n", config.lastname);
printf("Edad: %ld\n", config.age);
printf("Alias: %s\n", config.alias);

free(config.name);
free(config.lastname);
free(config.alias);

fclose(file);

return EXIT_SUCCESS;

}


Lo compilamos y ejecutamos:

Código: bash
gcc -Wall -O2 -o program test.c conf_parser.o strip.o
./program


Y obtenemos:

Código: text
Información del sujeto:
----------------------

Nombre: Josef
Apellido: Naranjo
Edad: 17
Alias: DtxdF


TODO


  • Auto-completado de comandos
  • Manpage
  • Verificador de sintaxis

Gracias a

Ustedes lectores por otra oportunidad. Comentarios, Reportes o alguna interacción sería excelente  ;)

~ DtxdF