; ProxyScan v2.3 alpha2 by Teppuli & adw (#adw & #teppuli @QuakeNet)
on 1:quit:{
; Netsplit checker to disable ProxyScan during netsplits.
if ($1- == *.net *.split) && (!%proxynetsplit) {
set -u300 %proxynetsplit on
}
}
on 1:join:#:{
if ($readini(dnsblscan.ini,$chan,status) == on) {
if (%proxynetsplit == on) { echo -ag ProxyScan: *.net *.split protection active, not going to scan. | halt }
if ($me !isop $chan) { halt }
if (*.users.quakenet.org iswm $site) { halt }
if ($network != QuakeNet) { echo -ag ProxyScan: Warning! I'm not connected to QuakeNet. This script is designed to work only with QuakeNet. | halt }
if (!%dnsbls) { echo -ag ProxyScan: No DNSBL list specified, set it with ".proxy help" | halt }
set -u20 %dnsresolving_ [ $+ [ $nick ] ] $chan
dns $nick
}
}
ctcp *:VERSION:*:{
/.ctcpreply $nick VERSION + ProxyScan v2.3 by #adw (Teppuli,adw)
halt
}
on *:text:!proxy *:#:{
if ($wi($address($nick,2)) == owner) || ($wi($address($nick,2)) == master) {
if ($2 == status) {
; Status
if (!$readini(dnsblscan.ini,$chan,status)) { .notice $nick %chanlevskin ProxyScan status is currently: OFF %chanlevskin | halt }
.notice $nick %chanlevskin ProxyScan status is currently: $upper($readini(dnsblscan.ini,$chan,status)) %chanlevskin
halt
}
if ($2 == enable) { writeini dnsblscan.ini $chan status on | .notice $nick %chanlevskin Done. %chanlevskin ProxyScan is enabled for this channel. %chanlevskin | halt }
if ($2 == disable) { writeini dnsblscan.ini $chan status off | .notice $nick %chanlevskin Done. %chanlevskin ProxyScan is disabled for this channel. %chanlevskin | halt }
if ($2 == sources) {
; Get DNSBLs
if (!%dnsbls) { .notice $nick %chanlevskin No sources list specified, set it with " $+ $1 setsources <sources separated with space> " %chanlevskin | halt }
.notice $nick %chanlevskin Sources: %dnsbls %chanlevskin
halt
}
if ($2 == setsources) {
; Set DNSBLs
if (!$3) { .notice $nick %chanlevskin Usage $1-2 <sources separated with space> %chanlevskin | halt }
set %dnsbls $3-
.notice $nick %chanlevskin Done. %chanlevskin New sources set. %chanlevskin
halt
}
if ($2 == kickskin) {
; Set kickskin
if (!$3) { .notice $nick %chanlevskin Usage $1-2 <skin> %chanlevskin | .notice $nick %chanlevskin Variables: :id: :dnsbl: :ip: %chanlevskin | halt }
set %dnsbl_kskin $3-
.notice $nick %chanlevskin Done. %chanlevskin New kickskin set. %chanlevskin
halt
}
if ($2 == clearcache) {
; Clear host cache
remini dnsblscan.ini cache
.notice $nick %chanlevskin Done. %chanlevskin Cache cleared succesfully. %chanlevskin
halt
}
if ($2 == getkickskin) {
; Get kickskin
if (!%dnsbl_kskin) { .notice $nick %chanlevskin No kickskin set, using default. %chanlevskin | halt }
.notice $nick %chanlevskin Current kickskin: %dnsbl_kskin
halt
}
if ($2 == listexceptions) {
; List exceptions
.notice $nick %chanlevskin Proxy exception list: %chanlevskin
var %i = 1
while (%i <= $ini(dnsblexceptions.ini,$chan)) {
var %host = $ini(dnsblexceptions.ini,$chan,%i)
if (%host == $null) { .notice $nick %chanlevskin End of Proxy exception list. %chanlevskin | halt }
.notice $nick %chanlevskin Host: %host %chanlevskin
inc %i
}
.notice $nick %chanlevskin End of Proxy exception list. %chanlevskin
halt
}
if ($2 == addexception) {
; Add exception
if (!$3) { .notice $nick %chanlevskin Usage: $1-2 <host> %chanlevskin | halt }
if (*!*@* !iswm $3) { .notice $nick %chanlevskin Please specify valid host. %chanlevskin | halt }
writeini dnsblexceptions.ini $chan $3 valid
.notice $nick %chanlevskin Done. %chanlevskin Added $+(",$3,") to proxy exception list. %chanlevskin
halt
}
if ($2 == delexception) {
; Remove exception
if (!$3) { .notice $nick %chanlevskin Usage: $1-2 <host> %chanlevskin | halt }
if (*!*@* !iswm $3) { .notice $nick %chanlevskin Please specify valid host. %chanlevskin | halt }
remini dnsblexceptions.ini $chan $3
.notice $nick %chanlevskin Done. %chanlevskin Removed $+(",$3,") from proxy exception list. %chanlevskin
halt
}
if ($2 == info) {
; Info about status
.notice $nick %chanlevskin Status: %chanlevskin
.notice $nick %chanlevskin Total cached IPs: $ini(dnsblscan.ini,cache,0) %chanlevskin
.notice $nick %chanlevskin Number of hosts in exception list: $ini(dnsblexceptions.ini,$chan,0) %chanlevskin
.notice $nick %chanlevskin Proxy kick-ID: $iif(!%proxyid,0,%proxyid) %chanlevskin
.notice $nick %chanlevskin Status on this channel: $upper($readini(dnsblscan.ini,$chan,status)) %chanlevskin
.notice $nick %chanlevskin Proxy join flood protection status: $+ $iif($readini(dnsblscan.ini,_proxy_joinprot,$chan),$replace($upper($readini(dnsblscan.ini,_proxy_joinprot,$chan)),yes,ON,no,OFF),OFF) $+ %chanlevskin
halt
}
if ($2 == flooddisable) {
writeini dnsblscan.ini _proxy_joinprot $chan no | writeini dnsblscan.ini _proxy_joinprottok $chan null | .notice $nick %chanlevskin Done. %chanlevskin Proxy join flood protect is disabled for this channel. %chanlevskin | halt }
if ($2 == floodenable) {
if (!$3) { .notice $nick %chanlevskin Usage $1-2 <joins:seconds> %chanlevskin (example: $1-2 3:5 = 3 proxies in 5 seconds trigger protection.) %chanlevskin | halt }
if (*:* !iswm $3) { .notice $nick %chanlevskin Usage $1-2 <joins:seconds> %chanlevskin (example: $1-2 3:5 = 3 proxies in 5 seconds trigger protection.) %chanlevskin | halt }
writeini dnsblscan.ini _proxy_joinprot $chan yes | writeini dnsblscan.ini _proxy_joinprottok $chan $3 | .notice $nick %chanlevskin Done. %chanlevskin Proxy join flood protect is enabled for this channel. %chanlevskin | halt }
if ($2 == floodstatus) {
.notice $nick %chanlevskin Proxy join flood protection status: $+ $iif($readini(dnsblscan.ini,_proxy_joinprot,$chan),$replace($upper($readini(dnsblscan.ini,_proxy_joinprot,$chan)),yes,ON,no,OFF),OFF) $+ %chanlevskin
halt
}
if ($2 == kickid) {
; Kick ID
.notice $nick %chanlevskin Proxy kick-ID: $iif(!%proxyid,0,%proxyid) %chanlevskin
halt
}
if ($2 == init) {
; Init script
if ($readini(dnsblscan.ini,::proxy_CINIT,$chan) == g) { .notice $nick %chanlevskin ProxyScan is already initialized. %chanlevskin | halt }
set %dnsbls cbl.abuseat.org opm.blitzed.org dnsbl.ahbl.org list.dsbl.org sbl.csma.biz dnsbl.njabl.org
writeini dnsblexceptions.ini $chan LM D
writeini dnsblscan.ini cache LM D
remini dnsblscan.ini cache LM
writeini dnsblscan.ini $chan status off
remini dnsblexceptions.ini $chan LM
writeini dnsblscan.ini ::proxy_CINIT $chan g
.notice $nick %chanlevskin ProxyScan initialized. %chanlevskin
halt
}
if ($2 == scan) {
; Scan user using this feature
if (!$3) { .notice $nick %chanlevskin Usage: $1-2 <nickname> %chanlevskin | halt }
if ($me !isop $chan) { .notice $nick %chanlevskin Im not op here! %chanlevskin | halt }
if ($3 !ison $chan) { .notice $nick %chanlevskin Error! %chanlevskin User $3 isnt on this chan! %chanlevskin | halt }
if (*!*@*.users.quakenet.org iswm $address($3,5)) { .notice $nick %chanlevskin Error! %chanlevskin User $3 has mode +x enabled. %chanlevskin | halt }
if (!%dnsbls) { .notice $nick %chanlevskin No DNSBL list specified, set it with " $+ $1 help" %chanlevskin | halt }
set -u20 %dnsresolving_ [ $+ [ $3 ] ] $chan
dns $3
.notice $nick %chanlevskin Scanning in process... %chanlevskin
halt
}
if ($2 == help) { .notice $nick Usage: $1 help/kickid/floodstatus/floodenable/flooddisable/init/info/scan/setsources/sources/clearcache/enable/disable/status/kickskin/getkickskin/addexception/listexceptions/delexception | halt }
.notice $nick Usage: $1 help/kickid/floodstatus/floodenable/flooddisable/init/info/scan/setsources/sources/clearcache/enable/disable/status/kickskin/getkickskin/addexception/listexceptions/delexception | halt
}
}
on 1:DNS:{
if ($dns(0) == 0) { halt }
if (%dnsresolving_ [ $+ [ $dns(1).nick ] ]) {
dnsblcheck $dns(1).ip $dns(1).nick %dnsresolving_ [ $+ [ $dns(1).nick ] ]
}
if (!$readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel)) { halt }
var %host = $address($readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),nick),2)
inc %proxyid
var %chn = $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel)
if ($readini(dnsblscan.ini,_proxy_joinprot,%chn) == yes) {
if (!%proxyjoinflood) { set -u [ $+ [ $gettok($readini(dnsblscan.ini,_proxy_joinprottok,%chn),2,58) ] ] %proxyjoinflood 1 }
if (%proxyjoinflood) { inc %proxyjoinflood | timer 1 $gettok($readini(dnsblscan.ini,_proxy_joinprottok,%chn),2,58) unset %proxyjoinflood }
if (%proxyjoinflood > $gettok($readini(dnsblscan.ini,_proxy_joinprottok,%chn),1,58)) || (%proxyjoinflood == $gettok($readini(dnsblscan.ini,_proxy_joinprottok,%chn),1,58)) {
mode %chn -c
msg %chn %chanlevskin Proxy join flood detected! %chanlevskin Closing channel for 1 minute. %chanlevskin
mode %chn +rcmi
unset %proxyjoinflood
timer 1 60 mode %chn -rcmi
msg %chn %chanlevskin Opening channel. %chanlevskin
}
}
var %kskin = Banned: Open proxy resolved from DNSBL :dnsbl:. ID: :id:
if (%dnsbl_kskin) { var %kskin = %dnsbl_kskin }
kick $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel) $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),nick) $replace(%kskin,:ip:,$reversebytes($gettok($dns(1),1-4,46)),:id:,%proxyid,:dnsbl:,$deltok($dns(1),1-4,46))
mode $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel) +b %host
echo -ag ProxyScan: dnsblcheck: Open proxy detected. DNSBL: $deltok($dns(1),1-4,46) CHAN: $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel) NICK: $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),nick) IP (reversed): $gettok($dns(1),1-4,46)
writeini dnsblscan.ini cache $gettok($dns(1),1-4,46) $deltok($dns(1),1-4,46)
timer 1 300 mode $readini(dnsblcheck.ini,$gettok($dns(1),1-4,46),channel) -b %host
}
on *:text:!proxy:#:{
if ($wi($address($nick,2)) == owner) || ($wi($address($nick,2)) == master) {
.notice $nick %chanlevskin Usage: $1 help/kickid/floodstatus/floodenable/flooddisable/init/info/scan/setsources/sources/clearcache/enable/disable/status/kickskin/getkickskin/addexception/listexceptions/delexception %chanlevskin | halt }
}
on 1:load:{ echo -ag ProxyScan v2.3 loaded first time. REMEMBER TO TYPE .proxy init TO INITIALIZE THIS SCRIPT! }
alias reversebytes {
tokenize 46 $1
return $+($4,.,$3,.,$2,.,$1)
}
alias dnsblcheck {
if (!%dnsbls) { echo -ag ProxyScan: dnsblcheck: No DNSBL list specified, halting | halt }
var %i = 1
while (%i <= $ini(dnsblexceptions.ini,$3)) {
var %host = $ini(dnsblexceptions.ini,$3,%i)
if (%host iswm $address($2,2)) { echo -ag ProxyScan: dnsblcheck: Nickname is in exception list, halting. | notice $2 Because you're in our proxy exception list, you don't get scanned for open proxies. | halt }
inc %i
}
var %address = $reversebytes($1)
var %i = 1
while (%i <= $ini(dnsblscan.ini,cache)) {
var %dnsblused = $readini(dnsblscan.ini,cache,$ini(dnsblscan.ini,cache,%i))
var %ipaddr = $ini(dnsblscan.ini,cache,%i)
if (%ipaddr == %address) {
echo -ag dnsblcheck: Cached address %address detected on $3 $+ , banning nick $2
var %host = $address(2,2)
inc %proxyid
if ($readini(dnsblscan.ini,_proxy_joinprot,$3) == yes) {
if (!%proxyjoinflood) { set -u [ $+ [ $gettok($readini(dnsblscan.ini,_proxy_joinprottok,$3),2,58) ] ] %proxyjoinflood 1 }
if (%proxyjoinflood) { inc %proxyjoinflood | timer 1 $gettok($readini(dnsblscan.ini,_proxy_joinprottok,$3),2,58) unset %proxyjoinflood }
if (%proxyjoinflood > $gettok($readini(dnsblscan.ini,_proxy_joinprottok,$3),1,58)) || (%proxyjoinflood == $gettok($readini(dnsblscan.ini,_proxy_joinprottok,$3),1,58)) {
mode $3 -c
msg $3 %chanlevskin Proxy join flood detected! %chanlevskin Closing channel for 1 minute. %chanlevskin
mode $3 +rcmi
unset %proxyjoinflood
timer 1 60 mode $3 -rcmi
msg $3 %chanlevskin Opening channel. %chanlevskin
}
}
var %kskin = Banned: Cached open proxy resolved from DNSBL :dnsbl:. ID: :id:
if (%dnsbl_kskin) { var %kskin = %dnsbl_kskin }
kick $3 $2 $replace(%kskin,:id:,%proxyid,:dnsbl:,%dnsblused)
echo -ag ProxyScan: dnsblcheck: Open proxy detected (used cache). DNSBL: %dnsblused CHAN: $3 NICK: $2 IP (normal-reversed): $1 $+ %address
; READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ
; ----------------------------------------------------------------------------------------------------------------------------
; Following message is sent to user, if he/she is in cache.
notice $2 You're in our proxy cache database. Maybe you are'nt proxy? Then send message to channel admin, please

; ----------------------------------------------------------------------------------------------------------------------------
; READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ
mode $3 +b %host
timer 1 300 mode $3 -b %host
}
inc %i
}
var %i = 1
while (%i <= $numtok(%dnsbls,32)) {
writeini dnsblcheck.ini %address channel $3
writeini dnsblcheck.ini %address nick $2
timer 1 60 remini dnsblcheck.ini %address
dns $+(%address,.,$gettok(%dnsbls,%i,32))
inc %i
}
}