pet and hack-pet. managing command snippets for security testing

Hi, hackers and bugbounty hunters :D

Today, I’d like to talk about how to easily manage your command snippet, and even more about a project that can share and use snippets together.

오늘은 여러분들의 command snippet을 쉽게 관리하는 방법, 그리고 더 나아가 snippet을 같이 공유하고 사용할 수 있는 프로젝트에 대한 이야기를 하려고 합니다.

What is pet?

Recently, I found a very interesting tool. It is the command-line snippet manager called pet. It has a fast searchable interface such as fzf, and provides the ability to personalize and synchronize snippets through gist.

최근, 상당히 흥미로운 도구를 하나 발견했습니다. 바로 pet이라는 command-line snippet manager입니다. fzf 같은 빠른 검색이 가능한 인터페이스를 가지고있고, gist를 통해 snippet들을 개인화하고 동기화하여 관리할 수 있는 기능을 제공합니다.

pet 
pet - Simple command-line snippet manager.

Usage:
  pet [command]

Available Commands:
  configure   Edit config file
  edit        Edit snippet file
  exec        Run the selected commands
  help        Help about any command
  list        Show all snippets
  new         Create a new snippet
  search      Search snippets
  sync        Sync snippets
  version     Print the version number

Flags:
      --config string   config file (default is $HOME/.config/pet/config.toml)
      --debug           debug mode
  -h, --help            help for pet

https://github.com/knqyf263/pet

Install with go get

설치는 go get이면 충분합니다.

go get -u github.com/knqyf263/pet

There are several commands, but basically, there are no problems in using them if you know only the four (newlistexecsearch).

여러 명령이 있지만, 기본적으로 4가지(newlistexecsearch)만 확실하게 알고가면 사용하는데 전혀 지장이 없습니다.

pet new
Command> Your command
Description> Your Desc

You can use variables (<param> or <param=default_value> ) in snippets.

new로 새로운 snippet을 등록할 수 있습니다. 이 때 <> 같은 패턴을 통해 사용자로 부터 인자값을 받을 수 있습니다.

pet new
Command> echo <param> | ~/go/bin/gau | grep "=" | qsreplace -a
Description> Find url included parameter, from gau

Show list

list는 저장된 리스트를 봅니다.

pet list
pet list
Description: ps elf!
    Command: ps -elf
------------------------------
...snip...
------------------------------
Description: Find url included parameter, from gau
    Command: echo <param> | ~/go/bin/gau | grep "=" | qsreplace -a

and exec(if you select, run command) or search(if you select, show command)

exec는 즉시실행, search는 쿼리 보기정도입니다.

pet exec
https://www.hahwul.com/search?updated-max=2019-12-05t02%3A04%3A00+09%3A00
https://www.hahwul.com/2015/12/coding-htmljavascript-code-for-popup.html?showcomment=1532047391164
https://www.hahwul.com/2019/11/burp-suite-using-tor-network.html?m=1
http://www.hahwul.com/2015/06/operator-overloading-for-python-code.html?showComment=1434687933593
http://www.hahwul.com/2015/09/design-sql-injection.html?showComment=1466006407930
http://www.hahwul.com/2016/01/exploit-android-sensord-local-root.html?showComment=1487266696141
http://www.hahwul.com/2016/01/java-java-applet-simle-code-for-java.html?showComment=1482295236658
http://www.hahwul.com/2016/02/metasploit-default-shell-meterpreter.html?showComment=1456212183726
http://www.hahwul.com/2016/07/metasploit-meterpreter-paranoid-mode.html?showComment=1495406771315
http://www.hahwul.com/2016/07/metasploit-meterpreter-railgun-useful.html?showComment=1477038507834
http://www.hahwul.com/2016/07/ruby-writing-web-crawler-with-ruby-and.html?showComment=1467938120314
http://www.hahwul.com/2016/08/hacking-mobile-application.html?showComment=1482063530341
http://www.hahwul.com/2017/01/hacking-microsoft-windows-kernel.html?showComment=1485360093822
http://www.hahwul.com/2017/02/metasploit-hardware-pentest-using.html?showComment=1487524773751
http://www.hahwul.com/2017/02/python-pudbconsole-base-debugger-python.html?showComment=1488463407073
http://www.hahwul.com/2017/03/web-hacking-data-xss-filtering-bypass.html?showComment=1491831511270
....

Shortcut� key binding

To use it after registering snippet, you need to issue a command such as pet exec to cli. This is a bit annoying, so it is very convenient to do key mappings through zsh/bash rc. In my case, I mapped it with Ctrl+s.

snippet을 등록한 이후에 이를 사용하려면 cli에 pet exec 등의 명령을 쳐야합니다. 이는 조금 귀찮은 일이기 때문에 zsh/bash rc를 통해 키 매핑을 해두면 굉장히 편합니다. 저의 경우는 Ctrl+s 로 매핑해두었습니다.

zsh.rc

