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 - Crod1K

#1
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Como se ha dicho en la entrada anterior, el funcionamiento interno de una red inalámbrica difiere un poco de las redes cableadas convencionales, ya que las redes inalámbricas añaden un nivel de complejidad adicional que se encuentra directamente relacionado a factores físicos del canal de comunicación (aire).

Hasta este punto se han introducido 3 conceptos importantes relacionados con las redes inalámbricas que son, los canales, los rangos de frecuencias y las bandas. En esta ocasión se intentará explicar cuales son los tipos y los subtipos que paquetes que existen en una red inalámbrica y que es necesario conocer con el fin de entender la información que estos suministran cuando son capturados por herramientas como wireshark. Por otro lado también se introduce el concepto de "beacon frames" que es vital para comprender como los routers inalámbricos envían señales a los clientes cercanos para informar sobre su presencia.

TIPOS DE PAQUETES Y SUBPAQUETES EN REDES INALAMBRICAS

En las redes cableadas típicamente se componen por "Internet Frames" que están compuestos por una serie de campos que incluyen el protocolo utilizado (TCP/UPD/ICMP) y demás elementos que comprenden la capa de aplicación (ver modelo OSI sobre topología de red), en el mundo de las redes inalámbricas ocurre algo similar y existen diferentes tipos de paquetes WLAN, que se clasifican en 3 categorías principales que son:


  • Management

  • Control

  • Data

Cada uno de estos tipos de paquetes a su vez contienen otros subtipos de paquetes, conocer estos tipos y subtipos permitirá realizar un análisis de paquetes que viajan en el aire y las implicaciones de seguridad que estos llevan consigo. Para ver en mayor detalle los subtipos de cada una de las categorías anteriormente descritas se recomienda visitar este sitio: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Allí se incluye una tabla con cada uno de los tipos y sus correspondientes subtipos de paquetes, así como también se explica cual es su funcionamiento.

FUNCIONAMIENTO DE ACCESS POINTS INALAMBRICOS

Por otro lado, se encuentran los access points que son los dispositivos que brindan acceso a la red inalámbrica, dichos dispositivos tienen asignado un SSID que le permite identificarse ante posibles usuarios que se encuentren en las cercanías, el SSID es en realidad solo un "nick" que indica el nombre de la red a la que un cliente determinado puede unirse, normalmente cuando una tarjeta de red encuentra un router cercano que advierte sobre su presencia, el usuario final solamente ve el SSID y la intensidad de la frecuencia que emite dicho router, lo que normalmente indica la cercanía, dado que las redes inalámbricas se ven enfrentadas a diferentes problemas relacionados con el medio y los obstáculos que se presentan en el mismo, (objetos, paredes, etc.) la intensidad de la frecuencia de un router se puede ver disminuida por factores físicos tales como la reflexión y la atenuación de la señal, lo que al final se ve directamente reflejado en la calidad de la conexión e inclusive la perdida de datos en el proceso de transmisión, sin embargo esto se verá con mayor detenimiento en próximas entradas.

Por otro lado, el mecanismo que utilizan los routers para anunciar su presencia a clientes que podrían estar interesados en conectarse es por medio del envío "abierto" o envío broadcast de lo que se conoce como "Beacon Frames", estos frames contienen información relacionada con el dispositivo que se encuentra disponible y da algunas pautas para realizar la conexión con el mismo, entre la información incluida en dichos frames se incluye el mecanismo de autenticación en el caso de que la red se encuentre protegida por contraseña o si por el contrario es una red sin ningún tipo de restricciones de acceso. Estos Beacon frames se transmiten con una periodicidad fija que permite a los clientes potenciales estar al tanto de posibles cambios que ocurren en el dispositivo.

En la entrada anterior se ha realizado una corta introducción sobre el uso de aircrack-ng (herramienta recomendada para realizar ataques sobre redes inalámbricas) y como es posible establecer la tarjeta de red inalámbrica en modo monitor (el equivalente del modo promiscuo en redes cableadas), esto será útil para capturar Beacon Frames

Citar>airmon-ng start wlan0

Posteriormente es posible utilizar airodump-ng para capturar todos estos Bacon Frames de forma cíclica recorriendo los canales, sin embargo para conocer en detalle los campos incluidos en dichos frames, se puede ejecutar wireshark, seleccionar la interfaz en modo monitor creada anteriormente por airmon-ng y comenzar la captura de paquetes (no es necesario esperar más de un par de segundos antes de recibir un listado de dichos paquetes, así que se puede detener la captura después de unos pocos segundos). En la columna de "Destination" se podrá apreciar que algunos paquetes tienen el valor de "Broadcast" además de que en la columna de "Info" la descripción inicial del paquete contendrá algo como "Beacon Frame, SN=XXXX, FN=X, FLAGS=XXX"

Ahora bien, es importante anotar que no solamente los Access Points (AP) pueden transmitir Bacon Frames, de hecho, cualquiera puede hacerlo sin ser necesariamente un AP, es por este motivo que es importante también ver algunas de las propiedades que se incluyen en los paquetes capturados, principalmente aquellas propiedades que se encuentran ubicadas en "Fixed Parameters" y "Tagged Parameters", por ejemplo en las siguientes imágenes se enseña en primer lugar el valor del parámetro "Capability Information" que indica, entre otras si el dispositivo que ha enviado el frame es un AP y por otro lado se encuentra el valor del parámetro "SSID parameter set" que indica el identificador del AP.



En la imagen anterior, (Tagged parameters) se incluye otra información interesante que también es útil, como por ejemplo las frecuencias soportadas, el canal de ejecución actual del AP, mecanismo de autenticación, etc.

