发新话题
打印

[原创]抗CC防火墙AntiAttackFireWall(AAFW)开源公告及源代码下载

[原创]抗CC防火墙AntiAttackFireWall(AAFW)开源公告及源代码下载

文章作者:Fr. Qaker [E.S.T]
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
  
备注:AXLFilter研究中

本软件开源目的
防御CC类型攻击,共享ISAPI编程思路,追求共享精神。

开源花絮
AAFW在2005年12月底就已经完成,现在需要的就是一些功能的补充和界面的优化,所以还是具有一定学习意义的。
原来发布过CC的源代码,但是发生了一些很不开心的事。这次要发布代码,很多朋友因此建议我不要开源。但是,代码放在手里,放着也是浪费,也不符合自己的共享精神。当初,我自己成长的时候也是读别人的代码提高自身的过程,乘凉不忘栽树人。虽然有不少小人,就让他去吧,真理永远变不了,小人得逞只是一时,大家技术的共同提高,共享精神的保持才是最重要的。

AntiAttackFireWall(AAFW)介绍
AA防火墙是一款IIS ISAPI防火墙,利用ISAPI FILTER进行系统保护,利用ISAPI EXTENTION进行管理。
目前代码已经实现了,有效防止盗链,有效防止CC攻击,有效控制文件下载,有效IP连接限制等功能,而且很多功能都考虑到了扩充问题,所以很容易的修改代码进行功能添加。
特别提下,里面的Base64的编码功能是我从网络上复制的一段代码改编来的。
IP管理用的是二叉树进行内存查找,正常情况下,十万次IP记录(十万数量级)的查找能在0.01秒内完成,建议修改的时候将数据进行hash算法。
原创SQL注入保护代码混合在Decode里面,过滤了()<>&#39;;=  因为<>=是判断符号,没有这三个符号,基本无法进行条件语句的构造,用()限制了decalre这样的使用和sql语句的套用,用&#39;;杜绝了SQL语句的分隔,应该说,这样的过滤是相对比较安全,而且有效的。
程序本身有访问者按IP管理,所以很方便进行下载限制。
盗链问题,用的是IP判断,看访问者是否访问过本站,用以判断,而不是refer判断,建议加上refer判断增加精确性,接下来会专门研究这个问题。
防止CC攻击用的就是原来我给出的asp防御的思路,采用IIS ASP的随机生成Session的方法,而且session值绑定在访问者的IP记录下。
控制文件下载,也是基于IP的,建议参考后台管理的登录代码,运用Base64的解码,可以很方便的开发会员区这样专业级别的登录控制,甚至可以考虑使用数据库存储用户,比ASP的管理有效的多,而且安全。

顺带感叹
近日的迅雷事件,我在这里支持天空,鄙视华军和迅雷。
迅雷的软件,思路,效率令人佩服,确实是个好东西。但是,大家听说过杀鸡取卵的故事么,迅雷现在就是,他自己建立了门户,提供软件搜索,软件从其他软件下载站下载。看上去挺不错的。潜在问题发生了,一个软件,很多地方同时提供,但是在迅雷中显示的站点只有一个,那么以后各家下载的站估计都要给迅雷送钱,这样才能让自己的站点多显示几次,多一些广告收入阿。下载的时候,管你是谁,只要有这个文件,迅雷就能下,流量上去了。这样做来,用户感觉不错,速度快,但是下载站呢?流量上去了,广告下来了,收入比支出少了,而且广告成倍的少,流量成倍的加,后果是什么?还记得baidu的mp3搜索吧,现在音乐站还有多少?还记得baidu的竞价广告吧,不给钱,你的页面别显示了,你的软件我照样用,不服?叫天天不应,叫地地不灵。说实话,迅雷作软件,佩服,做门户,卑鄙。杀鸡取卵,不改大家以后都没软件下,不信看吧。迅雷可是说了哦,我们不提供软件下载的,嘿嘿。
再说一个潜在威胁,迅雷就使加强版的CC,不信就看,千万用户一起用,每人5个连接,迅雷说今天,天空和我闹,大家一起去挤它的软件下载吧,天空崩溃了。明天,华军这个小人又出尔反尔了,大家去挤它吧。别和我说什么它很有商业道德,baidu多大的一个网站,不照样出来一个8848攻击事件,这次迅雷的做法,嘿嘿,好像更猛。
华军,嘿嘿,就是一个炒作家,先领头出来说,迅雷卑鄙阿,坏阿,然后,不知道得到什么好处,嘿嘿,第一个叛变了,不信大家去华军网上看看,这样的领头羊,嘿嘿,就是披着狼皮,自己炒作自己,能活到最后,但是第一个出卖用户的肯定是它。
天空,赞一个,支持一个,顶住,你要倒了,我们以后软件下载没了,一定要坚持住,让迅雷改。谢谢。

