Pages

martes, 27 de diciembre de 2011

Write up I Reto Navideño

Write up “I Reto Navideño”
 
Desarrollado por el grupo InterCEPTeam. (22 – 24 Diciembre2011)
Esteban Calle → Ekyp

Como primero agradecer de antemano al grupo InterCEPTeam por el reto, que para ser el primero que hacen me parece que tiene un nivel bastante aceptable :D.
Desde el momento que se abrió el reto al público, http://retonavideno.intercepteam.org/, lo primero con lo que nos encontrábamos era un reto para poder seguir jugando, la pagina comentaba la background de la historia del Reto, así que empecé a leer detenidamente, después de pensar un poco como ingresar al juego me he topado con la ultima linea que decía “Deberás ir a VillaQuien para obtener el diario ” así que pienso en este como un lugar, pero un lugar en la web, así que de esta manera lo primero que intente fue copiar “VillaQuien” en la url, “http://retonavideno.intercepteam.org/VillaQuien” y he aquí el primer reto pasado :D, pero de inmediato mientras abría la pagina en VillaQuien, noté el tiempo un poco lento en cargar la imagen, así que pensé en el hecho de que fuese una imagen con una alta resolución, algo poco común en las paginas Web, después de contemplarla un poco veo que no es de tan alta resolución como pensé así que decidí descargarla (solo por prevención).

Aun después de descargarla y navegar por las fuentes de la pagina, no encuentro mucho (nada) así que decidí analizar la imagen pensando en esteganografia, sin mucho pensarlo y pensando en contar con un poco de suerte antes de hacer un análisis exhaustivo, le he pasado la herramienta foremost # foremost VillaQuien.png, y verifico la salida, # cat output/audit.txt así me he dado cuenta que contiene 2 archivos, un .png y un .rar, (bingo me ahorre el trabajo de analizar con un editor hexadecimal el archivo) así que descomprimo el .rar y observo un archivo de texto plano llamado directorio.txt el cual contenía una gran lista de “hash MD5” eso fue lo primero que pensé así que fui a la pagina http://www.md5decrypter.co.uk/ y poner en tandas de 12 hash MD5 a romper, mientras tanto leía y releía el enunciado del archivo.


Había algo que me sonaba muy familiar a la primera parte del reto, así que después de ver la película, me plantee la posibilidad de que no fuesen hash MD5 si no algo como un “Directorio telefónico” espera... directorio ^^ jeje cierto así que de inmediato puse uno de los “hash” en la url y claro me abrió una casa, siendo esta una pista abro de nuevo las fuentes de la pagina y me encuentro con un comentario diciendo:

hola, ¿Donde encuentro el diario de Cindy Lou? - Busque la biblioteca!”, esto me parecía indicar que así como había una casa con ese “Hash”, habría una biblioteca, después de abrir un par mas de esos me doy cuenta que son exactamente iguales y con el montón de directorios que tenia no me parecía conveniente buscar a mano así que realice un script en python para verificar cada directorio comparando el contenido con el de una que tuviese la casa y si era diferente que me imprimiese cual “hash” Directorio realmente era el de la biblioteca:



He resaltado el único directorio diferente “411fa99540fb9b370f71da9c1cd40d4a”, así que de inmediato he entrado en la biblioteca, encontrándome un formulario de registro, después de ensayar a poner datos falsos, que cumpliera con los requisitos y siempre me saliera “intente de nuevo”, empecé a revisar el código fuente de la pagina y a revisar los javascripts, me di cuenta que pedía unos requisitos en los campos del formulario pero no no era lo interesante, mas abajo estaba una función que no había estudiado en javascript.


Claro que sabia lo que hacia el unescape(), pero no tenia idea alguna de .innerHTML, así que de pare el reto por un rato y a estudiar que hace la función, unas cuantas pruebas y listo a ver que podíamos hacer, así que para ver que ocultaba el unescape() use esta herramienta online mostrándome la fuente de un jsencryption, después de saber que era (y no conocer las bondades del firebug) decidí que montaría esa misma pagina pero de manera local, pero que aun así la procesara el servidor, así que descargue el html, inserte la función que me daba el unescape() y a usarla, al pedirme el password, y habiendo leído el código fuente de la pagina estaba la pista de quien escribió el libro que buscaba osea el diario osea Cindy Lou.


