关于ZMap就不多说了,官网在这里:https://zmap.io/
官方编译安装方法在这里:https://zmap.io/download.html
截至目前ZMap的最新版本是1.0.3
ZMap设计运行于64bit Linux,依赖于GMP, libpcap, Gengetopt
Debian/Ubuntu:
sudo apt-get install libgmp3-dev libpcap-dev gengetopt
Fedora/Red Hat Enterprise Linux/CentOS:
sudo yum install gmp gmp-devel libpcap-devel gengetopt
我的机器的环境是:版本Ubuntu 12.04.3 LTS 64bit,内核3.2.0
编译安装过程:
wget https://github.com/zmap/zmap/archive/v1.0.3.tar.gz
#为了方便识别,重命名一下
mv v1.0.3.tar.gz zmap-v1.0.3.tar.gz
tar -zxvf zmap-v1.0.3.tar.gz
cd zmap-1.0.3/
cd src
make
sudo make install
ZMap安装完成,可以运行如下命令测试:
sudo zmap -p 80 -N 10 -B 1M -o -
很快,程序会输出10个Internet上打开了80端口的主机的IP,你也可以换成22端口23端口试试。具体的用法可以参考ZMap官方文档。
如果不想以root运行ZMap,可以设置:
setcap cap_net_raw=ep /usr/local/sbin/zmap
ZMap的Redis支持默认不打开,如果需要的话必须先安装Hiredis,然后重新编译ZMap。
Redis官网在这里:http://www.redis.io/
Redis目前最新的稳定版是2.6.16
编译安装过程:
wget http://download.redis.io/releases/redis-2.6.16.tar.gz
tar -zxvf redis-2.6.16.tar.gz
cd redis-2.6.16
make
sudo make install
Redis安装完成
Hiredis在这里:https://github.com/redis/hiredis
它是Redis最小的C客户端
使用git下载代码
git clone https://github.com/redis/hiredis.git
cd hiredis/
make
sudo make install
Hiredis安装完成
重新进入ZMap目录
make clean
make REDIS=true
可能会遇到下面的error:
output_modules/module_redis.c: In function ‘redismodule_flush’
error: passing argument 1 of ‘redis_lpush’ discards ‘const’ qualifier from pointer target type [-Werror]
redis.h:26:5: note: expected ‘char *’ but argument is of type ‘const char *’
原因是QUEUE_NAME被定义为宏:
#define QUEUE_NAME "zmap_results"
但是redis_lpush的声明为:
int redis_lpush(char*, void*, int, size_t);
这里是const char *到char *转换的问题
对module_redis.c做如下修改:
//if (redis_lpush(QUEUE_NAME, buffer,
if (redis_lpush((char *)QUEUE_NAME, buffer,
另一个error:
output_modules/module_redis.c:94:2: error: initialization from incompatible pointer type [-Werror]
output_modules/module_redis.c:94:2: error: (near initialization for ‘module_redis.success_ip’) [-Werror]
对module_redis.c做如下修改:
//int redismodule_newip(ipaddr_n_t saddr, UNUSED ipaddr_n_t daddr,
// UNUSED port_n_t sport, UNUSED port_n_t dport,
// UNUSED const char *response_type, int is_repeat,
// UNUSED int in_cooldown, UNUSED const u_char *packet)
int redismodule_newip(ipaddr_n_t saddr, UNUSED ipaddr_n_t daddr,
UNUSED const char *response_type, int is_repeat,
UNUSED int in_cooldown, UNUSED const u_char *packet, UNUSED size_t buflen)
又是一个error:
output_modules.o:(.data.rel+0x18): undefined reference to `module_ssldbfeed'
查找一下发现zmap 1.0.3的代码里压根没有定义module_ssldbfeed,估计这是新特性,有可能在非稳定的新版本中存在,注释掉相关的代码就ok了。
对output_modules.c做如下修改:
//extern output_module_t module_ssldbfeed;
//&module_ssldbfeed,
再次make REDIS=true,编译成功。
再次运行zmap,发现:
zmap: error while loading shared libraries: libhiredis.so.0.10: cannot open shared object file: No such file or directory
原因是libhiredis.so.0.10默认被安装到了/usr/local/lib/里面,创建个软链接放在/usr/lib/就ok了。
sudo ln -s /usr/local/lib/libhiredis.so.0.10 /usr/lib/libhiredis.so.0.10
到这里ZMap的Redis支持就编译完成了。
尽管文档里说ZMap是为64位设计的,但是实际在32位机上也可以编译使用,只是有些代码要做小小的修改,这个接下来有空再写一下。