- Notifications
You must be signed in to change notification settings - Fork5
Secure shell in your browser
License
NotificationsYou must be signed in to change notification settings
leshniak/httpsh
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
A bunch of scripts and configs that allows to expose a shell via HTTPS.
- works as a system service
- the service fulfills the principle of minimal privilege (can't simply use
/bin/login
as it requires root privileges) - exposes a web client with the user's shell
- supports password authentication
- has an optional protection against brute force attacks
- uses secure transport protocols
The project depends on bash, ssh (client+server), systemd,ttyd, nginx, grep and optionally fail2ban (if you want to have a brute force protection). sshd must be configured for accepting incoming local connections.
Everything was tested on Debian Linux.
- Copy the config files (
etc
folder) to the corresponding directories in your system. - Download ttyd and put the executable in
/usr/local/bin/ttyd
. You can choose another directory, but don't forget to edit the config files. - Put
ttyd-login
script in/usr/local/bin/ttyd-login
. Applychmod +x
for both executables. - Create a user named
ttyd
, with a home directory and disabled login shell. It is required for~/.ssh
files. The home can be custom, for example/var/local/ttyd/
:
# mkdir -p /var/local/ttyd# useradd -d /var/local/ttyd -s /bin/false ttyd# chown -R ttyd:ttyd /var/local/ttyd
- Add a new location in nginx configuration for your domain. If you want to have a shell under
https://example.com/shell
, add this to theserver
section:
location ~ ^\/shell(\/.*)?$ { include snippets/shell.conf;}
- Reload systemd unit files
systemctl daemon-reload
. - Restart all edited services:
# systemctl restart nginx# systemctl restart fail2ban
- Start
httpsh
service and enable the autostart during the system startup:
# systemctl start ttyd@shell# systemctl enable ttyd@shell
- The shell should be up and running under
https://example.com/shell
I recommend to use fail2ban protection and TLS v1.3 for your domain.DO NOT use plain HTTP without TLS – it's like using telnet instead of ssh.
If you have any questions, please create a new Github issue.
If you appreciate my work, it will be cool to know that I drink mycoffee ☕ thanks to you!