f = Interpolation[l3= (Last /@ Sort /@ GatherBy[l[[All, 1 ;; 2]], #[[1]] &])]
ListContourPlot[l, RegionFunction -> (#2 < f[#1] &)]
Edit
If you want a smoother curve, you could use for example whuber's method herewhuber's method here for getting something similar to an "envolvent" curve:
l4 = {(#[[1]] - 14) 2 + 1, #[[2]]} & /@ l3;
nrow = 32;
i = Image[SparseArray[Flatten[Table[{i, IntegerPart@#1} -> #2, {i, 1, nrow}] & @@@ l4]]]
// ImageAdjust
{minima, maxima} = Flatten[Position[First[ImageData[#[i]]], 1]] & /@ {MinDetect, MaxDetect};
f1 = Interpolation[N@{(#[[1]] - 1)/2 + 14, #[[2]]} & /@ l4[[maxima]], InterpolationOrder -> 1]
f2[x_] = Max[f[x], f1[x]]
The "envolvent":
Quiet@Show[ListLinePlot@l3, Plot[f2[x], {x, 14, 34}]]
Quiet@ListContourPlot[l, RegionFunction -> (#2 < f2[#1] &)]
Quiet@ListPlot3D[l, RegionFunction -> (#2 < f2[#1] &),
ColorFunction -> "SouthwestColors", MeshFunctions -> {#3 &}]