This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Ports

Old posts that have not been replied to for several years.
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Ports

Post by r0t3n »

How can i find out what port a user is connected to/from. Not the server port 6667 etc, the port their ip/hostname is. Like 8080 etc. I really need to know this, please help!!

Thanks in advnace!!
r0t3n @ #r0t3n @ Quakenet
User avatar
YooHoo
Owner
Posts: 939
Joined: Thu Feb 13, 2003 10:07 pm
Location: Redwood Coast

Re: Ports

Post by YooHoo »

Tosser^^ wrote:How can i find out what port a user is connected to/from. Not the server port 6667 etc, the port their ip/hostname is. Like 8080 etc.
are you refering to the listen xxxx all conf line? try .status all
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

No, i mean the port a users hostname is. Like 8080 like you know with proxies. Its ip/hostname:port i need to find out the port part. Please help!!

Thanks in advance!!
r0t3n @ #r0t3n @ Quakenet
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

You cant just do a command and find out a users port. You have to physically Scan the IP they are using for an open port say 8080 1080 3127 all the usual proxy ports. However just because a user has those ports open doesn't mean they are using a proxy. You have to check by connecting to that ip on the open port and see if it is actually allowing connections and could be used as a proxy. There are tcl scripts in the archive if i remember correctly for port scanning users on join. but none that i know of for checking. Your best bet would be to install this as a service. http://wiki.blitzed.org/BOPM
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

Ok, how exactly do i scan the users ip/hostname. And, i guess can a dns lookup determine if its a open proxy. Also, how can the bot connect using the ip:port from the user to test it. Would a hubbot need to ve used to connect using the ips ?
r0t3n @ #r0t3n @ Quakenet
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

This is the script I modified to do what you are asking. You may need to tweak it to work correctly for you also the bot needs to be opered up.

Code: Select all

##########################
### ProxyScan.tcl      ###
### Version 1.0        ###
### By ^DooM^          ###
### Based on PortCheck ###
### by Wcc             ###
##########################

##################################################################################################
## This script checks the status of a port on a host. Returns either Accepted, Refused, Failed, ##
## or Timeout as a user connects. Bot has to be an oper and recieve connection notices.         ##
##################################################################################################


##########################################################
## PUB ## !scan <host/ip> <port> (Can be changed)       ##
######### Checks weather or not the specified port is   ##
######### open on the specified host or ip.             ##
##########################################################

##########################################################
## Just load the script, set the variables, and rehash. ##
##########################################################

########################################################
# Set flag required for checking the status of a port. #
########################################################

set portcheck_setting(flag) "o|o"

###############################################################
# Set the pub command for checking the status of a port here. #
###############################################################

set portcheck_setting(cmd_pub) "!scan"

#########################################################################
# Set the open ports to scan for when a user joins a monitored channel. #
#########################################################################

set portcheck_setting(ports) "1080 8080 8088 3128"

#######################
# Enable use of bold? #
#######################

set portcheck_setting(bold) 1

##############################
# Channel to output data too #
##############################

set gCommandChan "#server"

#################################################
# Add how the opered bot will catch connections #
#################################################

set gCatchNotice "Client connecting"
####################
# Code begins here #
####################

set portcheck_setting(autoban_svr) 1
set portcheck_setting(read) 1
set portcheck_setting(Proxycheck:) 1

if {![string match 1.6.* $version]} {
    putlog "\002PORTCHECK:\002 \002CRITICAL ERROR\002 PortCheck.tcl requires eggdrop 1.6.x to run."
    die "\002PORTCHECK:\002 \002CRITICAL ERROR\002 PortCheck.tcl requires eggdrop 1.6.x to run."
}
bind pub $portcheck_setting(flag) $portcheck_setting(cmd_pub) portcheck_scan_pub
bind raw - NOTICE portcheck_onconnect_scan
setudef flag portcheck

proc portcheck_dopre {} {
    global portcheck_setting
    if {!$portcheck_setting(Proxycheck:)} {
        return ""
    } elseif {!$portcheck_setting(bold)} {
        return "ProxyScan: "
    } else {
        return "^C9\002ProxyScan:\002^O "
    }
}

