those conditions make it pretty easy 
you have two initial positions (let’s say Pb is bullet, Pt is target)
and two velocities (let’s say Vb is bullet, Vt is target)
you want to know the “time” (T) when the two vectors intersect
(or come within some bounding hit radius, whatever)
begin iterating with estimated T = 0, then:
calc “future position” of target: Pt’ = Pt + T * Vt (equal to initial position at this point)
* calc distance between future target position Pt’ and bullet initial position Pb: D = |Pt`-Pb|
calc a new time estimate by dividing that distance by magnitude of bullet velocity: T = D / |Vb|
calc “future position” of target: Pt’ = Pt + T * Vt
calc “future position” of bullet: Pb’ = Pb + T * Vb
calc the distance between the two future positions and see if you’re “close enough”, if not iterate again * with new estimate T
how it works: on the first iteration you shoot “at” the target’s initiial position, and see “how long” it takes to get there. of course by then target will have moved too, so you recalc and say how long would it take to get THERE? and of course (again) by the time you get THERE, target has moved a teensy bit more. so you estimate THAT time, repeat.
about three iterations ought to do it, depending on your tolerances for hit testing.
and of course once you know “where” this intersection will occur you can “aim” for it (set the angle)
[edited to better indicate “where” * the iteration jumps back to in the pseudocode]