Revelando así la siguiente parte del reto, RecuperandoLaNavidad.php así que como bien lo dijo vamos dentro de la biblioteca a esta parte para poder leer el diario, ya en la siguiente parte encuentro un escrito como un poema, lo único extraño que me pareció fue que estuviese escrito como escriben hoy en día los mas jóvenes entre mayúsculas y minúsculas, pensé que la pista tenia mas que ver por el código fuente de la pagina, aunque no encontré nada, busque por algunas de las lineas en el mar de internet, por si era parte de el escrito del cuento (solo había visto la película varias veces jaja), decidí tratar de encontrar el escrito, aunque lo que encontraba era muy resumido y no contenía nada de algunas de esas lineas, mas me parecían inventadas ya que saltaba en varios puntos de la película, admito que me he quedado en este punto cerca como de 8 a 10 horas sin saber que podía hacer, eso fue parte de la madrugada y de la mañana tanto que hasta me puse a arreglar el celular de mi pareja XD, después de mucho, le doy muchísimas gracias a D14M4NT3, que me ha hecho recordar un par de paginas de las que habíamos hablado hace un tiempo atrás, inmediatamente me puse en busca de las 2 paginas y a buscar por todo su contenido hasta que en la pagina de neobits.org encuentro que hace poco @hecky había publicado un post de una técnica nueva que estaba empezando a usar llamada horrografia, jeje me reí muchísimo rato ya que hace un tiempo atrás @hecky había publicado su post por twitter, lo vi pero realmente me dije no importa, luego lo leo a ver de que se trata y se me olvido leerlo jeje y esto es lo que pasa cuando uno no lee de inmediato las noticias nuevas... jejej así que decidido a recuperar todo ese tiempo puse manos a la obra usando la herramienta online.


Viendo la traducción del texto, inicio la conexión ssh con el servidor y con las credenciales cindy:lou, ya en la consola, lo primero que hago es pararme en la raíz, para verificar a que tengo acceso, después de mirar, lo único que me parecía interesante era un binario en el home de cindy, y como el binario era llamado cuentameMax Max es el nombre del perro del grinch, así que decidí ejecutarlo, curiosamente de inmediato me salio la pista, en el primer intento, pero siendo escéptico decidí ejecutarlo dándome cuenta que lo primero que me salio era la pista.


Según la pista que daban la idea era ingresar por FTP así que lo intente, al FTP hacia la misma ip, al principio intente varios logins como el login anónimo, como cindy:lou, grinch:grinch y así sucesivamente, volví a mira la pista y me percato de que después del att: no había espacio y recordé como estaba escrita las credenciales para el ssh así que lo intente de nuevo al FTP con att:max, ya adentro se encontraba un archivo “Llamado.py” lo descargue y observe, cuando intente ejecutarlo así como estaba osea el original me salia error, así que empecé a investigar los mensajes de error que salia sobretodo por que me decía que no se podía ejecutar por que habían caracteres no imprimibles sera por lo del utf-8?, así que después de un rato me doy cuenta que faltaba definir la codificación del script al inicio de este “# coding: utf-8” así que empecé a corregirlo, y a modificarlo según mis requerimientos, así que al final lo que me quedo fue así.


Entiendo que en la corrección hay algunos fallos de programación, pero así fue de la manera que lo corregí antes de intentar corregir mis propios errores, después de ejecutarlo, veo que empieza una “conversación” entre el servidor y el cliente, a lo cual se me hizo bastante familiar (ya había visto varias veces la película y recordaba la trama, así que no era muy difícil encontrar la parte donde empezaba la misma conversación) así que la busque y empecé a responder las preguntas, el orden era “dichoso”, “cavilaba”, “penso”, si con comillas, ya que sin ellas terminaba la ejecución del cliente, al final, era otra pista, y eso que pensaba que eso era el final por como era la trama pero me equivoque, aunque era el ultimo bocado :D y así dándome la ultima pista, me dirijo a la dirección f6da8f8c63a34ff6c992cb4615a05e8c0 en VillaQuien, osea http://retonavideno.intercepteam.org/VillaQuien/f6da8f8c63a34ff6c92cb4615a05e8c0/ doy mi nick y termino siendo el tercer concursante en salvar la navidad.


Así termina el wargame, felicito de nuevo a InterCEPTeam fue un reto muy bueno esperamos que sigan realizando este tipo de juegos temáticos a lo largo del año, también felicito a las comunidades RIC y Activalink, además de al jugador D14M4NT3, que hasta el momento que estuve informado fueron todos los que salvamos la navidad, y a los que no pudieron se les anima a seguir participando, lo importante es aprender cada ves algo nuevo.

