1,tcpdump:dump traffic on a network。tcpdump打印经过指定网络接口的符合某个布尔表达式的数据包的首部。
1)常用选项:-w file:将从网络接口上读取的数据包保存到文件file以供后续分析;-r file:从文件file而不是网络接口中读取数据包;-c count:只读取和处理count个数据包(默认count没有限制),或者因收到SIGINT或SIGTERM信号而退出;-i interface:从网络接口interface中读取数据包;-A:以ASCII码形式打印包的内容(去掉链路层首部);-x:以十六进制形式打印包的内容(去掉链路层首部);-xx:以十六进制形式打印包的内容(包含链路层首部);-X:以十六进制和ASCII码形式打印包的内容(去掉链路层首部),在分析新协议的时候很方便。
2)使用形式:tcpdump option option_val filter_expression。filter_expression即上面提到的布尔表达式,如果没有指定,则把(指定网络接口的)所有数据打印出来。一些例子:
监听网络接口eth1上62626端口发出的udp数据包:sudo /usr/sbin/tcpdump -ieth1 udp src port 62626。src和dst分别表示发送方和接收方。
监听网络接口lo上某几个端口的udp数据包:sudo /usr/sbin/tcpdump -ilo '(udp port 52033 || udp port 20801 || udp port 59208 || udp port 62626)'
以下例子可以帮助我们更好地理解,通过udp的sendto函数发送'hello haner'的时候,TCP/IP各层是如何封装数据的:
以下解读上图中part 1~8各部分的含义(参照下图“UDP首部格式”和“IP首部格式”):
part 1表示发送的内容'hello haner'。
part 2表示“UDP长度”,是UDP首部(8字节)和UDP数据(11字节)的长度和。
part 3表示“UDP源和目的端口号”,这里是49744和61535。
part 4表示“源IP地址和目的IP地址”,这里均是127.0.0.1。
part 5:40(十进制64)表示TTL;11(十进制17)表示UDP协议,另有1(ICMP)、2(IGMP)、6(TCP),因为它们都要向IP传送数据,所以要加以区分。
part 6表示“IP报文总长度”,这里27(十进制39)即20+8+11。
part 7:4表示“版本”,这里即IPv4;5表示“IP报文首部长度”,这里是首部占32 bit字的数目,为5*4=20。
part 8表示以太网链路层的封装格式,分成目的地址(6字节)、源地址(6字节)和类型(2字节)。IP数据报、ARP请求/应答、RARP请求/应答分别用类型0800、0806和8035来区分。
2,netcat(简称nc,被誉为网络安全界的“瑞士军刀”):通过使用TCP或UDP协议的网络连接读写数据。同时,它还是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接。
netcat在不同系统中的相同或类似的程序:nc、ncat、pnetcat、socat、sock、socket、sbd。其中,socat比netcat更大更复杂,而cryptcat是netcat的带加密能力的版本(twofish encryption enabled version of nc)。
1)常用选项:-i interval:指定收发的文本行之间的延迟时间;-k:在现有连接断开后,继续保持监听状态。必须和-l一起使用;-l:监听模式;-o file:以十六进制转储传输的数据;-p port:指定本地的端口号(一个端口或一个端口范围lo-hi);-r:随机选择本地和远端的端口;-s addr:本地源地址。指定将要发送数据包的网络接口的IP;-t:telnet相关,对于RFC 854的DO和WILL请求,发送RFC 854的DON'T和WON'T应答;-u:使用UDP(而非默认的TCP);-U:使用UNIX域socket(数据报);-v:输出详细信息;-w secs:若连接未能建立或闲置超过secs秒,则超时;-z:使用零I/O模式(不发送数据)扫描(指定主机)处于监听状态的后台程序。
2)一些例子:
(1)文件传输。通过端口17632从client复制文件到server:
server:netcat -l -p 17632 > test.txt
client:netcat serverip 17632 < test.txt
netcat serverip 17632创建了一个指向serverip:17632的TCP连接,此时标准输入的内容会被发送到serverip,而从serverip返回的数据会重定向到标准输出。
(2)端口扫描。默认扫描TCP端口,-u可以指定扫描UDP端口。
(3)获得端口信息。
(4)远程执行命令。也许是出于安全考虑,在linux中没有-c或-e选项(netcat -v -l -p port -e command),但通过重定向文件描述符依然可以在连接建立之后远程执行命令【危险】:
在server端:rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | netcat -l 127.0.0.1 1234 > /tmp/f
在client端:netcat serverip 1234。之后出现server的shell提示符。
当client与server建立连接后,server上的/bin/sh得以执行,并给client返回shell提示符。之后命令的输入和输出都通过网络连接和管道传输。
不断学习中。。。