Ahora bien, todos los dispositivos inalámbricos tienen la capacidad de anunciar su presencia a otros dispositivos que se encuentran cerca, es decir, todos los dispositivos tienen (teóricamente) la capacidad de enviar Beacon Frames, evidentemente la tarjeta de red inalámbrica y el driver utilizado para controlarla deben soportar esta característica para poder ser empleada, esto a efectos prácticos significa que un atacante podría inyectar sus propios Beacon Frames haciéndose pasar por un AP, evidentemente se requiere una herramienta que permita realizar este tipo de actividades, aircrack-ng puede ser útil para este fin, no obstante en esta ocasión se mencionará otra herramienta que permitirá realizar esta tarea de una forma sencilla y efectiva, se trata de MDK3, a continuación se explica como es el procedimiento de instalación y uso.

INSTALANDO Y UTILIZANDO MDK3

Se trata de una herramienta que permite realizar operaciones varias sobre paquetes y redes inalámbricas, algunas de las características soportadas son, Prueba de redes (para verificar que pueden escuchar los beacon frames del atacante), Fuerza Bruta para filtros MAC, Fuerza Bruta para SSID ocultos, Inyección de paquetes de Deautenticacion y Desasociacion, FakeAP, etc. La instalación es muy simple, solo es necesario descargar la herramienta desde No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y posteriormente ejecutar el comando "make && make install" desde linea de comandos para realizar la instalación de la herramienta.

Cuando se ejecuta el comando mdk3 sin ningún argumento, se enseñan todos los mecanismos empleados por mdk3 y cada una de estas técnicas tienen un conjunto de opciones para personalizar su ejecución, en este caso concreto interesa utilizar el modo de prueba "Beacon Flood Mode" que corresponde a la opción "b", para conocer las opciones de este modo de prueba

Citar>mdk3 –help b

b – Beacon Flood Mode

Sends beacon frames to show fake APs at clients.

This can sometimes crash network scanners and even drivers!

OPTIONS:

-n <ssid>

Use SSID <ssid> instead of randomly generated ones

-f <filename>

Read SSIDs from file

-v <filename>

Read MACs and SSIDs from file. See example file!

-d

Show station as Ad-Hoc

-w

Set WEP bit (Generates encrypted networks)

-g

Show station as 54 Mbit

-t

Show station using WPA TKIP encryption

-a

Show station using WPA AES encryption

-m

Use valid accesspoint MAC from OUI database

-h

Hop to channel where AP is spoofed

This makes the test more effective against some devices/drivers

But it reduces packet rate due to channel hopping.

-c <chan>

Fake an AP on channel <chan>. If you want your card to hop on

this channel, you have to set -h option, too!

-s <pps>

Set speed in packets per second (Default: 50)

Ahora, la ejecución del comando con la opción "b" podría incluir un SSID "falso" que identifique cada uno de los Beacon Frames enviados por broadcast a los clientes cercanos, para ello se ejecuta el siguiente comando

Citar>mdk3 mon0 b -n REMEMBER

Current MAC: C6:69:73:51:FF:4A on Channel 2 with SSID: REMEMBER

Current MAC: D8:35:E8:D4:66:82 on Channel 1 with SSID: REMEMBER

Current MAC: FA:5A:D8:B0:B5:DB on Channel 14 with SSID: REMEMBER

Como puede verse, se ejecuta de forma repetida el envío de Beacon Frames sobre distintos canales (aquí "mon0" corresponde a la interfaz en modo monitor), posteriormente cualquier cliente reconocerá dichos Beacon Frames y posiblemente los identificará como emisiones provenientes de un AP que se encuentra cerca.

Siguiendo los mismos pasos indicados anteriormente, se intenta realizar una captura de paquetes utilizando wireshark, se podrá ver que algunos de los paquetes capturados tienen en la columna "Info" un valor similar al siguiente "Beacon frame, SN=0, FN=0, Flags=........, BI=100, SSID="REMEMBER" posteriormente si se consultan los campos "Capability Information" y "SSID parameter set" (tal como se ha enseñado en las imágenes que se encuentran en párrafos anteriores) el paquete capturado tiene la apariencia de un AP.

MECANISMO DEAUTENTICACION Y ASOCIACION DE UN CLIENTE Y UN AP.

Cuando un cliente se autentica y se asocia a un AP (realiza una conexión completa) se llevan a cabo una serie de pasos y existe un intercambio de paquetes entre ambas partes que les permiten negociar una conexión entre ambos e intercambiar, posteriormente paquetes de datos.

El paso inicial lo toma el cliente y consiste en el envío de paquetes "Probe Request" que son del tipo Broadcast a cualquier AP que se encuentre cerca, la finalidad de estos paquetes es la de localizar y obtener los SSID de los AP disponibles, el cliente se mantendrá enviando este tipo de frames con la finalidad de obtener respuestas de los AP disponibles, estos a su vez responden con paquetes del tipo "Probe Response" que contienen información sobre el AP, posteriormente el cliente inicia todo el proceso de autenticación y asociación con el AP. Todo el proceso se resume en el siguiente intercambio de paquetes:

"Probe Request" → "Probe Response" → "Authentication Request" → "Authentication Response" → "Association Request" → "Association Response" → "NULL Function (No Data)" → "Disassociate".