proc portcheck_onconnect_scan {from keyword arg} {
    global gCommandChan gCatchNotice portcheck_setting botnick
    if {([string match "*$gCatchNotice*" $arg])} {
        set args $arg
        set nick [lindex $args 9]
        set uhost [lindex $args 10]
        set host [lindex [split $uhost @] 1]
        set host "[string trimright $host ")"]"
        if {$host == "data.searchirc.org" || $host == "python.netsplit.de"} { return }
        putquick "PRIVMSG $gCommandChan :^C9\002ProxyCheck:\002^O $nick connected: Scanning $host"
            foreach p $portcheck_setting(ports) {
            if {![catch {set sock [socket -async $host $p]} error]} {
                set timerid [utimer 15 [list portcheck_timeout_join $sock]]
                fileevent $sock writable [list portcheck_connected_join $nick $gCommandChan $sock $host $p $timerid]
            }
        }
    }
}

proc portcheck_scan_pub {nick uhost hand chan text} {
    global portcheck_setting
    set host [lindex $text 0]
    set port [lindex $text 1]
    if {$port == ""} {
        putquick "NOTICE $nick :Usage: $portcheck_setting(cmd_pub) <host> <port>"
    } else {
        if {[catch {set sock [socket -async $host $port]} error]} {
            putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O Connection to $host \($port\) was refused."
        } else {
            set timerid [utimer 15 [list portcheck_timeout_pub $chan $sock $host $port]]
            fileevent $sock writable [list portcheck_connected_pub $chan $sock $host $port $timerid]
        }
    }
}
proc portcheck_connected {idx sock host port timerid} {
    killutimer $timerid
    if {[set error [fconfigure $sock -error]] != ""} {
        close $sock
        putdcc $idx "[portcheck_dopre]Connection to $host \($port\) failed. \([string totitle $error]\)"
    } else {
        fileevent $sock writable {}
        fileevent $sock readable [list portcheck_read $idx $sock $host $port]
        putdcc $idx "[portcheck_dopre]Connection to $host \($port\) accepted."
    }
}
proc portcheck_timeout {idx sock host port} {
    close $sock
    putdcc $idx "[portcheck_dopre]Connection to $host \($port\) timed out."
}
proc portcheck_read {idx sock host port} {
    global portcheck_setting
    if {$portcheck_setting(read)} {
        if {[gets $sock read] == -1} {
            putdcc $idx "[portcheck_dopre]EOF On Connection To $host \($port\). Socket Closed."
            close $sock
        } else {
            putdcc $idx "[portcheck_dopre]$host \($port\) > $read"
        }
    } else {
        close $sock
    }
}

proc portcheck_connected_pub {chan sock host port timerid} {
    killutimer $timerid
    if {[set error [fconfigure $sock -error]] != ""} {
        close $sock
        putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O Connection to $host \($port\) failed. \([string totitle $error]\)"
    } else {
        fileevent $sock writable {}
        fileevent $sock readable [list portcheck_read_pub $chan $sock $host $port]
        putquick "PRIVMSG $chan :^C4\002ProxyCheck:\002^O Connection to $host \($port\) accepted."
    }
}

proc portcheck_timeout_pub {chan sock host port} {
    close $sock
    putquick "PRIVMSG $chan :^C7\002ProxyCheck:\002^O Connection to $host \($port\) timed out."
}

proc portcheck_connected_join {nick chan sock host port timerid} {
    global portcheck_setting botnick
    killutimer $timerid
    if {[set error [fconfigure $sock -error]] != ""} {
        close $sock
    } else {
        fileevent $sock writable {}
        fileevent $sock readable [list portcheck_read_join $sock]
        if {$portcheck_setting(onotice)} {
            foreach i [chanlist $chan] {
                if {([isop $i $chan]) && ($i != $botnick)} {
                    putserv "NOTICE $i :Port $port was found open on $nick's host. \($host\)"
                }
            }
        }
        if {$portcheck_setting(autoban_svr)} {
            putserv "KLINE $nick :Found Open Proxy. Please secure your machine."
            putserv "PRIVMSG $gCommandChan :^C4\002ProxyCheck:\002^O Found Open Port ^C4$port^O on $nick's machine. Adding Kline!"
        }
    }
}

