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-Q
coluna retornado por netstat e $max_syn
é o valor da Send-Q
coluna.
Portanto, apenas um soquete que esteja no estado LISTEN e com Recv-Q! = 0 e Recv-Q == Send-Q passará nessas verificações.
netstat
o 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 backlog
parâ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, netstat
ainda informa o Send-Q como sendo 0! O que estou fazendo errado?
Para sua informação, consegui fazer a Recv-Q
alteração com vários clientes conectados a um soquete de servidor que recebeu um SIGSTOP. Recv-Q
sobe até maximum size of the syn backlog + 1
e todas as conexões são recusadas. Mas, infelizmente, Send-Q
permanece inalterado.