function pet-select() {
  BUFFER=$(pet search --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle redisplay
}
zle -N pet-select
stty -ixon
bindkey '^s' pet-select

bash.rc

function pet-select() {
  BUFFER=$(pet search --query "$READLINE_LINE")
  READLINE_LINE=$BUFFER
  READLINE_POINT=${#BUFFER}
}
bind -x '"\C-x\C-r": pet-select'

If you apply it with the source command afterwards, you can see that pet is executed immediately when the shortcut key is pressed.

이후에 source 명령으로 적용해보면 단축키를 눌렀을 떄 바로 pet이 실행되는 걸 볼 수 있습니다.

source ~/.zshrc
source ~/.bashrc

Um.. share snippet? for we for hackers for bounty hunters?

As I was using pet, I thought it would be good to use it while sharing. So we looked at the function of pet sync more, but as a result, it is a form that only individuals can share and use (because it is a gist based on their git token..)

pet을 사용하다보니 공유하면서 사용하면 좋을 것 같다는 생각이 들었습니다. 그래서 pet sync 쪽 기능을 좀 더 알아봤지만, 결과적으론 개인만 공유하며 쓸 수 있는 형태입니다(자신의 git token 기준의 gist라서..)

So I was thinking about a project similar to the WebHackersWeapons I created earlier. First, if you do pet edit, you can modify the snippet information saved as a text file. Through this, you can check the path and format of the saved file. At this time, the location of the original is ~/.config/pet/snippet.toml and I am using TOML.

그래서 예전에 만든 WebHackersWeapons와 유사한 프로젝트를 고민하게 됬습니다. 우선 pet edit 를 하게 되면 text 파일로 저장된 snippet 정보를 수정할 수 있는데, 이를 통해 저장되는 파일의 경로와 포맷을 확인했습니다.

이 때 원본의 위치는.. ~/.config/pet/snippet.toml 이고 TOML을 사용하고 있네요.

[[snippets]]
  description = "Find url included parameter, from gau"
  command = "echo <param> | ~/go/bin/gau | grep \"=\" | qsreplace -a"
  output = ""

What is TOML

First, let’s take a look at the pet behavior a little more. First of all, pet uses TOML when storing all information such as config / snippet.

자 먼저 pet의 동작에 대해 조금 더 살펴봅시다. 우선 pet은 config / snippet 등 모든 정보를 저장할 떄 TOML을 사용합니다.

TOML은 YAML, JSON 등과 같은 데이터 포맷이고 개인적으로 가시성이 좋기 때문에 좋아하는 포맷입니다.

TOML aims to be a minimal configuration file format that’s easy to read due to obvious semantics. TOML is designed to map unambiguously to a hash table. TOML should be easy to parse into data structures in a wide variety of languages.

https://github.com/toml-lang/toml

golang TOML Parse

Since I am using go, I searched for a go library that can parse TOML. Typically, toml and go-toml seem to be used, and I chose a go-toml with active commit.

저는 일단 go를 쓰고 있기 때문에 TOML을 파싱할 수 있는 go library에 대해 찾아봤습니다. 대표적으로 tomlgo-toml 이 사용되는 것 같고 commit 이 활발한 go-toml을 선택했습니다.

https://github.com/BurntSushi/toml

=> last change : 2 years ago

https://github.com/pelletier/go-toml

=> last change : 9days ago

writing simple code…

이제 테스팅용 코드를 짜보면..

package main

import (
	"github.com/pelletier/go-toml"
	"fmt"
	"os"
)

type PetSnippet struct {
	Description string `toml:"description"`
	Command     string `toml:"command"`
	Output      string `toml:"output"`
}

func check(e error) {
	if e != nil {
		panic(e)
	}
}

func main(){
	data := PetSnippet{Description: "abcd",Command: "abcd",Output: "abcd"}
	b, err := toml.Marshal(data)
	check(err)
	buffer := "[[snippet]]\n"+string(b)+"\n"
	fmt.Println(buffer)
	f , err := os.Create("asdf.daml")
	check(err)
	_, err = f.Write([]byte(buffer))
}

go run main.go
[[snippet]]
command = "abcd"
description = "abcd"
output = "abcd"

cat asdf.daml
[[snippet]]
command = "abcd"
description = "abcd"
output = "abcd"

Yeaaaaa

크게 무리없이 잘 되네요!

hack-pet !

So, since last night, I’ve been writing code. It is a tool to create and manage hackpet.toml, which contains all snippet information, and ./snippets directory that stores each individual file.

그래서, 어제 밤부터 후다닥 코드를 작성해봤습니다. 모든 snippet 정보를 담고있는 hackpet.toml 과 각 개별 파일로 보관하는 ./snippets directory 를 만들고 관리할 수 있는 도구입니다.

https://github.com/hahwul/hack-pet

You can read and apply the desired snippet.toml from ./snippets or copy hackpet.toml to pet’s snippet.toml file and use it. After copying, hack-pet snippets will appear in the pet command.

./snippets 에서 원하시는 snippet.toml 을 읽어 적용하시거나 hackpet.toml 을 pet의 snippet.toml 파일로 복사하셔서 사용하시면 됩니다.

cat ./hackpet.toml >> ~/.config/pet/snippet.toml

복사한 이후에는 hack-pet의 snippet들이 pet 명령에서 나타나게 됩니다.

Conclusion

We need your help to share and activate good snippets. Be a good Contributer!