曲径通幽论坛

标题: socat -- nc 的增强版 [打印本页]

作者: beyes    时间: 2012-12-3 17:58
标题: socat -- nc 的增强版
nc 已经不再继续开发,现在完全可以使用一个具有更强功能的工具 -- socat ,该工具使用的基本方式如下:
socat [options] <address> <address>
上面中的两个 address 是必选项,而 options 是可选项。

socat 的基本功能就是建立两个双向的字节流,数据就在其间传输,参数 address 就是代表了其中的一个方向。所谓流,代表了数据的流向,而数据则可以有许多不同的类型,命令中也就相应需要许多选项对各种不同的类型数据流进行限定与说明,因此 socat 的用途必定极为广泛,且较为复杂。

下面以几个实例说明该工具的简单应用,更多更复杂的情况请参考 man 手册(一般情况下,许多 Linux 发行版并不会默认安装该工具,需要自行安装之)。

先在 Windows 的一端(192.168.1.110)运行 nc.exe 命令(Linux 上的 nc 使用与 Windows 上的基本相同),使之监听在 2012 端口:
[Plain Text] 纯文本查看 复制代码
nc.exe -l -p 2012

接着,在 Linux 端如下运行 socat 命令:
[Plain Text] 纯文本查看 复制代码
socat - tcp:192.168.1.110:2012

在上面的命令中,socat 将本地的标准输入输出和远端的 192.168.1.110 的 2012 端口建立起一个的 TCP 连接。这样一来,两边就可以通讯了。如果客户端希望结束连接,可以 Ctrl + d 输入结束符,这样服务器也会同时断开。上面的通信原理如下图所示:
[attach]1044[/attach]


在上面的命令里,tcp 称之为 address 的关键字,它用来指定 address 的类型,关键字和 address 之间用冒号相隔,少数特殊的 address 类型也可以忽略关键字。

如上面的例子,我们可以反过来,在 Linux 端用 socat 设置监听服务器(IP 为 192.168.1.104),如:
[Plain Text] 纯文本查看 复制代码
socat tcp-listen:2012 -

接着,在 Windows 端使用 nc.exe 来连接:
[Plain Text] 纯文本查看 复制代码
nc.exe 192.168.1.104 2012

这样连接后,Windows 是客户端,Linux 是服务器:
[attach]1043[/attach]


在 socat 命令里,tcp-listen:2012 是 address,tcp-listen 是 'address' 的类型,表示监听在 TCP 端口。类似,如果想监听在 UDP 上,那么可以:
[Plain Text] 纯文本查看 复制代码
socat udp-listen:2012 -


实际上,‘address' 是可以有多个选项来修饰的,而选项是由选项关键字及其值组成(大小写敏感),每个选项由逗号分隔,此外每个选项都属是一个选项组的成员。在下面的例子中,我们会用 socat 从一台主机上把一个文件传送到另一台主机上。

首先,在 IP 为 192.168.1.109 的主机上运行如下命令:
[Plain Text] 纯文本查看 复制代码
$ socat -U OPEN:beyes.exe,creat tcp-listen:2012

上面的命令的意思是:它使主机监听在 2012 这个端口上,当有文件传输过来时,它将其改名为 beyes.exe 并保存。其中 OPEN 是 'address' 的类型,beyes.exe 是地址参数,creat 就是 'address' 的选项了,该选项同时属于 OPEN 组。注意 OPEN:<filename> 是 'address' 类型,而 OPEN 是一个选项组,具体参考 man 手册。
主力 -U 这个命令行选项参数的意思是,第 1 个 'address' 仅用来写的,第 2 个 'address' 仅用来读的。也就是说,该端从连接客户那里读取传送过来的文件,然后写往 beyes.exe 中。与 -U 相反的选项是 -u ,该选项的第 1 个 'address' 仅用来读,而第 2 个 'address' 仅用来写。下面的命令发自客户端,它就用到了 -u 选项:
[Plain Text] 纯文本查看 复制代码
$ socat -u OPEN:echo_srv tcp:192.168.1.109:2012


可以用 ls 命令检查是否传送成功:
[attach]1045[/attach]


下面再举一个例子,它看起来就像是一个后门,也就是说,当客户端连接上后,服务端分配一个 shell 给客户端。

首先在服务端执行下面的命令:
[Plain Text] 纯文本查看 复制代码
socat tcp-listen:2013 EXEC:/bin/sh,pty,stderr


接着可在 Windows 端使用 nc.exe 来连接:
[attach]1046[/attach]

由上可见,当 Windows 连接上后获得了一个 shell ,并可在其上进行相应的操作。

在上面的 socat 的命令中,EXEC 'address' 类型首先会 fork 出一个子进程,它与父进程通信,并通过 execvp() 函数调用其后的命令,如上面的是 /bin/sh。
另外,pty 和 stderr 是地址选项,它们都属于 FORK 选项组。pty 表示要使用伪终端来建立与子进程进行通讯,而不是直接用 socket 对,如果不用该选项,那么连接上时是没有中断提示符的,如:
[attach]1047[/attach]


stderr 选项表示将子进程的 stderr 重定向到 stdout 上。

socat 还有许多有用的应用,一些应用可以让你的工作更加便利。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2