From eb0f8a028cf7ddb1b708ee97e6a9c777b45d4d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Sun, 18 Jan 2015 04:07:05 +0100 Subject: Implement a Lua 5.3 plugin loader plugin Also implemented SOCKS detection in said language. There are probably going to be some bugs. The program is no longer Valgrind-clean, as that would require plugin deinitialization, in which there is very little point. --- plugins/socks.lua | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 plugins/socks.lua (limited to 'plugins/socks.lua') diff --git a/plugins/socks.lua b/plugins/socks.lua new file mode 100644 index 0000000..a03f72d --- /dev/null +++ b/plugins/socks.lua @@ -0,0 +1,99 @@ +-- +-- socks.lua: SOCKS service detection plugin +-- +-- Copyright (c) 2015, Přemysl Janouch +-- All rights reserved. +-- +-- Permission to use, copy, modify, and/or distribute this software for any +-- purpose with or without fee is hereby granted, provided that the above +-- copyright notice and this permission notice appear in all copies. +-- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +-- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +-- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-- + +-- This plugin serves as an example of how to write Lua plugins for ponymap + +-- SOCKS 4 + +local Socks4 = {} +Socks4.__index = Socks4 + +function Socks4.new (unit) + unit:write (string.pack ("> I1 I1 I2 I1 I1 I1 I1 z", + 4, 1, 80, 127, 0, 0, 1, "")) + return setmetatable ({ unit = unit, buf = "" }, Socks4) +end + +function Socks4:on_data (data) + self.buf = self.buf .. data + if #self.buf >= 8 then + null, code = string.unpack ("> I1 I1", self.buf) + if null == 0 and code >= 90 and code <= 93 then + self.unit:set_success (true) + end + self.unit:abort () + end +end + +-- SOCKS 4A + +local Socks4A = {} +Socks4A.__index = Socks4A + +function Socks4A.new (unit) + unit:write (string.pack ("> I1 I1 I2 I4 z z", + 4, 1, 80, 1, "", "google.com")) + return setmetatable ({ unit = unit, buf = "" }, Socks4A) +end + +Socks4A.on_data = Socks4.on_data + +-- SOCKS 5 + +local Socks5 = {} +Socks5.__index = Socks5 + +function Socks5.new (unit) + unit:write (string.pack ("> I1 I1 I1", 5, 1, 0)) + return setmetatable ({ unit = unit, buf = "" }, Socks5) +end + +function Socks5:on_data (data) + self.buf = self.buf .. data + if #self.buf >= 2 then + version, result = string.unpack ("> I1 I1", self.buf) + if version == 5 and (result == 0 or result == 255) then + if result == 0 then + self.unit:add_info ("no authentication required") + end + self.unit:set_success (true) + end + self.unit:abort () + end +end + +-- Register everything + +ponymap.register_service ({ + name = "SOCKS4", + flags = 0, + new_scan = Socks4.new +}) + +ponymap.register_service ({ + name = "SOCKS4A", + flags = 0, + new_scan = Socks4A.new +}) + +ponymap.register_service ({ + name = "SOCKS5", + flags = 0, + new_scan = Socks5.new +}) -- cgit v1.2.3