Índice / Módulo 3 — Terminal y Automatización

3.5 Terminales avanzadas y editores

La diferencia entre un pentest cómodo y uno frustrante suele estar en el entorno de trabajo. Tmux para mantener sesiones vivas, organizar el trabajo en paneles y automatizar el arranque del laboratorio. Kitty como terminal moderno con soporte de imágenes, layouts y atajos configurables. Vim porque siempre hay un momento en el que solo tienes una conexión SSH y un editor de texto, y ese momento define cuánto pierdes.

3.5.1 Tmux: sesiones, ventanas, paneles, atajos y scripting

Tmux es un multiplexor de terminal: dentro de una sola conexión SSH puedes tener múltiples sesiones, cada una con múltiples ventanas, cada ventana con múltiples paneles. Si se cae la conexión, las sesiones siguen corriendo en el servidor — puedes reconectarte y retomar exactamente donde lo dejaste. En un pentest esto significa que un escaneo de horas no se pierde por un timeout de SSH.

Jerarquía: sesión → ventana → panel

texto — estructura de tmux
# SESIÓN: un contexto de trabajo independiente (ej: "recon", "explot", "post")
#   └─ VENTANA: como una pestaña del navegador (ej: "nmap", "gobuster", "notas")
#        └─ PANEL: divisiones dentro de la ventana (arriba/abajo, izquierda/derecha)
#
# Puedes tener:
#   Sesión "pentest" → Ventana 0 "recon"    → Panel izq: nmap  | Panel der: resultados
#                   → Ventana 1 "web"       → Panel único: burpsuite
#                   → Ventana 2 "shells"    → Panel sup: shell víctima | Panel inf: nc listener
#
# Prefix: la combinación que le dice a tmux "el siguiente atajo es para ti"
# Por defecto: Ctrl+B  (en este documento asumimos que lo cambiamos a Ctrl+A)

Gestión de sesiones desde la línea de comandos

bash — sesiones tmux
# Crear una nueva sesión con nombre
tmux new-session -s pentest
tmux new -s recon       # forma corta

# Listar sesiones activas
tmux list-sessions
tmux ls              # forma corta

# Reconectarse a una sesión existente
tmux attach-session -t pentest
tmux a -t pentest    # forma corta
tmux a               # reconectar a la última sesión

# Desconectarse sin matar la sesión (la sesión sigue corriendo)
# Prefix + d   (detach)

# Matar una sesión
tmux kill-session -t pentest
tmux kill-server   # matar todo tmux

# Renombrar una sesión
tmux rename-session -t viejo nuevo

Atajos esenciales dentro de tmux

Todos los atajos dentro de tmux requieren pulsar primero el prefix (por defecto Ctrl+B, habitual cambiarlo a Ctrl+A) y luego la tecla del comando.