推荐网站
VIF:一个商业版本的IIS防火墙,界面比我的好看多了,功能呢,说实话是同类产品,但是有后续性,不断更新重,大家支持一个http://vif.foosun.cn
邪恶八进制:我的根据地,欢迎大家来指导http://forum.eviloctal.com/,我的软件首发地色釉-信手绾红尘:美文欣赏http://blog.sina.com.cn/u/1236648217强烈推荐里面的诱惑,嘿嘿http://blog.sina.com.cn/u/49b5c1190100043h
NDS论坛:喜欢玩NDS的朋友可以去看看http://www.ndsman.com/bbs,好像遇到了和天空一样的问题,被某个叫NDSBBS的网站盗链加恶意中伤。
浩联电子:http://www.591hl.com家乡的一个公司,感谢一个长期支持我的朋友 [m*],估计他不想在这里出名,嘻嘻

近日计划
集中精力研究AXLFilter,用IIS ISAPI FILTER彻底解决盗链问题,然后发布源代码,希望相关下载站与我联系测试盗链效果和防迅雷下载,概念代码将在第一时间发布。

我的联系方式:bigboyq[at]eviloctal[dot]com

附件

AAFW.rar (139 KB)

2006-6-11 20:37, 下载次数: 7136

AAFW原代码

以上内容完全是复制粘贴,本人并不明白其意思,故本人不对以上内容负法律责任,请不要跨省追捕。要详查请自己联系原作者,谢谢!

TOP

晚上跟fr.qaker交流了一下,这里把fr.qaker的一些分析贴出来:

很多站长自己出钱买带宽做下载站点,仅仅靠点广告费用来维持生计。很是不容易!

但当有一天你将会发现自己的软件资源正在被一款叫迅雷的软件疯狂下载。别以为你的流量高,其实你是被盗链了。

一个下载软件,如果自己不做资源,又要从别人的站下载资源,而不是通过别人知道的下载地址下载,换句话说就是盗链。

这样下去,软件下载业就没法做了,天空,华军都可能有关门的危险。 因为你的软件再多,都是被别人下载的对象。


MYIIS产品网全力楼主,将参与AXL的开发。
论坛地址: http://www.ssk2.cn & www.iisuser.com

TOP

软件的开源性质不会发生变化

AAFW和VIF的合作将坚决与迅雷斗争到底,用免费软件打倒迅雷,保护下载市场

防止无软件可下的恐怖局面

感谢Softbug的支持

PS:个人用户肯定觉得讯雷很好,小心以后公安找你,现在已经很明显,讯雷可以控制让用户连接什么服务器,小心成为他攻击别人网站的工具,目前好象能由软件发布商控制下载的也就它了,千万用户连接同一台服务器,那个壮观啊
以上内容完全是复制粘贴,本人并不明白其意思,故本人不对以上内容负法律责任,请不要跨省追捕。要详查请自己联系原作者,谢谢!

TOP

大哥还是决定开源了。感激,已经收藏。
网络能发展到今天大约和这种正直的共享是分不开的。
邪恶八进制允许下载的东西不加任何限制。不像一些论坛有这个那个的。
感谢这个地方。

即使是这么宝贵的东西来这里的每个人都可以下载到。好,真好。!!!
感谢一个,希望看到我的感谢。估计我的这个帖子很快就被删除了。
冒着被处理的危险也要说声谢谢。哈哈
有时候很不好意思得到了别人的心血。论坛的老大们还不让说谢谢。
做人要厚道阿。
感谢,祝福!!!
人情如冰六月寒,花做一份艳,为谁笑人间? 如果任何人发现我转载的有图像的文章中图像失效或者文章有问题,请及时短消息通知我。先谢谢。::)) coup de foudre

TOP

