Этот проект, как и его родственный проект, принадлежит к моему набору инструментов для борьбы с цензурой, который позволяет настраивать полностью рабочие зашифрованные оболочки и пересылку TCP/UDP во враждебных цензурирующих средах. Криминалистам также полезно сбрасывать данные с устройств через UART или adb, когда другие средства недоступны.
Поиск DNS и сеанс SSH пересылаются через соединение UART на Pi
PSC позволяет шифровать сеансы оболочки e2e, с одним или несколькими переходами, независимо от базового транспорта, при условии, что он надежен и может отправлять/получать данные в кодировке Base64 без модификации/фильтрации. Наряду с полученным вами e2e pty (например, внутри оболочки порта) вы можете перенаправлять соединения TCP и UDP, аналогично параметру -L
OpenSSH. Это работает прозрачно и без необходимости назначения IP-адреса локально в начальной точке. Это позволяет криминалистам и пентестерам создавать сетевые подключения, например, через:
adb shell
, если OEM adbd
не поддерживает пересылку TCPПредставьте себе, что внутри сеанса оболочки у вас будет невидимый сеанс ppp, при этом удаленный узел фактически не будет поддерживать ppp.
Он работает на Linux, Android, OSX, Windows, FreeBSD, NetBSD и (возможно) OpenBSD .
PSC также включает поддержку прокси-серверов SOCKS4 и SOCKS5 для удаленного проведения реальных сеансов просмотра веб-страниц через оболочки портов или модемные соединения.
Отредактируйте Makefile
, чтобы отразить ваши общие ключи, как определено в верхней части Makefile
.
Затем просто введите make
в Linux и OSX .
В BSD вам необходимо вместо этого установить GNU make и вызвать gmake
.
В Windows вам необходимо установить cygwin и выбрать соответствующие пакеты gcc, gcc-g++, make
и git
.
В Linux PSC будет использовать псевдотерминалы Unix98 , в других системах он будет использовать pty POSIX , но это должно быть прозрачно для вас. Однажды я добавил поддержку 4.4BSD pty и SunOS еще в каменном веке по определенной причине, поэтому она может собираться, а может и не собираться даже с Solaris .
с гордостью спонсируется:
Просто и ясно. На локальном компьютере выполните pscl
и передайте все порты TCP или UDP, которые вы хотите перенаправить с удаленного сайта на определенный адрес. Например:
linux:~ > ./pscl -T 1234:[192.168.0.254]:22 -U 1234:[8.8.8.8]:53
PortShellCrypter [pscl] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: set up local TCP port 1234 to proxy to 192.168.0.254:22 @ remote.
pscl: set up local UDP port 1234 to proxy to 8.8.8.8:53 @ remote.
pscl: Waiting for [pscr] session to appear ...
linux:~ >
[ UART / SSH / ... login to remote side ... ]
На удаленном сайте (последний переход) с сеансом оболочки, независимо от того, находится ли он в оболочке порта, SSH, входе в консоль и т. д., вы выполняете pscr
:
linux:~ > ./pscr
PortShellCrypter [pscr] v0.60 (C) 2006-2020 stealth -- github.com/stealth/psc
pscl: Seen STARTTLS sequence, enabling crypto.
linux:~ >
Как только вы выполните pscr
, оба конца установят крипто-рукопожатие и создадут дополнительный протокол поверх существующего сеанса, который будет прозрачным для вас. Затем вы можете подключиться к 127.0.0.1:1234
на своем локальном компьютере, чтобы получить доступ 192.168.0.254:22
через TCP или к преобразователю 8.8.8.8
через UDP. Это также работает с адресами [IPv6], если удаленный сайт имеет подключение IPv6. На самом деле, вы даже можете использовать его для перевода программного обеспечения IPv4 в IPv6, поскольку вы всегда подключаетесь к 127.0.0.1
на локальной стороне.
Вы можете передать несколько параметров -T
и -U
. Если вы потеряли след, если ваш сеанс уже зашифрован e2e, вы можете отправить SIGUSR1
локальному процессу pscl
, и он сообщит вам об этом.
PSC также полезен, если вы хотите использовать Tor из удаленной оболочки SSH, где вы можете перенаправить порт Socks5 и DNS на адрес удаленных хостов 127.0.0.1
. Поскольку SSH не пересылает UDP-пакеты, вы обычно используете два разъема socat
или аналогичные для разрешения через узел Tor. Преимущество PSC заключается в сохранении границ дейтаграмм UDP, в то время как socat
по сравнению с SSH -L
может нарушать границы дейтаграмм и создавать неверные DNS-запросы.
Сеанс будет зашифрован с помощью aes_256_ctr
PSK, который вы выберете в Makefile
. Эта криптосхема гибка, но добавление данных AAD или OAD увеличивает размер пакета, где каждый байт имеет значение, поскольку в интерактивных сеансах и из-за кодирования Base64 каждый набранный символ уже вызывает отправку гораздо большего количества данных.
Сеансы UART можно использовать через screen
, но, например, не через minicom
, поскольку minicom создает невидимые окна со строками состояния и действует как фильтр, разрушающий протокол PSC. PSC пытается обнаружить фильтрацию и может справиться с определенным объемом искажений данных, но в некоторых ситуациях восстановление невозможно. То же самое и с tmux
. Вам следует избегать объединения обработчиков pty с PSC, которые слишком сильно портят/обрабатывают входящие данные.
Переменную среды SHELL
необходимо установить как для pscl
, так и для pscr
чтобы PSC знал, какую оболочку выполнять на pty. SHELL
установлен в большинстве сред по умолчанию, но если это не так, необходимо выполнить PSC, например SHELL=/bin/bash pscl
и т. д.
pscl
также поддерживает пересылку TCP-соединений через SOCKS4 ( -4 port
) и SOCKS5 ( -5 port
). Это настроит порт как порт SOCKS для TCP-соединений, поэтому, например, вы можете просматривать удаленные сети из сеанса оболочки порта без необходимости открывать какое-либо другое соединение во время пен-теста. Если вы передадите -N
в pscl
, это включит разрешение DNS-имен на удаленной стороне, поэтому вы также можете использовать с ним chrome. Но будьте осторожны: существует проблема конфиденциальности браузеров, которые пытаются разрешить последовательность DNS-имен при запуске, и это не находится под вашим контролем. Кроме того, если на вашей удаленной стороне нарушена настройка DNS, ваша печатная оболочка может блокироваться на несколько секунд, если пакеты ответа DNS отсутствуют. Не существует хороших встраиваемых и переносимых функций асинхронного преобразователя, поэтому мне пришлось полагаться на getaddrinfo()
в одном потоке ценой возможных блокировок на несколько секунд в случае существования проблем с DNS. Вот почему разрешение имен должно быть включено явно. Однако pscr
пытается свести к минимуму эту потенциальную проблему с кэшами поиска DNS, поэтому в большинстве ситуаций это должно работать безболезненно. Если вы передадите -X IP-address
(должен быть первым аргументом), вы можете привязать свой локальный прокси к адресу, отличному от 127.0.0.1
, чтобы вы могли использовать прокси-сервер в своей локальной сети.
Функции psc позволяют TCP-соединениям или двоичным объектам данных пересылаться с/на удаленные устройства через несколько переходов, даже если невозможно установить двоичный файл pscr
на удаленном сайте. Это очень полезно для криминалистических целей, если у вас нет средств для иной загрузки артефактов с устройства (которым может быть, например, телефон, подключенный к UART) или вам необходимо перенаправить соединения, не касаясь FS, чтобы не уничтожить доказательства в системе, или когда корневая файловая система смонтирована, и вы не можете загрузить свой набор инструментов.
Это действительно классная функция, поскольку вы можете видеть, как ваше TCP-соединение переключается через локальный терминал на удаленный компьютер без необходимости устанавливать что-либо удаленно.
Это работает исключительно с помощью локального pty punkrock и передачи pscl
команды отскока, которую он передаст на удаленную оболочку (без запуска pscr
), и некоторой магии механизма состояний, которая фильтрует и обрабатывает данные на локальной стороне. Обычно для этого требуется сначала установить удаленный pty в необработанный режим, прежде чем выдавать фактическую команду и некоторые другие детали, которые передаются в -B
. Аргумент разбивается на следующие части:
:
, например 1234:
.stty -echo raw
или python -c "import tty;tty.setraw(0)"
(следите за тем, чтобы кавычки были правильными, так как -B
также необходимо заключить в кавычки) или что-нибудь подобное.pscl
начать отправку данных, чтобы избежать гонки между фактически произошедшим stty
и началом cmd, например, echo GO
идеален.nc 127.0.0.1 22
для перенаправления локального порта 1234 на удаленный SSH-сервер.pscl
сбросить свое состояние tty. echo FIN
сделает это. Рекомендуется, так как в противном случае у вас могут возникнуть проблемы с распознаванием конца команды.;
и заключено в скобки.Примеры:
Если вы хотите перенаправить TCP-соединение, в этом примере необходимо, чтобы на устройстве были установлены stty
и nc
, но теоретически это может быть что-то еще, что эквивалентно.
Запустите локальный сеанс:
./pscl -B '1234:[stty -echo raw;echo GO;nc example.com 22;echo FIN]'
Это выдаст команду stty -echo raw;echo GO;nc example.com 22;echo FIN
на удаленное устройство, если вы подключаетесь локально к порту 1234, а затем просто пересылаете любые данные, которые оно видит, туда и обратно, ограничивая скорость трафика, поэтому она не будет превышать скорость tty устройства (по умолчанию — 115200).
Когда сеанс pscl запущен, подключитесь к удаленному устройству через UART, ssh -e none ...
или что-то еще, и как только у вас появится удаленная оболочка, также введите локально:
ssh [email protected] -p 1234
чтобы перенаправить SSH-соединение из вашего локального компьютера через удаленное устройство в пункт назначения example.com
. Конечно, вариант pscr
предпочтительнее, поскольку -B
может отклонить только одно соединение за раз (хотя вы можете передать несколько команд -B
для различных пересылок), и есть шанс зависнуть оболочку после сеанса TCP, поскольку pty находится в raw -echo
и в зависимости от того, закрывает ли последний удаленный узел соединение, возможно, после этого оболочка просто зависает. Если вы обнаружите уведомление pscl о завершении соединения и увидите подсказку, вам следует reset
его, чтобы можно было запустить новое соединение. Во время пересылки данных вы увидите 7-битные ASCII <
и >
уведомления в pscl
, которые являются локальными для упрощения отладки и обнаружения прогресса.
Обратите внимание, что соединение с удаленным сайтом должно быть 8-битным, т.е. ssh, telnet, UART или любой другой канал не должен обрабатывать escape-последовательности (в отличие от использования pscr
). Для ssh-соединений это означает, что вам нужно использовать ssh -e none
в сеансе pscl
.
Далее рассмотрим несколько примеров обработки двоичного файла xfer, где rfile обозначает удаленный файл, а lfile — локальный файл.
Чтобы запустить сеанс для удаления удаленных файлов локально:
./pscl -B '1234:[stty -echo raw;echo GO;dd of=rfile.bin bs=1 count=7350;echo FIN]'
Где вам нужно указать объем данных, который ожидает удаленная сторона. Это также будет работать без (например, cat>...
), но тогда сеанс зависнет после завершения передачи, поскольку cat
бесконечно ожидает ввода. Используя dd count=...
, вы получите чистый выход и будете уведомлены об этом маркером FIN.
Затем необходимо использовать ssh или что-то еще, чтобы получить оболочку на удаленном устройстве из только что начавшегося сеанса pscl
. На втором терминале локально:
dd if=lfile.bin|nc 127.0.0.1 1234
который подключится к локальному порту 1234 pscl
и вызовет команду дампа на удаленной стороне, пересылая двоичные данные локального lfile.bin
на удаленные rfile.bin
. Из-за ограничения скорости это может занять некоторое время, и вы доверяете только своему экрану прогресса PSC, если передача завершена. Команда local dd ...|nc ...
покажет вам только локальный статус, который может поглощать целые файлы за мс из-за локальных буферов TCP, пока файл все еще передается через pty. Поэтому убедитесь, что вы нажимаете Ctrl-C
только тогда, когда экран pscl сообщает вам, что он завершен, или вы видите, что маркер конца FIN
отображается обратно к вам в сеансе dd ...|nc ...
Аналогично, аналогичные команды можно использовать для передачи двоичных данных с удаленного устройства на локальный компьютер в криминалистических целях. Опять же, начало сеанса локально:
./pscl -B '1234:[stty -echo raw;echo GO;dd if=rfile.bin]'
или
./pscl -B '1234:[stty -echo raw;echo GO;cat rfile.bin]'
Затем подключите ssh к удаленному устройству, чтобы получить оболочку, а затем снова локально:
nc 127.0.0.1 1234|dd of=lfile.bin bs=1 count=7350
Чтобы получить rfile.bin
размером 7350, скопируйте его в локальный файл lfile.bin
Если stty -echo raw
недоступен на устройстве, также работает что-то вроде python -c "import tty;tty.setraw(0)"
. Обратите внимание, что на удаленном устройстве вам необходимо иметь tty (а не только оболочку порта) при использовании команд возврата, поскольку для команды stty
для установки необработанного режима требуется реальный tty.
Если psc работает через последовательное соединение, потеря битов может лишить вас всего удовольствия. Если вы работаете без HW FC, вы в конечном итоге столкнетесь с потерей битов и зависанием соединений, в частности, из-за отсутствия регулирования, когда устройство отправляет данные в вашем направлении при использовании команд возврата . Сброс данных на устройство работает лучше, поскольку эти данные проходят ограничения скорости pscl
.
Однако вот несколько советов, которые помогли мне в обстоятельствах, когда невозможно использовать pscr
на устройстве и HW FC. Это применимо только при использовании UART, поскольку это потенциально ненадежный транспортный канал.
pscr
на устройстве, чтобы установить ограничение скорости передачи данных в вашем направлении. Поскольку направление к устройству всегда ограничено по скорости, вы можете использовать команды возврата, чтобы сбросить кросс-скомпилированный двоичный файл pscr
на устройство и начать с ним двусторонний сеанс с ограниченной скоростью.tio -o 1
или -o 2
чтобы добавить задержки между отправленными выходными байтами38400
, хотя серийная линия установила 115200
)psc
с -DRESPECT_UART_BUFSIZE=4096
, однако это сделает сеанс очень медленным Внутри папки contrib
вы также найдете патч tio-noprefix
для отключения обработки escape-символов, но этот патч необходим только для более старых версий, поскольку разработчики уже приняли и интегрировали этот патч. Я действительно рекомендую использовать tio
при использовании UART.
При использовании команд возврата через tio вам необходимо добавить в файл ~/.tioconfig
:
[default]
prefix-ctrl-key = none
который отключает обработку ESC и дает вам 8-битный чистый канал.
Вы можете отправить SIGUSR1
в pscl
, чтобы он сообщил вам, зашифрован ли сеанс. Если удаленный pscr
умирает или завершает работу без возможности сообщить об этом локальной части, pscl
останется в режиме шифрования и, следовательно, зависнет. В этом случае вы можете принудительно выполнить сброс в режим открытого текста, отправив SIGUSR2
, чтобы можно было начать новый сеанс.
Начиная с версии 0.64, psc поддерживает сокеты сценариев, поэтому вам больше не нужен screen
для получения/загрузки файлов или выгрузки буферов вставки на удаленную консоль. Вместо этого вы начинаете локальный сеанс следующим образом:
~ > ./pscl -S ~/psc.script_sock
Затем вы можете продолжить и использовать его, как и раньше. Если вам нужно «вставить» что-то, что вам нравится:
~ > ./pscsh -S ~/psc.script_sock -f script_/helloworld
Это «введет» содержимое script_/helloworld
в консоль. Во время написания сценария стандартный ввод pscl
блокируется, чтобы введенный ввод не смешивался с каким-либо вводом. Если -S
опущен в pscsh
, ~/psc.script_sock
используется автоматически. По соображениям безопасности сценарии должны начинаться с префикса script_
.
В качестве бонуса pscr
теперь содержит возможность кодирования/декодирования файлов в формате Base64, даже со встроенными символами CR для удобства. Он совместим с uuencode -m
.