Atajo Acción
Prefix + cCrear nueva ventana
Prefix + n / pSiguiente / anterior ventana
Prefix + 0-9Ir a la ventana número N
Prefix + ,Renombrar la ventana actual
Prefix + &Cerrar la ventana actual
Prefix + %Dividir verticalmente (panel derecho)
Prefix + "Dividir horizontalmente (panel inferior)
Prefix + flechasMoverse entre paneles
Prefix + zZoom al panel actual (pantalla completa)
Prefix + xCerrar el panel actual
Prefix + { / }Mover el panel izquierda / derecha
Prefix + EspacioRotar entre layouts predefinidos
Prefix + [Modo copia (scroll con flechas o PgUp/PgDn)
Prefix + dDesconectarse (sesión sigue activa)
Prefix + sLista de sesiones interactiva
Prefix + $Renombrar la sesión actual
Prefix + tMostrar el reloj

Configuración: ~/.tmux.conf

tmux.conf — configuración recomendada para pentest
# Cambiar prefix a Ctrl+A (más cómodo, como screen)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Recargar la configuración sin reiniciar
bind r source-file ~/.tmux.conf \; display "Config recargada"

# Dividir paneles con atajos más intuitivos
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Mover entre paneles con Ctrl+hjkl (sin prefix)
bind -n C-h select-pane -L
bind -n C-j select-pane -D
bind -n C-k select-pane -U
bind -n C-l select-pane -R

# Redimensionar paneles con Alt+flechas (sin prefix)
bind -n M-Left  resize-pane -L 5
bind -n M-Right resize-pane -R 5
bind -n M-Up    resize-pane -U 5
bind -n M-Down  resize-pane -D 5

# Ratón: seleccionar paneles y redimensionar arrastrando
set -g mouse on

# Numeración desde 1 (más cómodo en el teclado)
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on

# Historial largo (para no perder output)
set -g history-limit 50000

# Actualizar el título de la ventana del terminal
set -g set-titles on
set -g set-titles-string "#S:#W"

# Sin retardo al pulsar Escape (importante para Vim dentro de tmux)
set -sg escape-time 0

# Colores de 256 bits y true color
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# Barra de estado minimalista
set -g status-style "bg=#111318 fg=#8B8F9A"
set -g status-left  " #[fg=#FF9F43]#S #[default]│ "
set -g status-right " #[fg=#8B8F9A]%H:%M "
set -g window-status-current-format "#[fg=#FF9F43 bold] #W "
set -g window-status-format         " #[fg=#8B8F9A]#W "
set -g status-interval 1

Scripting: arrancar un entorno de pentest automáticamente

bash — lab.sh: iniciar un entorno tmux completo
#!/bin/bash
# lab.sh — arranca un entorno tmux para un pentest
# Uso: ./lab.sh NOMBRE_SESION IP_OBJETIVO

SESION="${1:-pentest}"
TARGET="${2:-192.168.1.1}"

# No crear si ya existe
tmux has-session -t "$SESION" 2>/dev/null && {
    echo "Sesión '$SESION' ya existe. Reconectando..."
    tmux attach -t "$SESION"
    exit 0
}

# Crear sesión y primera ventana: reconocimiento
tmux new-session -d -s "$SESION" -n "recon"
tmux send-keys -t "$SESION:recon" "mkdir -p recon_$TARGET && cd recon_$TARGET" Enter

# Dividir: panel superior nmap, inferior resultados
tmux split-window -v -t "$SESION:recon"
tmux send-keys -t "$SESION:recon.1" "watch -n 5 ls -la recon_$TARGET/" Enter

# Segunda ventana: shells y listeners
tmux new-window -t "$SESION" -n "shells"
tmux split-window -h -t "$SESION:shells"

# Tercera ventana: notas en vim
tmux new-window -t "$SESION" -n "notas"
tmux send-keys -t "$SESION:notas" "vim notas_$TARGET.md" Enter

# Volver a la primera ventana y conectar
tmux select-window -t "$SESION:recon"
tmux attach -t "$SESION"

3.5.2 Kitty terminal: configuración, temas y atajos

Kitty es un emulador de terminal acelerado por GPU con soporte nativo para imágenes, múltiples ventanas y pestañas sin necesidad de Tmux, Unicode completo y un protocolo de gráficos propio. Para hacking es especialmente útil porque puedes ver capturas de pantalla y diagramas directamente en el terminal.

Instalación y configuración base

bash — instalar Kitty
# Instalador oficial (recomendado — siempre la última versión)
curl -L https://sw.kovidgoyal.net/kitty/installer.sh | sh

# O desde repositorios (versión algo más antigua)
sudo apt install -y kitty      # Debian/Ubuntu
sudo pacman -S kitty           # Arch

# Archivo de configuración principal
~/.config/kitty/kitty.conf

# Recargar configuración sin reiniciar (desde dentro de kitty)
# Ctrl+Shift+F5   o bien desde la línea de comandos:
kill -SIGUSR1 $(pgrep -f "kitty")

kitty.conf recomendado

kitty.conf — configuración para trabajo técnico
# ── Fuente ──────────────────────────────────────────────────────────
font_family      FiraCode Nerd Font Mono
bold_font        auto
italic_font      auto
font_size        13.0
disable_ligatures never     # mantener ligaduras de Fira Code (→ ≥ ≠ etc.)

# ── Cursor ──────────────────────────────────────────────────────────
cursor_shape          block
cursor_blink_interval 0     # sin parpadeo

# ── Scrollback ──────────────────────────────────────────────────────
scrollback_lines 10000

# ── Ventanas y pestañas ─────────────────────────────────────────────
window_padding_width   8
placement_strategy     center
hide_window_decorations yes   # sin bordes del gestor de ventanas
remember_window_size   yes

tab_bar_style          powerline
tab_powerline_style    slanted
tab_bar_background     #111318
active_tab_background  #FF9F43
active_tab_foreground  #000000
inactive_tab_background #1A1C23
inactive_tab_foreground #8B8F9A

# ── Colores (mismo esquema que la web) ──────────────────────────────
background              #0A0B0F
foreground              #E0E2E8
selection_background    #FF9F43
selection_foreground    #000000

color0  #1A1C23    color8  #2D3039   # negro
color1  #FF4D6A    color9  #FF4D6A   # rojo
color2  #6BCB77    color10 #8BDF4B   # verde
color3  #FFD93D    color11 #FFD93D   # amarillo
color4  #4DA8CB    color12 #4ddbff   # azul/cyan
color5  #AD4BB5    color13 #9B59B6   # morado
color6  #4BCBA5    color14 #4BCBA5   # teal
color7  #C5C8D2    color15 #E0E2E8   # blanco

# ── URL ─────────────────────────────────────────────────────────────
url_color          #4ddbff
url_style          curly
open_url_with      default
detect_urls        yes

Atajos de Kitty

Atajo Acción
Ctrl+Shift+TNueva pestaña
Ctrl+Shift+QCerrar pestaña
Ctrl+Shift+→ / ←Siguiente / anterior pestaña
Ctrl+Shift+Alt+TRenombrar pestaña
Ctrl+Shift+EnterNueva ventana (panel)
Ctrl+Shift+WCerrar ventana
Ctrl+Shift+] / [Siguiente / anterior ventana
Ctrl+Shift+F7Cambiar layout de ventanas
Ctrl+Shift+LRotar entre los 5 layouts
Ctrl+Shift+EAbrir URL detectada en el terminal
Ctrl+Shift+HNavegar el scrollback en vim
Ctrl+Shift+GNavegar el scrollback en less
Ctrl+Shift+= / -Aumentar / reducir tamaño de fuente
Ctrl+Shift+F5Recargar configuración
💡
Kitty + Tmux: aunque Kitty tiene pestañas y paneles propios, combinarlo con Tmux sigue teniendo sentido para sesiones remotas y persistencia. Una configuración habitual es usar Kitty para el trabajo local (múltiples pestañas por proyecto) y Tmux dentro de las conexiones SSH para no perder el trabajo si la red cae.

3.5.3 Vim para hackers: modos, comandos esenciales y plugins útiles

Vim está en todos los sistemas Unix. No necesitas instalarlo, no necesitas configurarlo para lo básico, y funciona sobre SSH sin ninguna dependencia gráfica. Aprender Vim no es opcional si haces pentesting serio — habrá un momento en el que tengas acceso a un sistema y solo tengas vi o vim para editar archivos. Cuánto tardas en ese momento en hacer algo útil depende de cuánto hayas practicado antes.

Los modos

texto — modos de Vim
# NORMAL (el modo base — aquí estás siempre al abrir vim)
# → Para moverse, copiar, borrar, buscar, ejecutar comandos
# → Pulsar Escape desde cualquier modo vuelve aquí

# INSERT (para escribir texto)
# → i : entrar antes del cursor
# → a : entrar después del cursor (append)
# → I : entrar al principio de la línea
# → A : entrar al final de la línea
# → o : nueva línea debajo y entrar en insert
# → O : nueva línea arriba y entrar en insert

# VISUAL (para seleccionar texto)
# → v  : selección carácter a carácter
# → V  : selección línea a línea
# → Ctrl+V : selección en bloque (columnar)

# COMMAND (para ejecutar comandos de Vim)
# → : (dos puntos) desde Normal mode
# → :w (guardar), :q (salir), :wq (guardar y salir), :q! (salir sin guardar)

Movimiento: el sistema de verbos y sustantivos

La sintaxis de Vim es [número] + verbo + sustantivo. Ejemplos: d3w = borrar 3 palabras, y2j = copiar 2 líneas hacia abajo, ci" = cambiar el contenido dentro de las comillas.

texto — movimiento en modo Normal
# ── Básico ──────────────────────────────────────────────────────────
h j k l          # ← ↓ ↑ → (sin usar flechas)
0   $            # inicio / final de línea
^               # primer carácter no vacío de la línea
gg  G            # inicio / final del archivo
42G  :42         # ir a la línea 42
Ctrl+d  Ctrl+u   # media página abajo / arriba
Ctrl+f  Ctrl+b   # página entera adelante / atrás

# ── Por palabra ─────────────────────────────────────────────────────
w  W             # siguiente palabra (W ignora puntuación)
b  B             # palabra anterior
e  E             # final de la palabra actual

# ── Búsqueda en la línea ────────────────────────────────────────────
f{c}  F{c}       # ir al carácter c (f adelante, F atrás)
t{c}  T{c}       # ir justo antes del carácter c
;   ,            # repetir f/t en la misma / dirección opuesta

# ── Búsqueda global ─────────────────────────────────────────────────
/patron          # buscar hacia adelante
?patron          # buscar hacia atrás
n   N            # siguiente / anterior resultado
*   #            # buscar la palabra bajo el cursor (adelante / atrás)
%               # saltar al paréntesis/llave/corchete que cierra el actual

Edición: verbos, objetos de texto y registros

texto — edición en modo Normal
# ── Verbos ──────────────────────────────────────────────────────────
d{mov}           # delete (borrar)
c{mov}           # change (borrar y entrar en insert)
y{mov}           # yank (copiar)
p  P             # paste después / antes del cursor
r{c}             # reemplazar el carácter bajo el cursor por c
x               # borrar el carácter bajo el cursor
u   Ctrl+r       # deshacer / rehacer

# ── Objetos de texto (text objects) ─────────────────────────────────
# Potencia real de Vim: operar sobre "una unidad semántica"
diw              # delete inner word (borrar la palabra sin los espacios)
daw              # delete a word (borrar la palabra con sus espacios)
ci"              # change inner " (cambiar el contenido entre comillas dobles)
da(              # delete a () (borrar incluyendo los paréntesis)
yi{              # yank inner {} (copiar el contenido dentro de las llaves)
vip              # visual inner paragraph (seleccionar el párrafo actual)

# ── Sustitución global ──────────────────────────────────────────────
:%s/viejo/nuevo/g        # reemplazar en todo el archivo
:%s/viejo/nuevo/gc       # reemplazar con confirmación
:10,20s/viejo/nuevo/g    # solo en las líneas 10-20
:'<,'>s/viejo/nuevo/g    # solo en la selección visual

# ── Macros ──────────────────────────────────────────────────────────
qa               # empezar a grabar la macro en el registro 'a'
q                # detener la grabación
@a               # ejecutar la macro 'a'
10@a             # ejecutarla 10 veces
@@               # repetir la última macro ejecutada

Ventanas, pestañas y archivos múltiples

texto — gestión de ventanas y buffers en Vim
# ── Abrir archivos ──────────────────────────────────────────────────
:e ruta/archivo          # abrir archivo
:e!                      # recargar el archivo actual desde disco
:ls  :buffers            # listar buffers abiertos
:b2                      # ir al buffer 2
:bd                      # cerrar el buffer actual

# ── Dividir ventanas ────────────────────────────────────────────────
:split  :sp              # dividir horizontalmente
:vsplit :vs              # dividir verticalmente
Ctrl+w h/j/k/l           # moverse entre ventanas
Ctrl+w =                 # igualar tamaño de todas las ventanas
Ctrl+w q                 # cerrar la ventana actual
Ctrl+w o                 # cerrar todas excepto la actual

# ── Pestañas ────────────────────────────────────────────────────────
:tabnew archivo          # abrir en nueva pestaña
gt  gT                   # siguiente / anterior pestaña
:tabclose                # cerrar la pestaña actual

# ── Útil en pentesting ──────────────────────────────────────────────
:r !comando              # insertar la salida de un comando externo
:r !nmap -sV 192.168.1.1 # por ejemplo: insertar el output de nmap
:!comando                # ejecutar un comando externo sin insertar output
Ctrl+z                   # mandar Vim al background (fg para volver)

~/.vimrc esencial

vimrc — configuración base para trabajo técnico
" ── Base ────────────────────────────────────────────────────────────
set nocompatible          " no compatibility con vi
set encoding=utf-8
set fileencoding=utf-8

" ── Apariencia ──────────────────────────────────────────────────────
syntax on
set number                " número de línea
set relativenumber        " número relativo (para contar movimientos)
set cursorline            " resaltar la línea del cursor
set colorcolumn=80        " línea guía en columna 80
set laststatus=2          " barra de estado siempre visible
set showmode
set showcmd               " mostrar el comando que se está escribiendo
set scrolloff=8           " margen de 8 líneas al hacer scroll

" ── Búsqueda ────────────────────────────────────────────────────────
set incsearch             " buscar mientras se escribe
set hlsearch              " resaltar resultados
set ignorecase            " búsqueda insensible a mayúsculas...
set smartcase             " ...a menos que uses mayúsculas en el patrón
nnoremap <leader>/ :nohlsearch<CR>   " limpiar resaltado con \+/

" ── Indentación ─────────────────────────────────────────────────────
set expandtab             " tabs → espacios
set tabstop=4
set shiftwidth=4
set smartindent
set autoindent

" ── Comportamiento ──────────────────────────────────────────────────
set hidden                " cambiar de buffer sin guardar
set undofile              " historial de deshacer persistente entre sesiones
set undodir=~/.vim/undo
set noswapfile            " sin archivos .swp (evita rastros)
set nobackup
set clipboard=unnamedplus " copiar/pegar con el portapapeles del sistema
set mouse=a               " ratón en todos los modos
set wildmenu              " autocompletado de comandos con Tab

" ── Atajos útiles ───────────────────────────────────────────────────
let mapleader = " "       " Espacio como leader key
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>e :e <C-d>    " abrir archivo con autocompletado
nnoremap j gj              " moverse por líneas visuales (útil en texto largo)
nnoremap k gk
nnoremap <C-h> <C-w>h     " moverse entre ventanas con Ctrl+hjkl
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

Plugins esenciales con vim-plug

bash — instalar vim-plug y plugins
# Instalar vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

# Añadir al .vimrc antes del resto de la configuración:
vimrc — plugins con vim-plug
call plug#begin('~/.vim/plugged')

" Explorador de archivos lateral
Plug 'preservim/nerdtree'

" Búsqueda difusa de archivos, buffers, contenido
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

" Barra de estado informativa
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" Comentar/descomentar líneas rápidamente
Plug 'tpope/vim-commentary'

" Surround: añadir/cambiar/borrar comillas, paréntesis, tags
Plug 'tpope/vim-surround'

" Sintaxis mejorada para muchos lenguajes
Plug 'sheerun/vim-polyglot'

" Linting y autocompletado (requiere Node.js)
Plug 'dense-analysis/ale'

" Tema de colores oscuro
Plug 'joshdick/onedark.vim'

call plug#end()

" Instalar plugins: abrir vim y ejecutar :PlugInstall

" ── Configuración de plugins ────────────────────────────────────────
colorscheme onedark

" NERDTree: abrir/cerrar con Ctrl+n
nnoremap <C-n> :NERDTreeToggle<CR>

" fzf: buscar archivos con Ctrl+p, contenido con Ctrl+f
nnoremap <C-p> :Files<CR>
nnoremap <C-f> :Rg<CR>

" ALE: solo mostrar errores al guardar
let g:ale_lint_on_text_changed = 'never'
let g:ale_lint_on_insert_leave = 0
💡
Neovim como alternativa: Si empiezas desde cero, considera Neovim (nvim) en lugar de Vim. Es compatible al 100% con la configuración de Vim, añade LSP nativo, soporte de Lua para configuración más rápida, y tiene un ecosistema de plugins más activo. Todo lo que se describe en esta sección funciona igual en Neovim.