現時点でスクリプトは正常に動作しています。新しい目標はシンプルです。クロークされたホストを復号化します。Charybdis ircd には、ホストをマスクするオプションがあります。クロークされたホストの例:
[11:34:20] * BGChat13369 (~webirc@146.185.up.zu) が参加しました
この作業を行うには、tcl を書き直す必要があります。このクロークされたホストを通常のホストとして復号化することを意味します。上記の次の手順でそれができると思いますが、これをホールスクリプトに含める方法がわかりません。
あなたが私を助けてくれたら、私は感謝します。
クロークされたホストを復号化するための単純なコード。
bind pub - "!getip" getip
proc getip {nick uhost handle chan text} {
bind raw - 378 ip_from_whois
putserv "whois [lindex [split $text] 0 ]"
utimer 10 [list unbind raw - 378 ip_from_whois ]
}
proc ip_from_whois {from keyword text} {
###putserv "privmsg #test12 :text contains: $text"
putserv "privmsg #test12 :[lindex [split $text] end]"
}
これは生のIRCメッセージからの出力です
<- :bgchat.abvnet.org 311 Kiril BGChat63052 ~webirc 84.2.xh.ry * :http://chatbg.info
<- :bgchat.abvnet.org 319 Kiril BGChat63052 :#SEX #xxl #Liberta #Bulgaria #40-50 #Pristis #goplay #Rousse #20-40 #Chat #30-40 #bourgas #VIP #BGChat
<- :bgchat.abvnet.org 312 Kiril BGChat63052 bgchat.abvnet.org :BGChat IRC Server
<- :bgchat.abvnet.org 378 Kiril BGChat63052 :is connecting from *@84.2.74.59 84.2.74.59
<- :bgchat.abvnet.org 317 Kiril BGChat63052 28 1482399651 :seconds idle, signon time
<- :bgchat.abvnet.org 318 Kiril BGChat63052 :End of /WHOIS list.
これは、通常のホスト tcl で既に動作しています。
# AntiFlood.tcl v1.0
######################################################################
# What type eggdrop will be?
#
# 0 - Guard ( do not need to check )
# 1 - checker ( it's a checker just sending a bad info )
# 2 - both ( Guard + Checker) ( Guard banning and sending bad data info to the other guards. )
set espam(how) "0"
# Botnet nicks ( Guards)
set espam(guards) "Oberon"
# From which botnet nicks will recieve information
set espam(leafs) "CIA"
set espam(ExemptFlags) "f"
# 1 - $nick!*@*
# 2 - *!*ident@www.linux.com
# 3 - *!*ident@*
# 4 - *!*@www.linux.com
set espam(BanType) "4"
set espam(Reason) "Detected spam (type - \$type) from you on \[e:now\] from \$u"
set espam(BanLast) 120
set espam(Global) {
{*join in*}
}
set espam(Public) {
{*/server*}
{*/s irc.*}
{*irc.*}
}
set espam(Message) {
{*/server*}
{*/s irc.*}
{*irc.*}
}
set espam(Notice) {
{*/server*}
{*/s irc.*}
{*irc.*}
}
set espam(Quit) {
{*/s*}
{*/server*}
{*irc.*}
}
set espam(CTCP) {
{*/server*}
{*/s irc.*}
{*irc.*}
}
set espam(CTCR) {
{*/server*}
{*/s irc.*}
{*irc.*}
}
set espam(ExemptList) {
{*!*@Services}
}
# Binds
bind pubm - * e:publicspam
bind msgm - * e:msgspam
bind notc - * e:notspam
bind sign - * e:quitspam
bind ctcp - * e:ctcpspam
bind ctcr - * e:ctcrspam
bind ctcp - DCC e:dccspam
proc e:publicspam {n u h c t} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam Public $t]} {return}
e:punish $n $u $h Public
return
}
proc e:msgspam {n u h t} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam Message $t]} {return}
e:punish $n $u $h Message
return
}
proc e:notspam {n u h t d} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam Notice $t]} {return}
e:punish $n $u $h Notice
return
}
proc e:quitspam {n u c h t} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam Quit $t]} {return}
e:punish $n $u $h Quit
return
}
proc e:ctcrspam {n u h d k t} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam CTCR $t]} {return}
e:punish $n $u $h CTCR
return
}
proc e:ctcpspam {n u h d k t} {
if {[e:isexempt $n $h $u]} {return}
if {[e:isspam CTCP $t]} {return}
e:punish $n $u $h CTCP
return
}
proc e:dccspam {n u h d k t} {
if {[e:isexempt $n $h $u]} {return}
set file [string tolower [lindex [split $t] 1]]
if {[string match "*.exe" $file] || [string match "*.bat" $file] || [string match "*.zip" $file] ||
[string match "*.rar" $file] || [string match "*.zip" $file] || [string match "*.vbs" $file] ||
[string match "*.ini" $file] || [string length $t] > 130} {
e:punish $n $u $h DCC
}
}
proc e:isspam {type arg} {
global espam
if {$arg == ""} {return 1}
set arg [strip:all $arg]
if {[info exists espam(Global)] == 1} {
foreach estr $espam(Global) {
if {[string match -nocase $estr $arg] == 1} {
return 0
}
}
}
if {[info exists espam($type)] == 1} {
foreach estr $espam($type) {
if {[string match -nocase $estr $arg] == 1} {
return 0
}
}
}
return 1
}
proc e:punish {n u h type {c "1"}} {
if {[isbotnick $n]} {return 0}
if {[string match -nocase $c $::espam(leafs)]} {e:remspm $n $u $h $type}
switch $::espam(how) {
0 {e:remspm $n $u $h $type}
1 {e:tellgrds $n $u $h $type}
2 {e:tellgrds $n $u $h $type;e:remspm $n $u $h $type}
}
}
proc strip:color {string} {
regsub -all \003\[0-9\]{1,2}(,\[0-9\]{1,2})? $string {} string
return $string
}
proc strip:bold {string} {
regsub -all \002 $string {} string
return $string
}
proc strip:underline {string} {
regsub -all \037 $string {} string
return $string
}
proc strip:all {string} {
return [strip:color [strip:bold [strip:underline $string]]]
}
proc e:isexempt {nick hand host} {
if {[isbotnick $nick]} {return 1}
if {$hand == "*" || $hand == ""} {return 0}
if {$::espam(ExemptFlags) == ""} {return 0}
if {[matchattr $hand $::espam(ExemptFlags)] == 1} {return 1}
foreach exhost $::espam(ExemptList) {
if {[string match "*$exhost*" $host]} {return 1}
}
return 0
}
proc e:makeban {nick uhost} {
switch $::espam(BanType) {
1 {return "$nick!*@*"}
2 {return "*!*$uhost"}
3 {return "*!*[lindex [split $uhost "@"] 0]*@*"}
4 {
if {[string match "*html.chat" $uhost]} { set ban "*!*[lindex [split [maskhost $uhost] "!"] 1]" } { set ban "*@[lindex [split $uhost "@"] 1]"}
}
}
}
proc e:bannick {ban chan} {
if {$chan == "" || $ban == "*!*@*" || $ban == ""} {return}
if {[validchan $chan] == 1 && [botonchan $chan] == 1 && [botisop $chan] == 1} {
pushmode $chan +b $ban
return
}
return
}
proc e:now {} {
return [strftime "%d %b %Y %I:%M %P"]
}
proc e:remspm {n u h type} {
if {[e:isexempt $n $h $u]} {return}
set ban [e:makeban $n $u]
if {![string match $ban $::botname]} {
newban $ban $::botnick [subst $::espam(Reason)] $::espam(BanLast)
putquick "kline 1440 $ban [subst $::espam(Reason)]"
}
foreach chan [channels] {
if {[onchan $n $chan]} {
putkick $chan $n [subst $::espam(Reason)]
e:bannick $ban $chan
}
}
}
proc e:tellgrds {n u h type} {
foreach b $::espam(guards) {
putlog $b
putbot $b "ebgspamdetected $n $u $h $type"
}
}
bind bot - ebgspamdetected e:sdet
proc e:sdet {a b c} {
if {![string match $a $::espam(leafs)]} {return}
e:remspm [lindex $c 0] [lindex $c 1] [lindex $c 0] [lindex $c 3]
}
putlog "TCL | Anti Spam"
手順は次のとおりです。
- 誰かがチェッカーに悪い情報を書きました。
- チェッカーは、この悪い情報をガード ボットに送信します
- ガードボットがクローキングされたホストを解読
- すでに復号化されたクロークされたホストを保護します。