Gmsh (http://geuz.org/gmsh/) will do it for you. Simply create all of the volumes, surfaces, and lines that are required to describe the geometry and interfaces. Then, assign a "physical" id to everything that you want meshed. Once you mesh the geometry, everything to which you have assigned a physical ID will be meshed. The "zero thickness" elements will simply be 2D elements (tri/quad) in a 3d mesh or line elements in a 2D mesh.
Gmsh feels a bit clunky at first, but once you get the hang of using the interface or writing input files manually, it can be a very easy way to generate unstructured meshes. Below, I have pasted a simple input file that generates a square with a diagonal line interface. To use this in gmsh, copy the below text into a file with a .geo extension (doesn't matter, this is convention). Then (in Linux) from the command line, run "gmsh -2 (your file name).geo". This will create (your file name).msh in the same directory. To visualize the mesh, run "gmsh (your file name).msh". Running gmsh on the .geo file will display the geometry, but not the mesh.
This is an image of a mesh created by the following input file:
lc=0.1; //characteristic mesh size (optional make smaller to refine mesh)
// Place points
Point(1) = {0,0,0,lc};
Point(2) = {1,0,0,lc};
Point(3) = {1,1,0,lc};
Point(4) = {0,1,0,lc};
// Create lines from points
Line(1) = {1,2};
Line(2) = {2,3};
Line(3) = {3,4};
Line(4) = {4,1};
Line(5) = {3,1};
// Define line loops used to construct surfaces
Line Loop(1) = {1,2,5};
Line Loop(2) = {-5,3,4};
// Make surfaces from line loops
Plane Surface(1) = {1}; //using LL #1
Plane Surface(2) = {2}; //using LL #2
// Showing off another gmsh feature:
// Tell gmsh to use mostly quads rather than tris for surface #2
Recombine Surface(2);
// Give physical IDs to everything you want meshed
Physical Line(1) = {5}; //Line #5 --> Interface
Physical Surface(2) = {1}; //Surface #1 --> Lower triangle (tris)
Physical Surface(3) = {2}; // Surface #2 --> Upper triangle (mostly quads)