Encoding Only Your Choices, EOYC

요즘 장난감 삼아 Crystal과 Elixir로 여러가지 코드를 작성해보고 있습니다. 특히 Crystal은 Ruby와 제가 예전에 한번 소개하기도 헀고 Ruby와 거의 유사한 문법에 속도까지 갖추고 있어 개인적으로 관심이 많았던 언어입니다. 최근에 여러가지 이유로 Crystal은 주력 언어로 만들어가고 있습니다. 오늘은 Crystal로 작성한 간단한 도구 하나 공유하려고 글을 작성해봅니다.

앞서 아이디어 준 Michael에게 감사의 인사를 전합니다 :D

EOYC

“Encoding Only Your Choices”, EOYC는 CLI 도구로 원하는 부분을 인코딩할 수 있는 도구입니다. 단순히 line 단위로 인코딩하는 것이 아닌 line 안에서 원하는 부분을 원하는 형태로 인코딩 하는 것을 목표로 합니다.

https://github.com/hahwul/eoyc

또한 Encode chain을 구성하여 한번에 원하는 순서로 인코딩을 진행할 수 있습니다. 참고로 일부 케이스는 디코딩도 같이 지원합니다. 아직 인코더의 수가 많지는 않지만 점점 누적해서 추가해나갈 예정입니다.

Installation

# Install with homebrew
brew install hahwul/homebrew-eoyc/eoyc

# Check
eoyc -h

혹시나 수동으로 빌드가 필요하다면 아래와 명령으로 설치할 수 있습니다.

# Clone github repo
git clone https://github.com/hahwul/eoyc
cd eoyc

# Build eoyc
shards install
shards build

# Run
./bin/eoyc -h

Usage

Github README에도 비슷한 내용으로 작성하였지만 모아서 정리하면 크게 4가지 Flag가 중심이 되어 동작합니다.

  • 만약 전체를 인코딩하고 싶다면 -a flag를,
  • 특정 문자열만 인코딩하고 싶다면 -s flag를,
  • 정규표현식에 해당하는 부분만 인코딩하고 싶다면 -r flag를 사용할 수 있습니다.
  • 원하는 인코더, 인코더 체인은 -e flag로 명시합니다.
Usage: eoyc [arguments]
    -a, --all                        Convert all string
    -s STRING, --string=STRING       Your choice string
    -r REGEX, --regex=REGEX          Your choice regex pattern
    -e ENCODERS, --encoders=ENCODERS Encoders chain [char: >|,]
    -o PATH, --output=PATH           Output file
    -v, --version                    Show version
    -h, --help                       Show help

Choose the Range

예를들어 URL List가 담긴 urls.txt 파일을 읽어 모두 URL Encoding을 한다고 하면 아래와 같이 명령을 구성할 수 있습니다. -a flag가 들어갔기 때문에 line 전체를 인코딩합니다.

cat urls.txt | eoyc -a -e "url"   
# https%3A%2F%2Fwww.hahwul.com
# https%3A%2F%2Fgithub.com
# https%3A%2F%2Fgoogle.com

만약 여기서 : 문자만 인코딩 하고 싶다면 -s-r flag로 지정할 수 있습니다.

cat urls.txt | eoyc -s : -e "url"
# https%3A//www.hahwul.com
# https%3A//github.com
# https%3A//google.com

Encoder Chain

Choose the Range의 첫번째와 동일한 샘플로 다시 진행해봅시다. 아래 명령으로 urls.txt 파일을 읽어 모두 URL Encoding합니다.

cat urls.txt | eoyc -a -e "url"   
# https%3A%2F%2Fwww.hahwul.com
# https%3A%2F%2Fgithub.com
# https%3A%2F%2Fgoogle.com

이 때 -e flag로 > , | 문자를 통해 Chain으로 만들어보면 URL Encode 후 baes64 하는 로직은 아래와 같이 만들 수 있습니다.

cat urls.txt | eoyc -a -e "url>base64"
# aHR0cHMlM0ElMkYlMkZ3d3cuaGFod3VsLmNvbQ==
# aHR0cHMlM0ElMkYlMkZnaXRodWIuY29t
# aHR0cHMlM0ElMkYlMkZnb29nbGUuY29t

Case Study

Generate Payloads

Fuzzing 시 자동으로 인코딩 등이 필요한 경우가 있습니다. ZAP, Burp의 일부 기능에서 인코딩 처리를 할 순 있지만, 모든 상황에서 편리한건 아닙니다. 아래와 같이 CLI Pipeline을 구성해서 테스팅 과정을 자동화하거나 편리하게 바꿀 수 있습니다.

<br>
<svg/onload=alert(45)>
<img/onerror=alert(45)>
cat payloads.txt | \
    eoyc -a -e "upcase>base64" | \
    gee -prefix "{\"id\":1,\"content\":\"" \
        -suffix "\"}"

# {"id":1,"content":"PEJSPg=="}
# {"id":1,"content":"PFNWRy9PTkxPQUQ9QUxFUlQoNDUpPg=="}
# {"id":1,"content":"PElNRy9PTkVSUk9SPUFMRVJUKDQ1KT4="}

Redaction

$ ./run.sh
[i] exploit to https://www.hahwul.com..
[i] success!
bash> whoami
root
cat lst | ./bin/eoyc -s "https://www.hahwul.com" -e redacted
$ ./run.sh
[i] exploit to ◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼..
[i] success!
bash> whoami
root