第二章:环境搭建——实验室网络拓扑设计、开源IMS核心网部署、攻击机与靶机准备
说实话,做电信安全测试,最头疼的不是攻击手法本身,而是环境搭建。我见过太多人,工具装了一整天,最后发现网络不通,连SIP注册都失败。嗯,这一章我们就来把地基打牢。
2.1 实验室网络拓扑设计
先说说网络拓扑。我个人习惯,实验室网络要满足三个条件:隔离性、可控性、可复现性。说白了,你不能把实验流量跑到生产网里去,也不能每次重启IP就变了。
我推荐用VMware Workstation或者VirtualBox,搭建一个扁平化的内部网络。为什么用扁平?因为IMS的信令流程本身就够复杂了,别再让路由折腾你。
核心拓扑结构:
- 攻击机:Kali Linux,IP: 192.168.1.100/24
- IMS核心网:Kamailio + Freeswitch,IP: 192.168.1.10/24
- 靶机:Ubuntu Server + SIP客户端,IP: 192.168.1.20/24
- 网关:NAT模式,用于外网访问测试(可选)
下面这张图是我自己画的一个简化拓扑,你看一眼就明白了:
小提示:如果你用的是VMware,记得把虚拟网卡的「网络连接」设为「仅主机模式」。我曾经用NAT模式折腾了一下午,发现Kamailio总是注册失败——因为NAT把源IP改了。
2.2 开源IMS核心网部署(Kamailio + Freeswitch)
IMS核心网是整个实验环境的心脏。我选Kamailio做SIP代理/注册服务器,Freeswitch做媒体服务器。为什么这么搭?Kamailio轻量、灵活,适合做信令控制;Freeswitch媒体处理能力强,适合做B2BUA和媒体转发。
2.2.1 Kamailio安装与配置
Kamailio的安装其实不复杂,但坑不少。我建议用源码编译,这样你能控制每个模块的版本。
# 安装依赖
apt-get update
apt-get install -y git gcc g++ flex bison libmysqlclient-dev \
libssl-dev libcurl4-openssl-dev libxml2-dev libpcre3-dev
# 下载源码
git clone https://github.com/kamailio/kamailio.git
cd kamailio
git checkout 5.6.0
# 编译安装
make cfg
make all
make install
安装完成后,重点在配置文件 /usr/local/etc/kamailio/kamailio.cfg。这里我直接给一个最小可用的配置,你照着改就行:
#!KAMAILIO
# 全局配置
debug=3
log_stderror=no
log_facility=LOG_LOCAL0
# 监听地址
listen=udp:192.168.1.10:5060
listen=tcp:192.168.1.10:5060
# 数据库配置
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
loadmodule "db_mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("usrloc", "db_url", "mysql://kamailio:kamailiorw@localhost/kamailio")
modparam("auth_db", "db_url", "mysql://kamailio:kamailiorw@localhost/kamailio")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
# 路由逻辑
route {
if (!mf_process_maxfwd_header(10)) {
sl_send_reply("483", "Too Many Hops");
exit;
}
if (is_method("REGISTER")) {
if (!auth_check("$fd", "subscriber", "1")) {
auth_challenge("$fd", "0");
exit;
}
save("location");
exit;
}
if (is_method("INVITE")) {
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
exit;
}
t_relay();
exit;
}
}
注意:数据库初始化别忘了。运行 kamdbctl create 创建数据库,然后添加测试用户。我曾经忘了这步,结果所有注册都返回「403 Forbidden」,排查了半小时才发现是数据库里没用户。
2.2.2 Freeswitch安装与配置
Freeswitch负责媒体处理。安装同样推荐源码编译:
# 安装依赖
apt-get install -y autoconf automake libtool libjpeg-dev \
libncurses5-dev libtiff-dev libpng-dev libsqlite3-dev
# 下载源码
git clone https://github.com/signalwire/freeswitch.git
cd freeswitch
git checkout v1.10.9
# 编译安装
./bootstrap.sh
./configure
make
make install
配置Freeswitch与Kamailio对接,关键在 conf/sip_profiles/internal.xml:
<include>
<gateway name="kamailio">
<param name="username" value="freeswitch"/>
<param name="password" value="freeswitchpass"/>
<param name="proxy" value="192.168.1.10:5060"/>
<param name="register" value="true"/>
<param name="register-transport" value="udp"/>
<param name="context" value="public"/>
</gateway>
</include>
避坑指南:Freeswitch默认会监听5060端口,和Kamailio冲突。记得把Freeswitch的SIP端口改成5062,或者在Kamailio里做端口转发。我一般把Freeswitch的internal profile改成5062,然后在Kamailio里配置dispatcher模块做负载分发。
2.3 攻击机Kali Linux配置
Kali Linux作为攻击机,需要安装SIP测试工具。我个人常用的工具有这些:
| 工具名称 | 用途 | 安装命令 |
|---|---|---|
| sipvicious | SIP扫描、枚举、爆破 | apt install sipvicious |
| sipp | SIP性能测试、协议模糊 | apt install sipp |
| Metasploit | 辅助模块(SIP扫描、DoS) | apt install metasploit-framework |
| Wireshark | SIP/RTP流量分析 | apt install wireshark |
| Nmap | 端口扫描、服务探测 | apt install nmap |
安装完成后,验证一下工具是否正常:
# 测试sipvicious
svmap.py 192.168.1.0/24
# 测试sipp
sipp -sn uac 192.168.1.10:5060
# 测试Wireshark能否抓取SIP包
tshark -i eth0 -f "port 5060"
我的经验:Kali默认不带sipvicious,需要手动装。而且sipvicious的Python版本要注意——Python3版本叫sipvicious,Python2版本叫svmap。我建议直接用Python3版本,兼容性更好。
2.4 靶机环境准备
靶机我选Ubuntu Server 20.04,装一个SIP客户端软件。为什么不用Windows?因为Linux下调试方便,抓包、改配置都顺手。
2.4.1 安装SIP客户端
推荐用Linphone或者Jitsi,这两个都支持SIP协议,而且开源免费。
# 安装Linphone
apt-get install linphone
# 或者安装Jitsi(需要手动下载deb包)
wget https://download.jitsi.org/jitsi-desktop/linux/jitsi-desktop_2.10.5550-1_amd64.deb
dpkg -i jitsi-desktop_2.10.5550-1_amd64.deb
2.4.2 配置SIP账号
在Kamailio里先创建用户:
# 登录MySQL
mysql -u kamailio -p
# 添加用户
INSERT INTO subscriber (username, domain, password, ha1)
VALUES ('1001', '192.168.1.10', 'test123',
MD5('1001:192.168.1.10:test123'));
INSERT INTO subscriber (username, domain, password, ha1)
VALUES ('1002', '192.168.1.10', 'test123',
MD5('1002:192.168.1.10:test123'));
然后在Linphone里配置:
- SIP地址:
sip:1001@192.168.1.10 - 密码:
test123 - 代理服务器:
192.168.1.10:5060 - 传输协议:UDP
注意:靶机的防火墙要放行SIP端口。Ubuntu默认的ufw是关闭的,但如果你开了,记得加规则:ufw allow 5060/udp。另外,RTP媒体端口范围是10000-20000,也要放行,否则通话只有信令没有声音。
2.5 环境验证
所有组件装完后,做一次端到端验证:
- 在靶机上启动Linphone,注册到Kamailio
- 在攻击机上用sipvicious扫描:
svmap.py 192.168.1.10 - 用Wireshark抓包,确认REGISTER和200 OK消息正常交互
- 尝试拨打内部号码(1001打1002),确认RTP媒体流建立
如果注册失败,先检查网络连通性:ping 192.168.1.10。如果ping通但注册失败,八成是Kamailio的数据库配置问题。我遇到过最离谱的一次,是MySQL的字符集没设对,导致ha1密码校验失败——折腾了两天才发现。
最后说一句:环境搭建别急,一步一步来。每完成一个组件,就做一次小验证。等所有组件都通了,后面的攻击测试才能顺利进行。嗯,这一章的内容就到这里,下一章我们开始真正的攻击实战。