Por que os bytes que estou recebendo não são os bytes que enviei?

0

Estou trabalhando em um site de jogos de segurança, tentando automatizar o que estou fazendo usando pwntools . Eu me deparei com um problema em algum lugar no meu processo, no entanto. Quando tento executar o programa vulnerável no servidor com a minha string de exploração, ele é alterado em algum lugar entre o script do Python 2.7 em minha máquina e retornado para mim.

Meu processo geral para esse desafio específico é o seguinte:

  1. Iniciar conexão SSH
  2. Abra um shell através da conexão SSH, tentei "/ bin / bash", "/ bin / sh"
  3. Espere até eu receber o aviso
  4. Envie o comando no formato "% s% s"% (program_on_server, payload_string)

Minha cadeia de carga é os bytes "\ x74 \ x84 \ x04 \ x08" repetidos muitas vezes. O problema que estou tendo é que quando o servidor repete o que eu enviei para o shell em execução, isso é transformado em "\ x74 \ x84 \ x07 \ x08 \ x1b \ x5b \ x4b". Depois de alguns problemas, eu não consigo descobrir de onde os bytes extras estão vindo, ou porque o \ x04 está sendo transformado em \ x07. Pwntools parece pensar que está enviando os bytes corretos, a saída de depuração mostra os corretos, pelo menos, então estou pensando que o problema está em algum lado do servidor na cadeia de ssh para bash para o programa vulnerável. Portanto, postando aqui e não em algum lugar mais relacionado a pwntools. Alguém tem alguma idéia do que pode estar causando isso e por que está fazendo isso?

O seguinte é o meu código, com funções para onde as informações de login seriam enviadas.

#!/usr/bin/python2
from pwn import *

context.log_level = 'debug'

def makePayloadString():
    return p32(0x8048474)* 20 # p32 takes a 32 bit number and converts it to bytes

sshConnection = ssh(user=getUser(), host=getHost(), password=getPassword())
command = "%s %s" % (getProgramLocation(), makePayloadString())
shell = sshConnection.shell("/bin/bash")
shell.recvuntil("$ ", timeout=10)
shell.sendline(command)
shell.recvline(timeout=10)
    
por Paul 28.09.2015 / 01:26

1 resposta

2

Parece que os bytes que você está recebendo de volta do lado do servidor estão vindo do shell, reagindo aos bytes de entrada como se eles estivessem sendo digitados na sessão de terminal.

Não tenho certeza do que 0x84 é interpretado como um código ascii de não 7 bits, mas o 0x04 seria equivalente a um caractere Ctrl-D (EOF), que o bash rejeitará se não for inserido no início da linha. O Bash enviará um caractere 0x07 (BEL) para o terminal para tocar a campainha (beep). O 0x08 é um caractere backspace (BS), que bash ecoa de volta a seqüência de escape ANSI (ESC [K) (\ x1b \ x5b \ x4b) que faz o cursor de entrada fazer um espaço à esquerda.

Em um terminal interativo, tente digitar os caracteres 't', e você poderá reproduzir a saída programática que você vê de perto.

Talvez esses bytes devam ser enviados para uma entrada de programa diferente, em vez de bash ou sh?

    
por 28.09.2015 / 01:57

Tags