Pwntools é um framework para CTFs e desenvolvimento de exploits, escrito em python, com o objetivo principal de agilizar prototipagem e desenvolvimento, mas não tão útil assim caso seja algo mais "profissional".
Instalando
Instalar o pwntools é simples. O requisito básico é ter o python3 e o pip (referente ao python 3) instalado. Caso esteja usando alguma distribuição debian based (ubuntu, kali, debian), os comandos são os seguintes:
Para utilizar o pwntools, primeiro o importamos com from pwn import * e então utilizamos as suas funções como seria feito em python usualmente, por exemplo no código abaixo:
from pwn import*# Cria uma comunicação com um processop =process('./communication')whileTrue:# Recebe uma linha no formato byte array line = p.recvline()# Decoda-se essa linha em UTF-8 (transformando em string) line = line.decode("UTF-8")print(line)# Forma uma lista baseada nessa linha, dividindo no ' ' line = line.split(' ')print(line) result =int(line[0])*int(line[2])# Envia uma linha com o resultado obtido# No formato byte array (encodado) p.sendline(str(result).encode())
Diferentes Módulos
O pwntools tem vários módulos para diferentes funções, no vídeo sobre comunicações focamos principalmente no módulo Tubes, que permite interação entre processos e algumas ferramentas de redes, mas existem outros que são tão utilizados quanto esse.
Tubes
Módulo relacionado a comunicação e ferramentas de redes/interação entre processos.
Os principais comandos são:
from pwn import*# process(nomeprocesso) - cria um canal de comunicação com um processo p =process('sh')# remote("ip", porta) - cria um canal de comunicação com um servidor r =remote('127.0.0.1', 1337)# a maioria dos comandos de remote e processos são iguais# sendline(bytearray) - Envia um byte array para o servidor p.sendline(b'AAAAA')# recvline() - Recebe uma linha (em bytes) do servidor line = p.recvline()# recvuntil(b'bla') - Recebe e retorna tudo até a string especificada no argumento (inclusive)all= p.recvuntil(b': ')# interactive() - Cria uma sessão interativa (como no terminal) p.interactive()# ssh('user', 'ip', password='senha') - Cria uma sessao de ssh session =ssh('ganesh', 'gitbook.ganeshicmc.com', password='senha123')# p = session.process('sh')
Utility
Utilitários no geral, como manipulação de bytes, hashing e manipulação de arquivos
Manipulação de números/bytes
from pwn import*# pack(inteiro) - transforma um número em bytearraypack(67305985)# retorna b'\x01\x02\x03\x04'# unpack(bytearray) - transforma bytearray em inteirounpack(b'\x01\x02\x03\x04')# retorna 67305985# p32(numero) - transforma um número em um bytearray de 32 bits# p64(numero) - transforma um número em um bytearray de 64 bits# levam em conta o contexto (bom para transformar endereços para little endian)p32(0x80044242)# retorna b'BB\x04\x80' (B é 0x42)
Arquivos
from pwn import*# write('nomearquivo', 'dados') # escreve em um arquivowrite('oi.txt', 'tudobom')# read('nomearquivo', quantidadeBytes) # lê X caracteres de um arquivoread('oi.txt', 5)# retorna 'tudob'
O módulo context serve para mudar especificações de arquitetura, log, timeout, endianness dos arquivos... que tal dar uma olhada nele?
Outros
Outros módulos que não vamos falar sobre aqui estão na documentação oficial (e no tutorial) nos links extras.
Links extras
A documentação do pwntools não é muito clara apesar de ter bastante coisa, mas o repositório pwntools-tutorial funciona como uma boa referência para a biblioteca.