forked from valendono/TCL-Eggdrop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathantiproxy.tcl
269 lines (238 loc) · 10.7 KB
/
antiproxy.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# __ __ __ ___ __
# _\ \\ \__ /\ \ /\_ \ /\ \__
# /\__ _ _\ \_\ \ __ __ __ __\//\ \ ___ _____ ___ ___ __ ___\ \ ,_\
# \/__\ \\ \__ /'_` \ /'__`\/\ \/\ \ /'__`\\ \ \ / __`\/\ '__`\ /' __` __`\ /'__`\/' _ `\ \ \/
# /\_ _ _\/\ \_\ \/\ __/\ \ \_/ |/\ __/ \_\ \_/\ \_\ \ \ \_\ \/\ \/\ \/\ \/\ __//\ \/\ \ \ \_
# \/_/\_\\_\/\ \___,_\ \____\\ \___/ \ \____\/\____\ \____/\ \ ,__/\ \_\ \_\ \_\ \____\ \_\ \_\ \__\
# \/_//_/ \/__,_ /\/____/ \/__/ \/____/\/____/\/___/ \ \ \/ \/_/\/_/\/_/\/____/\/_/\/_/\/__/
# \ \_\
# \/_/
#
# /\ \ /\ \__ __
# _____ _ __ ___ \_\ \ __ __ ___\ \ ,_\/\_\ ___ ___ ____
# /\ '__`\/\`'__\/ __`\ /'_` \/\ \/\ \ /'___\ \ \/\/\ \ / __`\ /' _ `\ /',__\
# \ \ \_\ \ \ \//\ \_\ \/\ \_\ \ \ \_\ \/\ \__/\ \ \_\ \ \/\ \_\ \/\ \/\ \/\__, `\
# \ \ ,__/\ \_\\ \____/\ \___,_\ \____/\ \____\\ \__\\ \_\ \____/\ \_\ \_\/\____/
# \ \ \/ \/_/ \/___/ \/__,_ /\/___/ \/____/ \/__/ \/_/\/___/ \/_/\/_/\/___/
# \ \_\
# \/_/
#
# Anti proxy scan script.
# /* This is an anti proxy script written for eggdrop. It's been tested on eggdrop1.6.17 with TCL version 8.4
# * Unlike other anti proxy scripts i've seen around.
# * This script works just as well on a windrop as it does on a windrop
# * I've been testing it with a few proxies myself and it clears about 5 proxies in a few seconds without a problem
# * If it detects a floodjoin happening it will set the modes you choose
# * (Default mir = moderated, invite only, registered only) These modes are for Quakenet though.
# * The script will first check what modes you already have set so it won't be unsetting a mode you already had before the floodjoin
# */
# /* Author info
# * I made this script because i was sick of all the proxies that were joining my channel and spamming it
# * It's based off the proxycheck.tcl made by James. I rewrote the entire script but kept the basics in.
# * This script is generally alot faster than that script. But it's still in beta form!
# * I release this script to http://development.woosah.org
# * and no other websites are allowed to release this without my explicit authorisation.
# * If you have an eggdrop website with scripts and you'd like to put this script on your webpage,
# * Send me an email at metroid at gmail.com replacing at with @
# */
# /* Installing the anti-proxy script
# * First, put the script into your /scripts folder.
# * Then at the end of your eggdrop.conf, Put:
# * source scripts/anti-proxy.tcl
# * Or if you are using the #development configuration file, you won't have to do anything.
# * Just rehash the bot after you've done this and it should work.
# * Read the next part about using it.
# */
# /* Using the anti-proxy script
# * The script itself pretty much does everything automaticly once it's activated.
# * You can activate it by typing: <trigger>proxy enable
# * You can deactivate it by typing: <trigger>proxy disable
# * If you want some statistics about how many people it has scanned, detected or kicked,
# * you can use <trigger>proxy stats
# * Just typing <trigger>proxy will tell you if the check is enabled or disabled, and possibly statistics about it.
# */
namespace eval proxy {
variable version "0.75"
variable author "metroid - #development on irc.quakenet.org"
variable trigger "?"
# The sources we dns to find out if a user is a proxy
variable source { "dnsbl.dronebl.org" "rbl.efnetrbl.org" "rbl.efnet.org" "dnsbl.tornevall.org" }
setudef flag antiproxy
setudef str antijoins
setudef str antidetected
setudef str antikicked
# /* Settings! */
variable flood "2:15" ;# 4 proxies that join in 8 seconds and the channel gets closed
variable close "30" ;# This is in seconds! It will keep the channel closed for 30 seconds
variable modes "mir" ;# the modes it will set when the channel gets flooded.
# /* End of settings */
# /* Don't edit anything below these lines. If you break it, don't expect me to fix it for you. */
bind JOIN -|- * [namespace current]::checkuser
bind PUB m|n ${trigger}proxy [namespace current]::toggle
variable proxy
array set proxy ""
}
proc proxy::toggle {nickname hostname handle channel arguments} {
set command [lindex [split $arguments] 0]
switch -exact -- [string tolower $command] {
enable {
if {![channel get $channel antiproxy]} {
channel set $channel +antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was enabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already enabled."
}
}
disable {
if {[channel get $channel antiproxy]} {
channel set $channel -antiproxy
putquick "NOTICE $nickname :Done. Anti-Proxy was disabled."
} else {
putquick "NOTICE $nickname :Error: Anti-Proxy is already disabled."
}
}
stats {
if {([channel get $channel antijoins] != "") || ([channel get $channel antidetected] != "") || ([channel get $channel antikicked] != "")} {
putquick "NOTICE $nickname :Stats for $channel: [statistics $channel]"
} else {
putquick "NOTICE $nickname :No statistics available for $channel."
}
}
default {
if {[channel get $channel antiproxy]} {
putquick "NOTICE $nickname :Anti-Proxy is currently enabled for $channel. Statistic: [statistics $channel]"
} else {
putquick "NOTICE $nickname :Anti-Proxy is currently disabled for $channel."
}
}
}
}
proc proxy::checkuser {nickname hostname handle channel} {
checkstats $channel
if {[channel get $channel antiproxy] && [botisop $channel] && ![string match *users.quakenet.org* $hostname] && ![matchattr $handle m|m $channel] && ![isbotnick $nickname]} {
channel set $channel antijoins "[expr [channel get $channel antijoins] + 1]"
regexp {.*\@(.*)} $hostname -> hostname
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $hostname] {
[namespace current]::check $hostname $hostname 1 $nickname $hostname $channel
} else {
dnslookup $hostname [namespace current]::check $nickname $hostname $channel
}
}
}
proc proxy::check {ip hostname status nickname originalhost channel } {
variable source
if {$status} {
regexp {([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})} $ip -> part1 part2 part3 part4
set newip "$part4.$part3.$part2.$part1"
foreach proxylist $source {
dnslookup "$newip.$proxylist" [namespace current]::check2 $nickname $ip $originalhost $hostname $channel $proxylist
}
} else {
putlog "AntiProxy: Couldn't dns resolve $originalhost."
}
}
proc proxy::check2 {ip hostname status nickname oip realhost originalhost channel rbl } {
variable proxy
variable bantime
variable close
if {[info exists proxy($channel,$nickname)]} { return 0 }
set closemode [modes $channel]
if {$status} {
set proxy($channel,$nickname) 1
utimer 10 [list unset [namespace current]::proxy($channel,$nickname)]
channel set $channel antidetected "[expr [channel get $channel antidetected] + 1]"
if {[floodjoin $channel]} {
putquick "MODE $channel +b$closemode $realhost" -next
set ::close($channel) 1
utimer $close [list [namespace current]::open "$channel" "$closemode"]
}
pushmode $channel +b $realhost
if [regexp {[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$} $originalhost] {
putquick "KICK $channel $nickname :\<$oip\> is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
} else {
putquick "KICK $channel $nickname :\<$oip\> \[$originalhost\] is in the DNSBL \[Open Proxy\] \(ID: [expr [channel get $channel antikicked] + 1]\)"
}
channel set $channel antikicked "[expr [channel get $channel antikicked] + 1]"
utimer 3 [list flushmode $channel]
}
}
proc proxy::open {channel modes} {
if {[info exists ::close($channel)]} {
putserv "MODE $channel -$modes"
unset ::close($channel)
} else {
return 0
}
}
proc proxy::modes {channel} {
variable modes
set end ""
set chanmode [lindex [getchanmode $channel] 0]
foreach mode [split $modes ""] {
if {![string match *$mode* $chanmode]} {
append end $mode
}
}
return "[join $end]"
}
proc proxy::unsetflood {channel} {
if {[info exists ::flood($channel)]} {
unset ::flood($channel)
}
}
proc proxy::statistics {channel} {
set joins [channel get $channel antijoins]
set detected [channel get $channel antidetected]
set kicked [channel get $channel antikicked]
if {$joins == "" || $joins == "0"} {
return "Statistic Unavailable"
} elseif {$detected == "" || $detected == "0"} {
return "Statistic Unavailable"
} elseif {$kicked == "" || $kicked == "0"} {
return "Statistic Unavailable"
} else {
return "Scanned: $joins, Detected: $detected, Kicked: $kicked \[[format %.2f [expr ($kicked * 100.0) / $joins]]%\]"
}
}
proc proxy::checkstats {channel} {
# /* This is set to 1 to prevent the bot from crashing. (for some people this appears to be a problem) */
if {[channel get $channel antijoins] == ""} { channel set $channel antijoins "1" }
if {[channel get $channel antidetected] == ""} { channel set $channel antidetected "1" }
if {[channel get $channel antikicked] == ""} { channel set $channel antikicked "1" }
}
proc proxy::floodjoin {channel} {
variable flood
set split [split $flood :]
set user [lindex $split 0]
set seconds [lindex $split 1]
if {![info exists ::flood($channel)]} {
set ::flood($channel) 1
} else {
incr ::flood($channel)
}
if {$::flood($channel) >= $user} {
set ::flood($channel) 0
return 1
} else {
utimer $seconds [list [namespace current]::unsetflood $channel]
}
return 0
}
proc proxy::credits {} {
variable file [lindex [split [info script] "/"] end];
variable version;
variable owner "metroid (#development)";
variable modified [clock format [file mtime [info script]] -format "%Y/%m/%d %H:%M:%S"];
set channels 0; set total 0; set end ""
foreach chan [channels] {;
checkstats $chan
incr total
if {[channel get $chan antiproxy]} { incr channels ; lappend end $chan }
};
putlog "$file v$version by $owner - Last modified: $modified"
putlog "$file active on $channels/$total ([format %.2f [expr ($channels.0 * 100.0) / $total.0]]%) channels: [join $end ", "]"
putlog "$file was successfully loaded!"
}
proxy::credits
# // Copyright: This script was made by metroid (#development). This means, YOU DIDNT MAKE IT! I DID! :p
# // Don't break my copyright because it's lame and i'll sue you ass if you do. Have fun!