El primer paquete "Probe Request" que el cliente envía a todos los AP cercanos, es una petición del tipo "Soy un cliente nuevo y busco AP's en el área, enviadme vuestros SSID" el siguiente paquete que es el "Probe Response" es el de respuesta de dicha petición, donde cada uno de los AP responde con su SSID (excepto aquellos que tienen SSID oculto, se verá más adelante en próximas entradas) además de esto, también incluye información relacionada con el mecanismo de autenticación y parámetros de seguridad existentes en el AP antes de comenzar la interacción con este. Posteriormente el cliente envía un paquete de "Probe Request" a un SSID concreto (el primero ha sido broadcast a todos los AP disponibles) e inicia el proceso de autenticación sobre dicho AP que ha respondido a la petición, dependiendo del mecanismo de autenticación implementado en dicho AP, estos paquetes podrán ser trazables o no, en cualquier caso, el siguiente paso es el intercambio de una serie de paquetes del tipo "Authentication" (Request por parte del cliente y Response por parte del AP) que intentan determinar si el cliente tiene autorización para asociarse con el AP, una vez este proceso ha concluido correctamente, el cliente envía una petición "Association Request" al AP para que este establezca la conexión con el cliente y le asigne una dirección IP valida (típicamente por medio de un servidor DHCP), el AP envía un paquete "Association Response" el cual contiene la respuesta exitosa o fallida de la asociación del cliente con el AP, esta respuesta se encuentra contenida en los "Fixed Parameters" con los campos "Status Code" y "Association ID" cuando el procedimiento de asociación finaliza correctamente estos campos tienen el valor de "Successful 0×0000" y "0×0001" respectivamente. Ahora con un cliente conectado con el AP, comienza el proceso de intercambio de paquetes de datos entre el cliente y el AP, por ejemplo, cuando un cliente solicita una página en internet o intenta intercambiar paquetes con otra máquina conectada en el segmento de red. Finalmente, el proceso de Des-asociación, es iniciado por el cliente y se lleva a cabo cuando este desea finalizar la interacción con el AP, en este caso el AP "des-asocia" el cliente terminando la conexión existente.

El proceso completo se entiende mejor con un ejemplo practico, para ello se pueden seguir los siguientes pasos

1.Iniciar un AP sin establecer mecanismo de autenticación utilizando airbase-ng

Citar>airmon-ng start wlan0

>airbase-ng -N -P -c 1 -e WLAN_OPEN mon0
2.Establecer la tarjeta de red y la interfaz mon0 en el mismo canal que el AP.

Citar>iwconfig wlan0 channel 1

>iwconfig mon0 channel 1

3.Iniciar wireshark e iniciar una captura activa de paquetes utilizando la interfaz monitora "mon0"

4.Ahora, para que la captura sea "limpia" se debe establecer un filtro en el que solamente se enseñen los frames cuya dirección corresponda al AP "WLAN_OPEN" y ademas es necesario filtrar también los Beacon Frames, con el fin de solamente recibir aquellos frames relacionados con el proceso de asociación de un cliente con un AP. Esto se hace como se enseña en las imágenes.



Como puede apreciarse el filtro resultante es el siguiente

Citar(wlan.addr == 4c:0f:6e:e9:7f:16) && !(wlan.fc.type_subtype == 0×05)

De esta forma, desde wireshark solamente se listarán registros de frames correspondientes al AP "WLAN_OPEN" y no se listarán sus Beacon Frames, solamente frames relacionados con la conexiones de otros clientes. Ahora cuando un cliente intenté realizar una conexión con el AP (Que no tiene ningún mecanismo de autenticación) se comenzará la serie de intercambio de paquetes indicada anteriormente, todos estos se pueden analizar desde wireshark

Como conclusión final de esta entrada, es importante anotar que realizar spoofing de Beacon frames es una tarea sencilla, la razón de esto es por que no existe cifrado de datos, todo viaja en texto claro y por otro lado no existe un mecanismo de protección disponible contra este tipo de ataques de reconocimiento, aunque por si mismos no son demasiado dañinos, suministran información a un posible atacante de los AP que se encuentran en "su vecindad".

LOG DE MODERACION: Siempre deben ser citadas las fuentes.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#2
Los conceptos relacionados con las redes inalámbricas en muchos puntos son muy similares a los conceptos clave en las redes cableadas, sin embargo, dada su naturaleza tienen características que extienden su funcionamiento e introduce un nivel de complejidad adicional, existen algunos conceptos clave que diferencian a las redes cableadas de las redes inalámbricas, algunos de estos son:

- Rangos de frecuencia
- Bandas
- Canales

Los rangos de frecuencia representan la potencia en Giga-hercios máxima que soporta una tarjeta de red determinada, mientras que los canales son, como su nombre lo indica, el medio de transmisión para las señales inalámbricas que emite el dispositivo (tarjeta de red).


Ahora bien las frecuencias también determinan el "protocolo" inalámbrico que se utiliza, los rangos de las frecuencias actuales son:

2.4 Ghz (802.11b/g/n)

3.6 Ghz (802.11y)

5.4 Ghz (802.11a/h/j/n)

Cada uno de estos rangos representa una banda en el espectro (espectro de frecuencia inalámbrica, concepto similar al "ancho de banda" es decir, la capacidad máxima de trasmisión del medio, que en este caso, evidentemente es el aire) cada tarjeta de red inalámbrica debe soportar alguna de estas bandas, por lo tanto estas medidas son dependientes de la infraestructura de hardware. Además, es muy importante anotar, que cada tarjeta inalámbrica solamente puede transmitir frecuencias en un solo canal de transmisión en un momento dado. Por otro lado las frecuencias se encuentran subdivididas en múltiples canales y cada país tiene permitidos solamente un máximo nivel de potencia y canales a utilizar, estas reglas son cumplidas por los fabricantes de dispositivos inalámbricos y pueden ser apreciadas desde aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No obstante la tarjeta puede ser configurada y forzada a utilizar un canal que no es permitido en el país de su uso (por ejemplo el canal 12 no es permitido en EUA, mientras que en Japón si es permitido), aunque se puede cambiar el comportamiento del dispositivo inálambrico. Recordar que esta acción puede ser considerada ilegal de acuerdo a la legislación vigente de cada país, así que como siempre digo, no seáis estúpidos con lo que hagáis.

SNIFFING EN REDES INALAMBRICAS

