No momento, estou tentando resolver um desafio do Capture The Flag que envolve a tentativa de escalar privilégios, aproveitando uma exploração em um script bash.

O script primeiro faz o seguinte para obter todos os soquetes com o protocolo TCP no estado LISTEN:

output=$($_netstat -ntpl 2> /dev/null | $_egrep '^t')

e, em seguida, analisa a linha de saída por linha. Uma das coisas que faz para cada linha é esta:

if [[ "$cur_syn" == "0" ||  "$max_syn" != "$cur_syn" ]]
    then    continue
fi

$cur_syné o valor da Recv-Qcoluna retornado por netstat e $max_syné o valor da Send-Qcoluna.

Portanto, apenas um soquete que esteja no estado LISTEN e com Recv-Q! = 0 e Recv-Q == Send-Q passará nessas verificações.

netstato homem afirma que:

Recv-Q
Estabelecido: A contagem de bytes não copiados pelo programa do usuário conectado a esse soquete. Ouvindo: Desde o Kernel 2.6.18, esta coluna contém o atual registro pendente de sincronização.

e

Send-Q
Estabelecido: A contagem de bytes não reconhecidos pelo host remoto. Escutando: Desde o Kernel 2.6.18, esta coluna contém o tamanho máximo do backlog do syn.

O problema é que parece que não consigo criar um soquete que tenha um Send-Q diferente de 0.

Se minha interpretação estiver correta, o valor Send-Q para um soquete que está ouvindo é o tamanho máximo da lista de pendências, que é o backlogparâmetro na função listen (2) de C. Mas mesmo quando eu crio um soquete de servidor de escuta com uma lista de pendências de tamanho 3, netstatainda informa o Send-Q como sendo 0! O que estou fazendo errado?

Para sua informação, consegui fazer a Recv-Qalteração com vários clientes conectados a um soquete de servidor que recebeu um SIGSTOP. Recv-Qsobe até maximum size of the syn backlog + 1e todas as conexões são recusadas. Mas, infelizmente, Send-Qpermanece inalterado.

Léo Vital
fonte