Sublime-text

Hướng dẫn tạo Plugin cho SublimeText

May 31, 2018 | hieulx

SublimeText­[1] có lẽ đã rất quen thuộc với những người thường xuyên làm việc với mã nguồn, viết mã. Một trong những điểm cộng cho SublimeText là khả năng mở rộng việc xử lý dữ liệu thông qua các Plugin, các API [2] đều được viết trên nền Python vì vậy người dùng cuối dễ dàng phát triển riêng cho mình các Plugin phục vụ công việc.

Bài viết này xuất phát từ nhu cầu công việc thường xuyên phải làm việc với các dữ liệu Base64. Hexa,… trong quá trình điều tra sự cố, phân tích mã độc.

Ví dụ khi xem xét một Web-Shell như sau:

tạo plugin cho sublimeText

 

Ta sẽ mất vài thao tác để giải mã (decode) đoạn mã độc trên, sử dụng PHP

tạo plugin cho sublimetext 1

Hoặc Python

tạo plugin cho sublimeText 2_ pentest team vietsunshine

Nếu bạn là một người làm việc trong lĩnh vực bảo mật, chắc chắc bạn đã làm thao tác này rất nhiều lần. Để tiết kiệm thời gian hơn, ta sẽ viết một Plugin giải mã dữ liệu ngay trên SublimeText.

Mục tiêu của Plugin là sau khi chọn đoạn Text, right-click ta sẽ có một menu thực hiện các chức năng sau:

  • Base64 Decode : chuyển đổi chuỗi Base64 thành Text
  • Base64 Encode : chuyển đổi chuỗi Text thành Base64
  • Hex Decode : chuyển đổi chuỗi Hex thành Text
  • Hex Encode : chuyển đổi chuỗi Text thành Hex
  • MD5 Hash : tính MD5 của chuỗi được chọn
  • SHA1 Hash : tính SHA1 của chuỗi được chọn
tạo plugin cho sublimeText 3_ pentest team vietsunshine

Môi trường phát triển Plugin của tác giả:

  • SublimeText 3
  • MacOS

Bắt đầu thực hiện viết Plugin cho SublimeText

Trước tiên, ta sẽ tìm nơi mà SublimeText lưu trữ Plugin trên máy tính, chọn Preferences -> Browse Packages
Trên MacOS mặc định là thư mục /Users/vietsunshine_labs/Library/Application Support/Sublime Text 3/Packages/
Tại đây, ta tạo một thư mục tên myutils, tất cả mã nguồn và thiết lặp cho Plugin sẽ lưu tại đây, SublimeText sẽ liên tục theo dõi thay đổi của thư mục này vào nạp lại Plugin.
Tiếp tục tạo các tập tin trong myutils như sau:

tạo plugin cho sublimeText 4_ pentest team vietsunshine

Tập tin main.py: mã nguồn Python của Plugin, nội dung như sau

Trước tiên bạn cần chút kỹ năng về lập trình Python để hiểu đoạn mã trên. Bài viết này chỉ giải thích một số điểm cần chú ý để hiểu cách Plugin hoạt động.
Hai dòng mã đầu tiên:
import sublime
import sublime_plugin
sẽ nạp các API [2] của SublimeText, đây là phần bắt buộc phải có để Plugin hoạt động được.

Mỗi thao yêu cầu xử lý dữ liệu trên SublimeText gọi là một Command, tương ứng với một Function trong Python có quy tắc đặt tên riêng, ví dụ:
class Base64decodeCommand(sublime_plugin.TextCommand):
           # …. Mã nguồn chi tiết của Function ….
Function với tên Base64decodeCommand (lưu ý các chữ in hoa) trên sẽ tạo ra một Command trong SublimeText với tên gọi là base64decode (lưu ý là chữ in thường)

Đối với Plugin đang viết, một số khái niệm của SublimeText API [2] cần quan tâm:
– View: cửa sổ đang làm việc
– Edit: dữ liệu Text đang làm việc trên một View
– Selection (viết tắt là Sel): các phần Text đang được chọn. Lưu ý là SublimeText cho chọn nhiều Text ở một thời điểm để xử lý (nhấn Cmd trên MacOS hoặc Ctrl trên Windows/Linux), ví dụ bên dưới ta chọn 4 từ printing, unknow, passages, remaing thì ta sẽ có 4 Selection, mỗi selection này là sẽ chứa thông tin về vị trí Text sẽ xử lý

tạo plugin cho sublimeText 5_ pentest team vietsunshine

Khi hiểu những khái niệm này, ta sẽ hiểu được ý nghĩa của từng Function ở trên, lấy Bas64decodeCommand làm ví dụ:

Đoạn mã trên sẽ duyệt từng Selection, trích xuất đoạn Base64 được chọn, chuyển đổi thành Text, sau đó thực hiện replace đoạn Selection ban đầu bằng đoạn Text đã chuyển đổi.

Tập tin Context.sublime-menu: chứa dữ liệu dạng JSON, quy định cách hiển thị các Context Menu và chức năng tương ứng. Nội dung của tập tin này như sau:

Việc định nghĩa ra Context-Menu bằng JSON rất linh hoạt, có thể bao gồm các Sub-menu, thuộc tính “id” là tên duy nhất để định danh cho Menu, thuộc tính “caption” chính là phần sẽ hiển thị khi right-click, “command” chính là Function tương ứng trong tập tin main,py sẽ dược thực thi khi menu được chọn.

Trong quá trình phát triển Plugin có thể sẽ phát sinh lỗi, Sublime có ghi nhận tất cả các lỗi này trên Console. Để mở Console ta chọn View -> Show Console

tạo plugin cho sublimeText 6_ pentest team vietsunshine

Sau khi viết mã và tạo context-menu xong thì SublimeText sẽ tự động nạp Plugin, ta có thể thử thao tác với dữ liệu bằng Plugin vừa tạo, quay lại ví dụ về Web-Shell ban đầu

  • Chọn chuỗi mã độc Base64, right-click, chọn My-Utils -> B64 Decode
tạo plugin cho sublimeText 7_ pentest team vietsunshine
  • Kết quả
tạo plugin cho sublimeText 8_ pentest team vietsunshine

Trên đây là cách tạo ra một một Plugin để phục vụ các thao tác mà tác giả thường gặp trong khi làm việc, bạn đọc có thể tùy biến thêm các Command khác để phục vụ công việc của riêng mình. Đoạn mã trên cũng rất đơn giản, chưa có các bước cài đặt kiểm tra lỗi hoặc làm sạch dữ liệu trước khi xử lý, thực tế Sublime cung cấp rất nhiều API [2] để thực hiện các thao tác phức tạp khác bạn đọc có thể tìm hiểu thêm ở phần tham khảo.

Tham khảo:
[1] https://www.sublimetext.com/
[2] https://www.sublimetext.com/docs/3/api_reference.html

Xem thêm về dịch vụ kiểm thử xâm nhập (Pentest): 
https://www.vietsunshine.com.vn/kiem-thu-xam-nhap/

Tags: ,