proc portcheck_timeout_join {sock} {
    close $sock
}

proc portcheck_read_join {sock} {
    close $sock
}

proc portcheck_read_pub {sock} {
    global portcheck_setting
    if {!$portcheck_setting(read)} {
        close $sock
    } elseif {[gets $sock read] == -1} {
        putquick "PRIVMSG $chan :^C9\002ProxyCheck:\002^O EOF On Connection To $host \($port\). Socket Closed."
        close $sock
    }
}

putlog "\002ProxyScan:\002 V1.0 by WCC Modified by ^DooM^."
This script opens up a lot of connections so be wary if you are running this on a paid for shell. you could get your account terminated. Also REMEMBER that this will kline users that just happen to have those 4 ports open even if they are not proxies. Casualties of war eh? ;)
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

hmm. Well that wont be good then. Its going to be hosted of a paid shell. And if it takes alot of CPU i cant use it. I have already had my account taken from me because of high CPU usage. Also, its for Quakenet, so my bot wont become a oper. So, anything for channel checking. Like sicherheit antiproxy/pjen bots.
r0t3n @ #r0t3n @ Quakenet
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

i found metriod's antiproxy script.

Code: Select all

namespace eval proxy {
 variable version "0.75"
 variable author  "Tosser^^ \(#eggtcl\)"

 variable trigger "/$"


 # The sources we dns to find out if a user is a proxy
 variable source { "cbl.abuseat.org" "opm.blitzed.org" "dnsbl.ahbl.org" "list.dsbl.org" "sbl.csma.biz" "dnsbl.njabl.org" }


 setudef flag antiproxy

 setudef str  antijoins
 setudef str  antidetected
 setudef str  antikicked

 # /* Settings! */
 variable flood "4: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  -|- ${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
I get this error

[21:44] antiproxy.tcl v0.75 by metroid (#development) - L
7 21:44:10
[21:44] Tcl error in file 'eggdrop.conf':
[21:44] divide by zero
while executing
"expr ($channels.0 * 100.0) / $total.0"
(procedure "proxy::credits" line 13)
invoked from within
"proxy::credits"
(file "scripts/antiproxy.tcl" line 265)
invoked from within
"source scripts/antiproxy.tcl"
(file "eggdrop.conf" line 1334)
[21:44] * CONFIG FILE NOT LOADED (NOT FOUND, OR ERROR)

Please help!!

Thanks in advance!!
r0t3n @ #r0t3n @ Quakenet
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

Its not CPU intensive it just opens up a lot of sockets if its run on a big channel and you have a lot of users joining. Do a google Search for wcc portcheck.tcl it originally only checked users joining a channel and banned them if it found an open port. I wanted a proxy checker to scan users when they joined my server and remove them before they had a chance to join a channel. If you are worried about the socket use, Email your shell admin and ask him if you can a) use the script, and b) would he mind monitoring it to make sure its not breaking any rules or is hurting the shell in any way. If they are a decent shell provider they should at least accomodate a request if your open with them. I run that script on my own RH9 box so I can deffinately confirm that CPU usage is low.
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
r
r0t3n
Owner
Posts: 507
Joined: Tue May 31, 2005 6:56 pm
Location: UK

Post by r0t3n »

ok, Thanks. I found the script. Just to ask, this is a nuub question. I keep on forgetting the difference between antiproxy and antipjen bot, or is there a differentce. Maybe you could tell me. If there is. Where can i find a good antipjen script aswell if possible.

Thanks in advance!!
r0t3n @ #r0t3n @ Quakenet
m
metroid
Owner
Posts: 771
Joined: Wed Jun 16, 2004 2:46 am

Post by metroid »

