From 3b2cf3a5eeab5ba3d34bf80d9fbd618ec2dd1529 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 9 Oct 2024 18:48:02 +0200 Subject: First public release --- .gitignore | 2 + README.md | 90 +++++++++++++++++++++++++++++++++++++++ commands.yaml | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ demo.gif | Bin 0 -> 1477470 bytes fms.sh | 92 +++++++++++++++++++++++++++++++++++++++ integration.zsh | 27 ++++++++++++ 6 files changed, 341 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 commands.yaml create mode 100644 demo.gif create mode 100755 fms.sh create mode 100644 integration.zsh 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: + lang: + tags: + desc: +``` + +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 '' 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:/// -w /usr/share/wordlists/dirb/common.txt -t 5 + lang: sh + tags: Pentest + desc: enumerate pages on webserver + - cmd: feroxbuster --url http:/// + lang: sh + tags: Pentest + desc: enumerate pages on webserver + - cmd: feroxbuster --url http:/// -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 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 Binary files /dev/null and b/demo.gif 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[@]}> " + 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 +} -- cgit v1.2.3