Had to test the code myself to find the problem!
Yes it seems like hit.vertex is always the first vertex of the triangle, so you have to calculate it yourself:
D3DVERTEX* vbuffer;
ent_buffers(hit.entity,0,0,&vbuffer,&triangleBuffer,NULL);
...
vec_to_ent(target,hit.entity);
var max_dist = 999,j,k;
for(i = 0; i < 3; i++)
{
j = vec_dist(target,(vector(vbuffer[triangleBuffer[hit.triangle*3+i]].x,vbuffer[triangleBuffer[hit.triangle*3+i]].z,vbuffer[triangleBuffer[hit.triangle*3+i]].y));
if(j < max_dist)
{
max_dist = j;
k = i;
}
}
Now k should be your closest vertex!