aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorben2024-10-09 18:48:02 +0200
committerben2024-10-09 18:48:02 +0200
commit3b2cf3a5eeab5ba3d34bf80d9fbd618ec2dd1529 (patch)
treee1c0b10c8e54c0a3294d3c806170653542cd3e1b
downloadfms-3b2cf3a5eeab5ba3d34bf80d9fbd618ec2dd1529.tar.gz
fms-3b2cf3a5eeab5ba3d34bf80d9fbd618ec2dd1529.tar.bz2
fms-3b2cf3a5eeab5ba3d34bf80d9fbd618ec2dd1529.tar.xz
First public release
-rw-r--r--.gitignore2
-rw-r--r--README.md90
-rw-r--r--commands.yaml130
-rw-r--r--demo.gifbin0 -> 1477470 bytes
-rwxr-xr-xfms.sh92
-rw-r--r--integration.zsh27
6 files changed, 341 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ad101d0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+commands.raw
+commands.state
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8b7800b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,90 @@
+# Fast Memo Shell
+
+'Fast Memo Shell' is a tool designed to boost productivity when using a ZSH shell.
+
+It allows users to enhance their current shell with a customized list of commands by using the Alt+L key combination or by typing the command 'f'.
+
+## How to install
+
+### Dependencies
+
+FMS (Fast Memo Shell) a ZSH script based on three tools: [skim](https://github.com/lotabout/skim), [yq-go](https://github.com/mikefarah/yq) and [bat](https://github.com/sharkdp/bat).
+
+All of them should be installed and available in your PATH with the commands 'sk', 'yq', and 'bat'.
+
+For example, you can use Nix to install them:
+
+```sh
+nix-env -i skim bat yq-go
+```
+
+Or use Parabola GNU/Linux-libre binaries (a compatible method for a Kali Linux VM out of the box):
+
+```sh
+wget https://www.parabola.nu/packages/extra/x86_64/skim/download/ -O /tmp/skim.tar.zst
+sudo tar --zstd -xvf /tmp/skim.tar.zst -C /usr/local/bin --strip-components=2 usr/bin/sk
+
+wget https://www.parabola.nu/packages/extra/x86_64/go-yq/download/ -O /tmp/yq.tar.zst
+sudo tar --zstd -xvf /tmp/yq.tar.zst -C /usr/local/bin --strip-components=2 usr/bin/yq
+
+wget https://www.parabola.nu/packages/extra/x86_64/bat/download/ -O /tmp/bat.tar.zst
+sudo tar --zstd -xvf /tmp/bat.tar.zst -C /usr/local/bin --strip-components=2 usr/bin/bat
+```
+
+### FMS
+
+You should download the latest version and extract it in your home directory:
+```sh
+wget "https://git.hackade.org/ben/fms/archive/main.tar.gz" -O fms.tar.gz
+tar zxvf fms.tar.gz -C ~
+```
+
+Then add the following line to your ZSH configuration file:
+```sh
+echo 'source ~/fms/integration.zsh' >> ~/.zshrc
+```
+
+## How to configure
+
+Each command is stored in the file commands.yaml. To add new commands or modify existing ones, edit commands.yaml with the following fields:
+```yaml
+ - cmd: <the command to insert in your prompt>
+ lang: <the language of your command, sh, ps1>
+ tags: <a tag reprenting a group of commands>
+ desc: <the description of the command>
+```
+
+The tags and desc fields are only used to provide information to easily find your command when you search for it.
+The lang field is used for syntax highlighting.
+
+Here is an example of an entry:
+```yaml
+ - cmd: find / -perm -u=s -type f 2>/dev/null
+ lang: sh
+ tags: security
+ desc: Search for executables with SUID permission
+```
+
+Then, to update the database and apply the changes, run the following commands:
+```sh
+~/fms/fms.sh update
+```
+
+Fast Memo Shell comes with a list of commands as examples, but you are highly encouraged to update it according to your needs.
+
+## How to use
+
+To launch Fast Memo Shell, there are two possibilities: press Alt+L or enter the command 'f'.
+
+To select the right command, you can:
+
+* Enter a string to find your command.
+* Use the up and down arrow keys.
+* Enter '<string>' to display only the commands containing this substring.
+* Once you have the desired command selected, just press Enter.
+
+Fast Memo Shell can also display all available manuals. To switch between both modes, use Shift+Left and Shift+Right arrows."
+
+## Demo
+
+![Demo](demo.gif) \ No newline at end of file
diff --git a/commands.yaml b/commands.yaml
new file mode 100644
index 0000000..35f6506
--- /dev/null
+++ b/commands.yaml
@@ -0,0 +1,130 @@
+title: Commands for Fast Memo Shell
+commands:
+ - cmd: nmap -p- --min-rate 10000 192.168.56.30 -Pn
+ lang: sh
+ tags: Pentest
+ desc: Fast scan all ports
+ - cmd: nmap -p 53,88,135,139,389,445,464,593,636,3268,3269,5985,5986,9389,49668,49670,49671,49673,49674,49687,49750 -sCV 192.168.56.30 -Pn
+ lang: sh
+ tags: Pentest
+ desc: Scan with services and versions
+ - cmd: nmap -p80,443 --script http-title 192.168.218.0/24 --open -Pn
+ lang: sh
+ tags: Pentest
+ desc: TCP scan HTTP/S and get page titles
+ - cmd: find /usr/share/nmap/scripts/ -type f | sk --preview 'bat -l lua --color=always {}'
+ lang: sh
+ tags: Pentest
+ desc: search a NSE script
+ - cmd: gobuster dir -u http://<IP|HOST>/ -w /usr/share/wordlists/dirb/common.txt -t 5
+ lang: sh
+ tags: Pentest
+ desc: enumerate pages on webserver
+ - cmd: feroxbuster --url http://<IP|Host>/
+ lang: sh
+ tags: Pentest
+ desc: enumerate pages on webserver
+ - cmd: feroxbuster --url http://<IP|Host>/ -x pdf,php,txt
+ lang: sh
+ tags: Pentest
+ desc: enumerate pages on webserver (check for pdf, php, txt files)
+ - cmd: smbclient --no-pass -L //192.168.194.10
+ lang: sh
+ tags: Pentest
+ desc: list unprotected SMB shares
+ - cmd: snmpwalk -c public -v1 -t 10 192.168.50.151
+ lang: sh
+ tags: Pentest
+ desc: SNMP enumeration
+ - cmd: rlwrap -cAr nc -lnvp 443
+ lang: sh
+ tags: Pentest
+ desc: Bind netcat for reverse shell with completion
+ - cmd: impacket-psexec hackade.org/ben:fakepass@192.168.99.80
+ lang: sh
+ tags: Pentest
+ desc: Using psexec to get an interactive shell
+ - cmd: systeminfo
+ lang: ps1
+ tags: Pentest
+ desc: Information about the operating system and architecture
+ - cmd: ipconfig /all
+ lang: ps1
+ tags: Pentest
+ desc: Information about the network configuration
+ - cmd: route print
+ lang: ps1
+ tags: Pentest
+ desc: Routing table
+ - cmd: exiftool -a -u old.pdf
+ lang: sh
+ tags: Pentest
+ desc: Print all metadata from a file
+ - cmd: mitmproxy --set console_mouse=false --set anticache -p 8080
+ lang: sh
+ tags: Linux
+ desc: launch mitmproxy with options
+ - cmd: find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)
+ lang: sh
+ tags: Linux
+ desc: search for files not owned by any package
+ - cmd: sudo -l
+ lang: sh
+ tags: Linux
+ desc: Inspecting current user's sudo permissions
+ - cmd: socat -ddd TCP-LISTEN:2345,fork TCP:10.4.50.215:5432
+ lang: sh
+ tags: Pentest Linux
+ desc: Running the Socat port forward command.
+ - cmd: sudo lsof -nP -i tcp
+ lang: sh
+ tags: Linux
+ desc: list process listing tcp socket
+ - cmd: sudo lsof -u 1000
+ lang: sh
+ tags: Linux
+ desc: list files used by UID 1000
+ - cmd: sudo lsof -p 2658
+ lang: sh
+ tags: Linux
+ desc: list files used by PID 2658
+ - cmd: mysql -u root -p'root' -h 192.168.50.16 -P 3306
+ lang: sh
+ tags: Linux
+ desc: connect to mysql
+ - cmd: sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3.11
+ lang: sh
+ tags: Linux
+ desc: Allow bind for port < 1024, set capability CAP_NET_BIND_SERVICE
+ - cmd: vim --clean
+ lang: sh
+ tags: Linux
+ desc: launch vim without options and config files
+ - cmd: curl -s --head 'https://github.com/lotabout/skim/releases/latest' | grep '^location' | rev | cut -d'/' -f 1 | rev | tr -d '\r'
+ lang: sh
+ tags: Linux
+ desc: check the last tag from a github project
+ - cmd: grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
+ lang: sh
+ tags: Linux
+ desc: grep ip address
+ - cmd: grep -E -o "[[:alnum:]]{30,34}"
+ lang: sh
+ tags: Linux
+ desc: grep NTLM hash
+ - cmd: Set-WinUserLanguageList -Force 'fr-FR'
+ lang: ps1
+ tags: powershell winsetup
+ desc: change Keyboard Layout in French
+ - cmd: tail --pid=$(pgrep procname) -f /dev/null && ntf send finished
+ lang: sh
+ tags: Linux
+ desc: wait and send message when a process is fish
+ - cmd: cat ips | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort | sponge ips
+ lang: sh
+ tags: Linux
+ desc: extract ips from file
+ - cmd: ping -M do -s <mtu-value> 192.168.1.1
+ lang: sh
+ tags: Linux
+ desc: check for the correct MTU value \ No newline at end of file
diff --git a/demo.gif b/demo.gif
new file mode 100644
index 0000000..e5932d7
--- /dev/null
+++ b/demo.gif
Binary files differ
diff --git a/fms.sh b/fms.sh
new file mode 100755
index 0000000..73980e0
--- /dev/null
+++ b/fms.sh
@@ -0,0 +1,92 @@
+#!/usr/bin/env bash
+
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")
+cd "$SCRIPTPATH" || exit
+
+for c in sk bat yq; do
+ if ! command -v ${c} &>/dev/null; then
+ echo "$command ${c} could not be found"
+ exit 1
+ fi
+done
+
+SWITCH_MENU=$(mktemp)
+
+function update() {
+ touch commands.state
+ if [[ "$(stat -c%Y commands.yaml)" != "$(cat commands.state)" ]] || [[ $1 == "force" ]]; then
+ cat /dev/null >commands.raw
+ i=1
+ #set -eux
+ while read -r line; do
+ cmd=$(echo "${line}" | yq -r .cmd)
+ lang=$(echo "${line}" | yq -r .lang)
+ tags=$(echo "${line}" | yq -r .tags)
+ desc=$(echo "${line}" | yq -r .desc)
+ if [[ $cmd == "null" ]] || [[ $lang == "null" ]] || [[ $tags == "null" ]] || [[ $desc == "null" ]]; then
+ echo "Error on line: ${line}"
+ exit
+ fi
+ echo "${cmd} # [${tags} ${lang} ${i}] ${desc}" | tee -a commands.tmp.${lang} >/dev/null
+ i=$(($i + 1))
+ done < <(cat commands.yaml | yq e -o=j -I=0 .commands[])
+ for filename in $(ls -t commands.tmp.*); do
+ lang=$(echo ${filename} | rev | cut -d'.' -f1 | rev)
+ cat ${filename} | bat --color=always -l ${lang} -pp >>commands.raw
+ rm -f ${filename}
+ done
+ stat -c%Y commands.yaml >commands.state
+ fi
+}
+
+function notes() {
+ update
+ echo -n 0 >${SWITCH_MENU}
+ unset RES
+ RES=$(cat commands.raw | sk --reverse --ansi --inline-info \
+ --bind "shift-left:execute-silent(echo -n 1 > ${SWITCH_MENU})+abort" \
+ --bind "shift-right:execute-silent(echo -n 1 > ${SWITCH_MENU})+abort")
+ SWITCH=$(cat ${SWITCH_MENU})
+ if [[ ${SWITCH} -eq 1 ]]; then
+ manuals
+ fi
+ if [[ ! -z "${RES}" ]]; then
+ echo -n ${RES} | grep -o ".*#" | sed 's/ #$//g'
+ fi
+ rm -f ${SWITCH_MENU}
+ exit
+}
+
+function manuals() {
+ echo -n 0 >${SWITCH_MENU}
+ unset RES
+ RES=$(man -k . | bat --color=always -pp - | sk --reverse --ansi --inline-info --keep-right --print-query \
+ --bind "shift-left:execute-silent(echo -n 1 > ${SWITCH_MENU})+abort" \
+ --bind "shift-right:execute-silent(echo -n 1 > ${SWITCH_MENU})+abort")
+ SWITCH=$(cat ${SWITCH_MENU})
+ if [[ ${SWITCH} -eq 1 ]]; then
+ notes
+ fi
+ if [[ ! -z "${RES}" ]]; then
+ echo -n man $(echo ${RES} | cut -d' ' -f1)
+ fi
+ rm -f ${SWITCH_MENU}
+ exit
+}
+
+function copy() {
+ cat "${COPY_SRC}" >"${1}"
+}
+
+function _usage() {
+ echo "Invalid command. Usage: ${0} <${actions[@]}> <context>"
+ exit 1
+}
+
+actions=$(declare -F | grep -v _ | cut -d' ' -f3 | xargs)
+if [[ ! " ${actions[*]} " =~ [[:space:]]${1}[[:space:]] ]]; then
+ _usage
+else
+ ${1} ${2} ${3}
+fi
diff --git a/integration.zsh b/integration.zsh
new file mode 100644
index 0000000..e582b9c
--- /dev/null
+++ b/integration.zsh
@@ -0,0 +1,27 @@
+function _notes_cmds {
+ FILE_OUTPUT=$(mktemp)
+ ~/fms/fms.sh notes >${FILE_OUTPUT}
+ autoload -U edit-command-line
+ zle -N edit-command-line
+ export COPY_SRC=${FILE_OUTPUT}
+ export EDITOR="${HOME}/fms/fms.sh copy"
+ export VISUAL="${HOME}/fms/fms.sh copy"
+ edit-command-line
+ zle -D edit-command-line
+ rm -f $FILE_OUTPUT
+}
+zle -N _notes_cmds
+bindkey '^[l' _notes_cmds
+
+function _f {
+ if [[ $PREPROMPT_TOFILL -eq 1 ]]; then
+ CMD=$(~/fms/fms.sh notes)
+ LBUFFER="${CMD} $LBUFFER"
+ unset PREPROMPT_TOFILL
+ fi
+}
+
+function f {
+ export PREPROMPT_TOFILL=1
+ zle -N zle-line-init _f
+}