ip information

~ TOC [Table Of Contents] ~

domingo 29 de enero de 2012

Aprendiendo a hacer exploits

En el mejor foro de seguridad del mundo, un hilo cuyo titulo es Syscall a exit(0) ASM incrustada en C. Problema de segfault..

Enjoy!

sábado 28 de enero de 2012

Correos de los diputados que tienen voz sobre ACTA

Nunca acabareis con nosotros.

Overflowed Minds hacks your mind!

miércoles 25 de enero de 2012

Codigo para evadir EMET

Se bienvenido a Overflowed Minds!

martes 24 de enero de 2012

Linux Local Privilege Escalation via SUID /proc/pid/mem Write

http://blog.zx2c4.com/749

Introducing Mempodipper, an exploit for CVE-2012-0056. /proc/pid/mem is an interface for reading and writing, directly, process memory by seeking around with the same addresses as the process’s virtual memory space. In 2.6.39, the protections against unauthorized access to /proc/pid/mem were deemed sufficient, and so the prior #ifdef that prevented write support for writing to arbitrary process memory was removed. Anyone with the correct permissions could write to process memory. It turns out, of course, that the permissions checking was done poorly. This means that all Linux kernels >=2.6.39 are vulnerable, up until the fix commit for it a couple days ago. Let’s take the old kernel code step by step and learn what’s the matter with it.

A falta de probarlo, tiene buena pinta.

Enjoy!

domingo 25 de diciembre de 2011

Anonymous hackea una empresa de seguridad, roba un millon de dolares y lo dona a caridad

http://waronsociety.noblogs.org/?p=2686

Feliz navidad.

miércoles 21 de diciembre de 2011

Mama un consejo, la SOPA me deja sopa

http://alt1040.com/2011/12/desopa-la-extension-para-firefox-que-ignora-el-bloqueo-dns

Sopa en sueco significa Basura.

viernes 2 de diciembre de 2011

Hacking QR codes



Jugando a poner logos personalizados dentro de un codigo QR de esos de los nuevos moviles. ¿Que pondra?

Un saludo.

sábado 26 de noviembre de 2011

Exploit exercises

http://exploit-exercises.com/ Ya tengo diversion.

About Exploit Exercises

exploit-exercises.com provides a variety of virtual machines, documentation and challenges that can be used to learn about a variety of computer security issues such as privilege escalation, vulnerability analysis, exploit development, debugging, reverse engineering.

Nebula takes the participant through a variety of common (and less than common) weaknesses and vulnerabilities in Linux. It takes a look at

SUID files
Permissions
Race conditions
Shell meta-variables
$PATH weaknesses
Scripting language weaknesses
Binary compilation failures
At the end of Nebula, the user will have a reasonably thorough understanding of local attacks against Linux systems, and a cursory look at some of the remote attacks that are possible.


Protostar introduces the following in a friendly way:

Network programming
Byte order
Handling sockets
Stack overflows
Format strings
Heap overflows
The above is introduced in a simple way, starting with simple memory corruption and modification, function redirection, and finally executing custom shellcode. Address Space Layout Randomisation and Non-Executable memory has been disabled.


Fusion is the next step from the protostar setup, and covers more advanced styles of exploitation, and covers a variety of anti-exploitation mechanisms such as:

Address Space Layout Randomisation
Position Independent Executables
Non-executable Memory
Source Code Fortification (_DFORTIFY_SOURCE=)
Stack Smashing Protection (ProPolice / SSP)
In addition to the above, there are a variety of other challenges and things to explore, such as:

Cryptographic issues
Timing attacks
Variety of network protocols (such as Protocol Buffers and Sun RPC)
At the end of Fusion, the participant will have a through understanding of exploit prevention strategies, associated weaknesses, various cryptographic weaknesses, numerous heap implementations.


A disfrutar.

jueves 24 de noviembre de 2011

"Recuperando" archivos borrados con lsof

Hola,

Puede usarse el mitico lsof para recuperar archivos borrados. Por ejemplo, logs borrados en una maquina comprometida que aun estan siendo accedidos por su demonio correspondiente, un servidor Apache, etc.

En un terminal:
$ echo probando >basura7
$ less basura7

