Python se ha convertido en el lenguaje más usado para desarrollar herramientas dentro del ámbito de la seguridad. Esta charla se centrará en las diferentes formas en que un analista puede aprovechar el lenguaje de programación Python tanto desde el punto de vista defensivo como ofensivo.
Desde el punto de vista defensivo Python es una de las mejores opciones como herramienta de pentesting por la gran cantidad de módulos que nos pueden ayudar a desarrollar nuestras propias herramientas con el objetivo de realizar un análisis de nuestro objetivo.
Desde el punto de vista ofensivo podemos utilizar Python para recolección de información de nuestro objetivo de forma pasiva y activa. El objetivo final es obtener el máximo conocimiento posible en el contexto que estamos auditando. Entre los principales puntos a tratar podemos destacar:
1.Introducción a Python para proyectos de ciberseguridad(5 min)
2.Herramientas de pentesting(10 min)
3.Herramientas Python desde el punto de vista defensivo(10 min)
4.Herramientas Python desde el punto de vista ofensivo(10 min)
4. Books
4
● Introducción al desarrollo seguro
● Aspectos fundamentales de desarrollo seguro
● Herramientas OWASP
● Seguridad en aplicaciones Android
● Seguridad en proyectos NodeJS
● Seguridad en proyectos Python
● Análisis estático y dinámico en aplicaciones C/C++
● Metodologías de desarrollo
7. Agenda
• Introducción a Python para proyectos de
ciberseguridad
• Herramientas de pentesting
• Herramientas Python desde el punto de vista
defensivo
• Herramientas Python desde el punto de vista
ofensivo
7
8. Python para proyectos de ciberseguridad
8
1. Diseñado para la creación rápida de prototipos
2. Estructura simple y limpia, mejora la legibilidad y facilidad de
uso.
3. Amplia biblioteca, también facilidad de interconexión
4. Ampliamente adoptado, la mayoría de las distribuciones de
Linux lo instalan por defecto.
12. Herramientas de pentesting
12
import re
input_ip = input('Enter the ip:')
flag = 0
pattern = "^d{1,3}.d{1,3}.d{1,3}.d{1,3}$"
match = re.match(pattern, input_ip)
if (match):
field = input_ip.split(".")
for i in range(0, len(field)):
if (int(field[i]) < 256):
flag += 1
else:
flag = 0
if (flag == 4):
print("valid ip")
else:
print('No match for ip or not a valid ip')
https://docs.python.org/3/library/re.html
22. Scraping
22
#!/bin/python
from bs4 import BeautifulSoup
import requests
url = input("Enter a website to extract the URL's from:
")
response = requests.get("http://" +url)
data = response.text
soup = BeautifulSoup(data)
for link in soup.find_all('a'):
print(link.get('href'))
25. OSINT
25
● Recon-ng
○ https://github.com/lanmaster53/recon-ng
○ Framework para realizar reconocimientos
basados en web.
● Belati
○ https://github.com/aancw/Belati
○ Recopilación de datos y documentos públicos y
del sitio web y otros servicios.
● Pwndb
○ https://github.com/davidtavarez/pwndb
○ Buscar credenciales filtradas
41. Manipulación de paquetes
41
● Scapy
○ https://scapy.net
○ Manipulación y decodificación de paquetes.
○ Enviar, rastrear, diseccionar y falsificar paquetes
de red.
42. Manipulación de paquetes
42
from scapy.all import *
packetCount = 0
def customAction(packet):
global packetCount
packetCount += 1
return "{}) {} → {}".format(packetCount,
packet[0][1].src, packet[0][1].dst)
## Setup sniff, filtering for IP traffic
sniff(filter="ip",prn=customAction)
43. Manipulación de paquetes
43
from scapy.all import ICMP
from scapy.all import IP
from scapy.all import sr1
from scapy.all import ls
if __name__ == "__main__":
dest_ip = "www.google.com"
ip_layer = IP(dst = dest_ip)
print(ls(ip_layer)) # displaying complete layer info
# accessing the fields
print("Destination = ", ip_layer.dst)
print("Summary = ",ip_layer.summary())
44. Sniffing de paquetes
44
from scapy.all import *
def main():
sniff(prn=http_header, filter="tcp port 80")
def http_header(packet):
http_packet=str(packet)
if http_packet.find('GET'):
return print_packet(packet)
def print_packet(packet1):
ret = "-------------------------------[ Received Packet ] -------------------------------n"
ret += "n".join(packet1.sprintf("{Raw:%Raw.load%}n").split(r"rn"))
ret += "---------------------------------------------------------------------------------n"
return ret
if __name__ == '__main__':
main()