Procurando a Syscall Table em Linux Kernel 5.x.x
📌 Criando um software para capturas de sys_call_tables() em kernel 5.x.x📌 Explicação geral sobre todo o corpo do software📌 Conhecendo outros métodos de capturas sem utilizarmos o software📌 Iniciando o módulo e descarregando o buffer do kernel
🔮 Criando um software para capturas de sys_call_tables() em kernel 5.x.x
- Vamos apresentar então o nosso código aqui:
- Bom, podemos observar que no nosso cabeçalho de includes, temos um novo include chamado
kprobe
. Temos muito o que falar a respeito dele nesse tópico e por isso separei mais um capítulo para explicar de forma bem explicada como nós conseguimos pegar o endereço do sys_call_table() no kernel 5.x.x. Mas então... o que seria o kprobe?
Kprobe é uma biblioteca muito importante para esse projeto, já que o Kernel sofreu diversas modificações em suas atualizações. Hoje posso dizer que existe uma maior dificuldade em conseguirmos hookar uma syscall para que possamos fazer um Rootkit (já que esse é o seu intuito de está lendo esse git). Bom, vamos deixar de enrolação e vamos falar o que é a library kprobe. O sistema kprobe permite inserir pontos de interrupção dinamicamente em um Kernel em execução. Básicamente iremos utiliza-lo para cumprir a função do kallsyms_lookup_name() para pesquisar a si mesmo.
- Talvez essa explicação tenha ficado bem rasa, mas caso você queira compreender um pouco mais sobre o kprobe, recomendo você ler aqui. Bom, mas agora é hora de darmos continuidade a nossa explicação.
- Temos aqui então a primeira parte da estrutura do nosso software. O que está acontecendo nessa função é o seguinte. Simplesmente nós declaramos uma estrutura kprobe com o campo
.symbol_name
predefinido comokallsyms_lookup_name()
. A primeira vez em que o kprobe é registrado, podemos então desreferenciar o.addr
para obtermos o endereço de memória.
- Bom. Partindo agora para a próxima estrutura do nosso código, podemos observar a função de inicialização de carregamento do nosso módulo no Kernel. Primeiramente nós estamos registrando em nosso Kernel o kprobe para que possamos procurar pela função que declaramos no campo
.symbol_name
na primeira parte da estrutura do nosso software. Logo abaixo contamos com umpr_alert()
, função essa que irá exibir um alerta nos logs de registros do kernel junto com a mensagem e logo afrente o endereço de memória que queríamos obter e caso o retorno for igual a 0, o nosso programa funcionará.
- Possuímos aqui então a nossa última estrutura do nosso código. Essa estrutura é responsável por descarregar o buffer do Kernel e com isso a nossa mensagem que foi exibida após nós termos encontrado o endereço e memória, será apagado.
Conhecendo outros métodos de captura sem utilizarmos o software
- Podemos fazer capturas do endereço de memória sem precisarmos utilizar o software que descrevemos acima. Bom, são alguns pequenos comandos que podemos incorporar em nosso terminal para que possamos receber o resultado do que queríamos encontrar. Podemos utilizar o seguinte comando:
sudo cat /proc/kallsyms | grep kallsyms_lookup_name > address.txt
e após isso, digitecat address.txt
e veja o retorno que você recebeu dentro do arquivo de texto. Bom, o retorno será o endereço de memória que você estava procurando. Simples, não?
Iniciando o módulo e descarregando o buffer do kernel
- Para que a gente possa utilizar o nosso software e capturar o nosso endereço de memória, precisamos primeiramente montar o nosso módulo utilizando o comando
make
. Vá até o caminho onde está este projeto e digitemake
no terminal e após todo o módulo ter sido montado, é hora de você executa-lo. Digiteinsmod FindSyscall.ko
e confira nos logs de registro do kernel utilizando o comandodmesg
.
Esse foi o endereço retornado em minha máquina e na sua máquina o endereço será diferente do meu. E para descarregarmos o buffer do kernel, apenas digite rmmod FindSyscall.ko
e o seu Kernel não terá mais nada se digitar dmesg
.
Bom, esse conteúdo aqui foi super necessário para que nós pudessemos dar continuidade aos nosso projeto, então criei esse tópico específico para continuarmos os nossos estudos sobre LKM e RK. Não esquecendo, esse código não foi eu quem criei mas com base no que estudei, me interessei em explica-lo para todos vocês sobre o meu código. O criador do código é o f0lg0, então todos os créditos do código será para ele.
Espero que vocês tenham gostado desse tópico e se você estiver interessado em criar seu rootkit, continue lendo meus tópicos, todos os dias estarei trazendo aqui mais tópicos com o mesmo intuito e com isso iremos criar o nosso Rootkit 5.x.x! Espero vocês no próximo Git! Até breve!
~# Mark Disconnected...