Normalmente cuando se habla de Sniffing en redes cableadas, frecuentemente no suelen existir limites sobre las conexiones que pueden ser "sniffadas" en el segmento de red, dado que cada ordenador se conecta a un access point de forma directa por medio de un cable, que es un único medio de transmisión, con las redes inalámbricas es distinto, como ya se ha indicando anteriormente existen bandas de frecuencia y canales de transmisión, una tarjeta inalámbrica puede hacer "sniffing" de paquetes que viajen por la red estableciéndose en modo "monitor" (en el mundo de redes cableadas, es el homologo de modo promiscuo) lo que le permitirá ver los paquetes que viajan en la red, sin importar su origen y su destino, no obstante, las redes inalámbricas solamente pueden estar transmitiendo señales en un canal en un momento dado, lo que en este caso quiere decir, que una tarjeta de red inalámbrica en modo monitor no puede realizar sniffing de todos los canales y bandas al mismo tiempo.

Una vez comprendidos estos conceptos se procede a utilizar herramientas especiales para manejar dispositivos inalámbricos, en este caso solamente se realizará un proceso de "Sniffing" simple que permitirá visualizar los paquetes que viajan en un segmento de red determinado por un canal concreto, para ello se puede emplear herramientas tales como "aricrack-ng" y "wireshark"

En primer lugar es necesario instalar aircrack-ng, a la fecha de escribir este documento la versión es la 1.2 Beta 1

Citar
wget No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
tar -zxvf aircrack-ng-1.2-beta1.tar.gz
cd aircrack-ng-1.2-beta1
make
make install


Posteriormente si se desea actualizar la versión de aircrack-ng de la siguiente forma

Citar
>airodump-ng-oui-update

  • Downloading IEEE OUI file...
  • Parsing OUI file...

  • Airodump-ng OUI file successfully updated
Aircrak-ng cuenta con una serie de herramientas útiles para determinadas operaciones sobre dispositivos inalámbricos, en este caso, una de las primeras actividades que debe llevarse a cabo será establecer la tarjeta de red en modo "monitor" con el uso del comando "airmon-ng"

Citar
>airmon-ng Interface Chipset Driver
wlan0 Atheros ath9k – [phy0]

>airmon-ng start wlan0

Interface Chipset Driver

wlan0 Atheros ath9k – [phy0]

(monitor mode enabled on mon0)

>ifconfig

mon0 Link encap:UNSPEC HWaddr 4C-0F-6E-E9-7F-16-00-00-00-00-00-00-00-00-00-00

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:24493 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:5206486 (4.9 MiB) TX bytes:0 (0.0 B)

wlan0 Link encap:Ethernet HWaddr 4c:0f:6e:e9:7f:16

UP BROADCAST MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

De esta forma se establece la interfaz de red inalámbrica "wlan0" en modo monitor, el resultado del comando anterior enseña que la interfaz virtual en modo monitor es "mon0" esta interfaz puede ser utilizada para realizar varias operaciones sobre redes wireless, como por ejemplo utilizar "airodump-ng" para localizar diferentes redes inalámbricas sobre en el aire. Por ejemplo se puede especificar las bandas sobre las cuales funcionará airodump-ng (bgn en este caso corresponden a una frecuencia de 2.4 Ghz)

Citar
>airodump-ng –band bgn mon0>

Con el comando anterior se enseñará cada uno de los BSSID alcanzables, canales, modo de cifrado, modo de autenticación y ESSID.

Como se podrá apreciar una vez se ejecute el comando anterior, que se enseñan access points y clientes conectados (ordenadores, móviles o cualquier dispositivo que tenga activo el soporte wireless)

Ahora bien, también se puede utilizar Wireshark en este punto para ver los paquetes capturados por la interfaz "mon0", para ello simplemente es necesario abrir wireshark y seleccionar la interfaz de red "mon0" para comenzar a "sniffear" como se podrá apreciar, todos los paquetes capturados tendrán como protocolo "IEEE 802.11" lo que indica claramente que se trata de wireless frames.

DIFERENCIAS ENTRE REDES INALAMBRICAS Y CABLEADAS

