社会工程学

手机号归属地查询与社工接口:多维度信息收集工具链解析

2026-07-05 #python

本文仅供合法授权的安全研究与学习使用,请勿用于非法用途。读者应确保行为符合当地法律法规。

前言

在红队信息收集阶段,手机号码是一个关键的信息枢纽。通过手机号可以关联出归属地、运营商、社交账号注册状态等多维度信息,为后续的社会工程学攻击提供精准的目标画像。

本文基于真实的Python项目源码,解析手机号归属地查询的本地数据方案和在线API方案,并扩展探讨社工接口查询(QQ号信息查询)、社交媒体注册检测、IP/用户名追踪等社工辅助工具的实现原理。这些工具共同构成了一个完整的社会工程学信息收集工具链。

技术背景

手机号段与归属地映射

中国大陆手机号码为11位,前3位为运营商号段,中间4位为HLR(归属位置寄存器)标识,后4位为用户号码。不同的号段前缀对应不同的运营商:

  • 移动:134-139、147-148、150-152、157-159、172、178、182-184、187-188、195、198
  • 联通:130-132、145-146、155-156、166-167、171、175-176、185-186
  • 电信:133、149、153、173-174、177、180-181、189、191、199

通过号段前缀和本地数据库(如SQL格式的归属地数据),可以快速查询手机号归属地,无需依赖在线API。

社工接口的获取与利用

社工接口通常来源于:

  • 第三方数据查询平台:提供QQ号、手机号等信息查询服务
  • APP抓包:通过抓包分析移动应用的网络请求,获取内部API
  • 网站接口复用:将正常网站的注册校验、密码找回等接口用于信息探测

phonenumbers库

Google开源的 phonenumbers 库提供了专业的电话号码解析功能,支持全球号码的格式化、归属地查询、运营商识别和有效性验证。

实现思路

整体工具链包含四个核心模块:

1
2
3
4
5
6
7
8
模块1:本地归属地查询(phone_location_Demo.py)
↓ 基于号段前缀 + SQL数据文件,统计归属地
模块2:社工接口查询(社工接口查询.py)
↓ 通过第三方平台API查询QQ号关联信息
模块3:社交媒体检测(ArgusScan.py)
↓ 检测手机号在各社交平台的注册状态
模块4:综合追踪(GhostTrack)
↓ IP追踪 + 电话号码解析 + 用户名跨平台搜索

核心代码解析

1. 本地手机号归属地查询

以下代码通过本地SQL数据文件,基于号段前缀统计归属地信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import subprocess
from collections import Counter

# 中国大陆三大运营商号段前缀
array = [
134, 135, 136, 137, 138, 139, 147, 148, 150, 151, 152, 157, 158, 159,
172, 178, 182, 183, 184, 187, 188, 195, 198, # 移动
130, 131, 132, 145, 146, 155, 156, 166, 167, 171, 175, 176, 185, 186, # 联通
133, 149, 153, 173, 174, 177, 180, 181, 189, 191, 199 # 电信
]

# 遍历所有号段前缀,从SQL文件中统计归属地
for i in array:
try:
with open('phone_location.sql', 'r', encoding='UTF-8') as file:
content = file.read()

# 筛选包含当前号段的行
grep_result = [line for line in content.split('\n') if f"'{i}'" in line]
# 提取每行的第8个字段(归属地信息)
awk_result = [line.split()[7] for line in grep_result]

# 统计归属地出现频率,取最常见的
count_result = Counter(awk_result)
most_common = count_result.most_common(1)

if most_common:
print(f"{most_common[0][1]} {most_common[0][0]}")
else:
print("No matches found")

except FileNotFoundError:
print("File not found: ./phone_location.sql")

设计思路解析

  • 数据源phone_location.sql 是一份包含号段-归属地映射的SQL数据文件,每行记录包含多个字段,第8个字段为归属地名称
  • 统计策略:同一号段前缀可能对应多个归属地(因号码分配历史),使用 Counter.most_common(1) 取出现频率最高的归属地作为结果
  • 全号段遍历:遍历所有运营商号段,生成完整的号段-归属地映射表
  • 模拟Shell管道:代码用Python列表推导式模拟了 grep | awk 的Shell管道操作,便于跨平台运行

2. 社工接口查询:QQ号信息探测

通过第三方平台API查询QQ号关联的手机号、归属地等信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import requests
from html import unescape

def qqNumberQueryBindingMobilePhone(qq_number: str):
"""
通过社工平台API查询QQ号绑定的信息
接口来源:抓包获取的平台API
"""
cookies = {
'PHPSESSID': 'd4439s79ogqeq420l6usjtbeb9',
}

headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'origin': 'https://qb.heikebook.com',
'referer': 'https://qb.heikebook.com/index',
'sec-ch-ua': '"Google Chrome";v="141", "Not?A_Brand";v="8"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
}

params = {'s': 'text.row'}

json_data = {
'text': qq_number,
'ai': False,
'sign': '0188bfe62c7948d5c4a970153c0a2c28', # 接口签名
}

response = requests.post(
'https://qb.heikebook.com/api/backend/public/',
params=params, cookies=cookies, headers=headers, json=json_data)

if response.status_code == 200:
json_data = response.json()
dataStr = json_data["data"]["str"]
# 清理HTML转义字符和换行标签
cleaned_str = unescape(dataStr).replace("<br>", "\n")
# 解析为结构化数据
return parse_query_result(cleaned_str)
else:
print(f"请求失败,状态码: {response.status_code}")
return None


def parse_query_result(result_str):
"""将查询结果字符串解析为结构化键值对"""
if isinstance(result_str, str):
lines = result_str.strip().split('\n')
parsed_data = {}
for line in lines:
if ':' in line: # 中文冒号分隔
key, value = line.split(':', 1)
parsed_data[key.strip()] = value.strip()
return parsed_data
return result_str

关键技术点

  • 接口签名sign 字段是平台用于验证请求合法性的签名,通常通过抓包获取
  • Session维持:通过 PHPSESSID Cookie维持会话状态
  • HTML清理:返回数据中包含 <br> 标签和HTML实体,需要用 unescape()replace() 清理
  • 结果解析:返回格式为”键:值”的文本行,通过中文冒号分割为字典

3. 社交媒体注册检测

检测手机号在各社交平台的注册状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import requests

def check_social_media(phone_number):
"""
检测手机号在各社交平台的注册状态
通过模拟注册/登录请求判断手机号是否已注册
"""
# 目标平台及其检测接口(需通过抓包获取真实接口)
services = {
"微信": "https://wx.qq.com/check_register",
"微博": "https://weibo.com/account/check",
}

results = {}
for platform, url in services.items():
try:
payload = {"phone": phone_number}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
response = requests.post(url, data=payload, headers=headers)
# 解析响应判断注册状态(需逆向工程具体平台)
if "已注册" in response.text:
results[platform] = True
else:
results[platform] = False
except Exception as e:
print(f"{platform}检测失败: {str(e)}")

return results

# 示例
print(check_social_media("13800138000"))

实现要点:不同平台的注册检测逻辑各不相同,需要针对每个平台进行逆向分析,模拟其注册/登录流程中的手机号校验请求。

4. 综合信息追踪工具(GhostTrack)

GhostTrack是一个综合性的信息追踪工具,集成了IP追踪、电话号码解析和用户名跨平台搜索功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import json
import requests
import phonenumbers
from phonenumbers import carrier, geocoder, timezone

@is_option
def IP_Track():
"""IP地址追踪 - 使用ipwho.is API"""
ip = input("输入目标IP: ")
req_api = requests.get(f"http://ipwho.is/{ip}")
ip_data = json.loads(req_api.text)

print(f"目标IP: {ip}")
print(f"国家: {ip_data['country']}")
print(f"城市: {ip_data['city']}")
print(f"纬度: {ip_data['latitude']}")
print(f"经度: {ip_data['longitude']}")
print(f"地图链接: https://www.google.com/maps/@{ip_data['latitude']},{ip_data['longitude']},8z")
print(f"ISP: {ip_data['connection']['isp']}")
print(f"组织: {ip_data['connection']['org']}")
print(f"时区: {ip_data['timezone']['id']}")

@is_option
def phoneGW():
"""电话号码追踪 - 使用phonenumbers库"""
User_phone = input("输入目标电话号码 [如 +8613xxxxx]: ")
parsed_number = phonenumbers.parse(User_phone, "CN")

# 归属地查询
location = geocoder.description_for_number(parsed_number, "zh")
# 运营商查询
jenis_provider = carrier.name_for_number(parsed_number, "en")
# 时区查询
timezone1 = timezone.time_zones_for_number(parsed_number)
# 有效性验证
is_valid = phonenumbers.is_valid_number(parsed_number)
# 号码类型
number_type = phonenumbers.number_type(parsed_number)

print(f"归属地: {location}")
print(f"运营商: {jenis_provider}")
print(f"时区: {', '.join(timezone1)}")
print(f"是否有效号码: {is_valid}")
print(f"国际格式: {phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)}")

