Hardening & messing with win32 Apache Tomcat









|=---------------------------=[ Hardening & messing with win32 Apache Tomcat ]=---------------------=|
|=------------------------------------=[ 15 July 2009 ]=--------------------------------------------=|
|=--------------------------------=[  By shad0w_crash  ]=-------------------------------------------=|


1) Introduction
2) hash default userDatabase passwords
3) Disable manager
4) Change service account
5) SSL
6) Change shutdown
7) Information hiding
8) Signing jar files
9) Policies
10) Creating backdoors for tomcat
11) Weakening tomcat
12) Contact
1. Introduction

This is my first tutorial on something so feel free to send me feedback.
The aim of this tutorial is putting a lot of information about securing
win32 apache tomcat in one whitepaper. The examples are tested on
version 6.0.20. Not all security measures are usefull but i wanted to
mention them because every small thing is also a thing.

2. hash default userDatabase passwords

Default tomcat uses plaintext passwords in the configuration files
(tomcat/conf/user-conf.xml). When you share a server someone could gain
higher privileges by reading te file. Or if you are updating it by
shoulder surfing. To provide this you should hash the passwords. This
can be done in 2 ease steps.

  1) append to the rule about the userdatabase digest="sha". The line will now look like this:
        <Real className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" digest="sha" />

  2) Change the password in user-conf.xml to sha(password). 

Don't forget to reboot tomcat ;)
3. Disable manager

Unless you use the tomcat manager(for deployment), the best thing to do
is removing the tomcat manger from server.xml. If it's neceseary to
exists (for remote administration) you should create an ip-filter. The
easyst way to do this is appending the following line to

  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="xxx.xxx.xxx.xxx" />

Of course you could also use this setting to secure other webapplications on ip.

4. Change service account

By a default instalations apache tomcat is installed under the local
system administrator account. You should prevent this.

	First add a user and a group. 
	Grant the right to run services to this group (local security policy). 
	Grand the rights to use java, tomcat and webapp directory

If all this is been done go to services.msc and find the apache tomcat
service. Get the properties and go to log on. Here you should click this
account (and choise your account).
5. SSL

Enabeling ssl, importing the right and strong signed certificateds is
not enough to make ssl work. Many website's redirect the website to
https and of course this'll work. But you're not forced to use https. If
you check out the request and repost it, most time it'll be processed.
This is a security risk because a man in the middle attack could be

In the web.xml of a context you could specify the transport-guarantee
and the allowed methods. By only allowing post and ssl you'll be more
secure.  This is an example:


6. Change shutdown

You could shutdown apache tomcat by connecting to TCP 8005 and type
shutdown. This connection is only allowed from localhost, but why take a
change? Change the rule '<server port="8005" shutdown="SHUTDOWN" in
conf/server.xml. You could use an other port and you could use an other
shutdown (sort off shutdown password).

My first tought was to use the number 100000 to disable it. But with
this number tomcat doesn't start anymore. However if you use an integer
so big that it'll overflow the java integer. Tomcat wil startup and
connecting to 8005 is impossible. I used '500000000000000' for example.

7. Information hiding

To distract scriptkiddy's you should hide version numbers and webserver
type. If you append server="Apache" to <Connector port = "80"> the
server wi'll only show Apache as name. You can view this change by using
LiveHTTPHeader (firefox plugin).

  An other place to hide information is as follows.
  Extract lib/catalina.jar and open the extracted org/apache/cataline/util/ServerInfo.properties.
  Change the

 You could degrate the data to apache and version 1.0. Also you could a
little bit of distraction by naming it to IIS (ore somelike).            

8. Signing jar files

Why should you sign a jar? First of you can claim your code with it.
Also it's faster to traceback if someone messed with it. If an
authorised certificate is used the chance of having a virus free jar is
much bigger :).

How to sign a jar file. First of all you need to create a keystore.
Second you need to use the jarsigner to (self)sign the jar.

keytool -genkey -alias shad0w_crash -keypass <goodpassword> -keystore /home/shad0w/keystore
jarsigner -keystore /home/shad0w/keystore -storepass <goodpassword> -keypass <goodpassword> -signedjar <output>.jar <org>.jar shad0w_crash

Now you could verify the .jar file by using:

jarsigner -verify a.jar

Also if you open the .jar file you'll see in the /META-inf directory 3
files wich contains the hashes of your .class files. Of course it's
faster for webservers to sum the jar with a strong hashing algoritem
(shasum -a 512 <filename> ).


Default apache tomcat runs with all permisions of the java security
manager. The first thing to do is using the catalina policie file. Open
your tomcat configuration gui (\bin\tomcat6w.exe) and go to the java
tab. Exstend java options with this line:


After this you should go to a prompt and execute /bin/catalina start -security

Now go to your policy file and decide what your applications really
need. For example if your application doesn't need sql or remote
connections you should disable this.


10. Creating backdoors for tomcat

In this part of this paper i'll only explain a concept. This because I
don't want anyone to build a trojan. My goal is making people aware of
this options. So if you're going to build a trojan stop reading here
please and create your own way.

the most usefull way for tomcat to create an backdoor is creating a
webapplication wich allows you to upload, download, browse execute
connect, connectback etc. But this is realy obvious. If you're in a
position to analyse code before inserting a trojan the best way is
looking for an peace of code that calls a class or action dynamicly. For
example this piece:

exec = (Action)Class.forName(input).newInstance();

Output = exec.run(args);

Creating a new class that implements the interface should be enough to
have a nice hidden action. If the module is open-source you should
integrate the code in an excisting class and replace the old one.

Also you could check out the source from tomcat
(http://svn.apache.org/repost/asf/tomcat/trunk). As example i picked the
org.apache.catalina.servlets.DefaultServlet.java code and added:

ostream.println("<!-- secret message -->");

to the protected void serveResource(.....).

After that i removed the classes


from catalina.jar. Now when i start apache tomcat and view the source i'll see <!-- secret message -->
Other options i tested by using the defaultServlet(of course normal java code works like always!):

1) filewriting (create a nice .java file in the root directory)
2) Compiling (Create a .classfile) 
	String command = "javac.exe c:" + File.separator + "Test.java";
	Process p = Runtime.getRuntime().exec(command);
3) Updating a jar file 
	jar -uf a.jar Test.class 
	note: you can't update catalina.jar when tomcat is running but you can ofcourse extend it ;).
4) Using sockets to connect to an remote host 

11) Weakening tomcat

When you want to less secure tomcat you should enable the invoker
servlet. Simple reconfigure web.xml and allow the invoker servlet and
make sure the webapplications runs as privileged. An other option is to
reconfigure the web.xml from the manager. Remove the deploy servlet from
the security-constraint.

12) Contact 

If you have any thing to attach, just copy the tekst and repost it to
the site you got it from. Only thing I ask is to not remove my allias
but just add yours. For contact http://twitter.com/shad0w_crash.

# milw0rm.com [2009-08-27]