diff --git a/docs/404.html b/docs/404.html index 8c567a7..b786bcd 100644 --- a/docs/404.html +++ b/docs/404.html @@ -13,7 +13,7 @@ - + diff --git a/docs/categories/index.html b/docs/categories/index.html index 1e411ef..bca7b78 100644 --- a/docs/categories/index.html +++ b/docs/categories/index.html @@ -13,7 +13,7 @@ - + diff --git a/docs/docs/about/index.html b/docs/docs/about/index.html index d4839df..511e28a 100644 --- a/docs/docs/about/index.html +++ b/docs/docs/about/index.html @@ -17,7 +17,7 @@ Most icons were provided by fontawesome under this license."> - + @@ -68,17 +68,13 @@ Most icons were provided by fontawesome under this license."> -

+

About WiTTY # -

+

WiTTY is written in the go programming language, using the Gin web framework, gorilla/websocket, pty, and the wonderful xterm.js! The workflow is simple, the client initiates a terminal @@ -97,11 +93,7 @@ window (xterm.js) and creates a websocket with the server, which relays the data

diff --git a/docs/docs/hidden/index.html b/docs/docs/hidden/index.html deleted file mode 100644 index 500d285..0000000 --- a/docs/docs/hidden/index.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - -Hidden | WiTTY: Web-based interactive TTY - - - - - - - - - -
- -
-
-
- -Hidden - -
- -
-

-This page is hidden in menu -# -

-

-Quondam non pater est dignior ille Eurotas -# -

-

-Latent te facies -# -

-

Lorem markdownum arma ignoscas vocavit quoque ille texit mandata mentis ultimus, -frementes, qui in vel. Hippotades Peleus pennas -conscia cuiquam Caeneus quas.

-
    -
  • Pater demittere evincitque reddunt
  • -
  • Maxime adhuc pressit huc Danaas quid freta
  • -
  • Soror ego
  • -
  • Luctus linguam saxa ultroque prior Tatiumque inquit
  • -
  • Saepe liquitur subita superata dederat Anius sudor
  • -
-

-Cum honorum Latona -# -

-

O fallor in sustinui -iussorum equidem. -Nymphae operi oris alii fronde parens dumque, in auro ait mox ingenti proxima -iamdudum maius?

-
reality(burnDocking(apache_nanometer),
-        pad.property_data_programming.sectorBrowserPpga(dataMask, 37,
-        recycleRup));
-intellectualVaporwareUser += -5 * 4;
-traceroute_key_upnp /= lag_optical(android.smb(thyristorTftp));
-surge_host_golden = mca_compact_device(dual_dpi_opengl, 33,
-        commerce_add_ppc);
-if (lun_ipv) {
-    verticalExtranet(1, thumbnail_ttl, 3);
-    bar_graphics_jpeg(chipset - sector_xmp_beta);
-}
-
-

-Fronde cetera dextrae sequens pennis voce muneris -# -

-

Acta cretus diem restet utque; move integer, oscula non inspirat, noctisque -scelus! Nantemque in suas vobis quamvis, et labori!