Uhm, Hi. Do you realise you broke my copyright and pretended you wrote it by putting your name in the 'author' section.
namespace eval proxy {
variable version "0.75"
variable author "Tosser^^ \(#eggtcl\)"

variable trigger "/$"
m
metroid
Owner
Posts: 771
Joined: Wed Jun 16, 2004 2:46 am

Post by metroid »

Oh look at this: The real code.
And unless i'm mistaken i say, don't break my copyright multiple times.
Go check your pm on IRC whilst your permbanned from the development channel.

Your name serves you right, you are a tosser.

Code: Select all

#   __ __        __                          ___                                              __      
#  _\ \\ \__    /\ \                        /\_ \                                            /\ \__   
# /\__  _  _\   \_\ \     __   __  __     __\//\ \     ___   _____     ___ ___      __    ___\ \ ,_\  
# \/__\ \\ \__  /'_` \  /'__`\/\ \/\ \  /'__`\\ \ \   / __`\/\ '__`\ /' __` __`\  /'__`\/' _ `\ \ \/  
#   /\_   _  _\/\ \_\ \/\  __/\ \ \_/ |/\  __/ \_\ \_/\ \_\ \ \ \_\ \/\ \/\ \/\ \/\  __//\ \/\ \ \ \_ 
#   \/_/\_\\_\/\ \___,_\ \____\\ \___/ \ \____\/\____\ \____/\ \ ,__/\ \_\ \_\ \_\ \____\ \_\ \_\ \__\
#      \/_//_/  \/__,_ /\/____/ \/__/   \/____/\/____/\/___/  \ \ \/  \/_/\/_/\/_/\/____/\/_/\/_/\/__/
#                                                              \ \_\ 
#                                                               \/_/ 
# 
#                        /\ \                /\ \__  __                   
#  _____   _ __   ___    \_\ \  __  __    ___\ \ ,_\/\_\    ___     ___     ____  
# /\ '__`\/\`'__\/ __`\  /'_` \/\ \/\ \  /'___\ \ \/\/\ \  / __`\ /' _ `\  /',__\ 
# \ \ \_\ \ \ \//\ \_\ \/\ \_\ \ \ \_\ \/\ \__/\ \ \_\ \ \/\ \_\ \/\ \/\ \/\__, `\
#  \ \ ,__/\ \_\\ \____/\ \___,_\ \____/\ \____\\ \__\\ \_\ \____/\ \_\ \_\/\____/
#   \ \ \/  \/_/ \/___/  \/__,_ /\/___/  \/____/ \/__/ \/_/\/___/  \/_/\/_/\/___/ 
#    \ \_\                                                                 
#     \/_/                                                                 
#        
# 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 { "cbl.abuseat.org" "opm.blitzed.org" "dnsbl.ahbl.org" "list.dsbl.org" "sbl.csma.biz" "dnsbl.njabl.org" }


 setudef flag antiproxy

 setudef str  antijoins
 setudef str  antidetected
 setudef str  antikicked

 # /* Settings! */
 variable flood "4: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!
User avatar
demond
Revered One
Posts: 3073
Joined: Sat Jun 12, 2004 9:58 am
Location: San Francisco, CA
Contact:

Post by demond »

nice ascii art ;)
User avatar
^DooM^
Owner
Posts: 772
Joined: Tue Aug 26, 2003 5:40 pm
Location: IronForge
Contact:

Post by ^DooM^ »

Indeed very funky ;) I had a proggy once that did that for you but i am damned if i can remember what it was called :roll:
The lifecycle of a noob is complex. Fledgling noobs gestate inside biometric pods. Once a budding noob has matured thru gestation they climb out of their pod, sit down at a PC, ask a bunch of questions that are clearly in the FAQ, The Noob is born
D
Dizzle
Op
Posts: 109
Joined: Thu Apr 28, 2005 11:21 am
Contact:

Post by Dizzle »

well think this is lame of you tosser, it doenst matter who made the script, it is what the script does, putting your name on somebody else his script and even show it in the forum metroid is coming going a lot is lame and not very handy :)

Question for metroid : do you have a antiproxy script for just a server client and not an IRC operator ??
Locked