今更だが、ドキュメントを書こうとして調べていたところ、exploit について google で 検索すると、攻撃用のスクリプトが簡単に引っかかってしまう様子。
引っかかったスクリプトをgcc hogeとやると、a.out というファイルが生成される。
あとは、以下のような感じ。
tomo@VM-Ayu:~/ircd$ ./a.out -h 192.168.6.52 -p 6667 irc2.10.3p3 remote dos exploit delivered by ******** ----------------------------------------------------- [x] connected to 192.168.6.52:6667 .. [x] trying to logon with nick cngcwpajn .. [x] we're logged on, sending evil data ..
irc6.nara.wide.ad.jp が狙われなかったのは、このスクリプト自体がIPv6に対応していない為だと考えられる。
tomo@VM-Ayu:~/ircd$ ./a.out -h 3ffe:501:889:0:20c:29ff:fedc:d486 -p 6667 irc2.10.3p3 remote dos exploit delivered by ******** ----------------------------------------------------- [-] cant handle host .. tomo@VM-Ayu:~/ircd$ ./a.out -h fe80::20c:29ff:fedc:d486 -p 6667 irc2.10.3p3 remote dos exploit delivered by ******** ----------------------------------------------------- [-] cant handle host ..
同様のことを、telnet でやってみると、鮮やかにサーバが落ちた。 要はバッファ一杯のチャンネル名をたくさんカンマ区切りで同時に接続すれば簡単に落ちると言うこと。 パケットキャプチャを撮って確認してみたけど、ココまでさくっと落ちる物なのかと感心(@_@ ← ガキらしい
これのexploitの修正パッチは、 ここに有る様子。
Please be advised, that it is strongly recommended to upgrade to version 2.10.3p5, not only apply that patch. Thank you. --- ../../cvs/irc2.10.3/ircd/channel.c Fri Oct 10 22:34:05 2003 +++ channel.c Sat Oct 11 00:03:40 2003 @@ -2001,7 +2001,7 @@ Reg Link *lp; Reg aChannel *chptr; Reg char *name, *key = NULL; - int i, flags = 0; + int i, tmplen, flags = 0; char *p = NULL, *p2 = NULL, *s, chop[5]; if (parc < 2 || *parv[1] == '\0') @@ -2150,10 +2150,20 @@ parv[0]), name); continue; } + tmplen = strlen(name); + if (i + tmplen + 2 /* comma and \0 */ + >= sizeof(jbuf) ) + { + + break; + + } if (*jbuf) - (void)strcat(jbuf, ","); - (void)strncat(jbuf, name, sizeof(jbuf) - i - 1); - i += strlen(name)+1; + { + jbuf[i++] = ','; + } + (void)strcpy(jbuf + i, name); + i += tmplen; } p = NULL; @@ -2305,6 +2315,16 @@ parv[0], name, chop); else if (*chptr->chname != '&') { + /* ":" (1) "nick" (NICKLEN) " JOIN :" (7), comma (1) + ** possible chop (4), ending \r\n\0 (3) = 16 + ** must fit in the cbuf as well! --B. */ + if (strlen(cbuf) + strlen(name) + NICKLEN + 16 + >= sizeof(cbuf)) + { + sendto_serv_butone(cptr, ":%s JOIN :%s", + parv[0], cbuf); + cbuf[0] = '\0'; + } if (*cbuf) strcat(cbuf, ","); strcat(cbuf, name);