公司动态
一次tcpdump抓包过程
#查询网卡tcpdump-D# 监听 21100 端口 网卡ens192 不知道网卡可以直接不输入 -i 网卡TCP数据等待一段时间执行CtrlC终止程序(如果要给Wireshark分析就无需转换log直接用dump)tcpdump-x-s 0-w/tmp/123.dump-i ens192-p tcp port 21100#数据包转换为可读信息tcpdump-x-tttt-r/tmp/123.dump /tmp/abc.log#根据文件通过工具提取有效信息指定抓包字节建议需要确定字节长度否则全量正则匹配CPU会飙升如果是生产环境会出故障一、先在测试环境监听全量数据sudo timeout 60 tcpdump -i any -s 0 -w /tmp/udp_dad90f29.pcap ‘udp port 21126’二、之后通过Wireshare工具打开文件选中一条真正可用的报文通过坐下角确定占用的头部长度tcp.flags.fin 1 || tcp.flags.reset 1 查询正常异常断开根据时间推算一是发送断开的一是应答断开的先发送 [FIN,ACK]数据断开发起方三、UDP 查看User Datagram Protocol通过Length-payload8确定长度是8后面就是原始报文可以通过追踪流UDP或TCP之后选择hex确定报文信息四、之后就可以通过协议确定关键字所在位置加上固定长度正则匹配对应的报文如我的报文29 29 80 01 1B DA D9 0F 29 26 03 09 18 03 05 02 24 14 16 11 41 71 24 00 00 00 00 FF 00 00 00 FF FF 52 FF FF FF FF FF FF FF FF 00 00 17 00 24 34 36 30 3B 30 30 3B 39 33 36 39 3B 32 32 34 38 30 35 34 34 33 00 05 00 04 28 41 20 00 04 00 08 05 D7 00 10 00 A3 54 39 33 5F 32 39 32 39 5F 56 36 2E 31 3B 00 06 00 A5 00 00 00 10 00 06 00 89 FF FF FF FF 00 70 00 B9 05 38 30 3A 30 35 3A 38 38 3A 35 65 3A 61 66 3A 35 62 2C 2D 35 33 2C 38 36 3A 64 64 3A 62 37 3A 38 33 3A 36 33 3A 32 30 2C 2D 35 35 2C 36 38 3A 64 64 3A 62 37 3A 38 33 3A 36 33 3A 32 30 2C 2D 35 37 2C 31 38 3A 32 61 3A 35 37 3A 61 36 3A 65 66 3A 62 38 2C 2D 36 30 2C 34 38 3A 35 66 3A 30 38 3A 34 31 3A 62 33 3A 31 35 2C 2D 36 30 00 06 00 C5 00 C6 50 C8 00 16 00 FB 38 39 38 36 30 34 37 36 31 36 32 30 39 30 35 30 30 37 34 35 00 05 00 AE 01 00 41 00 05 F0 00 00 00 41 00 09 F0 01 26 03 10 00 41 00 00 0E 0DDA D9 0F 29是关键字是第6个字节加上固定字节8个index从0开始也就是13长度4这样就可以找到对应的报文sudo timeout 60 tcpdump -i any -s 0 -w /tmp/udp_dad90f29.pcap ‘udp port 21126 and udp[13:4] 0xdad90f29’TCP操作类似但它的长度是Transmission Control Protocol中的 Header Length是TCP固定长度sudo timeout 60 tcpdump -i any -s 0 -w /tmp/tcp_123456789123456.pcap ‘tcp port 21100 and tcp[23:8] 0x0202511102000082’使用代码执行tcpdump分析第一步、编写shell脚本用于生成文件脚本需要赋权#!/bin/bash# This is start shellsudo timeout 60m tcpdump-x-w-x-s 0-w/tmp/tcpdump/v1.dump-i ens192-p tcp port 21100sleep100 sudo tcpdump-x-tttt-r/tmp/tcpdump/v1.dump /tmp/tcpdump/v1.log第二步、读取生成的v1.log进行解析packagecom.jimi.tcpdump.parse.tool.kks;importcom.google.common.collect.Maps;importcom.google.common.collect.Sets;importcom.jimi.tcpdump.parse.tool.ProtocolService;importcom.jimi.tracker.util.ByteUtil;importcom.jimi.tracker.util.CodecUtils;importcom.khan.utils.StringUtils;importio.netty.buffer.ByteBuf;importio.netty.buffer.Unpooled;importorg.apache.commons.io.FileUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.File;importjava.io.IOException;importjava.nio.charset.StandardCharsets;importjava.util.List;importjava.util.Map;importjava.util.Set;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/** * Description * p * 康凯斯协议抓包 * /p * * Author leo.xiong * CreateDate 2024/6/27 9:50 * Email xionglangjimiiot.com * Since */publicclassKksProtocolServiceImplimplementsProtocolService{privatestaticfinalLoggerLOGGERLoggerFactory.getLogger(KksProtocolServiceImpl.class);privatestaticStringDIRECTORY/tmp/tcpdump/;privatestaticfinalStringFILE_DUMPv1.dump;privatestaticfinalStringFILE_LOGv1.log;privatestaticfinalStringFILE_LOGINlogin.log;/** * 网卡 */publicstaticfinalStringNETWORKens192;/** * 需要监听的端口号 */publicstaticfinalintPORT21100;publicstaticfinalPatternV1_DUMP_MSG_PATTERNPattern.compile(7878[0-9|A-Z]{1,}0D0A);static{StringosNameSystem.getProperty(os.name).toLowerCase();if(osName.contains(win)){DIRECTORYD:/文档/log/;}}/** * 不符合结果直接在Linux执行语句查看效果 */OverridepublicvoidtcpDumpMsg(){FilefilenewFile(DIRECTORYtcpdump.sh);if(!file.exists()){LOGGER.warn(执行脚本不存在请先设置tcpdump脚本在{} 路径下,file.getPath());return;}try{ListStringvaluesFileUtils.readLines(file,StandardCharsets.UTF_8);for(Stringvalue:values){System.out.println(value);}Stringcmdsh DIRECTORYtcpdump.sh;LOGGER.info(开始执行脚本抓包 cmd{},cmd);Runtime.getRuntime().exec(cmd);parsePacket(DIRECTORYFILE_LOG);}catch(Exceptione){LOGGER.warn(抓包失败,e);}}/** * 解析数据包 * * param filePath */OverridepublicvoidparsePacket(StringfilePath)throwsIOException,InterruptedException{Thread.sleep((60*60100100)*1000);FilefilenewFile(filePath);if(!file.exists()||!file.isFile()){LOGGER.info(文件不存在 filePath{},filePath);return;}if(file.length()0){LOGGER.info(文件为空 filePath{} len{},filePath,file.length());file.delete();return;}StringfilterBaselength ;StringfilterStrfilterBase22;booleanisFilterfalse;SetStringloginValueSetSets.newHashSetWithExpectedSize(100);Matchermatchernull;StringBuffersbnewStringBuffer();ListStringlinesFileUtils.readLines(file,StandardCharsets.UTF_8);for(Stringline:lines){if(StringUtils.isEmpty(line)){continue;}if(line.contains(filterStr)){isFiltertrue;}elseif(line.contains(filterBase)){isFilterfalse;if(sb.length()0){matcherV1_DUMP_MSG_PATTERN.matcher(sb.toString().toUpperCase());if(matcher!nullmatcher.find()){loginValueSet.add(matcher.group(0));}sb.setLength(0);}}if(isFilterline.startsWith(\t0x)line.contains(:)!line.endsWith(:)){sb.append(line.split(:)[1].trim().replace( ,));}}if(loginValueSet.isEmpty()){LOGGER.info(当前抓包文件未抓包到登录包 );file.delete();return;}byte[]bytesnull;ByteBufbufnull;MapString,StringimeiLoginDumpMapMaps.newHashMapWithExpectedSize(100);for(StringloginDump:loginValueSet){if(StringUtils.isEmpty(loginDump)){continue;}try{bytesByteUtil.hexStringToByte(loginDump);bufUnpooled.buffer(bytes.length);buf.writeBytes(bytes);buf.skipBytes(3);if(buf.readByte()!0x01){//如果不是登录包直接过滤continue;}if(buf.readableBytes()8){//数据包不完整continue;}imeiLoginDumpMap.put(ByteUtil.bytesToHexString(CodecUtils.getArray(buf,8)),loginDump);}catch(Exceptione){LOGGER.warn(数据包解析失败 loginDump{},loginDump);}}if(imeiLoginDumpMap.isEmpty()){LOGGER.info(未解析出正确的登录包);return;}SetStringwriteSetsSets.newHashSetWithExpectedSize(imeiLoginDumpMap.size());for(Map.EntryString,StringimeiDumpEntry:imeiLoginDumpMap.entrySet()){writeSets.add(imeiDumpEntry.getKey(),imeiDumpEntry.getValue());}filenewFile(DIRECTORYFILE_LOGIN);if(!file.exists()){file.createNewFile();}FileUtils.writeLines(file,writeSets,true);}}tcpdump是一个命令行下的网络抓包工具它允许用户拦截和显示发送到或来自连接到该计算机的TCP/IP和其他数据包。以下是tcpdump的一些常用参数及其说明-i指定网络接口。例如要监听eth0接口上的流量可以使用tcpdump -i eth0。如果不指定这个参数tcpdump将默认使用系统上的第一个网络接口1。-n关闭DNS反解析。在数据包分析过程中将会显示IP地址而不是主机名1。-c指定要抓取的数据包数量。例如要抓取前10个包可以使用tcpdump -c 101。-q将输出信息显示在一行中而不是多行。这有助于减少输出的数量和复杂度1。-A以ASCII格式打印数据包的内容。这对于跟踪邮件、HTTP请求和其他应用程序非常有用1。-X以十六进制格式打印数据包的内容。这对于跟踪二进制协议非常有用1。-s指定要捕获的数据包的大小。例如要限制捕获包的大小为100字节可以使用tcpdump -s 1001。-w将输出数据包保存到文件中而不是输出到控制台。例如要在文件中保存捕获的流量可以使用tcpdump -w packets.pcap1。-e在输出行中打印出数据链路层的头部信息包括源mac和目的mac以及网络层的协议23。-t显示时间戳tttt显示更详细的时间2。-v输出一个稍微详细的信息例如在IP包中可以包括TTL和服务类型的信息。使用-vv或-vvv可以显示更详细的信息23。-F从指定的文件中读取抓包的表达式2。-r从文件中读取数据包这些包一般通过-w选项产生23。此外tcpdump还支持使用逻辑运算符如and、or、not和条件如host、port、net等来构建复杂的过滤表达式以便精确地捕获所需的数据包2。请注意tcpdump是一个功能强大的工具但在高流量场景下使用它可能会影响系统性能。在生产环境中使用时请务必谨慎2。另外如果可能的话最好结合其他工具如Wireshark对捕获的数据包进行进一步的分析和可视化2。