Slide 1

Slide 1 text

Hacking ético con herramientas python José Manuel Ortega | @jmortegac

Slide 2

Slide 2 text

http://jmortega.github.io

Slide 3

Slide 3 text

http://jmortega.github.io

Slide 4

Slide 4 text

https://speakerdeck.com/jmortega

Slide 5

Slide 5 text

Agenda Introducción al pentesting con python Herramientas avanzadas Módulos(Sockets,Requests,Beautifulsoup,Shodan) Análisis de metadatos Demo pentesting-tool Análisis de puertos(nmap,pcapy,scapy)

Slide 6

Slide 6 text

Introducción al pentesting con python • Multiplataforma • Prototipos y pruebas de concepto • Muchas herramientas y librerías enfocadas a la seguridad • Buena documentación

Slide 7

Slide 7 text

Introducción al pentesting con python

Slide 8

Slide 8 text

SQL Map

Slide 9

Slide 9 text

Sparta • http://sparta.secforce.com • Pruebas de pentesting en las fases de exploración y enumeración

Slide 10

Slide 10 text

The Harvester https://github.com/laramies/theHarvester

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

W3af

Slide 13

Slide 13 text

W3af • Web application attack and audit framework • Framework de test de intrusión web • Escáner de vulnerabilidades • Permite automatizar las tareas repetitivas de pentesting

Slide 14

Slide 14 text

Introducción al pentesting con python

Slide 15

Slide 15 text

Security Tools builder • https://github.com/abirtone/STB

Slide 16

Slide 16 text

Paso de parámetros import argparse

Slide 17

Slide 17 text

Ping Scan NetWork

Slide 18

Slide 18 text

Ping Scan NetWork

Slide 19

Slide 19 text

Ping Scan NetWork from subprocess import Popen, PIPE

Slide 20

Slide 20 text

Sockets module import socket socket. socket(socket.AF_INET,socket.SOCK_STREAM) #TCP result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print "Port is open" else: print "Port is not open"

Slide 21

Slide 21 text

Socket port scanner from socket import AF_INET, SOCK_STREAM, setdefaulttimeout

Slide 22

Slide 22 text

Socket port scanner

Slide 23

Slide 23 text

Obtain banner server

Slide 24

Slide 24 text

Obtain banner server

Slide 25

Slide 25 text

Socket resolving IP/domain

Slide 26

Slide 26 text

Socket cliente /servidor

Slide 27

Slide 27 text

Requests module

Slide 28

Slide 28 text

Requests library

Slide 29

Slide 29 text

Requests library

Slide 30

Slide 30 text

Autenticación HTTP Basic Digest MD5 /SHA

Slide 31

Slide 31 text

Requests Proxy http_proxy = "http://10.10.10.10:3000" https_proxy = "https://10.10.10.10:3000" ftp_proxy = "ftp://10.10.10.10:3000" proxyDict = { "http" : http_proxy, "https" : https_proxy, "ftp" : ftp_proxy } r = requests.get(url, headers=headers, proxies=proxyDict)

Slide 32

Slide 32 text

Beautiful Soup • Parsea y permite extraer información de documentos HTML. • Soporta múltiples parsers para tratar documentos XML,HTML(lxml,html5lib). • Permite buscar elementos HTML,tales como enlaces, formularios o cualquier etiqueta HTML.

Slide 33

Slide 33 text

Beautiful Soup / extraer links

Slide 34

Slide 34 text

Beautiful Soup / extraer links

Slide 35

Slide 35 text

WebCrawler

Slide 36

Slide 36 text

Scraping images and pdfs

Slide 37

Slide 37 text

Scraping

Slide 38

Slide 38 text

Scraping

Slide 39

Slide 39 text

Shodan • Rastrear servidores y dispositivos IP • Obtención de banners • Escaneo de puertos con el API de python

Slide 40

Slide 40 text

Shodan

Slide 41

Slide 41 text

Shodan • https://developer.shodan.io

Slide 42

Slide 42 text

Shodan import shodan SHODAN_API_KEY = "insert your API key here" api = shodan.Shodan(SHODAN_API_KEY)

Slide 43

Slide 43 text

Shodan API

Slide 44

Slide 44 text

Shodan Search

Slide 45

Slide 45 text

Shodan API

Slide 46

Slide 46 text

Shodan banners

Slide 47

Slide 47 text

Shodan host info

Slide 48

Slide 48 text

Shodan ftp anonymous access

Slide 49

Slide 49 text

DNSPython • Permite resolver nombres de dominios a direcciones IP y viceversa • Existen registros para direcciones ipv4,ipv6,servidores de correo

Slide 50

Slide 50 text

DNSPython

Slide 51

Slide 51 text

Python whois

Slide 52

Slide 52 text

Python whois

Slide 53

Slide 53 text

