前言
不久之前,黑客组织ShadowBrokers(影子经纪人)曾声称他们从EquationGroup(方程式组织)那里窃取来了大量的黑客工具,并且他们还将部分工具放在网上进行拍卖。
近日,Vectra公司的安全研究专家NickBeauchesne对其中的一份泄漏文件进行了分析,并且发现了一个名叫“NOPEN”的Unix远程管理工具(RAT)。
Nick Beauchesne说到:
“当我在对方程式组织泄漏的文件以及黑客工具进行分析时,我发现了一些非常有意思的东西,而这些东西似乎没有得到它们应得的关注。虽然很多安全研究专家将他们的注意力全部放在了那些潜在的0day漏洞上,但是我认为我们应该还可以从这些泄漏文件中了解到方程式组织的攻击手法和操作模式,毕竟这是全世界最危险的黑客组织之一。”
NOPEN-针对Unix系统的远程管理工具(RAT)
根据NickBeauchesne的描述,在ShadowBrokers所泄漏的黑客工具中,有一款名为“NOPEN”的工具。在此之前,安全研究人员普遍认为这款工具是一种“Post-ExploitationShell”,方程式组织可以用它来感染一台被入侵的设备,而这款工具将允许攻击者与被入侵的设备进行持续性地通信。
但是通过深入分析之后Beauchesne发现,“NOPEN”实际上是一款针对Unix操作系统的远程管理工具(RAT)。各位应该知道,“RAT”这个词通常形容的是那些针对Windows系统和Android设备的恶意软件,攻击者可以利用这些恶意软件来与受感染的目标主机进行网络通信。
根据Beauchesne的分析结果,NOPEN毫无疑问是属于RAT工具这一类的。Beauchesne还表示,这是一款非常复杂的恶意软件,而且该工具似乎是方程式组织的一款非常重要的黑客工具,因为在泄漏文件(script/ops/doc)中曾多次提到了“NOPEN”的名字。之所以说它非常重要,是因为它既可以作为一个网络后门来感染目标系统,而且攻击者还可以用它来监听数据。
首先,方程式组织的黑客需要成功入侵目标系统,然后在系统中安装NOPEN。安装成功之后,攻击者就可以在自己的计算机与被入侵的设备之间建立一条通信链接,并开始监听目标主机中的各种数据。当他们发现并获取到了他们所要寻找的数据之后,黑客可以立刻删除NOPEN。NOPEN的主要功能就是在被感染主机与方程式组织的服务器之间建立一条通信隧道,并运行反向shell(命令行接口)。攻击者运行的是NOPEN的客户端,而NOPEN的服务器端则安装在被感染的设备上。
Beauchesne在分析报告中写到:
“这款工具不仅可以允许攻击者运行功能强大的shell脚本,而且还为他们提供了通信隧道的支持。需要注意的是,所有的操作信息和通信数据都采用了RC6加密算法来进行保护。但好消息是,尽管NOPEN采用了RC6加密算法来保护其网络通信数据,但是目前的很多安全解决方案也许能够在网络中检测到NOPEN的存在。”
Linux、FreeBSD、SunOS、Solaris和HP-UX等操作系统也难逃厄运
根据Beauchesne的分析,NOPEN可以在i386、i486、i586、i686、i86pc、i86、SPARC、Alpha、x86_64、以及AMD64等架构的计算机上正常运行。除此之外,安全专家表示,NOPEN还可以在Linux、FreeBSD、SunOS、Solaris和HP-UX等操作系统上运行。
深入分析NOPEN
简单而言,NOPEN就是一款静态编译的后门。这款UnixRAT会对其所有的控制命令和通信隧道数据进行加密保护,并且还允许攻击者在目标主机中实现提权。接下来,我们会对NOPEN进行深入分析,并且找出可以检测到NOPEN的安全策略。
NOPEN的欢迎界面
再简单的命令行工具也得有一个欢迎界面才对,NOPEN也不例外,而且NOPEN的欢迎界面还非常的友好。
- NOPEN! v3.0.5.3
- sh: 1: scanner: not found
- sh: 1: ourtn: not found
- sh: 1: scripme: not found
- Wed Aug 31 18:07:05 GMT 2016
- NHOME: environment variable not set, assuming"NHOME=/root/Firewall/TOOLS/NOPEN/.."
- NHOME=/root/Firewall/TOOLS/NOPEN/..
- Reading resource file"/root/Firewall/TOOLS/NOPEN/../etc/norc".../root/Firewall/TOOLS/NOPEN/../etc/norc: No such file or directory
- TERM=xterm-256color
- Entering connect mode
- Attempting connection to 127.0.0.1:32754(127.0.0.1:32754)... ok
- Initiating RSA key exchange
- Generating randomnumber... ok
- Initializing RC6...ok
- Sending randomnumber... ok
- Receiving randomnumber... ok
- Generating sessionkey... 0x0DE6200E48AB016831720B109B8B2874
- Sending first verifystring... ok
- Receiving secondverify string... ok
- Checking secondverify string... ok
- RSA key exchange complete
- NOPEN server version... 3.0.5.3
- Connection
- Bytes In / Out 201/94 (213%C) / 63/4 (1575%C)
- Local Host:Port localhost:41847 (127.0.0.1:41847)
- RemoteHost:Port 127.0.0.1:32754(127.0.0.1:32754)
- RemoteHost:Port kali:32754 (127.0.0.1:32754)
- Local
- NOPEN client 3.0.5.3
- Date/Time Wed Aug 31 18:07:05 UTC 2016
- History
- Command Out
- CWD /root/Firewall/TOOLS/NOPEN
- NHOME /root/Firewall/TOOLS/NOPEN/..
- PID (PPID) 6904 (6896)
- Remote
- NOPEN server 3.0.5.3
- WDIR NOT SET
- OS Linux 4.6.0-kali1-amd64 #1 SMPDebian 4.6.4-1kali1 (2016-07-21) x86_64
- CWD
- PID (PPID) 6908 (6889)
- Reading resource file"/root/Firewall/TOOLS/NOPEN/../etc/norc.linux".../root/Firewall/TOOLS/NOPEN/../etc/norc.linux: No such file or directory
- History loaded from"/root/Firewall/TOOLS/NOPEN/../down/history/kali.127.0.0.1"... ok
- Creating command output file"/root/Firewall/TOOLS/NOPEN/../down/cmdout/kali.127.0.0.1-2016-08-31-18:07:05"...ok
- Lonely? Bored? Need advice? Maybe "-help" will show you the way.
- We are starting up our virtual autoport
我们可以通过“-help”命令来获取帮助信息:
- We are bound and ready to go on port 1025
- NO! kali:>-help
- [08-31-16 18:07:17 GMT][localhost:41847 ->kali.127.0.0.1:32754]
- [-help]
- Remote General Commands:
- Usage: -elevate
- Usage: -getenv
- Usage: -gs category|filename [options-if-any]
- Usage: -setenv VAR=[val]
- Usage: -shell
- Usage: -status
- Usage: -time
- Remote Server Commands:
- Usage: -burn
- Usage: -call ip port
- Usage: -listen port
- Usage: -pid
- Remote Network Commands:
- Usage: -icmptime target_ip [source_ip]
- Usage: -ifconfig
- Usage: -nslookup name1 ...
- Usage: -ping -r remote_target_ip [-l local_source_ip][-i|-u|-t] [-p dest_port] [-s src_port]
- -ping host
- -ping[-u|-t|-i] host
- Usage: -trace -r remote_target_ip [-l local_source_ip][-i|-u|-t] [-p dest_port] [-s src_port]
- -trace host
- -trace[-u|-t|-i] host
- Remote Redirection Commands:
- Usage: -fixudp port
- Usage: -irtun target_ip call_back_port [call_back_ip] [ourtnarguements]
- Usage: -jackpop target_ip target_port source_ip source_port
- Usage: -nrtun port [toip [toport]]
- Usage: -nstun toip [toport [localport [srcport [command]]]]
- -nstuntoip:port
- Usage: -rawsend tcp_port
- Usage: -rtun port [toip [toport]]
- Usage: -scan
- Usage: -sentry target_address source_address (tcp|udp)dest_port src_port interface
- Usage: -stun toip toport [localport [srcport]]
- Usage: -sutun [-t ttl] toip toport [localport [srcport]]
- Usage: -tunnel [command_listen_port [udp]]
- Usage: -vscan (shouldadd help)
- Remote File Commands:
- Usage: -cat remfile
- Usage: -chili [-l] [-s lines] [-m max] MM-DD-YYYY remdirremfile [remfile ...]
- Usage: -cksum remfile ...
- Usage: -fget [MM-DD-YYYY] loclist
- Usage: -get [-l] [-q] [-s minimumsize] [-m MM-DD-YYYY]remfile ...
- Usage: -grep [-d] [-v] [-n] [-i] [-h] [-Cnumber_of_context_lines] pattern file1 [file2 ...]
- Usage: -oget [-a] [-q] [-s begoff] [-b begoff] [-e endoff]remfile
- Usage: -put locfile remfile [mode]
- Usage: -strings remfile
- Usage: -tail [+/-n] remfile, + to skip n lines of remfilebeginning
- Usage: -touch [-t mtime:atime | refremfile] remfile
- Usage: -rm remfile|remdir ...
- Usage: -upload file port
- Usage: -mailgrep [-l] [-m maxbytes] [-r "regexp"[-v]] [-f regexpfilename [-v]] [-a "regexp for attachments toeliminate"] [-b MM-DD-YYYY] [-e MM-DD-YYYY] [-d remotedumpfile] remotedirfile1 [file2 ...]
- ex: -mailgrep -a".doc" -r "^Fred" -b 2-28-2002 /var/spool/mail G*
- Remote Directory Commands:
- Usage: -find [-M | -m -mkfindsargs] [-x[m|a|c] MM-DD-YYYY]remdir [remdir...]
- Usage: -ls [-1ihuRt] [-x[m|a|c] MM-DD-YYYY] [remfile|remdir...]
- Usage: -cd [remdir]
- Usage: -cdp
- Local Client Commands:
- Usage: -autopilot port [xml]
- Usage: -cmdout [locfilename]
- Usage: -exit
- Usage: -help
- Usage: -hist
- Usage: -readrc [locfile]
- Usage: -remark [comment]
- Usage: -rem [comment]
- Usage: # [comment]
- Usage: -reset
- Local Environment Commands:
- Usage: -lcd locdir
- Usage: -lgetenv
- Usage: -lpwd
- Usage: -lsetenv VAR=[val]
- Usage: -lsh [[-q] command]
- Aliases:
NOPEN支持的体系架构
反汇编之后,我们就可以看到NOPEN所支持的架构了。NOPEN是Unix系统上的一款通用远程管理工具(RAT),我们在泄漏文件中获取到的是其Linuxi386版本。但是我在对其客户端和服务器端进行了反汇编之后,结果显示该版本的NOPEN所支持的架构远不止i386一个。
- .rodata:0807B04D aI586 db 'i586',0 ; DATA XREF: _serverCpuInfo+1Do
- .rodata:0807B04D ;_serverCpuInfo+4Co
- .rodata:0807B052 ; char aI686[]
- .rodata:0807B052 aI686 db 'i686',0 ; DATA XREF: _serverCpuInfo+73o
- .rodata:0807B057 ; char aI486[]
- .rodata:0807B057 aI486 db 'i486',0 ; DATA XREF: _serverCpuInfo+8Do
- .rodata:0807B05C ; char aI386[]
- .rodata:0807B05C aI386 db 'i386',0 ; DATA XREF: _serverCpuInfo+A7o
- .rodata:0807B061 ; char aSparc[]
- .rodata:0807B061 aSparc db 'sparc',0 ; DATA XREF: _serverCpuInfo+E0o
- .rodata:0807B067 ; char aI86pc[]
- .rodata:0807B067 aI86pc db 'i86pc',0 ; DATA XREF: _serverCpuInfo+FBo
- .rodata:0807B06D ; char aI_86[]
- .rodata:0807B06D aI?86 db 'i?86',0 ; DATA XREF: _serverCpuInfo+119o
- .rodata:0807B072 ; char aAlpha[]
- .rodata:0807B072 aAlpha db 'alpha',0 ; DATA XREF: _serverCpuInfo+137o
- .rodata:0807B078 ; char aX86_64[]
- .rodata:0807B078 aX86_64 db 'x86_64',0 ; DATA XREF: _serverCpuInfo+155o
- .rodata:0807B07F ; char aAmd64[]
- .rodata:0807B07F aAmd64 db 'amd64',0 ; DATA XREF: _serverCpuInfo+173o
NOPEN所支持的操作系统
反编译之后,我们了解到了NOPEN所支持的操作系统类型。
- FreeBSD
- Linux
- SunOS
- HP-UX
- Solaris
很多被隐藏的命令
我们发现,命令行的“-help”命令并不能够将NOPEN所有可用的指令全部显示出来。
- .data:0808220C commandHelp dd 0 ; DATA XREF:sub_8059570+746r
- "-head"; "[-n] remfile"
- "-sget"; "hostname port file [file ...]"
- "-srecv"; "port"
- "-h"
- "-burnBURN"
- "-stat"
- "-sq"; "remfile"
- "-w"
- "-lambda"
- "-hammy"; "localport toip srcport[toport]"
- "-at"; "[-B] time[m] command"
- "-listen"; "port"
- "-trigger"; "localport toip srcport[toport]"
- "-triggerold"; "localport toip srcport[toport]"
- "-sniff"; "localfile iface [exclusion filtersport"...
- "-suc"; "[get|<filename>] | [-s]<pid> [<pid>..]"...
- "-jscan"; "[-t timeout] scanType target[dstPort] "...
- "-hstun"; "toip [toport [localport [srcport[comma"...
- "-hrtun"; "port [toip [toport]]"
- "-hutun"; "toip toport [localport[srcport]]"
- "-lpid"
- "-sha1sum"; "remfile ..."
UberControl子菜单
这部分功能似乎与rootkit有关,负责完成隐藏文件、任务处理、socket通信、以及持久化等操作。
Tunnel子菜单
具体命令如下所示:
- [t]imeout time
- [r]emote listenport[target [port]]
- [l]ocal listenport target [port [source_port]]
- [L]ocal listenport target [port [source_port]]; withone byte extra for socket state
- [u]dp listenport target [port [source_port]]
- [U]dp listenport [target [port]]
- [c]lose channel
- [s]tatus - prints status messages for channels
- [q]uit - leaves thetunnel, please do not hit Cntl-C, it makes the tunnel unhappy
NOPEN的检测
正如我们之前所提到的那样,第一眼看过去,NOPEN绝对是一款非常复杂的恶意软件。但是如果我们一步一步地进行深入分析,我就发现其实这款RAT并没有我们想象中的那么复杂,因为此前我们还遇到过更加复杂的RAT。像PoisonIvy、blackshade、helium、以及其他的RAT,它们远比NOPEN要麻烦得多,但是这些RAT的功能和运行机制其实都是大同小异的。实际上,就我们目前的经验来看,大多数的RAT工具都拥有相似的行为模式。所以从这一点来看,NOPEN其实也没有多少新颖之处。
没错,该工具背后的黑客组织是方程式组织,他们的确更加复杂,但是这类攻击的本质其实是一样的。我们其实并不需要完全弄清楚任何一款RAT工具的行为模式,我们可以利用“机器学习”来构建出新型的安全防御体系。通过机器学习来识别恶意工具的行为模式其检测效率和准确率都是非常高的。不仅如此,这样可以迫使攻击者不断改变他们的攻击方法,并且增加攻击者绕过下一代安全产品的难度。