fr.qaker 汗我那么多时间没看电视......

贴出个结果:

先下载这个软件:

GET /download/vif.rar HTTP/1.1
Host: www.myiis.cn
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Referer: http://www.myiis.cn/download
Pragma: no-cache
Cache-Control: no-cache
Connection: close

再下个另外的软件:
GET /download/vif.rar HTTP/1.1
Host: www.myiis.cn
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Referer: http://www.myiis.cn/download
Pragma: no-cache
Cache-Control: no-cache
Connection: close


其实这2个是同样的一个文件,现在我再次下载第二个软件,结果是下图:




大家看出来了吧,别人该给了个标签呢。是什么标签呢?流量标签吗?
GET /mark/99870D26E5F1DAB346E3D918F5475EC2764C68BA HTTP/1.1
论坛地址: http://www.ssk2.cn & www.iisuser.com

TOP

aa防火墙开源的过程是非常曲折的,qaker兄弟为此开源项目的发起,做了一番相当辛苦的努力。
在站点众多成员的支持下,尤其是softbug和code_tin两位兄弟的莫大支持、全力推进,aa防火墙的开源之日终于在欢呼声中到来了。
邪恶八进制信息安全团队所有的威望与荣誉,都来自于互联网、来自于广大朋友的支持。这次aa的开源,是团队成员共享精神的体现,也是回馈大众的一种方式。
也许aa不是最好的防火墙,但是cc的作者编写的能够防护cc攻击的防火墙,我想,至少是一个在相当程度上可以信赖和选择的方案之一。

当然,大家也请明白,这毕竟是一个免费开源的项目,邪恶八进制是一个免费非赢利的团体,我们支持维护这样一个项目,需要花费一定的精力。所以他不一定能做到商业软件那样的专业标准。如果您是一个追求商业效果的客户,还可以选择vif这款优秀的防火墙,他和aa的基本功能一样,但是商业性的扩展使其具备更多的专业优势。
无论如何,邪恶八进制信息安全团队将aa奉贤给大家。

再次感谢一切为aa开源做出不懈努力朋友们,你们才是网络最可爱的人。
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

AAFW最近修改了部分bug.
更新后的源码可以通过SVN下载
svn://61.172.192.45/AAFW
连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

2006-7-11号更新版本
以zip包提供,方便没有SVN的朋友

附件

AAFW.zip (294 KB)

2006-7-11 22:10, 下载次数: 3668

连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

在sourceforge上发布了项目
http://sourceforge.net/projects/aafw
连入侵者都敢说自己在做网络安全。关键大家是真正为安全作过什么?

TOP

下载了2006-7-11号更新版本但是用不了,安装上后IIS的优先级显示未知状态,然后管理的地址可以打开但就是不起作用,http://xxx.xxx.net/iiswall/aafw.dll?adm,进入后显示
AAFW防火墙工作中
http://www.eviloctal.com.cn

试了一试默认的禁用下载mdb但是可以下载,然后还有更新配置后重启动IIS又自动还原了。
请问是怎么回事?

TOP

发现fr.qaker  兄公布的代码是好的,但是有时间限制和注册限制,我找到了时间限制的代码没有找到注册限制的代码所以用不了。
代码罐头公布的附件比sourceforge上面的新一点,但是和sourceforge上面的一样,用不了,有时间限制,如果把时间限制去掉后就会出现问题,刷新几下IIS就挂了。所以代码还是有问题的。
限制的时间是2006.1.1
从上面看出没有一个可以用的版本,希望放出一个可用版本出来。

TOP

最近也在写IIS ISAPI filter,防止CC攻击的也是功能之一


看了一下code, 提几个建议:
addconnect() 可以不使用锁,使用InterlockedExchange效率应该高点

ip查找使用HASH table应该是最好的了,IP pool多大,查找都基本是线速,前两天刚好完成了一个用于防范CC攻击的C的hash table实现,为了减少malloc/free使用内存池分配和回收,不过是基于GCC写的,还需要移植, Fr. Qaker 感兴趣的话,我可以把它植入AAFW.

sql注入防范方面,怎么防范POST注入又不会影响IIS性能,也挺头疼的

TOP

代码罐头的code可能少了文件?
正在看Fr. Qaker的code , 虽然写了一段时间的isapi filter ,还是很有启发


