- Полный брандмауэр (входящие и исходящие соединения ограничены – кроме порта веб-сервера)
- Веб-панель может использоваться для подключения к любой службе на удаленном хосте. Это будет локальное подключение локального порта на удаленном хосте и должно быть разрешено брандмауэром.
- Веб-панель будет считывать данные из служебного порта, обертывая их через HTTP и отправляя их как ответ HTTP на локальный прокси.
- Локальный прокси разворачивает и записывает данные в локальный порт, где будет подключена клиентская программа.
- Когда локальный прокси-сервер получает данные на локальном порту, он отправляет их в web-таблицу как HTTP-сообщение.
- Веб-панель будет считывать данные из HTTP-сообщения и помещать их в служебный порт и повторять – ^
- Только порт веб-сервера должен быть открытым (обычно 80/443). Вся связь (Внешне) выполняется по протоколу HTTP
Использование
# python proxy.py -u <remoteurl> -l <localport> [options]
Опции
--help, -h show this help message and exit --url=URL, -u URL url of the remote webshell --lport=LOCAL_PORT, -l LOCAL_PORT local listening port --verbose, -v Verbose (outputs packet size) --buffer=BUFFERSIZE, -b BUFFERSIZE* HTTP request size (some webshels have limitations on the size)
Нет опций SOCKS
Параметры игнорируются при использовании SOCKS-прокси
--no-socks, -n Do not use Socks Proxy --rport=REMOTE_PORT, -r REMOTE_PORT remote port of service for the webshell to connect to --addr=REMOTE_IP, -a REMOTE_IP address for remote webshell to connect to (default = 127.0.0.1)
Параметры прокси-сервера
Подключение туннеля через локальный прокси-сервер
--up-proxy=UPPROXY, -x UPPROXY Upstream proxy (http://proxyserver.com:3128) --auth, -A Upstream proxy requires authentication
Расширенные опции
--ping-interval=PING_DELAY, -q PING_DELAY webshprx pinging thread interval (default = 0.5) --start-ping, -s Start the pinging thread first - some services send data first (eg. SSH) --cookie, -C Request cookies --authentication, -t Basic authentication
пример использования: python proxy.py -u http://10.3.3.1/conn.aspx -l 8000 -v
# This will start a Local SOCKS Proxy Server at port 80000 # This connection will be wrapped over HTTP and unwrapped at the remote server python proxy.py -u http://10.3.3.1/conn.aspx -l 8000 -x https://192.168.1.100:3128 -A -v # This will start a Local SOCKS Proxy Server at port 80000 # It will connect through a Local Proxy (https://192.168.1.100:3128) that requires authentication # to the remote Tunna webshell python proxy.py -u http://10.3.3.1/conn.aspx -l 4444 -r 3389 -b 8192 -v --no-socks # This will initiate a connection between the webshell and Remote host RDP (3389) service # The RDP client can connect on localhost port 4444 # This connection will be wrapped over HTTP
ОГРАНИЧЕНИЯ / ИЗВЕСТНЫЕ ОШИБКИ / ХАКИ
This is a POC code and might cause DoS of the server. All efforts to clean up after execution or on error have been made (no promises) Based on local tests: * JSP buffer needs to be limited (buffer option): 4096 worked in Linux Apache Tomcat 1024 worked in XAMPP Apache Tomcat (slow) * More than that created problems with bytes missing at the remote socket eg: ruby proxy.rb -u http://10.3.3.1/conn.jsp -l 4444 -r 3389 -b 1024 -v * Sockets not enabled by default php windows (IIS + PHP) * Return cariages on webshells (outside the code): get sent on responses / get written on local socket --> corrupt the packets * PHP webshell for windows: the loop function DoS'es the remote socket: sleep function added -> works but a bit slow * PHP webshell needs new line characters removed at the end of the file (after "?>") as these will get send in every response and confuse Tunna
Файлы
Webshells: conn.jsp Tested on Apache Tomcat (windows + linux) conn.aspx Tested on IIS 6+8 (windows server 2003/2012) conn.php Tested on LAMP + XAMPP + IIS (windows + linux) WebServer: webserver.py Tested with Python 2.6.5 Proxies: proxy.py Tested with Python 2.6.5
Технические подробности
Архитектурные решения
Инструкции / конфигурация отправляется в веб-панель в виде параметров URL (HTTP Get)
Инициативная фаза
Первый пакет инициирует сеанс с помощью webshell – возвращает файл cookie, например: http: //webserver/conn.ext? Proxy
Второй пакет отправляет параметры конфигурации подключения в веб-панель, например: http: //webserver/conn.ext? Proxy & port = 4444 & ip = 127.0.0.1
IP and port for the webshell to connect to This is a threaded request: In php this request will go into an infinate loop to keep the webshell socket connection alive In other webshells [OK] is received back
TUNNA клиент
Локальный сокет будет создан, когда клиентская программа собирается подключиться.
После того, как клиент подключен, инициируется пинговый поток и выполняется запуск.
Любые данные в сокете (от клиента) считываются и отправляются как запрос HTTP-сообщения. Любые данные в сокете webshell отправляются как ответ на запрос POST
ПИНГОВЫЕ ШАГИ
Поскольку ответы HTTP не могут быть асинхронными, этот поток будет обрабатывать запросы HTTP Get на веб-панели на основе интервала (по умолчанию 0,5 с). Если в веб-оболочке есть данные для отправки, он (также) отправит его как ответ на этот запрос.
В противном случае он отправит пустой ответ
В целом
Данные из локального прокси-сервера получают отправку с помощью HTTP-сообщения. З
апросы Get запрашиваются каждые 0,5 секунды для запроса веб-страницы для данных.
Если есть данные на стороне веб-хоста, отправьте их как ответ на один из этих запросов
WebShell
Webshell подключается к сокету на локальном или удаленном хосте.
Любые данные, записанные в сокет, отправляются обратно в прокси-сервер в качестве ответа на запрос (POST / GET).
Любые данные, полученные с сообщением, записываются в сокет.