Aunque las redes inalámbricas y cableadas tienen muchas similitudes, las redes inalámbricas son un poco más complejas, dado que manejan varios conceptos adicionales, tales como las bandas, los canales y la frecuencia de transmisión, los cuales son factores determinantes a la hora de utilizar eficientemente una red wireless, las diferencias más sobresalientes son:


  • Las redes inalámbricas y cableadas pueden "ver" todo el trafico que viaja en un segmento de red, dado que es así como funcionan los principales protocolos de red existentes actualmente, su funcionamiento es "compartido" donde cualquier nodo en la red puede ver todos los paquetes que viajan en el segmento de red aunque el origen y/o destino no tengan relación alguna con dicho nodo, esta actividad es frecuentemente conocida como "sniffing", en las redes cableadas, para realizar sniffing sobre un segmento de red, la tarjeta de red debe ser puesta en un modo conocido como "promiscuo" mientras que en las tarjetas de red inalámbricas este modo es conocido como "monitor" y puede establecerse, como se ha indicado anteriormente con el uso de aircrack-ng o con la utilidad iwconfig en sistemas operativos Linux.

  • Las redes inalámbricas se encuentran segmentadas por bandas y canales, una tarjeta de red solamente puede estar en un único canal y una única banda en un momento determinado, lo que quiere decir que no se pueden sniffear todos los canales y bandas desde una única tarjeta de red al mismo tiempo, en las redes cableadas esta separación no existe por este motivo cuando se realiza un ataque de reconocimiento de la red (sniffing en este caso) pueden capturarse todos los paquetes que viajan en dicho segmento.

  • Las tarjetas de red inalámbricas necesitan operar en un rango de frecuencia determinado, por lo tanto también se encuentran limitadas por las capacidades que el fabricante introduce en el hardware, algo que tiene que ser muy tenido en cuenta al momento de adquirir una tarjeta wireless.

  • Las tarjetas de red inalámbricas tienen limitaciones con relación a los rangos de frecuencia y los canales que pueden utilizar dependiendo de la ubicación donde se utilicen, por ejemplo en Japón se pueden utilizar prácticamente todos los canales desde el 1 hasta el 14 para frecuencias 802.11/g/n mientras que en otras partes del mundo el uso de los canales 12, 13 y 14 están restringidos, estas designaciones se encuentran en la tabla de frecuencias y canales ubicada en:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    • Dependiendo del hardware (tarjeta de red) algunas frecuencias no pueden ser utilizadas por el dispositivo, por ejemplo, una tarjeta de red Atheros ar5007eg funciona en las bandas b/g/n lo que indica que no funcionará en bandas distintas a estas como por ejemplo a/h/j Para ver estos valores en una tarjeta de red inalámbricas concreta solamente basta con ejecutar el comando iwconfig

    Citar
    >iwconfig

    wlan0 IEEE 802.11bgn ESSID:off/any

    Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm

    Retry long limit:7 RTS thr:off Fragment thr:off

    Encryption key:off

    Power Management:on

    Como se puede ver soporta las bandas b/g/n Ahora bien, también es posible utilizar el comando iwconfig para establecer valores tales como los canales donde se "moverá" la tarjeta de red, para ello bastan con indicar lo siguiente:

    Citar
    >iwconfig wlan0 channel 1

    En esta primera entrada se han introducido los conceptos básicos sobre redes inalámbricas y el uso de herramientas como aircrack-ng y utilidades propias del Linux, en próximas entradas de esta serie, se profundizará un poco más sobre conceptos teóricos y prácticos más profundos y detallados.

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
LOG DE MODERACION: Siempre deben ser citadas las fuentes.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#3
C / C++ / [Basica] [Portable] Calculadora en C
Febrero 23, 2013, 03:27:41 AM
Hola compañeros para los iniciados en C les dejo un pequeño proyecto que estoy comenzando.
El objetivo es hacer una calculadora multifuncional desde sumar,restas,etc hasta transformar de bits a decimal, en octal, hexadecimal, y entre otras cosas que tengo en la cabeza aquí el código fuente


Código: c

/*--------------------------------*/
/* Autor:        Crod1K           */
/* Fecha:       23-2-2013      */
/*--------------------------------*/


#include <stdio.h>

#ifdef __unix__
# define LIMPIA __fpurge(stdin);
# define LIMPIA2 "clear"
#endif

#ifdef __WIN32__
# define LIMPIA fflush(stdin);
# define LIMPIA2 "cls"
#endif


double potencia(long b, int e){
int total=1,i;
for (i=1; i<=e; i++) total=total*b;
return total;
}

int main(){

int opcion,num1,num2,a=1,b=2,c=3,d=4,e=5;
printf("\t###########################################################\n");
printf("\t##                  Calculadora 0.2                      ##\n");
printf("\t##                                                       ##\n");
printf("\t##    1. Sumar                                           ##\n");
printf("\t##    2. Restar                                          ##\n");
printf("\t##    3. Multiplicar                                     ##\n");
printf("\t##    4. Dividir                                         ##\n");
printf("\t##    5. Potencia                                        ##\n");
printf("\t##                                                       ##\n");
printf("\t###########################################################\n");
printf("\t## Introdusca su opcion: ");
scanf("%d",&opcion);
system(LIMPIA2);
LIMPIA
if (opcion==a)
{
printf("\nIntroduca los numeros a sumar asi (3+5): ");
scanf("%d+%d",&num1,&num2);
LIMPIA
printf("\tEl Resultado de la Suma es: %d\n",num1+num2);
}

else if (opcion==b)
{
printf("\nIntrodusca los numeros a restar asi (10-5): ");
scanf("%d-%d",&num1,&num2);
LIMPIA
printf("\tEl Resultado de la resta es: %d\n",num1-num2);
}

else if (opcion==c)
{
printf("\nIntrodusca los numeros a multiplicar asi (5*5): ");
scanf("%d*%d",&num1,&num2);
LIMPIA
printf("\tEl Resultado de la multiplicacion es: %d\n",num1*num2);
}

else if (opcion==d)
{
printf("\nIntrodusca los numeros a dividir asi (10/4): ");
scanf("%d/%d",&num1,&num2);
LIMPIA
printf("\tEl Resultado de la division es: %d\n",num1/num2);
printf("\t El resto de la division es: %d\n",num1%num2);
}

else if (opcion==e)
{
printf("\nIntrodusca la base y potencia asi (5,2): ");
scanf("%d,%d",&num1,&num2);
LIMPIA
printf("\n%d elevado a %d es = %.0lf\n",num1,num2,potencia(num1,num2));
}
getchar();
      return 0;
}
#4
Hola, compañeros UNDERCODE :D
    Desde Hoy Quisiera comenzar una serie de retos semanales sobre programación en C
            (Espero que otros usuario se animen a ser sus propios retos sobre otros lenguajes)
Reto:
         Hacer un pequeño programa que calcule la potencia de un numero y que se lo pida al usuario.

Reglas:
         El Programa debe ser entendible para cualquier usuario.
         No utilizar la liberia <math.h>
         Los usuario me deben mandar su codigos por MP
         Solo debe utilizar la libreria <stdio.h>
         Solo 2 instrucciones por linea

Ganador:
         El Usuario con menos lineas de codigo resultara el ganador

Este reto sera cerrado El Proximo Domingo
#5
GNU/Linux / Jerarquina de Distribuciones GNU/LINUX
Febrero 16, 2013, 08:40:01 PM
#6
Hola, amigos de la comunidadUNDERCODE