@is_option
def TrackLu():
"""用户名跨平台搜索 - 检测用户名在各社交平台的注册情况"""
username = input("输入用户名: ")
social_media = [
{"url": "https://www.facebook.com/{}", "name": "Facebook"},
{"url": "https://www.twitter.com/{}", "name": "Twitter"},
{"url": "https://www.instagram.com/{}", "name": "Instagram"},
{"url": "https://www.github.com/{}", "name": "GitHub"},
{"url": "https://www.youtube.com/{}", "name": "Youtube"},
{"url": "https://www.tiktok.com/@{}", "name": "TikTok"},
{"url": "https://www.telegram.me/{}", "name": "Telegram"},
# ... 共23个平台
]

for site in social_media:
url = site['url'].format(username)
response = requests.get(url)
if response.status_code == 200:
print(f"[+] {site['name']}: {url}")
else:
print(f"[-] {site['name']}: 未找到")

功能矩阵

功能 技术方案 数据来源
IP追踪 HTTP API请求 ipwho.is
电话追踪 phonenumbers库 本地解析
用户名搜索 多平台HTTP探测 23个社交平台
自身IP HTTP API请求 api.ipify.org

5. 短信轰炸接口分析(解密.py中的扩展)

项目中还包含对短信验证码接口的逆向分析代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import requests

# 快手APP的验证码请求接口(通过抓包获取)
url = "https://apissl.gifshow.com/rest/n/user/requestMobileCode"

# 大量设备参数(模拟真实APP请求)
params = {
"mod": "OnePlus(ONEPLUS A3000)",
"appver": "13.1.20.40460",
"language": "zh-cn",
"kpf": "ANDROID_PHONE",
"sys": "ANDROID_10",
# ... 共40+个参数
}

headers = {
"User-Agent": "kwai-android aegon/4.3.2",
"Content-Type": "application/x-www-form-urlencoded",
}

# 请求体中包含目标手机号
data = {
"mobileCountryCode": "+86",
"mobile": "15066427783", # 目标手机号
"type": "27",
"client_key": "3c2cd3f3",
}

response = requests.post(url, params=params, headers=headers, data=data)
print(f"Status Code: {response.status_code}")
print(f"Response Body: {response.text}")

分析要点:APP的API请求通常包含大量设备指纹参数(机型、系统版本、设备ID等),需要通过抓包完整获取。这些接口如果缺乏频率限制,可能被滥用于短信轰炸攻击。

使用方法与运行效果

本地归属地查询

确保 phone_location.sql 文件存在,运行脚本即可生成全号段归属地映射:

1
python phone_location_Demo.py

输出示例:

1
2
3
4
351 广东省广州市
287 北京市
198 上海市
...

QQ号信息查询

1
2
3
4
qq_number = "172683008"
result = qqNumberQueryBindingMobilePhone(qq_number)
print(result)
# 输出示例: {'QQ号': '172683008', '手机号': '138****1234', '归属地': '广东广州'}

综合追踪

1
2
3
4
python GhostTR.py
# 选择 1: IP追踪
# 选择 3: 电话号码追踪
# 选择 4: 用户名追踪

防御对策

  1. API频率限制:所有涉及用户信息查询的接口必须实施严格的频率限制(如每IP每小时最多10次查询),并配合验证码机制防止自动化枚举
  2. 接口签名保护:内部API应使用动态签名(时间戳+nonce+HMAC),避免静态签名被逆向复用
  3. 设备指纹验证:APP接口应验证设备指纹的完整性和一致性,检测模拟器、Hook框架等异常环境
  4. 短信发送限制:验证码短信接口必须限制同一手机号的发送频率(如每分钟1次、每天5次),并对同一IP的发送总量设限
  5. 信息脱敏:第三方数据查询平台返回的信息应做脱敏处理(如手机号中间四位打码),避免完整信息泄露
  6. 跨平台账号关联防护:社交平台的注册检测接口应增加行为验证(如滑块验证码),防止批量手机号注册状态探测
  7. 日志审计与告警:监控异常的API调用模式,如短时间内大量查询不同QQ号、手机号等行为应自动告警

总结

本文从手机号归属地查询出发,延伸到社工接口利用、社交媒体检测、综合信息追踪等社工辅助工具,呈现了一个完整的社会工程学信息收集工具链。

核心技术要点包括:基于本地SQL数据的号段归属地统计、通过抓包获取第三方平台API进行信息查询、利用phonenumbers库进行专业电话号码解析、以及跨平台用户名搜索。这些工具的组合使用,可以从一个手机号或QQ号出发,逐步构建出目标的完整信息画像。

从防御角度看,信息收集阶段的防护核心在于接口防护——频率限制、验证码、签名校验、设备指纹验证等多层防护措施缺一不可。同时,用户层面的安全意识教育(如减少在各平台公开个人信息、使用不同的用户名等)同样重要。

红队社工工具的开发和使用,最终目的是帮助组织发现自身在信息泄露和接口防护方面的薄弱环节,从而有针对性地加强安全建设。

评论
分享