解密方程式組織的Unix后門NOPEN
前言
不久之前,黑客組織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工具的行為模式,我們可以利用“機器學習”來構建出新型的安全防御體系。通過機器學習來識別惡意工具的行為模式其檢測效率和準確率都是非常高的。不僅如此,這樣可以迫使攻擊者不斷改變他們的攻擊方法,并且增加攻擊者繞過下一代安全產品的難度。