不过发现我的HASH实现太专门化了,而且和aafw的回收条件也不一样,所以内存池基本没用,修改以后多出了一些rubbish code,比如watch_dog, 比如if (0 && "put you delete condition here" )


find_entry()实现相当于search()函数,返回值有所不同:

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#include <assert.h>
#include <time.h>
#include <assert.h>

#include <windows.h>

#define _P_DEBUG_
#define U32_RABBISH  0xCCCCCCCC

#ifdef _P_DEBUG_
  #define COUNT_VERIFY  assert
  #define COUNT_ASSERT  assert
  #define COUNT_TRACE    printf
#else
  #define COUNT_VERIFY  
  #define COUNT_ASSERT  
  #define COUNT_TRACE   
#endif

#ifndef uint32_t
typedef unsigned char  uint8_t;
typedef signed short  int8_t;
typedef unsigned short  uint16_t;
typedef signed short  int16_t;
typedef unsigned int  uint32_t;
typedef signed int    int32_t;
#endif

typedef struct _tag_stVisit
{
  int reserve;
} stVisit;

typedef struct _tag_ip_entry
{
  struct _tag_ip_entry* next;
  uint32_t  ip;
  stVisit*  key2nd;
  uint32_t  watch_dog1;
  uint32_t  watch_dog2;
}ip_entry;

uint32_t get_hash_index( uint32_t key )
{
  //return (key* 2654435761UL) & HASH_TAB_MASK_4_1024;
  uint32_t ret = (key* 2654435761UL) >>(32-10);
  return ret;
}

static ip_entry*  hash_table[1024] = {0};

#define MAX_AVLB_COUNT  1024
static ip_entry* g_avail_head = NULL;
static int      g_avail_list_num = 0;

/***********************************************
* if we have avalid free node , return it , otherwise we malloc it
***********************************************/
ip_entry* ip_entry_new_node()
{
  ip_entry* entry = g_avail_head;

  if (NULL==g_avail_head)
  {
    COUNT_VERIFY(g_avail_list_num==0);
    entry = (ip_entry*)malloc(sizeof(ip_entry));
    COUNT_VERIFY(entry);
    COUNT_TRACE("new node alloc at %08x\n", entry);

    memset( entry, 0xCC, sizeof(ip_entry));
    return entry;
  }
  
  g_avail_list_num--;
  COUNT_VERIFY(g_avail_list_num>=0);
  if (g_avail_list_num<0)
  {
    g_avail_list_num=0;
  }

  g_avail_head = g_avail_head->next;

  COUNT_VERIFY(U32_RABBISH==entry->ip && U32_RABBISH==(uint32_t)entry->key2nd && U32_RABBISH==entry->watch_dog1 && U32_RABBISH==entry->watch_dog2 );
  //memset( entry->ientry , 0xCC, sizeof(ip_entry)-4);
  return entry;
}

/***********************************************
* return node to free list , or free it
***********************************************/
void ip_entry_free_node(ip_entry** prev_next,  ip_entry* entry)
{
  COUNT_VERIFY(g_avail_list_num>=0 && g_avail_list_num<=MAX_AVLB_COUNT);
  COUNT_VERIFY(U32_RABBISH!=entry->ip && U32_RABBISH!=(uint32_t)entry->key2nd && U32_RABBISH!=entry->watch_dog1 && U32_RABBISH!=entry->watch_dog2 );

  *prev_next = entry->next;
  
  if (g_avail_list_num>=MAX_AVLB_COUNT)
  {
    COUNT_TRACE("free node at %08x\n", entry);
    free(entry);
    return;//too much free node , free to to heap
  }
#ifdef _P_DEBUG_
  memset( &entry->ip , 0xCC, sizeof(ip_entry)-4);
#endif
  //put it to avail_head
  entry->next = g_avail_head;
  g_avail_head = entry;
  
  g_avail_list_num++;

  return;  
}