Es bastante Interesante poder ver estos Tipos de Pdf, porque para todos aquellos que desean aprender a programar, entender el pseudocódigo puede ser algo enredado en un inicio pero te da la abstracción necesaria para Programar en distintos Lenguajes una vez conocida su sintaxis.

Para todos aquellos que quieren aprender a programar, Vale la pena leer este Pdf.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos¡
#7
Presentaciones y cumpleaños / Me presento....
Febrero 16, 2013, 07:53:35 PM
Hola compañeros  :D
de UNDERCODE soy nuevo en esta comunidad provengo del otro lado de la frontera de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
naa mentira buenas soy un chico como cualquier otro vengo trabajando con las pc desde, si mas no recuerdo creo que los 5
6 años luego desde que se me daño no tuve contactos con ellas hasta los 13 que fue donde me gusto mucho la programación
claro nunca que especializado en un lenguaje soy como un kanguro voy saltando en todos los lenguajes ahora ando con C ya
con este llevo un mes estudiando full para la escuela espero... espero poder ayudar y que me ayuden sin mas presentaciones
los dejos con sus cosas xD
#8
C / C++ / Re:Curso de C
Febrero 16, 2013, 07:43:46 PM
1.1 Comencemos

La única la forma de aprender un lenguaje es escribiendo programas. El primer programa que escribiremos
sera el mismo para todos los lenguajes:


               
Citarimprima las palabras
                     "hola, mundo"

Este es el gran obstáculo; para librarlo tiene que tener la habilidad de crear el texto del programa de alguna manera,
compilarlo con éxito, cargarlo, ejecutarlo y descubrir a donde la fue la salida. Con  el dominio  de estos detalles mecánicos,todo los demás es relativamente fácil.
   En C, el programa para escribir  "Hola, mundo" es:


Código: c

              #include <stdio.h>

                   main()
                 {
                        printf("Hola, mundo\n");
                  }


La forma de ejecutar este programa depende del sistema que se este utilizando. Como un ejemplo un especifico,
en el sistema  operativo GNU/Linux se debe crear el programa en un archivo cuyo nombre termine con ".c", como hola.c
y después compilarlo con la orden.


   
Código: php
cc hola.c


Si no se ha cometido algún error, como la omisión de un carácter o escribir o escribir algo en forma incorrecta, la compilación se hara sin emitir mensaje alguno, y creara  un archivo ejecutable llamado a.out. Si se ejecuta a.out escribiendo la orden

Código: php
./a.out


se escribira

Código: php
Hola, mundo


En otros sistemas, las reglas serán diferentes, consúltelo con miembro de la comunidad
Ahora algunas explicaciones del programa en si.


Un programa en C, cualquiera que sea su tamaño consta de funciones y variables. Una función contiene instrucciones que especifican las operaciones de calculo que se van a realizar, y las variables almacenan los valores utilizados durante los cálculos en memoria. Nuestro ejemplo es una función llamada "main". Normalmente se tiene la libertad de dar cualquier nombre que se desee , pero "main" es especial -- El programa comienza a ejecutarse al principio de main.
Esto significa que todo programa debe tener un main en algún sitio.
Por lo común "main" llamara a otras funciones que ayuden a realizar su trabajo, algunas que ustedes ya escribieron, y otras de bibliotecas escritas previamente. La linea primera del programa.


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


Indica al compilador que debe incluir información acerca de la biblioteca estándar de entrada/salida; esta linea aparece
al principio de muchos archivos fuente de C.


Un método para comunicar datos entre las funciones es que la función que llama proporciona una lista de valores,
llamados argumentos, a la función que esta invocando. Los paréntesis que están después del nombre de la función encierran a la lista de argumentos. En este ejemplo, "main" esta definido para ser una función que no espera argumentos, lo cual esta indicado por la lista vacía ( ).



Código: c

#include <stdio.h>                        /* incluye información acerca de la biblioteca estándar */

main()                                         /* define una función llamada main
                                                     que no recibe valores de argumentos*/

{                                                  /* la instrucciones de main están encerradas entre llaves */

printf("Hola, mundo\n");  /* main llama a la función de la biblioteca <stdio.h> printf
                                                       para escribir esta secuencia de caracteres; \n representa
                                                       caracter  de nueva linea */

}                                                   /* cierre de la funcion main */





Las instrucciones de una función están encerradas entre { }. La función main solo contiene una instrucción,

Código: c
printf("Hola, mundo\n");


Una función se invoca al nombrarla, seguida de una lista de argumentos encerrados entre paréntesis ( ), de esta manera
se esta llamando a la función printf() con el argumento "Hola, mundo\n". printf es una función de biblioteca que escribe la
salida, en este caso la cadena de caracteres que se encuentran entre comillas.
A una secuencia de caracteres entre comillas como, "Hola, mundo\n" se le conoce como String o cadena de caracteres.
Por el momento nuestro único uso de caracteres sera como argumentos para printf y otras funciones.

La secuencia \n en la cadena representa el carácter de nueva linea en la notación de C, y hace avanzar la impresion al margen izquierdo de la siguiente linea. Si se omite el \n (un experimento que vale la pena xD )
, encontrara que no hay avance de linea después de la impresion. Se debe utilizar \n para incluir un caracter de nueva linea en el argumento de printf; si se intenta algo como