-
var runtimeDiskCompiler = home - array_ad_software;
-if (internic > disk) {
-    emoticonLockCron += 37 + bps - 4;
-    wan_ansi_honeypot.cardGigaflops = artificialStorageCgi;
-    simplex -= downloadAccess;
-}
-var volumeHardeningAndroid = pixel + tftp + onProcessorUnmount;
-sector(memory(firewire + interlaced, wired));
-
-
-
-
- -
-
-
- -
- -
- - \ No newline at end of file diff --git a/docs/docs/index.html b/docs/docs/index.html index 4843615..d41dba3 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -13,7 +13,7 @@ - + diff --git a/docs/docs/index.xml b/docs/docs/index.xml index fb2c151..291cff5 100644 --- a/docs/docs/index.xml +++ b/docs/docs/index.xml @@ -1,13 +1,12 @@ -Table of content on WiTTY: Web-based interactive TTYhttps://syssecfsu.github.io/witty/docs/Recent content in Table of content on WiTTY: Web-based interactive TTYHugo -- gohugo.ioen-usInstallationhttps://syssecfsu.github.io/witty/docs/install/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/install/Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. +Table of content on WiTTY: Web-based interactive TTYhttps://syssecfsu.github.io/witty/docs/Recent content in Table of content on WiTTY: Web-based interactive TTYHugo -- gohugo.ioen-usInstallationhttps://syssecfsu.github.io/witty/docs/install/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/install/Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. From Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases Download the release for your system Decompress the binary with the following command at selected location. -tar -xzvf releasevxxx_xxx.tar.gz -From Source Code Install the go compiler.User Interfacehttps://syssecfsu.github.io/witty/docs/ui/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/ui/Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run. +tar -xzvf witty_vx.x.x_xxx.tar.gz +For example, use tar -xzvf witty_v1.User Interfacehttps://syssecfsu.github.io/witty/docs/ui/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/ui/Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run. Sub-command Description adduser Add/update an authenticated user with their password deluser Delete an authenticated user listusers List all the authenticated users replay Replay a recorded session (set your terminal to 120x36 first) merge Merge several recorded sessions into one session run Run a specified CLI program when user connects with browser Some sub-commands have options.Record Sessionshttps://syssecfsu.github.io/witty/docs/record/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/record/Record Sessions # You can record an ongoing session in the interactive terminal window. Recorded sessions will be listed in the main window of WiTTY. You can click the button to rename a recorded session. By default, a recorded session is named based on its session ID and the current time, not very meaningful for human. Rename them to something easy to remember, such as task1, task2,&hellip; WiTTY provides two sub-commands to merge and replay recorded sessions.VirtualBoxhttps://syssecfsu.github.io/witty/docs/vm/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/vm/Use WiTTY with SEED VM # The SEED labs provides a number of security hands-on labs. It is a popular security lab course taught at many universities. The SEED labs use VirtualBox to run its VMs (because VirtualBox is cross-platform.) By default, the SEED VM uses only NAT-based network, which means that the VM can access the Internet but not the host machine (i.e., the machine that runs VirtualBox is called the host, and the VM is often called the guest.Abouthttps://syssecfsu.github.io/witty/docs/about/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/about/About WiTTY # WiTTY is written in the go programming language, using the Gin web framework, gorilla/websocket, pty, and the wonderful xterm.js! The workflow is simple, the client initiates a terminal window (xterm.js) and creates a websocket with the server, which relays the data between pty and xterm. The program has been tested on Linux, WSL2, Raspberry Pi 3B (Debian), and MacOSX using Google Chrome, Firefox, and Safari. -Most icons were provided by fontawesome under this license.<link>https://syssecfsu.github.io/witty/docs/hidden/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://syssecfsu.github.io/witty/docs/hidden/</guid><description>This page is hidden in menu # Quondam non pater est dignior ille Eurotas # Latent te facies # Lorem markdownum arma ignoscas vocavit quoque ille texit mandata mentis ultimus, frementes, qui in vel. Hippotades Peleus pennas conscia cuiquam Caeneus quas. -Pater demittere evincitque reddunt Maxime adhuc pressit huc Danaas quid freta Soror ego Luctus linguam saxa ultroque prior Tatiumque inquit Saepe liquitur subita superata dederat Anius sudor Cum honorum Latona # O fallor in sustinui iussorum equidem.</description></item></channel></rss> \ No newline at end of file +Most icons were provided by fontawesome under this license.</description></item></channel></rss> \ No newline at end of file diff --git a/docs/docs/install/index.html b/docs/docs/install/index.html index d9943f4..a299834 100644 --- a/docs/docs/install/index.html +++ b/docs/docs/install/index.html @@ -2,20 +2,20 @@ <head> <meta charset=utf-8> <meta name=viewport content="width=device-width,initial-scale=1"> -<meta name=description content="Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. +<meta name=description content="Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. From Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases Download the release for your system Decompress the binary with the following command at selected location. -tar -xzvf releasevxxx_xxx.tar.gz - From Source Code Install the go compiler."> +tar -xzvf witty_vx.x.x_xxx.tar.gz + For example, use tar -xzvf witty_v1."> <meta name=theme-color content="#FFFFFF"> <meta name=color-scheme content="light dark"><meta property="og:title" content="Installation"> -<meta property="og:description" content="Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. +<meta property="og:description" content="Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. From Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases Download the release for your system Decompress the binary with the following command at selected location. -tar -xzvf releasevxxx_xxx.tar.gz - From Source Code Install the go compiler."> +tar -xzvf witty_vx.x.x_xxx.tar.gz + For example, use tar -xzvf witty_v1."> <meta property="og:type" content="article"> <meta property="og:url" content="https://syssecfsu.github.io/witty/docs/install/"><meta property="article:section" content="docs"> <title>Installation | WiTTY: Web-based interactive TTY @@ -23,7 +23,7 @@ tar -xzvf releasevxxx_xxx.tar.gz - + @@ -74,20 +74,14 @@ tar -xzvf releasevxxx_xxx.tar.gz -

+

Installation # -

-

WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code.

+

+

WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code.

    @@ -99,7 +93,10 @@ Installation
  1. Decompress the binary with the following command at selected location.

    -

    tar -xzvf releasevxxx_xxx.tar.gz

    +

    tar -xzvf witty_vx.x.x_xxx.tar.gz

    +
    +

    For example, use tar -xzvf witty_v1.1.1_linux_amd64.tar.gz to decompress release v1.1.1 for Linux on AMD64.

    +
@@ -125,10 +122,10 @@ macOS users can install go with homebrew. Note that WiTTY uses go:embed to embed assets in the binary. Remember to re-build WiTTY after changing templates.
-

+

Post-installation Configuration # -

+
  1. WiTTY uses TLS to protect its traffic. You can request a free Let’s Encrypt cert or use a self-signed cert. Here is how to create a self-signed cert in the tls sub-directory:

    @@ -160,10 +157,10 @@ WiTTY normally listens on port 8080. It can be overridden with the -p/-por

    https://<witty_server_ip>:8080

-

+

Example Use Case # -

+

WiTTY doesn’t support Windows because Windows doesn’t have PTY. You can still use WiTTY to access Windows terminal through a proxy.

Here is how to do it. We can run WiTTY on a Raspberry Pi running Raspbian (at address 192.168.1.2). When a user connects via browser to https://192.168.1.2:9000, WiTTY will start a new ssh session to the Windows machine (at address 192.168.1.3) running a SSH server. The command to run WiTTY on the RPI is as follows:

./witty run -p 9000 ssh 192.168.1.3 -l user_name

@@ -187,13 +184,7 @@ B -- ssh --> C[Windows: 192.168.1.2
runs SSH server ] diff --git a/docs/docs/record/index.html b/docs/docs/record/index.html index c532dd3..2551729 100644 --- a/docs/docs/record/index.html +++ b/docs/docs/record/index.html @@ -17,7 +17,7 @@ WiTTY provides two sub-commands to merge and replay recorded sessions."> - + diff --git a/docs/docs/ui/index.html b/docs/docs/ui/index.html index 8e110b2..9851ed5 100644 --- a/docs/docs/ui/index.html +++ b/docs/docs/ui/index.html @@ -15,7 +15,7 @@ - + @@ -66,19 +66,13 @@ -

+

Sub-commands # -

+

Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run.

@@ -128,10 +122,10 @@ Usage of run: Max wait time between outputs (default 1000) -wait uint Max wait time between outputs (default 1000) -