PD: Pido disculpas por la mala presentación del WriteUP y por tanta habladuría, creo que es bueno leer las experiencias completas del autor y aprender de esas experiencias.

miércoles, 28 de septiembre de 2011

Openfire OpenBSD 4.9 y PostgreSQL

Una combinacion divina, donde esta la libertad, la seguridad y el rendimiento, PostgreSQL claro que tambien se puede instalar en OpenBSD y el server de IM Openfire que maneja un protocolo jabber o xmpp claro que tambien.

Antes de empezar  con esta instalación, vale la pena aclarar que el entorno en que lo hago, tengo configurado un servidor DNS para la resolucion de nombres, simulando la red interna de una empresa, igualmente cuento con un servidor DHCP.

Hostname = ecalle.calle.tux
ip_lan = 192.168.2.5
ip_wan = 172.16.200.10


Empecemos instalando PostgreSQL, despues de la instalación, generamos la base de datos inicial, y le damos un password al super usuario de postgresql.

# pkg_add -v postgresql-server-9.0.3p0


# su - _postgresql
$ mkdir /var/postgresql/data
$ initdb -D /var/postgresql/data -A md5 -W          #(Esto pedira un password, que sera el password del super usuario de postgresql, el user por defecto es "postgres")

Despues de eso, nos da el mensaje que ya es posible iniciar el motor de base de datos, para cual nos valemos del demonio que creo el instalador en /etc/rc.d/postgresql, y hacemos lo siguiente para que se inicie de manera automatica con el sistema.

# echo 'rc_scripts="postgresql"' >> /etc/rc.conf.local
# sh /etc/rc

Despues de esto queda instalado y configurado el PostgreSQL, que por defecto solo acepta conexiones de localhost, y por el puerto 5432.

Ahora se instala el Openfire y se configura.

# pkg_add -v openfire


Configuramos la Base de datos para el Openfire, la cual la llamaremos openfire.

# su - _postgresql
$ createdb  -h localhost -U postgres -W openfire

Se copia la estructura de la DB de Openfire a la DB recien creada

$ psql -h localhost -U postgres -W -d openfire -f /usr/local/openfire/resources/database/openfire_postgresql.sql

Con esto queda la DB lista para el empleo por el Openfire, de este punto iniciamos el Openfire para poder acceder a la configuracion de este por la interfaz web por el puerto 9090.

# /usr/local/sbin/openfirectl start

ahora ingresamos a la interfaz web con la ip o el nombre del servidor



Muestro solo la configuracion de la base de datos, ya que el resto es intuitivo y por defecto.


Despues de hacer la configuracion del Openfire, se nos redirecciona a la pagina de login para acceder a la configuracion del servidor, y la administración de este, es recomendable esperar un tiempo de 5 a 10 min, ya que en ocaciones no acoge los cambios de contraseña del administrador de la plataforma.

El User por defecto es 'admin', el password es el ultimo que setearon en la configuración donde se les pedia un correo, vemos que esta correctamente conectado a la base de datos.


Ahora solo queda crear los usuarios y conectar los clientes.


Usuarios conectados y con una comunicación establecida.




Para finalizar, para que el Openfire se ejecute automaticamente cada ves que se inicie el sistema, se debe poner lo siguiente en el archivo /etc/rc.local

/usr/local/sbin/openfirectl restart

Asi se podra reiniciar en conjunto que se reinicien los servicios o inicie el sistema.

Apache + PHP + MySQL en OpenBSD 4.9

Como bien se sabe, lo mas común que se requiere para un proyecto actual, donde las aplicaciones son en la nube y necesitan ser user friendly, es la integración y correcto funcionamiento de un servidor WEB, que sea capaz de procesar como minimo php y a la ves que pueda obtener datos desde una base de datos como mysql (lo mas común), asi que con OpenBSD hay una manera sencilla de conseguir estos requerimientos.

Por defecto el servidor web es un apache que viene preinstalado y dentro de un chroot, mas el php y el mysql es necesario instalarlos.

# pkg_add -v mysql-server php5-mysql

Despues de la instalación de MySQL, se instala este fichero /etc/rc.d/mysqld, lo cual para el OpenBSD 4.9 se traduce como un demonio.

Ahora habilitemos el php5 al apache, lo cual lo hacemos haciendo los links recomendados despues de terminar la instalacion del php5-mysql.

# ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules/
# ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/



Despues de esto, configuremos el MySQL, ya que sera el servicio principal de esta integración.

