ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

进制转换:开源网络情报分析中必学的底层基本功

进制转换:开源网络情报分析中必学的底层基本功 做开源网络情报OSINT这一行最容易被低估的一项基本功说出来你可能不信是进制转换。我最早意识到这件事是在处理一份公开的HTTP访问日志时。日志里某条记录的用户代理字段是一长串十六进制编码我盯了半天没看出门道旁边的老同事扫了一眼就说“这是Unicode转义后的中文User-Agent后面那串0x开头的是IPv6地址。”那次之后我才明白做情报分析不是天天跟漂亮的报表打交道更多时候是在跟二进制、十六进制、八进制这些“底层语言”缠斗。无论是解析网络包里的协议字段、识别文件头魔数、还是还原被编码掉的IP和端口进制转换永远是那个躲不开的前置步骤。这篇文章就围绕“开源网络情报”和“进制转换”这两个关键词展开把我这些年实际用到的场景、踩过的坑、以及可以直接照抄的换算技巧完整梳理一遍。适合刚开始接触OSINT、或者在数据分析中经常跟原始字节打交道的朋友也适合那些想把基础打牢的渗透测试和网络运维人员。1. 为什么情报分析工作台上必须常备进制转换能力很多人觉得进制转换是中学数学课的残留记忆工作里顶多写代码时用用。但在开源网络情报这个领域它是一门贯穿始终的必修课。因为公开渠道里能拿到的原始数据几乎不以“人类友好”的形态出现。1.1 开源情报工作流中原始数据从不以十进制示人情报分析的核心流程是采集公开数据、清洗格式化、提取关键信息、交叉验证、形成结论。听起来每一步都跟进制没关系但真正落地的细节里全是进制。举个例子。你在一个公开泄露的数据库文件中看到一条记录写着mac: c8:3a:35:1f:2e:9d这三段字符是什么它是网卡的物理地址用十六进制表示。厂商代码c8:3a:35对应哪家设备厂商你查OUI库就知道。再比如抓包分析里最常见的TLS握手ClientHello里的Session ID是一串十六进制字节QUIC的初始数据包更是直接用二进制流传输。如果你没有在脑子里快速完成“十六进制字节串转ASCII字符串”的能力光是辨认协议内容就会卡住半天。还有一个更隐蔽的场景恶意软件分析。很多公开威胁情报报告比如OTX、AlienVault的数据会贴出恶意样本的Hex dump片段。其中PE文件的MZ头、DOS头字段里的e_lfanew偏移量是四字节十六进制需要结合大小端规则换算成十进制才能定位到真正的PE头。你要是连0x3c 60这种基础换算都要停下来想分析节奏会非常拖拉。我不是说所有OSINT分析都要从字节层面硬啃但至少在这样几个节点上进制转换能力是刚性需求解析IP地址和端口号尤其是IPv6、十六进制端口表示还原被编码的字符串比如URL编码、Base64之后的十六进制视图、Unicode转义识别文件类型和协议特征靠的是文件头魔数File Magic Number分析Linux日志、权限位、时间戳等系统痕迹数据。1.2 二进制、十六进制、八进制三种不强调却天天碰到的形态先把这个基础矩阵摆在桌上。计算机底层只认二进制但人在处理大段0和1时效率太低于是用八进制和十六进制作为缩写。它们之间的转换本质上都是按位分组二进制转十六进制每4位二进制数对应1位十六进制数因为2的4次方等于16二进制转八进制每3位二进制数对应1位八进制数因为2的3次方等于8十六进制转十进制按位权展开。实际情报分析中接触最多的前五种形态如下表数据形态典型进制常见来源IP地址十进制点分形式实为二进制分组网络日志、抓包网卡MAC地址十六进制ARP缓存、DHCP记录文件头魔数十六进制文件识别、恶意样本分析端口号十进制为主偶见十六进制协议解析、扫描工具输出Linux权限位八进制/二进制服务器日志、容器配置这里要特别提醒一下进制转换不是计算题而是模式识别。熟练的人看到0x50的第一反应不是“算一下等于多少”而是“80HTTP端口”。看到0x1F就知道是31因为这是常见的TTL初始值。这种模式识别的积累就是在一次次真实数据处理中沉淀出来的。后面我会专门给出心算技巧和速查表。2. 最容易踩坑的四个进制场景IP、端口、字符与权限位踩坑这件事光说“要会进制转换”太虚了。我把OSINT分析中真正高频、且容易翻车的四个具体场景挨个拆开讲每个场景都给出实际案例和换算过程。2.1 IP地址其实是四段八位二进制的十进制投影IP地址最大的迷惑性在于它看起来是十进制但本质上是一段32位二进制按8位一组切开后的“十进制投影”。比如192.168.1.1对应的二进制是11000000.10101000.00000001.00000001每一段8位二进制恰好是0到255这就是为什么IP段取值范围必须在0到255之间。在OSINT分析中这个二进制视角有什么用三个直接应用第一子网计算。/24表示前24位固定后面8位可用。如果你把IP转成二进制一眼就能看出来哪些地址属于同一个网段不需要依赖子网计算器。第二TTL猜测绕过。有些设备会修改TTL初始值来伪装操作系统但如果你懂得TTL字段在IP头里的十六进制偏移位置可以直接解析原始数据包字节绕开伪造。TTL常见值如下操作系统初始TTL十进制十六进制Linux640x40Windows1280x80Cisco路由器2550xFFSolaris2550xFF第三IP混淆还原。部分公开数据库里存的IP是整数形式比如3232235777就是192.168.1.1的十进制整数。换算方法是每段依次乘上256的幂192*256^3 168*256^2 1*256 1 3232235777反向拆分时不断除以256取模就能还原。这个技巧在处理Wireshark导出数据、MaxMind IP库时非常常用。2.2 端口扫描结果里的十六进制与十进制换算陷阱端口这块的坑最常见的是两类。第一类是扫描工具输出十六进制端口。有些Nmap的XML输出或自定义扫描脚本里端口号以0x0050这种形式出现。0x0050换成十进制就是80但很多人直接把0x0050当成50处理差出30个端口号。换算方法很简单十六进制转十进制0x0050 5*16 0 80。如果端口是0x01BB那就是1*256 11*16 11 443。第二类是协议头部里以两字节十六进制存的端口。TCP首部中源端口和目的端口各占16位抓包看到的原始字节是00 50这就是端口80。需要特别注意的是抓包工具如果配置了小端解析显示的是50 00转出来就是 20480一旦搞错方向整个端口判断就废了。大小端问题我在第5部分专门讲。我自己的习惯是只要涉及端口字节解析一律先把十六进制转二进制再按大端组装成十进制走完一遍全流程不凭感觉跳步。2.3 ASCII/Unicode为什么“41”既是十六进制标识又是字母A字符编码是OSINT字符串分析里最容易产生迷惑的地方。0x41在十六进制语境下是十进制的65而在ASCII码表里65恰好对应大写字母A。也就是说同一个数字在不同解读规则下指向完全不同的含义。实际的坑长这样在分析一段公开的窃密日志时攻击者把邮箱地址做了一次简单“十六进制化”也就是每个字符替换成其ASCII码的十六进制表示。testexample.com变成74 65 73 74 40 65 78 61 6D 70 6C 65 2E 63 6F 6D如果你直接把整串拼一起看成74657374406578616D706C652E636F6D然后当成一个大数去转十进制那是死路一条。正确做法是按每两个十六进制字符一组还原出ASCII码再做字节到字符的映射。这个“每两个hex字符对应一个字节”的直觉可以说是OSINT里最重要的数字敏感度之一。类似地Unicode转义\u4e2d\u6587表示中文\u后面的四位十六进制是码点值转换成十进制为20013和25991查表就能还原出“中文”两个字。分析国际社交平台上的伪装字符串、混淆ID时这种还原能力几乎每周都用得上。2.4 Linux文件权限位chmod 755背后的二进制逻辑文件权限看起来跟网络情报八竿子打不着但凡是分析泄露的服务器配置、容器镜像、或者恶意脚本打包文件时权限位一直是判断文件“行为意图”的重要指标。chmod 755其实是三个八进制数755。八进制转换到二进制是三位一组的7 111 读写执行 5 101 读执行 5 101 读执行所以755表示文件所有者可读可写可执行组内用户可读可执行其他用户可读可执行。如果你在分析一个从公开渠道抓到的可疑Shell脚本发现它被设置成777所有人可写可执行这通常意味着它可能是投放给多个受害者的恶意工具或者作者根本不关心文件安全属性。这类细节在威胁情报关联分析中很有参考价值。3. 一整套可直接落地的进制转换工具链与心算技巧理论说完了来点能直接抄作业的。我这些年用得最顺手的进制换算方式分三类命令行工具、Python交互式、纯心算。3.1 命令行三件套printf、bc、python做OSINT免不了要在终端环境里快速验证一个数值。我的第一选择永远是系统自带的工具不额外装任何东西。printf适合快速查ASCII码值和十六进制# 十进制65转十六进制 printf %x\n 65 # 十六进制41转十进制 printf %d\n 0x41 # 十进制转ASCII字符 printf \\$(printf %03o 65)\nbc适合处理任意进制互转因为它允许你指定输入的进制# ibase是输入进制obase是输出进制 echo ibase16; obase2; 41 | bc # 反过来把二进制1111转十六进制 echo ibase2; obase16; 1111 | bc但bc有个坑一旦设置了ibase16后面的数字都按十六进制读包括obase里的数字。所以如果你想从十六进制转二进制最好这样写echo obase2; ibase16; 41 | bc把obase放在ibase前面可以避开歧义。Python更适合处理批量转换和带字符串还原的复杂场景# 十六进制字符串转ASCII bytes.fromhex(74657374406578616D706C652E636F6D).decode(ascii) # ASCII转十六进制 testexample.com.encode(ascii).hex() # 十六进制转十进制 int(41, 16) # 十进制转十六进制、二进制、八进制 hex(65) # 0x41 bin(65) # 0b1000001 oct(65) # 0o1013.2 不需要工具的“8421法”与四位分组法心算终端不是随时都有但脑子一定随时在线。掌握两个心算技巧大部分进制换算可以在五秒内完成。第一个技巧是对应十六进制的“8421法”。十六进制的每一位都对应四位二进制位权依次是8、4、2、1。看到十六进制A十进制10拆成二进制就是1010因为8210。看到F就是1111因为842115。这个方法反向从二进制读十六进制同样好用看到1101拆成840113即十六进制D。第二个技巧是四位分组法专门用于二进制与十六进制互转。把二进制从右往左每4位一组每组转成一个十六进制字符。例如二进制110100111101 0011 D 3结果就是0xD3。反过来十六进制0xD3转二进制就是1101 0011。在做IP和MAC地址二进制还原时这套方法比任何工具都快。至于十六进制直接转十进制我的建议是不能纯算要靠“就近已知点”快速逼近。比如你知道0x40是64、0x50是80、0x80是128、0xFF是255看到0x55就能立刻推出来是85因为0x50是80再加5。用得多了这些数字会变成肌肉记忆不需要每次再从乘法开始。3.3 常见用途速查表IP、端口、文件签名魔数再送一张我在实际工作中反复对照的速查表覆盖了OSINT分析里最常撞见的十六进制模式和它们对应的含义十六进制片段十进制/含义场景0x36 0x4054 64Linux TTL常见初始值0x00 0x5080HTTP端口0x01 0xBB443HTTPS端口0x50 0x4BPKZIP文件头0x25 0x50%PPDF文件头0x89 0x50不合规的PNG开头变体伪装图片0x7F 0x45 0x4C 0x46ELF魔数Linux可执行文件0x4D 0x5AMZWindows PE文件头文件头魔数这块值得多说一句。OSINT分析中经常要判断一个下载的文件到底是什么扩展名完全可以伪造。但你不需要打开文件只需要用xxd或hexdump看一眼前几个字节xxd -l 4 suspicious_file.bin看到7f 45 4c 46就能确认是ELF可执行文件看到50 4b 03 04就是ZIP压缩包。后面无论做字符串提取还是动态分析方向都不会错。4. 实战复盘一段十六进制字符串如何还原出用户真实环境信息理论、工具、速查表都备齐了现在用一次完整的实战过程把它们串起来。我在工作中遇到过一个很有代表性的场景信息源是某公开论坛上发布的一段疑似被泄露的HTTP请求日志其中一部分字段被做了十六进制编码。目标是还原关键操作者的网络环境信息。4.1 原始数据形态与初步判断拿到的原始片段长这样POST /api/v1/auth/login HTTP/1.1 Host: 0x6630302d6162633132332e6578616d706c652e636f6d User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 X-Forwarded-For: 0xC0A80163第一眼就看到两个刺眼的字段Host字段和X-Forwarded-For字段都以0x开头显然是做了十六进制编码。X-Forwarded-For通常是客户端真实IP这个必须还原。Host是域名一样要还原。这种用0x前缀标注的编码形式在公开日志里其实挺常见既不像Base64那样一眼能认出也不是标准加密更像是为了规避简单的字符串过滤规则而做的临时混淆。分析思路很简单遇到这类字段先判断是“纯十六进制大数”还是“按字节切分的字符串编码”。4.2 分步还原十六进制片段、TTL与设备信息先处理Host。把0x前缀去掉得到6630302d6162633132332e6578616d706c652e636f6d双字符为一组切分66 30 30 2d 61 62 63 31 32 33 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d拿去对照ASCII码表66是f30是02d是-2e是.。整体还原出来就是f00-abc123.example.com。这个子域名带着模糊化的痕迹明显是论坛用户故意改过的隐藏值但格式特征保留了下来。再处理X-Forwarded-For。0xC0A80163拆成四个字节C0 A8 01 63。把每一节十六进制转十进制C0 192 A8 168 01 1 63 99结果就是192.168.1.99。到这一步如果你记得住私有网段知识192.168.0.0/16是私网地址段就能立刻判断这个用户来自内网环境流量经过了某种内网代理或网关。这个判断如果结合日志里的其他字段继续往下挖可以进一步锁定来源墙。顺手看一眼响应包里另一个字段日志下方有一行TCPDUMP片段IP 45 00 00 3c 1c 46 40 00 40 06 b8 3e c0 a8 01 63解析IP头45表示IPv4、IHL为5个32位字40是TTL字段十六进制转十进制就是64直接指向Linux系统。如果你看到的是80那就是Windows。再结合User-Agent里的Chrome 120和Windows NT 10.0你能立刻发现TTL说Linux、UA说Windows二者矛盾。要么日志里的数据来自不同时间戳的拼接要么这个用户用了改TTL的工具。这就是交叉验证的起点。4.3 把“数字游戏”升级为情报进制转换算基础关联分析才是目的上面的还原做完你会得到一个关键结论进制转换只是解锁数据的第一步真正产生情报价值的是把还原后的信息放到上下文里做关联。比如还原出的192.168.1.99是私网IP它的情报价值不在IP本身而在于它告诉你访问者位于内网且经过代理。再配合Host域名里f00-abc123的格式特征你可以在多个公开泄露库中搜索相同格式的域名模式判断是否为同一人注册的系列资产。做OSINT的人必须警惕一种倾向沉迷于“把十六进制变成十进制”的解题快感。转换是手段不是目的。只要每一条换算出来的数字都能进入下一个分析环节——关联、画像、溯源——它才真正产生了情报意义。如果只是把IP、端口、字符串都还原了却停留在罗列数据那跟跑了一遍计算器没有区别。5. 边界情况、易混淆点与我的长期经验最后的最后整理几个我反复碰见、容易翻车的边界情况和长期总结出来的经验。这些不是教材上会写的东西全是真金白银踩出来的。5.1 大端与小端为什么0x1234会被读成0x3412如果说进制转换里有一个最隐蔽的杀手大小端字节序绝对排第一。同一个十六进制数0x1234在内存里可能存成大端Big-Endian12 34小端Little-Endian34 12x86架构、大多数Windows系统默认使用小端网络协议RFC 791 IP头统一规定使用大端字节序。这意味着你在Wireshark里看到的端口00 50是大端必须正着读而在分析某个Windows内存转储文件时看到的四字节整数63 01 00 00却是小端需要倒过来读成0x163十进制为355。这个坑在分析恶意软件样本、解析自有软件日志、读取二进制配置时特别容易中招。我的解决方法是固定套路凡是遇到多字节整数字段先确认数据来源的字节序规则再决定是否翻转。没有上下文之前绝不直接按十六进制正序转十进制。5.2 进制转换不是万能的编码不等于加密另一个最常见的误解是把编码和加密混为一谈。十六进制、Base64、URL编码都只是编码它们是公开规则任何人拿到都能反解不提供任何保密性。分析的时候要清醒一个字段用了十六进制编码不代表它就是用来隐藏机密信息的更多时候只是格式问题。有一个真实的教训我曾在一个公开数据集里看到一大串十六进制花了一个多小时转ASCII、转Unicode、甚至尝试了多种字符编码猜测最后发现它是图片文件头的部分二进制数据压根没有任何隐含信息。从那以后我给自己定了一条规矩先判断制定者意图再决定解读深度。如果字段出现在预期应该是人类可读文本的地方却被编码了这才是值得深挖的信号。5.3 经验培养“数字形状记忆”两秒内判断一个字符串属于哪种进制长期做这行我最大的体会是进制转换领域的“高手”不在于计算速度快而在于模式识别能力强。看到0x前缀知道是十六进制看到一串由0和1组成的定长字符串先想是不是二进制看到一串字母数字混合但只有a-f出现且长度成偶数基本就是十六进制字节流。这种敏感度是怎么练出来的我的方法很土但有效在笔记本里常驻一张速查表把常见端口、常见TTL、常见文件魔数、常见ASCII关键字符全部做成一个随时能翻的表格每次遇到数据都先尝试归类而不是硬算。练了几个月之后这些数字会变成一种“形状记忆”一眼扫过去你心里自动跳出它可能的含义。5.4 合规提醒只分析公开渠道获取的数据最后提一个贯穿所有工作的底线问题。开源网络情报OSINT顾名思义数据来源必须是公开渠道——公开论坛、公开数据集、官方接口、合法抓取的网页内容。所有进制转换、编码还原、信息关联都必须在这个前提下展开。遇到来源不明或非法获取的数据不管它藏了多少“有意思”的十六进制都不要碰。这一行最值钱的能力不是技术技巧本身而是判断哪些数据碰得、哪些碰不得。守住这条线下面的所有技巧才有讨论的意义。
返回列表