Builtwith pip install builtwith builtwith.parse(‘http://www.sh3llcon.es’)

Slide 54

Slide 54 text

Análisis de metadatos • Metadatos en documentos PDF • pyPDF2 • Metadatos en imágenes • from PIL.ExifTags import TAGS, GPSTAGS

Slide 55

Slide 55 text

Análisis de metadatos

Slide 56

Slide 56 text

Análisis de metadatos

Slide 57

Slide 57 text

Análisis de metadatos

Slide 58

Slide 58 text

Análisis de puertos(nmap,scapy)

Slide 59

Slide 59 text

Python-nmap

Slide 60

Slide 60 text

Python-nmap • Automatizar el escaneo de puertos • Se puede tanto de forma síncrona como asíncrona import nmap #síncrono nm = nmap.PortScanner() # nm.scan(‘ip/rango’,’puertos’) results = nm.scan('127.0.0.1', '22,25,80,443')

Slide 61

Slide 61 text

Python-nmap #obtenemos un diccionario con el resultado del scan print(nm.csv()) import nmap nm = nmap.PortScanner() results = nm.scan(arguments="-n -A -sT -p22,80,8080,5432,3306")

Slide 62

Slide 62 text

NmapScanner

Slide 63

Slide 63 text

NmapScanner for port in port_list: NmapScanner().nmapScan(ip, port)

Slide 64

Slide 64 text

NmapScanner {"192.168.56.101": [ {"tcp": "21"}, {"tcp": "22"}, {"tcp": "23"}, {"tcp": "25"}, {"tcp": "80"}] }

Slide 65

Slide 65 text

Python-nmap #Asíncrono nm_async = nmap.PortScannerAsync() def callback_result(host, scan_result): print '------------------' print host, scan_result nm_async.scan(hosts='192.168.1.0/30', arguments='-sP', callback=callback_result) while nm_async .still_scanning(): print("Waiting >>>") nm_async.wait(2)

Slide 66

Slide 66 text

Nmap-scripts • Permiten la programación de rutinas para encontrar posibles vulnerabilidades en un objetivo determinado • Primero determinar si el puerto se encuentra abierto para posteriormente detectar vulnerabilidades en el servicio abierto por dicho puerto nm.scan(arguments="-n -A -p3306 -- script=/usr/share/nmap/scripts/mysql-info.nse")

Slide 67

Slide 67 text

Nmap-scripts https://nmap.org/nsedoc/scripts

Slide 68

Slide 68 text

Nmap-scripts

Slide 69

Slide 69 text

scapy • Equivalente al wireshark • Capturar paquetes • Filtrar por protocolos • Leer y escribir pcap • Analizar el tráfico que genera la red

Slide 70

Slide 70 text

Scapy commands • ls(TCP)

Slide 71

Slide 71 text

Scapy commands • Generar paquetes • tcp=IP(dst='google.com‘)/TCP(dport=80) • Ver información de un paquete • tcp.show() / tcp.show2() • Enviar un paquete • send(tcp) /sendp(tcp)

Slide 72

Slide 72 text

Scapy commands • Capturar n paquetes de red • pkt = sniff(filter="tcp“,count=n) • Leer pcap • file=rdpcap('demo.pcap') • file.summary() • file.sessions() • file.show()

Slide 73

Slide 73 text

Escáner de puertos con scapy from scapy.all import sr1, IP, TCP

Slide 74

Slide 74 text

Escáner de red con scapy from scapy.all import *

Slide 75

Slide 75 text

Scapy traceroute

Slide 76

Slide 76 text

Paramiko • Conexiones ssh 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') paramiko.util.log_to_file('paramiko.log')

Slide 77

Slide 77 text

Paramiko • PyCrypto • Criptography • Soporta autenticación mediante una SSH key en lugar de user y password

Slide 78

Slide 78 text

Paramiko / SSH Key import paramiko ssh = paramiko.SSHClient() rsa_key =paramiko. RSAKey.from_private_key_file('/home/user/.ssh/id_rsa', password='password') ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(‘127.0.0.1', pkey=rsa_key, username=‘user', password=‘password')

Slide 79

Slide 79 text

Paramiko / abrir una sesión

Slide 80

Slide 80 text

Check FTP Login Anonymous import ftplib

Slide 81

Slide 81 text

Plugins

Slide 82

Slide 82 text

metasploit • python-msfrpc import msfrpc

Slide 83

Slide 83 text

Metasploit > msfconsole

Slide 84

Slide 84 text

Metasploit API • Llamadas en formato msgpack • https://community.rapid7.com/docs/DOC-1516 cmdMysqlLogin="""auxiliary/scanner/mysql/mysql_login set RHOSTS """ + self.ip cmdMysqlLogin = cmdMysqlLogin +"""\nrun """ print self.client.call('console.write',[self.console['id'],cmdMysqlLogin]) self.processData(self.console['id'])

Slide 85

Slide 85 text

Nexpose • Herramienta desarrollada por Rapid7 para el escaneo y descubrimiento de vulnerabilidades. • Permite el acceso programático a otros programas por medio de peticiones HTTP/s • Las respuestas se devuelven en formato XML • BeautifulSoup para obtener los datos del servidor de vulnerabilidades

Slide 86

Slide 86 text

Nexpose

Slide 87

Slide 87 text

https://github.com/jmortega/python-pentesting

Slide 88

Slide 88 text

Pentesting tool

Slide 89

Slide 89 text

https://github.com/jmortega/sh3llcon_python

Slide 90

Slide 90 text

Referencias http://docs.shodanhq.com http://www.secdev.org/projects/scapy http://www.pythonsecurity.org http://thehackerway.com

Slide 91

Slide 91 text

Books

Slide 92

Slide 92 text

Books

Slide 93

Slide 93 text

Books

Slide 94

Slide 94 text

Thank you! José Manuel Ortega | @jmortegac