Al intalarse MySQL, no se instala automaticamente la base de datos, asi que para poder que nos funcione, debemos de instalarle la DB de MySQL, y despues de eso, agregar un password al usuario root, lo hacemos asi.

# /usr/local/bin/mysql_install_db

Installing MySQL system tables...
110928  6:22:29 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
OK
Filling help tables...
110928  6:22:29 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
OK

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/local/bin/mysqladmin -u root password 'new-password'
/usr/local/bin/mysqladmin -u root -h ecalle.calle.tux password 'new-password'

Alternatively you can run:
/usr/local/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

Please report any problems with the /usr/local/bin/mysqlbug script!

# /usr/local/bin/mysqld_safe &   
[1] 21573
bash-4.1# 110928 06:23:41 mysqld_safe Logging to '/var/mysql/ecalle.calle.tux.err'.
110928 06:23:41 mysqld_safe Starting mysqld daemon with databases from /var/mysql


# /usr/local/bin/mysqladmin -u root password 'password_root'

Con esto nos queda instalado y configurado MySQL, (recordar que estos post son hechos con fines educativos, por lo tanto no se esta pensando en la seguridad para un entorno en producción, luego se haran referencias a esos items.)

Como el servidor web se encuentra en un chroot, hay que hacer un link al socket del MySQL para poder que el servidor web pueda accerder a las bases de datos de dicho gestor, esto lo hacemos asi.

# mkdir -p /var/www/var/run/mysql
# ln /var/run/mysql/mysql.sock /var/www/var/run/mysql/

Ahora solo falta que el MySQL y el Apache (httpd) se ejecuten al iniciar el sistema.

# echo 'mysqld_flags=""--socket=/var/run/mysql/mysql.sock""' >> /etc/rc.conf.local
# echo 'httpd_flags=""' >> /etc/rc.conf.local
# echo 'rc_scripts="mysqld"' >> /etc/rc.conf.local
# sh /etc/rc

Por ultimo reiniciamos los servicios, igualmente suben al inicio del sistema, y con esto queda lista la integración de dichos servicios, para hacer pruebas, los archivos .php de la pagina, se deben poner en la dirección /var/www/htdocs/, que por defecto viene con contenido de apache.

DNS en OpenBSD 4.9

El servicio DNS, podra ser uno de los mas importantes entre los servicios de red basicos, ya que para el usuario final es mas facil el recordar un nombre que una direccion IP, asi que nuestro servicio nos va a ayudar con semejante tarea, la de "recordar" las IP y nosotros solo le damos el nombre.. :D, asi que al grano, como bien sabemos, OpenBSD por defecto tambien nos permite activar y configurar este servicio de manera facil y relativamente segura, para hacerlo vamos a los pasos.

En este caso,esta es la configuración de nuestro equipo.
vic0 = wan = 172.16.200.10
vic1 = lan = 192.168.2.5
hostname = ecalle.pruebas.tux
archivo /etc/hosts
192.168.2.5          ecalle.pruebas.tux ecalle

Primero que todo debemos activarlo, ya que no viene activado por defecto, asi que digitamos el siguiente comando:

# echo 'named_flags=""' >> /etc/rc.conf.local

Bien hasta aqui esta activado, pero falta definir que queremos que sea nuestro servidor, un DNS cache o un servidor de zonas?, en este caso vamos a configurarlo como un servidor de zonas (master) y reenviador, ya que para hacerlo cache, es como viene la configuración por defecto y solo bastaria con habilitarlo.

Los archivos de configuración vienen en un chroot, que se encuentra en /var/named/, desde esta ruta como raiz es donde debemos de buscar todos los archivos de configuración.

Configuremos primero que todo nuestras zonas, para lo cual ya debemos de contar con un Dominio el cual para casos de ejemplo, utilizare el dominio pruebas.tux siendo este un dominio para la red interna, para configurar las zonas de nuestro servicio editamos el archivo /var/named/etc/named.conf:


Primero hacemos un backup de dicho archivo.

# cp /var/named/etc/named.conf /var/named/etc/named.conf.bak

Despues editamos el archivo y comentamos la zona ".", con esto deshabilitamos el DNS cache, quedando asi.

//zone "." {
//        type hint;
//        file "etc/root.hint";
//};

Buscamos la linea listen-on-v6 { any; }; modificamos "any" por "none" para deshabilitar que el servicio suba en IPv6 y comentamos la zona inversa de IPv6.

//zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
//      type master;
//      file "standard/loopback6.arpa";
//      allow-transfer { localhost; };
//};

Para setear nuestro servidor como forwarder, editamos la seccion "options", y le agragamos la linea forwarders {IP;}; donde reemplazamos IP, por el servidor DNS a quien deseamos reenviear las peticiones DNS que no podamos resolver, ademas de modificar la linea listen-on { 192.168.2.5; 127.0.0.1; }; , asi solo escuchara el servicio por las IP's que se le configuren, la sección quedaria asi.

options {
        version "";     // remove this to allow version queries

        listen-on    { 192.168.2.5; 127.0.0.1; };
        listen-on-v6 { none; };
        forwarders {172.16.200.2;};
        empty-zones-enable yes;

        allow-recursion { clients; };
};


Despues de esto, vamos al final del archivo de configuración y agregamos nuestra zona directa.
zone "pruebas.tux" {
        type master;
        file "master/pruebas.tux";
};

Hay que recordar que la ruta es tomada en cuenta desde el chroot, y que por defecto apuntara a "/", osea que en nuestro sistema los archivos de zonas estara en /var/named/master/pruebas.tux.

Ahora, para configurar la zona recien creada haremos lo siguiente, copiaremos un archivo de zona standar y lo modificaremos para adaptarlo a nuestra zona.

# cp /var/named/standard/localhost /var/named/master/pruebas.tux

Editamos nuestro archivo para adaptarlo.

$TTL 6h
@       IN      SOA     ecalle.pruebas.tux. root.pruebas.tux. (
                        1       ; serial
                        1h      ; refresh
                        30m     ; retry
                        7d      ; expiration
                        1h )    ; minimum

                NS      ns1.pruebas.tux.
ns1             A       192.168.2.5

Ahora hacemos estos 3 ultimos pasos pero con la zona inversa, primero creamos la zona.

zone "2.168.192.in-addr.arpa" {
        type master;
        file "master/2.168.192.in-addr.arpa";
};

Copiamos el archivo de zona de las estandar.

# cp /var/named/standard/loopback /var/named/master/2.168.192.in-addr.arpa

Editamos el archivo para adaptarlo.

$TTL 6h
@       IN      SOA     ecalle.pruebas.tux. root.pruebas.tux. (
                        1       ; serial
                        1h      ; refresh
                        30m     ; retry
                        7d      ; expiration
                        1h )    ; minimum

                NS      ns1.pruebas.tux.
5               PTR     ns1.pruebas.tux.

Hasta este punto esta configurado nuestro servidor como un servidor de Zonas y forwarder, reenviando  las peticiones que no pueda resolver al servidor 172.16.200.2.

Revisamos la configuración de nuestro archivo named.conf y de nustros archivos de zonas, para verificar que no hayan problemas, lo podemos hacer de la siguiente manera.

# named-checkconf /var/named/etc/named.conf
# named-checkzone pruebas.tux /var/named/master/pruebas.tux
zone pruebas.tux/IN: loaded serial 1
OK
# named-checkzone 2.168.192.in-addr.arpa /var/named/master/2.168.192.in-
zone 2.168.192.in-addr.arpa/IN: loaded serial 1
OK

Reiniciamos los servicios.

# sh /etc/rc

Listo un servidor DNS de zonas, solo se agrega como servidor DNS en el DHCP para que lo reparta a los clientes, y puedan usar el nuevo DNS, quiero recordar que este montaje es un montaje sencillo a modo de conocimiento, mas NO esta hecho pensando en la seguridad.

Al final, comprobamos con un cliente el funcionamiento, como prueba les dejo un pantallazo.

sábado, 26 de febrero de 2011

DHCP en OpenBSD

Bien vamos por un poquito de servicios de red que sobre OpenBSD 4.8 :D, en nuestro caso vamos a tomar un esquema de red donde nuestro OpenBSD servira de funciones de gateway para una red, por lo tanto debera de contar con 2 inetrfaces de red, la primera para la WAN y la segunda para la LAN asi:

WAN--------OBSD--------LAN

Ahora teniendo el esquema ahi tres servicios basicos que se deben necesitar, primer el direccionamiento de la LAN, ya que la WAN es dada de manera Dinamica o reservada, lo segundo es el enrutamiento, para que los equipos de nuestra lan puedan salir a internet y como solo hay una direcciñon ip el enmascaramiento o nat, y tercero el firewall para proteger nuetro red LAN.