Código: c
printf("Hola, mundo
");


El compilador de C producirá un mensaje de error.

printf nunca proporciona una nueva linea automaticamente, de manera que se pueden utilizar varias llamadas para construir una linea de salida en etapas. Nuestro primer programa tambien pudo haber sido escrito de la siguiente manera

Código: c

#include <stdio.h>

main()
{
        printf("Hola, ");
        printf("mundo");
        printf("\n");
}


Produciendo una salida idéntica .
   Noten que \n representa un solo carácter. Una secuencia de escape como \n proporciona
un mecanismo general y extensible para representar caracteres invisibles o difíciles de entender. En otros que C
proporciona estan:


\t  ->   para tabulacion
\b ->   para retroceso
\"  ->   para doble comillas
\'   ->   para comillas simple
\\   ->   para barra invertida


Ejercicio 1-1. Ejecute un programa que muestre su nombre y experimente con la omisión de partes del          programa, para ver que mensaje de error se obtiene
#9
C / C++ / Re:Curso de C
Febrero 16, 2013, 07:39:02 PM
1. Toma de contacto con C

Dentro de los lenguajes de programación, C es un lenguaje que tiene un cierto "prestigio".
Esto se debe fundamentalmente a dos razones:


->   Es bastante "portable": un programa bien hecho en C se podrá llevar a un ordenador
        distinto o incluso a un sistema operativo distinto (de MsDos a Windows o a Linux, por
        ejemplo) con muy pocos cambios o quizás incluso sin ningún cambio. El motivo es que
        existe un estándar: el ANSI C, que soportan casi todos los compiladores. Por eso, si
        nos ceñimos al estándar, es seguro que nuestros programas funcionarán en distintos
        sistemas; cuanto más nos separemos del estándar (en ocasiones podremos hacerlo),
        más difícil será que funcionen en otro sistema distinto.


->    Permite hacer "casi de todo": podemos usar órdenes de alto nivel (muy cercanas al
        lenguaje humano), pero también de bajo nivel (más cercanas a lo que realmente
        entiende el ordenador). De hecho, podremos incluso incorporar órdenes en lenguaje
        ensamblador en medio de un programa escrito en C, aunque eso supone que ganemos
        en control de la máquina que estamos manejando, a costa de perder en portabilidad (el
        programa ya no se podrá llevar a otros ordenadores que no usen el mismo lenguaje
        ensamblador).


En su contra, el lenguaje C tiene que es más difícil de aprender que otros y que puede
resultar difícil de leer (por lo que ciertos errores pueden tardar más en encontrarse).


Los pasos que seguiremos para crear un programa en C serán:
    1. Escribir el programa en lenguaje C (fichero fuente), con cualquier editor de textos.
    2. Compilarlo con nuestro compilador. Esto creará un "fichero objeto", ya convertido a un
         lenguaje que el ordenador es capaz de entender.
    3. Enlazarlo con otros ficheros del compilador, unas bibliotecas auxiliares que incluirán en
         nuestro programa aquellas posibilidades que hayamos empleado nosotros pero que
         realmente no sean parte del lenguaje C básico, sino ampliaciones de algún tipo. Esto dará
         lugar al fichero ejecutable, que ya podremos usar desde MsDos o el sistema operativo
         que estemos manejando, en nuestro ordenador o en cualquier otro, aunque ese otro
         ordenador no tenga el compilador que nosotros hemos utilizado.

La mayoría de los compiladores actuales permiten dar todos estos pasos desde un único
entorno, en el que escribimos nuestros programas, los compilamos, y los depuramos en caso
de que exista algún fallo.
#10
C / C++ / Re:Curso de C
Febrero 16, 2013, 07:37:12 PM
0.3. Pseudocódigo

A pesar de que los lenguajes de alto nivel se acercan al lenguaje natural, que nosotros
empleamos, es habitual no usar ningún lenguaje de programación concreto cuando queremos
plantear los pasos necesarios para resolver un problema, sino emplear un lenguaje de
programación ficticio, no tan estricto, muchas veces escrito incluso en español. Este lenguaje
recibe el nombre de pseudocódigo.

Esa secuencia de pasos para resolver un problema es lo que se conoce como algoritmo
(realmente hay alguna condición más, por ejemplo, debe ser un número finito de pasos). Por
tanto, un programa de ordenador es un algoritmo expresado en un lenguaje de programación.
Por ejemplo, un algoritmo que controlase los pagos que se realizan en una tienda con tarjeta de
crédito, escrito en pseudocódigo, podría ser:

CitarLeer banda magnética de la tarjeta
Conectar con central de cobros
   Si hay conexión y la tarjeta es correcta:
          Pedir código PIN
             Si el PIN es correcto
                         Comprobar saldo_existente
                     Si saldo_existente > importe_compra
                            Aceptar la venta
                         Descontar importe del saldo.
                     Fin Si
           Fin Si
   Fin Si
#11
C / C++ / Re:Curso de C
Febrero 16, 2013, 07:35:38 PM
0.2. Ensambladores, compiladores e intérpretes

Está claro entonces que las órdenes que nosotros hemos escrito (lo que se conoce como
"programa fuente") deben convertirse a lo que el ordenador comprende (obteniendo el
"programa ejecutable").

Si elegimos un lenguaje de bajo nivel, como el ensamblador (en inglés Assembly, abreviado
como Asm), la traducción es sencilla, y de hacer esa traducción se encargan unas herramientas
llamadas ensambladores (en inglés Assembler).

Cuando el lenguaje que hemos empleado es de alto nivel, la traducción es más complicada, y a
veces implicará también recopilar varios fuentes distintos o incluir posibilidades que se
encuentran en bibliotecas que no hemos preparado nosotros. Las herramientas encargadas de
todo esto son los compiladores.

El programa ejecutable obtenido con el compilador o el ensamblador se podría hacer funcionar
en otro ordenador similar al que habíamos utilizado para crearlo, sin necesidad de que ese otro
ordenador tenga instalado el compilador o el ensamblador.

Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos saluda en lenguaje
Pascal, tendríamos un fichero fuente llamado SALUDO.PAS. Este fichero no serviría de nada en
un ordenador que no tuviera un compilador de Pascal. En cambio, después de compilarlo
obtendríamos un fichero SALUDO.EXE, capaz de funcionar en cualquier otro ordenador que
tuviera el mismo sistema operativo, aunque no tenga un compilador de Pascal instalado.

Un intérprete es una herramienta parecida a un compilador, con la diferencia de que en los
intérpretes no se crea ningún "programa ejecutable" capaz de funcionar "por sí solo", de modo
que si queremos distribuir nuestro programa a alguien, deberemos entregarle el programa
fuente y también el intérprete que es capaz de entenderlo, o no le servirá de nada. Cuando
ponemos el programa en funcionamiento, el intérprete de encarga de convertir el programa en
lenguaje de alto nivel a código máquina, orden por orden, justo en el momento en que hay que
procesar cada una de las órdenes.

Para algunos lenguajes, es frecuente encontrar compiladores pero no suele existir intérpretes.
Es el caso del lenguaje C, de Pascal y de C++, por ejemplo. En cambio, para otros lenguajes, lo
habitual es trabajar con intérpretes y no con compiladores, como ocurre con Python, Ruby y
PHP.

Además, hoy en día existe algo que parece intermedio entre un compilador y un intérprete:
Existen lenguajes que no se compilan para obtener un ejecutable para un ordenador concreto,
sino un ejecutable "genérico", que es capaz de funcionar en distintos tipos de ordenadores, a
condición de que en ese ordenador exista una "máquina virtual" capaz de entender esos
ejecutables genéricos.

Esta es la idea que se aplica en Java: los fuentes son ficheros de texto,
con extensión ".java", que se compilan a ficheros ".class". Estos ficheros ".class" se podrían
llevar a cualquier ordenador que tenga instalada una "máquina virtual Java" (las hay para la
mayoría de sistemas operativos). Esta misma idea se sigue en el lenguaje C#, que se apoya en
una máquina virtual llamada "Dot Net Framework" (algo así como "armazón punto net").
#12
C / C++ / Re:Curso de C
Febrero 16, 2013, 07:34:30 PM
0.1. Lenguajes de alto nivel y de bajo nivel.

      Vamos a ver en primer lugar algún ejemplo de lenguaje de alto nivel, para después comparar
      con lenguajes de bajo nivel, que son los más cercanos al ordenador.

      Uno de los lenguajes de alto nivel más sencillos es el lenguaje BASIC. En este lenguaje, escribir
      el texto Hola en pantalla, sería tan sencillo como usar la orden


     
Código: basic
PRINT "Hola"


Otros lenguajes, como Pascal, nos obligan a ser algo más estrictos, pero a cambio hacen más
fácil descubrir errores:


Código: pascal
    program Saludo;
begin
write('Hola');
end.


El equivalente en lenguaje C resulta algo más difícil de leer, por motivos que iremos
comentando un poco más adelante:


Código: c
#include <stdio.h>
int main()
{
printf("Hola");
}


Los lenguajes de bajo nivel son más cercanos al ordenador que a los lenguajes humanos. Eso
hace que sean más difíciles de aprender y también que los fallos sean más difíciles de descubrir
y corregir, a cambio de que podemos optimizar al máximo la velocidad (si sabemos cómo), e
incluso llegar a un nivel de control del ordenador que a veces no se puede alcanzar con otros
lenguajes. Por ejemplo, escribir Hola en lenguaje ensamblador de un ordenador equipado con
el sistema operativo MsDos y con un procesador de la familia Intel x86 sería algo como


Código: asm

dosseg
.model small
.stack 100h

.data
hello_message db 'Hola',0dh,0ah,'$'

.code
main proc
          mov  ax,@data
          mov  ds,ax

          mov  ah,9
          mov  dx,offset hello_message
          int     21h

          mov  ax,4C00h
          int     21h

main  endp
end    main


Resulta bastante más difícil de seguir. Pero eso todavía no es lo que el ordenador entiende,
aunque tiene una equivalencia casi directa. Lo que el ordenador realmente es capaz de
comprender son secuencias de ceros y unos. Por ejemplo, las órdenes "mov ds, ax" y "mov ah, 9"
(en cuyo significado no vamos a entrar) se convertirían a lo siguiente:


Código: php
1000 0011 1101 1000 1011 0100 0000 1001


(Nota: los colores de los ejemplos anteriores son una ayuda que nos dan algunos entornos de
programación, para que nos sea más fácil descubrir errores).
#13
C / C++ / Curso de C
Febrero 16, 2013, 07:33:19 PM
CitarHola, hoy quisiera comenzar a eseñarles a los principiantes como yo. El riquisimo y super funcional lenguaje de programacion C. Aclaro que no soy muy bueno explicando pero hare todo lo posible para que entiendan de momento pueden mandarme mensaje y pedir ayuda en la comunidad. Recuerden que para aprender a correr a que primero saber caminar. Otra cosa no tengo un guia de estudio asi que intentare ir hacer lo mas neseciten para que aprendar a leer y programar, sin mas nada que decir Comenzemos.

CitarPD. Para todo aquel que quiera cooperar con esta guia que no pretende ser un manual si no una guia de referencia Mandarme un MP
0. Conceptos básicos sobre programación

      Un programa es un conjunto de órdenes para un ordenador.

      Estas órdenes se le deben dar en un cierto lenguaje, que el ordenador sea capaz de
      comprender.

      El problema es que los lenguajes que realmente entienden los ordenadores resultan difíciles
      para nosotros, porque son muy distintos de los que nosotros empleamos habitualmente para
      hablar. Escribir programas en el lenguaje que utiliza internamente el ordenador (llamado
      "lenguaje máquina" o "código máquina") es un trabajo duro, tanto a la hora de crear el
      programa como (especialmente) en el momento de corregir algún fallo o mejorar lo que se
      hizo.

      Por eso, en la práctica se emplean lenguajes más parecidos al lenguaje humano, llamados
      "lenguajes de alto nivel". Normalmente, estos son muy parecidos al idioma inglés, aunque
      siguen unas reglas mucho más estrictas.