+

User Authentication # -

+

WiTTY uses username/password based authentication. The user database is stored in user.db under the main directory of WiTTY. The passwords are salted with 64 bytes of random characters and then hashed using SHA256. In addition, passwords must be 12 bytes or longer. WiTTY provides three sub-commands to manage user.db.

  • witty adduser <username>
  • @@ -139,10 +133,10 @@ User Authentication
  • witty listusers

They are pretty self-explanatory. Just follow the instructions on screen.

-

+

Web Interface (witty run) # -

+

The web interface of WiTTY is mostly self-explanatory. After login, the user is presented with the main interface, as shown in this screenshot:

img

There are two tabs that list live and recorded sessions, respectively. You can click New Session to create a new interactive session, which opens in a new browser tab. The main window will list the newly created interactive session similar to the follows:

@@ -166,13 +160,7 @@ Web Interface (witty run) diff --git a/docs/docs/vm/index.html b/docs/docs/vm/index.html index 1e238ac..b02e456 100644 --- a/docs/docs/vm/index.html +++ b/docs/docs/vm/index.html @@ -15,7 +15,7 @@ By default, the SEED VM uses only NAT-based network, which means that the VM can - + @@ -66,24 +66,23 @@ By default, the SEED VM uses only NAT-based network, which means that the VM can -

+

Use WiTTY with SEED VM # -

+

The SEED labs provides a number of security hands-on labs. It is a popular security lab course taught at many universities. The SEED labs use VirtualBox to run its VMs (because VirtualBox is cross-platform.)

By default, the SEED VM uses only NAT-based network, which means that the VM can access the Internet but not the host machine (i.e., the machine that runs VirtualBox is called the host, and the VM is often called the guest.) We need to add a second, host-only network adaptor in order to run WiTTY in the guest and access WiTTY from a browser in the host.

-

To do that, first open the Host Network Manager and create a host network if there is not one already, as shown below (on macOS): +

To do that, first open the Host Network Manager and create a host network if there is not one already, as shown below (on macOS.): img

Then, open the setting for the SEED VM, go to the Network setting, and enable the second adaptor, choose the host-only adaptor. Leave the first adaptor as is.

img

After this, start the VM and list all the adaptors using the command ifconfig in a terminal. Look for the adaptor with an IP address starting with 192.168.. You should be able to ssh into the guest using this IP address from the host.

