第二章:环境搭建——实验室网络拓扑设计、开源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模式,用于外网访问测试(可选)

下面这张图是我自己画的一个简化拓扑,你看一眼就明白了:

实验室IMS攻击测试网络拓扑 攻击机 Kali Linux 192.168.1.100 虚拟交换机 VMnet2 (Host-Only) 192.168.1.0/24 IMS核心网 Kamailio+Freeswitch 192.168.1.10 靶机 Ubuntu + SIP客户端 192.168.1.20 SIP信令 SIP/RTP 注册/呼叫

小提示:如果你用的是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 环境验证

所有组件装完后,做一次端到端验证:

  1. 在靶机上启动Linphone,注册到Kamailio
  2. 在攻击机上用sipvicious扫描:svmap.py 192.168.1.10
  3. 用Wireshark抓包,确认REGISTER和200 OK消息正常交互
  4. 尝试拨打内部号码(1001打1002),确认RTP媒体流建立

如果注册失败,先检查网络连通性:ping 192.168.1.10。如果ping通但注册失败,八成是Kamailio的数据库配置问题。我遇到过最离谱的一次,是MySQL的字符集没设对,导致ha1密码校验失败——折腾了两天才发现。

最后说一句:环境搭建别急,一步一步来。每完成一个组件,就做一次小验证。等所有组件都通了,后面的攻击测试才能顺利进行。嗯,这一章的内容就到这里,下一章我们开始真正的攻击实战。


专注资料整理