#echo server
zhou@ubuntu:~$ cat test.py
#!/usr/bin/env python
import sys
while True:
s = sys.stdin.read(1)
if s:
sys.stdout.write(s)
sys.stdout.flush()
nc -l -k --sh-exec 'python test.py' 127.0.0.1 8086
zhou@ubuntu:~$ nc 127.0.0.1 8086
123
123
1444455
1444455
nmap.org的ncat支持--sh-exec和--lua-exec参数, 提供了这两个参数后, ncat会在appcet(-l)或connet后fork一个子进程,前者通过exec /bin/sh -c 来执行sh命令, 后者直接执行lua脚本. 同时,会生成两个pipe组, 将子进程的stdin和stdout分别重定向到两个pipe. ncat主进程在从socket收到数据后,会将数据发送到pipe中,由于子进程的stdin已经被重定向, 所以子进程中从stdin读相当于从pipe读,而pipe的数据就是socket过来的数据. 利用这个特性,我们就可以随意发挥了. 这将大大方便基于socket的服务的测试打桩. 以上就是简单的echo server的实现.
由于有--lua-exec这个选项, 我一开始是直接写lua脚本的, 从源代码提供的demo脚本看看,lua脚本直接从stdin stdout读写就可以了,我以为是ncat重写了lua的print ,io等模块(函数), 看了代码之后才发现机制是如上所述.
ncat带的lua是5.2版本, 没有pack unpack之类的函数(lua 5.3引入),但是python中是有struct这个模块,提供pack, unpack, 方便处理二进制数据.
来源:oschina
链接:https://my.oschina.net/u/97321/blog/526725