+
+If the host runs Windows, make sure virtualbox host adapter is not disabled in the Windows network settings if VirtualBox cannot find the host-only Ethernet adapter. +
@@ -96,11 +95,7 @@ Use WiTTY with SEED VM
diff --git a/docs/en.search-data.min.aef7c3dce499f6fbc6dc37f0c7211de7c96f8246746f83000032c59cce445ecf.json b/docs/en.search-data.min.aef7c3dce499f6fbc6dc37f0c7211de7c96f8246746f83000032c59cce445ecf.json deleted file mode 100644 index c01d420..0000000 --- a/docs/en.search-data.min.aef7c3dce499f6fbc6dc37f0c7211de7c96f8246746f83000032c59cce445ecf.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":0,"href":"/docs/install/","title":"Installation","section":"Table of content","content":"Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code.\nFrom Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases\n Download the release for your system\n Decompress the binary with the following command at selected location.\ntar -xzvf releasevxxx_xxx.tar.gz\n From Source Code Install the go compiler. Make sure you have go 1.17 or higher.\n Download the source code release and unzip it, or clone the repo\ngit clone https://github.com/syssecfsu/witty.git\n Go to the root directory of the source code and build the program with\n./build.sh\nThis shell script will build WiTTY and copy the binary with other needed files to the release/ directory. You can move the release/ directory to other places you want. Run WiTTY from this directory.\n macOS users can install go with homebrew. Note that macOS has its own version of golang installed. Do not remove it. Just add the path of newly installed golang at the beginning of the PATH environment variable. WiTTY uses go:embed to embed assets in the binary. Remember to re-build WiTTY after changing templates. Post-installation Configuration # WiTTY uses TLS to protect its traffic. You can request a free Let\u0026rsquo;s Encrypt cert or use a self-signed cert. Here is how to create a self-signed cert in the tls sub-directory:\n# Generate a private key for a curve\nopenssl ecparam -name prime256v1 -genkey -noout -out private-key.pem\n# Create a self-signed certificate\nopenssl req -new -x509 -key private-key.pem -out cert.pem -days 360\n Add a user to the user accounts, follow the instructions on screen to provide the password\n./witty adduser \u0026lt;username\u0026gt;\nWiTTY uses sub-commands for different functions. See details here Start the server and specify the command-line (CLI) program to run when user connects.\n./witty run bash\nIf so desired, you can disable user authenticate with -n/-naked, (not recommended). In the following example, WiTTY will run the ls command without user authentication:\n./witty run -naked ls\n WiTTY normally listens on port 8080. It can be overridden with the -p/-port option: Connect to the server with your browser at port 8080 or the one specified in step 6, for example\nhttps://\u0026lt;witty_server_ip\u0026gt;:8080\n Example Use Case # WiTTY doesn\u0026rsquo;t support Windows because Windows doesn\u0026rsquo;t have PTY. You can still use WiTTY to access Windows terminal through a proxy.\nHere is how to do it. We can run WiTTY on a Raspberry Pi running Raspbian (at address 192.168.1.2). When a user connects via browser to https://192.168.1.2:9000, WiTTY will start a new ssh session to the Windows machine (at address 192.168.1.3) running a SSH server. The command to run WiTTY on the RPI is as follows:\n./witty run -p 9000 ssh 192.168.1.3 -l user_name\nThe user can use any compatible browsers, such as that on a phone, to connect to the Windows machine without install a SSH client.\n mermaid.initialize({ \"flowchart\": { \"useMaxWidth\":true }, \"theme\": \"default\" } ) graph LR A[user on a phone] -- browser -- B[RPI: 192.168.1.1 runs WiTTY] B -- ssh -- C[Windows: 192.168.1.2 runs SSH server ] "},{"id":1,"href":"/docs/ui/","title":"User Interface","section":"Table of content","content":"Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run.\n Sub-command Description adduser Add/update an authenticated user with their password deluser Delete an authenticated user listusers List all the authenticated users replay Replay a recorded session (set your terminal to 120x36 first) merge Merge several recorded sessions into one session run Run a specified CLI program when user connects with browser Some sub-commands have options. Use -h to find out more. e.g.,\n$ ./witty run -h Usage of run: -n Run WiTTY without user authentication -naked Run WiTTY without user authentication -p uint Port number to listen on (default 8080) -port uint Port number to listen on (default 8080) -w uint Max wait time between outputs (default 1000) -wait uint Max wait time between outputs (default 1000) User Authentication # WiTTY uses username/password based authentication. The user database is stored in user.db under the main directory of WiTTY. The passwords are salted with 64 bytes of random characters and then hashed using SHA256. In addition, passwords must be 12 bytes or longer. WiTTY provides three sub-commands to manage user.db.\n witty adduser \u0026lt;username\u0026gt; witty deluser \u0026lt;username\u0026gt; witty listusers They are pretty self-explanatory. Just follow the instructions on screen.\nWeb Interface (witty run) # The web interface of WiTTY is mostly self-explanatory. After login, the user is presented with the main interface, as shown in this screenshot:\nThere are two tabs that list live and recorded sessions, respectively. You can click New Session to create a new interactive session, which opens in a new browser tab. The main window will list the newly created interactive session similar to the follows:\nWiTTY randomly names an interactive session as its unique ID. You can click the icon of an interactive session to open a read-only view of that session.\nOn the interactive terminal window, you can record an ongoing session by clicking the record button.\nAfter a session has been recorded, the main window\u0026rsquo;s Recorded Sessions will list the records, as shown below. You can replay , download , rename , and delete recorded sessions.\nHere is a screencast where we replay a recorded session that updates the pi-hole system. You can fully control the playback using the progress bar. Clicking on the progress bar stops the replay and fast-forwards (or fast-backwards) the screen to that location. You can scroll the screen to view the history when replay is stopped or resume the replay.\n"},{"id":2,"href":"/docs/record/","title":"Record Sessions","section":"Table of content","content":"Record Sessions # You can record an ongoing session in the interactive terminal window.\nRecorded sessions will be listed in the main window of WiTTY. You can click the button to rename a recorded session. By default, a recorded session is named based on its session ID and the current time, not very meaningful for human. Rename them to something easy to remember, such as task1, task2,\u0026hellip;\nWiTTY provides two sub-commands to merge and replay recorded sessions.\n witty merge -o \u0026lt;output_file\u0026gt; \u0026lt;record1\u0026gt; \u0026lt;record2\u0026gt; ... witty replay -w \u0026lt;wait_time\u0026gt; \u0026lt;recorded_session\u0026gt; Recorded sessions often have long delay between outputs. You can set wait_time of the replay command to limit the maximum wait time between outputs, to speed up the replay.\nThe following screenshot shows how to use witty merge to merge three recorded sessions into alltasks.scr.\nThe intended use of this is to record a separate session for each individual task, rename and merge them into a final session for submission to a project. All the recorded sessions are located under the records directory. "},{"id":3,"href":"/docs/vm/","title":"VirtualBox","section":"Table of content","content":"Use WiTTY with SEED VM # The SEED labs provides a number of security hands-on labs. It is a popular security lab course taught at many universities. The SEED labs use VirtualBox to run its VMs (because VirtualBox is cross-platform.)\nBy default, the SEED VM uses only NAT-based network, which means that the VM can access the Internet but not the host machine (i.e., the machine that runs VirtualBox is called the host, and the VM is often called the guest.) We need to add a second, host-only network adaptor in order to run WiTTY in the guest and access WiTTY from a browser in the host.\nTo do that, first open the Host Network Manager and create a host network if there is not one already, as shown below (on macOS): Then, open the setting for the SEED VM, go to the Network setting, and enable the second adaptor, choose the host-only adaptor. Leave the first adaptor as is.\nAfter this, start the VM and list all the adaptors using the command ifconfig in a terminal. Look for the adaptor with an IP address starting with 192.168.. You should be able to ssh into the guest using this IP address from the host.\n"},{"id":4,"href":"/docs/about/","title":"About","section":"Table of content","content":"About WiTTY # WiTTY is written in the go programming language, using the Gin web framework, gorilla/websocket, pty, and the wonderful xterm.js! The workflow is simple, the client initiates a terminal window (xterm.js) and creates a websocket with the server, which relays the data between pty and xterm.\nThe program has been tested on Linux, WSL2, Raspberry Pi 3B (Debian), and MacOSX using Google Chrome, Firefox, and Safari.\nMost icons were provided by fontawesome under this license.\n"},{"id":5,"href":"/docs/hidden/","title":"Hidden","section":"Table of content","content":"This page is hidden in menu # Quondam non pater est dignior ille Eurotas # Latent te facies # Lorem markdownum arma ignoscas vocavit quoque ille texit mandata mentis ultimus, frementes, qui in vel. Hippotades Peleus pennas conscia cuiquam Caeneus quas.\n Pater demittere evincitque reddunt Maxime adhuc pressit huc Danaas quid freta Soror ego Luctus linguam saxa ultroque prior Tatiumque inquit Saepe liquitur subita superata dederat Anius sudor Cum honorum Latona # O fallor in sustinui iussorum equidem. Nymphae operi oris alii fronde parens dumque, in auro ait mox ingenti proxima iamdudum maius?\nreality(burnDocking(apache_nanometer), pad.property_data_programming.sectorBrowserPpga(dataMask, 37, recycleRup)); intellectualVaporwareUser += -5 * 4; traceroute_key_upnp /= lag_optical(android.smb(thyristorTftp)); surge_host_golden = mca_compact_device(dual_dpi_opengl, 33, commerce_add_ppc); if (lun_ipv) { verticalExtranet(1, thumbnail_ttl, 3); bar_graphics_jpeg(chipset - sector_xmp_beta); } Fronde cetera dextrae sequens pennis voce muneris # Acta cretus diem restet utque; move integer, oscula non inspirat, noctisque scelus! Nantemque in suas vobis quamvis, et labori!\nvar runtimeDiskCompiler = home - array_ad_software; if (internic \u0026gt; disk) { emoticonLockCron += 37 + bps - 4; wan_ansi_honeypot.cardGigaflops = artificialStorageCgi; simplex -= downloadAccess; } var volumeHardeningAndroid = pixel + tftp + onProcessorUnmount; sector(memory(firewire + interlaced, wired)); "},{"id":6,"href":"/menu/","title":"Index","section":"Introduction","content":" Manual Installation UI Record VM About "}] \ No newline at end of file diff --git a/docs/en.search-data.min.cf01fda4defd8544061a2e23337262b5b8a853e9fa51a19761487bcf875291ac.json b/docs/en.search-data.min.cf01fda4defd8544061a2e23337262b5b8a853e9fa51a19761487bcf875291ac.json new file mode 100644 index 0000000..3d3bdeb --- /dev/null +++ b/docs/en.search-data.min.cf01fda4defd8544061a2e23337262b5b8a853e9fa51a19761487bcf875291ac.json @@ -0,0 +1 @@ +[{"id":0,"href":"/docs/install/","title":"Installation","section":"Table of content","content":"Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code.\nFrom Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases\n Download the release for your system\n Decompress the binary with the following command at selected location.\ntar -xzvf witty_vx.x.x_xxx.tar.gz\n For example, use tar -xzvf witty_v1.1.1_linux_amd64.tar.gz to decompress release v1.1.1 for Linux on AMD64.\n From Source Code Install the go compiler. Make sure you have go 1.17 or higher.\n Download the source code release and unzip it, or clone the repo\ngit clone https://github.com/syssecfsu/witty.git\n Go to the root directory of the source code and build the program with\n./build.sh\nThis shell script will build WiTTY and copy the binary with other needed files to the release/ directory. You can move the release/ directory to other places you want. Run WiTTY from this directory.\n macOS users can install go with homebrew. Note that macOS has its own version of golang installed. Do not remove it. Just add the path of newly installed golang at the beginning of the PATH environment variable. WiTTY uses go:embed to embed assets in the binary. Remember to re-build WiTTY after changing templates. Post-installation Configuration # WiTTY uses TLS to protect its traffic. You can request a free Let\u0026rsquo;s Encrypt cert or use a self-signed cert. Here is how to create a self-signed cert in the tls sub-directory:\n# Generate a private key for a curve\nopenssl ecparam -name prime256v1 -genkey -noout -out private-key.pem\n# Create a self-signed certificate\nopenssl req -new -x509 -key private-key.pem -out cert.pem -days 360\n Add a user to the user accounts, follow the instructions on screen to provide the password\n./witty adduser \u0026lt;username\u0026gt;\nWiTTY uses sub-commands for different functions. See details here Start the server and specify the command-line (CLI) program to run when user connects.\n./witty run bash\nIf so desired, you can disable user authenticate with -n/-naked, (not recommended). In the following example, WiTTY will run the ls command without user authentication:\n./witty run -naked ls\n WiTTY normally listens on port 8080. It can be overridden with the -p/-port option: Connect to the server with your browser at port 8080 or the one specified in step 6, for example\nhttps://\u0026lt;witty_server_ip\u0026gt;:8080\n Example Use Case # WiTTY doesn\u0026rsquo;t support Windows because Windows doesn\u0026rsquo;t have PTY. You can still use WiTTY to access Windows terminal through a proxy.\nHere is how to do it. We can run WiTTY on a Raspberry Pi running Raspbian (at address 192.168.1.2). When a user connects via browser to https://192.168.1.2:9000, WiTTY will start a new ssh session to the Windows machine (at address 192.168.1.3) running a SSH server. The command to run WiTTY on the RPI is as follows:\n./witty run -p 9000 ssh 192.168.1.3 -l user_name\nThe user can use any compatible browsers, such as that on a phone, to connect to the Windows machine without install a SSH client.\n mermaid.initialize({ \"flowchart\": { \"useMaxWidth\":true }, \"theme\": \"default\" } ) graph LR A[user on a phone] -- browser -- B[RPI: 192.168.1.1 runs WiTTY] B -- ssh -- C[Windows: 192.168.1.2 runs SSH server ] "},{"id":1,"href":"/docs/ui/","title":"User Interface","section":"Table of content","content":"Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run.\n Sub-command Description adduser Add/update an authenticated user with their password deluser Delete an authenticated user listusers List all the authenticated users replay Replay a recorded session (set your terminal to 120x36 first) merge Merge several recorded sessions into one session run Run a specified CLI program when user connects with browser Some sub-commands have options. Use -h to find out more. e.g.,\n$ ./witty run -h Usage of run: -n Run WiTTY without user authentication -naked Run WiTTY without user authentication -p uint Port number to listen on (default 8080) -port uint Port number to listen on (default 8080) -w uint Max wait time between outputs (default 1000) -wait uint Max wait time between outputs (default 1000) User Authentication # WiTTY uses username/password based authentication. The user database is stored in user.db under the main directory of WiTTY. The passwords are salted with 64 bytes of random characters and then hashed using SHA256. In addition, passwords must be 12 bytes or longer. WiTTY provides three sub-commands to manage user.db.\n witty adduser \u0026lt;username\u0026gt; witty deluser \u0026lt;username\u0026gt; witty listusers They are pretty self-explanatory. Just follow the instructions on screen.\nWeb Interface (witty run) # The web interface of WiTTY is mostly self-explanatory. After login, the user is presented with the main interface, as shown in this screenshot:\nThere are two tabs that list live and recorded sessions, respectively. You can click New Session to create a new interactive session, which opens in a new browser tab. The main window will list the newly created interactive session similar to the follows:\nWiTTY randomly names an interactive session as its unique ID. You can click the icon of an interactive session to open a read-only view of that session.\nOn the interactive terminal window, you can record an ongoing session by clicking the record button.\nAfter a session has been recorded, the main window\u0026rsquo;s Recorded Sessions will list the records, as shown below. You can replay , download , rename , and delete recorded sessions.\nHere is a screencast where we replay a recorded session that updates the pi-hole system. You can fully control the playback using the progress bar. Clicking on the progress bar stops the replay and fast-forwards (or fast-backwards) the screen to that location. You can scroll the screen to view the history when replay is stopped or resume the replay.\n"},{"id":2,"href":"/docs/record/","title":"Record Sessions","section":"Table of content","content":"Record Sessions # You can record an ongoing session in the interactive terminal window.\nRecorded sessions will be listed in the main window of WiTTY. You can click the button to rename a recorded session. By default, a recorded session is named based on its session ID and the current time, not very meaningful for human. Rename them to something easy to remember, such as task1, task2,\u0026hellip;\nWiTTY provides two sub-commands to merge and replay recorded sessions.\n witty merge -o \u0026lt;output_file\u0026gt; \u0026lt;record1\u0026gt; \u0026lt;record2\u0026gt; ... witty replay -w \u0026lt;wait_time\u0026gt; \u0026lt;recorded_session\u0026gt; Recorded sessions often have long delay between outputs. You can set wait_time of the replay command to limit the maximum wait time between outputs, to speed up the replay.\nThe following screenshot shows how to use witty merge to merge three recorded sessions into alltasks.scr.\nThe intended use of this is to record a separate session for each individual task, rename and merge them into a final session for submission to a project. All the recorded sessions are located under the records directory. "},{"id":3,"href":"/docs/vm/","title":"VirtualBox","section":"Table of content","content":"Use WiTTY with SEED VM # The SEED labs provides a number of security hands-on labs. It is a popular security lab course taught at many universities. The SEED labs use VirtualBox to run its VMs (because VirtualBox is cross-platform.)\nBy default, the SEED VM uses only NAT-based network, which means that the VM can access the Internet but not the host machine (i.e., the machine that runs VirtualBox is called the host, and the VM is often called the guest.) We need to add a second, host-only network adaptor in order to run WiTTY in the guest and access WiTTY from a browser in the host.\nTo do that, first open the Host Network Manager and create a host network if there is not one already, as shown below (on macOS.): Then, open the setting for the SEED VM, go to the Network setting, and enable the second adaptor, choose the host-only adaptor. Leave the first adaptor as is.\nAfter this, start the VM and list all the adaptors using the command ifconfig in a terminal. Look for the adaptor with an IP address starting with 192.168.. You should be able to ssh into the guest using this IP address from the host.\nIf the host runs Windows, make sure virtualbox host adapter is not disabled in the Windows network settings if VirtualBox cannot find the host-only Ethernet adapter. "},{"id":4,"href":"/docs/about/","title":"About","section":"Table of content","content":"About WiTTY # WiTTY is written in the go programming language, using the Gin web framework, gorilla/websocket, pty, and the wonderful xterm.js! The workflow is simple, the client initiates a terminal window (xterm.js) and creates a websocket with the server, which relays the data between pty and xterm.\nThe program has been tested on Linux, WSL2, Raspberry Pi 3B (Debian), and MacOSX using Google Chrome, Firefox, and Safari.\nMost icons were provided by fontawesome under this license.\n"},{"id":5,"href":"/menu/","title":"Index","section":"Introduction","content":" Manual Installation UI Record VM About "}] \ No newline at end of file diff --git a/docs/en.search.min.6dbfe7631619689d9b1cb375be53995a78dfe7f6d2f67f62e91feec139a6349c.js b/docs/en.search.min.d94cd9e9271fd6c7ba798461e1fbda7c357c43fe43568c26463af5c34e1cc416.js similarity index 87% rename from docs/en.search.min.6dbfe7631619689d9b1cb375be53995a78dfe7f6d2f67f62e91feec139a6349c.js rename to docs/en.search.min.d94cd9e9271fd6c7ba798461e1fbda7c357c43fe43568c26463af5c34e1cc416.js index 239d285..628526a 100644 --- a/docs/en.search.min.6dbfe7631619689d9b1cb375be53995a78dfe7f6d2f67f62e91feec139a6349c.js +++ b/docs/en.search.min.d94cd9e9271fd6c7ba798461e1fbda7c357c43fe43568c26463af5c34e1cc416.js @@ -1 +1 @@ -'use strict';(function(){const g='/en.search-data.min.aef7c3dce499f6fbc6dc37f0c7211de7c96f8246746f83000032c59cce445ecf.json',h=Object.assign({cache:!0},{doc:{id:'id',field:['title','content'],store:['title','href','section']}}),a=document.querySelector('#book-search-input'),b=document.querySelector('#book-search-results');if(!a)return;a.addEventListener('focus',c),a.addEventListener('keyup',d),document.addEventListener('keypress',e);function e(b){if(b.target.value!==void 0)return;if(a===document.activeElement)return;const c=String.fromCharCode(b.charCode);if(!f(c))return;a.focus(),b.preventDefault()}function f(b){const c=a.getAttribute('data-hotkeys')||'';return c.indexOf(b)>=0}function c(){a.removeEventListener('focus',c),a.required=!0,fetch(g).then(a=>a.json()).then(a=>{window.bookSearchIndex=FlexSearch.create('balance',h),window.bookSearchIndex.add(a)}).then(()=>a.required=!1).then(d)}function d(){while(b.firstChild)b.removeChild(b.firstChild);if(!a.value)return;const c=window.bookSearchIndex.search(a.value,10);c.forEach(function(a){const c=i('
  • '),d=c.querySelector('a'),e=c.querySelector('small');d.href=a.href,d.textContent=a.title,e.textContent=a.section,b.appendChild(c)})}function i(b){const a=document.createElement('div');return a.innerHTML=b,a.firstChild}})() \ No newline at end of file +'use strict';(function(){const g='/en.search-data.min.cf01fda4defd8544061a2e23337262b5b8a853e9fa51a19761487bcf875291ac.json',h=Object.assign({cache:!0},{doc:{id:'id',field:['title','content'],store:['title','href','section']}}),a=document.querySelector('#book-search-input'),b=document.querySelector('#book-search-results');if(!a)return;a.addEventListener('focus',c),a.addEventListener('keyup',d),document.addEventListener('keypress',e);function e(b){if(b.target.value!==void 0)return;if(a===document.activeElement)return;const c=String.fromCharCode(b.charCode);if(!f(c))return;a.focus(),b.preventDefault()}function f(b){const c=a.getAttribute('data-hotkeys')||'';return c.indexOf(b)>=0}function c(){a.removeEventListener('focus',c),a.required=!0,fetch(g).then(a=>a.json()).then(a=>{window.bookSearchIndex=FlexSearch.create('balance',h),window.bookSearchIndex.add(a)}).then(()=>a.required=!1).then(d)}function d(){while(b.firstChild)b.removeChild(b.firstChild);if(!a.value)return;const c=window.bookSearchIndex.search(a.value,10);c.forEach(function(a){const c=i('
  • '),d=c.querySelector('a'),e=c.querySelector('small');d.href=a.href,d.textContent=a.title,e.textContent=a.section,b.appendChild(c)})}function i(b){const a=document.createElement('div');return a.innerHTML=b,a.firstChild}})() \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 69c9d40..2ddf708 100644 --- a/docs/index.html +++ b/docs/index.html @@ -15,7 +15,7 @@ - + diff --git a/docs/index.xml b/docs/index.xml index f88a957..10a4bba 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -1,13 +1,12 @@ -Introduction on WiTTY: Web-based interactive TTYhttps://syssecfsu.github.io/witty/Recent content in Introduction on WiTTY: Web-based interactive TTYHugo -- gohugo.ioen-usInstallationhttps://syssecfsu.github.io/witty/docs/install/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/install/Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSl (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. +Introduction on WiTTY: Web-based interactive TTYhttps://syssecfsu.github.io/witty/Recent content in Introduction on WiTTY: Web-based interactive TTYHugo -- gohugo.ioen-usInstallationhttps://syssecfsu.github.io/witty/docs/install/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/install/Installation # WiTTY runs on Linux (ARM and x86), macOS, and WSL2 (Windows subsystem for Linux, basically Linux). You can install from the pre-built binary or from the source code. From Binary Visit the release page of WiTTY at https://github.com/syssecfsu/witty/releases Download the release for your system Decompress the binary with the following command at selected location. -tar -xzvf releasevxxx_xxx.tar.gz -From Source Code Install the go compiler.User Interfacehttps://syssecfsu.github.io/witty/docs/ui/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/ui/Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run. +tar -xzvf witty_vx.x.x_xxx.tar.gz +For example, use tar -xzvf witty_v1.User Interfacehttps://syssecfsu.github.io/witty/docs/ui/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/ui/Sub-commands # Similar to git and apt, WiTTY uses sub-commands for its various functions. WiTTY currently supports the following sub-commands: adduser, deluser, listusers, replay, merge, run. Sub-command Description adduser Add/update an authenticated user with their password deluser Delete an authenticated user listusers List all the authenticated users replay Replay a recorded session (set your terminal to 120x36 first) merge Merge several recorded sessions into one session run Run a specified CLI program when user connects with browser Some sub-commands have options.Record Sessionshttps://syssecfsu.github.io/witty/docs/record/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/record/Record Sessions # You can record an ongoing session in the interactive terminal window. Recorded sessions will be listed in the main window of WiTTY. You can click the button to rename a recorded session. By default, a recorded session is named based on its session ID and the current time, not very meaningful for human. Rename them to something easy to remember, such as task1, task2,&hellip; WiTTY provides two sub-commands to merge and replay recorded sessions.VirtualBoxhttps://syssecfsu.github.io/witty/docs/vm/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/vm/Use WiTTY with SEED VM # The SEED labs provides a number of security hands-on labs. It is a popular security lab course taught at many universities. The SEED labs use VirtualBox to run its VMs (because VirtualBox is cross-platform.) By default, the SEED VM uses only NAT-based network, which means that the VM can access the Internet but not the host machine (i.e., the machine that runs VirtualBox is called the host, and the VM is often called the guest.Abouthttps://syssecfsu.github.io/witty/docs/about/Mon, 01 Jan 0001 00:00:00 +0000https://syssecfsu.github.io/witty/docs/about/About WiTTY # WiTTY is written in the go programming language, using the Gin web framework, gorilla/websocket, pty, and the wonderful xterm.js! The workflow is simple, the client initiates a terminal window (xterm.js) and creates a websocket with the server, which relays the data between pty and xterm. The program has been tested on Linux, WSL2, Raspberry Pi 3B (Debian), and MacOSX using Google Chrome, Firefox, and Safari. -Most icons were provided by fontawesome under this license.<link>https://syssecfsu.github.io/witty/docs/hidden/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://syssecfsu.github.io/witty/docs/hidden/</guid><description>This page is hidden in menu # Quondam non pater est dignior ille Eurotas # Latent te facies # Lorem markdownum arma ignoscas vocavit quoque ille texit mandata mentis ultimus, frementes, qui in vel. Hippotades Peleus pennas conscia cuiquam Caeneus quas. -Pater demittere evincitque reddunt Maxime adhuc pressit huc Danaas quid freta Soror ego Luctus linguam saxa ultroque prior Tatiumque inquit Saepe liquitur subita superata dederat Anius sudor Cum honorum Latona # O fallor in sustinui iussorum equidem.</description></item><item><title/><link>https://syssecfsu.github.io/witty/menu/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://syssecfsu.github.io/witty/menu/</guid><description> Manual Installation UI Record VM About</description></item></channel></rss> \ No newline at end of file +Most icons were provided by fontawesome under this license.</description></item><item><title/><link>https://syssecfsu.github.io/witty/menu/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://syssecfsu.github.io/witty/menu/</guid><description> Manual Installation UI Record VM About</description></item></channel></rss> \ No newline at end of file diff --git a/docs/menu/index.html b/docs/menu/index.html index 945d091..9c186d5 100644 --- a/docs/menu/index.html +++ b/docs/menu/index.html @@ -13,7 +13,7 @@ <link rel=icon href=https://syssecfsu.github.io/witty/favicon.png type=image/x-icon> <link rel=stylesheet href=https://syssecfsu.github.io/witty/book.min.97cfda4f5e3c9fa49a2bf8d401f4ddc0eec576c99cdcf6afbec19173200c37db.css integrity="sha256-l8/aT148n6SaK/jUAfTdwO7Fdsmc3PavvsGRcyAMN9s=" crossorigin=anonymous> <script defer src=https://syssecfsu.github.io/witty/flexsearch.min.js></script> -<script defer src=https://syssecfsu.github.io/witty/en.search.min.6dbfe7631619689d9b1cb375be53995a78dfe7f6d2f67f62e91feec139a6349c.js integrity="sha256-bb/nYxYZaJ2bHLN1vlOZWnjf5/bS9n9i6R/uwTmmNJw=" crossorigin=anonymous></script> +<script defer src=https://syssecfsu.github.io/witty/en.search.min.d94cd9e9271fd6c7ba798461e1fbda7c357c43fe43568c26463af5c34e1cc416.js integrity="sha256-2UzZ6Scf1se6eYRh4fvafDV8Q/5DVowmRjr1w04cxBY=" crossorigin=anonymous></script> </head> <body dir=ltr> <input type=checkbox class="hidden toggle" id=menu-control> diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 20ab65d..849aed8 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://syssecfsu.github.io/witty/docs/install/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/ui/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/record/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/vm/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/about/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/hidden/</loc></url><url><loc>https://syssecfsu.github.io/witty/menu/</loc></url><url><loc>https://syssecfsu.github.io/witty/categories/</loc></url><url><loc>https://syssecfsu.github.io/witty/</loc></url><url><loc>https://syssecfsu.github.io/witty/tags/</loc></url></urlset> \ No newline at end of file +<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://syssecfsu.github.io/witty/docs/install/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/ui/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/record/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/vm/</loc></url><url><loc>https://syssecfsu.github.io/witty/docs/about/</loc></url><url><loc>https://syssecfsu.github.io/witty/menu/</loc></url><url><loc>https://syssecfsu.github.io/witty/categories/</loc></url><url><loc>https://syssecfsu.github.io/witty/</loc></url><url><loc>https://syssecfsu.github.io/witty/tags/</loc></url></urlset> \ No newline at end of file diff --git a/docs/tags/index.html b/docs/tags/index.html index 9d9f1ee..9d087bc 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -13,7 +13,7 @@ <link rel=icon href=https://syssecfsu.github.io/witty/favicon.png type=image/x-icon> <link rel=stylesheet href=https://syssecfsu.github.io/witty/book.min.97cfda4f5e3c9fa49a2bf8d401f4ddc0eec576c99cdcf6afbec19173200c37db.css integrity="sha256-l8/aT148n6SaK/jUAfTdwO7Fdsmc3PavvsGRcyAMN9s=" crossorigin=anonymous> <script defer src=https://syssecfsu.github.io/witty/flexsearch.min.js></script> -<script defer src=https://syssecfsu.github.io/witty/en.search.min.6dbfe7631619689d9b1cb375be53995a78dfe7f6d2f67f62e91feec139a6349c.js integrity="sha256-bb/nYxYZaJ2bHLN1vlOZWnjf5/bS9n9i6R/uwTmmNJw=" crossorigin=anonymous></script> +<script defer src=https://syssecfsu.github.io/witty/en.search.min.d94cd9e9271fd6c7ba798461e1fbda7c357c43fe43568c26463af5c34e1cc416.js integrity="sha256-2UzZ6Scf1se6eYRh4fvafDV8Q/5DVowmRjr1w04cxBY=" crossorigin=anonymous></script> <link rel=alternate type=application/rss+xml href=https://syssecfsu.github.io/witty/tags/index.xml title="WiTTY: Web-based interactive TTY"> </head> <body dir=ltr>