Para empezar a configurar nuestro dhcp, es saber que este ya se encuentra preinstalado en nuestro sistema, asi que los cambios a realizar son minimos, lo primero que debemos realizar es que la interfaz conectada a la red LAN, debe tener una dirección IP estatica dentro del rango que esta red,  la forma de configurar nuestras interfaces de red es mediante una linea en un fichero con el nombre /etc/hostname.(nombre de la interfaz), para conocer las interfaces de nuestro sistema, lo podemos hacer mediante el comando ifconfig -a, para mi caso las tarjetas de red se identifican como vic0 y vic1, vic0 sera nuestra tarjeta de WAN y vic1 sera nuestra tarjeta de LAN, así que vic0 se configurara por DHCP, mientras que vic1 será configurada con una ip estática, el ID de red será 192.168.1.0/24, los ficheros deben quedar de a siguiente manera.

cat /etc/hostname.vic0
dhcp

cat /etc/hostname.vic1
inet 192.168.1.5 0xffffff 192.168.1.255 description "Lan"

asi le hemos asignado una ip estatica a nuestra tarjeta vic1, mas aun no esta activa, para hacerlo simplemente le damos el siguiente comando:

sh /etc/netstart

esto nos activa la IP en la interfaz LAN vic1, lo cual lo podemos verificar haciendo un ifconfig vic1

Ahora, que ya tenemos la ip de nuestra lan configurada en el equipo, procedemos a configurar el servidor DHCP, para eso nos valemos de lo siguiente:

Primero, definimos por que intefaz vamos a poner a escuchar nuestro servidor DHCP, esto lo hacemos editando el archivo /etc/rc.conf.local, y ponemos lo siguiente:

cat /etc/rc.conf.local
dhcpd_flags="vic1"

Ya le hemos dicho al servidor que inicie y que escuche por la interfaz vic1, ahora vamos a dar la configuracion que servira a los dispositivbos clientes, lo cual lo hacemos en el archivo /etc/dhcpd.conf, el cual configuraremos muy similar a el mismo archivo de configuracion en un ubuntu, un ejemplo sencnillo seria el siguiente:

cat /etc/dhcpd.conf
option domain-name "calle.tux";
option domain-name-servers 192.168.1.5;

subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers 192.168.1.5;
        range 192.168.1.100 192.168.1.200;
}

Por ultimo, reiniciamos la configuracion con el comando:

sh /etc/rc

Con esto queda listo nuestro servidor DHCP, pero ahora necesitamos darle salida a internet a los usuarios locales, osea habilitar el enrutamiento, lo cual logramos hacerlo de manera permanente editando el archivo /etc/sysctl.conf, y descomentando la siguiente linea:

#net.inet.ip.forwarding=1

Despues de esto lo mejor seria reiniciar nuestro sistema, aunque tambien lo podriamos hacer con el comando sh /etc/rc

Ya nuestro sistema OpenBSD es un servidor DHCP y un enrutador, ahora falta que realice un NAT dinamico para que todos pueda salir a navegar por la profundidades de la red, esto se logra por medio de PF (Packet Filter), en esta ocación solo tocaremos el aspecto basico del NAT con el PF para que no lo vallamos a ver como imposible... XD.

Lo primero que hay que saber es que por defecto el PF viene habilitado en el sistema OBSD 4.8, asi que lo unico que nos resta es configurarlo para que nos haga el NAT, lo hacemos desde el archivo de configuracion /etc/pf.conf

cat /etc/pf.conf

#MACROS
#Interfaz externa
wan="vic0"

#Intefaz interna
lan="vic1"

#Red interna
red_lan="192.168.1.0/24"

#OPCIONES
#No filtrar en las interfaces de loopback
set skip on lo0

#SCRUB
#Normalización de los paquetes, que entran y salen en todas las interfaces
match in all scrub (no-df max-mss 1440)

#NAT, esta regla hace que toda la red pueda salir a Internet.
match out on $wan from $red_lan to any nat-to $wan

#REGLAS DEL FILTRO
#Políticas por defecto, bloquear todo lo que entra, dejar pasar todo lo que sale
block in on $wan
pass out all
#Antispoof en la LAN.
antispoof quick for $lan inet
#Permitir conexiones ssh y web desde afuera, logueando el primer paquete.
pass in log on $wan proto tcp from any to any port ssh
pass in log on $wan proto tcp from any to any port 80


Con esto logramos tener un NAT en nuestro servidor OpenBSD y a la vez un pequeño firewall, para el filtrado y permisos para dejar pasar peticiones web y ssh.