使用java语言实现http隧道技术

何谓 HTTP隧道技术

 这个技术是近期才出现的新事物,并且已经被用到各种黑客软件之中,比较成熟的有远程控制软件“网络神偷”和“灰鸽子”。
这是国内两个很有代表性的运用“http隧道穿越原理”而制作的软件,用该类型软件可以穿透防火墙,不受端口的限制。

一般防火墙为了安全起见,都只开80和其他一些常用的端口,这样的话,那些一般的基于tcp/ip客户端和服务端的木马就不能通过防火墙和外界发生联系,特别是在内网之中,但是经过特殊处理的ip封包可以伪装成http封包,这样防火墙就认为其是合法的http数据包,就会放行,这样在木马的接收端,软件再将伪装过的ip封包还原出来,取出其中有用的数据,从而达到穿越防火墙端口设置的限制。

该类型软件具有很大的欺骗性,所以不要认为设置了端口限制的防火墙就一定很安全了。

利用HTTP协议的缺陷来实现对防火墙的渗透,或者说现有的一些HTTP隧道技术的实现,是基于防火墙在对HTTP协议的报文进行识别与过滤时,往往只对其诸如POST、GET等命令的头进行识别,而放行其后的所有报文。
所以,只要具备了对HTTP的基本认识与基本的C语言或者Perl等编程语言的常识,就可以从事HTTP方面的学习与研究了。
使用java语言实现http隧道技术
1. 服务器端程序
由于用Java语言实现web技术不是本文的主题,所以在这里不过多地罗嗦。现在我们在服务器端使用servlet技术。
***ShowMemoryServlet.java文件如下:
public class ShowMemoryServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
Runtime rt = Runtime.getRuntime();
// 计算当前系统有多少可用的内存,并返回到客户端
out.println(rt.freeMemory());
// 计算但前系统有多少总的内存,并返回到客户端
out.println(rt.totalMemory());
}
//Clean up resources
public void destroy() {
}
}

***web.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>showmemservlet</servlet-name>
<servlet-class>ShowMemoryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showmemservlet</servlet-name>
<url-pattern>/showmemservlet</url-pattern>
</servlet-mapping>
</web-app>

2. 客户端程序
由于java隧道技术使用http协议,所以在客户端的程序可以是一个普通的java应用,也可以是一个applet。在这里我们以一个applet为例,演示一下客户端调用服务器端组件的过程。
***GoodEveningApplet.java文件如下:
package firstapplet;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
import java.io.InputStream;
import java.net.URLConnection;
import java.io.IOException;
import java.io.DataInputStream;
import java.net.MalformedURLException;
import javax.swing.JLabel;
import javax.swing.JButton;

public class GoodEveningApplet extends Applet {
boolean isStandalone = false;
BorderLayout borderLayout1 = new BorderLayout();
Panel upper = new Panel();
JLabel jLabel1 = new JLabel();
JButton jButton1 = new JButton();

/**
* Get a parameter value
*
* @param key String
* @param def String
* @return String
*/
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

/**
* Construct the applet
*/
public GoodEveningApplet() {
}
/**
* Initialize the applet
*/
public void init() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

/**
* Component initialization
*
* @throws Exception exception
*/
private void jbInit() throws Exception {
this.setLayout(borderLayout1);
upper.setBackground(Color.orange);
jLabel1.setText("jLabel1");
jButton1.setText("jButton1");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
this.add(upper, BorderLayout.NORTH);
upper.add(jButton1);
upper.add(jLabel1);
}
/**
* Start the applet
*/
public void start() {
}
/**
* Stop the applet
*/
public void stop() {
}
/**
* Destroy the applet
*/
public void destroy() {
}

/**
* Get Applet information
*
* @return String
*/
public String getAppletInfo() {
return "Applet Information";
}

/**
* Get parameter info
*
* @return String[][]
*/
public String[][] getParameterInfo() {
return null;
}

private String refresh() throws MalformedURLException, IOException {
URL url = new URL("http://localhost:8080/appletservlet/showmemservlet");
URLConnection con = url.openConnection();
con.setUseCaches(false);
InputStream in = con.getInputStream();
DataInputStream textStream;
textStream = new DataInputStream(in);
String line1 = textStream.readLine();
String line2 = textStream.readLine();
double freeMem = Double.parseDouble(line1);
double totalMem = Double.parseDouble(line2);
double usedMem = totalMem - freeMem;
double percentUsed = (int) 100 * (usedMem / totalMem);
return String.valueOf(percentUsed);
}

public void jButton1_actionPerformed(ActionEvent e) {
try {
System.out.println(refresh());
jLabel1.setText(refresh());
}
catch (Exception ex) {
ex.printStackTrace();
}

}
}

*** GoodEveningApplet.html文件如下:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
<TITLE>
Good Evening HTML Page
</TITLE>
</HEAD>
<BODY>
firstapplet.GoodEveningApplet will appear below in a Java enabled browser.<BR>
<APPLET
CODEBASE = "."
CODE = "firstapplet.GoodEveningApplet.class"
ARCHIVE = "GoodEvening.jar"
NAME = "TestApplet"
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = top
>
You need a Java-enabled browser running JDK 1.1.x or
greater to view this applet.
</APPLET>
</BODY>
</HTML>

总结
从上面的例子大家可以看到,如果你使用web技术定义了很多的业务组件,你都可以通过java隧道技术来访问,而且客户端程序可以有很多的变化。
另外,对于上面的例子我们只是用最简单的方法从服务器端向客户端发送了两个字符串类型,如果服务器处理的数据很复杂,我们可以将数据封装成数据类,然后让这个类实现Serializable这个接口就可以了,这样处理起来会更加方便,有兴趣的朋友可以自己试试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值