ip_entry* find_entry(uint32_t ip)
{
  
  ip_entry* same_entry = NULL , *tmp_entry=NULL;
  
  int index = get_hash_index(ip);
  ip_entry* entry = hash_table[index];
  ip_entry** prev = &hash_table[index];

  while(entry!=NULL)
  {
    COUNT_VERIFY(U32_RABBISH!=entry->ip && U32_RABBISH!=(uint32_t)entry->key2nd && U32_RABBISH!=entry->watch_dog1 && U32_RABBISH!=entry->watch_dog2 );
    COUNT_VERIFY( get_hash_index(entry->ip)==index );
    if (0 && "put you delete condition here" )
    {
      tmp_entry = entry;
      entry = entry->next;
      ip_entry_free_node( prev, tmp_entry );      
      
      continue;
    }

    if (entry->ip == ip)
    {
      same_entry = entry;
      break; //we found it!
    }
    COUNT_VERIFY(entry != entry->next);
    prev = &(entry->next);
    entry = entry->next;
  } //end while

  if (same_entry==NULL)
  {
    //not found , alloc new ip entry
    same_entry = ip_entry_new_node();
    COUNT_VERIFY(same_entry);

    if (NULL==same_entry)
      return same_entry;

    same_entry->ip = ip;
    same_entry->key2nd = malloc( sizeof(stVisit) );
    same_entry->watch_dog1 = 0;
    same_entry->watch_dog2 = 0;

    //put to hash list head
    same_entry->next = hash_table[index];
    hash_table[index] = same_entry;
  }
  
  return same_entry;
}


int main()
{
  uint32_t ip ;
  int  i;
  ip_entry* tmp ;

  int count[2048] = {0} ;
  for (i=0 ; i <10000*10000; i++)
  {
    ip = rand();

    tmp = find_entry(ip );
    printf("ip %08x \n",  ip);
  }
  
  return 0;
}

TOP

编译不通过????????
郁闷。
same_entry->key2nd = malloc( sizeof(stVisit) );错误?

TOP

附带说明一下,我用的编译器是那个bc5.5的免费版,文件名是xxx.c

上面的朋友肯定是使用cpp后缀碰到的指针强制转换错误,C++的编译更加严格, 加一个强制转换就OK

TOP

注册限制其实就是一个#define头的修改,自己看下具体代码就明白了

时间破解主要修改的地方不在程序头,而在一个类里面,一个带有随机值的类里面,认真找肯定能找到,程序头哪个getversion的地方很容易被人修改的,类那个是用来制造错误的,呵呵

设置自动还原是因为没有写入注册表,没有写入的原因有两个,一个就是没有修改编译头定义,是未注册版本,还有一个就是注册表权限没有手工设置,写不进去

IP Pool多大,我不敢说,但是需要安装aafw的机器都不小,用hash还增加了hash的计算过程.......

或许用一个优化的浮动index对线性存储进行查找会更好点,呵呵,这样一个平衡真不容易

addconnect不锁,我实验过,问题....我用自己开发的软件(CC)实测,不锁,数据不准,但是概率很低,还是有不准就是了

代码中间有时间限制是因为要发布测试版本,又不想影响到日后的商业版本(本来有商业版本的计划,中间的故事就不说了),注册问题就是定义头找找,很容易发现,这个也是预留的,呵呵
以上内容完全是复制粘贴,本人并不明白其意思,故本人不对以上内容负法律责任,请不要跨省追捕。要详查请自己联系原作者,谢谢!

TOP

什么时候我们能够拥有一个像比特精灵或是EMULE这样的开源软件取代迅雷?
努力+奋进+期待=我们自己的下载软件=取代迅雷!
向所有开源软件编写者致敬!!!!!!
没有什么能被禁锢,也没有什么不能想到!

TOP

楼主说的固然不错..不过其实不因该针对迅雷...
这类软件已经越来越多鸟..而且估计普通网络用户是不会支持的...
只有谈判...要大家相互都有利益..
感谢楼主开源..

TOP

现在的高手很多,相信不久的将来就会出现的,期待呀

TOP

真的好高兴能找到一个开源共享的地方。。。现在的网络充斥着金钱风暴,许多网站都用各种名义收受vip会员方式赚钱。。。看到这里,看你楼主的 “当初,我自己成长的时候也是读别人的代码提高自身的过程,乘凉不忘栽树人。虽然有不少小人,就让他去吧,真理永远变不了,小人得逞只是一时,大家技术的共同提高,共享精神的保持才是最重要的。
” 这段话真让我感动,我以后会一直来这里,一直支持你们。。。谢谢。
无为而为,简简单单。

TOP

发新话题