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
# 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
# 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 + c | Crear nueva ventana |
Prefix + n / p | Siguiente / anterior ventana |
Prefix + 0-9 | Ir 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 + flechas | Moverse entre paneles |
Prefix + z | Zoom al panel actual (pantalla completa) |
Prefix + x | Cerrar el panel actual |
Prefix + { / } | Mover el panel izquierda / derecha |
Prefix + Espacio | Rotar entre layouts predefinidos |
Prefix + [ | Modo copia (scroll con flechas o PgUp/PgDn) |
Prefix + d | Desconectarse (sesión sigue activa) |
Prefix + s | Lista de sesiones interactiva |
Prefix + $ | Renombrar la sesión actual |
Prefix + t | Mostrar el reloj |
Configuración: ~/.tmux.conf
# 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
#!/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
# 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
# ── 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+T | Nueva pestaña |
Ctrl+Shift+Q | Cerrar pestaña |
Ctrl+Shift+→ / ← | Siguiente / anterior pestaña |
Ctrl+Shift+Alt+T | Renombrar pestaña |
Ctrl+Shift+Enter | Nueva ventana (panel) |
Ctrl+Shift+W | Cerrar ventana |
Ctrl+Shift+] / [ | Siguiente / anterior ventana |
Ctrl+Shift+F7 | Cambiar layout de ventanas |
Ctrl+Shift+L | Rotar entre los 5 layouts |
Ctrl+Shift+E | Abrir URL detectada en el terminal |
Ctrl+Shift+H | Navegar el scrollback en vim |
Ctrl+Shift+G | Navegar el scrollback en less |
Ctrl+Shift+= / - | Aumentar / reducir tamaño de fuente |
Ctrl+Shift+F5 | Recargar configuración |
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
# 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.
# ── 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
# ── 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
# ── 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
" ── 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
# 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:
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
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.