Y dejamos el less con el archivo abierto. Entonces en otro terminal:
$ rm basura7
$ ls basura7
/bin/ls: basura7: No such file or directory
$ lsof |grep basura7
less 14481 usuario 4r REG 8,1 9 2627682 /tmp/basura7 (deleted)
$ file /proc/14481/fd/4
/proc/14481/fd/4: broken symbolic link to `/tmp/basura7 (deleted)'
$ cat /proc/14481/fd/4
probando

El primer numero es el PID. El segundo el numero de descriptor de fichero donde ese proceso lo tiene abierto. Y ahi esta "recuperado" (entre comillas porque realmente nunca se borro del disco).

miércoles 16 de noviembre de 2011

ksh / expect AIX create users

Hola,

Aqui dos scripts tontos en ksh para AIX que acabo de hacer por si le pueden servir a alguien. Uno crea todos los usuarios listados en el archivo de texto que se le pasa como argumento al script. En cada linea dos columnas, el user seguido del grupo principal al que debe pertenecer. El otro es un script expect que asigna una contraseña a los usuarios, pues el comando passwd de este AIX no tiene opcion -stdin.

3. Lo aburrido y rutinario es malo.

#!/usr/bin/ksh
PERS_HOME="/home/"
PASS="el_password"
PERS_SH="/usr/bin/ksh"
cat $1 | \while read USER GROUP
do
# Si ya existe el user
cut -d: -f1 /etc/passwd |grep ${USER} >/dev/null
OUT=$? if [[ ${OUT} -eq 0 ]] then
echo >&2 "ERROR: El usuario: ${USER} ya existe."
else
useradd -g ${GROUP} -m -d ${PERS_HOME}${USER} -s ${PERS_SH} ${USER}
./pass.exp ${USER} ${PASS}
# Forzar usuario a cambiar password en el siguiente inicio de sesion
pwdadm -f ADMCHG ${USER}
fi
done

pass.exp:

#!/usr/bin/expect
spawn passwd [lindex $argv 0]
set password [lindex $argv 1]
expect "password:"send "$password\r"
expect "password:" { send "$password\r" } \
"password again:" { send "$password\r" }
expect eof


3. Boredom and drudgery are evil.

Hackers (and creative people in general) should never be bored or have to drudge at stupid repetitive work, because when this happens it means they aren't doing what only they can do: solve new problems. This wastefulness hurts everybody. Therefore boredom and drudgery are not just unpleasant but actually evil.

To behave like a hacker, you have to believe this enough to want to automate away the boring bits as much as possible, not just for yourself but for everybody else (especially other hackers).

martes 15 de noviembre de 2011

bash create users and make root a list of users (UID = 0)

Hola,

Aqui dos scripts tontos en bash que acabo de hacer por si le pueden servir a alguien. Uno crea todos los usuarios listados en el archivo de texto que se le pasa como argumento al script. El otro hace root a los usuarios definidos en el archivo de texto que tambien se pasa como argumento.

Evidentemente, yo implementaria sudo, pero a veces no depende de uno.

3. Lo aburrido y rutinario es malo.
#!/bin/bash
# create_users.sh v0.1 / vlan7 / 15-Nov-2011
# Crea users pasados en argumento como archivo de texto, un user por linea
# hay que ser root
if [ $EUID -ne 0 ]; then
echo "Este script solo puede ejecutarlo root" 1>&2
exit 1
fi

# vars
PERS_HOME="/home/"
PERS_SH="/bin/bash"
PASS="el_password"

# hay argumento?
[ $# -eq 0 ] && { echo >&2 ERROR: Debe introducir como argumento un txt con usuarios, uno por linea ; exit 1; }
# file exists?
[ -f "$1" ] || { echo >&2 ERROR: El archivo pasado como argumento no existe ; exit 1; }
NOW=$(date +"%Y-%m-%d-%X")
HOSTNAME=$(hostname)
LOGFILE="create_users_log-$HOSTNAME-$NOW.log"
TEMP_FILE=$(mktemp)
# remove duplicates & blank lines
awk ' !x[$0]++' $1 | grep -v '^$' >$TEMP_FILE
for user in $(cat $TEMP_FILE); do
# Si ya existe el user
cut -d: -f1 /etc/passwd | grep "$user" > /dev/null
OUT=$?
if [ $OUT -eq 0 ];then
echo >&2 "ERROR: El usuario: \"$user\" ya existe."
echo >&2 "ERROR: El usuario: \"$user\" ya existe." >> "$LOGFILE"
else
# Creamos nuevo user
/usr/sbin/useradd -d "$PERS_HOME""$user" -s "$PERS_SH" -m "$user"
# Asignamos passwd.
echo $PASS | passwd --stdin $user
# Forzamos cambio al primer logeo.
passwd -e $user
# grabamos user/pass en log
echo -e $user"\t"$PASS >> "$LOGFILE"
echo "El usuario \"$user\" ha sido creado y su password es: $PASS"
fi
done

#!/bin/bash
# mod_users.sh v0.1 / vlan7 / 15-Nov-2011
# Modifica users (hace UID=0) pasados en argumento como archivo de texto

# hay que ser root
if [ $EUID -ne 0 ]; then
echo "Este script solo puede ejecutarlo root" 1>&2
exit 1
fi

# hay argumento?
[ $# -eq 0 ] && { echo >&2 ERROR: Debe introducir como argumento un txt con usuarios, uno por linea ; exit 1; }
# file exists?
[ -f "$1" ] || { echo >&2 ERROR: El archivo pasado como argumento no existe ; exit 1; }
NOW=$(date +"%Y-%m-%d-%X")
HOSTNAME=$(hostname)
LOGFILE="mod_users_log-$HOSTNAME-$NOW.log"
TEMP_FILE=$(mktemp)
# remove duplicates & blank lines
awk ' !x[$0]++' $1 | grep -v '^$' >$TEMP_FILE
for user in $(cat $TEMP_FILE); do
# Si no existe el user
cut -d: -f1 /etc/passwd | grep "$user" > /dev/null
CAMPO1=$?
# Si el user ya es root
cut -d: -f3 /etc/passwd | grep "$user" > /dev/null
CAMPO3=$?
if [ $CAMPO1 -ne 0 -o $CAMPO3 -ne 1 ];then
echo >&2 "ERROR: El usuario: \"$user\" no existe o ya es root."
echo >&2 "ERROR: El usuario: \"$user\" no existe o ya es root." >> "$LOGFILE"
else
# Hacemos root al user
/usr/sbin/usermod -u 0 --non-unique "$user"
# grabamos user en log
echo "$user ahora es root" >> "$LOGFILE"
echo "El usuario \"$user\" ha sido hecho root"
fi
done

Igual le sirven a alguien.

sábado 29 de octubre de 2011

Fascinacion por los aparatos

Yo llegue a usar precisamente este terminal tonto VT220. Estuvo en el A2 de la FIB de la UPC hasta que retiraron los VTxxx. Estaba alimentado solo por una pila (un hack es eso). Con ese terminal (u otros, habia de VT220 a VT440, la diferencia notable era la rapidez del scroll) conectaba contra alguno de los dos VAX que estaban en cluster, un 8600 que entro en la FIB el año 1986 y compartia 6 discos con otro VAX 785 de tal forma que no se duplicaba el SW y se garantizaba la consistencia de los datos almacenados. Como se compartian los datos se podia trabajar indistintamente, bajo autorizacion, en el 8600 o en el 785. El LCFIB (Laboratori de Calcul de la Facultat d'Informatica de Barcelona) bautizo ese cluster con el nombre de "ISIS", y los hostnames eran chooyu o meiga. Me gustaba Opera en plena guerra Netscape / IE, pero en los terminales tontos tenia que navegar con Lynx, conectaba por telnet a MUDs (juegos de rol en modo texto al estilo de las viejas aventuras conversacionales) como Medina en la direccion nescafib.upc.es en no recuerdo que puerto. El Medina fue hecho por algunos colgados de la FIB, y no era mas que un fork de uno ingles (Aurora creo) y creo que fue el primer MUD en castellano. En el Medina matabas a profesores de entonces por el campus, etc. (la LOPD nunca se metio con nosotros por meter nombres y apellidos de profesores). Podias hacer grupos con gente que se conectaba de otras universidades y corrias el riesgo de que el operador (el becario encargado) te hiciera un "disuser" (lo habitual era una semana sin cuenta) si te pillaban. Incluso consegui un cliente de IRC para VMS, no recuerdo ni de donde. En los 90 Telefonica (Infovia) no estaba al alcance de muchos de nosotros y la tarifa plana era una utopia.

jueves 22 de septiembre de 2011

Exploiting para niños. Protecciones implementadas por el S.O. La historia

Hola exploiters,

Estoy escribiendo un documento sobre la historia de las protecciones implementadas por el S.O. a los buffer overlows. Es aun un borrador y puede encontrarse el WIP en la wiki de shellcoding en la direccion Exploiting para niños. Protecciones implementadas por el S.O. La historia.

Mi idea es crear un documento con cierta perspectiva historica sobre las protecciones contra buffer overflows implementadas por el S.O. mas que crear un documento tecnico, de ahi el nombre.

La wiki xchg ax, ax ha sido remodelada, aunque no quiero dedicar demasiado tiempo pues no soy diseñador.

Suerte,

viernes 26 de agosto de 2011

bot irc en python que dice titulos de youtubes que escriben los users

Hola,

Hace poco mas de un año hice un bot irc en bash programado para decir los titulos de los youtubes que escribian por el general de un canal de irc sus usuarios.

Hoy comparto con vosotros un bot irc codificado en python por mi amigo vermells. Es un colega que anda dandole a diversos lenguajes de programacion, sobre todo C y python, y python es el lenguaje en que mas comodo se siente. Esta probado tanto en Linux como windows. Ahi va:

import socket, string, urllib2
#Programa que crea un bot para el IRC
def formateo(cadena):
cont = 0
cadena=cadena+';'
lista=[]
while cont!= len(cadena):
if cadena[cont]=='&':
while cadena[cont]!=';':
cont+=1
else:
lista.append(cadena[cont])
cont+=1
while ';' in lista:
del lista[lista.index(';')]
title=string.join(lista)
socket_bot.send('PRIVMSG '+canal+' :'+'\x0300,10'+title+'\n')
botnick = "Manolo333"
server = "luna.irc-hispano.org"
puerto = 6667
canal = "#canal"
cont=1
f = open("log.txt", "w")
socket_bot = socket.socket()
socket_bot.connect((server, puerto))
socket_bot.send('USER bobo bubu bibi :amateur\n')
socket_bot.send('NICK ' +botnick+'\n')
while True:
line = socket_bot.recv(4096)
print line
if line.find('PING')!=-1:
socket_bot.send('PONG ' +line.split()[1]+'\r\n')
socket_bot.send("JOIN " +canal+'\n')
f.write(line)
cont=cont+1
if cont==1000:
print "se cerrara el archivo"
f.close()
socket_bot.close()
if line.find('youtube.com') != -1:
tmp = line.split()
tmp = tmp.pop()
title = tmp[1:]
try:
url = urllib2.urlopen(title)
while True:
html = url.readline()
if html.find('') != -1:<br /> html = url.readline()<br /> print html<br /> while html.find('') == -1:
formateo(html)
html = url.readline()
break
except:
continue

Suerte,

sábado 9 de julio de 2011

The smallest Linux ELF binary to print 'Hello world!' [58 bytes]

BITS 32
ORG 0

DB 0x7F
entry:
inc ebp
dec esp
inc esi
mov dl, 14
mov cl, hello
xor dword [ecx], 0x6C4D6549
inc ebx
push dword 0x00030002
mov al, 4
int 0x80
add [eax], eax
add [eax], al
sbb [eax], al
add [eax], al
sbb [eax], al
add [eax], al
xchg eax, esi
dec ebx
int 0x80
DD 0x00210000-0x18
hello: DD 0x00210001
DB 'o, world!', 10

nasm -f bin -o tiny-hello.bin tiny-hello.asm && chmod +x tiny-hello.bin

Fuente: http://d.hatena.ne.jp/kikx/20061111. Si encuentras algo mejor, dimelo.

Suerte,

sábado 14 de mayo de 2011

Local Linux x86 Shellcoding without any high-level language

Video complementario al primer numero de las ASM/Shellcoding series

Musica: La perrera - Carne de perro (instrumental)

La idea es sencilla, pero se ilustra el primer shellcode funcional hecho publico (que yo sepa, corregidme de lo contrario!) sin recurrir a lenguajes de alto nivel.

sábado 7 de mayo de 2011

scapy 3-way TCP handshake

Usando scapy para generar (y enviar) los paquetes necesarios a medida para establecer una conexion contra un servidor FTP (un netcat a la escucha realmente) segun el saludo de 3 vias de TCP.



Y en el mejor foro de seguridad del mundo un hilo con informacion condensada de hack de redes para (casi) todos.

Have fun.

viernes 6 de mayo de 2011

evilbs backdoor

Haciendo bobadas en casa de un amigo que me dejo sin inet.

Se omiten bobadas mayores como un ataque ARP-spoofing contra el FW Zeroshell para capturar sus credenciales, y a partir de ahi, se juega con este backdoor.

domingo 24 de abril de 2011

ASLR bypass Linux/x86 ret2eax Classical SUID privilege elevation

Hola exploiters,

Aqui un video ilustrando un infoleak para vulnerar ASRL en un kernel de Linux actual en el momento de escribir esto.

Ademas se ilustra la elevacion de privilegios mas clasica, explotar un binario SUID vulnerable inyectando un shellcode setuid(0) + execve en tiempo de ejecucion. De vlan7 a root.

Y el paper AQUI.



Enjoy!

jueves 31 de marzo de 2011

Overflowed Minds



Aupa!

NewLog y yo estamos llevando a cabo un proyecto de shellcoding y explotacion de software, una comunidad que intenta ser un vestigio de epocas pasadas, donde lammers y script-kiddies aun no existian, donde el primer objetivo de las personas era aprender y descubrir, donde el afan por compartir y enseñar superaban, sin lugar a dudas, el propio ego.

Podeis encontrarnos en la red en la URL http://www.overflowedminds.net. Por el momento disponemos de contenido propio en la seccion Papers. Estos son:

~ Introducción a la explotación de software en sistemas Linux
~ Local Linux x86 Shellcoding without any high-level language
~ Bypassing local Linux x86 ASLR protection

Disponemos ademas de un foro en el que parece que comienza a haber cierta actividad, debido, en gran parte, a los blogs que nos han apoyado haciendonos una reseña. Gracias!

En lo que respecta a las demas secciones de la pagina, esperamos llegar a desarrollar algo suficientemente bueno. Aunque quizas quieras ser tu el primero, asi que invitamos a leer el CFH [Call For Hackers] a toda aquella persona que desee colaborar o formar parte de esta comunidad.

Y, ante todo, sed bienvenidos a Overflowed Minds!

Referencias (agradecimientos vamos):

+ Un informático en el lado del mal: Overflowed minds: Aprendiendo a hacer exploits

+ Overflowed Minds, recursos para la seguridad informática | CyberHades

+ Como descubrir vulnerabilidades y escribir exploits | Dragonjar

+ Wadalbertia - Overflowed Minds

lunes 31 de enero de 2011

metasploit

Haciendo bobadas en casa de un amigo consiguiendo una shell remota contra un Win suyo.



Se recomienda ver el video a pantalla completa con una resolucion de 720p.

lunes 24 de enero de 2011

La nana del buffer overflow como arte, hacking o asi-empezo-todo


worm-src.tar.gz ~ El codigo fuente del gusano de Morris. Es la primera explotacion de un buffer overflow conocida (entre otras muchas cosas que ingeniosamente atacaba el worm). Los comentarios de algunos codigos son buenos, muy buenos.

10.1.1.38.4083.pdf ~ Un analisis del gusano de Morris, por los hackers del MIT. Salio en 1989, a los 3 meses del ataque.

Vulnerability in NCSA HTTPD 1.3 ~ Y aqui tenemos el exploit del tercer BoF de la historia, que publico Lopatic en bugtraq. Es un agradable intercambio de ideas incluso hoy.

"That's all for now.
I hope I managed to prove that exploiting buffer overflows should be an art"

Signed, Solar Designer

lunes 17 de enero de 2011

Malware en PDF

Mientras preparo el proximo numero de las ASM/Shellcoding series, como esto lleva tiempo sin actualizar pongo a continuacion algunos de los enlaces que me han parecido mas interesantes del malware en PDF, aunque la tendencia es que vaya ganando terrero el malware en Java.

Sandboxes:
http://sourceforge.net/projects/zerowine-tryout/ <- VM
http://mwanalysis.org/ <- online

Herramientas:
http://jsunpack.jeek.org
http://esec-lab.sogeti.com/dotclear/index.php?pages/Origami <- Muy bueno, con muchos scripts en ruby listos para experimentar.
http://malzilla.sourceforge.net/downloads.html

Distros:
http://zeltser.com/remnux/

Textos:
http://grey-corner.blogspot.com/search/label/malicious%20pdf
http://contagiodump.blogspot.com
http://extraexploit.blogspot.com/
http://zeltser.com/combating-malicious-software/index.html

El ultimo CVE 0day en malware en PDF:
http://seclists.org/fulldisclosure/2010/Nov/23
http://jsunpack.jeek.org/dec/go?report=b792fac9b11b08e874a5d274741d201aeeef9016 <- pdf original
http://jsunpack.jeek.org/dec/go?report=cd93a124369bfdc7260178c55028b140cb59cc0f <- Descomprimido con pdftk

Mola de jsunpack que puedes buscar por hash MD5 del archivo y te permite bajarte lo que "ve".

miércoles 27 de octubre de 2010

shellcoding. A vueltas con el flag NX

NX es una proteccion contra la explotacion de vulnerabilidades, tipicamente buffer overflows, heap overflows y demas hierbas, cuya defensa se basa en impedir que se ejecute codigo en regiones no ejecutables de la memoria. A saber: la pila, el heap y la seccion data.

Veamos si tenemos NX habilitado de forma global en Ubuntu o no. Podemos comprobarlo mirando en el archivo /proc/cpuinfo. Segun documentacion oficial en la primera linea de flags aparecera nx si la BIOS no esta deshabilitando NX (siempre que la CPU lo soporte). Casi todas las CPUs x64 soportan NX. Y las de 32 bits, si usan PAE seguramente soporten NX.
vlan7@vlan7-ubuntu:~$ grep ^flags /proc/cpuinfo |head -n1 |grep nx
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc up rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt
vlan7@vlan7-ubuntu:~$

Por ahi aparece el flag NX, lo que indica que en mi Ubuntu Lucid estoy usando NX.

Tambien comentar que a partir de Ubuntu 10.04 podemos ver si la BIOS esta deshabilitando NX o no mediante el siguiente comando:

vlan7@vlan7-ubuntu:~$ /usr/bin/check-bios-nx --verbose
This CPU has nx in the flags, so the BIOS is not disabling it.
vlan7@vlan7-ubuntu:~$

Podemos desactivar el flag NX pasandole el parametro -s a la herramienta execstack, que se encuentra en los repositorios de debian/ubuntu dentro del paquete prelink.

sudo aptitude install prelink

Si no queremos instalar el paquete, podemos hacerlo con ld.

-z noexecstack Mark executable as not requiring executable stack
Y... ¿como deshabilitar NX globalmente en Ubuntu?
1. Desde la BIOS (la opcion depende del modelo claro).
ó
2. Recompilando el kernel.
Profundicemos en el punto 2. Segun documentacion oficial, Ubuntu viene compilado por defecto con la opcion -fstack-protector desde su version 6.10. Se deshabilita con -fno-stack-protector o -nostdlib en CPPFLAGS. No he podido llevarlo a cabo, y ya no dispongo de ninguna Ubuntu para probarlo :/
Vamos a por un shellcode.

vlan7@vlan7-ubuntu:~$ nasm -f elf32 sc.asm
vlan7@vlan7-ubuntu:~$ objdump -d sc.o
sc.o: file format elf32-i386
Disassembly of section .text:
00000000 _start:
0: eb 14 jmp 16
00000002 :
2: 5b pop %ebx
3: 31 c0 xor %eax,%eax
5: 99 cltd
6: 88 43 07 mov %al,0x7(%ebx)
9: 89 5b 08 mov %ebx,0x8(%ebx)
c: 88 43 0c mov %al,0xc(%ebx)
f: 8d 4b 08 lea 0x8(%ebx),%ecx
12: b0 0b mov $0xb,%al
14: cd 80 int $0x80
00000016 :
16: e8 e7 ff ff ff call 2
1b: 2f das
1c: 62 69 6e bound %ebp,0x6e(%ecx)
1f: 2f das
20: 73 68 jae 8a
Vamos ahora a obtener los opcodes que formaran el array:

vlan7@vlan7-ubuntu:~$ objdump -d ./sc.o |grep '[0-9a-f]:' |grep -v 'file' |cut -f2 -d: |cut -f1-6 -d' ' |tr -s ' ' |tr '\t' ' ' |sed 's/ $//g' |sed 's/ /\\x/g' |paste -d '' -s |sed 's/^/"/' |sed 's/$/"/g'"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
Entonces el sellcode queda finalmente asi:

vlan7@vlan7-ubuntu:~$ cat sc7.c
char sc[] = {"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"};
typedef void (*f)();
int main()
{
f func;
func = (f)sc;
func();
return 0;
}

Si probamos a compilar y ejecutar la shellcode con NX activo obtendremos un segmentation fault:

vlan7@vlan7-ubuntu:~$ gcc -o sc7 sc7.c
vlan7@vlan7-ubuntu:~$ ./sc7
Fallo de segmentación

Pero si desactivamos NX:

vlan7@vlan7-ubuntu:~$ execstack -s sc7
vlan7@vlan7-ubuntu:~$ ./sc7
$
Ahi tenemos la shell :)
Referencias

Creando shellcodes "position independent"

Hay un concepto en ASM/shellcoding llamado "position independent".

Por definición, un código es position-independent cuando todas las direcciones de memoria que referencia son relativas (por lo general, con respecto al registro EIP).

Para ilustrarlo, a continuacion muestro un ejemplo de un shellcode _mal hecho_ por este motivo:

BITS 32
;int execve(const char *filename, char *const argv[], char *const envp[]);

xor eax, eax
cdq ;edx=envp
push edx ;terminamos cadena de filename y el array argv
push sh ; ***!!!MAL!!!*** Se hace un push de la direccion absoluta de la cadena
mov ebx, [esp] ;ebx=direccion de la cadena
mov ecx, esp ;ecx=direccion del puntero a la cadena
mov al, 11 ;execve es la syscall 11
int 0x80
sh db "/bin/sh"

Mediante gdb, podemos ver como se hace un push a una direccion de memoria absoluta, lo que demuestra por definición que el código no es position-independent.

(gdb) disassemble _start
Dump of assembler code for function _start:
0x08048060 <_start+0>: xor %eax,%eax
0x08048062 <_start+2>: cltd
0x08048063 <_start+3>: push %edx
0x08048064 <_start+4>: push $0x8048072
0x08048069 <_start+9>: mov (%esp),%ebx
0x0804806c <_start+12>: mov %esp,%ecx
0x0804806e <_start+14>: mov $0xb,%al
0x08048070 <_start+16>: int $0x80
End of assembler dump.
(gdb) x/7b 0x08048072
0x8048072 <sh>: 0x2f 0x62 0x69 0x6e 0x2f 0x73 0x68</sh>

El shellcode devuelve una shell porque dentro de la seccion de tabla de simbolos del ELF se guarda la direccion tal y como esta referenciada por el push. Pero en una explotacion real, ya no sería así, dado que esa direccion ya no va a apuntar a /bin/sh, porque como atacante estamos bajo ambito del programa que queremos explotar, y no podemos contar con que el programa vulnerable haya colocado la cadena en la misma dirección que asumió NASM al ensamblar.

Para verlo en la práctica, basta declarar otro string que sea la cadena vlan7 en el codigo para que se vea como con 0x8048072 ya no estariamos apuntando a '/bin/sh' , sino a 'vlan7' , con lo cual lo mas probable es que se produjera una violacion de segmento.

root@bt:~# readelf -s sc |grep 08048072
root@bt:~# readelf -s sc2 |grep 08048072
4: 08048072 0 NOTYPE LOCAL DEFAULT 1 vlan7

Es decir, este shellcode no es "position independent", y lo solucionamos con una shellcode JMP/CALL que sea "position independent", es decir, que sea capaz de obtener la dirección de la cadena "/bin/sh" independientemente de donde estemos cargados en memoria. Ahi va una.

BITS 32
; int execve(const char *filename, char *const argv[], char *const envp[]);
xor eax, eax
cdq ;envp es 0
mov al, 11 ;execve es la syscall 11
push edx ;terminamos cadena y array argv
jmp short down ;jmp short = no bytes nulos
back:
mov ebx, [esp] ;direccion de la cadena
mov ecx, esp ;direccion del puntero a la cadena
int 0x80
down:
call back ;ponemos la cadena /bin/sh en la pila
db "/bin/sh"

Para terminar, algo basico pero que conviene tener presente:

mov ebx, [esp] pone en ebx la direccion de esp como todos sabemos. Pero ¿cual es la direccion de esp en ese momento?

¿Que hay antes de ese mov ebx, [esp] ?

Un call.

call tiene una "feature", y es que guarda en la pila la direccion de la siguiente instruccion, de tal forma que cuando la subrutina a la que llama finalice con un RET se pueda retornar correctamente a la siguiente instruccion (ret hace un pop de dicha direccion de memoria). Hemos colocado la cadena justo despues de la llamada a call, es por eso que su direccion se coloca en la pila.

Referencias:

Enviar un mail anonimo desde la shell usando nuestra cuenta gmail como relay

Para usar el comando AUTH, el cliente (nosotros) debe enviar al servidor la siguiente cadena codificada en Base64:

\000user@host.com\000password
\000 actua como separador.

Podemos conseguirlo con la siguiente linea de perl:

vlan7@sid7:~$ perl -MMIME::Base64 -e 'print encode_base64("\000XXX.YYY\@gmail.com\000password")'
AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk

Ahi tenemos nuestra cadena codificada en Base64. La necesitaremos mas adelante.

Diferencias entre TLS y SSL:

La principal diferencia es que en una comunicacion con un servidor SSL, la conexion SSL se establece antes incluso de que empiece la conversacion SMTP. No ocurre esto con TLS, en el cual openssl se conecta primero en texto plano, manda el comando STARTTLS, negocia el cifrado SSL y entonces es cuando realmente comienza la sesion cifrada.

En nuestro caso google usa SSL en smtp.gmail.com:465, por lo que nos comunicamos con el asi:

vlan7@sid7:~$ /usr/bin/openssl s_client -crlf -connect smtp.gmail.com:465
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
i:/C=US/O=Google Inc/CN=Google Internet Authority
1 s:/C=US/O=Google Inc/CN=Google Internet Authority
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDWzCCAsSgAwIBAgIKFMs0nQADAAASjjANBgkqhkiG9w0BAQUFADBGMQswCQYD
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
dGVybmV0IEF1dGhvcml0eTAeFw0xMDA0MjIyMDAyNDVaFw0xMTA0MjIyMDEyNDVa
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5zbXRw
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz4B46NG2l4Bk
DdccddAuuOssQ4ZxCHoyj+ErdlEqZurVCoGQzAkhZTkzHrmIgYmM6roTbkF/zEaa
2ROe9s4VoL4OgUnoyB0u1KbwrG5PHBbsMdk0r6jMmhh+MORFVYgQrFxJnu8GnHiG
W4QhmKVytu0FclYE+F1gOOx5qIgTVCMCAwEAAaOCASwwggEoMB0GA1UdDgQWBBS1+KKmwdxtkpKkJgvwhZztqe0uszAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra
42sSJDBbBgNVHR8EVDBSMFCgTqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dv
b2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNy
bDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRp
Yy5jb20vR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRo
b3JpdHkuY3J0MCEGCSsGAQQBgjcUAgQUHhIAVwBlAGIAUwBlAHIAdgBlAHIwDQYJ
KoZIhvcNAQEFBQADgYEAUc39Y22ucA2N4mmDdPMC8DKbrRGlGMpC294mfh3yCkJa
YRWjodFQSgCtFyKhTZ9roFpSEL0D4QxAtLSwtC0bSaSVusfAW3/CFgG/Cya724ic
9UoEosoG8CK+eGoGQuEsZ0xR86J5jOs2H+4QPHFCn594V7ZySzdeQi93YV31RBE=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 1711 bytes and written 303 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: 6B1A39E3D377B24D4A123D2E5AE320A9E21DC976131C5FEB8E7318E74CA5E573
Session-ID-ctx:
Master-Key: FF0082173AEA36C9CB330B63DC9503F7D0031FD60203056C926A98B08B1DBAE517B8417A3958E8A5E0E9C3376D36D49F
Key-Arg : None
Start Time: 1288131594
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
220 mx.google.com ESMTP o43sm5440941weq.23
ehlo vlan7
250-mx.google.com at your service, [X.Y.Z.A]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250 ENHANCEDSTATUSCODES
Aqui vemos como acepta el comando AUTH PLAIN. Usemos la cadena codificada en Base64 que generamos al principio del texto:

AUTH PLAIN AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk
235 2.7.0 Accepted
Y a partir de aqui mantenemos una conversacion SMTP estandar.

mail from: <xxx.yyy@gmail.com>
250 2.1.0 OK o43sm5440941weq.23
rcpt to: <zzz@vlan7.org>
250 2.1.5 OK o43sm5440941weq.23
data
354 Go ahead o43sm5440941weq.23
From: vlan7 <xxx.yyy@gmail.com>
To: vlan7 <zzz@vlan7.org>
Subject: this is a test!
hola vlan7, como estas?
.
250 2.0.0 OK 1288131795 o43sm5440941weq.23
quit
221 2.0.0 closing connection o43sm5440941weq.23
read:errno=0
vlan7@sid7:~$
Las lineas que no comienzan con ningun digito son los comandos que enviamos al servidor, las respuestas del servidor, como es habitual comienzan con un numero que indica su codigo de respuesta.
Comprobamos desde la shell el correo no leido de gmail:

vlan7@sid7:~$ curl -u ZZZ@vlan7.org --silent "https://mail.google.com/mail/feed/atom" |perl -ne 'print "\t" if /<name>/; print "$2\n" if /<(title|name)>(.*)<\/\1>/;'
Enter host password for user 'ZZZ@vlan7.org':
Gmail - Inbox for ZZZ@vlan7.org
this is a test!
vlan7
[cut]
Como podemos observar ahi lo tenemos :)
~
Ricemos el rizo, enviemos ahora un mail de forma cifrada tambien, pero saliendo con una IP de TOR. Necesitamos un relay que soporte SOCKS. socat es bello, stunnel tambien pero existe una herramienta minimalista escrita en python que se lleva mejor con TOR: sslredir
¿Para que sirve sslredir? Para redireccionar conexiones no SSL hacia conexiones SSL, todo ello a traves de un proxy SOCKS, en nuestro caso: tor.

Basicamente lo que haremos sera iniciar tor, poner a sslredir a la escucha en un puerto determinado, nos conectaremos por telnet al servidor proxy SOCKS tor que tenemos en localhost, y sslredir se encargara de reenviarlo a smtp.gmail.com:465

Empecemos mostrando info acerca del certificado SSL de smtp.gmail.com

vlan7@sid7:~$ sslredir -i smtp.gmail.com:465/usr/local/bin/sslredir:26: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import socket, time, sha, sys, os, struct, select, syslog, \
[Sat Oct 30 01:59:25 2010] Using '/usr/share/ncat/ca-bundle.crt' for certificate verification
[Sat Oct 30 01:59:26 2010] Connection to smtp.gmail.com:465 established
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
14:cb:34:9d:00:03:00:00:12:8e
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=Google Inc, CN=Google Internet Authority
Validity
Not Before: Apr 22 20:02:45 2010 GMT
Not After : Apr 22 20:12:45 2011 GMT
Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=smtp.gmail.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:cf:80:78:e8:d1:b6:97:80:64:0d:d7:1c:75:d0:
2e:b8:eb:2c:43:86:71:08:7a:32:8f:e1:2b:76:51:
2a:66:ea:d5:0a:81:90:cc:09:21:65:39:33:1e:b9:
88:81:89:8c:ea:ba:13:6e:41:7f:cc:46:9a:d9:13:
9e:f6:ce:15:a0:be:0e:81:49:e8:c8:1d:2e:d4:a6:
f0:ac:6e:4f:1c:16:ec:31:d9:34:af:a8:cc:9a:18:
7e:30:e4:45:55:88:10:ac:5c:49:9e:ef:06:9c:78:
86:5b:84:21:98:a5:72:b6:ed:05:72:56:04:f8:5d:
60:38:ec:79:a8:88:13:54:23
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
B5:F8:A2:A6:C1:DC:6D:92:92:A4:26:0B:F0:85:9C:ED:A9:ED:2E:B3
X509v3 Authority Key Identifier:
keyid:BF:C0:30:EB:F5:43:11:3E:67:BA:9E:91:FB:FC:6A:DA:E3:6B:12:24
X509v3 CRL Distribution Points:
URI:http://www.gstatic.com/GoogleInternetAuthority/GoogleInternetAuthority.crl
Authority Information Access:
CA Issuers - URI:http://www.gstatic.com/GoogleInternetAuthority/GoogleInternetAuthority.crt1.3.6.1.4.1.311.20.2:
...W.e.b.S.e.r.v.e.r
Signature Algorithm: sha1WithRSAEncryption
51:cd:fd:63:6d:ae:70:0d:8d:e2:69:83:74:f3:02:f0:32:9b:
ad:11:a5:18:ca:42:db:de:26:7e:1d:f2:0a:42:5a:61:15:a3:
a1:d1:50:4a:00:ad:17:22:a1:4d:9f:6b:a0:5a:52:10:bd:03:
e1:0c:40:b4:b4:b0:b4:2d:1b:49:a4:95:ba:c7:c0:5b:7f:c2:
16:01:bf:0b:26:bb:db:88:9c:f5:4a:04:a2:ca:06:f0:22:be:
78:6a:06:42:e1:2c:67:4c:51:f3:a2:79:8c:eb:36:1f:ee:10:
3c:71:42:9f:9f:78:57:b6:72:4b:37:5e:42:2f:77:61:5d:f5:
44:11
CA Signature Verified: True
Certificate fingerprint: 1a6f488fbe5bfd92d81230f922ce8449b343bd2c
vlan7@sid7:~$
Volvamos a verificarlo pero esta vez a traves de tor y mostrando solo las dos ultimas lineas, que es lo que nos interesa.

vlan7@sid7:~$ sslredir -i -s 127.0.0.1:9050 smtp.gmail.com:465 |tail -n 2
/usr/local/bin/sslredir:26: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import socket, time, sha, sys, os, struct, select, syslog, \
CA Signature Verified: True Certificate fingerprint: 1a6f488fbe5bfd92d81230f922ce8449b343bd2c

Parece todo correcto. Para terminar vamos a hacerlo demonio enviandolo al background. Escuchara en el puerto 7777 y reenviara el trafico que reciba por ese puerto a smtp.gmail.com:465 mediante SSL a traves del proxy SOCKS que tenemos gracias a tor.

vlan7@sid7:~$ sslredir -dnl 7777 -s 127.0.0.1:9050 -f 1a6f488fbe5bfd92d81230f922ce8449b343bd2c smtp.gmail.com:465
/usr/local/bin/sslredir:26: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import socket, time, sha, sys, os, struct, select, syslog, \
Comprobamos que lo tenemos escuchando en el puerto 7777.

vlan7@sid7:~$ netstat -tunlp |grep :7777
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:7777 0.0.0.0:*
LISTEN 19618/python

OK, enviemos ahora un correo de la misma forma que vimos en la primera parte.

vlan7@sid7:~$ telnet 127.0.0.1 7777
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mx.google.com ESMTP x65sm1999579weq.1
ehlo vlan7
250-mx.google.com at your service, [83.170.92.9]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 PIPELINING
AUTH PLAIN AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk
235 2.7.0 Accepted
mail from: <XXX.YYY@gmail.com>
250 2.1.0 OK x65sm1999579weq.1
rcpt to: <ZZZ@vlan7.org>
250 2.1.5 OK x65sm1999579weq.1
data
354 Go ahead x65sm1999579weq.1
From: vlan7 <XXX.YYY@gmail.com>
To: vlan7 <ZZZ@vlan7.org>
Subject: This is a test
hola vlan7 que tal
.
250 2.0.0 OK 1288395385 x65sm1999579weq.1
quit
221 2.0.0 closing connection x65sm1999579weq.1
Connection closed by foreign host.
vlan7@sid7:~$
Destaquemos la linea siguiente, donde google se nos presenta de forma muy educada y nos llama por nuestra IP.

250-mx.google.com at your service, [83.170.92.9]
Si examinamos las cabeceras completas de nuestro correo en gmail, podremos ver que el correo se ha recibido desde dicha IP: 83.170.92.9 , que deberia ser nuestro nodo tor de salida.

[cut]
Received: from vlan7 (server51262.uk2net.com [83.170.92.9])
by mx.google.com with ESMTPS id x65sm1999579weq.1.2010.10.29.16.35.27
(version=SSLv3 cipher=OTHER);
Fri, 29 Oct 2010 16:36:24 -0700 (PDT)
Message-ID: <4ccb5a78.57edd80a.1dfc.ffff827a@mx.google.com>
Date: Fri, 29 Oct 2010 16:36:24 -0700 (PDT)
From: vlan7 <xxx.yyy@gmail.com><>xxx.yyy@gmail.com<
To: vlan7 <zzz@vlan7.org><zzz@vlan7.org>
[cut]
Hagamos una ultima comprobacion. Mostremos nuestra IP publica "torificando" a curl mediante torsocks

vlan7@sid7:~$ sudo torsocks curl ifconfig.me
83.170.92.9
vlan7@sid7:~$
Ahi esta el resultado esperado, ambas IPs coinciden :)
Suerte,
P.D. Desde aqui agradecer a Vic_Thor de Wadalbertia que me notificara que se me habia colado un hash b64 sin editar, el segundo. Grave fallo que ya ha sido subsanado. Asi que ojo con lo que publicamos por ahi!
Referencias:

Implementacion de nullmailer como MTA (relay) simple

nullmailer fue diseñado para actuar como relay simple. En mi escenario no tengo mas MTAs, asi que tengo implementado xinetd a la escucha. Cuando el trigger de nullmailer se dispara, nullmailer revisa la cola de mensajes y los reenvia mediante nullmailer-send a los smarthosts definidos en /etc/nullmailer/remotes

vlan7@sid7:~$ cat /etc/xinetd.d/gmail-smtp
# default: on
# description: Gmail SMTP wrapper for clients without SSL support
# vlan7 26-10-2010
# Based on:
# Added logging capabilities && one minor fix thanks to this guide:
# http://www.linuxfocus.org/English/November2000/article175.shtml
service gmail-smtp
{
disable = no
# bind commented. Only 1 NIC on this box. Use only_from
# bind = localhost
only_from = localhost
port = 10025
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/gmail-smtp
type = unlisted
# banner breaks communication :/
# banner = /etc/issue
log_on_failure += USERID
}
vlan7@sid7:~$ sudo cat /usr/bin/gmail-smtp
#!/bin/sh
/usr/bin/openssl s_client -connect smtp.gmail.com:465 -quiet 2>/dev/null
vlan7@sid7:~$ cat /etc/nullmailer/remotes
127.0.0.1 smtp --port=10025 --user=XXX.YYY@gmail.com --pass=********
Atencion! El archivo /etc/nullmailer/remotes es legible para todo el mundo! Asi que ojo :/
Comprobamos la conectividad con netcat:

vlan7@sid7:~$ nc -vv 127.0.0.1 10025
localhost [127.0.0.1] 10025 (?) open
220 mx.google.com ESMTP b30sm7257373wbb.22
HELP
214 2.0.0 http://www.google.com/search?btnI&q=RFC+2821 b30sm7257373wbb.22
QUIT
221 2.0.0 closing connection b30sm7257373wbb.22
sent 10, rcvd 168
vlan7@sid7:~$
xinetd OK. Probemos a enviarnos un mensaje, a ver si nullmailer lo manda OK desde localhost autenticandose contra la cuenta gmail definida en /etc/nullmailer/remotes y reeenviandolo a XXX@vlan7.org

root@sid7:/home/vlan7# echo 'Esto es un mensaje de test' |mailx XXX@vlan7.org
Vemos la cola de correo:

root@sid7:/home/vlan7# mailq
2010-10-26 23:55:03 330 bytes from <root@sid7.xxx.es>
to <xxx@vlan7.org>
Forzamos un flush de la cola:

root@sid7:/home/vlan7# nullmailer-send
Rescanning queue.
^C
Comprobamos que la cola ha sido procesada y el correspondiente log de syslog:

root@sid7:/home/vlan7# mailq
root@sid7:/home/vlan7# tail -f /var/log/syslog
Oct 26 23:56:09 sid7 xinetd[2208]: removing time
Oct 26 23:56:09 sid7 xinetd[2208]: removing time
Oct 26 23:56:09 sid7 xinetd[2208]: Swapping defaults
Oct 26 23:56:09 sid7 xinetd[2208]: readjusting service gmail-smtp
Oct 26 23:56:09 sid7 xinetd[2208]: Reconfigured: new=0 old=1 dropped=0 (services)
Oct 26 23:57:03 sid7 nullmailer[2087]: Rescanning queue.
Oct 26 23:57:03 sid7 nullmailer[2087]: Starting delivery: protocol: smtp host: 127.0.0.1 file: 1288130103.19982
Oct 26 23:57:05 sid7 nullmailer[20012]: smtp: Succeeded: 250 2.0.0 OK 1288130224 f31sm5425073wej.15
Oct 26 23:57:05 sid7 nullmailer[2087]: Sent file.
Oct 26 23:57:05 sid7 nullmailer[2087]: Delivery complete, 0 message(s) remain.
^C
Segun syslog se ha enviado OK. Para comprobar que lo hemos recibido entramos en nuestro correo y ahi lo tenemos. Todo OK.

Referencias:

lunes 25 de octubre de 2010

Proteccion contra arp-spoofing

Un pequeño log donde intervienen arp estaticas y su monitorizacion con arpon, una buena herramienta para la proteccion de spoofing.

root@sid7:/home/vlan7# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.104
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
#next-hop zeroshell
gateway 192.168.0.1
pre-up /etc/network/interfaces_sec
post-up /usr/sbin/arp -f /etc/sarp.conf
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8
root@sid7:/home/vlan7# cat /etc/resolv.conf
nameserver 8.8.8.8
root@sid7:/home/vlan7# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
root@sid7:/home/vlan7# arp -a
? (192.168.0.1) at AA:BB:CC:DD:EE:FF [ether] PERM on eth0
root@sid7:/home/vlan7# /etc/init.d/arpon status
Checking status of anti ARP poisoning daemon: arpon running.
root@sid7:/home/vlan7# cat /etc/sarp.conf
192.168.0.1
AA:BB:CC:DD:EE:FF
root@sid7:/home/vlan7# cat /etc/arpon.sarpi
# Example of arpon.sarpi
#
192.168.0.1
AA:BB:CC:DD:EE:FF #zeroshell
root@sid7:/home/vlan7# cat /var/log/arpon/arpon.log
08:14:37 - Wait link connection on eth0...
08:14:39 - SARPI on dev(eth0) inet(192.168.0.117) hw(FF:EE:DD:CC:BB:AA)
08:14:39 - Protects these Arp Cache's entries:
08:14:39 - 1) 192.168.0.1 -> AA:BB:CC:DD:EE:FF
08:14:39 - Arp Cache restore from /etc/arpon.sarpi...
08:14:39 - Arp Cache refresh timeout: 10 minuts.
08:14:39 - Realtime Protect actived!
08:15:52 - Request << AA:BB:CC:DD:EE:FF
08:15:52 - Reply >> Send to 192.168.0.1 -> AA:BB:CC:DD:EE:FF
[cut]
08:24:39 - Refresh these Arp Cache entries:
08:24:39 - 1) 192.168.0.1 -> AA:BB:CC:DD:EE:FF
[cut]
vlan7@sid7:~$ sudo dpkg -l |grep arpon
ii arpon 2.0-2 versatile anti ARP poisoning daemon
vlan7@sid7:~$

La rutina diaria. Ya nos han vuelto a hacer un escaneo de puertos...

Examinando el correo enviado a traves de nullmailer, hey no hay necesidad de montar un Postfix solo para implementar un relay, aunque pase por inet. nullmailer se autentica, contra gmail en este caso.

Yo soy la 192.168.0.117 y soy escaneado por la 192.168.0.101, fwlogwatch nos alerta de ello y recibimos el correspondiente correo electronico.


fwlogwatch ALERT: 65 packet(s) from 192.168.0.101
Recibidos
X
Responder
de XXX.YYY@gmail.com
para ZZZ@vlan7.org
fecha 25 de octubre de 2010 15:16
asunto fwlogwatch ALERT: 65 packet(s) from 192.168.0.101
enviado por gmail.com
firmado por gmail.com
ocultar detalles 15:16 (1 hora antes)
fwlogwatch ALERT on sid7: 65 packet(s) from 192.168.0.101 to 192.168.0.117
65 paquetes enviados a nullmailer por el SW logcheck, que previamente habria recibido la alerta por fwlogwatch, una herramienta que a mi me funciona muy bien con Shorewall para examinar de un vistazo los logs importantes a nivel de seguridad.

No me gusta publicar MACs, asi que edito parte de los eventos syslog que nos llegan al correo, dejando solo una de las lineas, ya que despues las mostraremos con un log que nos explica a mas alto nivel, por asi decirlo, todos esos eventos de syslog a nivel kernel mediante el SW psad [port scan attack detector]

sid7.v7.XXX.es 2010-10-25 16:02 System Events
Recibidos
X
Responder
de XXX.YYY@gmail.com
para ZZZ@vlan7.org
fecha 25 de octubre de 2010 16:02
asunto sid7.v7.XXX.es 2010-10-25 16:02 System Events
enviado por gmail.com
firmado por gmail.com
ocultar detalles 16:02 (24 minutos antes)
This email is sent by logcheck. If you no longer wish to receive
such mail, you can either deinstall the logcheck package or modify
its configuration file (/etc/logcheck/logcheck.conf).

System Events
=-=-=-=-=-=-=
Oct 25 15:16:19 sid7 kernel: [104761.341511] Shorewall:net2fw:DROP:IN=eth0 OUT= MAC=[CUT] SRC=192.168.0.101 DST=192.168.0.117 LEN=40 TOS=0x00 PREC=0x00 TTL=127 ID=61700 PROTO=TCP SPT=63436 DPT=10 WINDOW=8190 RES=0x00 SYN URGP=0

[CUT]

Oct 25 15:16:20 sid7 fwlogwatch: ALERT: 65 attempts from 192.168.0.101
Oct 25 15:16:38 sid7 psad: src: 192.168.0.101 signature match: "POLICY HP JetDirect LCD commnication attempt" (sid: 568) tcp port: 9100
Oct 25 15:16:38 sid7 psad: src: 192.168.0.101 signature match: "MISC VNC communication attempt" (sid: 100202) tcp port: 5900
Oct 25 15:16:38 sid7 psad: src: 192.168.0.101 signature match: "MISC MS Terminal Server communication attempt" (sid: 100077) tcp port: 3389
Oct 25 15:16:38 sid7 psad: src: 192.168.0.101 signature match: "DOS MSDTC communication attempt" (sid: 1408) tcp port: 3372
Oct 25 15:16:38 sid7 psad: src: 192.168.0.101 signature match: "MISC Microsoft SQL Server communication attempt" (sid: 100205) tcp port: 1433
Oct 25 15:16:38 sid7 psad: scan detected: 192.168.0.101 -> 192.168.0.117 tcp: [10-10000] flags: SYN tcp pkts: 68 DL: 2
Todas las herramientas nombradas las he podido testear en un sistema corriendo Debian SID. Durante toda la entrada he enlazado las paginas oficiales de los proyectos, pero todos ellos se encuentran empaquetados en los repositorios oficiales de Debian, al menos en la rama sid. Para mas informacion siempre podremos acudir al buscador oficial de Debian.

Comentar que psad utiliza firmas del conocido IDS Snort y del venerable p0f. De vez en cuando puedo observar mensajes de syslog tal que asi:

Oct 25 21:29:44 sid7 psad: imported valid icmp types and codes
Oct 25 21:29:44 sid7 psad: imported p0f-based passive OS fingerprinting signatures
Oct 25 21:29:44 sid7 psad: imported TOS-based passive OS fingerprinting signatures
Oct 25 21:29:44 sid7 psad: imported original Snort rules in /etc/psad/snort_rules/ for reference info
Oct 25 21:29:44 sid7 psad: imported 205 psad Snort signatures from /etc/psad/signatures
A continuacion vemos un informe mas detallado en otro log similar recibido en mi correo y enviado por psad. Veremos que el FW descarta y loguea un total de 204 paquetes, que esta vez yo soy la IP 192.168.0.104 y el atacante es la 192.168.0.110 y que las caracteristicas de este log son muy similares a las del anterior, si no identicas, en las firmas detectadas por el IDS. Dos intentos de autenticacion, un intento de DoS y unos pocos sin catalogar. Todos ellos contra servicios inexistentes en mi maquina.
Este es el log recibido en el correo:

[psad-alert] DL3 src: 192.168.0.110 dst: 192.168.0.104
Recibidos X

Responder

XXX.YYY@gmail.com para usuario 
mostrar detalles 01:28 (1 hora antes)

=-=-=-=-=-=-=-=-=-=-=-= Sun Oct 31 01:28:40 2010 =-=-=-=-=-=-=-=-=-=-=-=


Danger level: [3] (out of 5)

Scanned TCP ports: [10-10000: 204 packets]
TCP flags: [SYN: 204 packets, Nmap: -sT or -sS]
iptables chain: INPUT (prefix "Shorewall:net2fw:DROP:"), 204 packets

Source: 192.168.0.110
DNS: [No reverse dns info available]

Destination: 192.168.0.104
DNS: [No reverse dns info available]

Overall scan start: Sun Oct 31 01:28:29 2010
Total email alerts: 1
Complete TCP range: [10-10000]
Syslog hostname: sid7

Global stats: chain: interface: TCP: UDP: ICMP:
INPUT eth0 204 0 0


[+] TCP scan signatures:

"POLICY HP JetDirect LCD commnication attempt"
dst port: 9100 (no server bound to local port)
flags: SYN
sid: 568
chain: INPUT
packets: 3
classtype: misc-activity

"MISC VNC communication attempt"
dst port: 5900 (no server bound to local port)
flags: SYN
psad_id: 100202
chain: INPUT
packets: 3
classtype: attempted-admin

"MISC MS Terminal Server communication attempt"
dst port: 3389 (no server bound to local port)
flags: SYN
psad_id: 100077 (derived from: 1447 1448 2418)
chain: INPUT
packets: 3
classtype: misc-activity

"DOS MSDTC communication attempt"
dst port: 3372 (no server bound to local port)
flags: SYN
sid: 1408
chain: INPUT
packets: 3
classtype: attempted-dos

"MISC Microsoft SQL Server communication attempt"
dst port: 1433 (no server bound to local port)
flags: SYN
psad_id: 100205
chain: INPUT
packets: 3
classtype: attempted-admin

[+] Whois Information (source IP):
[cut]
Recibo un total de 4 mails de este tipo, enviados los 4 de golpe en un flush de la cola de correo segun puedo comprobar en los logs de syslog, que son irrelevantes para esta entrada. Si que tengo pendiente analizar el siguiente log de /var/log/messages

Oct 31 02:01:29 sid7 kernel: [  174.732092] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:29 sid7 kernel: [ 174.812241] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:29 sid7 kernel: [ 174.892391] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:29 sid7 kernel: [ 174.972541] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:30 sid7 kernel: [ 176.068854] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:30 sid7 kernel: [ 176.149009] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:30 sid7 kernel: [ 176.229154] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Oct 31 02:01:30 sid7 kernel: [ 176.309299] martian destination 0.0.0.0 from 192.168.0.110, dev eth0
Si alguien conoce alguna alternativa a estos paquetes open source para detectar un escaneo de puertos se agradecen comentarios.

Suerte,

lunes 20 de septiembre de 2010

El peligro de las [flash]-cookies

Examinando con la genial extension Live HTTP Headers lo que mandaba mi navegador a una web determinada, me encontre con lo siguiente:

POST /mochiSWF Referer: http://mochibot.com/my/core.swf?mv=5&fv=7&v=LNX%2010%2C1%2C82%2C76&swfid=46030122&l=10301&f=_level0&sb=remote

Content-Type: application/x-www-form-urlencoded

Content-Length: 766


%5F%5Fmochibot=%5Btype+Function%5D&TAG=46030122&SV=7&MV=5&REF=&sb=remote&f=%5Flevel0&l=10301&swfid=46030122&v=LNX+10%2C1%2C82%2C76&fv=7&mv=5&lv=%5Flevel0%2E%5F%5Fmochibot%5F%5F46030122%2Elv&GUID=ebda978824f0903ca606498e5d96d3d5&SH=32&SW=1072&T=4756&TZ=%2D120&URL=...

Todo eso estaba mandando mi navegador al servidor de mochibot, de forma totalmente transparente para mi. Vemos en el contenido del paquete el SWF culpable: un fork del genial xspf musicplayer.

Tengo una debian sid con flare y una palabra clave: mochibot. Let's give a shot.

frame 1 {
function playerLoad() {
__com_mochibot__('46030122', this, 10301);
fillColor();
fillDefaults();
fillOther();
}

function __com_mochibot__(swfid, mc, lv) {
var x;
var g;
var s;
var fv;
var sb;
var u;
var res;
var mb;
var mbc;
mb = '__mochibot__';
mbc = 'mochibot.com';
g = _global ? _global : _level0._root;
if (g[mb + swfid]) {
return g[mb + swfid];
}
s = System.security;
x = mc._root.getSWFVersion;
fv = x ? mc.getSWFVersion() : (_global ? 6 : 5);
if (!s) {
s = {};
}
sb = s.sandboxType;
if (sb == 'localWithFile') {
return null;
}
x = s.allowDomain;
if (x) {
s.allowDomain(mbc);
}
x = s.allowInsecureDomain;
if (x) {
s.allowInsecureDomain(mbc);
}
u = 'http://' + mbc + '/my/core.swf?mv=5&fv=' + fv + '&v=' + escape(/:$version) + '&swfid=' + escape(swfid) + '&l=' + lv + '&f=' + mc + (sb ? '&sb=' + sb : '');
lv = fv > 6 ? mc.getNextHighestDepth() : (g[mb + 'level'] ? g[mb + 'level'] + 1 : lv);
g[mb + 'level'] = lv;
if (fv == 5) {
res = '_level' + lv;
if (!eval(res)) {
loadMovieNum(u, lv);
}
return res;
}
res = mc.createEmptyMovieClip(mb + swfid, lv);
res.loadMovie(u);
return res;
}
De mochibot.com :

MochiBot is a Flash traffic monitoring tool (similar to a hit counter) that tracks the performance of individual Flash content files (SWFs) no matter where they end up on the web. If your SWF is on 5 different servers, then MochiBot will count the number of views that SWF got for all 5 servers. It's perfect for tracking how viral your Flash content is.

* [Are they Pirates?]
See who's sharing your Flash content

Track how many websites your Flash content is hosted on (AKA, viral distribution).
* [You're a star!]
Track your performance

See if your Flash content's popularity is on the rise or taking a tumble.
* [Keep 'em coming back for more!]
How compelling is your content?

Find out if your audience is viewing your Flash content more just than once.
* [All eyes this way please]
Learn where your traffic is coming from

The Host Report gives traffic results for each website hosting your Flash content.
*
Never worry about Flash Pirates again

MochiBot knows where your Flash files are at all times so that you don't have to.

Eso es lo que esta chivandose de nosotros a mochibot. Despues me di cuenta de que el fork es open source, y yo trasteando con flare para encontrar el bicho.

Una defensa desde la parte del servidor seria reemplazar los SWF "maliciosos" por los swf originales de sourceforge en la URL http://musicplayer.sourceforge.net/ y todo solucionado. Pongo maliciosos entre comillas porque es de gran ayuda en una investigacion cualquier rastro, pero nosotros no somos criminales y no queremos dejar rastro. Bueno, seamos realistas, hasta donde podamos queremos defender nuestra privacidad en la red todo lo posible.

Por cierto, una extension de FF que elimina cookies Flash es BetterPrivacy, muy recomendable.

Para los que no useis Firefox, y para los que lo useis tambien, os puede servir bleachbit, es como el ccleaner pero mas potente. Es capaz de borrar falsh-cookies ademas de muchos otros elementos. Genial.

Y siempre podemos entrar a la pagina oficial de Adobe a controlar las preferencias sobre las Flash-cookies

Suerte,

sábado 21 de agosto de 2010

Falsos positivos en rarcrack

A mi rarcrack me estaba dando falsos positivos, asi que esto es lo que hice.

~Comprobar la cadena que devuelve el .rar de ejemplo al pasarle un password correcto:
$ unrar t -y -p100 test.rar

UNRAR 3.90 beta 2 freeware Copyright (c) 1993-2009 Alexander Roshal


Testing archive test.rar

Testing LICENSE OK
All OK

Esa es la cadena: "All OK".

~Editar rarcrack.c:
Sustituir:
if (strcasestr(ret, "ok") != NULL) {
por
if (strstr(ret, "All OK") != NULL) {

La funcion strcasestr no es sensible a mayusculas / minusculas, no esta optimizada. Cambiar por strstr

~Compilar de nuevo:
make
sudo make install

De todas formas es leeeeeento este rarcrack. Como alternativa tenemos por ejemplo a cRARk

sábado 14 de agosto de 2010

Taller WIFI por Vic_Thor

Excelente, para variar:

http://www.wadalbertia.org/foro/viewtopic.php?f=7&t=5589

viernes 13 de agosto de 2010

MitM contra sshv2 con jmitm2 (sin downgrade a sshv1)

~0~ Escenario:

sshd: Ubuntu 10.04 x64 ~ 192.168.1.100

Victima: BT4 Final ~ 192.168.1.101

Atacante: BT4-R1 ~ 192.168.1.103

~1~ Atacante se baja jmitm2 y lo configura:

~2~ Atacante inicia jmitm2 y hace ARP-spoof (bidireccional) con ettercap:

~3~ Victima se conecta al server sshd y Atacante captura las credenciales sin cortar la comunicacion (MitM):

Nota: El exito del ataque depende totalmente de que la victima acepte el WARNING de que las claves RSA han cambiado (evidente).

viernes 6 de agosto de 2010

Taller de TCP/IP

Excelente PDF de Vic_Thor. Podeis descargarlo de la direccion oficial de Wadalbertia.

Oldie but goodie

Suerte,

jueves 29 de julio de 2010

SASL + TOR en Freenode [irssi]

~TOR a traves de SOCKS:
/etc/init.d/tor start
socat TCP4-LISTEN:7777,fork SOCKS4A:127.0.0.1:p4fsi4ockecnea7l.onion:6667,socksport=9050 &

El _unico_ nodo de salida TOR autorizado por Freenode puede verse lanzando la siguiente consulta:
dig +short irc.tor.freenode.net cname

~Instalar SASL:
mkdir -p ~/.irssi/scripts/autorun
wget http://www.freenode.net/sasl/cap_sasl.pl -P ~/.irssi/scripts/
ln -s ~/.irssi/scripts/cap_sasl.pl ~/.irssi/scripts/autorun/

~Habilitar SASL en irssi:
/server add -ssl -network freenodetor localhost 7777
/load perl
/sasl set freenodetor tu_nick tu_password DH-BLOWFISH
/sasl save
/save

~Comprobar ~/.irssi/config:
{
address = "localhost";
chatnet = "freenodetor";
port = "7777";
use_ssl = "no";
ssl_verify = "no";
autoconnect = "no";
}

~Having fun
torify irssi

lunes 26 de julio de 2010

Print your blog. Blog to PDF

Empezo siendo gratuito obtener el PDF, despues lo hicieron de pago, y aqui decidi no decir que en la cache del navegador se podia encontrar el PDF.

Bien, acabo de probarlo de nuevo, y ahora guarda en la cache un PDF por pagina, y con nombres aleatorios, asi que no podemos tirar de herramientas como el bello pdftk para unir las paginas. Asi que, antes de hacer trampas, he probado otras alternativas como rss2pdf, aunque con esta ultima no he conseguido imprimir las imagenes, ni siquiera jugando con firebug para alterar las opciones validadas en el lado del cliente.

Bueno, a base de probar cosas he conseguido bajar el pdf registrandome, guardando el pdf con las imagenes por defecto de portada y contraportada, logeandome, cambiando las imagenes y... y ahi va mi primer video del blog:



No soy diseñador, asi que no ha quedado profesional ni mucho menos, pero creo que se ve la idea, que es encontrar la ruta del servidor web donde se almacena el PDF.

Suerte,